sync with master
[platform/framework/native/appfw.git] / src / base / FBaseSys.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file                FBaseSys.cpp
20  * @brief               This file defines the diagnostics types.
21  */
22
23 #include <vconf.h>
24 #include <dlog.h>
25 #include <assert.h>
26 #include <stdio.h>
27 #include <unistd.h>
28 #include <string.h>
29 #include <sys/syscall.h>
30 #include <sys/types.h>
31 #include <FIoRegistry.h>
32 #include <FIoFile.h>
33 #include <FAppTypes.h>
34 #include <FBaseLog.h>
35 #include <FBaseSysLog.h>
36 #include "FBase_Log.h"
37 #include "FBase_StringConverter.h"
38 #include "FApp_AppInfo.h"
39
40 using namespace Tizen::Base;
41 using namespace Tizen::Io;
42 using namespace Tizen::Base::Collection;
43 using namespace Tizen::App;
44
45 #ifdef LOG_TAG
46 #undef LOG_TAG
47 #define LOG_TAG "OSP_SLP"
48 #define LOG_TAG_NULL ""
49 #endif
50
51 static const char LOG_TAG_ASSERT[] = "Assert";
52
53 bool iniLoaded = false;
54
55 static bool appNameLoaded = false;
56 static char appName[LOG_MODULE_NAME_LEN_MAX];
57
58 static bool envLoaded = false;
59 static bool envPlatformInfoEnabled = true;
60
61 #define APP_RESERVED(X) NID_APP+X
62 #define BASE_RESERVED(X) NID_BASE+X
63 #define CNT_RESERVED(X) NID_CNT+X
64 #define CTXT_RESERVED(X) NID_CTXT+X
65 #define GRP_RESERVED(X) NID_GRP+X
66
67 #define IO_RESERVED(X) NID_IO+X
68 #define LCL_RESERVED(X) NID_LCL+X
69 #define LOC_RESERVED(X) NID_LOC+X
70 #define MEDIA_RESERVED(X) NID_MEDIA+X
71 #define MSG_RESERVED(X) NID_MSG+X
72
73 #define NET_RESERVED(X) NID_NET+X
74 #define SEC_RESERVED(X) NID_SEC+X
75 #define SCL_RESERVED(X) NID_SCL+X
76 #define SYS_RESERVED(X) NID_SYS+X
77 #define TEL_RESERVED(X) NID_TEL+X
78
79 #define TEXT_RESERVED(X) NID_TEXT+X
80 #define UI_RESERVED(X) NID_UI+X
81 #define UIX_RESERVED(X) NID_UIX+X
82 #define WEB_RESERVED(X) NID_WEB+X
83
84 LogInfo logInfo =
85 {
86         {
87                 //OSP Namespace ID ===============================================================
88                 {NID_APP, "NID_APP", "Tizen::App", true},
89                 {APP_RESERVED(1) , "RESERVED", "", false},
90                 {APP_RESERVED(2) , "RESERVED", "", false},
91                 {APP_RESERVED(3) , "RESERVED", "", false},
92                 {APP_RESERVED(4) , "RESERVED", "", false},
93                 {APP_RESERVED(5) , "RESERVED", "", false},
94                 {APP_RESERVED(6) , "RESERVED", "", false},
95                 {APP_RESERVED(7) , "RESERVED", "", false},
96                 {APP_RESERVED(8) , "RESERVED", "", false},
97                 {APP_RESERVED(9) , "RESERVED", "", false},
98
99                 {NID_BASE, "NID_BASE", "Tizen::Base", true},
100                 {NID_BASE_COL, "NID_BASE_COL", "Tizen::Base::Collection", true},
101                 {NID_BASE_RT, "NID_BASE_RT", "Tizen::Base::Runtime", true},
102                 {NID_BASE_UTIL, "NID_BASE_UTIL", "Tizen::Base::Utility", true},
103                 {BASE_RESERVED(4) , "RESERVED", "", false},
104                 {BASE_RESERVED(5) , "RESERVED", "", false},
105                 {BASE_RESERVED(6) , "RESERVED", "", false},
106                 {BASE_RESERVED(7) , "RESERVED", "", false},
107                 {BASE_RESERVED(8) , "RESERVED", "", false},
108                 {BASE_RESERVED(9) , "RESERVED", "", false},
109
110                 {NID_CNT, "NID_CNT", "Tizen::Content", true},
111                 {CNT_RESERVED(1) , "RESERVED", "", false},
112                 {CNT_RESERVED(2) , "RESERVED", "", false},
113                 {CNT_RESERVED(3) , "RESERVED", "", false},
114                 {CNT_RESERVED(4) , "RESERVED", "", false},
115                 {CNT_RESERVED(5) , "RESERVED", "", false},
116                 {CNT_RESERVED(6) , "RESERVED", "", false},
117                 {CNT_RESERVED(7) , "RESERVED", "", false},
118                 {CNT_RESERVED(8) , "RESERVED", "", false},
119                 {CNT_RESERVED(9) , "RESERVED", "", false},
120
121                 {NID_CTXT, "NID_CTXT", "Tizen::Context", true},
122                 {CTXT_RESERVED(1) , "RESERVED", "", false},
123                 {CTXT_RESERVED(2) , "RESERVED", "", false},
124                 {CTXT_RESERVED(3) , "RESERVED", "", false},
125                 {CTXT_RESERVED(4) , "RESERVED", "", false},
126                 {CTXT_RESERVED(5) , "RESERVED", "", false},
127                 {CTXT_RESERVED(6) , "RESERVED", "", false},
128                 {CTXT_RESERVED(7) , "RESERVED", "", false},
129                 {CTXT_RESERVED(8) , "RESERVED", "", false},
130                 {CTXT_RESERVED(9) , "RESERVED", "", false},
131
132                 {NID_GRP, "NID_GRP", "Tizen::Graphics", true},
133                 {GRP_RESERVED(1) , "RESERVED", "", false},
134                 {GRP_RESERVED(2) , "RESERVED", "", false},
135                 {GRP_RESERVED(3) , "RESERVED", "", false},
136                 {GRP_RESERVED(4) , "RESERVED", "", false},
137                 {GRP_RESERVED(5) , "RESERVED", "", false},
138                 {GRP_RESERVED(6) , "RESERVED", "", false},
139                 {GRP_RESERVED(7) , "RESERVED", "", false},
140                 {GRP_RESERVED(8) , "RESERVED", "", false},
141                 {GRP_RESERVED(9) , "RESERVED", "", false},
142
143                 {NID_IO, "NID_IO", "Tizen::Io", true},
144                 {IO_RESERVED(1) , "RESERVED", "", false},
145                 {IO_RESERVED(2) , "RESERVED", "", false},
146                 {IO_RESERVED(3) , "RESERVED", "", false},
147                 {IO_RESERVED(4) , "RESERVED", "", false},
148                 {IO_RESERVED(5) , "RESERVED", "", false},
149                 {IO_RESERVED(6) , "RESERVED", "", false},
150                 {IO_RESERVED(7) , "RESERVED", "", false},
151                 {IO_RESERVED(8) , "RESERVED", "", false},
152                 {IO_RESERVED(9) , "RESERVED", "", false},
153
154                 {NID_LCL, "NID_LCL", "Tizen::Locales", true},
155                 {LCL_RESERVED(1) , "RESERVED", "", false},
156                 {LCL_RESERVED(2) , "RESERVED", "", false},
157                 {LCL_RESERVED(3) , "RESERVED", "", false},
158                 {LCL_RESERVED(4) , "RESERVED", "", false},
159                 {LCL_RESERVED(5) , "RESERVED", "", false},
160                 {LCL_RESERVED(6) , "RESERVED", "", false},
161                 {LCL_RESERVED(7) , "RESERVED", "", false},
162                 {LCL_RESERVED(8) , "RESERVED", "", false},
163                 {LCL_RESERVED(9) , "RESERVED", "", false},
164
165                 {NID_LOC, "NID_LOC", "Tizen::Locations", true},
166                 {NID_LOC_CTRL, "NID_LOC_CTRL", "Tizen::Locations::Controls", true},
167                 {NID_LOC_SVC, "NID_LOC_SVC", "Tizen::Locations::Services", true},
168                 {LOC_RESERVED(3) , "RESERVED", "", false},
169                 {LOC_RESERVED(4) , "RESERVED", "", false},
170                 {LOC_RESERVED(5) , "RESERVED", "", false},
171                 {LOC_RESERVED(6) , "RESERVED", "", false},
172                 {LOC_RESERVED(7) , "RESERVED", "", false},
173                 {LOC_RESERVED(8) , "RESERVED", "", false},
174                 {LOC_RESERVED(9) , "RESERVED", "", false},
175
176                 {NID_MEDIA, "NID_MEDIA", "Tizen::Media", true},
177                 {MEDIA_RESERVED(1) , "RESERVED", "", false},
178                 {MEDIA_RESERVED(2) , "RESERVED", "", false},
179                 {MEDIA_RESERVED(3) , "RESERVED", "", false},
180                 {MEDIA_RESERVED(4) , "RESERVED", "", false},
181                 {MEDIA_RESERVED(5) , "RESERVED", "", false},
182                 {MEDIA_RESERVED(6) , "RESERVED", "", false},
183                 {MEDIA_RESERVED(7) , "RESERVED", "", false},
184                 {MEDIA_RESERVED(8) , "RESERVED", "", false},
185                 {MEDIA_RESERVED(9) , "RESERVED", "", false},
186
187                 {NID_MSG, "NID_MSG", "Tizen::Messaging", true},
188                 {MSG_RESERVED(1) , "RESERVED", "", false},
189                 {MSG_RESERVED(2) , "RESERVED", "", false},
190                 {MSG_RESERVED(3) , "RESERVED", "", false},
191                 {MSG_RESERVED(4) , "RESERVED", "", false},
192                 {MSG_RESERVED(5) , "RESERVED", "", false},
193                 {MSG_RESERVED(6) , "RESERVED", "", false},
194                 {MSG_RESERVED(7) , "RESERVED", "", false},
195                 {MSG_RESERVED(8) , "RESERVED", "", false},
196                 {MSG_RESERVED(9) , "RESERVED", "", false},
197
198                 {NID_NET, "NID_NET", "Tizen::Net", true},
199                 {NID_NET_BT, "NID_NET_BT", "Tizen::Net::Bluetooth", true},
200                 {NID_NET_HTTP, "NID_NET_HTTP", "Tizen::Net::Http", true},
201                 {NID_NET_NFC, "NID_NET_NFC", "Tizen::Net::Nfc", true},
202                 {NID_NET_SOCK, "NID_NET_SOCK", "Tizen::Net::Sockets", true},
203                 {NID_NET_WIFI, "NID_NET_WIFI", "Tizen::Net::Wifi", true},
204                 {NET_RESERVED(6) , "RESERVED", "", false},
205                 {NET_RESERVED(7) , "RESERVED", "", false},
206                 {NET_RESERVED(8) , "RESERVED", "", false},
207                 {NET_RESERVED(9) , "RESERVED", "", false},
208
209                 {NID_SEC, "NID_SEC", "Tizen::Security", true},
210                 {NID_SEC_CERT, "NID_SEC_CERT", "Tizen::Security::Cert", true},
211                 {NID_SEC_CRYPTO, "NID_SEC_CRYPTO", "Tizen::Security::Crypto", true},
212                 {SEC_RESERVED(3) , "RESERVED", "", false},
213                 {SEC_RESERVED(4) , "RESERVED", "", false},
214                 {SEC_RESERVED(5) , "RESERVED", "", false},
215                 {SEC_RESERVED(6) , "RESERVED", "", false},
216                 {SEC_RESERVED(7) , "RESERVED", "", false},
217                 {SEC_RESERVED(8) , "RESERVED", "", false},
218                 {SEC_RESERVED(9) , "RESERVED", "", false},
219
220                 {NID_SCL, "NID_SCL", "Tizen::Social", true},
221                 {SCL_RESERVED(1) , "RESERVED", "", false},
222                 {SCL_RESERVED(2) , "RESERVED", "", false},
223                 {SCL_RESERVED(3) , "RESERVED", "", false},
224                 {SCL_RESERVED(4) , "RESERVED", "", false},
225                 {SCL_RESERVED(5) , "RESERVED", "", false},
226                 {SCL_RESERVED(6) , "RESERVED", "", false},
227                 {SCL_RESERVED(7) , "RESERVED", "", false},
228                 {SCL_RESERVED(8) , "RESERVED", "", false},
229                 {SCL_RESERVED(9) , "RESERVED", "", false},
230
231                 {NID_SYS, "NID_SYS", "Tizen::System", true},
232                 {SYS_RESERVED(1) , "RESERVED", "", false},
233                 {SYS_RESERVED(2) , "RESERVED", "", false},
234                 {SYS_RESERVED(3) , "RESERVED", "", false},
235                 {SYS_RESERVED(4) , "RESERVED", "", false},
236                 {SYS_RESERVED(5) , "RESERVED", "", false},
237                 {SYS_RESERVED(6) , "RESERVED", "", false},
238                 {SYS_RESERVED(7) , "RESERVED", "", false},
239                 {SYS_RESERVED(8) , "RESERVED", "", false},
240                 {SYS_RESERVED(9) , "RESERVED", "", false},
241
242                 {NID_TEL, "NID_TEL", "Tizen::Telephony", true},
243                 {TEL_RESERVED(1) , "RESERVED", "", false},
244                 {TEL_RESERVED(2) , "RESERVED", "", false},
245                 {TEL_RESERVED(3) , "RESERVED", "", false},
246                 {TEL_RESERVED(4) , "RESERVED", "", false},
247                 {TEL_RESERVED(5) , "RESERVED", "", false},
248                 {TEL_RESERVED(6) , "RESERVED", "", false},
249                 {TEL_RESERVED(7) , "RESERVED", "", false},
250                 {TEL_RESERVED(8) , "RESERVED", "", false},
251                 {TEL_RESERVED(9) , "RESERVED", "", false},
252
253                 {NID_TEXT, "NID_TEXT", "Tizen::Text", true},
254                 {TEXT_RESERVED(1) , "RESERVED", "", false},
255                 {TEXT_RESERVED(2) , "RESERVED", "", false},
256                 {TEXT_RESERVED(3) , "RESERVED", "", false},
257                 {TEXT_RESERVED(4) , "RESERVED", "", false},
258                 {TEXT_RESERVED(5) , "RESERVED", "", false},
259                 {TEXT_RESERVED(6) , "RESERVED", "", false},
260                 {TEXT_RESERVED(7) , "RESERVED", "", false},
261                 {TEXT_RESERVED(8) , "RESERVED", "", false},
262                 {TEXT_RESERVED(9) , "RESERVED", "", false},
263
264                 {NID_UI, "NID_UI", "Tizen::Ui", true},
265                 {NID_UI_ANIM, "NID_UI_ANIM", "Tizen::Ui::Animations", true},
266                 {NID_UI_CTRL, "NID_UI_CTRL", "Tizen::Ui::Controls", true},
267                 {NID_UI_EFFECT, "NID_UI_EFFECT", "Tizen::Ui::Effects", true},
268                 {NID_UI_IME, "NID_UI_IME", "Tizen::Ui::Ime", true},
269                 {NID_UI_SCENES, "NID_UI_SCENES", "Tizen::Ui::Scenes", true},
270                 {UI_RESERVED(6) , "RESERVED", "", false},
271                 {UI_RESERVED(7) , "RESERVED", "", false},
272                 {UI_RESERVED(8) , "RESERVED", "", false},
273                 {UI_RESERVED(9) , "RESERVED", "", false},
274
275                 {NID_UIX, "NID_UIX", "Tizen::Uix", true},
276                 {NID_UIX_SPEECH, "NID_UIX_SPEECH", "Tizen::Uix::Speech", true},
277                 {UIX_RESERVED(2) , "RESERVED", "", false},
278                 {UIX_RESERVED(3) , "RESERVED", "", false},
279                 {UIX_RESERVED(4) , "RESERVED", "", false},
280                 {UIX_RESERVED(5) , "RESERVED", "", false},
281                 {UIX_RESERVED(6) , "RESERVED", "", false},
282                 {UIX_RESERVED(7) , "RESERVED", "", false},
283                 {UIX_RESERVED(8) , "RESERVED", "", false},
284                 {UIX_RESERVED(9) , "RESERVED", "", false},
285
286                 {NID_WEB, "NID_WEB", "Tizen::Web", true},
287                 {NID_WEB_CTRL, "NID_WEB_CTRL", "Tizen::Web::Controls", true},
288                 {NID_WEB_JSON, "NID_WEB_JSON", "Tizen::Web::Json", true},
289                 {WEB_RESERVED(3) , "RESERVED", "", false},
290                 {WEB_RESERVED(4) , "RESERVED", "", false},
291                 {WEB_RESERVED(5) , "RESERVED", "", false},
292                 {WEB_RESERVED(6) , "RESERVED", "", false},
293                 {WEB_RESERVED(7) , "RESERVED", "", false},
294                 {WEB_RESERVED(8) , "RESERVED", "", false},
295                 {WEB_RESERVED(9) , "RESERVED", "", false}
296
297         },
298
299         // Other properties ===========================================================
300         false,          // consoleOut
301         false,          // fileOut
302
303         true,           //platformInfoEnabled;
304         true,           //platformExceptionEnabled;
305
306         true,           // applicationInfoEnabled
307         true,           // applicationDebugEnabled
308         true,           // applicationExceptionEnabled
309
310 };
311
312 void
313 AppLogInternal(const char* pFunction, int lineNumber, const char* pFormat, ...)
314 {
315         va_list args;
316
317         if (!logInfo.applicationInfoEnabled)
318         {
319                 return;
320         }
321
322         va_start(args, pFormat);
323
324         __PrintLog(static_cast<_LogType>(LOG_INFO), pFunction, lineNumber, pFormat, args);
325
326         va_end(args);
327 }
328
329 void
330 AppLogTagInternal(const char* pTag, const char* pFunction, int lineNumber, const char* pFormat, ...)
331 {
332         va_list args;
333
334         if (!logInfo.applicationInfoEnabled)
335         {
336                 return;
337         }
338
339         va_start(args, pFormat);
340
341         __PrintLogTag(pTag, static_cast<_LogType>(LOG_INFO), pFunction, lineNumber, pFormat, args);
342
343         va_end(args);
344 }
345
346 void
347 AppLogDebugInternal(const char* pFunction, int lineNumber, const char* pFormat, ...)
348 {
349         va_list args;
350
351         if (!logInfo.applicationDebugEnabled)
352         {
353                 return;
354         }
355
356         va_start(args, pFormat);
357
358         __PrintLog(static_cast<_LogType>(LOG_DEBUG), pFunction, lineNumber, pFormat, args);
359
360         va_end(args);
361 }
362
363 void
364 AppLogDebugTagInternal(const char* pTag, const char* pFunction, int lineNumber, const char* pFormat, ...)
365 {
366         va_list args;
367
368         if (!logInfo.applicationDebugEnabled)
369         {
370                 return;
371         }
372
373         va_start(args, pFormat);
374
375         __PrintLogTag(pTag, static_cast<_LogType>(LOG_DEBUG), pFunction, lineNumber, pFormat, args);
376
377         va_end(args);
378 }
379
380 void
381 AppLogExceptionInternal(const char* pFunction, int lineNumber, const char* pFormat, ...)
382 {
383         va_list args;
384
385         if (!logInfo.applicationExceptionEnabled)
386         {
387                 return;
388         }
389
390         va_start(args, pFormat);
391
392         __PrintLog(static_cast<_LogType>(LOG_EXCEPTION), pFunction, lineNumber, pFormat, args);
393
394         va_end(args);
395 }
396
397 void
398 AppLogExceptionTagInternal(const char* pTag, const char* pFunction, int lineNumber, const char* pFormat, ...)
399 {
400         va_list args;
401
402         if (!logInfo.applicationExceptionEnabled)
403         {
404                 return;
405         }
406
407         va_start(args, pFormat);
408
409         __PrintLogTag(pTag, static_cast<_LogType>(LOG_EXCEPTION), pFunction, lineNumber, pFormat, args);
410
411         va_end(args);
412 }
413
414 void
415 AppassertInternal(const char* pFunction, int lineNumber)
416 {
417         char logBody[LOG_LEN_MAX];
418         bool platformDebug;
419         int appDebug;
420         char logTag[LOG_MODULE_NAME_LEN_MAX];
421
422         vconf_get_bool(VCONFKEY_SETAPPL_USB_DEBUG_MODE_BOOL, &appDebug);
423         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
424
425         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", appName);
426         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
427
428         if( (platformDebug == false) && (appDebug == 0) )
429         {
430                 snprintf(logBody, LOG_LEN_MAX, "%s(%d) > App assertion passed due to debug mode off!", pFunction, lineNumber);
431                 ALOG(LOG_ERROR, logTag, logBody);
432                 return;
433         }
434
435         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > AppAssert!", pFunction, lineNumber);
436         ALOG(LOG_ERROR, logTag, logBody);
437
438         assert(false);
439 }
440
441 void
442 AppassertfInternal(const char* expr, const char* pFunction, int lineNumber, const char* pFormat, ...)
443 {
444         char logBody[LOG_LEN_MAX];
445         bool platformDebug;
446         int appDebug;
447         va_list args;
448         va_start(args, pFormat);
449
450         vconf_get_bool(VCONFKEY_SETAPPL_USB_DEBUG_MODE_BOOL, &appDebug);
451         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
452
453         if( (platformDebug == false) && (appDebug == 0) )
454         {
455                 snprintf(logBody, LOG_LEN_MAX, "App assertion passed due to debug mode off! : %s", pFormat);
456                 __PrintLog(static_cast<_LogType>(LOG_USER), pFunction, lineNumber, logBody, args);
457                 va_end(args);
458                 return;
459         }
460
461         __PrintLog(static_cast<_LogType>(LOG_USER), pFunction, lineNumber, pFormat, args);
462
463         va_end(args);
464
465         assert(false);
466 }
467
468
469 void
470 SysLogInternal(unsigned long nid, const char* pFunction, int lineNumber, const char* pFormat, ...)
471 {
472         va_list args;
473         char* envValuePlatformlogging;
474         char* envValueDebug;
475
476         if (!envLoaded)
477         {
478                 envValuePlatformlogging = getenv("TIZEN_PLATFORMLOGGING_MODE");
479                 envValueDebug = getenv("TIZEN_DEBUG_MODE");
480
481                 if ((envValuePlatformlogging != NULL) && (envValuePlatformlogging[0] == '1'))
482                 {
483                         envPlatformInfoEnabled = true;
484                 }
485                 else if ((envValueDebug != NULL) && (envValueDebug[0] == '1'))
486                 {
487                         envPlatformInfoEnabled = true;
488                 }
489                 else
490                 {
491                         envPlatformInfoEnabled = false;
492                 }
493                 envLoaded = true;
494         }
495
496         if (!envPlatformInfoEnabled)
497         {
498                 return;
499         }
500
501         if (!logInfo.platformInfoEnabled)
502         {
503                 return;
504         }
505
506         va_start(args, pFormat);
507
508         __PrintSysLog(static_cast<_LogType>(LOG_INFO), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
509
510         va_end(args);
511 }
512
513 void
514 SysLogExceptionInternal(unsigned long nid, result r, const char* pFunction, int lineNumber, const char* pFormat, ...)
515 {
516         va_list args;
517
518         SetLastResult(r);
519
520         if (!logInfo.platformExceptionEnabled)
521         {
522                 return;
523         }
524
525         va_start(args, pFormat);
526
527         __PrintSysLog(static_cast<_LogType>(LOG_EXCEPTION), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
528
529         va_end(args);
530 }
531
532 void
533 SysLogTagInternal(unsigned long nid, const char* pTag, const char* pFunction, int lineNumber, const char* pFormat, ...)
534 {
535         va_list args;
536         char* envValuePlatformlogging;
537         char* envValueDebug;
538
539         if (!envLoaded)
540         {
541                 envValuePlatformlogging = getenv("TIZEN_PLATFORMLOGGING_MODE");
542                 envValueDebug = getenv("TIZEN_DEBUG_MODE");
543
544                 if ((envValuePlatformlogging != NULL) && (envValuePlatformlogging[0] == '1'))
545                 {
546                         envPlatformInfoEnabled = true;
547                 }
548                 else if ((envValueDebug != NULL) && (envValueDebug[0] == '1'))
549                 {
550                         envPlatformInfoEnabled = true;
551                 }
552                 else
553                 {
554                         envPlatformInfoEnabled = false;
555                 }
556                 envLoaded = true;
557         }
558
559         if (!envPlatformInfoEnabled)
560         {
561                 return;
562         }
563
564         if (!logInfo.platformInfoEnabled)
565         {
566                 return;
567         }
568
569         va_start(args, pFormat);
570
571         __PrintSysLogTag(pTag, static_cast<_LogType>(LOG_INFO), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
572
573         va_end(args);
574 }
575
576 void
577 SysLogExceptionTagInternal(unsigned long nid, const char* pTag, result r, const char* pFunction, int lineNumber,
578                                                                  const char* pFormat,
579                                                                  ...)
580 {
581         va_list args;
582
583         SetLastResult(r);
584
585         if (!logInfo.platformExceptionEnabled)
586         {
587                 return;
588         }
589
590         va_start(args, pFormat);
591
592         __PrintSysLogTag(pTag, static_cast<_LogType>(LOG_EXCEPTION), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
593
594         va_end(args);
595 }
596
597
598 void
599 SysAssertInternal(const char* pFileName, int lineNumber, const char* pFunction)
600 {
601
602         bool platformDebug;
603         char logBody[LOG_LEN_MAX];
604
605         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
606
607         if(!platformDebug)
608         {
609                 return;
610         }
611
612         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > SysAssert!", pFunction, lineNumber);
613
614         ALOG(LOG_ERROR, LOG_TAG_ASSERT, logBody);
615
616         assert(false);
617 }
618
619 void
620 SysAssertfInternal(const char* expr, const char* pFunction, int lineNumber, const char* pFormat, ...)
621 {
622         char logBody[LOG_LEN_MAX];
623         bool platformDebug;
624         va_list args;
625
626         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
627
628         if(!platformDebug)
629         {
630                 return;
631         }
632
633         va_start(args, pFormat);
634
635         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
636         logBody[LOG_LEN_MAX - 1] = '\0';
637
638         ALOG_VA(LOG_ERROR, LOG_TAG_ASSERT, logBody, args);
639
640         va_end(args);
641
642         assert(false);
643 }
644
645 void
646 SysPropagateInternal(const char* pFunction, int lineNumber, unsigned long nid, result r)
647 {
648         char logBody[PROPAGATION_LEN_MAX];
649         snprintf(logBody, PROPAGATION_LEN_MAX, "%s(%d) > [%s] Propagating to caller...", pFunction, lineNumber, GetErrorMessage(r));
650
651         char logTag[LOG_MODULE_NAME_LEN_MAX];
652         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", __GetModuleName(static_cast<LogID>(nid)));
653
654         ALOG(LOG_ERROR, logTag, logBody);
655 }
656
657 void
658 SysTryReturnResultInternal(unsigned long id, result r, const char* pFunction, int lineNumber, const char* pFormat, ...)
659 {
660
661         va_list args;
662
663         SetLastResult(r);
664
665         if (!logInfo.platformExceptionEnabled)
666         {
667                 return;
668         }
669
670         if (!iniLoaded)
671         {
672                 __InitializeLogInfo();
673         }
674
675         if (!__GetEnableInfo(static_cast<LogID>(id)))
676         {
677                 return;
678         }
679
680         va_start(args, pFormat);
681
682         char logBody[LOG_LEN_MAX];
683         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > [%s] %s", pFunction, lineNumber, GetErrorMessage(r), pFormat);
684         logBody[LOG_LEN_MAX -1] = '\0';
685
686         char logTag[LOG_MODULE_NAME_LEN_MAX];
687
688         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", __GetModuleName(static_cast<LogID>(id)));
689         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
690
691         ALOG_VA(LOG_ERROR, logTag, logBody, args);
692
693         va_end(args);
694 }
695
696
697
698 void
699 __PrintLog(_LogType type, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
700 {
701         if (!iniLoaded)
702         {
703                 __InitializeLogInfo();
704         }
705
706         char logBody[LOG_LEN_MAX];
707         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
708         logBody[LOG_LEN_MAX - 1] = '\0';
709
710         char logTag[LOG_MODULE_NAME_LEN_MAX];
711
712         if (!appNameLoaded)
713         {
714                 appNameLoaded = true;
715                 char* pAppName = _StringConverter::CopyToCharArrayN(_AppInfo::GetAppExecutableName());
716                 strncpy(appName, pAppName, LOG_MODULE_NAME_LEN_MAX);
717                 delete [] pAppName;
718         }
719         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", appName);
720
721         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
722
723         switch (type)
724         {
725         case static_cast<_LogType>(LOG_INFO):
726                 ALOG_VA(LOG_INFO, logTag, logBody, args);
727                 break;
728
729         case static_cast<_LogType>(LOG_DEBUG):
730                 ALOG_VA(LOG_DEBUG, logTag, logBody, args);
731                 break;
732
733         case static_cast<_LogType>(LOG_EXCEPTION):
734                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
735                 break;
736
737         case static_cast<_LogType>(LOG_USER):
738                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
739                 break;
740
741         default:
742                 ALOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
743                 break;
744         }
745 }
746
747 void
748 __PrintLogTag(const char* pTag, _LogType type, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
749 {
750         if (!iniLoaded)
751         {
752                 __InitializeLogInfo();
753         }
754
755         char logBody[LOG_LEN_MAX];
756         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
757         logBody[LOG_LEN_MAX -1] = '\0';
758
759         char logTag[LOG_TAG_LEN_MAX];
760
761         snprintf(logTag, LOG_TAG_LEN_MAX, "%s", pTag);
762         logTag[LOG_TAG_LEN_MAX - 1] = '\0';
763
764         switch (type)
765         {
766         case static_cast<_LogType>(LOG_INFO):
767                 ALOG_VA(LOG_INFO, logTag, logBody, args);
768                 break;
769
770         case static_cast<_LogType>(LOG_DEBUG):
771                 ALOG_VA(LOG_DEBUG, logTag, logBody, args);
772                 break;
773
774         case static_cast<_LogType>(LOG_EXCEPTION):
775                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
776                 break;
777
778         case static_cast<_LogType>(LOG_USER):
779                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
780                 break;
781
782         default:
783                 ALOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
784                 break;
785         }
786 }
787
788
789 void
790 __PrintSysLog(_LogType type, LogID id, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
791 {
792         if (!iniLoaded)
793         {
794                 __InitializeLogInfo();
795         }
796
797         if (!__GetEnableInfo(static_cast<LogID>(id)))
798         {
799                 return;
800         }
801
802         char logBody[LOG_LEN_MAX];
803         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
804         logBody[LOG_LEN_MAX -1] = '\0';
805
806         char logTag[LOG_MODULE_NAME_LEN_MAX];
807
808         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", __GetModuleName(static_cast<LogID>(id)));
809         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
810
811         switch (type)
812         {
813         case static_cast<_LogType>(LOG_INFO):
814                 LOG_VA(LOG_INFO, logTag, logBody, args);
815                 break;
816
817         case static_cast<_LogType>(LOG_DEBUG):
818                 LOG_VA(LOG_DEBUG, logTag, logBody, args);
819                 break;
820
821         case static_cast<_LogType>(LOG_EXCEPTION):
822                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
823                 break;
824
825         case static_cast<_LogType>(LOG_USER):
826                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
827                 break;
828
829         default:
830                 LOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
831                 break;
832         }
833 }
834
835 void
836 __PrintSysLogTag(const char* pTag, _LogType type, LogID id, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
837 {
838         if (!iniLoaded)
839         {
840                 __InitializeLogInfo();
841         }
842
843         if (!__GetEnableInfo(static_cast<LogID>(id)))
844         {
845                 return;
846         }
847
848         char logBody[LOG_LEN_MAX];
849         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
850         logBody[LOG_LEN_MAX -1] = '\0';
851
852         char logTag[LOG_MODULE_NAME_LEN_MAX + LOG_TAG_LEN_MAX];
853
854         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX + LOG_TAG_LEN_MAX, "%s | %s", __GetModuleName(static_cast<LogID>(id)), pTag);
855         logTag[LOG_MODULE_NAME_LEN_MAX + LOG_TAG_LEN_MAX - 1] = '\0';
856
857         switch (type)
858         {
859         case static_cast<_LogType>(LOG_INFO):
860                 LOG_VA(LOG_INFO, logTag, logBody, args);
861                 break;
862
863         case static_cast<_LogType>(LOG_DEBUG):
864                 LOG_VA(LOG_DEBUG, logTag, logBody, args);
865                 break;
866
867         case static_cast<_LogType>(LOG_EXCEPTION):
868                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
869                 break;
870
871         case static_cast<_LogType>(LOG_USER):
872                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
873                 break;
874
875         default:
876                 LOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
877                 break;
878         }
879 }
880
881 char*
882 __GetModuleName(LogID id)
883 {
884         return logInfo.logTable[id].logModuleName;
885 }
886
887 bool
888 __GetEnableInfo(LogID id)
889 {
890         return logInfo.logTable[id].loggingEnabled;
891 }
892
893 void
894 __InitializeLogInfo()
895 {
896         iniLoaded = true;
897
898         Registry reg;
899
900         const String regPath(L"/opt/usr/etc/system-log.ini");
901
902         result r;
903
904         r = reg.Construct(regPath, REG_OPEN_READ_ONLY, 0);
905
906         if (IsFailed(r))
907         {
908                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION] opening ini file failed.\n");
909                 return;
910         }
911
912         __InitializeLogLevel(reg);
913         __InitializePlatformModule(reg);
914 }
915
916 void
917 __InitializeLogLevel(const Registry& reg)
918 {
919         String sectApp(L"Application");
920         String sectPlatform(L"Platform");
921
922         String entryInfo(L"INFO");
923         String entryDebug(L"DEBUG");
924         String entryException(L"EXCEPTION");
925
926         String strYes(L"YES");
927         String retString;
928
929         result r;
930
931         r = reg.GetValue(sectApp, entryInfo, retString);
932         if (IsFailed(r))
933         {
934                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Application/INFO failed.\n");
935                 return;
936         }
937         logInfo.applicationInfoEnabled = retString.Equals(strYes);
938         retString.Clear();
939
940         r = reg.GetValue(sectApp, entryDebug, retString);
941         if (IsFailed(r))
942         {
943                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Application/DEBUG failed.\n");
944                 return;
945         }
946         logInfo.applicationDebugEnabled = retString.Equals(strYes);
947         retString.Clear();
948
949         r = reg.GetValue(sectApp, entryException, retString);
950         if (IsFailed(r))
951         {
952                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Application/EXCEPTION failed.\n");
953                 return;
954         }
955         logInfo.applicationExceptionEnabled = retString.Equals(strYes);
956         retString.Clear();
957
958         r = reg.GetValue(sectPlatform, entryInfo, retString);
959         if (IsFailed(r))
960         {
961                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Platform/INFO failed.\n");
962                 return;
963         }
964         logInfo.platformInfoEnabled = retString.Equals(strYes);
965         retString.Clear();
966
967         r = reg.GetValue(sectPlatform, entryException, retString);
968         if (IsFailed(r))
969         {
970                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Platform/EXCEPTION failed.\n");
971                 return;
972         }
973         logInfo.platformExceptionEnabled = retString.Equals(strYes);
974         retString.Clear();
975 }
976
977 void
978 __InitializePlatformModule(const Registry& reg)
979 {
980         String strYes(L"YES");
981         String retString;
982
983         String sectModule(L"PlatformModules");
984
985         result r;
986
987         for (int i = 0; i < NID_MAX; i++)
988         {
989                 String strEntry(logInfo.logTable[i].logIDName);
990                 r = reg.GetValue(sectModule, strEntry, retString);
991                 if (IsFailed(r))
992                 {
993                         ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION] finding PlatformModules/%ls failed.\n", strEntry.GetPointer());
994                 }
995                 else
996                 {
997                         logInfo.logTable[i].loggingEnabled = retString.Equals(strYes);
998                 }
999
1000                 strEntry.Clear();
1001                 retString.Clear();
1002         }
1003 }
1004