/* * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Collections.Generic; namespace Tizen.Network.IoTConnectivity { /// /// IoT connectivity server manager consists of server side APIs. /// /// 3 public static class IoTConnectivityServerManager { private static int s_requestId = 1; private static Dictionary s_RequestHandlerCallbackMap = new Dictionary(); /// /// Initializes IoTCon. Call this API to start IoTCon. /// /// 3 /// /// @a filePath point to a file for handling secure virtual resources. /// The file that is CBOR(Concise Binary Object Representation)-format must already exist /// in @a filePath. We recommend to use application-local file for @a filePath. /// /// /// http://tizen.org/privilege/network.get \n /// http://tizen.org/privilege/internet /// /// public /// The file path to point to storage for handling secure virtual resources. /// http://tizen.org/feature/iot.ocf /// /// You must call Deinitialize() if IoTCon API is no longer needed. /// /// /// Thrown when the iotcon is not supported /// Thrown when there is an invalid parameter /// Thrown when app does not have privilege to access /// /// string filePath = "../../res/iotcon-test-svr-db-server.dat"; /// IoTConnectivityServerManager.Initialize(filePath); /// public static void Initialize(string filePath) { int ret = Interop.IoTConnectivity.Client.IoTCon.Initialize(filePath); if (ret != (int)IoTConnectivityError.None) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to initialize"); throw IoTConnectivityErrorFactory.GetException(ret); } } /// /// Deinitializes IoTCon. /// /// 3 /// /// This API must be called if IoTCon API is no longer needed. /// /// http://tizen.org/feature/iot.ocf ///
        /// Initialize() should be called to initialize.
        /// 
/// /// /// IoTConnectivityServerManager.Deinitialize(); /// public static void Deinitialize() { _resources.Clear(); s_requestId = 1; s_RequestHandlerCallbackMap.Clear(); Interop.IoTConnectivity.Client.IoTCon.Deinitialize(); } /// /// Registers a resource in IoTCon server /// /// 3 /// /// http://tizen.org/privilege/internet /// /// public /// The resource to register /// http://tizen.org/feature/iot.ocf ///
        /// Initialize() should be called to initialize.
        /// 
/// /// /// Thrown when the iotcon is not supported /// Thrown when there is an invalid parameter /// Thrown when the operation is invalid /// Thrown when there is not enough memory /// Thrown when app does not have privilege to access /// /// ResourceTypes types = new ResourceTypes(new List(){ "org.tizen.light" }); /// Attributes attributes = new Attributes { { "state", "ON" }}; /// Resource res = new LiteResource("/room/1", types, ResourcePolicy.Discoverable, attributes); /// try { /// IoTConnectivityServerManager.RegisterResource(res); /// } catch(Exception ex) { /// Console.Log("Exception caught : " + ex.Message); /// } /// public static void RegisterResource(Resource resource) { Log.Info(IoTConnectivityErrorFactory.LogTag, "..."); IntPtr id = IntPtr.Zero; lock (s_RequestHandlerCallbackMap) { id = (IntPtr)s_requestId++; } s_RequestHandlerCallbackMap[id] = (IntPtr r_resource, IntPtr request, IntPtr userData) => { int requestId = (int)userData; Log.Info(IoTConnectivityErrorFactory.LogTag, "Received s_RequestHandlerCallbackMap : " + requestId); if (request == IntPtr.Zero) { Log.Error(IoTConnectivityErrorFactory.LogTag, "request is IntPtr.Zero"); return; } resource.OnRequest(r_resource, request, userData); }; IntPtr handle = IntPtr.Zero; int errorCode = Interop.IoTConnectivity.Server.Resource.Create(resource.UriPath, resource.Types._resourceTypeHandle, resource.Interfaces.ResourceInterfacesHandle, (int)resource.Policy, s_RequestHandlerCallbackMap[id], id, out handle); if (errorCode != (int)IoTConnectivityError.None) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed create resource"); lock (s_RequestHandlerCallbackMap) { s_RequestHandlerCallbackMap.Remove(id); } throw IoTConnectivityErrorFactory.GetException(errorCode); } else { resource.ResourceHandle = handle; } _resources.Add(resource); } /// /// Unregisters a resource in IoTCon server /// /// 3 /// /// http://tizen.org/privilege/internet /// /// public /// The resource to unregister /// http://tizen.org/feature/iot.ocf ///
        /// Initialize() should be called to initialize.
        /// 
/// /// /// Thrown when the iotcon is not supported /// Thrown when app does not have privilege to access /// /// ResourceTypes types = new ResourceTypes(new List(){ "org.tizen.light" }); /// Attributes attributes = new Attributes { { "state", "ON" }}; /// Resource res = new LiteResource("/room/1", types, ResourcePolicy.Discoverable, attributes); /// IoTConnectivityServerManager.RegisterResource(res); /// try { /// IoTConnectivityServerManager.UnregisterResource(res); /// } catch(Exception ex) { /// Console.Log("Exception caught : " + ex.Message); /// } /// public static void UnregisterResource(Resource resource) { if (resource != null) { if (resource.ResourceHandle != IntPtr.Zero) { Interop.IoTConnectivity.Server.Resource.Destroy(resource.ResourceHandle); resource.ResourceHandle = IntPtr.Zero; } _resources.Remove(resource); } } /// /// Starts presence of a server /// /// 3 /// /// Use this API to send server's announcements to clients. /// Server can call this API when online for the first time or come back from offline to online.\n /// If @a time is 0, server will set default value as 60 seconds.\n /// If @a time is very big, server will set maximum value as (60 * 60 * 24) seconds, (24 hours). /// /// /// http://tizen.org/privilege/internet /// /// public /// The interval of announcing presence in seconds. /// http://tizen.org/feature/iot.ocf ///
        /// Initialize() should be called to initialize.
        /// 
/// /// /// /// /// Thrown when the iotcon is not supported /// Thrown when the operation is invalid /// Thrown when app does not have privilege to access /// /// try { /// IoTConnectivityServerManager.StartSendingPresence(120); /// } catch(Exception ex) { /// Console.Log("Exception caught : " + ex.Message); /// } /// public static void StartSendingPresence(uint time) { int ret = Interop.IoTConnectivity.Server.IoTCon.StartPresence(time); if (ret != (int)IoTConnectivityError.None) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to start presence"); throw IoTConnectivityErrorFactory.GetException(ret); } } /// /// Stops presence of a server. /// /// 3 /// /// Use this API to stop sending server's announcements to clients. /// Server can call this API when terminating, entering to offline or out of network. /// /// /// http://tizen.org/privilege/internet /// /// public /// http://tizen.org/feature/iot.ocf ///
        /// Initialize() should be called to initialize.
        /// 
/// /// /// /// /// Thrown when the iotcon is not supported /// Thrown when the operation is invalid /// Thrown when app does not have privilege to access /// /// IoTConnectivityServerManager.StopSendingPresence(); /// public static void StopSendingPresence() { int ret = Interop.IoTConnectivity.Server.IoTCon.StopPresence(); if (ret != (int)IoTConnectivityError.None) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed cancel presence"); throw IoTConnectivityErrorFactory.GetException(ret); } } /// /// Sets the device name /// /// 3 /// /// This API sets the name of the local device (the device calling the API).\n /// If the device name is set, clients can get the name using . /// /// The device name /// http://tizen.org/feature/iot.ocf /// /// /// /// Thrown when the iotcon is not supported /// Thrown when the operation is invalid /// Thrown when app does not have privilege to access /// /// IoTConnectivityServerManager.SetDeviceName("my-tizen"); /// public static void SetDeviceName(string deviceName) { int ret = Interop.IoTConnectivity.Server.IoTCon.SetDeviceName(deviceName); if (ret != (int)IoTConnectivityError.None) { Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed set device name"); throw IoTConnectivityErrorFactory.GetException(ret); } } private static List _resources = new List(); } }