cdesktopenv/cde/programs/dtudcexch/getbdffn.c

181 lines
5.1 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: getbdffn.c /main/5 1996/10/14 14:44:32 barstow $ */
/*
* (c) Copyright 1995 FUJITSU LIMITED
* This is source code modified by FUJITSU LIMITED under the Joint
* Development Agreement for the CDEnext PST.
* This is unpublished proprietary source code of FUJITSU LIMITED
*/
#include "excutil.h"
#include <Xm/FileSB.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
/*
* There is no public header file for this function (only an
* internal header XmStringI.h).
*/
extern XtPointer _XmStringUngenerate (XmString string,
XmStringTag tag,
XmTextType tag_type,
XmTextType output_type);
void filesbokCB();
void filesbcancelCB();
extern char *maintitle;
void getbdffn(Exc_data * ed)
{
Widget filesb;
Arg args[20];
Cardinal n;
char *selectlabel;
XmString xms;
selectlabel = GETMESSAGE(2, 2, "BDF file selection");
n = 0;
XtSetArg(args[n], XmNtitle, maintitle); n++;
xms = XmStringCreateLocalized(selectlabel);
XtSetArg(args[n], XmNselectionLabelString, xms); n++;
filesb = XmCreateFileSelectionDialog(ed->toplevel, "filesb", args, n);
XtAddCallback(filesb, XmNokCallback,
(XtCallbackProc) filesbokCB,
(XtPointer) ed);
XtAddCallback(filesb, XmNcancelCallback,
(XtCallbackProc) filesbcancelCB,
(XtPointer) ed);
XtUnmanageChild(XmFileSelectionBoxGetChild(filesb, XmDIALOG_HELP_BUTTON));
XtManageChild(filesb);
}
int fopencheck(char *file, char *dir, char *mode)
/*
* when mode = "r", if fopen can open the file with read only mode, return 0
* when mode = "w", if fopen can open the file with write mode, return 0
* but if the file exists, return 1
* otherwise return -1
*/
{
struct stat buf;
if (strcmp(mode, "r") == 0) {
if (stat(file, &buf) == 0)
if ((buf.st_mode & S_IFMT) == S_IFREG)
return 0; /* readable regular file */
} else if (strcmp(mode, "w") == 0) {
if (stat(file, &buf) == 0) {
if (((buf.st_mode & S_IFMT) == S_IFREG) &&
(access(file, W_OK) == 0))
return 1; /* writable existing file */
} else {
if (stat(dir, &buf) == 0) {
if (((buf.st_mode & S_IFMT) == S_IFDIR) &&
(access(dir, W_OK) == 0)) {
return 0; /* writable new file */
}
}
}
} else
fprintf(stderr, "Unanticipatable error occurred in fopencheck.\n");
return -1;
}
void filesbcancelCB(Widget widget, Exc_data * ed, XtPointer call_data)
{
excexit(ed);
}
void freeStrings(char * dir, char * file)
{
if (dir != NULL)
XtFree(dir);
if (file != NULL)
XtFree(file);
}
void filesbokCB(Widget widget, Exc_data * ed, XtPointer call_data)
{
XmFileSelectionBoxCallbackStruct *ptr;
char *file = NULL, *dir = NULL, *tmpfile;
int r, ans = 0;
char *msg1;
char *msg2;
msg1 = GETMESSAGE(2, 4, "The selected file exists. Overwrite?");
msg2 = GETMESSAGE(2, 6, "Failed to open the selected file.");
ptr = (XmFileSelectionBoxCallbackStruct *) call_data;
file = (char *) _XmStringUngenerate((XmString) ptr->value, NULL,
XmMULTIBYTE_TEXT, XmMULTIBYTE_TEXT);
if (!file) {
return;
}
dir = (char *) _XmStringUngenerate((XmString) ptr->dir, NULL,
XmMULTIBYTE_TEXT, XmMULTIBYTE_TEXT);
if (!dir) {
return;
} else {
if (*file != '/') {
if ((tmpfile = XtMalloc(strlen(dir) + 1 + strlen(file) + 1))
== NULL) {
excerror(ed, EXCERRMALLOC, "filesbokCB", "exit");
}
sprintf(tmpfile, "%s/%s", dir, file);
XtFree(file);
file = tmpfile;
}
}
r = fopencheck(file, dir, ed->bdfmode);
if (r == 0) {/* no problem */
/*fprintf(stderr, "%s will be opened\n", file);*/
} else if (r == 1) { /* file exist at export function */
AskUser(widget, ed, msg1, &ans, "warning");
if (ans != 1) { /* overwrite cancel */
freeStrings(dir, file);
return;
}
} else { /* file will not be opened */
AskUser(widget, ed, msg2, &ans, "error");
freeStrings(dir, file);
return;
}
ed->bdffile = (char *) malloc(strlen(file) + 1);
strcpy(ed->bdffile, file);
freeStrings(dir, file);
XtUnmanageChild(widget);
if (ed->function == EXPORT)
{
createbdf(ed);
} else if (ed->function == IMPORT)
{
PopupSelectXLFD(ed->toplevel);
}
}