diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aux/antiword/startup.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/antiword/startup.c')
-rwxr-xr-x | sys/src/cmd/aux/antiword/startup.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/antiword/startup.c b/sys/src/cmd/aux/antiword/startup.c new file mode 100755 index 000000000..7e1b6d7d7 --- /dev/null +++ b/sys/src/cmd/aux/antiword/startup.c @@ -0,0 +1,145 @@ +/* + * startup.c + * Copyright (C) 1998-2001 A.J. van Os; Released under GPL + * + * Description: + * Try to force a single startup of !Antiword + */ + +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include "DeskLib:Error.h" +#include "DeskLib:Event.h" +#include "DeskLib:SWI.h" +#include "antiword.h" + + +#if !defined(TaskManager_EnumerateTasks) +#define TaskManager_EnumerateTasks 0x042681 +#endif /* TaskManager_EnumerateTasks */ + +/* + * bIsMatch - decide whether the two strings match + * + * like strcmp, but this one ignores case + */ +static BOOL +bIsMatch(const char *szStr1, const char *szStr2) +{ + const char *pcTmp1, *pcTmp2; + + for (pcTmp1 = szStr1, pcTmp2 = szStr2; + *pcTmp1 != '\0'; + pcTmp1++, pcTmp2++) { + if (toupper(*pcTmp1) != toupper(*pcTmp2)) { + return FALSE; + } + } + return *pcTmp2 == '\0'; +} /* end of bIsMatch */ + +/* + * tGetTaskHandle - get the task handle of the given task + * + * returns the task handle when found, otherwise 0 + */ +static task_handle +tGetTaskHandle(const char *szTaskname) +{ + const char *pcTmp; + int iReg0, iIndex; + int aiBuffer[4]; + char szTmp[21]; + + iReg0 = 0; + do { + /* Get info on the next task */ + Error_CheckFatal(SWI(3, 1, TaskManager_EnumerateTasks | XOS_Bit, + iReg0, aiBuffer, sizeof(aiBuffer), &iReg0)); + /* Copy the (control character terminated) task name */ + for (iIndex = 0, pcTmp = (const char *)aiBuffer[1]; + iIndex < elementsof(szTmp); + iIndex++, pcTmp++) { + if (iscntrl(*pcTmp)) { + szTmp[iIndex] = '\0'; + break; + } + szTmp[iIndex] = *pcTmp; + } + szTmp[elementsof(szTmp) - 1] = '\0'; + if (bIsMatch(szTmp, szTaskname)) { + /* Task found */ + return (task_handle)aiBuffer[0]; + } + } while (iReg0 >= 0); + + /* Task not found */ + return 0; +} /* end of tGetTaskHandle */ + +int +main(int argc, char **argv) +{ + message_block tMsg; + task_handle tTaskHandle; + size_t tArgLen; + int aiMessages[] = {0}; + char szCommand[512]; + + Event_Initialise3("StartUp", 310, aiMessages); + + if (argc > 1) { + tArgLen = strlen(argv[1]); + } else { + tArgLen = 0; + } + if (tArgLen >= sizeof(tMsg.data.dataload.filename)) { + werr(1, "Input filename too long"); + return EXIT_FAILURE; + } + + tTaskHandle = tGetTaskHandle("antiword"); + + if (tTaskHandle == 0) { + /* Antiword is not active */ + strcpy(szCommand, "chain:<Antiword$Dir>.!Antiword"); + if (argc > 1) { + strcat(szCommand, " "); + strcat(szCommand, argv[1]); + } +#if defined(DEBUG) + strcat(szCommand, " "); + strcat(szCommand, "2><Antiword$Dir>.Debug"); +#endif /* DEBUG */ + system(szCommand); + /* If we reach here something has gone wrong */ + return EXIT_FAILURE; + } + + /* Antiword is active */ + if (argc > 1) { + /* + * Send the argument to Antiword by imitating a + * drag-and-drop to Antiword's iconbar icon + */ + memset(&tMsg, 0, sizeof(tMsg)); + tMsg.header.size = ROUND4(offsetof(message_block, data) + + offsetof(message_dataload, filename) + + 1 + tArgLen); + tMsg.header.yourref = 0; + tMsg.header.action = message_DATALOAD; + tMsg.data.dataload.window = window_ICONBAR; + tMsg.data.dataload.icon = -1; + tMsg.data.dataload.size = 0; + tMsg.data.dataload.filetype = FILETYPE_MSWORD; + strcpy(tMsg.data.dataload.filename, argv[1]); + Error_CheckFatal(Wimp_SendMessage(event_SEND, + &tMsg, tTaskHandle, 0)); + return EXIT_SUCCESS; + } else { + /* Give an error message and return */ + werr(1, "Antiword is already running"); + return EXIT_FAILURE; + } +} /* end of main */ |