Update snapshot(2017-12-14)
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderResource.c
index 85239a1..494b670 100644 (file)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "NSProviderResource.h"
+#include <string.h>
+#include "rd_client.h"
 
-char* NSType = "oic.r.notification";
-char* NSMessageType = "oic.r.notification.message";
-char* NSSyncType = "oic.r.notification.sync";
-
-char* NSInterface = "oic.if.baseline";
-char* NSMessgeInterface = "oic.if.baseline.message";
-char* NSSyncInterface = "oic.if.baseline.sync";
+NSNotificationResource NotificationResource;
+NSMessageResource NotificationMessageResource;
+NSSyncResource NotificationSyncResource;
+NSTopicResource NotificationTopicResource;
 
-char* NSUri = "/notification";
-char* NSMessageUri = "/notification/message";
-char* NSSyncUri = "/notification/sync";
+#if (defined WITH_CLOUD)
+#define DEFAULT_CONTEXT_VALUE 0x99
 
-/* Structure to represent notification resources */
-typedef struct
+OCStackApplicationResult NSHandlePublishCb(void *ctx, OCDoHandle handle,
+    OCClientResponse *clientResponse)
 {
-    OCResourceHandle handle;
-    int accepter;
-    char* message_uri;
-    char* sync_uri;
-} NSNotificationResource;
+    (void) handle;
+    if (ctx != (void *)DEFAULT_CONTEXT_VALUE)
+    {
+        NS_LOG(DEBUG, "Invalid Publish callback received");
+    }
 
-typedef struct
-{
-    OCResourceHandle handle;
-    char* id;
-    char* title;
-    char* body;
-} NSMessageResource;
+    NS_LOG_V(DEBUG, "Publish resource response received code: %d", clientResponse->result);
+
+    return OC_STACK_KEEP_TRANSACTION;
+}
 
-typedef struct
+NSResult NSPublishResourceToCloud(char *serverAddress)
 {
-    OCResourceHandle handle;
-    char* id;
-    char* state;
-    NSDevice device;
-} NSSyncResource;
+    NS_LOG(DEBUG, "NSPublishResourceToCloud - IN");
+    NS_LOG_V(INFO_PRIVATE, "Remote Server Address: %s", serverAddress);
 
