[MediaController] Add to release native memory and apply C# coding rule
authorJiyong Min <jiyong.min@samsung.com>
Wed, 15 Mar 2017 04:32:04 +0000 (13:32 +0900)
committerJiyong Min <jiyong.min@samsung.com>
Wed, 15 Mar 2017 09:35:06 +0000 (18:35 +0900)
 - add to release native memory and check valid handle.
 - apply C# coding rule.

Change-Id: Id46803b69a2467e2e8e35ffdbadfb82865d928f6
Signed-off-by: Jiyong Min <jiyong.min@samsung.com>
13 files changed:
src/Tizen.Multimedia/Interop/Interop.MediaController.cs
src/Tizen.Multimedia/MediaController/CustomCommandEventArgs.cs
src/Tizen.Multimedia/MediaController/CustomCommandReplyEventArgs.cs
src/Tizen.Multimedia/MediaController/MediaControllerClient.cs
src/Tizen.Multimedia/MediaController/MediaControllerMetadata.cs
src/Tizen.Multimedia/MediaController/MediaControllerPlayback.cs
src/Tizen.Multimedia/MediaController/MediaControllerServer.cs
src/Tizen.Multimedia/MediaController/MetadataUpdatedEventArgs.cs
src/Tizen.Multimedia/MediaController/PlaybackStateCommandEventArgs.cs
src/Tizen.Multimedia/MediaController/PlaybackUpdatedEventArgs.cs
src/Tizen.Multimedia/MediaController/RepeatModeUpdatedEventArgs.cs
src/Tizen.Multimedia/MediaController/ServerUpdatedEventArgs.cs
src/Tizen.Multimedia/MediaController/ShuffleModeUpdatedEventArgs.cs

index 6644d86..47d34b3 100755 (executable)
@@ -4,32 +4,32 @@ using Tizen.Applications;
 using Tizen.Multimedia.MediaController;
 
 internal static partial class Interop
