Переглянути джерело

+ fixed handling of Ambient mode, because that was totally broken: closes CON:, replies WBMsg now
+ added support for paramstr(0) when started from Ambient

git-svn-id: trunk@4044 -

Károly Balogh 19 роки тому
батько
коміт
65077065bc
1 змінених файлів з 83 додано та 7 видалено
  1. 83 7
      rtl/morphos/system.pp

+ 83 - 7
rtl/morphos/system.pp

@@ -43,7 +43,7 @@ const
   StdErrorHandle  : LongInt = 0;
 
   FileNameCaseSensitive : Boolean = False;
-  CtrlZMarksEOF: boolean = false; (* #26 not considered as end of file *)
+  CtrlZMarksEOF: boolean = false; { #26 not considered as end of file }
 
   sLineBreak : string[1] = LineEnding;
   DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsLF;
@@ -104,9 +104,19 @@ begin
     CurrentDir(MOS_origDir);
   end;
 
+  { Closing CON: when in Ambient mode }
+  if MOS_ConHandle<>0 then dosClose(MOS_ConHandle);
+
   if MOS_UtilityBase<>nil then CloseLibrary(MOS_UtilityBase);
   if MOS_DOSBase<>nil then CloseLibrary(MOS_DOSBase);
   if MOS_heapPool<>nil then DeletePool(MOS_heapPool);
+
+  { If in Ambient mode, replying WBMsg }
+  if MOS_ambMsg<>nil then begin
+    Forbid;
+    ReplyMsg(MOS_ambMsg);
+  end;
+
   haltproc(ExitCode);
 end;
 
@@ -148,11 +158,10 @@ begin
   argv[0][length(temp)]:=#0;
 
   { check if we're started from Ambient }
-  if MOS_ambMsg<>nil then
-    begin
-      argc:=0;
-      exit;
-    end;
+  if MOS_ambMsg<>nil then begin
+    argc:=0;
+    exit;
+  end;
 
   { Handle the other args }
   count:=0;
@@ -218,6 +227,66 @@ begin
   end;
 end;
 
+function GetArgv0Ambient: String;
+{ Returns program full path+name, when in Ambient mode }
+{ Required for paramstr(0) support in Ambient mode }
+type
+  pWBArg = ^tWBArg;
+  tWBArg = record
+    wa_Lock: longint;
+    wa_Name: PChar;
+  end;
+
+  pWBStartup = ^tWBStartup;
+  tWBStartup = packed record
+    sm_Message   : tMessage;
+    sm_Process   : pMsgPort;
+    sm_Segment   : longint;
+    sm_NumArgs   : longint;
+    sm_ToolWindow: PChar;
+    sm_ArgList   : pWBArg;
+  end;
+
+var
+  tmpbuf  : String;
+  counter : longint;
+  progname: PChar;
+  dlock   : longint;
+
+begin
+  GetArgv0Ambient:='';
+
+  if MOS_ambMsg<>nil then begin
+    dlock:=pWBStartup(MOS_ambMsg)^.sm_argList^.wa_Lock;
+    if dlock<>0 then begin
+      FillDWord(tmpbuf,256 div 4,0);
+      if NameFromLock(dlock,@tmpbuf[1],255) then begin
+        counter:=1;
+        while tmpbuf[counter]<>#0 do counter+=1;
+        tmpbuf[0]:=Char(counter-1);
+        GetArgv0Ambient:=tmpbuf;
+        { Append slash,if we're not in root directory of a volume }            
+        if tmpbuf[counter-1]<>':' then GetArgv0Ambient+='/';
+      end;
+    end;
+
+    { Fetch the progname, and copy it to the buffer }
+    progname:=pWBStartup(MOS_ambMsg)^.sm_argList^.wa_Name;
+    if progname<>nil then begin
+      FillDWord(tmpbuf,256 div 4,0);
+      counter:=0;
+      while (progname[counter]<>#0) do begin 
+        tmpbuf[counter+1]:=progname[counter]; 
+        counter+=1; 
+      end;
+      tmpbuf[0]:=Char(counter);
+      GetArgv0Ambient+=tmpbuf;
+    end;
+  end;
+end;
+
+
+
 
 {*****************************************************************************
                              ParamStr/Randomize
@@ -238,7 +307,13 @@ var
   s1: String;
 begin
   paramstr:='';
-  if MOS_ambMsg<>nil then exit;
+  if MOS_ambMsg<>nil then begin
+    if l=0 then begin 
+      paramstr:=GetArgv0Ambient; 
+      exit; 
+    end else 
+      exit; 
+  end;
 
   if l=0 then begin
     s1:=GetProgDir;
@@ -279,6 +354,7 @@ begin
  if MOS_heapPool=nil then Halt(1);
 
  if MOS_ambMsg=nil then begin
+   MOS_ConHandle:=0;
    StdInputHandle:=dosInput;
    StdOutputHandle:=dosOutput;
  end else begin