/// <summary> /// Starts finding resources. /// </summary> /// <since_tizen> 3 </since_tizen> /// <remarks> /// <para>Sends request to find a resource of <paramref name="hostAddress" /> server with <paramref name="query" />. /// If succeeded, <see cref="ResourceFound"/> event handler will be triggered with information of the resource.</para> /// <para><paramref name="hostAddress" /> could be <see cref="MulticastAddress"/> for the IPv4 multicast.</para> /// </remarks> /// <privilege>http://tizen.org/privilege/internet</privilege> /// <privlevel>public</privlevel> /// <param name="hostAddress">The address or addressable name of the server. The address includes a protocol like coaps://.</param> /// <param name="query">The query specified as a filter for founding resources.</param> /// <returns>RequestId - An identifier for this request.</returns> /// <feature>http://tizen.org/feature/iot.ocf</feature> /// <pre>Initialize() should be called to initialize.</pre> /// <post> /// When the resource is found, <see cref="ResourceFound"/> event handler will be invoked. /// </post> /// <seealso cref="ResourceFound"/> /// <seealso cref="ResourceFoundEventArgs"/> /// <seealso cref="TimeOut"/> /// <exception cref="NotSupportedException">Thrown when the iotcon is not supported.</exception> /// <exception cref="InvalidOperationException">Thrown when the operation is invalid.</exception> /// <exception cref="UnauthorizedAccessException">Thrown when an application does not have privilege to access.</exception> /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory.</exception> /// <example><code><![CDATA[ /// EventHandler<ResourceFoundEventArgs> handler = (sender, e) => { /// Console.Log("Found resource at host address :" + e.Resource.HostAddress + ", uri :" + e.Resource.UriPath); /// } /// EventHandler<FindingErrorOccurredEventArgs> errorHandler = (sender, e) => { /// Console.Log("Found error :" + e.Error.Message); /// } /// IoTConnectivityClientManager.ResourceFound += handler; /// IoTConnectivityClientManager.FindingErrorOccurred += errorHandler; /// ResourceQuery query = new ResourceQuery(); /// query.Type = "oic.iot.door"; /// // Do not forget to remove these event handlers when they are not required any more. /// int id = IoTConnectivityClientManager.StartFindingResource(null, query); /// ]]></code></example> public static int StartFindingResource(string hostAddress, ResourceQuery query = null) { Interop.IoTConnectivity.Client.RemoteResource.ConnectivityType connectivityType = Interop.IoTConnectivity.Client.RemoteResource.ConnectivityType.Ip; IntPtr id = IntPtr.Zero; lock (s_resourceFoundCallbacksMap) { id = (IntPtr)s_requestId++; } s_resourceFoundCallbacksMap[id] = (IntPtr remoteResourceHandle, int result, IntPtr userData) => { if (ResourceFound == null) { return(false); } int requestId = (int)userData; if (result == (int)IoTConnectivityError.None) { if (remoteResourceHandle != IntPtr.Zero) { RemoteResource resource = null; try { resource = new RemoteResource(remoteResourceHandle); } catch (Exception exp) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Can't clone RemoteResource's handle: " + exp.Message); return(true); } ResourceFoundEventArgs e = new ResourceFoundEventArgs() { RequestId = requestId, EventContinue = true, Resource = resource }; ResourceFound?.Invoke(null, e); Log.Info(IoTConnectivityErrorFactory.LogTag, "e.EventContinue : " + e.EventContinue); return(e.EventContinue); } else { Log.Error(IoTConnectivityErrorFactory.LogTag, "Handle is null"); } } else { FindingErrorOccurredEventArgs e = GetFindingErrorOccurredEventArgs(requestId, result); FindingErrorOccurred?.Invoke(null, e); lock (s_resourceFoundCallbacksMap) { s_resourceFoundCallbacksMap.Remove(id); } } return(true); }; IntPtr queryHandle = (query == null) ? IntPtr.Zero : query._resourceQueryHandle; int errorCode = Interop.IoTConnectivity.Client.ResourceFinder.AddResourceFoundCb(hostAddress, (int)connectivityType, queryHandle, s_resourceFoundCallbacksMap[id], id); if (errorCode != (int)IoTConnectivityError.None) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to register resource found event handler"); lock (s_resourceFoundCallbacksMap) { s_resourceFoundCallbacksMap.Remove(id); } throw IoTConnectivityErrorFactory.GetException(errorCode); } return((int)id); }
/// <summary> /// Starts finding the platform information of remote server. /// </summary> /// <since_tizen> 3 </since_tizen> /// <remarks> /// <para>Requests server for platform information. /// If succeeded, <see cref="PlatformInformationFound" /> event handler will be triggered with information of the platform.</para> /// <para><paramref name="hostAddress" /> could be <see cref="MulticastAddress"/> for IPv4 multicast.</para> /// </remarks> /// <privilege>http://tizen.org/privilege/internet</privilege> /// <privlevel>public</privlevel> /// <param name="hostAddress">The host address of remote server.</param> /// <param name="query">The query specified as a filter for founding resources.</param> /// <returns>RequestId - An identifier for this request.</returns> /// <feature>http://tizen.org/feature/iot.ocf</feature> /// <pre>Initialize() should be called to initialize.</pre> /// <post> /// <see cref="PlatformInformationFound" /> event handler will be invoked. /// </post> /// <seealso cref="PlatformInformationFound"/> /// <seealso cref="PlatformInformationFoundEventArgs"/> /// <seealso cref="TimeOut"/> /// <exception cref="NotSupportedException">Thrown when the iotcon is not supported.</exception> /// <exception cref="InvalidOperationException">Thrown when the operation is invalid.</exception> /// <exception cref="UnauthorizedAccessException">Thrown when an application does not have privilege to access.</exception> /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory.</exception> /// <example><code><![CDATA[ /// EventHandler<PlatformInformationFoundEventArgs> handler = (sender, e) => { /// Console.Log("PlatformInformationFound :" + e.RequestId); /// } /// EventHandler<FindingErrorOccurredEventArgs> errorHandler = (sender, e) => { /// Console.Log("Found error :" + e.Error.Message); /// } /// IoTConnectivityClientManager.PlatformInformationFound += handler; /// IoTConnectivityClientManager.FindingErrorOccurred += errorHandler; /// // Do not forget to remove these event handlers when they are not required any more. /// int id = IoTConnectivityClientManager.StartFindingPlatformInformation(IoTConnectivityClientManager.MulticastAddress); /// ]]></code></example> public static int StartFindingPlatformInformation(string hostAddress, ResourceQuery query = null) { Interop.IoTConnectivity.Client.RemoteResource.ConnectivityType connectivityType = Interop.IoTConnectivity.Client.RemoteResource.ConnectivityType.Ip; IntPtr id = IntPtr.Zero; lock (s_platformInformationCallbacksMap) { id = (IntPtr)s_requestId++; } s_platformInformationCallbacksMap[id] = (IntPtr platformInfoHandle, int result, IntPtr userData) => { if (PlatformInformationFound == null) { return(false); } int requestId = (int)userData; if (result == (int)IoTConnectivityError.None) { if (platformInfoHandle != IntPtr.Zero) { PlatformInformationFoundEventArgs e = GetPlatformInformationFoundEventArgs(requestId, platformInfoHandle); if (e == null) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Can't get PlatformInformationFoundEventArgs"); return(true); } PlatformInformationFound?.Invoke(null, e); Log.Info(IoTConnectivityErrorFactory.LogTag, "e.EventContinue : " + e.EventContinue); return(e.EventContinue); } else { Log.Error(IoTConnectivityErrorFactory.LogTag, "Handle is null"); } } else { FindingErrorOccurredEventArgs e = GetFindingErrorOccurredEventArgs(requestId, result); FindingErrorOccurred?.Invoke(null, e); lock (s_platformInformationCallbacksMap) { s_platformInformationCallbacksMap.Remove(id); } } return(true); }; IntPtr queryHandle = (query == null) ? IntPtr.Zero : query._resourceQueryHandle; int errorCode = Interop.IoTConnectivity.Client.PlatformInformation.Find(hostAddress, (int)connectivityType, queryHandle, s_platformInformationCallbacksMap[id], id); if (errorCode != (int)IoTConnectivityError.None) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get platform information"); lock (s_platformInformationCallbacksMap) { s_platformInformationCallbacksMap.Remove(id); } throw IoTConnectivityErrorFactory.GetException(errorCode); } return((int)id); }
/// <summary> /// Starts receiving presence events. /// </summary> /// <since_tizen> 3 </since_tizen> /// <remarks> /// <para>Sends request to receive presence to an interested server's resource with resourceType. /// If succeeded, <see cref="PresenceReceived"/> event handler will be triggered when the server sends presence. /// A server sends presence events when adds / removes / alters a resource or start / stop presence.</para> /// <para><paramref name="hostAddress" /> could be <see cref="MulticastAddress"/> for IPv4 multicast. /// The length of <paramref name="resourceType" /> should be less than or equal to 61. /// The <paramref name="resourceType" /> must start with a lowercase alphabetic character, followed by a sequence /// of lowercase alphabetic, numeric, ".", or "-" characters, and contains no white space.</para> /// </remarks> /// <privilege>http://tizen.org/privilege/internet</privilege> /// <privlevel>public</privlevel> /// <param name="hostAddress">The address or addressable name of the server.</param> /// <param name="resourceType">A resource type that a client is interested in.</param> /// <returns>PresenceId - An identifier for this request.</returns> /// <feature>http://tizen.org/feature/iot.ocf</feature> /// <pre>Initialize() should be called to initialize.</pre> /// <post> /// When the resource receive presence, <see cref="PresenceReceived"/> event handler will be invoked.<br/> /// You must destroy presence by calling StopReceivingPresence() if presence event is no longer needed. /// </post> /// <seealso cref="IoTConnectivityServerManager.StartSendingPresence(uint)"/> /// <seealso cref="IoTConnectivityServerManager.StopSendingPresence()"/> /// <seealso cref="StopReceivingPresence(int)"/> /// <seealso cref="PresenceReceived"/> /// <exception cref="NotSupportedException">Thrown when the iotcon is not supported.</exception> /// <exception cref="ArgumentException">Thrown when there is an invalid parameter.</exception> /// <exception cref="InvalidOperationException">Thrown when the operation is invalid.</exception> /// <exception cref="UnauthorizedAccessException">Thrown when an application does not have privilege to access.</exception> /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory.</exception> /// <example><code><![CDATA[ /// EventHandler<PresenceReceivedEventArgs> handler = (sender, e) => { /// Console.Log("PresenceReceived, presence id :" + e.PresenceId); /// } /// EventHandler<FindingErrorOccurredEventArgs> errorHandler = (sender, e) => { /// Console.Log("Found error :" + e.Error.Message); /// } /// IoTConnectivityClientManager.PresenceReceived += handler; /// IoTConnectivityClientManager.FindingErrorOccurred += errorHandler; /// // Do not forget to remove these event handlers when they are not required any more. /// int id = IoTConnectivityClientManager.StartReceivingPresence(IoTConnectivityClientManager.MulticastAddress, "oic.iot.door"); /// ]]></code></example> public static int StartReceivingPresence(string hostAddress, string resourceType) { Interop.IoTConnectivity.Client.RemoteResource.ConnectivityType connectivityType = Interop.IoTConnectivity.Client.RemoteResource.ConnectivityType.Ip; if (resourceType != null && !ResourceTypes.IsValid(resourceType)) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Invalid type"); throw new ArgumentException("Invalid type"); } IntPtr id = IntPtr.Zero; lock (s_presenceCallbacksMap) { id = (IntPtr)s_presenceListenerId++; } s_presenceCallbacksMap[id] = (IntPtr presence, int result, IntPtr presenceResponseHandle, IntPtr userData) => { int presenceId = (int)userData; if (result == (int)IoTConnectivityError.None) { if (presenceResponseHandle != IntPtr.Zero) { PresenceReceivedEventArgs e = GetPresenceReceivedEventArgs(presenceId, presenceResponseHandle); if (e == null) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Can't get PresenceReceivedEventArgs"); return; } PresenceReceived?.Invoke(null, e); } else { Log.Error(IoTConnectivityErrorFactory.LogTag, "Handle is null"); return; } } else { FindingErrorOccurredEventArgs e = GetFindingErrorOccurredEventArgs(presenceId, result); FindingErrorOccurred?.Invoke(null, e); } }; IntPtr presenceHandle; int errorCode = Interop.IoTConnectivity.Client.Presence.AddPresenceCb(hostAddress, (int)connectivityType, resourceType, s_presenceCallbacksMap[id], id, out presenceHandle); if (errorCode != (int)IoTConnectivityError.None) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to register presence event handler"); lock (s_presenceCallbacksMap) { s_presenceCallbacksMap.Remove(id); } throw IoTConnectivityErrorFactory.GetException(errorCode); } lock (s_presenceHandlesMap) { s_presenceHandlesMap[id] = presenceHandle; } return((int)id); }