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