[CONPRO-1473] Fix for build error [-Werror=implicit-function-declaration]
[platform/upstream/iotivity.git] / resource / csdk / stack / include / payload_logging.h
1 //******************************************************************
2 //
3 // Copyright 2015 Intel Mobile Communications GmbH 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 #ifndef PAYLOAD_LOGGING_H_
22 #define PAYLOAD_LOGGING_H_
23
24 #include "logger.h"
25 #ifdef __TIZEN__
26 #include <dlog.h>
27 #endif
28
29 #ifndef __STDC_FORMAT_MACROS
30 #define __STDC_FORMAT_MACROS
31 #endif
32 #ifndef __STDC_LIMIT_MACROS
33 #define __STDC_LIMIT_MACROS
34 #endif
35
36 #include <string.h>
37 #include <inttypes.h>
38 #include "oic_malloc.h"
39 #include "ocpayload.h"
40 #include "ocstack.h"
41
42 #ifdef __cplusplus
43 extern "C"
44 {
45 #endif
46
47 // PL_TAG is made as generic predefined tag because of build problems in arduino for using logging
48 #define PL_TAG "PayloadLog"
49
50 #ifdef TB_LOG
51     #define OIC_LOG_PAYLOAD(level, payload) OCPayloadLog((level),(payload))
52     #define UUID_SIZE (16)
53
54 const char *convertTriggerEnumToString(OCPresenceTrigger trigger);
55 OCPresenceTrigger convertTriggerStringToEnum(const char * triggerStr);
56
57 INLINE_API void OCPayloadLogRep(LogLevel level, OCRepPayload* payload);
58
59 INLINE_API void OCPayloadLogRepValues(LogLevel level, OCRepPayloadValue* val)
60 {
61     while (val)
62     {
63         switch(val->type)
64         {
65             case OCREP_PROP_NULL:
66                 OIC_LOG_V(level, PL_TAG, "\t\t%s: NULL", val->name);
67                 break;
68             case OCREP_PROP_INT:
69                 OIC_LOG_V(level, PL_TAG, "\t\t%s(int):%" PRId64, val->name, val->i);
70                 break;
71             case OCREP_PROP_DOUBLE:
72                 OIC_LOG_V(level, PL_TAG, "\t\t%s(double):%f", val->name, val->d);
73                 break;
74             case OCREP_PROP_BOOL:
75                 OIC_LOG_V(level, PL_TAG, "\t\t%s(bool):%s", val->name, val->b ? "true" : "false");
76                 break;
77             case OCREP_PROP_STRING:
78                 OIC_LOG_V(level, PL_TAG, "\t\t%s(string):%s", val->name, val->str);
79                 break;
80             case OCREP_PROP_BYTE_STRING:
81                 OIC_LOG_V(level, PL_TAG, "\t\t%s(binary):", val->name);
82                 OIC_LOG_BUFFER(level, PL_TAG, val->ocByteStr.bytes, val->ocByteStr.len);
83                 break;
84             case OCREP_PROP_OBJECT:
85                 // Note: Only prints the URI (if available), to print further, you'll
86                 // need to dig into the object better!
87                 OIC_LOG_V(level, PL_TAG, "\t\t%s(object):", val->name);
88                 OCPayloadLogRep(level, val->obj);
89                 break;
90             case OCREP_PROP_ARRAY:
91                 switch(val->arr.type)
92                 {
93                     case OCREP_PROP_INT:
94                         OIC_LOG_V(level, PL_TAG, "\t\t%s(int array):%zu x %zu x %zu: ",
95                                 val->name,
96                                 val->arr.dimensions[0], val->arr.dimensions[1],
97                                 val->arr.dimensions[2]);
98                         OIC_LOG(level, PL_TAG, "\t\t Values:");
99                         for (size_t i = 0; i < val->arr.dimensions[0]; i++)
100                         {
101                             OIC_LOG_V(level, PL_TAG, "\t\t\t %" PRId64, val->arr.iArray[i]);
102                         }
103                         break;
104                     case OCREP_PROP_DOUBLE:
105                         OIC_LOG_V(level, PL_TAG, "\t\t%s(double array):%zu x %zu x %zu: ",
106                                 val->name,
107                                 val->arr.dimensions[0], val->arr.dimensions[1],
108                                 val->arr.dimensions[2]);
109                         OIC_LOG(level, PL_TAG, "\t\t Values:");
110                         for (size_t i = 0; i < val->arr.dimensions[0]; i++)
111                         {
112                             OIC_LOG_V(level, PL_TAG, "\t\t\t %lf", val->arr.dArray[i]);
113                         }
114                         break;
115                     case OCREP_PROP_BOOL:
116                         OIC_LOG_V(level, PL_TAG, "\t\t%s(bool array):%zu x %zu x %zu: ",
117                                 val->name,
118                                 val->arr.dimensions[0], val->arr.dimensions[1],
119                                 val->arr.dimensions[2]);
120                         OIC_LOG(level, PL_TAG, "\t\t Values:");
121                         for (size_t i = 0; i < val->arr.dimensions[0]; i++)
122                         {
123                             OIC_LOG_V(level, PL_TAG, "\t\t\t %d", val->arr.bArray[i]);
124                         }
125                         break;
126                     case OCREP_PROP_STRING:
127                         OIC_LOG_V(level, PL_TAG, "\t\t%s(string array):%zu x %zu x %zu: ",
128                                 val->name,
129                                 val->arr.dimensions[0], val->arr.dimensions[1],
130                                 val->arr.dimensions[2]);
131                         OIC_LOG(level, PL_TAG, "\t\t Values:");
132                         for (size_t i = 0; i < val->arr.dimensions[0]; i++)
133                         {
134                             OIC_LOG_V(level, PL_TAG, "\t\t\t %s", val->arr.strArray[i]);
135                         }
136                         break;
137                     case OCREP_PROP_BYTE_STRING:
138                         OIC_LOG_V(level, PL_TAG, "\t\t%s(byte array):%zu x %zu x %zu: ",
139                                 val->name,
140                                 val->arr.dimensions[0], val->arr.dimensions[1],
141                                 val->arr.dimensions[2]);
142                         OIC_LOG(level, PL_TAG, "\t\t Values:");
143                         for (size_t i = 0; i < val->arr.dimensions[0]; i++)
144                         {
145                             OIC_LOG_BUFFER(level, PL_TAG, val->arr.ocByteStrArray[i].bytes, val->arr.ocByteStrArray[i].len);
146                         }
147                         break;
148                     case OCREP_PROP_OBJECT:
149                         OIC_LOG_V(level, PL_TAG, "\t\t%s(object array):%zu x %zu x %zu: ",
150                                 val->name,
151                                 val->arr.dimensions[0], val->arr.dimensions[1],
152                                 val->arr.dimensions[2]);
153                         OIC_LOG(level, PL_TAG, "\t\t Values:");
154
155                         for (size_t i = 0; i < val->arr.dimensions[0]; i++)
156                         {
157                             OCPayloadLogRep(level, val->arr.objArray[i]);
158                         }
159                         break;
160                     case OCREP_PROP_ARRAY: //Seems as nested arrays doesn't not supported in API
161                     default:
162                         OIC_LOG_V(ERROR, PL_TAG, "%s <-- Unknown/unsupported array type!",
163                                 val->name);
164                         break;
165                 }
166                 break;
167             default:
168                 OIC_LOG_V(ERROR, PL_TAG, "%s <-- Unknown type!", val->name);
169                 break;
170         }
171         val = val -> next;
172     }
173 }
174
175 INLINE_API void OCPayloadLogRep(LogLevel level, OCRepPayload* payload)
176 {
177     OIC_LOG(level, (PL_TAG), "Payload Type: Representation");
178     int i = 1;
179     for (OCRepPayload* rep = payload; rep; rep = rep->next, ++i)
180     {
181         OIC_LOG_V(level, PL_TAG, "\tResource #%d", i);
182         if (rep->uri)
183         {
184             OIC_LOG_V(level, PL_TAG, "\tURI:%s", rep->uri);
185         }
186         if (rep->types)
187         {
188             OIC_LOG(level, PL_TAG, "\tResource Types:");
189             for (OCStringLL* strll = rep->types; strll; strll = strll->next)
190             {
191                 OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
192             }
193         }
194         if (rep->interfaces)
195         {
196             OIC_LOG(level, PL_TAG, "\tInterfaces:");
197             for (OCStringLL* strll = rep->interfaces; strll; strll = strll->next)
198             {
199                 OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
200             }
201         }
202         OIC_LOG(level, PL_TAG, "\tValues:");
203         OCPayloadLogRepValues(level, rep->values);
204     }
205 }
206
207 static void OCStringLLPrint(LogLevel level, OCStringLL *type)
208 {
209     for (OCStringLL *strll = type; strll; strll = strll->next)
210     {
211         OIC_LOG_V(level, PL_TAG, "\t\t %s", strll->value);
212     }
213 }
214
215 INLINE_API void OCPayloadLogDiscovery(LogLevel level, OCDiscoveryPayload* payload)
216 {
217     OIC_LOG(level, PL_TAG, "Payload Type: Discovery");
218
219     while(payload && payload->resources)
220     {
221         OIC_LOG_V(level, PL_TAG, "\tDI: %s", payload->sid);
222         if (payload->baseURI)
223         {
224             OIC_LOG_V(level, PL_TAG, "\tBase URI:%s", payload->baseURI);
225         }
226         if (payload->name)
227         {
228             OIC_LOG_V(level, PL_TAG, "\tNAME: %s", payload->name);
229         }
230
231         if (payload->type)
232         {
233             OIC_LOG(level, PL_TAG, "\tResource Type:");
234             OCStringLLPrint(level, payload->type);
235         }
236
237         if (payload->iface)
238         {
239             OIC_LOG(level, PL_TAG, "\tInterface:");
240             OCStringLLPrint(level, payload->iface);
241         }
242
243         OCResourcePayload* res = payload->resources;
244
245         int i = 1;
246         while(res)
247         {
248             OIC_LOG_V(level, PL_TAG, "\tLink#%d", i);
249             OIC_LOG_V(level, PL_TAG, "\tURI:%s", res->uri);
250             OIC_LOG(level, PL_TAG, "\tResource Types:");
251             OCStringLL* strll =  res->types;
252             while(strll)
253             {
254                 OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
255                 strll = strll->next;
256             }
257             OIC_LOG(level, PL_TAG, "\tInterfaces:");
258             strll =  res->interfaces;
259             while(strll)
260             {
261                 OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
262                 strll = strll->next;
263             }
264
265             OIC_LOG_V(level, PL_TAG, "\tBitmap: %u", res->bitmap);
266             OIC_LOG_V(level, PL_TAG, "\tSecure?: %s", res->secure ? "true" : "false");
267             OIC_LOG_V(level, PL_TAG, "\tPort: %u", res->port);
268             OIC_LOG(level, PL_TAG, "");
269             res = res->next;
270             ++i;
271         }
272         payload = payload->next;
273     }
274 }
275
276 INLINE_API void OCPayloadLogPresence(LogLevel level, OCPresencePayload* payload)
277 {
278     OIC_LOG(level, PL_TAG, "Payload Type: Presence");
279     OIC_LOG_V(level, PL_TAG, "\tSequence Number:%u", payload->sequenceNumber);
280     OIC_LOG_V(level, PL_TAG, "\tMax Age:%d", payload->maxAge);
281     OIC_LOG_V(level, PL_TAG, "\tTrigger:%s", convertTriggerEnumToString(payload->trigger));
282     OIC_LOG_V(level, PL_TAG, "\tResource Type:%s", payload->resourceType);
283 }
284
285 INLINE_API void OCPayloadLogSecurity(LogLevel level, OCSecurityPayload* payload)
286 {
287     size_t payloadSize = payload->payloadSize;
288     OIC_LOG(level, PL_TAG, "Payload Type: Security");
289
290     if (payloadSize > 0)
291     {
292         // Add a zero-character string terminator.
293         char *securityData = (char *)OICMalloc(payloadSize + 1);
294
295         if (securityData)
296         {
297             memcpy(securityData, payload->securityData, payloadSize);
298             // assert(securityData[payloadSize - 1] != '\0');
299             securityData[payloadSize] = '\0';
300             OIC_LOG_V(level, PL_TAG, "\tSecurity Data: %s", securityData);
301             OICFree(securityData);
302         }
303     }
304 }
305
306 INLINE_API void OCPayloadLog(LogLevel level, OCPayload* payload)
307 {
308     if(!payload)
309     {
310         OIC_LOG(level, PL_TAG, "NULL Payload");
311         return;
312     }
313     switch(payload->type)
314     {
315         case PAYLOAD_TYPE_REPRESENTATION:
316             OCPayloadLogRep(level, (OCRepPayload*)payload);
317             break;
318         case PAYLOAD_TYPE_DISCOVERY:
319             OCPayloadLogDiscovery(level, (OCDiscoveryPayload*)payload);
320             break;
321 #ifdef WITH_PRESENCE
322         case PAYLOAD_TYPE_PRESENCE:
323             OCPayloadLogPresence(level, (OCPresencePayload*)payload);
324             break;
325 #endif
326         case PAYLOAD_TYPE_SECURITY:
327             OCPayloadLogSecurity(level, (OCSecurityPayload*)payload);
328             break;
329         default:
330             OIC_LOG_V(level, PL_TAG, "Unknown Payload Type: %d", payload->type);
331             break;
332     }
333 }
334 #else
335     #define OIC_LOG_PAYLOAD(level, payload)
336 #endif
337
338 #ifdef __cplusplus
339 }
340 #endif
341
342 #endif