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