-{
+{\r
     internal static partial class MediaControllerClient
     {
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void ServerUpdatedCallback(string serverName, MediaControllerServerState serverState, IntPtr userData);
+        internal delegate void ServerUpdatedCallback(IntPtr serverName, MediaControllerServerState serverState, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void PlaybackUpdatedCallback(string serverName, IntPtr playback, IntPtr userData);
+        internal delegate void PlaybackUpdatedCallback(IntPtr serverName, IntPtr playback, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void MetadataUpdatedCallback(string serverName, IntPtr metadata, IntPtr userData);
+        internal delegate void MetadataUpdatedCallback(IntPtr serverName, IntPtr metadata, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void ShuffleModeUpdatedCallback(string serverName, MediaControllerShuffleMode shuffleMode, IntPtr userData);
+        internal delegate void ShuffleModeUpdatedCallback(IntPtr serverName, MediaControllerShuffleMode shuffleMode, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void RepeatModeUpdatedCallback(string serverName, MediaControllerRepeatMode repeatMode, IntPtr userData);
+        internal delegate void RepeatModeUpdatedCallback(IntPtr serverName, MediaControllerRepeatMode repeatMode, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void CommandReplyRecievedCallback(string serverName, int result, IntPtr bundle, IntPtr userData);
+        internal delegate void CommandReplyRecievedCallback(IntPtr serverName, int result, IntPtr bundle, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate bool SubscribedServerCallback(string serverName, IntPtr userData);
+        internal delegate bool SubscribedServerCallback(IntPtr serverName, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate bool ActivatedServerCallback(string serverName, IntPtr userData);
+        internal delegate bool ActivatedServerCallback(IntPtr serverName, IntPtr userData);
 
         [DllImport(Libraries.MediaController, EntryPoint = "mc_client_create")]
         internal static extern MediaControllerError Create(out IntPtr handle);
@@ -83,13 +83,29 @@ internal static partial class Interop
         internal static extern MediaControllerError DestroyPlayback(IntPtr playback);
 
         [DllImport(Libraries.MediaController, EntryPoint = "mc_client_get_metadata")]
-        internal static extern MediaControllerError GetMetadata(IntPtr metadata, MediaControllerAttributes attribute, out string value);
+        private static extern MediaControllerError GetMetadata(IntPtr metadata, MediaControllerAttributes attribute, out IntPtr value);
+
+        internal static string GetMetadata(IntPtr handle, MediaControllerAttributes attr)
+        {
+            IntPtr valuePtr = IntPtr.Zero;
+
+            try
+            {
+                var ret = GetMetadata(handle, attr, out valuePtr);
+                MediaControllerValidator.ThrowIfError(ret, "Failed to get value for " + attr);
+                return Marshal.PtrToStringAnsi(valuePtr);
+            }
+            finally
+            {
+                Libc.Free(valuePtr);
+            }
+        }
 
         [DllImport(Libraries.MediaController, EntryPoint = "mc_client_destroy_metadata")]
         internal static extern MediaControllerError DestroyMetadata(IntPtr metadata);
 
         [DllImport(Libraries.MediaController, EntryPoint = "mc_client_get_latest_server_info")]
-        internal static extern MediaControllerError GetLatestServer(IntPtr handle, out string serverName, out MediaControllerServerState serverState);
+        internal static extern MediaControllerError GetLatestServer(IntPtr handle, out IntPtr serverName, out MediaControllerServerState serverState);
 
         [DllImport(Libraries.MediaController, EntryPoint = "mc_client_get_server_playback_info")]
         internal static extern MediaControllerError GetServerPlayback(IntPtr handle, string serverName, out IntPtr playback);
@@ -119,10 +135,10 @@ internal static partial class Interop
     internal static partial class MediaControllerServer
     {
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void PlaybackStateCommandRecievedCallback(string clientName, MediaControllerPlaybackState state, IntPtr userData);
+        internal delegate void PlaybackStateCommandRecievedCallback(IntPtr clientName, MediaControllerPlaybackState state, IntPtr userData);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void CustomCommandRecievedCallback(string clientName, string command, IntPtr bundle, IntPtr userData);
+        internal delegate void CustomCommandRecievedCallback(IntPtr clientName, IntPtr command, IntPtr bundle, IntPtr userData);
 
         [DllImport(Libraries.MediaController, EntryPoint = "mc_server_create")]
         internal static extern MediaControllerError Create(out IntPtr handle);
index c252540..6793bb3 100755 (executable)
@@ -28,7 +28,7 @@ namespace Tizen.Multimedia.MediaController
     /// </remarks>
     public class CustomCommandEventArgs : EventArgs
     {
-        internal CustomCommandEventArgs (string name, string command, Bundle bundle)
+        internal CustomCommandEventArgs(string name, string command, Bundle bundle)
         {
             ClientName = name;
             Command = command;
index edead05..7d257ba 100755 (executable)
@@ -28,7 +28,7 @@ namespace Tizen.Multimedia.MediaController
     /// </remarks>
     public class CustomCommandReplyEventArgs : EventArgs
     {
-        internal CustomCommandReplyEventArgs (string serverName, int result, Bundle bundle)
+        internal CustomCommandReplyEventArgs(string serverName, int result, Bundle bundle)
         {
             ServerName = serverName;
             Result = result;
index 10d79fd..1842c59 100755 (executable)
 
 using System;
 using System.Collections.Generic;
+using System.Runtime.InteropServices;
 using System.Threading.Tasks;
 using Tizen.Applications;
 
 namespace Tizen.Multimedia.MediaController
-{\r
-\r
+{
+
     /// <summary>
     /// The MediaControllerClient class provides APIs required for media-controller-client.
     /// </summary>
-    /// <privilege>\r
-    /// http://tizen.org/privilege/mediacontroller.client\r
+    /// <privilege>
+    /// http://tizen.org/privilege/mediacontroller.client
     /// </privilege>
     /// <remarks>
     /// The MediaControllerClient APIs provides functions to get media information from server.
@@ -49,18 +50,23 @@ namespace Tizen.Multimedia.MediaController
         private EventHandler<CustomCommandReplyEventArgs> _customcommandReply;
         private Interop.MediaControllerClient.CommandReplyRecievedCallback _customcommandReplyCallback;
 
+        private bool IsValidHandle
+        {
+            get { return (this._handle != IntPtr.Zero); }
+        }
+
         /// <summary>
         /// The constructor of MediaControllerClient class.
         /// </summary>
         /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
         /// <exception cref="UnauthorizedAccessException">Thrown when the access is denied for media controller client</exception>
-        public MediaControllerClient ()
+        public MediaControllerClient()
         {
             MediaControllerValidator.ThrowIfError(
                 Interop.MediaControllerClient.Create(out _handle), "Create client failed");
         }
 
-        ~MediaControllerClient ()
+        ~MediaControllerClient()
         {
             Dispose(false);
         }
@@ -73,17 +79,19 @@ namespace Tizen.Multimedia.MediaController
 
         protected virtual void Dispose(bool disposing)
         {
-            if(!_disposed)
+            if (!_disposed)
             {
-                if(disposing)
+                if (disposing)
                 {
                     // To be used if there are any other disposable objects
                 }
-                if(_handle != IntPtr.Zero)
+
+                if (IsValidHandle)
                 {
                     Interop.MediaControllerClient.Destroy(_handle);
                     _handle = IntPtr.Zero;
                 }
+
                 _disposed = true;
             }
         }
@@ -95,17 +103,19 @@ namespace Tizen.Multimedia.MediaController
         {
             add
             {
-                if(_serverUpdated == null)
+                if (_serverUpdated == null)
                 {
                     RegisterServerUpdatedEvent();
                 }
+
                 _serverUpdated += value;
 
             }
+
             remove
             {
                 _serverUpdated -= value;
-                if(_serverUpdated == null)
+                if (_serverUpdated == null)
                 {
                     UnregisterServerUpdatedEvent();
                 }
@@ -119,17 +129,19 @@ namespace Tizen.Multimedia.MediaController
         {
             add
             {
-                if(_playbackUpdated == null)
+                if (_playbackUpdated == null)
                 {
                     RegisterPlaybackUpdatedEvent();
                 }
+
                 _playbackUpdated += value;
 
             }
+
             remove
             {
                 _playbackUpdated -= value;
-                if(_playbackUpdated == null)
+                if (_playbackUpdated == null)
                 {
                     UnregisterPlaybackUpdatedEvent();
                 }
@@ -143,17 +155,19 @@ namespace Tizen.Multimedia.MediaController
         {
             add
             {
-                if(_metadataUpdated == null)
+                if (_metadataUpdated == null)
                 {
                     RegisterMetadataUpdatedEvent();
                 }
+
                 _metadataUpdated += value;
 
             }
+
             remove
             {
                 _metadataUpdated -= value;
-                if(_metadataUpdated == null)
+                if (_metadataUpdated == null)
                 {
                     UnregisterMetadataUpdatedEvent();
                 }
@@ -167,17 +181,19 @@ namespace Tizen.Multimedia.MediaController
         {
             add
             {
-                if(_shufflemodeUpdated == null)
+                if (_shufflemodeUpdated == null)
                 {
                     RegisterShuffleModeUpdatedEvent();
                 }
+
                 _shufflemodeUpdated += value;
 
             }
+
             remove
             {
                 _shufflemodeUpdated -= value;
-                if(_shufflemodeUpdated == null)
+                if (_shufflemodeUpdated == null)
                 {
                     UnregisterShuffleModeUpdatedEvent();
                 }
@@ -191,17 +207,18 @@ namespace Tizen.Multimedia.MediaController
         {
             add
             {
-                if(_repeatmodeUpdated == null)
+                if (_repeatmodeUpdated == null)
                 {
                     RegisterRepeatModeUpdatedEvent();
                 }
-                _repeatmodeUpdated += value;
 
+                _repeatmodeUpdated += value;
             }
+
             remove
             {
                 _repeatmodeUpdated -= value;
-                if(_repeatmodeUpdated == null)
+                if (_repeatmodeUpdated == null)
                 {
                     UnregisterRepeatModeUpdatedEvent();
                 }
@@ -215,23 +232,25 @@ namespace Tizen.Multimedia.MediaController
         {
             add
             {
-                if(_customcommandReply == null)
+                if (_customcommandReply == null)
                 {
-                    _customcommandReplyCallback = (string serverName, int result, IntPtr bundle, IntPtr userData) =>
-                    {
-                        SafeBundleHandle bundleHandle = new SafeBundleHandle(bundle, true);
-                        Applications.Bundle _bundle = new Bundle(bundleHandle);
-                        CustomCommandReplyEventArgs eventArgs = new CustomCommandReplyEventArgs(serverName, result, _bundle);
+                    _customcommandReplyCallback = (IntPtr serverName, int result, IntPtr bundle, IntPtr userData) =>
+                    {\r
+                        SafeBundleHandle safeBundleHandle = new SafeBundleHandle(bundle, true);\r
+                        Bundle bundleData = new Bundle(safeBundleHandle);\r
+                        CustomCommandReplyEventArgs eventArgs = new CustomCommandReplyEventArgs(Marshal.PtrToStringAnsi(serverName), result, bundleData);\r
                         _customcommandReply?.Invoke(this, eventArgs);
                     };
                 }
+
                 _customcommandReply += value;
 
             }
+
             remove
             {
                 _customcommandReply -= value;
-                if(_customcommandReply == null)
+                if (_customcommandReply == null)
                 {
                     _customcommandReplyCallback = null;
                 }
@@ -244,13 +263,19 @@ namespace Tizen.Multimedia.MediaController
         /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
         public ServerInformation GetLatestServer()
         {
-            string _name = null;
-            MediaControllerServerState _state = MediaControllerServerState.None;
+            IntPtr name = IntPtr.Zero;
+            MediaControllerServerState state = MediaControllerServerState.None;
 
-            MediaControllerValidator.ThrowIfError(\r
-                Interop.MediaControllerClient.GetLatestServer(_handle, out _name, out _state), "Get Latest server failed");\r
-\r
-            return new ServerInformation(_name, (MediaControllerServerState)_state);\r
+            try\r
+            {
+                MediaControllerValidator.ThrowIfError(
+                    Interop.MediaControllerClient.GetLatestServer(_handle, out name, out state), "Get Latest server failed");\r
+                return new ServerInformation(Marshal.PtrToStringAnsi(name), (MediaControllerServerState)state);\r
+            }
+            finally
+            {\r
+                Interop.Libc.Free(name);\r
+            }
         }
 
         /// <summary>
@@ -259,14 +284,27 @@ namespace Tizen.Multimedia.MediaController
         /// <returns>The playback state and playback position of the specific media controller server application:MediaControllerPlayback object</returns>
         /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
         /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
-        public MediaControllerPlayback GetPlayback(String serverName)
+        public MediaControllerPlayback GetPlayback(string serverName)
         {
-            IntPtr _playbackHandle = IntPtr.Zero;
+            IntPtr playbackHandle = IntPtr.Zero;
+            MediaControllerPlayback playback = null;
 
-            MediaControllerValidator.ThrowIfError(
-                Interop.MediaControllerClient.GetServerPlayback(_handle, serverName, out _playbackHandle), "Get Playback handle failed");
+            try
+            {
+                MediaControllerValidator.ThrowIfError(
+                    Interop.MediaControllerClient.GetServerPlayback(_handle, serverName, out playbackHandle), "Get Playback handle failed");
+                playback = new MediaControllerPlayback(playbackHandle);
+            }
+            finally
+            {
+                if (playbackHandle != IntPtr.Zero)\r
+                {
+                    MediaControllerValidator.ThrowIfError(
+                        Interop.MediaControllerClient.DestroyPlayback(playbackHandle), "Destroy playback failed");\r
+                }
+            }
 
-            return new MediaControllerPlayback (_playbackHandle);
+            return playback;
         }
 
         /// <summary>
@@ -275,14 +313,27 @@ namespace Tizen.Multimedia.MediaController
         /// <returns>The metadata information of the specific media controller server application:MediaControllerMetadata object</returns>
         /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
         /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
-        public MediaControllerMetadata GetMetadata(String serverName)
+        public MediaControllerMetadata GetMetadata(string serverName)
         {
-            IntPtr _metadataHandle = IntPtr.Zero;
+            IntPtr metadataHandle = IntPtr.Zero;
+            MediaControllerMetadata metadata = null;
 
-            MediaControllerValidator.ThrowIfError(
-                Interop.MediaControllerClient.GetServerMetadata(_handle, serverName, out _metadataHandle), "Get Metadata handle failed");
+            try
+            {
+                MediaControllerValidator.ThrowIfError(
+                    Interop.MediaControllerClient.GetServerMetadata(_handle, serverName, out metadataHandle), "Get Metadata handle failed");
+                metadata = new MediaControllerMetadata(metadataHandle);
+            }
+            finally
+            {\r
+                if (metadataHandle != IntPtr.Zero)\r
+                {\r
+                    MediaControllerValidator.ThrowIfError(
+                    Interop.MediaControllerClient.DestroyMetadata(metadataHandle), "Destroy metadata failed");\r
+                }
+            }
 
-            return new MediaControllerMetadata (_metadataHandle);
+            return metadata;
         }
 
         /// <summary>
@@ -291,14 +342,14 @@ namespace Tizen.Multimedia.MediaController
         /// <returns>The shuffle mode of the specific media controller server application:MediaControllerShuffleMode enum</returns>
         /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
         /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
-        public MediaControllerShuffleMode GetShuffleMode(String serverName)
+        public MediaControllerShuffleMode GetShuffleMode(string serverName)
         {
-            MediaControllerShuffleMode _shuffleMode = MediaControllerShuffleMode.Off;
+            MediaControllerShuffleMode shuffleMode = MediaControllerShuffleMode.Off;
 
             MediaControllerValidator.ThrowIfError(
-                Interop.MediaControllerClient.GetServerShuffleMode(_handle, serverName, out _shuffleMode), "Get ShuffleMode failed");
+                Interop.MediaControllerClient.GetServerShuffleMode(_handle, serverName, out shuffleMode), "Get ShuffleMode failed");
 
-            return _shuffleMode;
+            return shuffleMode;
         }
 
         /// <summary>
@@ -307,14 +358,14 @@ namespace Tizen.Multimedia.MediaController
         /// <returns>The repeat mode of the specific media controller server application:MediaControllerRepeatMode enum</returns>
         /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
         /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
-        public MediaControllerRepeatMode GetRepeatMode(String serverName)
+        public MediaControllerRepeatMode GetRepeatMode(string serverName)
         {
-            MediaControllerRepeatMode _repeatMode = MediaControllerRepeatMode.Off;
+            MediaControllerRepeatMode repeatMode = MediaControllerRepeatMode.Off;
 
             MediaControllerValidator.ThrowIfError(
-                Interop.MediaControllerClient.GetServerRepeatMode(_handle, serverName, out _repeatMode), "Get RepeatMode failed");
+                Interop.MediaControllerClient.GetServerRepeatMode(_handle, serverName, out repeatMode), "Get RepeatMode failed");
 
-            return _repeatMode;
+            return repeatMode;
         }
 
         /// <summary>
@@ -396,9 +447,9 @@ namespace Tizen.Multimedia.MediaController
 
         private void RegisterServerUpdatedEvent()
         {
-            _serverUpdatedCallback = (string serverName, MediaControllerServerState serverState, IntPtr userData) =>
+            _serverUpdatedCallback = (IntPtr serverName, MediaControllerServerState serverState, IntPtr userData) =>
             {
-                ServerUpdatedEventArgs eventArgs = new ServerUpdatedEventArgs(serverName, serverState);
+                ServerUpdatedEventArgs eventArgs = new ServerUpdatedEventArgs(Marshal.PtrToStringAnsi(serverName), serverState);
                 _serverUpdated?.Invoke(this, eventArgs);
             };
             Interop.MediaControllerClient.SetServerUpdatedCb(_handle, _serverUpdatedCallback, IntPtr.Zero);
@@ -411,9 +462,9 @@ namespace Tizen.Multimedia.MediaController
 
         private void RegisterPlaybackUpdatedEvent()
         {
-            _playbackUpdatedCallback = (string serverName, IntPtr playback, IntPtr userData) =>
+            _playbackUpdatedCallback = (IntPtr serverName, IntPtr playback, IntPtr userData) =>
             {
-                PlaybackUpdatedEventArgs eventArgs = new PlaybackUpdatedEventArgs(serverName, playback);
+                PlaybackUpdatedEventArgs eventArgs = new PlaybackUpdatedEventArgs(Marshal.PtrToStringAnsi(serverName), playback);
                 _playbackUpdated?.Invoke(this, eventArgs);
             };
             Interop.MediaControllerClient.SetPlaybackUpdatedCb(_handle, _playbackUpdatedCallback, IntPtr.Zero);
@@ -426,9 +477,9 @@ namespace Tizen.Multimedia.MediaController
 
         private void RegisterMetadataUpdatedEvent()
         {
-            _metadataUpdatedCallback = (string serverName, IntPtr metadata, IntPtr userData) =>
+            _metadataUpdatedCallback = (IntPtr serverName, IntPtr metadata, IntPtr userData) =>
             {
-                MetadataUpdatedEventArgs eventArgs = new MetadataUpdatedEventArgs(serverName, metadata);
+                MetadataUpdatedEventArgs eventArgs = new MetadataUpdatedEventArgs(Marshal.PtrToStringAnsi(serverName), metadata);
                 _metadataUpdated?.Invoke(this, eventArgs);
             };
             Interop.MediaControllerClient.SetMetadataUpdatedCb(_handle, _metadataUpdatedCallback, IntPtr.Zero);
@@ -441,9 +492,9 @@ namespace Tizen.Multimedia.MediaController
 
         private void RegisterShuffleModeUpdatedEvent()
         {
-            _shufflemodeUpdatedCallback = (string serverName, MediaControllerShuffleMode shuffleMode, IntPtr userData) =>
+            _shufflemodeUpdatedCallback = (IntPtr serverName, MediaControllerShuffleMode shuffleMode, IntPtr userData) =>
             {
-                ShuffleModeUpdatedEventArgs eventArgs = new ShuffleModeUpdatedEventArgs(serverName, shuffleMode);
+                ShuffleModeUpdatedEventArgs eventArgs = new ShuffleModeUpdatedEventArgs(Marshal.PtrToStringAnsi(serverName), shuffleMode);
                 _shufflemodeUpdated?.Invoke(this, eventArgs);
             };
 
@@ -459,9 +510,9 @@ namespace Tizen.Multimedia.MediaController
 
         private void RegisterRepeatModeUpdatedEvent()
         {
-            _repeatmodeUpdatedCallback = (string serverName, MediaControllerRepeatMode repeatMode, IntPtr userData) =>
+            _repeatmodeUpdatedCallback = (IntPtr serverName, MediaControllerRepeatMode repeatMode, IntPtr userData) =>
             {
-                RepeatModeUpdatedEventArgs eventArgs = new RepeatModeUpdatedEventArgs(serverName, repeatMode);
+                RepeatModeUpdatedEventArgs eventArgs = new RepeatModeUpdatedEventArgs(Marshal.PtrToStringAnsi(serverName), repeatMode);
                 _repeatmodeUpdated?.Invoke(this, eventArgs);
             };
 
@@ -479,9 +530,9 @@ namespace Tizen.Multimedia.MediaController
         {
             List<string> subscribedServerCollections = new List<string>();
 
-            Interop.MediaControllerClient.SubscribedServerCallback serverCallback = (string serverName, IntPtr userData) =>
+            Interop.MediaControllerClient.SubscribedServerCallback serverCallback = (IntPtr serverName, IntPtr userData) =>
             {
-                subscribedServerCollections.Add (serverName);
+                subscribedServerCollections.Add(Marshal.PtrToStringAnsi(serverName));
                 return true;
             };
 
@@ -496,9 +547,9 @@ namespace Tizen.Multimedia.MediaController
         {
             List<string> activatedServerCollections = new List<string>();
 
-            Interop.MediaControllerClient.ActivatedServerCallback serverCallback = (string serverName, IntPtr userData) =>
+            Interop.MediaControllerClient.ActivatedServerCallback serverCallback = (IntPtr serverName, IntPtr userData) =>
             {
-                activatedServerCollections.Add(serverName);\r
+                activatedServerCollections.Add(Marshal.PtrToStringAnsi(serverName));\r
                 return true;
             };
 
index 2f8d584..90eb187 100755 (executable)
@@ -32,74 +32,24 @@ namespace Tizen.Multimedia.MediaController
             // Do nothing
         }
 
-        internal MediaControllerMetadata(IntPtr _handle) {
-            string _title;
-            string _artist;
-            string _album;
-            string _author;
-            string _genre;
-            string _duration;
-            string _date;
-            string _copyright;
-            string _description;
-            string _track_number;
-            string _picture;
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Title, out _title),
-                    "Get Title failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Artist, out _artist),
-                    "Get Artist failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Album, out _album),
-                    "Get Album failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Author, out _author),
-                    "Get Author failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Genre, out _genre),
-                    "Get Genre failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Duration, out _duration),
-                    "Get Duration failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Date, out _date),
-                    "Get Date failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Copyright, out _copyright),
-                    "Get Copyright failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Description, out _description),
-                    "Get Description failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.TrackNumber, out _track_number),
-                    "Get TrackNumber failed");
-
-            MediaControllerValidator.ThrowIfError(
-                    Interop.MediaControllerClient.GetMetadata(_handle, MediaControllerAttributes.Picture, out _picture),
-                    "Get Picture failed");
-
-            Title = _title;
-            Artist = _artist;
-            Album = _album;
-            Author = _author;
-            Genre = _genre;
-            Duration = _duration;
-            Date = _date;
-            Copyright = _copyright;
-            Description = _description;
-            TrackNumber = _track_number;
-            Picture = _picture;
+        internal MediaControllerMetadata(IntPtr handle)
+        {
+            if (handle == IntPtr.Zero)
+            {
+                throw new InvalidOperationException("MediaControllerMetadata is not valid.");
+            }
+
+            Title = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Title);
+            Artist = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Artist);
+            Album = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Album);
+            Author = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Author);
+            Genre = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Genre);
+            Duration = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Duration);
+            Date = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Date);
+            Copyright = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Copyright);
+            Description = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Description);
+            TrackNumber = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.TrackNumber);
+            Picture = Interop.MediaControllerClient.GetMetadata(handle, MediaControllerAttributes.Picture);
         }
 
         /// <summary>
index 3fc10f9..b2e3a6c 100755 (executable)
@@ -27,20 +27,33 @@ namespace Tizen.Multimedia.MediaController
         /// <summary>
         /// The constructor of MediaControllerPlayback class.
         /// </summary>
-        public MediaControllerPlayback(MediaControllerPlaybackState state, ulong position) {
+        /// <param name="state">
+        /// The state of the playback which is playing in MediaConttoller server application
+        /// </param>
+        /// <param name="position">
+        /// The position of the playback which is playing in MediaConttoller server application
+        /// </param>
+        public MediaControllerPlayback(MediaControllerPlaybackState state, ulong position)
+        {
             State = state;
             Position = position;
         }
 
-        internal MediaControllerPlayback(IntPtr _handle) {
+        internal MediaControllerPlayback(IntPtr handle)
+        {
             MediaControllerPlaybackState state = MediaControllerPlaybackState.None;
             ulong position = 0L;
 
+            if (handle == IntPtr.Zero)
+            {
+                throw new InvalidOperationException("MediaControllerPlayback is not valid.");
+            }
+
             MediaControllerValidator.ThrowIfError(
-                Interop.MediaControllerClient.GetPlaybackState(_handle, out state), "Get Playback state failed");
+                Interop.MediaControllerClient.GetPlaybackState(handle, out state), "Get Playback state failed");
 
             MediaControllerValidator.ThrowIfError(
-                Interop.MediaControllerClient.GetPlaybackPosition(_handle, out position), "Get Playback position failed");
+                Interop.MediaControllerClient.GetPlaybackPosition(handle, out position), "Get Playback position failed");
 
             State = state;
             Position = position;
index 6870b2a..cfd2ecb 100755 (executable)
@@ -15,6 +15,7 @@
 */
 
 using System;
+using System.Runtime.InteropServices;
 using Tizen.Applications;
 
 namespace Tizen.Multimedia.MediaController
@@ -39,18 +40,23 @@ namespace Tizen.Multimedia.MediaController
         private EventHandler<CustomCommandEventArgs> _customCommand;
         private Interop.MediaControllerServer.CustomCommandRecievedCallback _customCommandCallback;
 
+        private bool IsValidHandle
+        {
+            get { return (this._handle != IntPtr.Zero); }
+        }
+
         /// <summary>
         /// The constructor of MediaControllerServer class.
         /// </summary>
         /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
         /// <exception cref="UnauthorizedAccessException">Thrown when the access is denied for media controller client</exception>
-        public MediaControllerServer ()
+        public MediaControllerServer()
         {
             MediaControllerValidator.ThrowIfError(
                 Interop.MediaControllerServer.Create(out _handle), "Create  server failed");
         }
 
-        ~MediaControllerServer ()
+        ~MediaControllerServer()
         {
             Dispose(false);
         }
@@ -63,17 +69,19 @@ namespace Tizen.Multimedia.MediaController
 
         protected virtual void Dispose(bool disposing)
         {
-            if(!_disposed)
+            if (!_disposed)
             {
-                if(disposing)
+                if (disposing)
                 {
                     // To be used if there are any other disposable objects
                 }
-                if(_handle != IntPtr.Zero)
+
+                if (IsValidHandle)
                 {
                     Interop.MediaControllerServer.Destroy(_handle);
                     _handle = IntPtr.Zero;
                 }
+
                 _disposed = true;
             }
         }
@@ -85,17 +93,19 @@ namespace Tizen.Multimedia.MediaController
         {
             add
             {
-                if(_playbackCommand == null)
+                if (_playbackCommand == null)
                 {
                     RegisterPlaybackCmdRecvEvent();
                 }
+
                 _playbackCommand += value;
 
             }
+
             remove
             {
                 _playbackCommand -= value;
-                if(_playbackCommand == null)
+                if (_playbackCommand == null)
                 {
                     UnregisterPlaybackCmdRecvEvent();
                 }
@@ -109,17 +119,19 @@ namespace Tizen.Multimedia.MediaController
         {
             add
             {
-                if(_customCommand == null)
+                if (_customCommand == null)
                 {
                     RegisterCustomCommandEvent();
                 }
+
                 _customCommand += value;
 
             }
+
             remove
             {
                 _customCommand -= value;
-                if(_customCommand == null)
+                if (_customCommand == null)
                 {
                     UnregisterCustomCommandEvent();
                 }
@@ -223,7 +235,7 @@ namespace Tizen.Multimedia.MediaController
         /// Send reply for command from server to client </summary>
         /// <param name="clientName"> client name to recieve reply  </param>
         /// <param name="result"> result to run command  </param>
-        /// <param name="bundleData"> Bundle data  </param>
+        /// <param name="bundle"> Bundle to send various data  </param>
         /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
         /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
         public void SendCustomCommandReply(string clientName, int result, Bundle bundle)
@@ -234,9 +246,9 @@ namespace Tizen.Multimedia.MediaController
 
         private void RegisterPlaybackCmdRecvEvent()
         {
-            _playbackCommandCallback = (string clientName, MediaControllerPlaybackState state, IntPtr userData) =>
+            _playbackCommandCallback = (IntPtr clientName, MediaControllerPlaybackState state, IntPtr userData) =>
             {
-                PlaybackStateCommandEventArgs eventArgs = new PlaybackStateCommandEventArgs(clientName, state);
+                PlaybackStateCommandEventArgs eventArgs = new PlaybackStateCommandEventArgs(Marshal.PtrToStringAnsi(clientName), state);
                 _playbackCommand?.Invoke(this, eventArgs);
             };
             Interop.MediaControllerServer.SetPlaybackStateCmdRecvCb(_handle, _playbackCommandCallback, IntPtr.Zero);
@@ -249,13 +261,13 @@ namespace Tizen.Multimedia.MediaController
 
         private void RegisterCustomCommandEvent()
         {
-            _customCommandCallback = (string clientName, string command, IntPtr bundle, IntPtr userData) =>
+            _customCommandCallback = (IntPtr clientName, IntPtr command, IntPtr bundle, IntPtr userData) =>
             {
-                SafeBundleHandle bundleHandle = new SafeBundleHandle(bundle, true);
-                Applications.Bundle _bundle = new Bundle(bundleHandle);
-                CustomCommandEventArgs eventArgs = new CustomCommandEventArgs(clientName, command, _bundle);
+                SafeBundleHandle safeBundleHandle = new SafeBundleHandle(bundle, true);
+                Bundle bundleData = new Bundle(safeBundleHandle);
+                CustomCommandEventArgs eventArgs = new CustomCommandEventArgs(Marshal.PtrToStringAnsi(clientName), Marshal.PtrToStringAnsi(command), bundleData);
                 _customCommand?.Invoke(this, eventArgs);
-            };
+        };
             Interop.MediaControllerServer.SetCustomCmdRecvCb(_handle, _customCommandCallback, IntPtr.Zero);
         }
 
index fb23f3d..d2f50e1 100755 (executable)
@@ -27,10 +27,10 @@ namespace Tizen.Multimedia.MediaController
     /// </remarks>
     public class MetadataUpdatedEventArgs : EventArgs
     {
-        internal MetadataUpdatedEventArgs (string name, IntPtr handle)
+        internal MetadataUpdatedEventArgs(string name, IntPtr handle)
         {
             ServerName = name;
-            Metadata = new MediaControllerMetadata (handle);
+            Metadata = new MediaControllerMetadata(handle);
         }
 
         /// <summary>
index 934278c..a1fde84 100755 (executable)
@@ -27,7 +27,7 @@ namespace Tizen.Multimedia.MediaController
     /// </remarks>
     public class PlaybackStateCommandEventArgs : EventArgs
     {
-        internal PlaybackStateCommandEventArgs (string name, MediaControllerPlaybackState state)
+        internal PlaybackStateCommandEventArgs(string name, MediaControllerPlaybackState state)
         {
             ClientName = name;
             State = state;
index c1da270..2904a1d 100755 (executable)
@@ -27,10 +27,10 @@ namespace Tizen.Multimedia.MediaController
     /// </remarks>
     public class PlaybackUpdatedEventArgs : EventArgs
     {
-        internal PlaybackUpdatedEventArgs (string name, IntPtr handle)
+        internal PlaybackUpdatedEventArgs(string name, IntPtr handle)
         {
             ServerName = name;
-            PlaybackInfo = new MediaControllerPlayback (handle);
+            PlaybackInfo = new MediaControllerPlayback(handle);
         }
 
         /// <summary>
index c725357..9f5b96d 100755 (executable)
@@ -27,7 +27,7 @@ namespace Tizen.Multimedia.MediaController
     /// </remarks>
     public class RepeatModeUpdatedEventArgs : EventArgs
     {
-        internal RepeatModeUpdatedEventArgs (string name, MediaControllerRepeatMode mode)
+        internal RepeatModeUpdatedEventArgs(string name, MediaControllerRepeatMode mode)
         {
             ServerName = name;
             RepeatMode = mode;
index 6baca4c..4b9e36e 100755 (executable)
@@ -29,7 +29,7 @@ namespace Tizen.Multimedia.MediaController
     {
         internal ServerUpdatedEventArgs(string name, MediaControllerServerState state)
         {
-            ServerInfo = new ServerInformation (name, state);
+            ServerInfo = new ServerInformation(name, state);
         }
 
         /// <summary>
index cbfd4b9..7c21636 100755 (executable)
@@ -27,7 +27,7 @@ namespace Tizen.Multimedia.MediaController
     /// </remarks>
     public class ShuffleModeUpdatedEventArgs : EventArgs
     {
-        internal ShuffleModeUpdatedEventArgs (string name, MediaControllerShuffleMode mode)
+        internal ShuffleModeUpdatedEventArgs(string name, MediaControllerShuffleMode mode)
         {
             ServerName = name;
             ShuffleMode = mode;