2
0
Эх сурвалжийг харах

Amiga, AROS, MorphOS: SimpleIPC, added ServerRunning, MsgType transfer

git-svn-id: trunk@30860 -
marcus 10 жил өмнө
parent
commit
bd0e78478c

+ 22 - 10
packages/fcl-process/src/amicommon/simpleipc.inc

@@ -70,7 +70,7 @@ Type
     Procedure Connect; override;
     Procedure Connect; override;
     Procedure Disconnect; override;
     Procedure Disconnect; override;
     Procedure SendMessage(MsgType : TMessageType; AStream : TStream); override;
     Procedure SendMessage(MsgType : TMessageType; AStream : TStream); override;
-    //Function  ServerRunning : Boolean; override;
+    Function  ServerRunning : Boolean; override;
   end;
   end;
 
 
   TAmigaServerComm = Class(TIPCServerComm)
   TAmigaServerComm = Class(TIPCServerComm)
@@ -90,19 +90,20 @@ Type
   
   
 // ####### CLIENT  
 // ####### CLIENT  
   
   
-function SafePutToPort(Msg: PMessage; Portname: string): Integer;
+function SafePutToPort(Msg: PMessage; Portname: string): Boolean;
  var
  var
    Port: PMsgPort;
    Port: PMsgPort;
    PName: PChar;
    PName: PChar;
  begin
  begin
-   Result := -1;
+   Result := False;
    PName := PChar(Portname + #0);
    PName := PChar(Portname + #0);
    Forbid();
    Forbid();
    Port := FindPort(PName);
    Port := FindPort(PName);
    if Assigned(Port) then
    if Assigned(Port) then
    begin
    begin
-     PutMsg(Port, Msg);
-     Result := 0;
+     if Assigned(Msg) then
+       PutMsg(Port, Msg);
+     Result := True;
    end;
    end;
    Permit();
    Permit();
  end;
  end;
@@ -133,7 +134,7 @@ var
   PortName: string;
   PortName: string;
 begin
 begin
   Size := AStream.Size - AStream.Position;
   Size := AStream.Size - AStream.Position;
-  FullSize := Size + Sizeof(Exec.TMessage);
+  FullSize := Size + SizeOf(TMessageType) + Sizeof(Exec.TMessage);
   PortName := PORTNAMESTART + Owner.ServerID;
   PortName := PORTNAMESTART + Owner.ServerID;
   Memory := System.AllocMem(FullSize);
   Memory := System.AllocMem(FullSize);
   MP := CreateMsgPort;
   MP := CreateMsgPort;
@@ -143,8 +144,10 @@ begin
     MsgHead^.mn_Length := Size;
     MsgHead^.mn_Length := Size;
     Temp := Memory;
     Temp := Memory;
     Inc(Temp, SizeOf(Exec.TMessage));
     Inc(Temp, SizeOf(Exec.TMessage));
+    Move(MsgType, Temp^, SizeOf(TMessageType));
+    Inc(Temp, SizeOf(TMessageType));
     AStream.Read(Temp^, Size);
     AStream.Read(Temp^, Size);
-    if SafePutToPort(MsgHead, PortName) = 0 then
+    if SafePutToPort(MsgHead, PortName) then
       WaitPort(MP);
       WaitPort(MP);
   finally
   finally
     System.FreeMem(Memory);
     System.FreeMem(Memory);
@@ -152,6 +155,11 @@ begin
   end;
   end;
 end;
 end;
 
 
+Function TAmigaClientComm.ServerRunning : Boolean;
+begin
+  Result := SafePutToPort(nil, PORTNAMESTART + Owner.ServerID); 
+end;
+
 // ###### SERVER
 // ###### SERVER
 
 
 Constructor TAmigaServerComm.Create(AOwner: TSimpleIPCServer);
 Constructor TAmigaServerComm.Create(AOwner: TSimpleIPCServer);
@@ -213,8 +221,8 @@ begin
       Inc(Temp, SizeOf(Exec.TMessage));
       Inc(Temp, SizeOf(Exec.TMessage));
       if Assigned(MsgBody) then
       if Assigned(MsgBody) then
         System.FreeMem(MsgBody);
         System.FreeMem(MsgBody);
-      MsgBody := System.AllocMem(SizeOf(Exec.TMessage) + Msg^.mn_Length);
-      Move(Msg^, MsgBody^, SizeOf(Exec.TMessage) + Msg^.mn_Length);
+      MsgBody := System.AllocMem(SizeOf(Exec.TMessage) + SizeOf(TMessageType) + Msg^.mn_Length);
+      Move(Msg^, MsgBody^, SizeOf(Exec.TMessage) + SizeOf(TMessageType) + Msg^.mn_Length);
       ReplyMsg(Msg);
       ReplyMsg(Msg);
       break;
       break;
     end;
     end;
@@ -225,12 +233,16 @@ end;
 Procedure TAmigaServerComm.ReadMessage;
 Procedure TAmigaServerComm.ReadMessage;
 var
 var
   Temp: PByte;
   Temp: PByte;
+  MsgType: TMessageType;
 begin
 begin
   if Assigned(MsgBody) then
   if Assigned(MsgBody) then
   begin
   begin
     Temp := Pointer(MsgBody);
     Temp := Pointer(MsgBody);
     Inc(Temp, SizeOf(Exec.TMessage));
     Inc(Temp, SizeOf(Exec.TMessage));
-    Owner.FMsgType := mtString;
+    MsgType := 0;
+    Move(Temp^, MsgType, SizeOf(TMessageType));
+    Inc(Temp, SizeOf(TMessageType));    
+    Owner.FMsgType := MsgType;
     Owner.FMsgData.Size := 0;
     Owner.FMsgData.Size := 0;
     Owner.FMsgData.Seek(0, soFrombeginning);
     Owner.FMsgData.Seek(0, soFrombeginning);
     Owner.FMsgData.WriteBuffer(temp^, MsgBody^.mn_Length);
     Owner.FMsgData.WriteBuffer(temp^, MsgBody^.mn_Length);