home *** CD-ROM | disk | FTP | other *** search
- /*
- * starttools.c V1.3
- *
- * CLI & WB startup procedure
- *
- * (c) 1991 by Stefan Becker
- *
- */
- #include "ToolManager.h"
-
- /* Start tool as a CLI process */
- BOOL StartCLITool(struct AppMessage *msg, struct ToolNode *tn, char *name)
- {
- BPTR fl; /* AmigaDOS file handle */
- BOOL rc=TRUE;
- char cmd[NAMELEN]; /* Buffer for command line */
- int cmdlen; /* Command line length */
- char dir[NAMELEN];
- struct WBArg *wa=msg->am_ArgList;
- int i;
-
- fl=CurrentDir(tn->tn_DirLock); /* Change to tool's directory */
-
- strcpy(cmd,name); /* Command name first */
- cmdlen=strlen(cmd);
-
- for (i=msg->am_NumArgs; i; i--,wa++)
- {
- char *cp;
- int namelen;
-
- if (!wa->wa_Lock) continue; /* Skip arguments which don't support locks! */
-
- if (cmdlen>NAMELEN-2) break; /* Append a space for each parameter */
- strcat(cmd," ");
- cmdlen++;
-
- /* Build parameter from Lock & name */
- if (SameLock(tn->tn_DirLock,wa->wa_Lock)==LOCK_SAME) cp=wa->wa_Name;
- else
- {
- if (!NameFromLock(wa->wa_Lock,dir,NAMELEN)) continue;
- if (!AddPart(dir,wa->wa_Name,NAMELEN)) continue;
- cp=dir;
- }
-
- namelen=strlen(cp);
-
- if (strchr(cp,' ')) /* Special case: Space in a filename */
- if (namelen>NAMELEN-3) break;
- else
- {
- strins(cp,"\""); /* Set parameter in double quotes */
- strcat(cp,"\"");
- namelen+=2;
- }
-
- if (cmdlen+namelen>NAMELEN-2) break;
- strcat(cmd,cp); /* Append parameter */
- cmdlen+=namelen; /* New command line length */
- }
-
- /* Start tool */
- if (SystemTags(cmd,SYS_Input,Open("NIL:",MODE_NEWFILE),
- SYS_Output,Open("NIL:",MODE_NEWFILE),
- SYS_Asynch,TRUE, /* Run tools asynchronously */
- TAG_DONE)==-1)
- rc=FALSE; /* An error occured */
-
- CurrentDir(fl); /* Change to old directory */
- return(rc);
- }
-
- /* Start tool as a WB process */
- BOOL StartWBTool(struct AppMessage *msg, struct ToolNode *tn, char *name)
- {
- BPTR fl; /* AmigaDOS file handle */
- struct WBStartup *wbs; /* WBStartup message for tool */
- struct DiskObject *tdob; /* Tool icon */
- LONG ssize=4096; /* StackSize, default */
- struct MsgPort *proc; /* Process descriptor for tool */
- /* struct Process *proc; Process descriptor for CreateNewProc */
- struct WBArg *wbad,*wbas; /* Pointers to WB arguments */
- int i;
-
- /* Allocate memory for WBStartup */
- if (!(wbs=calloc(sizeof(struct WBStartup)+
- sizeof(struct WBArg)*(msg->am_NumArgs+1),1))) return (FALSE);
-
- fl=CurrentDir(tn->tn_DirLock); /* Change to tool's directory */
-
- if (!(wbs->sm_Segment=NewLoadSeg(name,NULL))) goto e1; /* Load tool code */
-
- /* Get some information about the tool */
- if (tdob=GetDiskObject(name))
- {
- if (tdob->do_Type==WBTOOL) /* Only WBTools supply this type of info! */
- {
- if (tdob->do_ToolWindow) wbs->sm_ToolWindow=strdup(tdob->do_ToolWindow);
- if (tdob->do_StackSize>ssize) ssize=tdob->do_StackSize;
- }
- FreeDiskObject(tdob);
- }
-
- /* Build WBStartup message */
- /* wbs->sm_Message.mn_Node.ln_Type=NT_MESSAGE; PutMsg() does this for us! */
- wbs->sm_Message.mn_ReplyPort=MyMP;
- wbs->sm_Message.mn_Length=sizeof(struct WBStartup);
- wbs->sm_NumArgs=msg->am_NumArgs+1;
- wbs->sm_ArgList=wbs+1; /* WBArg array starts after WBStartup */
-
- /* Initialize WBArg pointers */
- wbas=msg->am_ArgList;
- wbad=wbs->sm_ArgList;
-
- /* 1. argument is the tool itself! */
- if (!(wbad->wa_Lock=DupLock(tn->tn_DirLock))) goto e2;
- if (!(wbad->wa_Name=strdup(name))) goto e3;
- wbad++;
-
- /* Copy WB arguments */
- for (i=msg->am_NumArgs; i; i--,wbas++,wbad++)
- {
- if (!(wbad->wa_Lock=DupLock(wbas->wa_Lock)))
- {
- wbad--; /* Skip parameters, which don't support a lock */
- wbs->sm_NumArgs--;
- continue; /* Next parameter */
- }
-
- /* Sanity check for name string... Enforcer is watching you! */
- if (!wbas->wa_Name || !(wbad->wa_Name=strdup(wbas->wa_Name))) goto e3;
- }
-
- /* Create process */
- if (!(wbs->sm_Process=CreateProc(wbs->sm_ArgList->wa_Name,0,wbs->sm_Segment,
- ssize))) goto e3;
-
- /* if (!(proc=CreateNewProcTags(NP_Seglist,wbs->sm_Segment,
- NP_FreeSeglist,TRUE,
- Maybe someday I will know NP_StackSize,ssize,
- what Tags I need to make NP_Name,wbs->sm_ArgList->wa_Name,
- CreateNewProc() behave NP_CloseInput,FALSE,
- like CreateProc() NP_CloseOutput,FALSE,
- TAG_DONE))) goto e3; */
-
- /* Send WBStartup message to tool */
- /* wbs->sm_Process=&proc->pr_MsgPort; for CreateNewProc() */
- PutMsg(wbs->sm_Process,(struct Message *) wbs);
- CurrentDir(fl); /* Change to old directory */
- wbactive++; /* Tool started! */
- return(TRUE);
-
- /* An error occurred. Free all resources */
- e3: wbas=wbs->sm_ArgList;
- for (i=wbs->sm_NumArgs; i; i--,wbas++)
- {
- UnLock(wbas->wa_Lock);
- if (wbas->wa_Name) free(wbas->wa_Name);
- }
- e2: UnLoadSeg(wbs->sm_Segment);
- e1: CurrentDir(fl);
- free(wbs);
- return(FALSE);
- }
-
-