1 /// Copyright 2016 by Samsung Electronics, Inc.,
3 /// This software is the confidential and proprietary information
4 /// of Samsung Electronics, Inc. ("Confidential Information"). You
5 /// shall not disclose such Confidential Information and shall use
6 /// it only in accordance with the terms of the license agreement
7 /// you entered into with Samsung.
10 using System.Collections.Generic;
11 using System.Collections.ObjectModel;
13 namespace Tizen.Network.IoTConnectivity
15 public abstract class Resource : IDisposable
17 private IntPtr _resourceHandle = IntPtr.Zero;
18 private bool _disposed = false;
19 private ObservableCollection<Resource> _children = new ObservableCollection<Resource>();
20 private IntPtr _observerHandle = IntPtr.Zero;
25 /// <param name="uri">URI of the resource</param>
26 /// <param name="types">Resource types</param>
27 /// <param name="interfaces">Resource interfaces</param>
28 /// <param name="policy">Policy input of the resoruce</param>
29 public Resource(string uri, ResourceTypes types, ResourceInterfaces interfaces, ResourcePolicy policy)
33 Interfaces = interfaces;
36 _children.CollectionChanged += ChildrenCollectionChanged;
38 int ret = Interop.IoTConnectivity.Server.Observers.Create(out _observerHandle);
39 if (ret != (int)IoTConnectivityError.None)
41 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to create obsever handle");
42 throw IoTConnectivityErrorFactory.GetException(ret);
52 /// Type details of the resource
54 public ResourceTypes Types { get; internal set; }
57 /// Interface details of the resource
59 public ResourceInterfaces Interfaces { get; internal set; }
64 public ResourcePolicy Policy { get; internal set; }
67 /// URI of the resource
69 public string UriPath { get; internal set; }
72 /// List of Child resources
74 public ICollection<Resource> Children
82 internal IntPtr ResourceHandle
86 return _resourceHandle;
90 _resourceHandle = value;
95 /// Notify the specified representation and qos.
97 /// <param name="representation">Representation.</param>
98 /// <param name="qos">Qos.</param>
99 public void Notify(Representation representation, QualityOfService qos)
101 int ret = (int)IoTConnectivityError.None;
102 ret = Interop.IoTConnectivity.Server.Resource.Notify(_resourceHandle, representation._representationHandle, _observerHandle, (int)qos);
103 if (ret != (int)IoTConnectivityError.None)
105 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to send notification");
106 throw IoTConnectivityErrorFactory.GetException(ret);
111 /// Called on the get event.
113 /// <param name="request">Request.</param>
114 public abstract Response OnGet(Request request);
117 /// Called on the put event.
119 /// <param name="request">Request.</param>
120 public abstract Response OnPut(Request request);
123 /// Called on the post event.
125 /// <param name="request">Request.</param>
126 public abstract Response OnPost(Request request);
129 /// Called on the delete event.
131 /// <param name="request">Request.</param>
132 public abstract Response OnDelete(Request request);
135 /// Called on the observing event.
137 /// <param name="request">Request.</param>
138 /// <param name="policy">Policy.</param>
139 /// <param name="observeId">Observe identifier.</param>
140 public abstract bool OnObserving(Request request, ObserveType type, int observeId);
142 public void Dispose()
145 GC.SuppressFinalize(this);
148 protected virtual void Dispose(bool disposing)
156 Interfaces.Dispose();
159 Interop.IoTConnectivity.Server.Resource.Destroy(_resourceHandle);
160 Interop.IoTConnectivity.Server.Observers.Destroy(_observerHandle);
164 // This method is used as callback for Resource
165 internal void OnRequest(IntPtr resourceHandle, IntPtr requestHandle, IntPtr userData)
167 Request request = GetRequest(requestHandle);
168 Response response = null;
172 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get Request");
179 int ret = Interop.IoTConnectivity.Server.Request.GetObserveType(requestHandle, out observeType);
180 if (ret != (int)IoTConnectivityError.None)
182 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to Get observe type");
186 if ((ObserveType)observeType != ObserveType.NoType)
189 ret = Interop.IoTConnectivity.Server.Request.GetObserveId(requestHandle, out observeId);
190 if (ret != (int)IoTConnectivityError.None)
192 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to Get observe id");
195 switch ((ObserveType)observeType)
197 case ObserveType.Register:
199 if (OnObserving(request, ObserveType.Register, observeId))
201 ret = Interop.IoTConnectivity.Server.Observers.Add(_observerHandle, observeId);
202 if (ret != (int)IoTConnectivityError.None)
204 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add observer id");
211 // If OnObserving for ObserveType.Register returns false, do not operate for Get operation after Observe operation.
215 case ObserveType.Deregister:
217 if (OnObserving(request, ObserveType.Deregister, observeId))
219 ret = Interop.IoTConnectivity.Server.Observers.Remove(_observerHandle, observeId);
220 if (ret != (int)IoTConnectivityError.None)
222 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to remove observer id");
229 // If OnObserving for ObserveType.Deregister returns false, do not operate for Get operation after Observe operation.
237 ret = Interop.IoTConnectivity.Server.Request.GetRequestType(requestHandle, out requestType);
238 if (ret != (int)IoTConnectivityError.None)
240 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to Get request type");
244 switch ((Interop.IoTConnectivity.Server.RequestType)requestType)
246 case Interop.IoTConnectivity.Server.RequestType.Put:
248 response = OnPut(request);
251 case Interop.IoTConnectivity.Server.RequestType.Get:
253 response = OnGet(request);
256 case Interop.IoTConnectivity.Server.RequestType.Post:
258 response = OnPost(request);
261 case Interop.IoTConnectivity.Server.RequestType.Delete:
263 response = OnDelete(request);
269 if (response == null)
271 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to send Response");
275 if (!response.Send(requestHandle))
277 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to send Response");
288 private Request GetRequest(IntPtr requestHandle)
291 int ret = Interop.IoTConnectivity.Server.Request.GetHostAddress(requestHandle, out hostAddress);
292 if (ret != (int)IoTConnectivityError.None)
294 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to Get host address");
298 IntPtr optionsHandle = IntPtr.Zero;
299 ret = Interop.IoTConnectivity.Server.Request.GetOptions(requestHandle, out optionsHandle);
300 if (ret != (int)IoTConnectivityError.None)
302 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to Get options");
306 IntPtr queryHandle = IntPtr.Zero;
307 ret = Interop.IoTConnectivity.Server.Request.GetQuery(requestHandle, out queryHandle);
308 if (ret != (int)IoTConnectivityError.None)
310 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to Get Query");
314 IntPtr representationHandle = IntPtr.Zero;
315 ret = Interop.IoTConnectivity.Server.Request.GetRepresentation(requestHandle, out representationHandle);
316 if (ret != (int)IoTConnectivityError.None)
318 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to Get representation");
322 ResourceOptions opts = null;
323 ResourceQuery query = null;
324 Representation representation = null;
327 opts = (optionsHandle == IntPtr.Zero) ? null : new ResourceOptions(optionsHandle);
329 catch (Exception exp)
331 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to new ResourceOptions: " + exp.Message);
337 query = (queryHandle == IntPtr.Zero) ? null : new ResourceQuery(queryHandle);
339 catch (Exception exp)
341 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to new ResourceQuery: " + exp.Message);
347 representation = (representationHandle == IntPtr.Zero) ? null : new Representation(representationHandle); ;
349 catch (Exception exp)
351 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to new Representation: " + exp.Message);
357 HostAddress = hostAddress,
360 Representation = representation
364 private void ChildrenCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs eventArgs)
366 if (eventArgs.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
368 foreach (Resource r in eventArgs.NewItems)
370 int ret = Interop.IoTConnectivity.Server.Resource.BindChildResource(_resourceHandle, r._resourceHandle);
371 if (ret != (int)IoTConnectivityError.None)
373 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to bind resource ");
374 throw IoTConnectivityErrorFactory.GetException(ret);
378 else if (eventArgs.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
380 foreach (Resource r in eventArgs.NewItems)
382 int ret = Interop.IoTConnectivity.Server.Resource.UnbindChildResource(_resourceHandle, r._resourceHandle);
383 if (ret != (int)IoTConnectivityError.None)
385 Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to unbind resource");
386 throw IoTConnectivityErrorFactory.GetException(ret);