[DataControl] Fix MapGet bug 85/165185/1 4.0.1-preview1-00050
authorjusung son <jusung07.son@samsung.com>
Wed, 27 Dec 2017 02:37:57 +0000 (11:37 +0900)
committerjusung son <jusung07.son@samsung.com>
Wed, 27 Dec 2017 03:03:14 +0000 (03:03 +0000)
Unmanaged string array should be marshalled

Change-Id: If4f4d5c1844b74f58d02b961f651f68659b5dba6
Signed-off-by: jusung son <jusung07.son@samsung.com>
(cherry picked from commit b86e557aef3a0c2658a58527ec6543a997cdbce2)

src/Tizen.Applications.DataControl/Interop/Interop.DataControl.cs
src/Tizen.Applications.DataControl/Tizen.Applications.DataControl/Consumer.cs

index b19f6ee..e598ef4 100755 (executable)
@@ -154,7 +154,7 @@ internal static partial class Interop
         internal static extern ResultType DataControlGetDataId(SafeDataControlHandle handle, out string dataId);
 
         internal delegate void MapGetResponseCallback(int requestID,
-            IntPtr provider, string[] resultValueList, int resultValueCount, bool providerResult, string error, IntPtr userData);
+            IntPtr provider, IntPtr resultValueList, int resultValueCount, bool providerResult, string error, IntPtr userData);
         internal delegate void MapSetResponseCallback(int requestID,
             IntPtr provider, bool providerResult, string error, IntPtr userData);
         internal delegate void MapAddResponseCallback(int requestID,
index 27a85ac..9619d44 100755 (executable)
@@ -17,6 +17,7 @@ using System;
 using System.Collections.Generic;
 using Tizen.Applications.DataControl.Core;
 using System.Threading;
+using System.Runtime.InteropServices;
 
 namespace Tizen.Applications.DataControl
 {
@@ -166,7 +167,18 @@ namespace Tizen.Applications.DataControl
                 _reqConsumerDictionary.Remove(reqId);
             }
 
-            private static void MapGetResponse(int reqId, IntPtr provider, string[] valueList, int valueCount, bool providerResult, string error, IntPtr userData)
+            static void IntPtrToStringArray(IntPtr unmanagedArray, int size, out string[] managedArray)
+            {
+                managedArray = new string[size];
+                IntPtr[] IntPtrArray = new IntPtr[size];
+                Marshal.Copy(unmanagedArray, IntPtrArray, 0, size);
+                for (int iterator = 0; iterator < size; iterator++)
+                {
+                    managedArray[iterator] = Marshal.PtrToStringAnsi(IntPtrArray[iterator]);
+                }
+            }
+
+            private static void MapGetResponse(int reqId, IntPtr provider, IntPtr valueList, int valueCount, bool providerResult, string error, IntPtr userData)
             {
                 MapGetResult mgr;
                 Log.Debug(LogTag, $"MapGetResponse {reqId.ToString()}");
@@ -183,7 +195,9 @@ namespace Tizen.Applications.DataControl
 
                 if (valueList !=null)
                 {
-                    mgr = new MapGetResult(valueList, providerResult);
+                    string[] stringArray;
+                    IntPtrToStringArray(valueList, valueCount, out stringArray);
+                    mgr = new MapGetResult(stringArray, providerResult);
                 }
                 else
                 {