ecere: Initial Emscripten support
[sdk] / ecere / src / net / dcom.ec
index f2681ba..a2b4366 100644 (file)
@@ -1,3 +1,5 @@
+#define _Noreturn
+
 namespace net;
 
 #if defined(__WIN32__)
@@ -6,7 +8,6 @@ namespace net;
 #define String _String
 #include <winsock.h>
 #undef String
-static WSADATA wsaData;
 
 #elif defined(__unix__) || defined(__APPLE__)
 
@@ -39,6 +40,8 @@ typedef struct in_addr IN_ADDR;
 import "network"
 import "List"
 
+#if !defined(__EMSCRIPTEN__)
+
 // SERVER
 
 static enum DCOMPacketType
@@ -113,7 +116,7 @@ public:
    SerialBuffer buffer { };
 }
 
-class CallAck : strict
+class CallAck : struct
 {
 public:
    int objectID;
@@ -154,11 +157,11 @@ public:
          int callID = nextCallID++;
          DCOMServerSocket socket = serverSocket;
          DCOMServerSocket processingSocket;
-         unsigned int size = (uint)&((CallVirtualMethodPacket)0).args + argsBuffer.size; // sizeof(class CallVirtualMethodPacket) + virtualsBuffer.size - 1;
+         unsigned int size = (uint)(uintptr)&((CallVirtualMethodPacket)0).args + argsBuffer.size; // sizeof(class CallVirtualMethodPacket) + virtualsBuffer.size - 1;
          CallVirtualMethodPacket packet = (CallVirtualMethodPacket)new0 byte[size];
          VirtualCallAck ack = null;
 
-         if(currentThreadID == serverSocket.thread.id)
+         if(currentThreadID == (int64)serverSocket.thread.id)
             processingSocket = serverSocket;
          else
          {
@@ -168,11 +171,11 @@ public:
                Socket next;
                for(processingSocket = serverSocket.service.sockets.first;
                    processingSocket;
-                   processingSocket = (DCOMServerSocket)processingSocket.next)
+                   processingSocket = (DCOMServerSocket)next)
                {
                   next = processingSocket.next;
-                  if(processingSocket.connected && 
-                     processingSocket.thread.id == currentThreadID)
+                  if(processingSocket.connected &&
+                     (int64)processingSocket.thread.id == currentThreadID)
                      break;
                }
             }
