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 libraries 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;
418 /***************************************************************************/
419 /* Open action and filetypes definition file for writing. */
420 /***************************************************************************/
421 if ((fp = fopen(pszFile, "w+")) == NULL) {
423 printf("Can not open file.\n"); /* debug */
425 msgPtr = GETMESSAGE(5, 55, "Could not create the following file:");
427 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
428 strlen(pszFile) + 1) * sizeof(char));
429 sprintf(errPtr, fmtPtr, msgPtr, pszFile);
430 display_error_message(CreateActionAppShell, errPtr);
435 printf("database file = %s\n", pszFile); /* debug */
438 /***************************************************************************/
439 /* Write comment area of action and filetype definition file, including */
440 /* revision number and magic cookie. */
441 /***************************************************************************/
442 fprintf(fp, "######################################################################\n");
444 fprintf(fp, "# Common Desktop Environment (CDE)\n");
446 fprintf(fp, "# Action and DataType Definition File\n");
448 fprintf(fp, "# Generated by the CreateAction tool\n");
450 fprintf(fp, "# $Revision: 1.0\n");
452 fprintf(fp, "# $KEY: nnnnn \n");
454 fprintf(fp, "######################################################################\n");
456 fprintf(fp, "# WARNING:\n");
458 fprintf(fp, "# This file was generated by the CDE CreateAction tool.\n");
459 fprintf(fp, "# If this file is modified by some other tool, such as vi,\n");
460 fprintf(fp, "# the CreateAction tool will no longer be able to load and\n");
461 fprintf(fp, "# update this file. For this reason, changes to this file\n");
462 fprintf(fp, "# should be handled through CreateAction whenever possible.\n");
464 fprintf(fp, "######################################################################\n");
467 /***************************************************************************/
468 /* Write the main Action definition. */
469 /***************************************************************************/
470 ptr = GetCoreName(pszFile);
471 fprintf(fp, "ACTION %s\n", ptr);
474 fprintf(fp, " LABEL %s\n", pAD->pszName);
475 fprintf(fp, " TYPE COMMAND\n");
476 ptr = MakeExecString(AD.pszCmd, AD.pszPrompt);
478 fprintf(fp, " EXEC_STRING %s\n", ptr);
483 fprintf(fp, " LARGE_ICON %s.m\n", pAD->pszIcon);
484 fprintf(fp, " SMALL_ICON %s.t\n", pAD->pszIcon);
486 if (ActionHasIcon()) {
487 fprintf(fp, " ICON %s\n", pAD->pszName);
489 fprintf(fp, " ICON %s\n", pAD->pszIcon);
494 printf("CA flags = %X\n", pAD->fsFlags);
496 if (pAD->fsFlags & CA_WT_TERM) fprintf(fp, " WINDOW_TYPE TERMINAL\n");
497 else if (pAD->fsFlags & CA_WT_PERMTERM) fprintf(fp, " WINDOW_TYPE PERM_TERMINAL\n");
498 else if (pAD->fsFlags & CA_WT_SHELLTERM) fprintf(fp, " WINDOW_TYPE SHELL_TERMINAL\n");
499 else fprintf(fp, " WINDOW_TYPE NO_STDIO\n");
501 if ((pAD->papFiletypes) && (pAD->fsFlags & CA_DF_ONLYFTFILES)) {
502 fprintf(fp, " ARG_TYPE %s", (pAD->papFiletypes[0])->pszName);
503 for (i=1; i < pAD->cFiletypes; i++) {
504 pFtD = pAD->papFiletypes[i];
505 fprintf(fp, ",%s", pFtD->pszName);
511 fprintf(fp, " DESCRIPTION %s\n", pAD->pszHelp);
516 /***************************************************************************/
517 /* Write the filetype definitions. */
518 /***************************************************************************/
519 if (pAD->papFiletypes) {
520 for (i=0; i < pAD->cFiletypes; i++) {
521 pFtD = pAD->papFiletypes[i];
522 /***********************************************************************/
523 /* Write the data attributes declaration. */
524 /***********************************************************************/
525 fprintf(fp, "DATA_ATTRIBUTES %s\n", pFtD->pszName);
527 fprintf(fp, " ACTIONS Open");
528 if (pFtD->pszPrintCmd) {
529 fprintf(fp, ",Print");
534 fprintf(fp, " LARGE_ICON %s.m\n", pFtD->pszIcon);
535 fprintf(fp, " SMALL_ICON %s.t\n", pFtD->pszIcon);
537 if (FiletypeHasIcon(pFtD)) {
538 fprintf(fp, " ICON %s\n", pFtD->pszName);
540 fprintf(fp, " ICON %s\n", pFtD->pszIcon);
545 fprintf(fp, " DESCRIPTION %s\n", pFtD->pszHelp);
549 /***********************************************************************/
550 /* Write the data criteria declaration. */
551 /***********************************************************************/
552 fprintf(fp, "DATA_CRITERIA %sA\n", pFtD->pszName);
554 fprintf(fp, " DATA_ATTRIBUTES_NAME %s\n", pFtD->pszName);
555 if (pFtD->pszPermissions) {
556 fprintf(fp, " MODE %s\n", pFtD->pszPermissions);
558 if (pFtD->pszPattern) {
559 fprintf(fp, " PATH_PATTERN %s\n", pFtD->pszPattern);
561 if (pFtD->pszContents) {
562 if (pFtD->fsFlags & CA_FT_CNTSTRING)
563 strcpy(buffer, "string");
564 else if (pFtD->fsFlags & CA_FT_CNTBYTE)
565 strcpy(buffer, "byte");
566 else if (pFtD->fsFlags & CA_FT_CNTSHORT)
567 strcpy(buffer, "short");
568 else if (pFtD->fsFlags & CA_FT_CNTLONG)
569 strcpy(buffer, "long");
570 fprintf(fp, " CONTENT %d %s %s\n", pFtD->sStart, buffer, pFtD->pszContents);
574 /***********************************************************************/
575 /* Write the Open MAP action. */
576 /***********************************************************************/
577 fprintf(fp, "ACTION Open\n");
579 fprintf(fp, " ARG_TYPE %s\n", pFtD->pszName);
580 fprintf(fp, " TYPE MAP\n");
581 fprintf(fp, " MAP_ACTION %s\n", pAD->pszName);
582 fprintf(fp, " LABEL %s\n", GETMESSAGE(7, 30, "Open"));
585 /***********************************************************************/
586 /* Write the Print filetype action and MAP action. */
587 /***********************************************************************/
588 if (pFtD->pszPrintCmd) {
589 /*********************************************************************/
590 /* First write the print filetype action. */
591 /*********************************************************************/
592 fprintf(fp, "ACTION %s_PRINT\n", pFtD->pszName);
594 fprintf(fp, " TYPE COMMAND\n");
595 ptr = MakeExecString(pFtD->pszPrintCmd, NULL);
597 fprintf(fp, " EXEC_STRING %s\n", ptr);
598 /*fprintf(fp, " EXEC_STRING %s\n", pFtD->pszPrintCmd);*/
601 fprintf(fp, " WINDOW_TYPE NO_STDIO\n");
604 /*********************************************************************/
605 /* Now writhe the Print MAP action. */
606 /*********************************************************************/
607 fprintf(fp, "ACTION Print\n");
609 fprintf(fp, " ARG_TYPE %s\n", pFtD->pszName);
610 fprintf(fp, " TYPE MAP\n");
611 fprintf(fp, " MAP_ACTION %s_PRINT\n", pFtD->pszName);
612 fprintf(fp, " LABEL %s\n", GETMESSAGE(7, 31, "Print"));
622 chmod(pszFile, 0644);
627 /*****************************************************************************/
629 /* WriteActionFile */
634 /* 1 could not open file */
636 /*****************************************************************************/
637 ushort WriteActionFile(ActionData *pAD)
640 FILE *fp = (FILE *)NULL;
644 char *msgPtr, *fmtPtr, *errPtr;
646 /***************************************************************************/
647 /* Open action file for writing. */
648 /***************************************************************************/
649 newName = ReplaceSpaces(AD.pszName);
650 pszEnvVar = getenv("HOME");
652 if ( pszEnvVar && strlen(pszEnvVar) ) {
653 pszFile = XtMalloc(strlen(pszEnvVar) + strlen(newName) + 10);
654 if (pszFile) sprintf(pszFile, "%s/%s", pszEnvVar, newName);
656 pszFile = XtMalloc(strlen(newName) + 10);
657 if (pszFile) sprintf(pszFile, "/tmp/%s", newName);
661 /***************************************************************************/
662 /* Open action file for writing. */
663 /***************************************************************************/
664 if (pszFile == NULL || (fp = fopen(pszFile, "w")) == NULL) {
666 printf("Can not open file.\n"); /* debug */
668 msgPtr = GETMESSAGE(5, 55, "Could not create the following file:");
670 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
671 strlen(pszFile) + 1) * sizeof(char));
672 sprintf(errPtr, fmtPtr, msgPtr, pszFile);
673 display_error_message(CreateActionAppShell, errPtr);
679 printf("action file = %s\n", pszFile); /* debug */
681 /***************************************************************************/
682 /* Write action file contents. */
683 /***************************************************************************/
684 fprintf(fp, "################################################\n");
686 fprintf(fp, "# action\n");
688 fprintf(fp, "# Common Desktop Environment (CDE)\n");
690 fprintf(fp, "# $TOG: fileio.c /main/9 1998/10/26 17:18:19 mgreess $\n");
692 fprintf(fp, "################################################\n");
694 fprintf(fp, "# This file represents a CDE Dt action. The contents of the file do\n");
695 fprintf(fp, "# not matter; however, the file must have executable permission and the\n");
696 fprintf(fp, "# name of the file must match an entry in the action database (*.dt files).\n");
698 fprintf(fp, "# For more information on Dt actions, see the CDE Dt manuals.\n");
700 fprintf(fp, "echo \"Common Desktop Environment Dt action\"\n");
704 chmod(pszFile, 0755);
708 /******************************************************************************/
709 /* check_file_exists - check if the file exists that is passed in, if not */
710 /* display error dialog. */
712 /* INPUT: filename - name of file to check if it exists or not. */
714 /* OUTPUT: TRUE - file exists */
715 /* FALSE - file does not exist */
717 /******************************************************************************/
718 Boolean check_file_exists (char *pszFileName)
722 /***************************************/
723 /* see if file exists */
724 /***************************************/
725 exists = fopen (pszFileName, "r");
727 /***************************************/
728 /* if exists, return good return code */
729 /***************************************/
735 printf("File '%s' does not exist!\n", pszFileName);
741 /*****************************************************************************/
743 /* OpenDefinitionFile */
750 /*****************************************************************************/
751 int OpenDefinitionFile(char *pszFile, ActionData *pAD)
754 FILE *fp = (FILE *)NULL;
756 char *msgPtr, *fmtPtr, *errPtr;
758 /***************************************************************************/
759 /* Open action and filetypes definition file for reading. */
760 /***************************************************************************/
761 if ((fp = fopen(pszFile, "r+")) == NULL) {
763 printf("Can not open file.\n"); /* debug */
765 msgPtr = GETMESSAGE(5, 60, "Could not open the following file:");
767 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
768 strlen(pszFile) + 1) * sizeof(char));
769 sprintf(errPtr, fmtPtr, msgPtr, pszFile);
770 display_error_message(CreateActionAppShell, errPtr);
775 printf("Opened database file = %s\n", pszFile); /* debug */
778 /***************************************************************************/
779 /* If magic cookie is good, then parse the file. */
780 /***************************************************************************/
781 if (CheckCookie(fp)) {
783 printf("Cookie good, call parse code\n");
785 rc = GetActionData(fp, pAD);
787 /************************************************************************/
788 /* If error, display error message. */
789 /************************************************************************/
791 msgPtr = GETMESSAGE(5, 90, "Could not parse the following file:");
793 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
794 strlen(pszFile) + 1) * sizeof(char));
795 sprintf(errPtr, fmtPtr, msgPtr, pszFile);
796 display_error_message(CreateActionAppShell, errPtr);
806 /******************************************************************************/
807 /* CheckDirtyIcon - check if icon has a DirtyBit set */
809 /* INPUT: Icon Widget - widget id of icon gadget to check */
811 /* OUTPUT: TRUE - dirty bit is set */
812 /* FALSE - dirty bit is not set */
814 /******************************************************************************/
815 Boolean CheckDirtyIcon (Widget wid)
819 pIconData = GetIconDataFromWid(wid);
821 if ( (pIconData->pmDirtyBit) || (pIconData->bmDirtyBit) ) {
828 /*****************************************************************************/
835 /* 1 could not open file */
837 /*****************************************************************************/
838 char * CreateIconName(char *pszDirName, char *pszBaseName, enum icon_size_range enumSize, char *pszType, Boolean bIsMask)
841 char pszSize[MAX_EXT_SIZE];
845 strcpy(pszSize, LARGE_EXT);
848 strcpy(pszSize, MEDIUM_EXT);
851 strcpy(pszSize, SMALL_EXT);
854 strcpy(pszSize, TINY_EXT);
860 strcat(pszSize, "_m");
863 pszName = XtMalloc(strlen(pszDirName) + strlen(pszBaseName) + strlen(pszSize) + strlen(pszType) + 1);
865 sprintf(pszName, "%s%s%s%s", pszDirName, pszBaseName, pszSize, pszType);
868 pszName = XtMalloc(strlen(pszBaseName) + strlen(pszSize) + strlen(pszType) + 1);
870 sprintf(pszName, "%s%s%s", pszBaseName, pszSize, pszType);
876 /*****************************************************************************/
883 /* 1 could not open file */
885 /*****************************************************************************/
886 ushort CopyFile(char *pszSource, char *pszDest)
895 char *msgPtr, *fmtPtr, *errPtr;
897 fdSource = open(pszSource, O_RDONLY);
898 if (fdSource == -1) {
899 msgPtr = GETMESSAGE(5, 60, "Could not open the following file:");
901 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
902 strlen(pszSource) + 1) * sizeof(char));
903 sprintf(errPtr, fmtPtr, msgPtr, pszSource);
904 display_error_message(CreateActionAppShell, errPtr);
908 /************************************************************/
909 /* Find out how big a buffer is needed */
910 /************************************************************/
911 len = lseek(fdSource, 0, SEEK_END);
912 (void) lseek(fdSource, 0, SEEK_SET);
913 buffer = XtMalloc((Cardinal) (len + 1));
914 if ((rlen = read(fdSource, buffer, len)) != len) {
915 /*********************************************************/
916 /* Didn't read whole file! */
917 /*********************************************************/
919 fdDest = creat(pszDest, 0644);
920 /*fdDest = open(pszDest, O_WRONLY);*/
922 msgPtr = GETMESSAGE(5, 55, "Could not create the following file:");
924 errPtr = XtMalloc((strlen(msgPtr) + strlen(fmtPtr) +
925 strlen(pszDest) + 1) * sizeof(char));
926 sprintf(errPtr, fmtPtr, msgPtr, pszDest);
927 display_error_message(CreateActionAppShell, errPtr);
931 if ((rlen = write(fdDest, buffer, len)) != len) {
932 /***************************************************/
933 /* Didn't write the whole file! */
934 /***************************************************/
947 /*****************************************************************************/
953 /* NULL error has occurred */
954 /* not NULL name of directory to store icons */
956 /*****************************************************************************/
957 char * CreateDirName(void)
959 char *pszNewName = (char *)NULL;
960 char *pszDirName = (char *)NULL;
962 char *msgPtr, *errPtr;
964 pszEnvVar = getenv("HOME");
965 if ( pszEnvVar && strlen(pszEnvVar) ) {
966 pszDirName = XtMalloc(strlen(pszEnvVar) + strlen("/.dt/icons/") + 1);
967 sprintf(pszDirName, "%s/.dt/icons/", pszEnvVar);
969 msgPtr = GETMESSAGE(5, 170, "The HOME environment variable is not set.\n\
970 The HOME environment variable must be set in order\n\
971 for this action to be saved.");
972 errPtr = XtNewString(msgPtr);
973 display_error_message(CreateActionAppShell, errPtr);
979 /*****************************************************************************/
981 /* CopyFilesFromWid */
986 /* 1 could not open file */
988 /*****************************************************************************/
989 ushort CopyFilesFromWid(ActionData *pAD, Widget wid)
993 char *pszDirName = (char *)NULL;
994 Boolean bHaveError = FALSE;
995 char *pszIconName = (char *)NULL;
996 char *pszNewName = (char *)NULL;
997 char *pszMaskName = (char *)NULL;
999 pszDirName = CreateDirName();
1000 if (!pszDirName) bHaveError = True;
1002 pIconData = GetIconDataFromWid(wid);
1003 pszNewName = ReplaceSpaces(pAD->pszName);
1005 if ((!bHaveError) && (pIconData)) {
1006 pszIconName = CreateIconName(pszDirName, pszNewName, pIconData->size, PIXMAP_EXT, FALSE);
1007 if ((!pszIconName) || (CopyFile(pIconData->pmFileName, pszIconName))) {
1010 if (pszIconName) XtFree(pszIconName);
1013 if ((!bHaveError) && (pIconData)) {
1014 pszIconName = CreateIconName(pszDirName, pszNewName, pIconData->size, BITMAP_EXT, FALSE);
1015 if ((!pszIconName) || (CopyFile(pIconData->bmFileName, pszIconName))) {
1018 if (pszIconName) XtFree(pszIconName);
1020 /**********************************************/
1021 /* Now see if it has a mask file. */
1022 /**********************************************/
1024 pszMaskName = CreateMaskName(pIconData->bmFileName);
1025 if ((pszMaskName) && (check_file_exists(pszMaskName))) {
1027 printf("Mask file exists = %s\n", pszMaskName); /* debug */
1029 pszIconName = CreateIconName(pszDirName, pszNewName, pIconData->size, BITMAP_EXT, TRUE);
1030 if ((!pszIconName) || (CopyFile(pszMaskName, pszIconName))) {
1033 if (pszIconName) XtFree(pszIconName);
1034 XtFree(pszMaskName);
1039 if (pszNewName) XtFree(pszNewName);
1040 if (pszDirName) XtFree(pszDirName);
1048 /******************************************************************************/
1049 /* ActionHasIcon - check if any of the main action's icons have dirty bit set */
1053 /* OUTPUT: TRUE - action has icon */
1054 /* FALSE - no icon for this action */
1056 /******************************************************************************/
1057 Boolean ActionHasIcon (void)
1059 if ( CheckDirtyIcon(CA_LRG_IconGadget) ||
1060 CheckDirtyIcon(CA_MED_IconGadget) ||
1061 CheckDirtyIcon(CA_TINY_IconGadget) ) {
1069 /******************************************************************************/
1070 /* FiletypeHasIcon - check if the filetype has modified icons. */
1072 /* INPUT: Filetype data structure pointer */
1074 /* OUTPUT: TRUE - action has icon */
1075 /* FALSE - no icon for this action */
1077 /******************************************************************************/
1078 Boolean FiletypeHasIcon (FiletypeData *pFtD)
1080 if ( (pFtD->pszMedPmIcon) ||
1081 (pFtD->pszMedBmIcon) ||
1082 (pFtD->pszTinyPmIcon) ||
1083 (pFtD->pszTinyBmIcon) ) {
1091 /*****************************************************************************/
1098 /* 1 could not open file */
1100 /*****************************************************************************/
1101 ushort CopyIconFiles(ActionData *pAD)
1104 Boolean bHaveError = FALSE;
1107 char *pszDirName = (char *)NULL;
1108 char *pszNewIconName;
1109 char *pszNewIconMask;
1110 char *pszOldIconName;
1112 char buffer[MAXFILENAME];
1115 #define CIF_SUCCESS 0
1117 if (ActionHasIcon()) {
1118 if ( !bHaveError && (CopyFilesFromWid(pAD, CA_LRG_IconGadget) != 0) ) {
1121 if ( !bHaveError && (CopyFilesFromWid(pAD, CA_MED_IconGadget) != 0) ) {
1124 if ( !bHaveError && (CopyFilesFromWid(pAD, CA_TINY_IconGadget) != 0) ) {
1129 if (!bHaveError && (pAD->papFiletypes)) {
1130 pszDirName = CreateDirName();
1131 for (i=0; i < pAD->cFiletypes; i++) {
1132 pFtD = pAD->papFiletypes[i];
1133 if (FiletypeHasIcon(pFtD)) {
1134 FIND_ICONGADGET_ICON(pFtD->pszIcon, pszOldIconName, DtMEDIUM);
1135 if (pszOldIconName) {
1136 ptr = strstr(pszOldIconName, MEDIUM_EXT);
1137 if (ptr) *ptr = '\0';
1140 /*****************************************************************/
1142 /*****************************************************************/
1143 pszNewIconName = CreateIconName(pszDirName, pFtD->pszName, Medium_Icon, PIXMAP_EXT, FALSE);
1144 if (pszNewIconName) {
1145 if (pFtD->pszMedPmIcon) {
1146 CopyFile(pFtD->pszMedPmIcon, pszNewIconName);
1148 ptr = CreateIconName((char *)NULL, pszOldIconName, Medium_Icon, PIXMAP_EXT, FALSE);
1150 CopyFile(ptr, pszNewIconName);
1154 if (pszNewIconName) XtFree(pszNewIconName);
1157 /*****************************************************************/
1159 /*****************************************************************/
1160 pszNewIconName = CreateIconName(pszDirName, pFtD->pszName, Medium_Icon, BITMAP_EXT, FALSE);
1161 pszNewIconMask = CreateIconName(pszDirName, pFtD->pszName, Medium_Icon, BITMAP_EXT, TRUE);
1162 if (pszNewIconName) {
1163 if (pFtD->pszMedBmIcon) {
1164 CopyFile(pFtD->pszMedBmIcon, pszNewIconName);
1165 /****************************/
1166 /* Now do the mask file. */
1167 /****************************/
1168 sprintf(buffer, "%s_m", pFtD->pszMedBmIcon);
1169 if (pszNewIconMask && check_file_exists(buffer)) {
1170 CopyFile(buffer, pszNewIconMask);
1173 ptr = CreateIconName((char *)NULL, pszOldIconName, Medium_Icon, BITMAP_EXT, FALSE);
1175 CopyFile(ptr, pszNewIconName);
1178 /****************************/
1179 /* Now do the mask file. */
1180 /****************************/
1181 ptr = CreateIconName((char *)NULL, pszOldIconName, Medium_Icon, BITMAP_EXT, TRUE);
1182 if (ptr && check_file_exists(ptr) && pszNewIconMask) {
1183 CopyFile(ptr, pszNewIconMask);
1187 if (pszNewIconName) XtFree(pszNewIconName);
1188 if (pszNewIconMask) XtFree(pszNewIconMask);
1191 /*****************************************************************/
1193 /*****************************************************************/
1194 pszNewIconName = CreateIconName(pszDirName, pFtD->pszName, Tiny_Icon, PIXMAP_EXT, FALSE);
1195 if (pszNewIconName) {
1196 if (pFtD->pszTinyPmIcon) {
1197 CopyFile(pFtD->pszTinyPmIcon, pszNewIconName);
1199 ptr = CreateIconName((char *)NULL, pszOldIconName, Tiny_Icon, PIXMAP_EXT, FALSE);
1201 CopyFile(ptr, pszNewIconName);
1205 if (pszNewIconName) XtFree(pszNewIconName);
1208 /*****************************************************************/
1210 /*****************************************************************/
1211 pszNewIconName = CreateIconName(pszDirName, pFtD->pszName, Tiny_Icon, BITMAP_EXT, FALSE);
1212 pszNewIconMask = CreateIconName(pszDirName, pFtD->pszName, Tiny_Icon, BITMAP_EXT, TRUE);
1213 if (pszNewIconName) {
1214 if (pFtD->pszTinyBmIcon) {
1215 CopyFile(pFtD->pszTinyBmIcon, pszNewIconName);
1216 /****************************/
1217 /* Now do the mask file. */
1218 /****************************/
1219 sprintf(buffer, "%s_m", pFtD->pszTinyBmIcon);
1220 if (pszNewIconMask && check_file_exists(buffer)) {
1221 CopyFile(buffer, pszNewIconMask);
1224 ptr = CreateIconName((char *)NULL, pszOldIconName, Tiny_Icon, BITMAP_EXT, FALSE);
1226 CopyFile(ptr, pszNewIconName);
1229 /****************************/
1230 /* Now do the mask file. */
1231 /****************************/
1232 ptr = CreateIconName((char *)NULL, pszOldIconName, Tiny_Icon, BITMAP_EXT, TRUE);
1233 if (ptr && check_file_exists(ptr) && pszNewIconMask) {
1234 CopyFile(ptr, pszNewIconMask);
1238 if (pszNewIconName) XtFree(pszNewIconName);
1239 if (pszNewIconMask) XtFree(pszNewIconMask);
1245 return(CIF_SUCCESS);