/*
* 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 */
|