-NSNotificationResource NotificationResource;
-NSMessageResource NotificationMessageResource;
-NSSyncResource NotificationSyncResource;
+    OCCallbackData cbData;
+    cbData.cb = NSHandlePublishCb;
+    cbData.context = (void *)DEFAULT_CONTEXT_VALUE;
+    cbData.cd = NULL;
+
+    OCResourceHandle resourceHandles[1] = { NotificationResource.handle };
+    OCStackResult res = OCRDPublish(NULL, serverAddress, CT_ADAPTER_TCP, resourceHandles, 1,
+            &cbData, OC_LOW_QOS);
+
+    if (res != OC_STACK_OK)
+    {
+        NS_LOG_V(DEBUG, "Unable to publish resources to cloud: %d", res);
+    }
+
+    NS_LOG(DEBUG, "NSPublishResourceToCloud - OUT");
+    return NS_OK;
+}
+#endif
 
 NSResult NSCreateResource(char *uri)
 {
     NS_LOG(DEBUG, "NSCreateResource - IN");
+
     if (!uri)
     {
-        OIC_LOG(ERROR, RESOURCE_TAG, "Resource URI cannot be NULL");
-        NS_LOG(NS_ERROR, "Resource URI cannot be NULL");
+        NS_LOG(ERROR, "Resource URI cannot be NULL");
         return NS_ERROR;
     }
 
-    if (strcmp(uri, NSUri) == 0)
-    {
+    uint8_t resourceProperties;
 
-        NotificationResource.accepter = 0;
-        NotificationResource.message_uri = NSMessageUri;
-        NotificationResource.sync_uri = NSSyncUri;
+    if (strcmp(uri, NS_ROOT_URI) == 0)
+    {
+        NotificationResource.policy = true;
+        (NotificationResource.providerId)[0] = '\0';
+        NotificationResource.message_uri = NS_COLLECTION_MESSAGE_URI;
+        NotificationResource.sync_uri = NS_COLLECTION_SYNC_URI;
+        NotificationResource.topic_uri = NS_COLLECTION_TOPIC_URI;
+        NotificationResource.version = VERSION;
         NotificationResource.handle = NULL;
 
-        if (OCCreateResource(&NotificationResource.handle, NSType, NSInterface, NSUri,
-                NSEntityHandlerNotificationCb, NULL, OC_DISCOVERABLE) != OC_STACK_OK)
+        if (NSGetResourceSecurity())
+        {
+            NS_LOG(DEBUG, "Create secured resource");
+            resourceProperties = OC_DISCOVERABLE | OC_SECURE;
+        }
+        else
+        {
+            resourceProperties = OC_DISCOVERABLE;
+        }
+
+        if (OCCreateResource(&NotificationResource.handle, NS_ROOT_TYPE, NS_INTERFACE_BASELINE,
+                NS_ROOT_URI, NSEntityHandlerNotificationCb, NULL,
+                resourceProperties) != OC_STACK_OK)
+        {
+            NS_LOG(ERROR, "Fail to Create Notification Resource");
+            return NS_ERROR;
+        }
+
+        if (OCBindResourceInterfaceToResource(NotificationResource.handle, NS_INTERFACE_READ)
+            != OC_STACK_OK)
         {
-            OIC_LOG(ERROR, RESOURCE_TAG, PCF("Fail to Create Notification Resource"));
-            NS_LOG(NS_ERROR, "Fail to Create Notification Resource");
+            NS_LOG(ERROR, "Fail to bind Notification Resource Type");
             return NS_ERROR;
         }
     }
-    else if (strcmp(uri, NSMessageUri) == 0)
+    else if (strcmp(uri, NS_COLLECTION_MESSAGE_URI) == 0)
     {
 
-        NotificationMessageResource.id = NULL;
+        NotificationMessageResource.messageId = 0;
+
+        (NotificationMessageResource.providerId)[0] = '\0';
+        NotificationMessageResource.type = 0;
+        NotificationMessageResource.dateTime = NULL;
+        NotificationMessageResource.ttl = 0;
         NotificationMessageResource.title = NULL;
-        NotificationMessageResource.body = NULL;
-        NotificationMessageResource.handle = NULL;
+        NotificationMessageResource.contentText = NULL;
+        NotificationMessageResource.sourceName = NULL;
+        NotificationMessageResource.topicName = NULL;
+        NotificationMessageResource.mediaContents = NULL;
+
+        if (NSGetResourceSecurity())
+        {
+            NS_LOG(DEBUG, "Create secured resource");
+            resourceProperties = OC_OBSERVABLE | OC_SECURE;
+        }
+        else
+        {
+            resourceProperties = OC_OBSERVABLE;
+        }
+
+        if (OCCreateResource(&NotificationMessageResource.handle, NS_COLLECTION_MESSAGE_TYPE,
+                NS_INTERFACE_BASELINE, NS_COLLECTION_MESSAGE_URI, NSEntityHandlerMessageCb, NULL,
+                resourceProperties) != OC_STACK_OK)
+        {
+            NS_LOG(ERROR, "Fail to Create Notification Message Resource");
+            return NS_ERROR;
+        }
 
-        if (OCCreateResource(&NotificationMessageResource.handle, NSMessageType, NSInterface,
-                NSMessageUri, NSEntityHandlerMessageCb, NULL, OC_OBSERVABLE) != OC_STACK_OK)
+        if (OCBindResourceInterfaceToResource(NotificationMessageResource.handle, NS_INTERFACE_READ)
+            != OC_STACK_OK)
         {
-            OIC_LOG(ERROR, RESOURCE_TAG, PCF("Fail to Create Notification Message Resource"));
-            NS_LOG(NS_ERROR, "Fail to Create Notification Message Resource");
+            NS_LOG(ERROR, "Fail to bind Notification Message Resource Type");
             return NS_ERROR;
         }
     }
-    else if (strcmp(uri, NSSyncUri) == 0)
+    else if (strcmp(uri, NS_COLLECTION_SYNC_URI) == 0)
     {
-        NotificationSyncResource.id = NULL;
+        NotificationSyncResource.messageId = 0;
+        (NotificationSyncResource.providerId)[0] = '\0';
         NotificationSyncResource.state = NULL;
-        memset(&NotificationSyncResource.device, 0, sizeof(NSDevice));
         NotificationSyncResource.handle = NULL;
 
-        if (OCCreateResource(&(NotificationSyncResource.handle), NSSyncType, NSInterface, NSSyncUri,
-                NSEntityHandlerSyncCb, NULL, OC_OBSERVABLE) != OC_STACK_OK)
+        if (NSGetResourceSecurity())
+        {
+            NS_LOG(DEBUG, "Create secured resource");
+            resourceProperties = OC_OBSERVABLE | OC_SECURE;
+        }
+        else
+        {
+            resourceProperties = OC_OBSERVABLE;
+        }
+
+        if (OCCreateResource(&(NotificationSyncResource.handle), NS_COLLECTION_SYNC_TYPE,
+                NS_INTERFACE_BASELINE, NS_COLLECTION_SYNC_URI, NSEntityHandlerSyncCb, NULL,
+                resourceProperties) != OC_STACK_OK)
         {
-            OIC_LOG(ERROR, RESOURCE_TAG, PCF("Fail to Create Notification Sync Resource"));
-            NS_LOG(NS_ERROR, "Fail to Create Notification Sync Resource");
+            NS_LOG(ERROR, "Fail to Create Notification Sync Resource");
+            return NS_ERROR;
+        }
+
+        if (OCBindResourceInterfaceToResource(NotificationSyncResource.handle,
+                NS_INTERFACE_READWRITE)
+            != OC_STACK_OK)
+        {
+            NS_LOG(ERROR, "Fail to bind Notification Sync Resource Type");
+            return NS_ERROR;
+        }
+    }
+    else if (strcmp(uri, NS_COLLECTION_TOPIC_URI) == 0)
+    {
+        (NotificationTopicResource.providerId)[0] = '\0';
+        (NotificationTopicResource.consumerId)[0] = '\0';
+        NotificationTopicResource.TopicList = NULL;
+        NotificationTopicResource.handle = NULL;
+
+        if (NSGetResourceSecurity())
+        {
+            NS_LOG(DEBUG, "Create secured resource");
+            resourceProperties = OC_RES_PROP_NONE | OC_SECURE;
+        }
+        else
+        {
+            resourceProperties = OC_RES_PROP_NONE;
+        }
+
+        if (OCCreateResource(&(NotificationTopicResource.handle), NS_COLLECTION_TOPIC_TYPE,
+                NS_INTERFACE_BASELINE, NS_COLLECTION_TOPIC_URI, NSEntityHandlerTopicCb, NULL,
+                resourceProperties) != OC_STACK_OK)
+        {
+            NS_LOG(ERROR, "Fail to Create Notification Sync Resource");
+            return NS_ERROR;
+        }
+
+        if (OCBindResourceInterfaceToResource(NotificationTopicResource.handle,
+                NS_INTERFACE_READWRITE)
+            != OC_STACK_OK)
+        {
+            NS_LOG(ERROR, "Fail to bind Notification Topic Resource Type");
             return NS_ERROR;
         }
     }
     else
     {
-        OIC_LOG(ERROR, RESOURCE_TAG, PCF("Fail to create resource with invalid URI"));
-        NS_LOG(DEBUG, "Fail to create resource with invalid URI");
+        NS_LOG(ERROR, "Fail to create resource with invalid URI");
         return NS_ERROR;
     }
 
@@ -131,41 +233,54 @@ NSResult NSCreateResource(char *uri)
 
 NSResult NSRegisterResource()
 {
-    OIC_LOG(INFO, RESOURCE_TAG, "NSRegisterResource");
     NS_LOG(DEBUG, "NSRegisterResource - IN");
 
-    if (NSCreateResource(NSSyncUri) != NS_OK)
-    {
-        OIC_LOG(ERROR, RESOURCE_TAG, PCF("Fail to register Sync Resource"));
-        NS_LOG(DEBUG, "Fail to register Sync Resource");
-        return NS_ERROR;
-    }
-
-    if (NSCreateResource(NSMessageUri) != NS_OK)
-    {
-        OIC_LOG(ERROR, RESOURCE_TAG, PCF("Fail to register Message Resource"));
-        NS_LOG(DEBUG, "Fail to register Message Resource");
-        return NS_ERROR;
-    }
-
-    if (NSCreateResource(NSUri) != NS_OK)
-    {
-        OIC_LOG(ERROR, RESOURCE_TAG, PCF("Fail to register Notification Resource"));
-        NS_LOG(DEBUG, "Fail to register Notification Resource");
-        return NS_ERROR;
-    }
+    NS_CREATE_RESOURCE(
+            NSCreateResource(NS_COLLECTION_TOPIC_URI), "Fail to register Topic Resource");
+    NS_CREATE_RESOURCE(
+            NSCreateResource(NS_COLLECTION_SYNC_URI), "Fail to register Sync Resource");
+    NS_CREATE_RESOURCE(
+            NSCreateResource(NS_COLLECTION_MESSAGE_URI), "Fail to register Message Resource");
+    NS_CREATE_RESOURCE(
+            NSCreateResource(NS_ROOT_URI), "Fail to register Notification Resource");
 
     NS_LOG(DEBUG, "NSRegisterResource - OUT");
     return NS_OK;
 }
 
-NSResult NSPutNotificationResource(int accepter, OCResourceHandle * handle)
+NSResult NSUnRegisterResource()
+{
+    NS_LOG(DEBUG, "NSUnRegisterResource - IN");
+
+    NS_DELETE_RESOURCE(
+            OCDeleteResource(NotificationResource.handle), "Fail to Delete Notification Resource");
+    NS_DELETE_RESOURCE(OCDeleteResource(NotificationMessageResource.handle),
+            "Fail to Delete Notification Message Resource");
+    NS_DELETE_RESOURCE(OCDeleteResource(NotificationSyncResource.handle),
+            "Fail to Delete Notification Sync Resource");
+    NS_DELETE_RESOURCE(OCDeleteResource(NotificationTopicResource.handle),
+            "Fail to Delete Notification Topic Resource");
+
+    NotificationResource.handle = NULL;
+    NotificationMessageResource.handle = NULL;
+    NotificationSyncResource.handle = NULL;
+    NotificationTopicResource.handle = NULL;
+
+    NS_LOG(DEBUG, "NSUnRegisterResource - OUT");
+    return NS_OK;
+}
+
+NSResult NSPutNotificationResource(bool policy, OCResourceHandle * handle)
 {
     NS_LOG(DEBUG, "NSPutNotificationResource - IN");
 
-    NotificationResource.accepter = accepter;
-    NotificationResource.message_uri = NSMessageUri;
-    NotificationResource.sync_uri = NSSyncUri;
+    NotificationResource.policy = policy;
+    OICStrcpy(NotificationResource.providerId, UUID_STRING_SIZE,
+        NSGetProviderInfo()->providerId);
+    NotificationResource.message_uri = NS_COLLECTION_MESSAGE_URI;
+    NotificationResource.sync_uri = NS_COLLECTION_SYNC_URI;
+    NotificationResource.topic_uri = NS_COLLECTION_TOPIC_URI;
+    NotificationResource.version = VERSION;
 
     *handle = NotificationResource.handle;
 
@@ -175,19 +290,22 @@ NSResult NSPutNotificationResource(int accepter, OCResourceHandle * handle)
 
 NSResult NSPutMessageResource(NSMessage *msg, OCResourceHandle * handle)
 {
-    OIC_LOG(INFO, RESOURCE_TAG, "Put notification message to Resource");
     NS_LOG(DEBUG, "NSPutMessageResource - IN");
 
     if(msg != NULL)
     {
         NS_LOG(DEBUG, "NSMessage is valid");
-        NS_LOG_V(DEBUG, "msg -> mId : %s", msg->mId);
-        NS_LOG_V(DEBUG, "msg -> mTitle : %s", msg->mTitle);
-        NS_LOG_V(DEBUG, "msg -> mContentText : %s", msg->mContentText);
 
-        NotificationMessageResource.id = OICStrdup(msg->mId);
-        NotificationMessageResource.title = OICStrdup(msg->mTitle);
-        NotificationMessageResource.body = OICStrdup(msg->mContentText);
+        NotificationMessageResource.messageId = msg->messageId;
+        OICStrcpy(NotificationMessageResource.providerId, UUID_STRING_SIZE, msg->providerId);
+        NotificationMessageResource.type = msg->type;
+        NotificationMessageResource.dateTime = msg->dateTime;
+        NotificationMessageResource.ttl = msg->ttl;
+        NotificationMessageResource.title = msg->title;
+        NotificationMessageResource.contentText = msg->contentText;
+        NotificationMessageResource.sourceName = msg->sourceName;
+        NotificationMessageResource.topicName = msg->topic;
+        NotificationMessageResource.mediaContents = msg->mediaContents;
     }
     else
     {
@@ -195,14 +313,13 @@ NSResult NSPutMessageResource(NSMessage *msg, OCResourceHandle * handle)
     }
 
     *handle = NotificationMessageResource.handle;
-    NS_LOG(DEBUG, "NSPutMessageResource - OUT");
 
+    NS_LOG(DEBUG, "NSPutMessageResource - OUT");
     return NS_OK;
 }
 
-NSResult NSPutSyncResource(NSSync *sync, OCResourceHandle * handle)
+NSResult NSPutSyncResource(NSSyncInfo *sync, OCResourceHandle * handle)
 {
-    OIC_LOG(INFO, RESOURCE_TAG, "Put notification sync to Resource");
     NS_LOG(DEBUG, "NSPutSyncResource - IN");
 
     (void) sync;
@@ -213,33 +330,14 @@ NSResult NSPutSyncResource(NSSync *sync, OCResourceHandle * handle)
     return NS_OK;
 }
 
-const char* NSGetNotificationUri()
+NSResult NSPutTopicResource(NSTopicList *topicList, OCResourceHandle * handle)
 {
-    return NSUri;
-}
+    NS_LOG(DEBUG, "NSPutTopicResource - IN");
 
-const char* NSGetNotificationMessageUri()
-{
-    return NSMessageUri;
-}
-
-const char* NSGetNotificationSyncUri()
-{
-    return NSSyncUri;
-}
+    (void) topicList;
 
-NSResult NSCopyString(char** targetString, const char* sourceString)
-{
-    if (sourceString)
-    {
-        *targetString = (char *) malloc(strlen(sourceString) + 1);
+    *handle = NotificationTopicResource.handle;
 
-        if (*targetString)
-        {
-            strncpy(*targetString, sourceString, (strlen(sourceString) + 1));
-            return NS_SUCCESS;
-        }
-    }
-
-    return NS_FAIL;
+    NS_LOG(DEBUG, "NSPutTopicResource - OUT");
+    return NS_OK;
 }