X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2FTizen.Applications.Common%2FTizen.Applications%2FAppControl.cs;h=3bd02e21ef69778701eb93b34c0f1a3d3a5ec45b;hb=5efb856c61ace8ba2303355fd31c86254b4d1a91;hp=20ead07c4a3b4b4d1ae898cea325a9a911f0ca09;hpb=ba41e287e1efc9224cbb0d0fade5d3a8eaeabb4b;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git diff --git a/src/Tizen.Applications.Common/Tizen.Applications/AppControl.cs b/src/Tizen.Applications.Common/Tizen.Applications/AppControl.cs index 20ead07..3bd02e2 100755 --- a/src/Tizen.Applications.Common/Tizen.Applications/AppControl.cs +++ b/src/Tizen.Applications.Common/Tizen.Applications/AppControl.cs @@ -108,13 +108,34 @@ namespace Tizen.Applications { if (handle == null) { - throw new ArgumentNullException("handle"); + throw new ArgumentNullException(nameof(handle)); } - Interop.AppControl.ErrorCode err = Interop.AppControl.DangerousClone(out _handle, handle.DangerousGetHandle()); - if (err != Interop.AppControl.ErrorCode.None) + if (handle.IsInvalid) { - throw new InvalidOperationException("Failed to clone the appcontrol handle. Err = " + err); + throw new ArgumentNullException(nameof(handle), "handle is invalid"); + } + + bool mustRelease = false; + try + { + handle.DangerousAddRef(ref mustRelease); + Interop.AppControl.ErrorCode err = Interop.AppControl.DangerousClone(out _handle, handle.DangerousGetHandle()); + if (err != Interop.AppControl.ErrorCode.None) + { + throw new InvalidOperationException("Failed to clone the appcontrol handle. Err = " + err); + } + } + catch (ObjectDisposedException e) + { + throw new ArgumentNullException(nameof(handle), e.Message); + } + finally + { + if (mustRelease) + { + handle.DangerousRelease(); + } } } @@ -273,7 +294,9 @@ namespace Tizen.Applications /// /// /// 3 +#pragma warning disable CA1056 public string Uri +#pragma warning restore CA1056 { get { @@ -514,7 +537,7 @@ namespace Tizen.Applications { if (control == null) { - throw new ArgumentNullException("control"); + throw new ArgumentNullException(nameof(control)); } List ids = new List(); @@ -568,6 +591,37 @@ namespace Tizen.Applications } /// + /// Sends the launch request with setting timeout. + /// + /// + /// The operation is mandatory information for the launch request. + /// If the operation is not specified, AppControlOperations.Default is used by default. + /// If the operation is AppControlOperations.Default, the application ID is mandatory to explicitly launch the application.
+ /// To launch a service application, an explicit launch request with the application ID given by property ApplicationId MUST be sent.
+ /// It can set receiving timeout interval using timeout parameter. + /// If there is an error that is not related to timeout, the error is returned immediately regardless of the timeout value. + ///
+ /// The AppControl. + /// The timeout in milliseconds, the timeout range is 5000 to 30000. + /// Thrown when failed because of a null argument. + /// Thrown when failed because of an invalid operation. + /// Thrown when failed because of timeout. + /// http://tizen.org/privilege/appmanager.launch + /// + /// + /// AppControl appControl = new AppControl(); + /// appControl.ApplicationId = "org.tizen.calculator"; + /// AppControl.SendLaunchRequest(appControl, 10000); + /// + /// + /// 7.5 + [EditorBrowsable(EditorBrowsableState.Never)] + public static void SendLaunchRequest(AppControl launchRequest, uint timeout) + { + SendLaunchRequest(launchRequest, timeout, null); + } + + /// /// Sends the launch request. /// /// @@ -602,7 +656,7 @@ namespace Tizen.Applications { if (launchRequest == null) { - throw new ArgumentNullException("launchRequest"); + throw new ArgumentNullException(nameof(launchRequest)); } Interop.AppControl.ErrorCode err; @@ -648,6 +702,88 @@ namespace Tizen.Applications } /// + /// Sends the launch request with setting timeout + /// + /// + /// The operation is mandatory information for the launch request. + /// If the operation is not specified, AppControlOperations.Default is used by default. + /// If the operation is AppControlOperations.Default, the application ID is mandatory to explicitly launch the application.
+ /// To launch a service application, an explicit launch request with the application ID given by property ApplicationId MUST be sent.
+ /// It can set receiving timeout interval using timeout parameter. + /// If there is an error that is not related to timeout, the error is returned immediately regardless of the timeout value. + ///
+ /// The AppControl. + /// The timeout in milliseconds, the timeout range is 5000 to 30000. + /// The callback function to be called when the reply is delivered. + /// Thrown when failed because of the argument is invalid. + /// Thrown when the application to run is not found. + /// Thrown when the request failed to launch the application. + /// Thrown when the launch request is rejected. + /// Thrown when the memory is insufficient. + /// Thrown when the permission is denied. + /// Thrown when failed because of timeout. The timeout interval is set by timeout parameter. + /// http://tizen.org/privilege/appmanager.launch + /// + /// + /// AppControl appControl = new AppControl(); + /// appControl.ApplicationId = "org.tizen.calculator"; + /// AppControl.SendLaunchRequest(appControl, 10000, (launchRequest, replyRequest, result) => { + /// // ... + /// }); + /// + /// + /// 7.5 + [EditorBrowsable(EditorBrowsableState.Never)] + public static void SendLaunchRequest(AppControl launchRequest, uint timeout, AppControlReplyCallback replyAfterLaunching) + { + if (launchRequest == null) + { + throw new ArgumentNullException(nameof(launchRequest)); + } + + Interop.AppControl.ErrorCode err; + + if (replyAfterLaunching != null) + { + int id = 0; + lock (s_replyCallbackMaps) + { + id = s_reaustId++; + s_replyCallbackMaps[id] = replyAfterLaunching; + } + err = Interop.AppControl.SendLaunchRequestWithTimeout(launchRequest._handle, timeout, s_replyNativeCallback, (IntPtr)id); + } + else + { + err = Interop.AppControl.SendLaunchRequestWithTimeout(launchRequest._handle, timeout, null, IntPtr.Zero); + } + + if (err != Interop.AppControl.ErrorCode.None) + { + switch (err) + { + case Interop.AppControl.ErrorCode.InvalidParameter: + throw new ArgumentException("Invalid Arguments"); + case Interop.AppControl.ErrorCode.TimedOut: + throw new TimeoutException("Timed out"); + case Interop.AppControl.ErrorCode.OutOfMemory: + throw new Exceptions.OutOfMemoryException("Out-of-memory"); + case Interop.AppControl.ErrorCode.AppNotFound: + throw new Exceptions.AppNotFoundException("App(" + launchRequest.ApplicationId + ") not found. Operation(" + launchRequest.Operation + ")"); + case Interop.AppControl.ErrorCode.LaunchRejected: + throw new Exceptions.LaunchRejectedException("Launch rejected"); + case Interop.AppControl.ErrorCode.LaunchFailed: + throw new Exceptions.LaunchFailedException("Launch failed"); + case Interop.AppControl.ErrorCode.PermissionDenied: + throw new Exceptions.PermissionDeniedException("Permission denied"); + + default: + throw new Exceptions.LaunchRejectedException("Launch rejected"); + } + } + } + + /// /// Sends the terminate request to the application that is launched by AppControl. /// /// @@ -672,7 +808,7 @@ namespace Tizen.Applications { if (terminateRequest == null) { - throw new ArgumentNullException("terminateRequest"); + throw new ArgumentNullException(nameof(terminateRequest)); } Interop.AppControl.ErrorCode err; @@ -809,10 +945,128 @@ namespace Tizen.Applications } /// + /// Unsets the auto restart. + /// + /// + /// The functionality of this method only applies to the caller application. + /// This method is only available for platform level signed applications. + /// + /// Thrown when the permission is denied. + /// Thrown when the memory is insufficient. + /// Thrown when the memory is insufficient. + [EditorBrowsable(EditorBrowsableState.Never)] + public static void UnsetAutoRestart() + { + Interop.AppControl.ErrorCode err = Interop.AppControl.UnsetAutoRestart(); + if (err != Interop.AppControl.ErrorCode.None) + { + switch (err) + { + case Interop.AppControl.ErrorCode.PermissionDenied: + throw new Exceptions.PermissionDeniedException("Permission denied"); + case Interop.AppControl.ErrorCode.OutOfMemory: + throw new Exceptions.OutOfMemoryException("Out of memory"); + default: + throw new InvalidOperationException("err = " + err); + } + } + } + + /// + /// Gets all default applications. + /// + /// ApplicationIds. + /// Thrown when failed because of an invalid operation. + /// + /// + /// IEnumerable<string> applicationIds = AppControl.GetDefaultApplicationIds(); + /// if (applicationIds != null) + /// { + /// foreach (string id in applicationIds) + /// { + /// // ... + /// } + /// } + /// + /// + /// 11 + [EditorBrowsable(EditorBrowsableState.Never)] + public static IEnumerable GetDefaultApplicationIds() + { + List ids = new List(); + Interop.AppControl.DefaultApplicationCallback callback = (applicationId, userData) => + { + if (applicationId == null) + { + return false; + } + + ids.Add(applicationId); + return true; + }; + + Interop.AppControl.ErrorCode err = Interop.AppControl.ForeachDefaultApplication(callback, IntPtr.Zero); + if (err != Interop.AppControl.ErrorCode.None) + { + throw new InvalidOperationException("Failed to get default application Ids. err = " + err); + } + + return ids; + } + + /// + /// Sets the window position. + /// + /// The window position object. + /// Thrown when the argument is null. + /// Thrown when the argument is invalid. + /// Thrown when the invalid operation error occurs. + /// 11 + public void SetWindowPosition(WindowPosition windowPosition) + { + if (windowPosition == null) + { + throw new ArgumentNullException(nameof(windowPosition)); + } + + Interop.AppControl.ErrorCode err = Interop.AppControl.SetWindowPosition(this.SafeAppControlHandle, windowPosition.PositionX, windowPosition.PositionY, windowPosition.Width, windowPosition.Height); + if (err != Interop.AppControl.ErrorCode.None) + { + if (err == Interop.AppControl.ErrorCode.InvalidParameter) + { + throw new ArgumentException("Invalid arguments"); + } + else + { + throw new InvalidOperationException("err = " + err); + } + } + } + + /// + /// Gets the window position. + /// + /// The window position. + /// Thrown when the invalid operation error occurs. + /// 11 + public WindowPosition GetWindowPosition() + { + Interop.AppControl.ErrorCode err = Interop.AppControl.GetWindowPosition(this.SafeAppControlHandle, out int x, out int y, out int w, out int h); + if (err != Interop.AppControl.ErrorCode.None) + { + throw new InvalidOperationException("err = " + err); + } + + return new WindowPosition(x, y, w, h); + } + + /// /// Class for extra data. /// /// 3 +#pragma warning disable CA1034 public class ExtraDataCollection +#pragma warning restore CA1034 { private readonly SafeAppControlHandle _handle; @@ -842,11 +1096,11 @@ namespace Tizen.Applications { if (string.IsNullOrEmpty(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } if (string.IsNullOrEmpty(value)) { - throw new ArgumentNullException("value"); + throw new ArgumentNullException(nameof(value)); } Interop.AppControl.ErrorCode err = Interop.AppControl.AddExtraData(_handle, key, value); if (err != Interop.AppControl.ErrorCode.None) @@ -885,11 +1139,11 @@ namespace Tizen.Applications { if (string.IsNullOrEmpty(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } if (value == null) { - throw new ArgumentNullException("value"); + throw new ArgumentNullException(nameof(value)); } string[] valueArray = value.ToArray(); Interop.AppControl.ErrorCode err = Interop.AppControl.AddExtraDataArray(_handle, key, valueArray, valueArray.Length); @@ -1027,7 +1281,7 @@ namespace Tizen.Applications { if (string.IsNullOrEmpty(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } Interop.AppControl.GetExtraData(_handle, key, out value); if (value != null) @@ -1069,7 +1323,7 @@ namespace Tizen.Applications { if (string.IsNullOrEmpty(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } IntPtr valuePtr = IntPtr.Zero; int len = -1; @@ -1081,9 +1335,9 @@ namespace Tizen.Applications { IntPtr charArr = Marshal.ReadIntPtr(valuePtr, IntPtr.Size * i); stringList.Add(Marshal.PtrToStringAnsi(charArr)); - Interop.Libc.Free(charArr); + _ = Interop.Libc.Free(charArr); } - Interop.Libc.Free(valuePtr); + _ = Interop.Libc.Free(valuePtr); value = stringList; return true; } @@ -1112,7 +1366,7 @@ namespace Tizen.Applications { if (string.IsNullOrEmpty(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } Interop.AppControl.ErrorCode err = Interop.AppControl.RemoveExtraData(_handle, key); if (err != Interop.AppControl.ErrorCode.None) @@ -1166,7 +1420,7 @@ namespace Tizen.Applications { if (string.IsNullOrEmpty(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } bool isArray = false; Interop.AppControl.ErrorCode err = Interop.AppControl.IsExtraDataArray(_handle, key, out isArray); @@ -1181,7 +1435,7 @@ namespace Tizen.Applications { if (string.IsNullOrEmpty(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } string value = string.Empty; Interop.AppControl.ErrorCode err = Interop.AppControl.GetExtraData(_handle, key, out value); @@ -1208,7 +1462,7 @@ namespace Tizen.Applications { if (string.IsNullOrEmpty(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } IntPtr valuePtr = IntPtr.Zero; int len = -1; @@ -1237,9 +1491,9 @@ namespace Tizen.Applications { IntPtr charArr = Marshal.ReadIntPtr(valuePtr, IntPtr.Size * i); valueArray.Add(Marshal.PtrToStringAnsi(charArr)); - Interop.Libc.Free(charArr); + _ = Interop.Libc.Free(charArr); } - Interop.Libc.Free(valuePtr); + _ = Interop.Libc.Free(valuePtr); } return valueArray; }