181 lines
5.1 KiB
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);
|
|
}
|
|
}
|