123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- /*
- * 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);
- }
- }
|