Fix the boiler plate codes
[platform/framework/native/appfw.git] / src / base / FBaseSys.cpp
1 //
2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //     http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 /**
18  * @file                FBaseSys.cpp
19  * @brief               This file defines the diagnostics types.
20  */
21
22 #include <vconf.h>
23 #include <dlog.h>
24 #include <assert.h>
25 #include <stdio.h>
26 #include <unistd.h>
27 #include <string.h>
28 #include <sys/syscall.h>
29 #include <sys/types.h>
30 #include <FIoRegistry.h>
31 #include <FIoFile.h>
32 #include <FAppTypes.h>
33 #include <FBaseLog.h>
34 #include <FBaseSysLog.h>
35 #include "FBase_Log.h"
36 #include "FBase_StringConverter.h"
37 #include "FApp_AppInfo.h"
38
39 using namespace Tizen::Base;
40 using namespace Tizen::Io;
41 using namespace Tizen::Base::Collection;
42 using namespace Tizen::App;
43
44 #ifdef LOG_TAG
45 #undef LOG_TAG
46 #define LOG_TAG "OSP_SLP"
47 #define LOG_TAG_NULL ""
48 #endif
49
50 static const char LOG_TAG_ASSERT[] = "Assert";
51
52 bool iniLoaded = false;
53
54 static bool appNameLoaded = false;
55 static char appName[LOG_MODULE_NAME_LEN_MAX];
56
57 static bool envLoaded = false;
58 static bool envPlatformInfoEnabled = true;
59
60 #define APP_RESERVED(X) NID_APP+X
61 #define BASE_RESERVED(X) NID_BASE+X
62 #define CNT_RESERVED(X) NID_CNT+X
63 #define CTXT_RESERVED(X) NID_CTXT+X
64 #define GRP_RESERVED(X) NID_GRP+X
65
66 #define IO_RESERVED(X) NID_IO+X
67 #define LCL_RESERVED(X) NID_LCL+X
68 #define LOC_RESERVED(X) NID_LOC+X
69 #define MEDIA_RESERVED(X) NID_MEDIA+X
70 #define MSG_RESERVED(X) NID_MSG+X
71
72 #define NET_RESERVED(X) NID_NET+X
73 #define SEC_RESERVED(X) NID_SEC+X
74 #define SCL_RESERVED(X) NID_SCL+X
75 #define SYS_RESERVED(X) NID_SYS+X
76 #define TEL_RESERVED(X) NID_TEL+X
77
78 #define TEXT_RESERVED(X) NID_TEXT+X
79 #define UI_RESERVED(X) NID_UI+X
80 #define UIX_RESERVED(X) NID_UIX+X
81 #define WEB_RESERVED(X) NID_WEB+X
82 #define SHELL_RESERVED(X) NID_SHELL+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                 {NID_SHELL, "NID_SHELL", "Tizen::Shell", true},
298                 {SHELL_RESERVED(1) , "RESERVED", "", false},
299                 {SHELL_RESERVED(2) , "RESERVED", "", false},
300                 {SHELL_RESERVED(3) , "RESERVED", "", false},
301                 {SHELL_RESERVED(4) , "RESERVED", "", false},
302                 {SHELL_RESERVED(5) , "RESERVED", "", false},
303                 {SHELL_RESERVED(6) , "RESERVED", "", false},
304                 {SHELL_RESERVED(7) , "RESERVED", "", false},
305                 {SHELL_RESERVED(8) , "RESERVED", "", false},
306                 {SHELL_RESERVED(9) , "RESERVED", "", false}
307
308         },
309
310         // Other properties ===========================================================
311         false,          // consoleOut
312         false,          // fileOut
313
314         true,           //platformInfoEnabled;
315         true,           //platformExceptionEnabled;
316
317         true,           // applicationInfoEnabled
318         true,           // applicationDebugEnabled
319         true,           // applicationExceptionEnabled
320
321 };
322
323 void
324 AppLogInternal(const char* pFunction, int lineNumber, const char* pFormat, ...)
325 {
326         va_list args;
327
328         if (!logInfo.applicationInfoEnabled)
329         {
330                 return;
331         }
332
333         va_start(args, pFormat);
334
335         __PrintLog(static_cast<_LogType>(LOG_INFO), pFunction, lineNumber, pFormat, args);
336
337         va_end(args);
338 }
339
340 void
341 AppLogTagInternal(const char* pTag, const char* pFunction, int lineNumber, const char* pFormat, ...)
342 {
343         va_list args;
344
345         if (!logInfo.applicationInfoEnabled)
346         {
347                 return;
348         }
349
350         va_start(args, pFormat);
351
352         __PrintLogTag(pTag, static_cast<_LogType>(LOG_INFO), pFunction, lineNumber, pFormat, args);
353
354         va_end(args);
355 }
356
357 void
358 AppLogDebugInternal(const char* pFunction, int lineNumber, const char* pFormat, ...)
359 {
360         va_list args;
361
362         if (!logInfo.applicationDebugEnabled)
363         {
364                 return;
365         }
366
367         va_start(args, pFormat);
368
369         __PrintLog(static_cast<_LogType>(LOG_DEBUG), pFunction, lineNumber, pFormat, args);
370
371         va_end(args);
372 }
373
374 void
375 AppLogDebugTagInternal(const char* pTag, const char* pFunction, int lineNumber, const char* pFormat, ...)
376 {
377         va_list args;
378
379         if (!logInfo.applicationDebugEnabled)
380         {
381                 return;
382         }
383
384         va_start(args, pFormat);
385
386         __PrintLogTag(pTag, static_cast<_LogType>(LOG_DEBUG), pFunction, lineNumber, pFormat, args);
387
388         va_end(args);
389 }
390
391 void
392 AppLogExceptionInternal(const char* pFunction, int lineNumber, const char* pFormat, ...)
393 {
394         va_list args;
395
396         if (!logInfo.applicationExceptionEnabled)
397         {
398                 return;
399         }
400
401         va_start(args, pFormat);
402
403         __PrintLog(static_cast<_LogType>(LOG_EXCEPTION), pFunction, lineNumber, pFormat, args);
404
405         va_end(args);
406 }
407
408 void
409 AppLogExceptionTagInternal(const char* pTag, const char* pFunction, int lineNumber, const char* pFormat, ...)
410 {
411         va_list args;
412
413         if (!logInfo.applicationExceptionEnabled)
414         {
415                 return;
416         }
417
418         va_start(args, pFormat);
419
420         __PrintLogTag(pTag, static_cast<_LogType>(LOG_EXCEPTION), pFunction, lineNumber, pFormat, args);
421
422         va_end(args);
423 }
424
425 void
426 AppassertInternal(const char* pFunction, int lineNumber)
427 {
428         char logBody[LOG_LEN_MAX];
429         bool platformDebug;
430         int appDebug;
431         char logTag[LOG_MODULE_NAME_LEN_MAX];
432
433         vconf_get_bool(VCONFKEY_SETAPPL_USB_DEBUG_MODE_BOOL, &appDebug);
434         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
435
436         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", appName);
437         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
438
439         if( (platformDebug == false) && (appDebug == 0) )
440         {
441                 snprintf(logBody, LOG_LEN_MAX, "%s(%d) > App assertion passed due to debug mode off!", pFunction, lineNumber);
442                 ALOG(LOG_ERROR, logTag, "%s", logBody);
443                 return;
444         }
445
446         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > AppAssert!", pFunction, lineNumber);
447         ALOG(LOG_ERROR, logTag, "%s", logBody);
448
449         assert(false);
450 }
451
452 void
453 AppassertfInternal(const char* expr, const char* pFunction, int lineNumber, const char* pFormat, ...)
454 {
455         char logBody[LOG_LEN_MAX];
456         bool platformDebug;
457         int appDebug;
458         va_list args;
459         va_start(args, pFormat);
460
461         vconf_get_bool(VCONFKEY_SETAPPL_USB_DEBUG_MODE_BOOL, &appDebug);
462         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
463
464         if( (platformDebug == false) && (appDebug == 0) )
465         {
466                 snprintf(logBody, LOG_LEN_MAX, "App assertion passed due to debug mode off! : %s", pFormat);
467                 __PrintLog(static_cast<_LogType>(LOG_USER), pFunction, lineNumber, logBody, args);
468                 va_end(args);
469                 return;
470         }
471
472         __PrintLog(static_cast<_LogType>(LOG_USER), pFunction, lineNumber, pFormat, args);
473
474         va_end(args);
475
476         assert(false);
477 }
478
479
480 void
481 SysLogInternal(unsigned long nid, const char* pFunction, int lineNumber, const char* pFormat, ...)
482 {
483         va_list args;
484         char* envValuePlatformlogging;
485         char* envValueDebug;
486
487         if (!envLoaded)
488         {
489                 envValuePlatformlogging = getenv("TIZEN_PLATFORMLOGGING_MODE");
490                 envValueDebug = getenv("TIZEN_DEBUG_MODE");
491
492                 if ((envValuePlatformlogging != NULL) && (envValuePlatformlogging[0] == '1'))
493                 {
494                         envPlatformInfoEnabled = true;
495                 }
496                 else if ((envValueDebug != NULL) && (envValueDebug[0] == '1'))
497                 {
498                         envPlatformInfoEnabled = true;
499                 }
500                 else
501                 {
502                         envPlatformInfoEnabled = false;
503                 }
504                 envLoaded = true;
505         }
506
507         if (!envPlatformInfoEnabled)
508         {
509                 return;
510         }
511
512         if (!logInfo.platformInfoEnabled)
513         {
514                 return;
515         }
516
517         va_start(args, pFormat);
518
519         __PrintSysLog(static_cast<_LogType>(LOG_INFO), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
520
521         va_end(args);
522 }
523
524 void
525 SysLogExceptionInternal(unsigned long nid, result r, const char* pFunction, int lineNumber, const char* pFormat, ...)
526 {
527         va_list args;
528
529         SetLastResult(r);
530
531         if (!logInfo.platformExceptionEnabled)
532         {
533                 return;
534         }
535
536         va_start(args, pFormat);
537
538         __PrintSysLog(static_cast<_LogType>(LOG_EXCEPTION), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
539
540         va_end(args);
541 }
542
543 void
544 SysLogTagInternal(unsigned long nid, const char* pTag, const char* pFunction, int lineNumber, const char* pFormat, ...)
545 {
546         va_list args;
547         char* envValuePlatformlogging;
548         char* envValueDebug;
549
550         if (!envLoaded)
551         {
552                 envValuePlatformlogging = getenv("TIZEN_PLATFORMLOGGING_MODE");
553                 envValueDebug = getenv("TIZEN_DEBUG_MODE");
554
555                 if ((envValuePlatformlogging != NULL) && (envValuePlatformlogging[0] == '1'))
556                 {
557                         envPlatformInfoEnabled = true;
558                 }
559                 else if ((envValueDebug != NULL) && (envValueDebug[0] == '1'))
560                 {
561                         envPlatformInfoEnabled = true;
562                 }
563                 else
564                 {
565                         envPlatformInfoEnabled = false;
566                 }
567                 envLoaded = true;
568         }
569
570         if (!envPlatformInfoEnabled)
571         {
572                 return;
573         }
574
575         if (!logInfo.platformInfoEnabled)
576         {
577                 return;
578         }
579
580         va_start(args, pFormat);
581
582         __PrintSysLogTag(pTag, static_cast<_LogType>(LOG_INFO), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
583
584         va_end(args);
585 }
586
587 void
588 SysLogExceptionTagInternal(unsigned long nid, const char* pTag, result r, const char* pFunction, int lineNumber,
589                                                                  const char* pFormat,
590                                                                  ...)
591 {
592         va_list args;
593
594         SetLastResult(r);
595
596         if (!logInfo.platformExceptionEnabled)
597         {
598                 return;
599         }
600
601         va_start(args, pFormat);
602
603         __PrintSysLogTag(pTag, static_cast<_LogType>(LOG_EXCEPTION), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
604
605         va_end(args);
606 }
607
608
609 void
610 SysAssertInternal(const char* pFileName, int lineNumber, const char* pFunction)
611 {
612
613         bool platformDebug;
614         char logBody[LOG_LEN_MAX];
615
616         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
617
618         if(!platformDebug)
619         {
620                 return;
621         }
622
623         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > SysAssert!", pFunction, lineNumber);
624
625         ALOG(LOG_ERROR, LOG_TAG_ASSERT, "%s", logBody);
626
627         assert(false);
628 }
629
630 void
631 SysAssertfInternal(const char* expr, const char* pFunction, int lineNumber, const char* pFormat, ...)
632 {
633         char logBody[LOG_LEN_MAX];
634         bool platformDebug;
635         va_list args;
636
637         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
638
639         if(!platformDebug)
640         {
641                 return;
642         }
643
644         va_start(args, pFormat);
645
646         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
647         logBody[LOG_LEN_MAX - 1] = '\0';
648
649         ALOG_VA(LOG_ERROR, LOG_TAG_ASSERT, logBody, args);
650
651         va_end(args);
652
653         assert(false);
654 }
655
656 void
657 SysPropagateInternal(const char* pFunction, int lineNumber, unsigned long nid, result r)
658 {
659         char logBody[PROPAGATION_LEN_MAX];
660         snprintf(logBody, PROPAGATION_LEN_MAX, "%s(%d) > [%s] Propagating to caller...", pFunction, lineNumber, GetErrorMessage(r));
661
662         char logTag[LOG_MODULE_NAME_LEN_MAX];
663         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", __GetModuleName(static_cast<LogID>(nid)));
664
665         ALOG(LOG_ERROR, logTag, "%s", logBody);
666 }
667
668 void
669 SysTryReturnResultInternal(unsigned long id, result r, const char* pFunction, int lineNumber, const char* pFormat, ...)
670 {
671
672         va_list args;
673
674         SetLastResult(r);
675
676         if (!logInfo.platformExceptionEnabled)
677         {
678                 return;
679         }
680
681         if (!iniLoaded)
682         {
683                 __InitializeLogInfo();
684         }
685
686         if (!__GetEnableInfo(static_cast<LogID>(id)))
687         {
688                 return;
689         }
690
691         va_start(args, pFormat);
692
693         char logBody[LOG_LEN_MAX];
694         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > [%s] %s", pFunction, lineNumber, GetErrorMessage(r), pFormat);
695         logBody[LOG_LEN_MAX -1] = '\0';
696
697         char logTag[LOG_MODULE_NAME_LEN_MAX];
698
699         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", __GetModuleName(static_cast<LogID>(id)));
700         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
701
702         ALOG_VA(LOG_ERROR, logTag, logBody, args);
703
704         va_end(args);
705 }
706
707
708
709 void
710 __PrintLog(_LogType type, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
711 {
712         if (!iniLoaded)
713         {
714                 __InitializeLogInfo();
715         }
716
717         char logBody[LOG_LEN_MAX];
718         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
719         logBody[LOG_LEN_MAX - 1] = '\0';
720
721         char logTag[LOG_MODULE_NAME_LEN_MAX];
722
723         if (!appNameLoaded)
724         {
725                 appNameLoaded = true;
726                 char* pAppName = _StringConverter::CopyToCharArrayN(_AppInfo::GetAppExecutableName());
727                 strncpy(appName, pAppName, LOG_MODULE_NAME_LEN_MAX);
728                 delete [] pAppName;
729         }
730         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", appName);
731
732         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
733
734         switch (type)
735         {
736         case static_cast<_LogType>(LOG_INFO):
737                 ALOG_VA(LOG_INFO, logTag, logBody, args);
738                 break;
739
740         case static_cast<_LogType>(LOG_DEBUG):
741                 ALOG_VA(LOG_DEBUG, logTag, logBody, args);
742                 break;
743
744         case static_cast<_LogType>(LOG_EXCEPTION):
745                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
746                 break;
747
748         case static_cast<_LogType>(LOG_USER):
749                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
750                 break;
751
752         default:
753                 ALOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
754                 break;
755         }
756 }
757
758 void
759 __PrintLogTag(const char* pTag, _LogType type, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
760 {
761         if (!iniLoaded)
762         {
763                 __InitializeLogInfo();
764         }
765
766         char logBody[LOG_LEN_MAX];
767         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
768         logBody[LOG_LEN_MAX -1] = '\0';
769
770         char logTag[LOG_TAG_LEN_MAX];
771
772         snprintf(logTag, LOG_TAG_LEN_MAX, "%s", pTag);
773         logTag[LOG_TAG_LEN_MAX - 1] = '\0';
774
775         switch (type)
776         {
777         case static_cast<_LogType>(LOG_INFO):
778                 ALOG_VA(LOG_INFO, logTag, logBody, args);
779                 break;
780
781         case static_cast<_LogType>(LOG_DEBUG):
782                 ALOG_VA(LOG_DEBUG, logTag, logBody, args);
783                 break;
784
785         case static_cast<_LogType>(LOG_EXCEPTION):
786                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
787                 break;
788
789         case static_cast<_LogType>(LOG_USER):
790                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
791                 break;
792
793         default:
794                 ALOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
795                 break;
796         }
797 }
798
799
800 void
801 __PrintSysLog(_LogType type, LogID id, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
802 {
803         if (!iniLoaded)
804         {
805                 __InitializeLogInfo();
806         }
807
808         if (!__GetEnableInfo(static_cast<LogID>(id)))
809         {
810                 return;
811         }
812
813         char logBody[LOG_LEN_MAX];
814         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
815         logBody[LOG_LEN_MAX -1] = '\0';
816
817         char logTag[LOG_MODULE_NAME_LEN_MAX];
818
819         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", __GetModuleName(static_cast<LogID>(id)));
820         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
821
822         switch (type)
823         {
824         case static_cast<_LogType>(LOG_INFO):
825                 LOG_VA(LOG_INFO, logTag, logBody, args);
826                 break;
827
828         case static_cast<_LogType>(LOG_DEBUG):
829                 LOG_VA(LOG_DEBUG, logTag, logBody, args);
830                 break;
831
832         case static_cast<_LogType>(LOG_EXCEPTION):
833                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
834                 break;
835
836         case static_cast<_LogType>(LOG_USER):
837                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
838                 break;
839
840         default:
841                 LOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
842                 break;
843         }
844 }
845
846 void
847 __PrintSysLogTag(const char* pTag, _LogType type, LogID id, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
848 {
849         if (!iniLoaded)
850         {
851                 __InitializeLogInfo();
852         }
853
854         if (!__GetEnableInfo(static_cast<LogID>(id)))
855         {
856                 return;
857         }
858
859         char logBody[LOG_LEN_MAX];
860         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
861         logBody[LOG_LEN_MAX -1] = '\0';
862
863         char logTag[LOG_MODULE_NAME_LEN_MAX + LOG_TAG_LEN_MAX];
864
865         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX + LOG_TAG_LEN_MAX, "%s | %s", __GetModuleName(static_cast<LogID>(id)), pTag);
866         logTag[LOG_MODULE_NAME_LEN_MAX + LOG_TAG_LEN_MAX - 1] = '\0';
867
868         switch (type)
869         {
870         case static_cast<_LogType>(LOG_INFO):
871                 LOG_VA(LOG_INFO, logTag, logBody, args);
872                 break;
873
874         case static_cast<_LogType>(LOG_DEBUG):
875                 LOG_VA(LOG_DEBUG, logTag, logBody, args);
876                 break;
877
878         case static_cast<_LogType>(LOG_EXCEPTION):
879                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
880                 break;
881
882         case static_cast<_LogType>(LOG_USER):
883                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
884                 break;
885
886         default:
887                 LOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
888                 break;
889         }
890 }
891
892 char*
893 __GetModuleName(LogID id)
894 {
895         return logInfo.logTable[id].logModuleName;
896 }
897
898 bool
899 __GetEnableInfo(LogID id)
900 {
901         return logInfo.logTable[id].loggingEnabled;
902 }
903
904 void
905 __InitializeLogInfo()
906 {
907         iniLoaded = true;
908
909         Registry reg;
910
911         const String regPath(L"/opt/usr/etc/system-log.ini");
912
913         result r;
914
915         r = reg.Construct(regPath, REG_OPEN_READ_ONLY, 0);
916
917         if (IsFailed(r))
918         {
919                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION] opening ini file failed.\n");
920                 return;
921         }
922
923         __InitializeLogLevel(reg);
924         __InitializePlatformModule(reg);
925 }
926
927 void
928 __InitializeLogLevel(const Registry& reg)
929 {
930         String sectApp(L"Application");
931         String sectPlatform(L"Platform");
932
933         String entryInfo(L"INFO");
934         String entryDebug(L"DEBUG");
935         String entryException(L"EXCEPTION");
936
937         String strYes(L"YES");
938         String retString;
939
940         result r;
941
942         r = reg.GetValue(sectApp, entryInfo, retString);
943         if (IsFailed(r))
944         {
945                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Application/INFO failed.\n");
946                 return;
947         }
948         logInfo.applicationInfoEnabled = retString.Equals(strYes);
949         retString.Clear();
950
951         r = reg.GetValue(sectApp, entryDebug, retString);
952         if (IsFailed(r))
953         {
954                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Application/DEBUG failed.\n");
955                 return;
956         }
957         logInfo.applicationDebugEnabled = retString.Equals(strYes);
958         retString.Clear();
959
960         r = reg.GetValue(sectApp, entryException, retString);
961         if (IsFailed(r))
962         {
963                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Application/EXCEPTION failed.\n");
964                 return;
965         }
966         logInfo.applicationExceptionEnabled = retString.Equals(strYes);
967         retString.Clear();
968
969         r = reg.GetValue(sectPlatform, entryInfo, retString);
970         if (IsFailed(r))
971         {
972                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Platform/INFO failed.\n");
973                 return;
974         }
975         logInfo.platformInfoEnabled = retString.Equals(strYes);
976         retString.Clear();
977
978         r = reg.GetValue(sectPlatform, entryException, retString);
979         if (IsFailed(r))
980         {
981                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Platform/EXCEPTION failed.\n");
982                 return;
983         }
984         logInfo.platformExceptionEnabled = retString.Equals(strYes);
985         retString.Clear();
986 }
987
988 void
989 __InitializePlatformModule(const Registry& reg)
990 {
991         String strYes(L"YES");
992         String retString;
993
994         String sectModule(L"PlatformModules");
995
996         result r;
997
998         for (int i = 0; i < NID_MAX; i++)
999         {
1000                 String strEntry(logInfo.logTable[i].logIDName);
1001                 r = reg.GetValue(sectModule, strEntry, retString);
1002                 if (IsFailed(r))
1003                 {
1004                         ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION] finding PlatformModules/%ls failed.\n", strEntry.GetPointer());
1005                 }
1006                 else
1007                 {
1008                         logInfo.logTable[i].loggingEnabled = retString.Equals(strYes);
1009                 }
1010
1011                 strEntry.Clear();
1012                 retString.Clear();
1013         }
1014 }
1015