Initial import of Scalos. To decrease size I have
[AROS-Contrib.git] / scalos / Modules / Execute_Command.MUI / Execute_Command.c
blobf57b8ff2d9412fb492502079e9e70921acb475c1
1 // Execute_Command.c
2 // $Date$
3 // $Revision$
6 #include <exec/types.h>
7 #include <exec/alerts.h>
8 #include <exec/execbase.h>
9 #include <dos/dos.h>
10 #include <dos/dostags.h>
11 #include <intuition/intuition.h>
12 #include <intuition/gadgetclass.h>
13 #include <intuition/classusr.h>
14 #include <libraries/mui.h>
15 #include <mui/BetterString_mcc.h>
16 #include <libraries/asl.h>
17 #include <libraries/openurl.h> // +jmc+
18 #include <workbench/startup.h>
19 #include <scalos/scalos.h> // +jmc+
21 #include <clib/alib_protos.h>
22 #include <clib/scalos_protos.h> //+jmc+
24 #include <proto/exec.h>
25 #include <proto/dos.h>
26 #include <proto/icon.h>
27 #include <proto/intuition.h>
28 #include <proto/scalos.h> // +jmc+
29 #include <proto/graphics.h> // +jmc+
30 #include <proto/openurl.h> // +jmc+
32 #include <proto/locale.h>
33 #include <proto/utility.h>
34 #include <proto/muimaster.h>
35 #include <proto/asl.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
41 #include <defs.h>
42 #include <Year.h> // +jmc+
44 #include "Execute_Command.h"
46 #define Execute_Command_NUMBERS
47 #define Execute_Command_ARRAY
48 #define Execute_Command_CODE
49 #include STR(SCALOSLOCALE)
51 //----------------------------------------------------------------------------
53 #define VERSION_MAJOR 40
54 #define VERSION_MINOR 4
56 //----------------------------------------------------------------------------
58 #define Application_Return_Ok 1001
59 #define Application_Return_OpenAsl 1002
60 #define Application_Return_GetDefStack 1003
62 //----------------------------------------------------------------------------
64 #define KeyButtonHelp(name,key,HelpText)\
65 TextObject,\
66 ButtonFrame,\
67 MUIA_Font, MUIV_Font_Button,\
68 MUIA_Text_Contents, name,\
69 MUIA_Text_PreParse, "\33c",\
70 MUIA_Text_HiChar , key,\
71 MUIA_ControlChar , key,\
72 MUIA_InputMode , MUIV_InputMode_RelVerify,\
73 MUIA_Background , MUII_ButtonBack,\
74 MUIA_ShortHelp , HelpText,\
75 MUIA_CycleChain , TRUE,\
76 End
78 #define CheckMarkHelp(InputMode, Selected, Image,HelpTextID, NumID)\
79 ImageObject,\
80 ImageButtonFrame,\
81 MUIA_InputMode , InputMode,\
82 MUIA_Image_Spec , Image,\
83 MUIA_Image_FreeVert , TRUE,\
84 MUIA_Background , MUII_ButtonBack,\
85 MUIA_ShowSelState , Selected,\
86 MUIA_CycleChain , TRUE,\
87 MUIA_ShortHelp , GetLocString(HelpTextID), \
88 MUIA_ExportID , NumID, \
89 End
91 //----------------------------------------------------------------------------
93 static BOOL OpenLibraries(void);
94 static void CloseLibraries(void);
95 static void ReportError(LONG Result, CONST_STRPTR CmdString);
97 static LONG ExecuteCommand(struct WBArg *arg);
99 static void InitCurrent(struct WBArg *arg); //+jmc+
100 static void WBLRequestFile(struct WBArg *arg); //+jmc+
102 static SAVEDS(APTR) INTERRUPT OpenAboutMUIHookFunc(struct Hook *hook, Object *o, Msg msg);
103 static SAVEDS(void) INTERRUPT OpenAboutHookFunc(struct Hook *hook, Object *o, Msg msg);
104 static SAVEDS(void) INTERRUPT StringMUIHookFunc(struct Hook *hook, Object *o, Msg msg);
105 static SAVEDS(void) INTERRUPT IntegerMUIHookFunc(struct Hook *hook, Object *o, Msg msg);
107 static STRPTR GetLocString(ULONG MsgId);
108 static BOOL CheckMCCVersion(CONST_STRPTR name, ULONG minver, ULONG minrev);
109 static STRPTR BuildConsole(STRPTR wtitle, struct Screen *scr); //+jmc+
110 static void MakeAPPSleep(BOOL etat); //+jmc+
111 static BOOL TrackSpace(STRPTR Buffer); //+jmc+
112 static BOOL FindURL(STRPTR StringExec); //+jmc+
113 static void GetDefStack(void); //+jmc+
114 BPTR DupWBPathList(void); //+jmc+
115 static void SaveToEnv(void); //+jmc+
117 //----------------------------------------------------------------------------
119 #if !defined(__AROS__) && !defined(__amigaos4__)
120 #include <dos.h>
122 long _stack = 16384; // minimum stack size, used by SAS/C startup code
123 #endif
125 //----------------------------------------------------------------------------
127 extern struct ExecBase *SysBase;
128 struct IntuitionBase *IntuitionBase = NULL;
129 T_LOCALEBASE LocaleBase = NULL;
130 #ifndef __amigaos4__
131 T_UTILITYBASE UtilityBase = NULL;
132 #endif
133 struct Library *MUIMasterBase = NULL;
134 struct ScalosBase *ScalosBase = NULL; //+jmc+
136 #ifdef __amigaos4__
137 struct IntuitionIFace *IIntuition = NULL;
138 struct LocaleIFace *ILocale = NULL;
139 struct MUIMasterIFace *IMUIMaster = NULL;
140 struct ScalosIFace *IScalos = NULL;
141 #endif
143 static struct Catalog *gb_Catalog;
145 static struct Hook AboutHook = { { NULL, NULL }, HOOKFUNC_DEF(OpenAboutHookFunc), NULL };
146 static struct Hook AboutMUIHook = { { NULL, NULL }, HOOKFUNC_DEF(OpenAboutMUIHookFunc), NULL };
147 static struct Hook StringMUIHook = { { NULL, NULL }, HOOKFUNC_DEF(StringMUIHookFunc), NULL }; //+jmc+
148 static struct Hook IntegerMUIHook = { { NULL, NULL }, HOOKFUNC_DEF(IntegerMUIHookFunc), NULL }; //+jmc+
150 static struct Screen *scr; //+jmc+
152 //----------------------------------------------------------------------------
154 static Object *Group_Buttons2;
155 static Object *APP_Main;
156 static Object *WIN_Main;
157 static Object *WIN_AboutMUI;
158 static Object *OkButton, *CancelButton;
159 static Object *MenuAbout, *MenuAboutMUI, *MenuQuit;
160 static Object *TextEnterCommand;
161 static Object *PopAslCommand;
162 static Object *StringName; // +jmc+ String gadget replacing PopaslObject.
163 static Object *TextEnterName; // +jmc+ TextObject for Current dir.
164 static Object *CheckQuit; // +jmc+ CheckMark to quit or notafter execute command finished.
165 static Object *Group_Virtual; //+jmc+ To switch 0/1 "MUIA_ShowMe" the ScroolGroupObject group.
166 static Object *StringStack; //+jmc+ Stack integer
167 static Object *GetStack; //+jmc+ Get default stack button
168 static BOOL Run = TRUE;
169 static BOOL Success = FALSE;
170 static ULONG stackNum; //+jmc+
171 static ULONG oldstackNum=0; //+jmc+
172 static ULONG PrevInteger; //+jmc+
174 //----------------------------------------------------------------------------
176 int main(int argc, char *argv[])
178 LONG win_opened = 0;
179 struct WBStartup *WBenchMsg =
180 (argc == 0) ? (struct WBStartup *)argv : NULL;
182 #if 0
183 if (WBenchMsg)
185 LONG n;
187 // kprintf("NumArgs=%ld\n", WBenchMsg->sm_NumArgs);
189 for (n=0; n<WBenchMsg->sm_NumArgs; n++)
191 char xName[512];
193 NameFromLock(WBenchMsg->sm_ArgList[n].wa_Lock, xName, sizeof(xName));
195 // kprintf("%ld. Lock=<%s> Name=<%s>\n", n, xName, WBenchMsg->sm_ArgList[n].wa_Name);
198 #endif
200 if (NULL == WBenchMsg)
202 return 5;
205 if (WBenchMsg->sm_NumArgs < 2)
207 return 5;
210 do {
211 ULONG sigs = 0;
212 ULONG QuitSelected = 0;
213 ULONG StackSelected = 0;
215 struct WBArg *arg = &WBenchMsg->sm_ArgList[1];
217 d1(KPrintF(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__));
219 if (!OpenLibraries())
220 break;
222 d1(KPrintF(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__));
224 if (!CheckMCCVersion(MUIC_BetterString, 11, 0))
225 break;
227 d1(KPrintF(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__));
229 GetDefStack();
231 d1(KPrintF(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__));
233 gb_Catalog = OpenCatalogA(NULL, "Scalos/Execute_Command.catalog",NULL);
235 d1(KPrintF(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__));
237 APP_Main = ApplicationObject,
238 MUIA_Application_Title, GetLocString(MSGID_TITLENAME),
239 MUIA_Application_Version, "$VER: Scalos Execute_Command.module V40.5 (" __DATE__ ") " COMPILER_STRING,
240 MUIA_Application_Copyright, "© The Scalos Team, 2004" CURRENTYEAR,
241 MUIA_Application_Author, "The Scalos Team",
242 MUIA_Application_Description, "Scalos Execute_Command module",
243 MUIA_Application_Base, "SCALOS_EXECUTE_COMMAND",
245 SubWindow, WIN_Main = WindowObject,
246 MUIA_Window_Title, GetLocString(MSGID_TITLENAME),
247 // MUIA_Window_ID, MAKE_ID('M','A','I','N'),
248 MUIA_Window_AppWindow, TRUE,
249 MUIA_Window_UseBottomBorderScroller, TRUE, // +jmc+
251 MUIA_Window_TopEdge, MUIV_Window_TopEdge_Moused,
252 MUIA_Window_LeftEdge, MUIV_Window_LeftEdge_Moused,
254 MUIA_Window_Width, MUIV_Window_Width_Screen(30), //+jmc+
256 WindowContents, VGroup,
257 Child, GroupObject, // +jmc+
258 Child, Group_Virtual = ScrollgroupObject,
259 MUIA_Scrollgroup_VertBar, NULL,
260 MUIA_Scrollgroup_HorizBar, NULL,
261 MUIA_Scrollgroup_FreeHoriz, TRUE,
262 MUIA_Scrollgroup_FreeVert, FALSE,
263 MUIA_Scrollgroup_UseWinBorder, TRUE,
264 MUIA_Scrollgroup_Contents,
265 VirtgroupObject,
266 Child, TextEnterName = TextObject,
267 MUIA_Text_PreParse, MUIX_C,
268 MUIA_ShortHelp, GetLocString(MSGID_CURRENTDIR_SHORTHELP),
269 End, //TextObject
270 End, //VirtgroupObject
271 End, //ScrollgroupObject
272 End, //GroupObject
274 Child, VGroup,
275 Child, TextEnterCommand = TextObject,
276 MUIA_Text_PreParse, MUIX_C,
277 MUIA_Text_Contents, GetLocString(MSGID_TEXT_ENTER_COMMAND),
278 End, //TextObject
280 Child, VSpace(1),
282 Child, HGroup, MUIA_Group_Spacing, 0,
283 Child, Label1(GetLocString(MSGID_LABEL_COMMAND)),
284 Child, StringName = BetterStringObject,
285 StringFrame,
286 MUIA_String_Contents, "",
287 MUIA_CycleChain, TRUE,
288 MUIA_ExportID, 1,
289 End, //BetterStringObject
290 Child, PopAslCommand = CheckMarkHelp(MUIV_InputMode_RelVerify, TRUE,\
291 MUII_PopFile,\
292 MSGID_ASL_REQUESTER_SHORTHELP, NULL),
293 End, //HGroup
294 End, //VGroup
296 Child, HGroup,
297 Child, RectangleObject,
298 End,
299 Child, Label1(GetLocString(MSGID_LABEL_STACK)),
300 Child, HGroup, MUIA_Group_Spacing, 0,
301 Child, StringStack = BetterStringObject, StringFrame,
302 MUIA_String_Integer, stackNum,
303 MUIA_String_Accept , "0123456789",
304 MUIA_String_Format, MUIV_String_Format_Center,
305 MUIA_CycleChain, TRUE,
306 End, // BetterStringObject
307 Child, GetStack = CheckMarkHelp(MUIV_InputMode_Toggle, FALSE,\
308 MUII_CheckMark,\
309 MSGID_GET_DEFSTACK_SHORTHELP, NULL),
310 End, //HGroup
312 Child, HGroup,
313 Child, Label1(GetLocString(MSGID_LABEL_CHECKQUIT)),
314 Child, CheckQuit = CheckMarkHelp(MUIV_InputMode_Toggle, FALSE,\
315 MUII_CheckMark,\
316 MSGID_CHECKQUIT_SHORTHELP,2),
318 End, // HGroup
319 Child, RectangleObject,
320 End,
321 End, // HGroup
323 Child, Group_Buttons2 = HGroup,
324 MUIA_Group_SameWidth, TRUE,
325 Child, OkButton = KeyButtonHelp(GetLocString(MSGID_OKBUTTON),
326 *GetLocString(MSGID_OKBUTTON_SHORT), GetLocString(MSGID_SHORTHELP_OKBUTTON)),
327 Child, CancelButton = KeyButtonHelp(GetLocString(MSGID_CANCELBUTTON),
328 *GetLocString(MSGID_CANCELBUTTON_SHORT), GetLocString(MSGID_SHORTHELP_CANCELBUTTON)),
329 End, //HGroup
330 End, //VGroup
332 End, //WindowObject
334 MUIA_Application_Menustrip, MenustripObject,
335 Child, MenuObjectT(GetLocString(MSGID_MENU_PROJECT)),
337 Child, MenuAbout = MenuitemObject,
338 MUIA_Menuitem_Title, GetLocString(MSGID_MENU_PROJECT_ABOUT),
339 End,
340 Child, MenuAboutMUI = MenuitemObject,
341 MUIA_Menuitem_Title, GetLocString(MSGID_MENU_PROJECT_ABOUTMUI),
342 End,
343 Child, MenuitemObject,
344 MUIA_Menuitem_Title, -1,
345 End,
346 Child, MenuQuit = MenuitemObject,
347 MUIA_Menuitem_Title, GetLocString(MSGID_MENU_PROJECT_QUIT),
348 MUIA_Menuitem_Shortcut, GetLocString(MSGID_MENU_PROJECT_QUIT_SHORT),
349 End,
351 End, //MenuObjectT
352 End, //MenuStripObject
354 End; //ApplicationObject
356 d1(KPrintF(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__));
358 if (NULL == APP_Main)
360 printf(GetLocString(MSGID_CREATE_APPLICATION_FAILED));
361 break;
364 DoMethod(WIN_Main, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
365 WIN_Main, 3, MUIM_Set, MUIA_Window_Open, FALSE);
367 DoMethod(WIN_Main, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
368 APP_Main, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
371 DoMethod(CancelButton, MUIM_Notify, MUIA_Pressed, FALSE,
372 APP_Main, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
374 DoMethod(OkButton, MUIM_Notify, MUIA_Pressed, FALSE,
375 APP_Main, 2, MUIM_Application_ReturnID, Application_Return_Ok);
377 DoMethod(PopAslCommand, MUIM_Notify, MUIA_Pressed, FALSE,
378 APP_Main, 2, MUIM_Application_ReturnID, Application_Return_OpenAsl);
381 DoMethod(StringName, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
382 APP_Main, 2, MUIM_Application_ReturnID, Application_Return_Ok);
384 DoMethod(StringStack, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
385 APP_Main, 2, MUIM_Application_ReturnID, Application_Return_GetDefStack);
388 DoMethod(CheckQuit, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
389 WIN_Main, 3, MUIM_Set, MUIA_Window_ActiveObject, StringName);
391 DoMethod(GetStack, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
392 APP_Main, 3, MUIM_Application_ReturnID, Application_Return_GetDefStack);
395 DoMethod(StringName, MUIM_Notify, MUIA_String_Contents, MUIV_EveryTime,
396 StringName, 3, MUIM_CallHook, &StringMUIHook);
398 DoMethod(StringStack, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
399 StringStack, 2, MUIM_CallHook, &IntegerMUIHook);
401 DoMethod(MenuAbout, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
402 APP_Main, 2, MUIM_CallHook, &AboutHook);
404 DoMethod(MenuAboutMUI, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
405 APP_Main, 2, MUIM_CallHook, &AboutMUIHook);
407 DoMethod(MenuQuit, MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,
408 APP_Main, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
411 set(WIN_Main, MUIA_Window_ActiveObject, StringName);
413 set(GetStack, MUIA_Selected, TRUE);
415 // Loading of MUI objects ID settings.
416 DoMethod(APP_Main, MUIM_Application_Load,MUIV_Application_Load_ENV);
418 InitCurrent(arg);
420 set(WIN_Main, MUIA_Window_Open, TRUE);
421 get(WIN_Main, MUIA_Window_Open, &win_opened);
423 if (!win_opened)
425 printf(GetLocString(MSGID_CREATE_MAINWINDOW_FAILED));
426 break;
429 d1(KPrintF(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
431 while (Run)
433 ULONG Action = DoMethod(APP_Main, MUIM_Application_NewInput, &sigs);
435 switch (Action)
437 case Application_Return_Ok:
438 ExecuteCommand(&WBenchMsg->sm_ArgList[1]);
439 SaveToEnv();
440 get(CheckQuit, MUIA_Selected, &QuitSelected);
441 if (!QuitSelected)
442 Run = FALSE;
443 break;
444 case Application_Return_OpenAsl:
445 set(Group_Virtual, MUIA_ShowMe, 0);
446 WBLRequestFile(arg);
447 set(Group_Virtual, MUIA_ShowMe, 1);
448 if (Success)
450 SaveToEnv();
451 get(CheckQuit, MUIA_Selected, &QuitSelected);
452 // kprintf("QuitSelected= [%ld] Success=[%ld]\n", QuitSelected, Success);
453 if (!QuitSelected)
454 Run = FALSE;
456 break;
457 case Application_Return_GetDefStack:
458 GetDefStack();
459 // kprintf("Selected: oldstackNum =[ %ld ] stackNum=[ %ld ]\n", oldstackNum, stackNum);
460 get(GetStack, MUIA_Selected, &StackSelected);
461 if(oldstackNum>=stackNum)
463 if(StackSelected)
465 set(StringStack, MUIA_String_Integer, stackNum);
466 set(StringStack, MUIA_Disabled, TRUE);
468 else
470 set(StringStack, MUIA_Disabled, FALSE);
471 set(StringStack, MUIA_String_Integer, oldstackNum);
472 set(WIN_Main, MUIA_Window_ActiveObject, StringStack);
475 else
477 set(StringStack, MUIA_String_Integer, stackNum);
478 set(StringStack, MUIA_Disabled, TRUE);
479 oldstackNum=stackNum;
481 // kprintf("oldstackNum =[ %ld ] stackNum=[ %ld ]\n", oldstackNum, stackNum);
482 break;
483 case MUIV_Application_ReturnID_Quit:
484 Run = FALSE;
485 break;
488 if (Run && sigs)
490 sigs = Wait(sigs | SIGBREAKF_CTRL_C);
492 if (sigs & SIGBREAKF_CTRL_C)
494 Run = FALSE;
498 } while (0);
500 set(WIN_Main, MUIA_Window_Open, FALSE);
502 if (APP_Main)
503 MUI_DisposeObject(APP_Main);
504 if(gb_Catalog)
505 CloseCatalog(gb_Catalog);
507 CloseLibraries();
509 return 0;
512 //----------------------------------------------------------------------------
513 // +jmc+
514 // Export all IDs of MUI objects to ENV:MUI.
515 // Availlable for "Application_Return_Ok" and "Application_Return_OpenAsl",
517 static void SaveToEnv(void)
519 DoMethod(APP_Main, MUIM_Application_Save,MUIV_Application_Save_ENV);
522 //----------------------------------------------------------------------------
524 static BOOL OpenLibraries(void)
526 ScalosBase = (struct ScalosBase *) OpenLibrary("scalos.library", 40);
527 if (NULL == ScalosBase)
528 return FALSE;
529 #ifdef __amigaos4__
530 IScalos = (struct ScalosIFace *)GetInterface((struct Library *)ScalosBase, "main", 1, NULL);
531 if (NULL == IScalos)
532 return FALSE;
533 #endif
535 MUIMasterBase = OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN-1);
536 if (NULL == MUIMasterBase)
537 return FALSE;
538 #ifdef __amigaos4__
539 IMUIMaster = (struct MUIMasterIFace *)GetInterface((struct Library *)MUIMasterBase, "main", 1, NULL);
540 kprintf("MUIMasterBase = %lx, IMUIMaster = %lx\n", MUIMasterBase, IMUIMaster);
541 if (NULL == IMUIMaster)
542 return FALSE;
544 #endif
546 IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 39);
547 if (NULL == IntuitionBase)
548 return FALSE;
549 #ifdef __amigaos4__
550 IIntuition = (struct IntuitionIFace *)GetInterface((struct Library *)IntuitionBase, "main", 1, NULL);
551 if (NULL == IIntuition)
552 return FALSE;
553 #endif
555 LocaleBase = (T_LOCALEBASE) OpenLibrary("locale.library", 38);
556 if (NULL == LocaleBase)
557 return FALSE;
558 #ifdef __amigaos4__
559 ILocale = (struct LocaleIFace *)GetInterface((struct Library *)LocaleBase, "main", 1, NULL);
560 if (NULL == ILocale)
561 return FALSE;
562 #endif
564 #ifndef __amigaos4__
565 UtilityBase = (T_UTILITYBASE) OpenLibrary("utility.library", 39);
566 if (NULL == UtilityBase)
567 return FALSE;
568 #endif
570 return TRUE;
573 //----------------------------------------------------------------------------
575 static void CloseLibraries(void)
577 #ifndef __amigaos4__
578 if (UtilityBase)
580 CloseLibrary((struct Library *) UtilityBase);
581 UtilityBase = NULL;
583 #endif
584 #ifdef __amigaos4__
585 if (ILocale)
587 DropInterface((struct Interface *)ILocale);
588 ILocale = NULL;
590 #endif
591 if (LocaleBase)
593 CloseLibrary((struct Library *) LocaleBase);
594 LocaleBase = NULL;
596 #ifdef __amigaos4__
597 if (IIntuition)
599 DropInterface((struct Interface *)IIntuition);
600 IIntuition = NULL;
602 #endif
603 if (IntuitionBase)
605 CloseLibrary((struct Library *)IntuitionBase);
606 IntuitionBase = NULL;
608 #ifdef __amigaos4__
609 if (IMUIMaster)
611 DropInterface((struct Interface *)IMUIMaster);
612 IMUIMaster = NULL;
614 #endif
615 if (MUIMasterBase)
617 CloseLibrary(MUIMasterBase);
618 MUIMasterBase = NULL;
620 #ifdef __amigaos4__
621 if (IScalos)
623 DropInterface((struct Interface *)IScalos);
624 IScalos = NULL;
626 #endif
627 if (ScalosBase)
629 CloseLibrary(&ScalosBase->scb_LibNode);
630 ScalosBase = NULL;
634 //----------------------------------------------------------------------------
636 static void ReportError(LONG Result, CONST_STRPTR CmdString)
638 char FaultText[256];
640 Fault(Result, "", FaultText, sizeof(FaultText));
642 MUI_Request(APP_Main, WIN_Main, 0, NULL,
643 GetLocString(MSGID_REQ_OK),
644 GetLocString(MSGID_ERRORREQ_BODYTEXT),
645 CmdString, FaultText);
648 //----------------------------------------------------------------------------
649 // +jmc+
650 static void MakeAPPSleep(BOOL etat)
652 set(APP_Main, MUIA_Application_Sleep, etat);
656 //----------------------------------------------------------------------------
657 // +jmc+
658 static void GetDefStack(void)
660 SCA_ScalosControl(NULL,
661 SCALOSCTRLA_GetDefaultStackSize, (ULONG) &stackNum,
662 TAG_END);
665 //----------------------------------------------------------------------------
666 // +jmc+
667 static void InitCurrent(struct WBArg *arg)
669 char xName[512];
670 char LabelText[512];
671 char SpaceName[256];
672 STRPTR LastContent = NULL;
674 NameFromLock(arg->wa_Lock, xName, sizeof(xName));
675 sprintf(LabelText, GetLocString(MSGID_CURRENTDIR), xName);
677 set(TextEnterName, MUIA_Text_Contents, LabelText);
679 if (arg->wa_Name && strlen(arg->wa_Name) > 0)
681 BOOL Space;
683 if ( Space = TrackSpace(arg->wa_Name) )
684 sprintf(SpaceName, "\"%s\"", arg->wa_Name);
685 else
686 stccpy(SpaceName, arg->wa_Name, sizeof(SpaceName));
688 set(StringName, MUIA_String_Contents, SpaceName);
689 set(StringName, MUIA_String_BufferPos, 0);
691 else
693 get(StringName, MUIA_String_Contents, &LastContent);
694 // stccpy(SpaceName, LastContent, sizeof(SpaceName));
695 // if(strlen(SpaceName) == 0)
696 if(strlen(LastContent) == 0)
697 set(OkButton, MUIA_Disabled, TRUE);
702 //----------------------------------------------------------------------------
704 static LONG ExecuteCommand(struct WBArg *arg)
706 STRPTR CommandString = NULL;
707 STRPTR StackDisabled = NULL;
708 BPTR oldDir;
709 LONG Result = RETURN_OK;
710 STRPTR conDef = "CON:////Execute_Command/AUTO/CLOSE/WAIT";
711 BOOL GetUrl;
713 GetDefStack();
715 get(StringStack, MUIA_Disabled, &StackDisabled);
716 if (!StackDisabled)
717 set(StringStack, MUIA_String_Acknowledge, TRUE);
718 else
720 PrevInteger = oldstackNum;
721 oldstackNum = stackNum;
724 if(oldstackNum>stackNum)
725 stackNum = oldstackNum;
727 get(StringName, MUIA_String_Contents, &CommandString);
729 if ( GetUrl = FindURL(CommandString) )
731 struct Library *OpenURLBase;
732 #ifdef __amigaos4__
733 struct OpenURLIFace *IOpenURL;
734 #endif
736 OpenURLBase = OpenLibrary(OPENURLNAME, 3);
737 #ifdef __amigaos4__
738 IOpenURL = (struct OpenURLIFace *)GetInterface(OpenURLBase, "main", 1, NULL);
739 if (NULL == IOpenURL)
741 CloseLibrary(OpenURLBase);
742 OpenURLBase = NULL;
744 #endif
745 if (NULL != OpenURLBase)
747 URL_Open(CommandString,
748 URL_Launch, TRUE,
749 URL_Show, TRUE,
750 TAG_DONE);
752 #ifdef __amigaos4__
753 DropInterface((struct Interface *)IOpenURL);
754 #endif
755 CloseLibrary(OpenURLBase);
757 else
758 printf(GetLocString(MSGID_OPEN_LIBRARY_FAILED), OPENURLNAME);
760 else
762 oldDir = CurrentDir(arg->wa_Lock);
764 if(scr = LockPubScreen(NULL))
766 STRPTR conName;
767 BOOL ConBuilt = TRUE;
769 conName = BuildConsole(GetLocString(MSGID_CONSOLE_NAME),scr);
770 if(!conName)
772 ConBuilt = FALSE;
773 conName = conDef;
776 //SystemTagList()
777 Result = SystemTags(CommandString,
778 SYS_Asynch, TRUE,
779 SYS_Output, NULL,
780 SYS_Input, Open(conName,MODE_OLDFILE),
781 SYS_UserShell, TRUE,
782 NP_StackSize, stackNum,
783 NP_Path, DupWBPathList(),
784 TAG_DONE);
786 if (ConBuilt)
787 FreeVec(conName);
789 // kprintf("ConBuilt=[ %ld ] - stackNum=[ %ld ] oldstackNum=[ %ld ]\n", ConBuilt, stackNum, oldstackNum);
791 if (RETURN_OK != Result)
792 ReportError(Result, CommandString);
794 CurrentDir(oldDir);
796 UnlockPubScreen(NULL,scr);
798 oldstackNum = PrevInteger;
801 return Result;
804 //----------------------------------------------------------------------------
805 // +jmc+
806 static BOOL FindURL(STRPTR StringExec)
808 BOOL URLFound = FALSE;
810 if ( (strnicmp("HTTP://",StringExec,7) == 0) || (strnicmp("FILE://",StringExec,7) == 0)
811 || (strnicmp("FTP://",StringExec,6) == 0) || (strnicmp("MAILTO:",StringExec,7) == 0) )
812 URLFound = TRUE;
814 return URLFound;
817 //----------------------------------------------------------------------------
818 // +jmc+
819 static STRPTR BuildConsole(STRPTR wtitle, struct Screen *scr)
821 const STATIC STRPTR fmt = "CON:%ld/%ld/%ld/%ld/%s/AUTO/CLOSE/WAIT";
823 STRPTR buf = (STRPTR)AllocVec( strlen(fmt)+strlen(wtitle)+40,0 );
824 if(buf)
826 LONG height=280;
827 LONG width =120;
828 LONG top=8;
829 LONG left=8*2;
831 if(scr)
833 struct Rectangle rect;
834 if(QueryOverscan(GetVPModeID( &scr->ViewPort), &rect, OSCAN_TEXT))
836 height = rect.MaxY - rect.MinY + 1;
837 width = rect.MaxX - rect.MinX + 1;
839 else
841 height = scr->Height;
842 width = scr->Width;
844 height = height*25/100;
846 width = (width*75/100)-((scr->BarHeight*2)*75/100);
848 left = (scr->Width/2)-(width/2)-scr->BarHeight;
850 top = -scr->TopEdge;
852 if( top <= scr->BarHeight )
853 top = scr->BarHeight + 1;
856 sprintf(buf, fmt, left, top, width, height, wtitle);
857 // kprintf("buf=<%s>\nLeft=<%ld>\nTop=<%ld>\nWidth=<%ld>\nHeight=<%ld>\nWtitle=<%s>\n\n", buf, left, top, width, height, wtitle);
859 return buf;
862 //----------------------------------------------------------------------------
864 static STRPTR GetLocString(ULONG MsgId)
866 struct Execute_Command_LocaleInfo li;
868 li.li_Catalog = gb_Catalog;
869 #ifndef __amigaos4__
870 li.li_LocaleBase = LocaleBase;
871 #else
872 li.li_ILocale = ILocale;
873 #endif
875 return (STRPTR)GetExecute_CommandString(&li, MsgId);
879 static void TranslateStringArray(STRPTR *stringArray)
881 while (*stringArray)
883 *stringArray = GetLocString((ULONG) *stringArray);
884 stringArray++;
888 //----------------------------------------------------------------------------
889 // +jmc+
890 static void WBLRequestFile(struct WBArg *arg)
892 char Path[1024];
893 char SpacePath[1024];
894 struct FileRequester *fileReq = NULL;
896 do {
897 STRPTR FileName;
898 Success = FALSE;
900 if (!NameFromLock(arg->wa_Lock, Path, sizeof(Path)))
901 break;
903 if (arg->wa_Name && strlen(arg->wa_Name) > 0)
904 FileName = arg->wa_Name;
905 else
906 FileName = "";
908 // AllocAslRequest()
909 fileReq = AllocAslRequestTags(ASL_FileRequest,
910 ASLFR_TitleText, (ULONG) GetLocString(MSGID_COMMAND_ASLTITLE),
911 ASLFR_DoSaveMode, FALSE,
912 ASLFR_RejectIcons, FALSE,
913 TAG_END);
915 if (NULL == fileReq)
916 break;
918 MakeAPPSleep(TRUE); // APP_Main Sleep
920 // AslRequest()
921 if (AslRequestTags(fileReq,
922 ASLFR_InitialFile, (ULONG) FileName,
923 ASLFR_InitialDrawer, (ULONG) Path,
924 TAG_END))
925 Success = TRUE;
926 else
927 Success = FALSE;
929 MakeAPPSleep(FALSE); // APP_Main Sleep
931 if (Success)
933 BPTR dirLock;
934 char xName[512];
935 char LabelText[512];
936 BOOL Space;
938 dirLock = Lock(fileReq->fr_Drawer, ACCESS_READ);
939 if ((BPTR)NULL == dirLock)
941 break;
944 NameFromLock(dirLock, Path, sizeof(Path));
945 sprintf(LabelText, GetLocString(MSGID_CURRENTDIR), Path);
946 stccpy(xName, fileReq->fr_File, sizeof(xName));
948 if (strlen(xName) > 0)
950 AddPart(Path, xName, sizeof(xName));
953 set(TextEnterName, MUIA_Text_Contents, LabelText);
955 if ( Space = TrackSpace(Path) )
957 sprintf(SpacePath, "\"%s\"", Path);
958 set(StringName, MUIA_String_Contents, SpacePath);
959 // kprintf("Space [%ld] - SpacePath=<%s>\n", Space, SpacePath);
961 else
963 set(StringName, MUIA_String_Contents, Path);
966 UnLock(arg->wa_Lock);
967 arg->wa_Lock = dirLock;
968 arg->wa_Name = NULL;
970 ExecuteCommand(arg);
972 } while (0);
974 if (fileReq)
975 FreeAslRequest(fileReq);
979 //----------------------------------------------------------------------
980 // +jmc+
981 static BOOL TrackSpace(STRPTR Buffer)
983 BOOL FindSpace = FALSE;
984 LONG i=0;
986 while (Buffer[i])
988 if (Buffer[i] == ' ')
990 FindSpace = TRUE;
991 break;
993 i++;
995 // kprintf("Lenght = [%ld] - Find Space = [%ld]\n", i, FindSpace);
996 return FindSpace;
999 //-------- DupWBPathList() - From in CliStart.c --------------------------
1000 // +jmc+
1001 BPTR DupWBPathList(void)
1003 struct Process *wbProc;
1004 struct CommandLineInterface *cli;
1005 struct AssignList *aList, *StartList = NULL, **nList = NULL;
1007 Forbid();
1008 wbProc = (struct Process *) FindTask("Workbench");
1009 Permit();
1011 if (NULL == wbProc)
1012 return (BPTR)NULL;
1013 if (NT_PROCESS != wbProc->pr_Task.tc_Node.ln_Type)
1014 return (BPTR)NULL;
1016 cli = BADDR(wbProc->pr_CLI);
1017 if (NULL == cli)
1018 return (BPTR)NULL;
1020 aList = BADDR(cli->cli_CommandDir);
1021 if (NULL == aList)
1022 return (BPTR)NULL;
1024 while (aList)
1026 struct AssignList *nNode = AllocVec(sizeof(struct AssignList), MEMF_PUBLIC);
1028 if (NULL == nNode)
1029 break;
1030 if (NULL == nList)
1031 StartList = nNode;
1032 else
1033 *nList = (struct AssignList *) MKBADDR(nNode);
1035 nNode->al_Next = NULL;
1036 nNode->al_Lock = DupLock(aList->al_Lock);
1037 nList = &nNode->al_Next;
1039 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: aList=%08lx Next=%08lx Lock=%08lx\n", __LINE__, \
1040 aList, aList->al_Next, aList->al_Lock));
1042 aList = BADDR(aList->al_Next);
1045 return MKBADDR(StartList);
1048 //----------------------------------------------------------------------------
1050 static SAVEDS(APTR) INTERRUPT OpenAboutMUIHookFunc(struct Hook *hook, Object *o, Msg msg)
1052 if (NULL == WIN_AboutMUI)
1054 WIN_AboutMUI = MUI_NewObject(MUIC_Aboutmui,
1055 MUIA_Window_RefWindow, WIN_Main,
1056 MUIA_Aboutmui_Application, APP_Main,
1057 End;
1060 if (WIN_AboutMUI)
1061 set(WIN_AboutMUI, MUIA_Window_Open, TRUE);
1063 return 0;
1066 //----------------------------------------------------------------------------
1068 static SAVEDS(void) INTERRUPT OpenAboutHookFunc(struct Hook *hook, Object *o, Msg msg)
1070 MUI_Request(APP_Main, WIN_Main, 0, NULL,
1071 GetLocString(MSGID_ABOUTREQOK),
1072 GetLocString(MSGID_ABOUTREQFORMAT),
1073 VERSION_MAJOR, VERSION_MINOR, COMPILER_STRING, CURRENTYEAR);
1076 //----------------------------------------------------------------------------
1077 // +jmc+
1078 static SAVEDS(void) INTERRUPT StringMUIHookFunc(struct Hook *hook, Object *o, Msg msg)
1080 STRPTR defstring = NULL;
1082 get(StringName, MUIA_String_Contents, &defstring);
1083 if(defstring && strlen(defstring) > 0)
1084 set(OkButton, MUIA_Disabled, FALSE);
1085 else
1086 set(OkButton, MUIA_Disabled, TRUE);
1089 //----------------------------------------------------------------------------
1090 // +jmc+
1091 static SAVEDS(void) INTERRUPT IntegerMUIHookFunc(struct Hook *hook, Object *o, Msg msg)
1093 get(StringStack, MUIA_String_Integer, &PrevInteger);
1094 if(PrevInteger<stackNum)
1095 set(GetStack, MUIA_Selected, TRUE);
1096 else
1097 oldstackNum = PrevInteger;
1099 // kprintf("Acknowledge: oldstackNum =[ %ld ] stackNum=[ %ld ] PrevInteger= [ %ld ]\n", oldstackNum, stackNum, PrevInteger);
1102 //-----------------------------------------------------------------------------
1104 // Checks if a certain version of a MCC is available
1105 static BOOL CheckMCCVersion(CONST_STRPTR name, ULONG minver, ULONG minrev)
1107 BOOL flush = TRUE;
1109 d1(kprintf(__FILE__ "/%s/%ld: %s\n", __FUNC__, __LINE__, name);)
1111 while (1)
1113 ULONG ver = 0;
1114 ULONG rev = 0;
1115 struct Library *base;
1116 char libname[256];
1117 Object *obj;
1119 d1(kprintf(__FILE__ "/%s/%ld: MUIMasterBase=%lx IMUIMaster=%lx\n",
1120 __FUNC__, __LINE__, MUIMasterBase, IMUIMaster));
1121 // First we attempt to acquire the version and revision through MUI
1122 obj = MUI_NewObjectA((STRPTR) name, NULL);
1123 d1(kprintf(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__);)
1124 if (obj)
1126 get(obj, MUIA_Version, &ver);
1127 get(obj, MUIA_Revision, &rev);
1129 d1(kprintf(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__);)
1131 MUI_DisposeObject(obj);
1133 if(ver > minver || (ver == minver && rev >= minrev))
1135 d1(kprintf(__FILE__ "/%s/%ld: v%ld.%ld found through MUIA_Version/Revision\n", __FUNC__, __LINE__, ver, rev);)
1136 return TRUE;
1140 // If we did't get the version we wanted, let's try to open the
1141 // libraries ourselves and see what happens...
1142 stccpy(libname, "PROGDIR:mui", sizeof(libname));
1143 AddPart(libname, name, sizeof(libname));
1145 d1(kprintf(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__);)
1147 if ((base = OpenLibrary(&libname[8], 0)) || (base = OpenLibrary(&libname[0], 0)))
1149 UWORD OpenCnt = base->lib_OpenCnt;
1151 d1(kprintf(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__);)
1153 ver = base->lib_Version;
1154 rev = base->lib_Revision;
1156 CloseLibrary(base);
1158 // we add some additional check here so that eventual broken .mcc also have
1159 // a chance to pass this test (i.e. Toolbar.mcc is broken)
1160 if (ver > minver || (ver == minver && rev >= minrev))
1162 d1(kprintf(__FILE__ "/%s/%ld: v%ld.%ld found through OpenLibrary()\n", __FUNC__, __LINE__, ver, rev);)
1163 return TRUE;
1166 if (OpenCnt > 1)
1168 if (MUI_Request(NULL, NULL, 0L, GetLocString(MSGID_STARTUP_FAILURE),
1169 GetLocString(MSGID_STARTUP_RETRY_QUIT_GAD), GetLocString(MSGID_STARTUP_MCC_IN_USE),
1170 name, minver, minrev, ver, rev))
1172 flush = TRUE;
1174 else
1175 break;
1178 // Attempt to flush the library if open count is 0 or because the
1179 // user wants to retry (meaning there's a chance that it's 0 now)
1181 if (flush)
1183 struct Library *result;
1185 Forbid();
1186 if ((result = (struct Library *) FindName(&((struct ExecBase *)SysBase)->LibList, name)))
1187 RemLibrary(result);
1188 Permit();
1189 flush = FALSE;
1191 else
1193 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: couldn`t find minimum required version.\n", __LINE__);)
1195 // We're out of luck - open count is 0, we've tried to flush
1196 // and still haven't got the version we want
1197 if (MUI_Request(NULL, NULL, 0L, GetLocString(MSGID_STARTUP_FAILURE),
1198 GetLocString(MSGID_STARTUP_RETRY_QUIT_GAD), GetLocString(MSGID_STARTUP_OLD_MCC),
1199 name, minver, minrev, ver, rev))
1201 flush = TRUE;
1203 else
1204 break;
1207 else
1209 d1(kprintf(__FILE__ "/%s/%ld: \n", __FUNC__, __LINE__);)
1211 // No MCC at all - no need to attempt flush
1212 flush = FALSE;
1213 if (!MUI_Request(NULL, NULL, 0L, GetLocString(MSGID_STARTUP_FAILURE),
1214 GetLocString(MSGID_STARTUP_RETRY_QUIT_GAD), GetLocString(MSGID_STARTUP_MCC_NOT_FOUND),
1215 name, minver, minrev))
1217 break;
1222 return FALSE;
1225 //----------------------------------------------------------------------------