Updated for consumer APIs.
[contrib/iotivity.git] / service / notification / src / consumer / NSConsumerInternalTaskController.c
1 //******************************************************************
2 //
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #include "NSConstants.h"
22 #include "NSConsumerCommon.h"
23 #include "NSConsumerInternalTaskController.h"
24 #include "NSStructs.h"
25
26 #include "oic_malloc.h"
27 #include "oic_string.h"
28
29 NSCacheList ** NSGetCacheList()
30 {
31     static NSCacheList * cache = NULL;
32     return & cache;
33 }
34
35 void NSSetCacheList(NSCacheList * cache)
36 {
37     *(NSGetCacheList()) = cache;
38 }
39
40 void NSDestroyCacheList()
41 {
42     NSCacheList * cache = *(NSGetCacheList());
43     if (cache)
44     {
45         NSStorageDestroy(cache);
46     }
47 }
48
49 NSResult NSCacheUpdate(NSCacheList * cache, NSTask * task, NSConsumerMessageTypes type)
50 {
51     NSMessage_consumer * noti = (NSMessage_consumer *) task->taskData;
52     NS_VERIFY_NOT_NULL(noti, NS_ERROR);
53
54     noti->type = type;
55
56     NSCacheElement * obj = (NSCacheElement *)OICMalloc(sizeof(NSCacheElement));
57     NS_VERIFY_NOT_NULL(obj, NS_ERROR);
58
59     obj->data = (NSCacheData *) noti;
60     obj->next = NULL;
61
62     NS_LOG(DEBUG, "try to write to storage");
63     NSResult ret = NSStorageWrite(cache, obj);
64     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *) 1 : NULL,
65             NS_ERROR, NSRemoveMessage(noti));
66
67     NSRemoveMessage(noti);
68     NSOICFree(obj);
69
70     return NS_OK;
71 }
72
73 void NSConsumerHandleProviderDiscovered(NSProvider_internal * provider)
74 {
75     // TODO need to check for discovered provider is new and store provider.
76
77     if (provider->accessPolicy == NS_ACCESS_DENY)
78     {
79         NS_LOG(DEBUG, "accepter is NS_ACCEPTER_CONSUMER, Callback to user");
80         NSDiscoveredProvider((NSProvider *) provider);
81     }
82     else
83     {
84         NS_LOG(DEBUG, "accepter is NS_ACCEPTER_PROVIDER, request subscribe");
85         NSTask * task = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) provider);
86         NS_VERIFY_NOT_NULL_V(task);
87
88         NSConsumerPushEvent(task);
89     }
90 }
91
92 void NSConsumerHandleRecvSubscriptionConfirmed(NSMessage_consumer * msg)
93 {
94     NS_VERIFY_NOT_NULL_V(msg);
95
96     // TODO change to find provider using pId.
97     NSProvider * provider = NULL;
98     {
99         provider = (NSProvider *)OICMalloc(sizeof(NSProvider));
100         NS_VERIFY_NOT_NULL_V(provider);
101         OICStrcpy(provider->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, msg->providerId);
102     }
103
104     NSSubscriptionAccepted(provider);
105 }
106
107 void NSConsumerHandleRecvMessage(NSMessage_consumer * msg)
108 {
109     NS_VERIFY_NOT_NULL_V(msg);
110     // TODO store message to cache
111 //    NSResult ret = NSCacheUpdate(cache, task, Notification);
112 //    NS_VERTIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
113
114     NSMessagePost((NSMessage *) msg);
115 }
116
117 void NSConsumerHandleRecvSyncInfo(NSSyncInfo * sync)
118 {
119     NS_VERIFY_NOT_NULL_V(sync);
120
121     // TODO need to check for provider is available.
122     // TODO need to update msg list.
123 //        NSResult ret = NSPushToCache(clientResponse, taskType);
124 //        NS_VERTIFY_NOT_NULL(ret == NS_OK ? (void *)1 : NULL, OC_STACK_KEEP_TRANSACTION);
125
126     NSNotificationSync(sync);
127 }
128
129 void NSConsumerInternalTaskProcessing(NSTask * task)
130 {
131     NS_VERIFY_NOT_NULL_V(task);
132
133     NSCacheList * cache = *(NSGetCacheList());
134     if (!cache)
135     {
136         NS_LOG(DEBUG, "Cache Init");
137         cache = NSStorageCreate();
138         NS_VERIFY_NOT_NULL_V(cache);
139
140         cache->cacheType = NS_CONSUMER_CACHE_MESSAGE;
141         NSSetCacheList(cache);
142     }
143
144     NSResult ret = NS_ERROR;
145     NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
146     switch (task->taskType)
147     {
148         case TASK_CONSUMER_RECV_SUBSCRIBE_CONFIRMED:
149         {
150             NS_LOG(DEBUG, "Receive Subscribe confirm from provider.");
151             NSConsumerHandleRecvSubscriptionConfirmed((NSMessage_consumer *)task->taskData);
152             break;
153         }
154         case TASK_CONSUMER_RECV_MESSAGE:
155         {
156             NS_LOG(DEBUG, "Receive New Notification");
157             NSConsumerHandleRecvMessage((NSMessage_consumer *)task->taskData);
158
159             break;
160         }
161         case TASK_CONSUMER_PROVIDER_DISCOVERED:
162         {
163             NS_LOG(DEBUG, "Receive New Provider is discovdered.");
164             NSConsumerHandleProviderDiscovered((NSProvider_internal *)task->taskData);
165             break;
166         }
167         case TASK_RECV_SYNCINFO:
168         {
169             NS_LOG(DEBUG, "Receive SyncInfo.");
170             NSConsumerHandleRecvSyncInfo((NSSyncInfo *)task->taskData);
171             break;
172         }
173         case TASK_RECV_READ:
174         {
175             NS_LOG(DEBUG, "Receive Read Notification");
176
177             ret = NSCacheUpdate(cache, task, Read);
178             NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
179             break;
180         }
181         case TASK_RECV_DISMISS:
182         {
183             NS_LOG(DEBUG, "Receive Dismiss Notification");
184
185             ret = NSCacheUpdate(cache, task, Dismiss);
186             NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
187             break;
188         }
189         default :
190         {
191             NS_LOG(ERROR, "Unknown TASK Type");
192             return ;
193         }
194     }
195 }