[AppControl] Implement ExtraData,SendLaunchRequest,Reply
authoryons.kim <yons.kim@samsung.com>
Mon, 28 Mar 2016 07:33:04 +0000 (16:33 +0900)
committeryons.kim <yons.kim@samsung.com>
Mon, 4 Apr 2016 10:47:14 +0000 (19:47 +0900)
Change-Id: I844832bc6923eb127f24fbec5afca7fec5ad857f

.gitignore
AppFW.sln
Tizen.Applications/Interop/Interop.AppControl.cs
Tizen.Applications/Tizen.Applications.csproj
Tizen.Applications/Tizen.Applications/AppControl.cs
Tizen.Applications/Tizen.Applications/AppControlLaunchMode.cs
Tizen.Applications/Tizen.Applications/AppControlReplyCallback.cs [new file with mode: 0755]
Tizen.Applications/Tizen.Applications/AppControlReplyReceivedEventArgs.cs [deleted file]
Tizen.Applications/Tizen.Applications/ReceivedAppControl.cs

index 1b085dd..b933f59 100755 (executable)
@@ -4,3 +4,4 @@ obj/
 *.dll
 .vs/
 Test/
+*.sln
index ff0c3b2..0b38588 100755 (executable)
--- a/AppFW.sln
+++ b/AppFW.sln
@@ -1,15 +1,12 @@
-
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 14
 VisualStudioVersion = 14.0.24720.0
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tizen.Applications", "Tizen.Applications\Tizen.Applications.csproj", "{663C5A3D-E631-4987-AEE7-F498C56A40FC}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tizen", "..\tizen\Tizen\Tizen.csproj", "{7659CA59-410D-41A1-9841-586E88BC78C9}"
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tizen.Internals", "..\tizen\Tizen.Internals\Tizen.Internals.csproj", "{B9AA1CB2-F72D-4A30-A33B-A20C850A38A0}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{296FB4FC-D152-45AF-99BF-09CC7A212262}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tizen", "..\tizen\Tizen\Tizen.csproj", "{7659CA59-410D-41A1-9841-586E88BC78C9}"
 EndProject
 Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -21,18 +18,14 @@ Global
                {663C5A3D-E631-4987-AEE7-F498C56A40FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
                {663C5A3D-E631-4987-AEE7-F498C56A40FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
                {663C5A3D-E631-4987-AEE7-F498C56A40FC}.Release|Any CPU.Build.0 = Release|Any CPU
-               {7659CA59-410D-41A1-9841-586E88BC78C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-               {7659CA59-410D-41A1-9841-586E88BC78C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
-               {7659CA59-410D-41A1-9841-586E88BC78C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
-               {7659CA59-410D-41A1-9841-586E88BC78C9}.Release|Any CPU.Build.0 = Release|Any CPU
                {B9AA1CB2-F72D-4A30-A33B-A20C850A38A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
                {B9AA1CB2-F72D-4A30-A33B-A20C850A38A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
                {B9AA1CB2-F72D-4A30-A33B-A20C850A38A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
                {B9AA1CB2-F72D-4A30-A33B-A20C850A38A0}.Release|Any CPU.Build.0 = Release|Any CPU
-               {296FB4FC-D152-45AF-99BF-09CC7A212262}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-               {296FB4FC-D152-45AF-99BF-09CC7A212262}.Debug|Any CPU.Build.0 = Debug|Any CPU
-               {296FB4FC-D152-45AF-99BF-09CC7A212262}.Release|Any CPU.ActiveCfg = Release|Any CPU
-               {296FB4FC-D152-45AF-99BF-09CC7A212262}.Release|Any CPU.Build.0 = Release|Any CPU
+               {7659CA59-410D-41A1-9841-586E88BC78C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {7659CA59-410D-41A1-9841-586E88BC78C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {7659CA59-410D-41A1-9841-586E88BC78C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {7659CA59-410D-41A1-9841-586E88BC78C9}.Release|Any CPU.Build.0 = Release|Any CPU
        EndGlobalSection
        GlobalSection(SolutionProperties) = preSolution
                HideSolutionNode = FALSE
index a2e36a6..de97b74 100755 (executable)
@@ -9,15 +9,29 @@
 using System;
 using System.Runtime.InteropServices;
 
-using Tizen.Internals.Errors;
-
 internal static partial class Interop
 {
     internal static partial class AppControl
     {
         internal delegate bool ExtraDataCallback(SafeAppControlHandle handle, string key, IntPtr userData);
         internal delegate bool AppMatchedCallback(SafeAppControlHandle handle, string applicationId, IntPtr userData);
-        internal delegate void ReplyCallback(SafeAppControlHandle request, SafeAppControlHandle reply, int result, IntPtr userData);
+        internal delegate void ReplyCallback(IntPtr request, IntPtr reply, int result, IntPtr userData);
+
+        internal enum ErrorCode
+        {
+            None = Tizen.Internals.Errors.ErrorCode.None,
+            InvalidParameter = Tizen.Internals.Errors.ErrorCode.InvalidParameter,
+            OutOfMemory = Tizen.Internals.Errors.ErrorCode.OutOfMemory,
+            AppNotFound = -0x01100000 | 0x21,
+            KeyNotFound = Tizen.Internals.Errors.ErrorCode.KeyNotAvailable,
+            KeyRejected = Tizen.Internals.Errors.ErrorCode.KeyRejected,
+            InvalidDataType = -0x01100000 | 0x22,
+            LaunchRejected = -0x01100000 | 0x23,
+            PermissionDenied = Tizen.Internals.Errors.ErrorCode.PermissionDenied,
+            LaunchFailed = -0x01100000 | 0x24,
+            IoError = Tizen.Internals.Errors.ErrorCode.IoError,
+            TimedOut = Tizen.Internals.Errors.ErrorCode.TimedOut,
+        }
 
         [DllImport(Libraries.AppControl, EntryPoint = "app_control_create")]
         internal static extern ErrorCode Create(out SafeAppControlHandle handle);
index c3959b3..0b535e4 100755 (executable)
@@ -66,6 +66,7 @@
     <Compile Include="Tizen.Applications.Messages\MessageReceivedEventArgs.cs" />
     <Compile Include="Tizen.Applications.Messages\RemoteValues.cs" />
     <Compile Include="Tizen.Applications\AppControlReceivedEventArgs.cs" />
+    <Compile Include="Tizen.Applications\AppControlReplyCallback.cs" />
     <Compile Include="Tizen.Applications\ApplicationInfo.cs" />
     <Compile Include="Tizen.Applications\LocaleChangedEventArgs.cs" />
     <Compile Include="Tizen.Applications\LowMemoryEventArgs.cs" />
@@ -83,7 +84,6 @@
     <Compile Include="Tizen.Applications\AppControlLaunchMode.cs" />
     <Compile Include="Tizen.Applications\AppControlLaunchResult.cs" />
     <Compile Include="Tizen.Applications\AppControlOperations.cs" />
-    <Compile Include="Tizen.Applications\AppControlReplyReceivedEventArgs.cs" />
     <Compile Include="Tizen.Applications\Application.cs" />
     <Compile Include="Tizen.Applications\Bundle.cs" />
     <Compile Include="Tizen.Applications\TizenSynchronizationContext.cs" />
index 0adfaca..19da7b7 100755 (executable)
@@ -9,8 +9,8 @@
 
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Runtime.InteropServices;
-using Tizen.Internals.Errors;
 
 namespace Tizen.Applications
 {
@@ -32,22 +32,24 @@ namespace Tizen.Applications
         private ExtraDataCollection _extraData = null;
 
         /// <summary>
-        /// 
-        /// </summary>
-        public event EventHandler<AppControlReplyReceivedEventArgs> AppControlReplyReceived;
-
-        /// <summary>
         ///
         /// </summary>
         public AppControl()
         {
-            ErrorCode err = Interop.AppControl.Create(out _handle);
-            if (err != ErrorCode.None)
+            Interop.AppControl.ErrorCode err = Interop.AppControl.Create(out _handle);
+            if (err != Interop.AppControl.ErrorCode.None)
             {
                 throw new InvalidOperationException("Failed to create the appcontrol handle. Err = " + err);
             }
         }
 
+        internal AppControl(IntPtr handle)
+        {
+            Interop.AppControl.ErrorCode err = Interop.AppControl.DangerousClone(out _handle, handle);
+            if (err != Interop.AppControl.ErrorCode.None)
+                throw new InvalidOperationException("Failed to create the appcontrol handle. Err = " + err);
+        }
+
         #region Public Properties
 
         /// <summary>
@@ -59,8 +61,8 @@ namespace Tizen.Applications
             {
                 if (String.IsNullOrEmpty(_operation))
                 {
-                    ErrorCode err = Interop.AppControl.GetOperation(_handle, out _operation);
-                    if (err != ErrorCode.None)
+                    Interop.AppControl.ErrorCode err = Interop.AppControl.GetOperation(_handle, out _operation);
+                    if (err != Interop.AppControl.ErrorCode.None)
                     {
                         Log.Warn(LogTag, "Failed to get the operation from the appcontrol. Err = " + err);
                     }
@@ -69,8 +71,8 @@ namespace Tizen.Applications
             }
             set
             {
-                ErrorCode err = Interop.AppControl.SetOperation(_handle, value);
-                if (err == ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.SetOperation(_handle, value);
+                if (err == Interop.AppControl.ErrorCode.None)
                 {
                     _operation = value;
                 }
@@ -90,8 +92,8 @@ namespace Tizen.Applications
             {
                 if (String.IsNullOrEmpty(_mime))
                 {
-                    ErrorCode err = Interop.AppControl.GetMime(_handle, out _mime);
-                    if (err != ErrorCode.None)
+                    Interop.AppControl.ErrorCode err = Interop.AppControl.GetMime(_handle, out _mime);
+                    if (err != Interop.AppControl.ErrorCode.None)
                     {
                         Log.Warn(LogTag, "Failed to get the mime from the appcontrol. Err = " + err);
                     }
@@ -100,8 +102,8 @@ namespace Tizen.Applications
             }
             set
             {
-                ErrorCode err = Interop.AppControl.SetMime(_handle, value);
-                if (err == ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.SetMime(_handle, value);
+                if (err == Interop.AppControl.ErrorCode.None)
                 {
                     _mime = value;
                 }
@@ -121,8 +123,8 @@ namespace Tizen.Applications
             {
                 if (String.IsNullOrEmpty(_uri))
                 {
-                    ErrorCode err = Interop.AppControl.GetUri(_handle, out _uri);
-                    if (err != ErrorCode.None)
+                    Interop.AppControl.ErrorCode err = Interop.AppControl.GetUri(_handle, out _uri);
+                    if (err != Interop.AppControl.ErrorCode.None)
                     {
                         Log.Warn(LogTag, "Failed to get the uri from the appcontrol. Err = " + err);
                     }
@@ -131,8 +133,8 @@ namespace Tizen.Applications
             }
             set
             {
-                ErrorCode err = Interop.AppControl.SetUri(_handle, value);
-                if (err == ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.SetUri(_handle, value);
+                if (err == Interop.AppControl.ErrorCode.None)
                 {
                     _uri = value;
                 }
@@ -144,7 +146,7 @@ namespace Tizen.Applications
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         public string Category
         {
@@ -152,8 +154,8 @@ namespace Tizen.Applications
             {
                 if (String.IsNullOrEmpty(_category))
                 {
-                    ErrorCode err = Interop.AppControl.GetCategory(_handle, out _category);
-                    if (err != ErrorCode.None)
+                    Interop.AppControl.ErrorCode err = Interop.AppControl.GetCategory(_handle, out _category);
+                    if (err != Interop.AppControl.ErrorCode.None)
                     {
                         Log.Warn(LogTag, "Failed to get the category from the appcontrol. Err = " + err);
                     }
@@ -162,8 +164,8 @@ namespace Tizen.Applications
             }
             set
             {
-                ErrorCode err = Interop.AppControl.SetCategory(_handle, value);
-                if (err == ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.SetCategory(_handle, value);
+                if (err == Interop.AppControl.ErrorCode.None)
                 {
                     _category = value;
                 }
@@ -175,7 +177,7 @@ namespace Tizen.Applications
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         public string ApplicationId
         {
@@ -183,8 +185,8 @@ namespace Tizen.Applications
             {
                 if (String.IsNullOrEmpty(_applicationId))
                 {
-                    ErrorCode err = Interop.AppControl.GetAppId(_handle, out _applicationId);
-                    if (err != ErrorCode.None)
+                    Interop.AppControl.ErrorCode err = Interop.AppControl.GetAppId(_handle, out _applicationId);
+                    if (err != Interop.AppControl.ErrorCode.None)
                     {
                         Log.Warn(LogTag, "Failed to get the appId from the appcontrol. Err = " + err);
                     }
@@ -193,8 +195,8 @@ namespace Tizen.Applications
             }
             set
             {
-                ErrorCode err = Interop.AppControl.SetAppId(_handle, value);
-                if (err == ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.SetAppId(_handle, value);
+                if (err == Interop.AppControl.ErrorCode.None)
                 {
                     _applicationId = value;
                 }
@@ -206,15 +208,15 @@ namespace Tizen.Applications
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         public AppControlLaunchMode LaunchMode
         {
             get
             {
                 int value = 0;
-                ErrorCode err = Interop.AppControl.GetLaunchMode(_handle, out value);
-                if (err != ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.GetLaunchMode(_handle, out value);
+                if (err != Interop.AppControl.ErrorCode.None)
                 {
                     Log.Warn(LogTag, "Failed to get the launchMode from the appcontrol. Err = " + err);
                 }
@@ -222,8 +224,8 @@ namespace Tizen.Applications
             }
             set
             {
-                ErrorCode err = Interop.AppControl.SetLaunchMode(_handle, (int)value);
-                if (err != ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.SetLaunchMode(_handle, (int)value);
+                if (err != Interop.AppControl.ErrorCode.None)
                 {
                     Log.Warn(LogTag, "Failed to set the launchMode to the appcontrol. Err = " + err);
                 }
@@ -235,9 +237,7 @@ namespace Tizen.Applications
             get
             {
                 if (_extraData == null)
-                {
-                    _extraData = new ExtraDataCollection();
-                }
+                    _extraData = new ExtraDataCollection(_handle);
                 return _extraData;
             }
         }
@@ -245,7 +245,7 @@ namespace Tizen.Applications
         #endregion // Public Properties
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         /// <returns></returns>
         public static IEnumerable<string> GetMatchedApplicationIds(AppControl control)
@@ -267,10 +267,10 @@ namespace Tizen.Applications
                 });
 
             IntPtr pointerToApplicationIds = Marshal.GetIUnknownForObject(ids);
-            if (pointerToApplicationIds != null)
+            if (pointerToApplicationIds != IntPtr.Zero)
             {
-                ErrorCode err = Interop.AppControl.ForeachAppMatched(control._handle, callback, pointerToApplicationIds);
-                if (err != ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.ForeachAppMatched(control._handle, callback, pointerToApplicationIds);
+                if (err != Interop.AppControl.ErrorCode.None)
                 {
                     throw new InvalidOperationException("Failed to get matched appids. err = " + err);
                 }
@@ -281,78 +281,308 @@ namespace Tizen.Applications
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
-        /// <param name="request"></param>
-        public static void SendLaunchRequest(AppControl request)
+        /// <param name="receiver"></param>
+        /// <param name="replyCallback"></param>
+        public static void SendLaunchRequest(AppControl launchRequest, AppControlReplyCallback replyAfterLaunching = null)
         {
-            throw new NotImplementedException();
-        }
+            Interop.AppControl.ErrorCode err;
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="request"></param>
-        public static void SendLaunchRequestForReply(AppControl request)
-        {
-            throw new NotImplementedException();
+            err = Interop.AppControl.EnableAppStartedResultEvent(launchRequest._handle);
+            if (err == Interop.AppControl.ErrorCode.InvalidParameter)
+                throw new ArgumentException("Invalid parameter of EnableAppStartedResultEvent()");
+
+            if (replyAfterLaunching != null)
+            {
+                Interop.AppControl.ReplyCallback replyNativeCallback = (launchRequestHandle, replyRequestHandle, result, userData) =>
+                {
+                    AppControlReplyCallback replyCallbackAfterLaunching = Marshal.GetObjectForIUnknown(userData) as AppControlReplyCallback;
+                    if (replyCallbackAfterLaunching != null)
+                        replyCallbackAfterLaunching(new AppControl(launchRequestHandle), new AppControl(replyRequestHandle), (AppControlLaunchResult)result);
+                };
+                err = Interop.AppControl.SendLaunchRequest(launchRequest._handle, replyNativeCallback, Marshal.GetIUnknownForObject(replyAfterLaunching));
+            }
+            else
+            {
+                err = Interop.AppControl.SendLaunchRequest(launchRequest._handle, null, IntPtr.Zero);
+            }
+
+            switch (err)
+            {
+                case Interop.AppControl.ErrorCode.InvalidParameter:
+                throw new ArgumentNullException("Invalid parameter: key is a zero-length string");
+                case Interop.AppControl.ErrorCode.AppNotFound:
+                throw new InvalidOperationException("App not found");
+                case Interop.AppControl.ErrorCode.LaunchRejected:
+                throw new InvalidOperationException("Launch rejected");
+                case Interop.AppControl.ErrorCode.LaunchFailed:
+                throw new InvalidOperationException("Launch failed");
+                case Interop.AppControl.ErrorCode.TimedOut:
+                throw new TimeoutException("Timed out");
+                case Interop.AppControl.ErrorCode.PermissionDenied:
+                throw new InvalidOperationException("Permission denied");
+            }
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         public class ExtraDataCollection
         {
+            private readonly Interop.AppControl.SafeAppControlHandle _handle;
+
+            internal ExtraDataCollection(Interop.AppControl.SafeAppControlHandle handle)
+            {
+                _handle = handle;
+            }
+
             /// <summary>
-            /// 
+            ///
             /// </summary>
             /// <param name="key"></param>
             /// <param name="value"></param>
             public void Add(string key, string value)
             {
-                throw new NotImplementedException();
+                Interop.AppControl.ErrorCode err = Interop.AppControl.AddExtraData(_handle, key, value);
+                switch (err)
+                {
+                    case Interop.AppControl.ErrorCode.InvalidParameter:
+                    throw new ArgumentNullException("Invalid parameter: key or value is a zero-length string");
+                    case Interop.AppControl.ErrorCode.KeyRejected:
+                    throw new ArgumentException("Key is rejected: the key is system-defined key.");
+                }
             }
 
             /// <summary>
-            /// 
+            ///
             /// </summary>
             /// <param name="key"></param>
             /// <param name="value"></param>
             public void Add(string key, IEnumerable<string> value)
             {
-                throw new NotImplementedException();
+                string[] valueArray = value.ToArray();
+                Interop.AppControl.ErrorCode err = Interop.AppControl.AddExtraDataArray(_handle, key, valueArray, valueArray.Length);
+                switch (err)
+                {
+                    case Interop.AppControl.ErrorCode.InvalidParameter:
+                    throw new ArgumentNullException("Invalid parameter: key or value is a zero-length string");
+                    case Interop.AppControl.ErrorCode.KeyRejected:
+                    throw new ArgumentException("Key is rejected: the key is system-defined key.");
+                }
             }
 
             /// <summary>
-            /// 
+            ///
             /// </summary>
             /// <typeparam name="T"></typeparam>
             /// <param name="key"></param>
             /// <returns></returns>
             public T Get<T>(string key)
             {
-                throw new NotImplementedException();
+                object ret = Get(key);
+                return (T)ret;
             }
 
             /// <summary>
-            /// 
+            ///
             /// </summary>
             /// <param name="key"></param>
             /// <returns></returns>
             public object Get(string key)
             {
-                throw new NotImplementedException();
+                if (IsCollection(key))
+                {
+                    return GetDataCollection(key);
+                }
+                else
+                {
+                    return GetData(key);
+                }
             }
 
             /// <summary>
-            /// 
+            ///
+            /// </summary>
+            /// <returns></returns>
+            public IEnumerable<string> GetKeys()
+            {
+                List<string> keys = new List<string>();
+                Interop.AppControl.ExtraDataCallback callback = new Interop.AppControl.ExtraDataCallback(
+                    (handle, key, userData) =>
+                    {
+                        List<string> keysList = Marshal.GetObjectForIUnknown(userData) as List<string>;
+                        if (keysList != null)
+                        {
+                            keysList.Add(key);
+                            return true;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                    });
+
+                IntPtr pointerToKeys = Marshal.GetIUnknownForObject(keys);
+                if (pointerToKeys != IntPtr.Zero)
+                {
+                    Interop.AppControl.ErrorCode err = Interop.AppControl.ForeachExtraData(_handle, callback, pointerToKeys);
+                    if (err != Interop.AppControl.ErrorCode.None)
+                    {
+                        throw new InvalidOperationException("Failed to get keys. err = " + err);
+                    }
+                    return keys;
+                }
+
+                return keys;
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="key"></param>
+            /// <param name="value"></param>
+            /// <returns></returns>
+            public bool TryGet(string key, out string value)
+            {
+                Interop.AppControl.GetExtraData(_handle, key, out value);
+                if (value != null)
+                {
+                    return true;
+                }
+                else
+                {
+                    value = default(string);
+                    return false;
+                }
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="key"></param>
+            /// <param name="value"></param>
+            /// <returns></returns>
+            public bool TryGet(string key, out IEnumerable<string> value)
+            {
+                IntPtr valuePtr = IntPtr.Zero;
+                int len = -1;
+                Interop.AppControl.ErrorCode err = Interop.AppControl.GetExtraDataArray(_handle, key, out valuePtr, out len);
+                if (err == Interop.AppControl.ErrorCode.None && valuePtr != IntPtr.Zero && len > 0)
+                {
+                    string[] stringArray = new string[len];
+                    for (int i = 0; i < len; ++i)
+                    {
+                        IntPtr charArr = Marshal.ReadIntPtr(valuePtr, IntPtr.Size * i);
+                        stringArray[i] = Marshal.PtrToStringAuto(charArr);
+                        Interop.Libc.Free(charArr);
+                    }
+                    Interop.Libc.Free(valuePtr);
+                    value = stringArray;
+                    return true;
+                }
+                else
+                {
+                    value = default(IEnumerable<string>);
+                    return false;
+                }
+            }
+
+            /// <summary>
+            ///
             /// </summary>
             /// <param name="key"></param>
             public void Remove(string key)
             {
-                throw new NotImplementedException();
+                Interop.AppControl.ErrorCode err = Interop.AppControl.RemoveExtraData(_handle, key);
+                switch (err)
+                {
+                    case Interop.AppControl.ErrorCode.InvalidParameter:
+                    throw new ArgumentNullException("Invalid parameter: key is a zero-length string");
+                    case Interop.AppControl.ErrorCode.KeyNotFound:
+                    throw new KeyNotFoundException("Key is not found"); ;
+                    case Interop.AppControl.ErrorCode.KeyRejected:
+                    throw new ArgumentException("Key is rejected: the key is system-defined key.");
+                }
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <returns></returns>
+            public int Count()
+            {
+                return GetKeys().Count();
             }
-        }
 
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="key"></param>
+            /// <returns></returns>
+            public bool IsCollection(string key)
+            {
+                bool isArray = false;
+                Interop.AppControl.ErrorCode err = Interop.AppControl.IsExtraDataArray(_handle, key, out isArray);
+                switch (err)
+                {
+                    case Interop.AppControl.ErrorCode.InvalidParameter:
+                    throw new ArgumentNullException("Invalid parameter: key is a zero-length string");
+                }
+                return isArray;
+            }
+
+            private string GetData(string key)
+            {
+                string value = string.Empty;
+                Interop.AppControl.ErrorCode err = Interop.AppControl.GetExtraData(_handle, key, out value);
+                switch (err)
+                {
+                    case Interop.AppControl.ErrorCode.InvalidParameter:
+                    throw new ArgumentNullException("Invalid parameter: key is a zero-length string");
+                    case Interop.AppControl.ErrorCode.KeyNotFound:
+                    throw new KeyNotFoundException("Key is not found"); ;
+                    case Interop.AppControl.ErrorCode.InvalidDataType:
+                    throw new ArgumentException("Invalid data type: value is data collection type");
+                    case Interop.AppControl.ErrorCode.KeyRejected:
+                    throw new ArgumentException("Key is rejected: the key is system-defined key.");
+                }
+                return value;
+            }
+
+            private IEnumerable<string> GetDataCollection(string key)
+            {
+                IntPtr valuePtr = IntPtr.Zero;
+                int len = -1;
+
+                Interop.AppControl.ErrorCode err = Interop.AppControl.GetExtraDataArray(_handle, key, out valuePtr, out len);
+                switch (err)
+                {
+                    case Interop.AppControl.ErrorCode.InvalidParameter:
+                    throw new ArgumentNullException("Invalid parameter: key is a zero-length string");
+                    case Interop.AppControl.ErrorCode.KeyNotFound:
+                    throw new KeyNotFoundException("Key is not found"); ;
+                    case Interop.AppControl.ErrorCode.InvalidDataType:
+                    throw new ArgumentException("Invalid data type: value is data collection type");
+                    case Interop.AppControl.ErrorCode.KeyRejected:
+                    throw new ArgumentException("Key is rejected: the key is system-defined key.");
+                }
+
+                string[] valueArray = null;
+                if (valuePtr != IntPtr.Zero && len > 0)
+                {
+                    valueArray = new string[len];
+                    for (int i = 0; i < len; ++i)
+                    {
+                        IntPtr charArr = Marshal.ReadIntPtr(valuePtr, IntPtr.Size * i);
+                        valueArray[i] = Marshal.PtrToStringAuto(charArr);
+                        Interop.Libc.Free(charArr);
+                    }
+                    Interop.Libc.Free(valuePtr);
+                }
+
+                return valueArray;
+            }
+        }
     }
 }
index c240a34..ddbeb80 100755 (executable)
@@ -7,17 +7,17 @@ using System.Threading.Tasks;
 namespace Tizen.Applications
 {
     /// <summary>
-    /// 
+    ///
     /// </summary>
     public enum AppControlLaunchMode
     {
         /// <summary>
-        /// 
+        ///
         /// </summary>
         Single = 0,
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         Group,
     }
diff --git a/Tizen.Applications/Tizen.Applications/AppControlReplyCallback.cs b/Tizen.Applications/Tizen.Applications/AppControlReplyCallback.cs
new file mode 100755 (executable)
index 0000000..5ab2139
--- /dev/null
@@ -0,0 +1,19 @@
+/// Copyright 2016 by Samsung Electronics, Inc.,
+///
+/// This software is the confidential and proprietary information
+/// of Samsung Electronics, Inc. ("Confidential Information"). You
+/// shall not disclose such Confidential Information and shall use
+/// it only in accordance with the terms of the license agreement
+/// you entered into with Samsung.
+
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tizen.Applications
+{
+    public delegate void AppControlReplyCallback(AppControl launchRequest, AppControl replyRequest, AppControlLaunchResult result);
+}
diff --git a/Tizen.Applications/Tizen.Applications/AppControlReplyReceivedEventArgs.cs b/Tizen.Applications/Tizen.Applications/AppControlReplyReceivedEventArgs.cs
deleted file mode 100755 (executable)
index b3cdf56..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Tizen.Applications
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class AppControlReplyReceivedEventArgs
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public AppControl Request { get; internal set; }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public AppControl Reply { get; internal set; }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public AppControlLaunchResult Result { get; internal set; }
-    }
-}
index 1d719c6..4250cc9 100755 (executable)
@@ -8,21 +8,14 @@
 
 using System;
 
-using Tizen.Internals.Errors;
-
 namespace Tizen.Applications
 {
     public class ReceivedAppControl : AppControl
     {
         private const string LogTag = "Tizen.Applications";
 
-        internal ReceivedAppControl(IntPtr handle)
+        internal ReceivedAppControl(IntPtr handle) : base(handle)
         {
-            ErrorCode err = Interop.AppControl.DangerousClone(out _handle, handle);
-            if (err != ErrorCode.None)
-            {
-                throw new InvalidOperationException("Failed to create the appcontrol handle. Err = " + err);
-            }
         }
 
         /// <summary>
@@ -33,8 +26,8 @@ namespace Tizen.Applications
             get
             {
                 string value = String.Empty;
-                ErrorCode err = Interop.AppControl.GetCaller(_handle, out value);
-                if (err != ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.GetCaller(_handle, out value);
+                if (err != Interop.AppControl.ErrorCode.None)
                 {
                     Log.Warn(LogTag, "Failed to get the caller appId from the appcontrol. Err = " + err);
                 }
@@ -45,13 +38,13 @@ namespace Tizen.Applications
         /// <summary>
         /// 
         /// </summary>
-        public bool IsReplyRequested
+        public bool IsReplyRequest
         {
             get
             {
                 bool value = false;
-                ErrorCode err = Interop.AppControl.IsReplyRequested(_handle, out value);
-                if (err != ErrorCode.None)
+                Interop.AppControl.ErrorCode err = Interop.AppControl.IsReplyRequested(_handle, out value);
+                if (err != Interop.AppControl.ErrorCode.None)
                 {
                     Log.Warn(LogTag, "Failed to check the replyRequested of the appcontrol. Err = " + err);
                 }
@@ -59,15 +52,17 @@ namespace Tizen.Applications
             }
         }
 
-
         /// <summary>
         /// 
         /// </summary>
-        /// <param name="reply"></param>
-        public void Reply(AppControl reply)
+        /// <param name="replyRequest"></param>
+        /// <param name="launchRequest"></param>
+        /// <param name="result"></param>
+        public void ReplyToLaunchRequest(AppControl replyRequest, AppControlLaunchResult result)
         {
-            throw new NotImplementedException();
+            Interop.AppControl.ErrorCode err = Interop.AppControl.ReplyToLaunchRequest(replyRequest._handle, this._handle, (int)result);
+            if (err == Interop.AppControl.ErrorCode.InvalidParameter)
+                throw new ArgumentException("Invalid parameter of ReplyToLaunchRequest()");
         }
-
     }
 }