2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
26 #include <sys/types.h>
37 #include "ErrorDialog.h"
39 #define COMMENT_CHAR '#'
41 #define MAX_KEY_SIZE 5
42 #define MAX_HEADER_LINES 13
44 /*****************************************************************************/
46 /* CalculateMagicCookie */
48 /* description: Calculates a integer (the "key" value) which reflects the */
49 /* contents of the given file from the current file-offset */
50 /* to the end of file. */
51 /* Comment lines (those starting with '!' or '#') are ignored */
52 /* in calculating the key value. */
54 /* input: pointer to FILE */
55 /* output: integer - magic cookie */
57 /*****************************************************************************/
58 int CalculateMagicCookie(FILE *fp)
65 long save_offset, file_id;
66 int c, prev_c, char_sum, nline, nword, nchar, inword;
68 /**************************************************************************/
69 /* Since we will be traversing the file, we save the file-offset */
70 /* so that we can restore it before returning */
71 /**************************************************************************/
72 save_offset = ftell( fp );
75 char_sum = nline = nword = nchar = 0;
76 prev_c = '0'; /* This is arbitrary, but '0' not '\0' IS intended */
78 while ( (c = fgetc( fp )) != EOF ) {
79 if ( c == COMMENT_CHAR ) {
80 while ( (c = fgetc( fp )) != EOF && c != '\n' )
81 ; /* skip characters to end of line */
83 char_sum += (c * (prev_c%10));
90 if ( c == ' ' || c == '\n' || c == '\t' ) {
92 } else if ( inword == FALSE ) {
99 file_id = PRIME1 * nline + PRIME2 * nword + PRIME3 * nchar + char_sum;
102 printf( "nline = %d nword = %d nchar = %d char_sum = %d\n",
103 nline, nword, nchar, char_sum );
104 printf( "file_id = %ld\n", file_id );
107 /**************************************************************************/
108 /* We restore the file-offset to its previous value */
109 /**************************************************************************/
110 (void) fseek( fp, save_offset, 0 );
111 return ( file_id % MAX_KEY );
114 /****************************************************************************/
116 /* SetCookie - find the location in the file to write the magic cookie */
117 /* and update the file with the magic cookie. */
119 /* input - file pointer */
122 /****************************************************************************/
123 void SetCookie(FILE *fp)
136 /**************************************************************************/
137 /* Save file pointer initial setting */
138 /**************************************************************************/
139 lSave_offset = ftell (fp);
141 /**************************************************************************/
142 /* Set file pointer to beginning of file */
143 /**************************************************************************/
144 fseek(fp, 0, SEEK_SET);
146 /**************************************************************************/
147 /* Calculate magic cookie */
148 /**************************************************************************/
149 iCookie = CalculateMagicCookie(fp);
151 printf("Magic Cookie: %d\n", iCookie);
154 /**************************************************************************/
155 /* Find location in header and store cookie */
156 /**************************************************************************/
157 keystr = (char *)NULL;
160 while ( !keystr && retbuf && (i < MAX_HEADER_LINES) ) {
161 fgetpos(fp, &filepos);
162 retbuf = fgets(buffer, 80, fp);
163 keystr = strstr (buffer, "$KEY:");
169 printf("No '$KEY' keyword in file. Magic Cookie not written to file.\n");
173 mc_pos = strchr(keystr, ':');
176 sprintf(mc_pos, "%i", iCookie);
177 size = strlen(mc_pos);
178 if (size < MAX_KEY_SIZE) {
179 mc_clrpos = mc_pos + size;
180 for (i=size; i < MAX_KEY_SIZE; i++) {
186 fsetpos (fp, &filepos);
189 /**************************************************************************/
190 /* Set file pointer back to initial setting */
191 /**************************************************************************/
192 fseek (fp, lSave_offset, SEEK_SET);
196 /****************************************************************************/
198 /* CheckCookie - check if the magic cookie exists in the file and is the */
201 /* input - file pointer */
202 /* output - boolean indicating if correct value or not, TRUE = good */
204 /****************************************************************************/
205 Boolean CheckCookie(FILE *fp)
207 int iNewCookie, iOldCookie;
210 char *msgPtr, *errPtr;
216 Boolean bGoodCookie = TRUE;
218 /**************************************************************************/
219 /* Save file pointer initial setting */
220 /**************************************************************************/
221 lSave_offset = ftell (fp);
223 /**************************************************************************/
224 /* Set file pointer to beginning of file */
225 /**************************************************************************/
226 fseek (fp, 0, SEEK_SET);
228 /**************************************************************************/
229 /* Calculate magic cookie */
230 /**************************************************************************/
231 iNewCookie = CalculateMagicCookie(fp);
233 printf("New Magic Cookie: %d\n", iNewCookie);
236 /**************************************************************************/
237 /* Find location in header of old cookie and retrieve it. */
238 /**************************************************************************/
239 keystr = (char *)NULL;
242 while ( !keystr && retbuf && (i < MAX_HEADER_LINES) ) {
243 fgetpos(fp, &filepos);
244 retbuf = fgets(buffer, 80, fp);
245 keystr = strstr (buffer, "$KEY:");
251 printf("No '$KEY' keyword in file header. File is invalid.\n");
253 msgPtr = GETMESSAGE(5, 67,
254 "Create Action can only edit files that were created\n\
255 and edited by Create Action.");
256 errPtr = XtNewString(msgPtr);
257 display_error_message(CreateActionAppShell, errPtr);
260 fseek (fp, lSave_offset, SEEK_SET);
264 mc_pos = strchr(keystr, ':');
267 sscanf(mc_pos, "%i", &iOldCookie);
269 printf("Old Magic Cookie: %d\n", iOldCookie);
273 /**************************************************************************/
274 /* Check if cookies are the same. */
275 /**************************************************************************/
277 if (iOldCookie == iNewCookie) {
278 printf("Cookies are good = %i\n", iNewCookie);
282 if (iOldCookie != iNewCookie) {
285 printf("Cookies are bad; n=%i, o=%i\n", iNewCookie, iOldCookie);
288 msgPtr = GETMESSAGE(5, 66,
289 "Could not load the file because it has been altered by some\n\
290 other means other than Create Action. This could have been caused\n\
291 by modifying the file with a text editor or some other tool.");
292 errPtr = XtNewString(msgPtr);
293 display_error_message(CreateActionAppShell, errPtr);
298 /**************************************************************************/
299 /* Set file pointer back to initial setting */
300 /**************************************************************************/
301 fseek (fp, lSave_offset, SEEK_SET);
305 /*****************************************************************************/
314 /*****************************************************************************/
315 char * MakeExecString(char *pszCmd, char *pszPrompt)
319 char *pArgSrc = (char *)NULL;
320 char *pArgDst = (char *)NULL;
326 Boolean bDidPrompt = FALSE;
327 #define ARGSIZE 7 /* sizeof "%Arg_n%" */
330 while (pArgSrc = strchr(pArgSrc, '$')) {
332 printf("%d pArgSrc = %s\n", cArgs, pArgSrc);
337 case '1': case '2': case '3': case '4': case '5':
338 case '6': case '7': case '8': case '9': case '*':
345 printf("Args found = %d\n", cArgs);
349 size += cArgs * ARGSIZE;
350 size += strlen(pszCmd);
352 size += strlen(pszPrompt) + 2;
354 pszExecString = (char *)XtMalloc(size);
356 strcpy(pszExecString, pszCmd);
358 pTmp = pszExecString;
359 while (pArgSrc = strchr(pArgSrc, '$')) {
360 pArgDst = strchr(pTmp, '$');
366 case '1': case '2': case '3': case '4': case '5':
367 case '6': case '7': case '8': case '9': case '*':
370 strcat(pszExecString, "%Args");
372 sprintf(pszArgStr, "%%Arg_%c", *pTmp);
373 strcat(pszExecString, pszArgStr);
375 if ((pszPrompt) && (!bDidPrompt)) {
376 strcat(pszExecString, "\"");
377 strcat(pszExecString, pszPrompt);
378 strcat(pszExecString, "\"");
381 strcat(pszExecString, "%");
385 strcat(pszExecString, pArgSrc);
390 printf("EXEC_STRING = '%s'\n", pszExecString);
392 return(pszExecString);
395 /*****************************************************************************/
397 /* WriteDefinitionFile */
402 /* 1 could not open file */
404 /*****************************************************************************/
405 ushort WriteDefinitionFile(char *pszFile, ActionData *pAD)
408 FILE *fp = (FILE *)NULL;
411 char buffer[MAXBUFSIZE];
413 char *msgPtr, *fmtPtr, *errPtr;
415 /***************************************************************************/
416 /* Open action and filetypes definition file for writing. */
417 /***************************************************************************/
418 if ((fp = fopen(pszFile, "w+")) == NULL) {
420 printf("Can not open file.\n"); /* debug */
422 msgPtr = GETMESSAGE(5, 55, "Could not create the following file:");
424 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
425 strlen(pszFile) + 1) * sizeof(char));
426 sprintf(errPtr, fmtPtr, msgPtr, pszFile);
427 display_error_message(CreateActionAppShell, errPtr);
432 printf("database file = %s\n", pszFile); /* debug */
435 /***************************************************************************/
436 /* Write comment area of action and filetype definition file, including */
437 /* revision number and magic cookie. */
438 /***************************************************************************/
439 fprintf(fp, "######################################################################\n");
441 fprintf(fp, "# Common Desktop Environment (CDE)\n");
443 fprintf(fp, "# Action and DataType Definition File\n");
445 fprintf(fp, "# Generated by the CreateAction tool\n");
447 fprintf(fp, "# $Revision: 1.0\n");
449 fprintf(fp, "# $KEY: nnnnn \n");
451 fprintf(fp, "######################################################################\n");
453 fprintf(fp, "# WARNING:\n");
455 fprintf(fp, "# This file was generated by the CDE CreateAction tool.\n");
456 fprintf(fp, "# If this file is modified by some other tool, such as vi,\n");
457 fprintf(fp, "# the CreateAction tool will no longer be able to load and\n");
458 fprintf(fp, "# update this file. For this reason, changes to this file\n");
459 fprintf(fp, "# should be handled through CreateAction whenever possible.\n");
461 fprintf(fp, "######################################################################\n");
464 /***************************************************************************/
465 /* Write the main Action definition. */
466 /***************************************************************************/
467 ptr = GetCoreName(pszFile);
468 fprintf(fp, "ACTION %s\n", ptr);
471 fprintf(fp, " LABEL %s\n", pAD->pszName);
472 fprintf(fp, " TYPE COMMAND\n");
473 ptr = MakeExecString(AD.pszCmd, AD.pszPrompt);
475 fprintf(fp, " EXEC_STRING %s\n", ptr);
480 fprintf(fp, " LARGE_ICON %s.m\n", pAD->pszIcon);
481 fprintf(fp, " SMALL_ICON %s.t\n", pAD->pszIcon);
483 if (ActionHasIcon()) {
484 fprintf(fp, " ICON %s\n", pAD->pszName);
486 fprintf(fp, " ICON %s\n", pAD->pszIcon);
491 printf("CA flags = %X\n", pAD->fsFlags);
493 if (pAD->fsFlags & CA_WT_TERM) fprintf(fp, " WINDOW_TYPE TERMINAL\n");
494 else if (pAD->fsFlags & CA_WT_PERMTERM) fprintf(fp, " WINDOW_TYPE PERM_TERMINAL\n");
495 else if (pAD->fsFlags & CA_WT_SHELLTERM) fprintf(fp, " WINDOW_TYPE SHELL_TERMINAL\n");
496 else fprintf(fp, " WINDOW_TYPE NO_STDIO\n");
498 if ((pAD->papFiletypes) && (pAD->fsFlags & CA_DF_ONLYFTFILES)) {
499 fprintf(fp, " ARG_TYPE %s", (pAD->papFiletypes[0])->pszName);
500 for (i=1; i < pAD->cFiletypes; i++) {
501 pFtD = pAD->papFiletypes[i];
502 fprintf(fp, ",%s", pFtD->pszName);
508 fprintf(fp, " DESCRIPTION %s\n", pAD->pszHelp);
513 /***************************************************************************/
514 /* Write the filetype definitions. */
515 /***************************************************************************/
516 if (pAD->papFiletypes) {
517 for (i=0; i < pAD->cFiletypes; i++) {
518 pFtD = pAD->papFiletypes[i];
519 /***********************************************************************/
520 /* Write the data attributes declaration. */
521 /***********************************************************************/
522 fprintf(fp, "DATA_ATTRIBUTES %s\n", pFtD->pszName);
524 fprintf(fp, " ACTIONS Open");
525 if (pFtD->pszPrintCmd) {
526 fprintf(fp, ",Print");
531 fprintf(fp, " LARGE_ICON %s.m\n", pFtD->pszIcon);
532 fprintf(fp, " SMALL_ICON %s.t\n", pFtD->pszIcon);
534 if (FiletypeHasIcon(pFtD)) {
535 fprintf(fp, " ICON %s\n", pFtD->pszName);
537 fprintf(fp, " ICON %s\n", pFtD->pszIcon);
542 fprintf(fp, " DESCRIPTION %s\n", pFtD->pszHelp);
546 /***********************************************************************/
547 /* Write the data criteria declaration. */
548 /***********************************************************************/
549 fprintf(fp, "DATA_CRITERIA %sA\n", pFtD->pszName);
551 fprintf(fp, " DATA_ATTRIBUTES_NAME %s\n", pFtD->pszName);
552 if (pFtD->pszPermissions) {
553 fprintf(fp, " MODE %s\n", pFtD->pszPermissions);
555 if (pFtD->pszPattern) {
556 fprintf(fp, " PATH_PATTERN %s\n", pFtD->pszPattern);
558 if (pFtD->pszContents) {
559 if (pFtD->fsFlags & CA_FT_CNTSTRING)
560 strcpy(buffer, "string");
561 else if (pFtD->fsFlags & CA_FT_CNTBYTE)
562 strcpy(buffer, "byte");
563 else if (pFtD->fsFlags & CA_FT_CNTSHORT)
564 strcpy(buffer, "short");
565 else if (pFtD->fsFlags & CA_FT_CNTLONG)
566 strcpy(buffer, "long");
567 fprintf(fp, " CONTENT %d %s %s\n", pFtD->sStart, buffer, pFtD->pszContents);
571 /***********************************************************************/
572 /* Write the Open MAP action. */
573 /***********************************************************************/
574 fprintf(fp, "ACTION Open\n");
576 fprintf(fp, " ARG_TYPE %s\n", pFtD->pszName);
577 fprintf(fp, " TYPE MAP\n");
578 fprintf(fp, " MAP_ACTION %s\n", pAD->pszName);
579 fprintf(fp, " LABEL %s\n", GETMESSAGE(7, 30, "Open"));
582 /***********************************************************************/
583 /* Write the Print filetype action and MAP action. */
584 /***********************************************************************/
585 if (pFtD->pszPrintCmd) {
586 /*********************************************************************/
587 /* First write the print filetype action. */
588 /*********************************************************************/
589 fprintf(fp, "ACTION %s_PRINT\n", pFtD->pszName);
591 fprintf(fp, " TYPE COMMAND\n");
592 ptr = MakeExecString(pFtD->pszPrintCmd, NULL);
594 fprintf(fp, " EXEC_STRING %s\n", ptr);
595 /*fprintf(fp, " EXEC_STRING %s\n", pFtD->pszPrintCmd);*/
598 fprintf(fp, " WINDOW_TYPE NO_STDIO\n");
601 /*********************************************************************/
602 /* Now writhe the Print MAP action. */
603 /*********************************************************************/
604 fprintf(fp, "ACTION Print\n");
606 fprintf(fp, " ARG_TYPE %s\n", pFtD->pszName);
607 fprintf(fp, " TYPE MAP\n");
608 fprintf(fp, " MAP_ACTION %s_PRINT\n", pFtD->pszName);
609 fprintf(fp, " LABEL %s\n", GETMESSAGE(7, 31, "Print"));
618 chmod(pszFile, 0644);
623 /*****************************************************************************/
625 /* WriteActionFile */
630 /* 1 could not open file */
632 /*****************************************************************************/
633 ushort WriteActionFile(ActionData *pAD)
636 FILE *fp = (FILE *)NULL;
640 char *msgPtr, *fmtPtr, *errPtr;
642 /***************************************************************************/
643 /* Open action file for writing. */
644 /***************************************************************************/
645 newName = ReplaceSpaces(AD.pszName);
646 pszEnvVar = getenv("HOME");
648 if ( pszEnvVar && strlen(pszEnvVar) ) {
649 pszFile = XtMalloc(strlen(pszEnvVar) + strlen(newName) + 10);
650 if (pszFile) sprintf(pszFile, "%s/%s", pszEnvVar, newName);
652 pszFile = XtMalloc(strlen(newName) + 10);
653 if (pszFile) sprintf(pszFile, "/tmp/%s", newName);
657 /***************************************************************************/
658 /* Open action file for writing. */
659 /***************************************************************************/
660 if (pszFile == NULL || (fp = fopen(pszFile, "w")) == NULL) {
662 printf("Can not open file.\n"); /* debug */
664 msgPtr = GETMESSAGE(5, 55, "Could not create the following file:");
666 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
667 strlen(pszFile) + 1) * sizeof(char));
668 sprintf(errPtr, fmtPtr, msgPtr, pszFile);
669 display_error_message(CreateActionAppShell, errPtr);
675 printf("action file = %s\n", pszFile); /* debug */
677 /***************************************************************************/
678 /* Write action file contents. */
679 /***************************************************************************/
680 fprintf(fp, "################################################\n");
682 fprintf(fp, "# action\n");
684 fprintf(fp, "# Common Desktop Environment (CDE)\n");
686 fprintf(fp, "# $TOG: fileio.c /main/9 1998/10/26 17:18:19 mgreess $\n");
688 fprintf(fp, "################################################\n");
690 fprintf(fp, "# This file represents a CDE Dt action. The contents of the file do\n");
691 fprintf(fp, "# not matter; however, the file must have executable permission and the\n");
692 fprintf(fp, "# name of the file must match an entry in the action database (*.dt files).\n");
694 fprintf(fp, "# For more information on Dt actions, see the CDE Dt manuals.\n");
696 fprintf(fp, "echo \"Common Desktop Environment Dt action\"\n");
700 chmod(pszFile, 0755);
704 /******************************************************************************/
705 /* check_file_exists - check if the file exists that is passed in, if not */
706 /* display error dialog. */
708 /* INPUT: filename - name of file to check if it exists or not. */
710 /* OUTPUT: TRUE - file exists */
711 /* FALSE - file does not exist */
713 /******************************************************************************/
714 Boolean check_file_exists (char *pszFileName)
718 /***************************************/
719 /* see if file exists */
720 /***************************************/
721 exists = fopen (pszFileName, "r");
723 /***************************************/
724 /* if exists, return good return code */
725 /***************************************/
731 printf("File '%s' does not exist!\n", pszFileName);
737 /*****************************************************************************/
739 /* OpenDefinitionFile */
746 /*****************************************************************************/
747 int OpenDefinitionFile(char *pszFile, ActionData *pAD)
750 FILE *fp = (FILE *)NULL;
752 char *msgPtr, *fmtPtr, *errPtr;
754 /***************************************************************************/
755 /* Open action and filetypes definition file for reading. */
756 /***************************************************************************/
757 if ((fp = fopen(pszFile, "r+")) == NULL) {
759 printf("Can not open file.\n"); /* debug */
761 msgPtr = GETMESSAGE(5, 60, "Could not open the following file:");
763 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
764 strlen(pszFile) + 1) * sizeof(char));
765 sprintf(errPtr, fmtPtr, msgPtr, pszFile);
766 display_error_message(CreateActionAppShell, errPtr);
771 printf("Opened database file = %s\n", pszFile); /* debug */
774 /***************************************************************************/
775 /* If magic cookie is good, then parse the file. */
776 /***************************************************************************/
777 if (CheckCookie(fp)) {
779 printf("Cookie good, call parse code\n");
781 rc = GetActionData(fp, pAD);
783 /************************************************************************/
784 /* If error, display error message. */
785 /************************************************************************/
787 msgPtr = GETMESSAGE(5, 90, "Could not parse the following file:");
789 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
790 strlen(pszFile) + 1) * sizeof(char));
791 sprintf(errPtr, fmtPtr, msgPtr, pszFile);
792 display_error_message(CreateActionAppShell, errPtr);
802 /******************************************************************************/
803 /* CheckDirtyIcon - check if icon has a DirtyBit set */
805 /* INPUT: Icon Widget - widget id of icon gadget to check */
807 /* OUTPUT: TRUE - dirty bit is set */
808 /* FALSE - dirty bit is not set */
810 /******************************************************************************/
811 Boolean CheckDirtyIcon (Widget wid)
815 pIconData = GetIconDataFromWid(wid);
817 if ( (pIconData->pmDirtyBit) || (pIconData->bmDirtyBit) ) {
824 /*****************************************************************************/
831 /* 1 could not open file */
833 /*****************************************************************************/
834 char * CreateIconName(char *pszDirName, char *pszBaseName, enum icon_size_range enumSize, char *pszType, Boolean bIsMask)
837 char pszSize[MAX_EXT_SIZE];
841 strcpy(pszSize, LARGE_EXT);
844 strcpy(pszSize, MEDIUM_EXT);
847 strcpy(pszSize, SMALL_EXT);
850 strcpy(pszSize, TINY_EXT);
856 strcat(pszSize, "_m");
859 pszName = XtMalloc(strlen(pszDirName) + strlen(pszBaseName) + strlen(pszSize) + strlen(pszType) + 1);
861 sprintf(pszName, "%s%s%s%s", pszDirName, pszBaseName, pszSize, pszType);
864 pszName = XtMalloc(strlen(pszBaseName) + strlen(pszSize) + strlen(pszType) + 1);
866 sprintf(pszName, "%s%s%s", pszBaseName, pszSize, pszType);
872 /*****************************************************************************/
879 /* 1 could not open file */
881 /*****************************************************************************/
882 ushort CopyFile(char *pszSource, char *pszDest)
891 char *msgPtr, *fmtPtr, *errPtr;
893 fdSource = open(pszSource, O_RDONLY);
894 if (fdSource == -1) {
895 msgPtr = GETMESSAGE(5, 60, "Could not open the following file:");
897 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
898 strlen(pszSource) + 1) * sizeof(char));
899 sprintf(errPtr, fmtPtr, msgPtr, pszSource);
900 display_error_message(CreateActionAppShell, errPtr);
904 /************************************************************/
905 /* Find out how big a buffer is needed */
906 /************************************************************/
907 len = lseek(fdSource, 0, SEEK_END);
908 (void) lseek(fdSource, 0, SEEK_SET);
909 buffer = XtMalloc((Cardinal) (len + 1));
910 if ((rlen = read(fdSource, buffer, len)) != len) {
911 /*********************************************************/
912 /* Didn't read whole file! */
913 /*********************************************************/
915 fdDest = creat(pszDest, 0644);
916 /*fdDest = open(pszDest, O_WRONLY);*/
918 msgPtr = GETMESSAGE(5, 55, "Could not create the following file:");
920 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
921 strlen(pszDest) + 1) * sizeof(char));
922 sprintf(errPtr, fmtPtr, msgPtr, pszDest);
923 display_error_message(CreateActionAppShell, errPtr);
927 if ((rlen = write(fdDest, buffer, len)) != len) {
928 /***************************************************/
929 /* Didn't write the whole file! */
930 /***************************************************/
943 /*****************************************************************************/
949 /* NULL error has occurred */
950 /* not NULL name of directory to store icons */
952 /*****************************************************************************/
953 char * CreateDirName(void)
955 char *pszNewName = (char *)NULL;
956 char *pszDirName = (char *)NULL;
958 char *msgPtr, *errPtr;
960 pszEnvVar = getenv("HOME");
961 if ( pszEnvVar && strlen(pszEnvVar) ) {
962 pszDirName = XtMalloc(strlen(pszEnvVar) + strlen("/.dt/icons/") + 1);
963 sprintf(pszDirName, "%s/.dt/icons/", pszEnvVar);
965 msgPtr = GETMESSAGE(5, 170, "The HOME environment variable is not set.\n\
966 The HOME environment variable must be set in order\n\
967 for this action to be saved.");
968 errPtr = XtNewString(msgPtr);
969 display_error_message(CreateActionAppShell, errPtr);
975 /*****************************************************************************/
977 /* CopyFilesFromWid */
982 /* 1 could not open file */
984 /*****************************************************************************/
985 ushort CopyFilesFromWid(ActionData *pAD, Widget wid)
989 char *pszDirName = (char *)NULL;
990 Boolean bHaveError = FALSE;
991 char *pszIconName = (char *)NULL;
992 char *pszNewName = (char *)NULL;
993 char *pszMaskName = (char *)NULL;
995 pszDirName = CreateDirName();
996 if (!pszDirName) bHaveError = True;
998 pIconData = GetIconDataFromWid(wid);
999 pszNewName = ReplaceSpaces(pAD->pszName);
1001 if ((!bHaveError) && (pIconData)) {
1002 pszIconName = CreateIconName(pszDirName, pszNewName, pIconData->size, PIXMAP_EXT, FALSE);
1003 if ((!pszIconName) || (CopyFile(pIconData->pmFileName, pszIconName))) {
1006 if (pszIconName) XtFree(pszIconName);
1009 if ((!bHaveError) && (pIconData)) {
1010 pszIconName = CreateIconName(pszDirName, pszNewName, pIconData->size, BITMAP_EXT, FALSE);
1011 if ((!pszIconName) || (CopyFile(pIconData->bmFileName, pszIconName))) {
1014 if (pszIconName) XtFree(pszIconName);
1016 /**********************************************/
1017 /* Now see if it has a mask file. */
1018 /**********************************************/
1020 pszMaskName = CreateMaskName(pIconData->bmFileName);
1021 if ((pszMaskName) && (check_file_exists(pszMaskName))) {
1023 printf("Mask file exists = %s\n", pszMaskName); /* debug */
1025 pszIconName = CreateIconName(pszDirName, pszNewName, pIconData->size, BITMAP_EXT, TRUE);
1026 if ((!pszIconName) || (CopyFile(pszMaskName, pszIconName))) {
1029 if (pszIconName) XtFree(pszIconName);
1030 XtFree(pszMaskName);
1035 if (pszNewName) XtFree(pszNewName);
1036 if (pszDirName) XtFree(pszDirName);
1044 /******************************************************************************/
1045 /* ActionHasIcon - check if any of the main action's icons have dirty bit set */
1049 /* OUTPUT: TRUE - action has icon */
1050 /* FALSE - no icon for this action */
1052 /******************************************************************************/
1053 Boolean ActionHasIcon (void)
1055 if ( CheckDirtyIcon(CA_LRG_IconGadget) ||
1056 CheckDirtyIcon(CA_MED_IconGadget) ||
1057 CheckDirtyIcon(CA_TINY_IconGadget) ) {
1065 /******************************************************************************/
1066 /* FiletypeHasIcon - check if the filetype has modified icons. */
1068 /* INPUT: Filetype data structure pointer */
1070 /* OUTPUT: TRUE - action has icon */
1071 /* FALSE - no icon for this action */
1073 /******************************************************************************/
1074 Boolean FiletypeHasIcon (FiletypeData *pFtD)
1076 if ( (pFtD->pszMedPmIcon) ||
1077 (pFtD->pszMedBmIcon) ||
1078 (pFtD->pszTinyPmIcon) ||
1079 (pFtD->pszTinyBmIcon) ) {
1087 /*****************************************************************************/
1094 /* 1 could not open file */
1096 /*****************************************************************************/
1097 ushort CopyIconFiles(ActionData *pAD)
1100 Boolean bHaveError = FALSE;
1103 char *pszDirName = (char *)NULL;
1104 char *pszNewIconName;
1105 char *pszNewIconMask;
1106 char *pszOldIconName;
1108 char buffer[MAXFILENAME];
1111 #define CIF_SUCCESS 0
1113 if (ActionHasIcon()) {
1114 if ( !bHaveError && (CopyFilesFromWid(pAD, CA_LRG_IconGadget) != 0) ) {
1117 if ( !bHaveError && (CopyFilesFromWid(pAD, CA_MED_IconGadget) != 0) ) {
1120 if ( !bHaveError && (CopyFilesFromWid(pAD, CA_TINY_IconGadget) != 0) ) {
1125 if (!bHaveError && (pAD->papFiletypes)) {
1126 pszDirName = CreateDirName();
1127 for (i=0; i < pAD->cFiletypes; i++) {
1128 pFtD = pAD->papFiletypes[i];
1129 if (FiletypeHasIcon(pFtD)) {
1130 FIND_ICONGADGET_ICON(pFtD->pszIcon, pszOldIconName, DtMEDIUM);
1131 if (pszOldIconName) {
1132 ptr = strstr(pszOldIconName, MEDIUM_EXT);
1133 if (ptr) *ptr = '\0';
1136 /*****************************************************************/
1138 /*****************************************************************/
1139 pszNewIconName = CreateIconName(pszDirName, pFtD->pszName, Medium_Icon, PIXMAP_EXT, FALSE);
1140 if (pszNewIconName) {
1141 if (pFtD->pszMedPmIcon) {
1142 CopyFile(pFtD->pszMedPmIcon, pszNewIconName);
1144 ptr = CreateIconName((char *)NULL, pszOldIconName, Medium_Icon, PIXMAP_EXT, FALSE);
1146 CopyFile(ptr, pszNewIconName);
1150 if (pszNewIconName) XtFree(pszNewIconName);
1153 /*****************************************************************/
1155 /*****************************************************************/
1156 pszNewIconName = CreateIconName(pszDirName, pFtD->pszName, Medium_Icon, BITMAP_EXT, FALSE);
1157 pszNewIconMask = CreateIconName(pszDirName, pFtD->pszName, Medium_Icon, BITMAP_EXT, TRUE);
1158 if (pszNewIconName) {
1159 if (pFtD->pszMedBmIcon) {
1160 CopyFile(pFtD->pszMedBmIcon, pszNewIconName);
1161 /****************************/
1162 /* Now do the mask file. */
1163 /****************************/
1164 sprintf(buffer, "%s_m", pFtD->pszMedBmIcon);
1165 if (pszNewIconMask && check_file_exists(buffer)) {
1166 CopyFile(buffer, pszNewIconMask);
1169 ptr = CreateIconName((char *)NULL, pszOldIconName, Medium_Icon, BITMAP_EXT, FALSE);
1171 CopyFile(ptr, pszNewIconName);
1174 /****************************/
1175 /* Now do the mask file. */
1176 /****************************/
1177 ptr = CreateIconName((char *)NULL, pszOldIconName, Medium_Icon, BITMAP_EXT, TRUE);
1178 if (ptr && check_file_exists(ptr) && pszNewIconMask) {
1179 CopyFile(ptr, pszNewIconMask);
1183 if (pszNewIconName) XtFree(pszNewIconName);
1184 if (pszNewIconMask) XtFree(pszNewIconMask);
1187 /*****************************************************************/
1189 /*****************************************************************/
1190 pszNewIconName = CreateIconName(pszDirName, pFtD->pszName, Tiny_Icon, PIXMAP_EXT, FALSE);
1191 if (pszNewIconName) {
1192 if (pFtD->pszTinyPmIcon) {
1193 CopyFile(pFtD->pszTinyPmIcon, pszNewIconName);
1195 ptr = CreateIconName((char *)NULL, pszOldIconName, Tiny_Icon, PIXMAP_EXT, FALSE);
1197 CopyFile(ptr, pszNewIconName);
1201 if (pszNewIconName) XtFree(pszNewIconName);
1204 /*****************************************************************/
1206 /*****************************************************************/
1207 pszNewIconName = CreateIconName(pszDirName, pFtD->pszName, Tiny_Icon, BITMAP_EXT, FALSE);
1208 pszNewIconMask = CreateIconName(pszDirName, pFtD->pszName, Tiny_Icon, BITMAP_EXT, TRUE);
1209 if (pszNewIconName) {
1210 if (pFtD->pszTinyBmIcon) {
1211 CopyFile(pFtD->pszTinyBmIcon, pszNewIconName);
1212 /****************************/
1213 /* Now do the mask file. */
1214 /****************************/
1215 sprintf(buffer, "%s_m", pFtD->pszTinyBmIcon);
1216 if (pszNewIconMask && check_file_exists(buffer)) {
1217 CopyFile(buffer, pszNewIconMask);
1220 ptr = CreateIconName((char *)NULL, pszOldIconName, Tiny_Icon, BITMAP_EXT, FALSE);
1222 CopyFile(ptr, pszNewIconName);
1225 /****************************/
1226 /* Now do the mask file. */
1227 /****************************/
1228 ptr = CreateIconName((char *)NULL, pszOldIconName, Tiny_Icon, BITMAP_EXT, TRUE);
1229 if (ptr && check_file_exists(ptr) && pszNewIconMask) {
1230 CopyFile(ptr, pszNewIconMask);
1234 if (pszNewIconName) XtFree(pszNewIconName);
1235 if (pszNewIconMask) XtFree(pszNewIconMask);
1241 return(CIF_SUCCESS);