Cloud Client
[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 #include <inttypes.h>
36 #include "rdpayload.h"
37 #include "oic_malloc.h"
38 #include "ocpayload.h"
39
40 #ifdef __cplusplus
41 extern "C"
42 {
43 #endif
44
45 // PL_TAG is made as generic predefined tag because of build problems in arduino for using logging
46 #define PL_TAG "PayloadLog"
47
48 #ifdef TB_LOG
49     #define OIC_LOG_PAYLOAD(level, payload) OCPayloadLog((level),(payload))
50     #define UUID_SIZE (16)
51 const char *convertTriggerEnumToString(OCPresenceTrigger trigger);
52 OCPresenceTrigger convertTriggerStringToEnum(const char * triggerStr);
53
54 #if defined(RD_CLIENT) || defined(RD_SERVER)
55 INLINE_API void OCTagsLog(const LogLevel level, const OCTagsPayload *tags)
56 {
57     if (tags)
58     {
59         if (tags->n.deviceName)
60         {
61             OIC_LOG_V(level, PL_TAG, " Device Name : %s ", tags->n.deviceName);
62         }
63         if (tags->di.id)
64         {
65             OIC_LOG_V(level, PL_TAG, " Device ID : %s ", tags->di.id);
66         }
67         OIC_LOG_V(level, PL_TAG, " lt : %" PRIu64 ,tags->ttl);
68     }
69     else
70     {
71         (void) level;
72     }
73 }
74
75 INLINE_API void OCLinksLog(const LogLevel level, const OCLinksPayload *links)
76 {
77     if (!links)
78     {
79         return;
80     }
81
82     while (links)
83     {
84         if (links->href)
85         {
86             OIC_LOG_V(level, PL_TAG, "   href: %s ",links->href);
87         }
88         OIC_LOG(level, PL_TAG, "   RT: ");
89         OCStringLL *rt = links->rt;
90         while (rt)
91         {
92             if (rt->value)
93             {
94                 OIC_LOG_V(level, PL_TAG, "   %s", rt->value);
95             }
96             rt = rt->next;
97         }
98         OIC_LOG(level, PL_TAG, "   IF: ");
99         OCStringLL *itf = links->itf;
100         while (itf)
101         {
102             if (itf->value)
103             {
104                 OIC_LOG_V(level, PL_TAG, "   %s", itf->value);
105             }
106             itf = itf->next;
107         }
108         OIC_LOG(level, PL_TAG, "   MT: ");
109         OCStringLL *mt = links->type;
110         while (mt)
111         {
112             if (mt->value)
113             {
114                 OIC_LOG_V(level, PL_TAG, "   %s", mt->value);
115             }
116             mt = mt->next;
117         }
118         if (links->type)
119         {
120             OIC_LOG_V(level, PL_TAG, "   %s", links->type->value);
121         }
122         OIC_LOG_V(level, PL_TAG, "   INS: %d", links->ins);
123         OIC_LOG_V(level, PL_TAG, "   TTL: %" PRIu64 , links->ttl);
124         OIC_LOG_V(level, PL_TAG, "   P: %d", links->p);
125         if (links->rel)
126         {
127             OIC_LOG_V(level, PL_TAG, "   REL: %s", links->rel);
128         }
129         if (links->title)
130         {
131             OIC_LOG_V(level, PL_TAG, "   TITLE: %s", links->title);
132         }
133         if (links->anchor)
134         {
135             OIC_LOG_V(level, PL_TAG, "   URI: %s", links->anchor);
136         }
137         links = links->next;
138     }
139 }
140 #endif
141
142 //forward declaration required because function below is recursive
143 INLINE_API void OCPayloadLogRep(LogLevel level, OCRepPayload* payload);
144
145 INLINE_API void OCPayloadLogRepValues(LogLevel level, OCRepPayloadValue* val)
146 {
147     while(val)
148     {
149         switch(val->type)
150         {
151             case OCREP_PROP_NULL:
152                 OIC_LOG_V(level, PL_TAG, "%s: NULL", val->name);
153                 break;
154             case OCREP_PROP_INT:
155                 OIC_LOG_V(level, PL_TAG, "%s(int):%zd", val->name, val->i);
156                 break;
157             case OCREP_PROP_DOUBLE:
158                 OIC_LOG_V(level, PL_TAG, "%s(double):%f", val->name, val->d);
159                 break;
160             case OCREP_PROP_BOOL:
161                 OIC_LOG_V(level, PL_TAG, "%s(bool):%s", val->name, val->b ? "true" : "false");
162                 break;
163             case OCREP_PROP_STRING:
164                 OIC_LOG_V(level, PL_TAG, "%s(string):%s", val->name, val->str);
165                 break;
166             case OCREP_PROP_BYTE_STRING:
167                 OIC_LOG_V(level, PL_TAG, "%s(binary):", val->name);
168                 OIC_LOG_BUFFER(level, PL_TAG, val->ocByteStr.bytes, val->ocByteStr.len);
169                 break;
170             case OCREP_PROP_OBJECT:
171                 OIC_LOG_V(level, PL_TAG, "%s(OCRep):%s", val->name, val->obj->uri);
172                 OCPayloadLogRep(level, val->obj);
173                 break;
174             case OCREP_PROP_ARRAY:
175             {
176                 size_t len = calcDimTotal(val->arr.dimensions);
177
178                 OIC_LOG_V(level, PL_TAG, "%s(array): length = %zu", val->name, len);
179
180                 for (size_t i = 0; i < len; i++)
181                 {
182                     OIC_LOG_V(level, PL_TAG, "%s[%zu]:", val->name, i);
183                     char *indent = (char *)"\t\t";
184
185                     switch(val->arr.type)
186                     {
187                         case OCREP_PROP_INT:
188                             OIC_LOG_V(level, PL_TAG, "%s%zd", indent, val->arr.iArray[i]);
189                             break;
190                         case OCREP_PROP_DOUBLE:
191                             OIC_LOG_V(level, PL_TAG, "%s%f", indent, val->arr.dArray[i]);
192                             break;
193                         case OCREP_PROP_BOOL:
194                             OIC_LOG_V(level, PL_TAG, "%s%s", indent, val->arr.bArray[i] ? "true" : "false");
195                             break;
196                         case OCREP_PROP_STRING:
197                             OIC_LOG_V(level, PL_TAG, "%s%s", indent, val->arr.strArray[i]);
198                             break;
199                         case OCREP_PROP_BYTE_STRING:
200                         {
201                             OCByteString* data = &val->arr.ocByteStrArray[i];
202                             OIC_LOG_V(level, PL_TAG, "%s binary string, it's len = %zu, bytes:", indent, data->len);
203                             OIC_LOG_BUFFER(level, PL_TAG, data->bytes, data->len);
204                         }
205                             break;
206                         case OCREP_PROP_OBJECT:
207                             OCPayloadLogRep(level, val->arr.objArray[i]);
208                             break;
209                         case OCREP_PROP_ARRAY: //Seems as nested arrays doesn't not supported in API
210                         default:
211                             OIC_LOG_V(ERROR, PL_TAG, "%s <-- Unknown/unsupported array type!",
212                                     val->name);
213                             break;
214                     }
215                 }
216                 break;
217             }
218             default:
219                 OIC_LOG_V(ERROR, PL_TAG, "%s <-- Unknown type!", val->name);
220                 break;
221         }
222         val = val -> next;
223     }
224 }
225
226 INLINE_API void OCPayloadLogRep(LogLevel level, OCRepPayload* payload)
227 {
228     OCRepPayload* rep = payload;
229     int i = 1;
230     while(rep)
231     {
232         OCStringLL* strll =  rep->types;
233         while(strll)
234         {
235             strll = strll->next;
236         }
237         strll =  rep->interfaces;
238         while(strll)
239         {
240             strll = strll->next;
241         }
242
243         // TODO Finish Logging: Values
244         OCRepPayloadValue* val = rep->values;
245
246         OCPayloadLogRepValues(level, val);
247
248         ++i;
249         rep = rep->next;
250     }
251 }
252
253 INLINE_API void OCPayloadLogDiscovery(LogLevel level, OCDiscoveryPayload* payload)
254 {
255     OIC_LOG(level, PL_TAG, "Payload Type: Discovery");
256
257     while(payload && payload->resources)
258     {
259         OIC_LOG_V(level, PL_TAG, "\tSID: %s", payload->sid);
260         if (payload->baseURI)
261         {
262             OIC_LOG_V(level, PL_TAG, "\tBase URI:%s", payload->baseURI);
263         }
264         if (payload->name)
265         {
266             OIC_LOG_V(level, PL_TAG, "\tNAME: %s", payload->name);
267         }
268         if (payload->uri)
269         {
270             OIC_LOG_V(level, PL_TAG, "\tURI: %s", payload->uri);
271         }
272         if (payload->type)
273         {
274             for (OCStringLL *strll = payload->type; strll; strll = strll->next)
275             {
276                 OIC_LOG_V(level, PL_TAG, "\tResource Type: %s", strll->value);
277             }
278         }
279         OIC_LOG(level, PL_TAG, "\tInterface:");
280         for (OCStringLL *itf = payload->iface; itf; itf = itf->next)
281         {
282             OIC_LOG_V(level, PL_TAG, "\t\t%s", itf->value);
283         }
284
285         OCResourcePayload* res = payload->resources;
286
287         int i = 1;
288         while(res)
289         {
290             OIC_LOG_V(level, PL_TAG, "\tResource #%d", i);
291             OIC_LOG_V(level, PL_TAG, "\tURI:%s", res->uri);
292             OIC_LOG(level, PL_TAG, "\tResource Types:");
293             OCStringLL* strll =  res->types;
294             while(strll)
295             {
296                 OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
297                 strll = strll->next;
298             }
299             OIC_LOG(level, PL_TAG, "\tInterfaces:");
300             strll =  res->interfaces;
301             while(strll)
302             {
303                 OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
304                 strll = strll->next;
305             }
306
307             OIC_LOG_V(level, PL_TAG, "\tBitmap: %u", res->bitmap);
308             OIC_LOG_V(level, PL_TAG, "\tSecure?: %s", res->secure ? "true" : "false");
309             OIC_LOG_V(level, PL_TAG, "\tPort: %u", res->port);
310             OIC_LOG(level, PL_TAG, "");
311             res = res->next;
312             ++i;
313         }
314         payload = payload->next;
315     }
316 }
317
318 INLINE_API void OCPayloadLogDevice(LogLevel level, OCDevicePayload* payload)
319 {
320     OIC_LOG(level, PL_TAG, "Payload Type: Device");
321     OIC_LOG_V(level, PL_TAG, "\tSID:%s", payload->sid);
322     OIC_LOG_V(level, PL_TAG, "\tDevice Name:%s", payload->deviceName);
323     OIC_LOG_V(level, PL_TAG, "\tSpec Version:%s", payload->specVersion);
324     if (payload->dataModelVersions)
325     {
326         OIC_LOG(level, PL_TAG, "\tData Model Version:");
327         for (OCStringLL *strll = payload->dataModelVersions; strll; strll = strll->next)
328         {
329             OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
330         }
331     }
332     if (payload->types)
333     {
334         OIC_LOG(level, PL_TAG, "\tResource Type:");
335         for (OCStringLL *strll = payload->types; strll; strll = strll->next)
336         {
337             OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
338         }
339     }
340     if (payload->interfaces)
341     {
342         OIC_LOG(level, PL_TAG, "\tInterface:");
343         for (OCStringLL *strll = payload->interfaces; strll; strll = strll->next)
344         {
345             OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
346         }
347     }
348 }
349
350 INLINE_API void OCPayloadLogPlatform(LogLevel level, OCPlatformPayload* payload)
351 {
352     OIC_LOG(level, PL_TAG, "Payload Type: Platform");
353     OIC_LOG_V(level, PL_TAG, "\tURI:%s", payload->uri);
354     OIC_LOG_V(level, PL_TAG, "\tPlatform ID:%s", payload->info.platformID);
355     OIC_LOG_V(level, PL_TAG, "\tMfg Name:%s", payload->info.manufacturerName);
356     OIC_LOG_V(level, PL_TAG, "\tMfg URL:%s", payload->info.manufacturerUrl);
357     OIC_LOG_V(level, PL_TAG, "\tModel Number:%s", payload->info.modelNumber);
358     OIC_LOG_V(level, PL_TAG, "\tDate of Mfg:%s", payload->info.dateOfManufacture);
359     OIC_LOG_V(level, PL_TAG, "\tPlatform Version:%s", payload->info.platformVersion);
360     OIC_LOG_V(level, PL_TAG, "\tOS Version:%s", payload->info.operatingSystemVersion);
361     OIC_LOG_V(level, PL_TAG, "\tHardware Version:%s", payload->info.hardwareVersion);
362     OIC_LOG_V(level, PL_TAG, "\tFirmware Version:%s", payload->info.firmwareVersion);
363     OIC_LOG_V(level, PL_TAG, "\tSupport URL:%s", payload->info.supportUrl);
364     OIC_LOG_V(level, PL_TAG, "\tSystem Time:%s", payload->info.systemTime);
365
366     if (payload->rt)
367     {
368         OIC_LOG(level, PL_TAG, "\tResource Types:");
369         for (OCStringLL *strll = payload->rt; strll; strll = strll->next)
370         {
371             OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
372         }
373     }
374     if (payload->interfaces)
375     {
376         OIC_LOG(level, PL_TAG, "\tResource Interfaces:");
377         for (OCStringLL *strll = payload->interfaces; strll; strll = strll->next)
378         {
379             OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
380         }
381     }
382 }
383
384 INLINE_API void OCPayloadLogPresence(LogLevel level, OCPresencePayload* payload)
385 {
386     OIC_LOG(level, PL_TAG, "Payload Type: Presence");
387     OIC_LOG_V(level, PL_TAG, "\tSequence Number:%u", payload->sequenceNumber);
388     OIC_LOG_V(level, PL_TAG, "\tMax Age:%d", payload->maxAge);
389     OIC_LOG_V(level, PL_TAG, "\tTrigger:%s", convertTriggerEnumToString(payload->trigger));
390     OIC_LOG_V(level, PL_TAG, "\tResource Type:%s", payload->resourceType);
391 }
392
393 INLINE_API void OCPayloadLogSecurity(LogLevel level, OCSecurityPayload* payload)
394 {
395     size_t payloadSize = payload->payloadSize;
396     OIC_LOG(level, PL_TAG, "Payload Type: Security");
397
398     if (payloadSize > 0)
399     {
400         // Add a zero-character string terminator.
401         char *securityData = (char *)OICMalloc(payloadSize + 1);
402
403         if (securityData)
404         {
405             memcpy(securityData, payload->securityData, payloadSize);
406             assert(securityData[payloadSize - 1] != '\0');
407             securityData[payloadSize] = '\0';
408             OIC_LOG_V(level, PL_TAG, "\tSecurity Data: %s", securityData);
409             OICFree(securityData);
410         }
411     }
412 }
413
414 #if defined(RD_CLIENT) || defined(RD_SERVER)
415 INLINE_API void OCRDPayloadLog(const LogLevel level, const OCRDPayload *payload)
416 {
417     if (!payload)
418     {
419         return;
420     }
421
422     if (payload->rdDiscovery)
423     {
424         OIC_LOG(level, PL_TAG, "RD Discovery");
425         OIC_LOG_V(level, PL_TAG, "  Device Name : %s", payload->rdDiscovery->n.deviceName);
426         OIC_LOG_V(level, PL_TAG, "  Device Identity : %s", payload->rdDiscovery->di.id);
427         OIC_LOG_V(level, PL_TAG, "  Bias: %d", payload->rdDiscovery->sel);
428     }
429     if (payload->rdPublish)
430     {
431         OIC_LOG(level, PL_TAG, "RD Publish");
432         OCResourceCollectionPayload *rdPublish = payload->rdPublish;
433         OCTagsLog(level, rdPublish->tags);
434         OCLinksLog(level, rdPublish->setLinks);
435     }
436 }
437 #endif
438 INLINE_API void OCPayloadLog(LogLevel level, OCPayload* payload)
439 {
440     if(!payload)
441     {
442         OIC_LOG(level, PL_TAG, "NULL Payload");
443         return;
444     }
445     switch(payload->type)
446     {
447         case PAYLOAD_TYPE_REPRESENTATION:
448             OCPayloadLogRep(level, (OCRepPayload*)payload);
449             break;
450         case PAYLOAD_TYPE_DISCOVERY:
451             OCPayloadLogDiscovery(level, (OCDiscoveryPayload*)payload);
452             break;
453         case PAYLOAD_TYPE_DEVICE:
454             OCPayloadLogDevice(level, (OCDevicePayload*)payload);
455             break;
456         case PAYLOAD_TYPE_PLATFORM:
457             OCPayloadLogPlatform(level, (OCPlatformPayload*)payload);
458             break;
459         case PAYLOAD_TYPE_PRESENCE:
460             OCPayloadLogPresence(level, (OCPresencePayload*)payload);
461             break;
462         case PAYLOAD_TYPE_SECURITY:
463             OCPayloadLogSecurity(level, (OCSecurityPayload*)payload);
464             break;
465 #if defined(RD_CLIENT) || defined(RD_SERVER)
466         case PAYLOAD_TYPE_RD:
467             OCRDPayloadLog(level, (OCRDPayload*)payload);
468             break;
469 #endif
470         default:
471             OIC_LOG_V(level, PL_TAG, "Unknown Payload Type: %d", payload->type);
472             break;
473     }
474 }
475 #else
476     #define OIC_LOG_PAYLOAD(level, payload)
477 #endif
478
479 #ifdef __cplusplus
480 }
481 #endif
482
483 #endif