[Tizen.Applications.Cion] Fix Cion (#3682)
authorjeremy-jang <35089715+jeremy-jang@users.noreply.github.com>
Fri, 22 Oct 2021 06:58:51 +0000 (15:58 +0900)
committerGitHub <noreply@github.com>
Fri, 22 Oct 2021 06:58:51 +0000 (15:58 +0900)
- Fix handling returned data of ServerBase
- Fix parameter of CionClientSendPayloadAsync

Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/Tizen.Applications.Cion/Interop/Interop.Cion.cs
src/Tizen.Applications.Cion/Interop/Interop.CionServer.cs
src/Tizen.Applications.Cion/Interop/Interop.Libraries.cs
src/Tizen.Applications.Cion/Tizen.Applications.Cion/ClientBase.cs
src/Tizen.Applications.Cion/Tizen.Applications.Cion/ServerBase.cs

index 7676730..75d81ba 100644 (file)
@@ -14,6 +14,9 @@
  * limitations under the License.
  */
 
+using System;
+using System.Runtime.InteropServices;
+
 internal static partial class Interop
 {
     internal static partial class Cion
@@ -31,5 +34,8 @@ internal static partial class Interop
             TimedOut = Tizen.Internals.Errors.ErrorCode.TimedOut,
             OperationFailed = -0x030C0000 | 0x01,
         }
+
+        [DllImport(Libraries.Libc, EntryPoint = "malloc")]
+        internal static extern IntPtr Malloc(int size);
     }
 }
index 1b48247..c08d7d3 100644 (file)
@@ -34,7 +34,7 @@ internal static partial class Interop
         internal delegate void CionServerConnectionResultCb(string serviceName, IntPtr peerInfo, IntPtr result, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void CionServerDataReceivedCb(string serviceName, IntPtr peerInfo, byte[] data, int dataSize, out byte[] returnData, out int returnDataSize, IntPtr userData);
+        internal delegate void CionServerDataReceivedCb(string serviceName, IntPtr peerInfo, byte[] data, int dataSize, out IntPtr returnData, out int returnDataSize, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         internal delegate void CionServerPayloadReceivedCb(string serviceName, IntPtr peerInfo, IntPtr payload, int status, IntPtr userData);
index 32af828..0f6ed84 100644 (file)
@@ -19,5 +19,6 @@ internal static partial class Interop
     internal static partial class Libraries
     {
         public const string Cion = "libcion.so.1";
+        public const string Libc = "libc.so.6";
     }
 }
index 1b69727..aac5531 100644 (file)
@@ -36,7 +36,6 @@ namespace Tizen.Applications.Cion
         private Interop.CionClient.CionClientConnectionResultCb _connectionResultCb;
         private Interop.CionClient.CionClientPayloadReceivedCb _payloadRecievedCb;
         private Interop.CionClient.CionClientDisconnectedCb _disconnectedCb;
-        private Interop.CionClient.CionClientPayloadAsyncResultCb _payloadAsyncResultCb;
         private Dictionary<string, TaskCompletionSource<PayloadAsyncResult>> _tcsDictionary = new Dictionary<string, TaskCompletionSource<PayloadAsyncResult>>();
         private Dictionary<string, Interop.CionClient.CionClientPayloadAsyncResultCb> _payloadAsyncCbDictionary = new Dictionary<string, Interop.CionClient.CionClientPayloadAsyncResultCb>();
 
@@ -305,7 +304,7 @@ namespace Tizen.Applications.Cion
                     _tcsDictionary.Remove(resultPayload.PayloadId);
                 });
 
-            Interop.Cion.ErrorCode ret = Interop.CionClient.CionClientSendPayloadAsync(_handle, payload?._handle, _payloadAsyncResultCb, IntPtr.Zero);
+            Interop.Cion.ErrorCode ret = Interop.CionClient.CionClientSendPayloadAsync(_handle, payload?._handle, cb, IntPtr.Zero);
             if (ret != Interop.Cion.ErrorCode.None)
             {
                 throw CionErrorFactory.GetException(ret, "Failed to send payload.");
index ddc59e6..f5ddd21 100644 (file)
@@ -16,6 +16,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.Runtime.InteropServices;
 using System.Threading.Tasks;
 
 namespace Tizen.Applications.Cion
@@ -121,17 +122,19 @@ namespace Tizen.Applications.Cion
             }
 
             _dataReceivedCb = new Interop.CionServer.CionServerDataReceivedCb(
-                (string service, IntPtr peerInfo, byte[] data, int dataSize, out byte[] returnData, out int returnDataSize, IntPtr userData) =>
+                (string service, IntPtr peerInfo, byte[] data, int dataSize, out IntPtr returnData, out int returnDataSize, IntPtr userData) =>
                 {
                     Interop.Cion.ErrorCode clone_ret = Interop.CionPeerInfo.CionPeerInfoClone(peerInfo, out PeerInfoSafeHandle clone);
                     if (clone_ret != Interop.Cion.ErrorCode.None)
                     {
                         Log.Error(LogTag, "Failed to clone peer info.");
-                        returnData = null;
+                        returnData = IntPtr.Zero;
                         returnDataSize = -1;
                     }
-                    returnData = OnDataReceived(data, new PeerInfo(clone));
-                    returnDataSize = returnData.Length;
+                    byte[] returnDataRaw = OnDataReceived(data, new PeerInfo(clone));
+                    returnDataSize = returnDataRaw.Length;
+                    returnData = Interop.Cion.Malloc(returnDataSize);
+                    Marshal.Copy(returnDataRaw, 0, returnData, returnDataSize);
                 });
             ret = Interop.CionServer.CionServerSetDataReceivedCb(_handle, _dataReceivedCb, IntPtr.Zero);
             if (ret != Interop.Cion.ErrorCode.None)