@@ -200,7 +203,7 @@ public:
          {
             if(!serverSocket || !serverSocket.connected || !serverSocket.thread)
                break;
-            if(ack = VirtualCallAcknowledged(methodID, id, callID))
+            if((ack = VirtualCallAcknowledged(methodID, id, callID)))
                break;
 
             guiApp.Unlock();
@@ -273,7 +276,7 @@ static uint32 htoled(uint32 value)
 
 static uint32 letohd(uint32 value)
 {
-   return GETLEDWORD((byte *)&value);   
+   return GETLEDWORD((byte *)&value);
 }
 
 class DCOMServerThread : Thread
@@ -361,7 +364,7 @@ class DCOMClientThread : Thread
 
             if(!hasReturnValue)
             {
-               size = (uint)&((MethodReturnedPacket)0).args;
+               size = (uint)(uintptr)&((MethodReturnedPacket)0).args;
                packet = (MethodReturnedPacket)new0 byte[size];
                packet.type = (DCOMPacketType)htoled((DCOMPacketType)dcom_MethodReturned);
                packet.size = size;
@@ -378,7 +381,7 @@ class DCOMClientThread : Thread
 
             if(hasReturnValue)
             {
-               size = (uint)&((MethodReturnedPacket)0).args + buffer.size; // sizeof(class MethodReturnedPacket) + buffer.size - 1;
+               size = (uint)(uintptr)&((MethodReturnedPacket)0).args + buffer.size; // sizeof(class MethodReturnedPacket) + buffer.size - 1;
                packet = (MethodReturnedPacket)new0 byte[size];
                packet.type = (DCOMPacketType)htoled((DCOMPacketType)dcom_MethodReturned);
                packet.size = size;
@@ -413,16 +416,16 @@ class DCOMClientThread : Thread
             Class runClass = eSystem_FindClass(__thisModule.application, createInstance.className + 4);
             DCOMServerObject object;
             int vid;
-            
+
             if(!_class)
                _class = eSystem_FindClass(runClass.module, createInstance.className);
-            
+
             objects = renew objects DCOMServerObject[numObjects+1];
             object = objects[numObjects] = eInstance_New(_class);
             incref object;
             object.serverSocket = this;
             object.id = numObjects++;
-            object.instance = eInstance_New(runClass);   
+            object.instance = eInstance_New(runClass);
             incref object.instance;
             object.instance._vTbl = new void *[object.instance._class.vTblSize + 1];
             object.instance._vTbl++;
@@ -482,11 +485,10 @@ class DCOMClientThread : Thread
 
    void OnDisconnect(int code)
    {
-      int c;
       guiApp.Lock();
       thread.connected = false;
       guiApp.Unlock();
-      if(thread.started && GetCurrentThreadID() != thread.id)
+      if(thread.started && GetCurrentThreadID() != (int64)thread.id)
          thread.Wait();
    }
 
@@ -536,7 +538,7 @@ public class DCOMService : Service
    };
    ~DCOMService()
    {
-      if(thread.started && GetCurrentThreadID() != thread.id)
+      if(thread.started && GetCurrentThreadID() != (int64)thread.id)
          thread.Wait();
    }
 
@@ -553,12 +555,12 @@ public class DCOMService : Service
 
    public bool Stop()
    {
-      bool result;
-      DCOMServerSocket socket;
+      bool result = true;
       thread.connected = false;
       result = Service::Stop();
-      if(thread.started && GetCurrentThreadID() != thread.id)
+      if(thread.started && GetCurrentThreadID() != (int64)thread.id)
          thread.Wait();
+      return result;
    }
 
    void OnAccept()
@@ -605,7 +607,7 @@ public:
       socket = this, connected = true;
    };
 
-   bool Connect(char * server, int port)
+   bool Connect(const char * server, int port)
    {
       bool result = false;
       if(Socket::Connect(server, port))
@@ -616,7 +618,7 @@ public:
          packet.type = (DCOMPacketType)htoled((DCOMPacketType)dcom_CreateInstance);
          packet.size = size;
          CopyBytes(packet.className, "DCOM", 4);
-         CopyBytes(packet.className + 4, _class.name + strlen("DCOMClient_"), len-4+1);     
+         CopyBytes(packet.className + 4, _class.name + strlen("DCOMClient_"), len-4+1);
          answered = false;
          SendPacket(packet);
          delete packet;
@@ -630,7 +632,7 @@ public:
             //guiApp.ProcessNetworkEvents();
             // Process();
 
-            if(GetCurrentThreadID() == thread.id)
+            if(GetCurrentThreadID() == (int64)thread.id)
                Process();
             else
                thread.semaphore.Wait();
@@ -674,8 +676,8 @@ public:
             case dcom_CallVirtualMethod:
             {
                CallVirtualMethodPacket callMethod = (CallVirtualMethodPacket)p;
-               VirtualMethodReturnedPacket packet;
-               unsigned int size = (uint)&((VirtualMethodReturnedPacket)0).args; // sizeof(class VirtualMethodReturnedPacket);
+               VirtualMethodReturnedPacket packet = null;
+               unsigned int size = (uint)(uintptr)&((VirtualMethodReturnedPacket)0).args; // sizeof(class VirtualMethodReturnedPacket);
                SerialBuffer buffer { };
                bool hasReturnValue = callMethod.hasReturnValue;
                int methodID = callMethod.methodID;
@@ -734,17 +736,17 @@ public:
    {
       if(thread)
          thread.connected = false;
-      answered = 2;
+      answered = true; //2;
    }
 
    dllexport bool CallMethod(unsigned int methodID)
    {
+      bool result = false;
       if(this && connected)
       {
-         bool result;
          CallAck ack = null;
          int callID = nextCallID++;
-         unsigned int size = (uint)&((CallMethodPacket)0).args + __ecereBuffer.size; // sizeof(class CallMethodPacket) + __ecereBuffer.size - 1;
+         unsigned int size = (uint)(uintptr)&((CallMethodPacket)0).args + __ecereBuffer.size; // sizeof(class CallMethodPacket) + __ecereBuffer.size - 1;
          CallMethodPacket packet = (CallMethodPacket)new0 byte[size];
          packet.type = (DCOMPacketType)htoled((DCOMPacketType)dcom_CallMethod);
          packet.size = size;
@@ -760,14 +762,14 @@ public:
          {
             if(!thread || !connected)
                break;
-            if(ack = CallAcknowledged(methodID, objectID, callID))
+            if((ack = CallAcknowledged(methodID, objectID, callID)))
                break;
             guiApp.Unlock();
 
             //guiApp.WaitNetworkEvent();
             //guiApp.ProcessNetworkEvents();
             //Process();
-            if(GetCurrentThreadID() == thread.id)
+            if(GetCurrentThreadID() == (int64)thread.id)
                ProcessTimeOut(0.01);
             else
                ecere::sys::Sleep(0.01);//thread.semaphore.Wait();
@@ -781,16 +783,15 @@ public:
             delete ack;
             result = true;
          }
-         return result;
       }
-      return false;
+      return result;
    }
 
    ~DCOMClientObject()
    {
       if(thread.started)
       {
-         if(GetCurrentThreadID() != thread.id)
+         if(GetCurrentThreadID() != (int64)thread.id)
             thread.Wait();
       }
       acks.Free();
@@ -815,3 +816,5 @@ public:
       sendingOut = false;
    }
 }
+
+#endif // !defined(__EMSCRIPTEN__)