[2.2.1] Merge different codes between 2.2 and 3.0
[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 = false;
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 static 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
485         if (unlikely(!envLoaded))
486         {
487                 int ret = access("/home/developer/.platforminfologgingmode", F_OK);
488                 if (ret == 0)
489                 {
490                         envPlatformInfoEnabled = true;
491                 }
492                 else
493                 {
494                         envPlatformInfoEnabled = false;
495                 }
496
497                 envLoaded = true;
498         }
499
500         if (!envPlatformInfoEnabled)
501         {
502                 return;
503         }
504
505         if (!logInfo.platformInfoEnabled)
506         {
507                 return;
508         }
509
510         va_start(args, pFormat);
511
512         __PrintSysLog(static_cast<_LogType>(LOG_INFO), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
513
514         va_end(args);
515 }
516
517 void
518 SysLogExceptionInternal(unsigned long nid, result r, const char* pFunction, int lineNumber, const char* pFormat, ...)
519 {
520         va_list args;
521
522         SetLastResult(r);
523
524         if (!logInfo.platformExceptionEnabled)
525         {
526                 return;
527         }
528
529         va_start(args, pFormat);
530
531         __PrintSysLog(static_cast<_LogType>(LOG_EXCEPTION), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
532
533         va_end(args);
534 }
535
536 void
537 SysLogTagInternal(unsigned long nid, const char* pTag, const char* pFunction, int lineNumber, const char* pFormat, ...)
538 {
539         va_list args;
540
541         if (unlikely(!envLoaded))
542         {
543                 int ret = access("/home/developer/.platforminfologgingmode", F_OK);
544                 if (ret == 0)
545                 {
546                         envPlatformInfoEnabled = true;
547                 }
548                 else
549                 {
550                         envPlatformInfoEnabled = false;
551                 }
552
553                 envLoaded = true;
554         }
555
556         if (!envPlatformInfoEnabled)
557         {
558                 return;
559         }
560
561         if (!logInfo.platformInfoEnabled)
562         {
563                 return;
564         }
565
566         va_start(args, pFormat);
567
568         __PrintSysLogTag(pTag, static_cast<_LogType>(LOG_INFO), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
569
570         va_end(args);
571 }
572
573 void
574 SysLogExceptionTagInternal(unsigned long nid, const char* pTag, result r, const char* pFunction, int lineNumber,
575                                                                  const char* pFormat,
576                                                                  ...)
577 {
578         va_list args;
579
580         SetLastResult(r);
581
582         if (!logInfo.platformExceptionEnabled)
583         {
584                 return;
585         }
586
587         va_start(args, pFormat);
588
589         __PrintSysLogTag(pTag, static_cast<_LogType>(LOG_EXCEPTION), static_cast<LogID>(nid), pFunction, lineNumber, pFormat, args);
590
591         va_end(args);
592 }
593
594
595 void
596 SysAssertInternal(const char* pFileName, int lineNumber, const char* pFunction)
597 {
598
599         bool platformDebug;
600         char logBody[LOG_LEN_MAX];
601
602         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
603
604         if(!platformDebug)
605         {
606                 return;
607         }
608
609         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > SysAssert!", pFunction, lineNumber);
610
611         ALOG(LOG_ERROR, LOG_TAG_ASSERT, "%s", logBody);
612
613         assert(false);
614 }
615
616 void
617 SysAssertfInternal(const char* expr, const char* pFunction, int lineNumber, const char* pFormat, ...)
618 {
619         char logBody[LOG_LEN_MAX];
620         bool platformDebug;
621         va_list args;
622
623         platformDebug = File::IsFileExist( "/opt/etc/.debugmode");
624
625         if(!platformDebug)
626         {
627                 return;
628         }
629
630         va_start(args, pFormat);
631
632         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
633         logBody[LOG_LEN_MAX - 1] = '\0';
634
635         ALOG_VA(LOG_ERROR, LOG_TAG_ASSERT, logBody, args);
636
637         va_end(args);
638
639         assert(false);
640 }
641
642 void
643 SysPropagateInternal(const char* pFunction, int lineNumber, unsigned long nid, result r)
644 {
645         char logBody[PROPAGATION_LEN_MAX];
646         snprintf(logBody, PROPAGATION_LEN_MAX, "%s(%d) > [%s] Propagating to caller...", pFunction, lineNumber, GetErrorMessage(r));
647
648         char logTag[LOG_MODULE_NAME_LEN_MAX];
649         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", __GetModuleName(static_cast<LogID>(nid)));
650
651         ALOG(LOG_ERROR, logTag, "%s", logBody);
652 }
653
654 void
655 SysTryReturnResultInternal(unsigned long id, result r, const char* pFunction, int lineNumber, const char* pFormat, ...)
656 {
657
658         va_list args;
659
660         SetLastResult(r);
661
662         if (!logInfo.platformExceptionEnabled)
663         {
664                 return;
665         }
666
667         if (!iniLoaded)
668         {
669                 __InitializeLogInfo();
670         }
671
672         if (!__GetEnableInfo(static_cast<LogID>(id)))
673         {
674                 return;
675         }
676
677         va_start(args, pFormat);
678
679         char logBody[LOG_LEN_MAX];
680         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > [%s] %s", pFunction, lineNumber, GetErrorMessage(r), pFormat);
681         logBody[LOG_LEN_MAX -1] = '\0';
682
683         char logTag[LOG_MODULE_NAME_LEN_MAX];
684
685         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", __GetModuleName(static_cast<LogID>(id)));
686         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
687
688         ALOG_VA(LOG_ERROR, logTag, logBody, args);
689
690         va_end(args);
691 }
692
693
694
695 void
696 __PrintLog(_LogType type, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
697 {
698         if (unlikely(!iniLoaded))
699         {
700                 __InitializeLogInfo();
701         }
702
703         char logBody[LOG_LEN_MAX];
704         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
705         logBody[LOG_LEN_MAX - 1] = '\0';
706
707         char logTag[LOG_MODULE_NAME_LEN_MAX];
708
709         if (unlikely(!appNameLoaded))
710         {
711                 appNameLoaded = true;
712                 char* pAppName = _StringConverter::CopyToCharArrayN(_AppInfo::GetAppExecutableName());
713                 strncpy(appName, pAppName, LOG_MODULE_NAME_LEN_MAX);
714                 delete [] pAppName;
715         }
716         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", appName);
717
718         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
719
720         switch (type)
721         {
722         case static_cast<_LogType>(LOG_INFO):
723                 ALOG_VA(LOG_INFO, logTag, logBody, args);
724                 break;
725
726         case static_cast<_LogType>(LOG_DEBUG):
727                 ALOG_VA(LOG_DEBUG, logTag, logBody, args);
728                 break;
729
730         case static_cast<_LogType>(LOG_EXCEPTION):
731                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
732                 break;
733
734         case static_cast<_LogType>(LOG_USER):
735                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
736                 break;
737
738         default:
739                 ALOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
740                 break;
741         }
742 }
743
744 void
745 __PrintLogTag(const char* pTag, _LogType type, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
746 {
747         if (unlikely(!iniLoaded))
748         {
749                 __InitializeLogInfo();
750         }
751
752         char logBody[LOG_LEN_MAX];
753         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
754         logBody[LOG_LEN_MAX -1] = '\0';
755
756         char logTag[LOG_TAG_LEN_MAX];
757
758         snprintf(logTag, LOG_TAG_LEN_MAX, "%s", pTag);
759         logTag[LOG_TAG_LEN_MAX - 1] = '\0';
760
761         switch (type)
762         {
763         case static_cast<_LogType>(LOG_INFO):
764                 ALOG_VA(LOG_INFO, logTag, logBody, args);
765                 break;
766
767         case static_cast<_LogType>(LOG_DEBUG):
768                 ALOG_VA(LOG_DEBUG, logTag, logBody, args);
769                 break;
770
771         case static_cast<_LogType>(LOG_EXCEPTION):
772                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
773                 break;
774
775         case static_cast<_LogType>(LOG_USER):
776                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
777                 break;
778
779         default:
780                 ALOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
781                 break;
782         }
783 }
784
785
786 void
787 __PrintSysLog(_LogType type, LogID id, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
788 {
789         if (unlikely(!iniLoaded))
790         {
791                 __InitializeLogInfo();
792         }
793
794         if (!__GetEnableInfo(static_cast<LogID>(id)))
795         {
796                 return;
797         }
798
799         char logBody[LOG_LEN_MAX];
800         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
801         logBody[LOG_LEN_MAX -1] = '\0';
802
803         char logTag[LOG_MODULE_NAME_LEN_MAX];
804
805         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX, "%s", __GetModuleName(static_cast<LogID>(id)));
806         logTag[LOG_MODULE_NAME_LEN_MAX - 1] = '\0';
807
808         switch (type)
809         {
810         case static_cast<_LogType>(LOG_INFO):
811                 ALOG_VA(LOG_INFO, logTag, logBody, args);
812                 break;
813
814         case static_cast<_LogType>(LOG_DEBUG):
815                 ALOG_VA(LOG_DEBUG, logTag, logBody, args);
816                 break;
817
818         case static_cast<_LogType>(LOG_EXCEPTION):
819                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
820                 break;
821
822         case static_cast<_LogType>(LOG_USER):
823                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
824                 break;
825
826         default:
827                 ALOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
828                 break;
829         }
830 }
831
832 void
833 __PrintSysLogTag(const char* pTag, _LogType type, LogID id, const char* pFunction, int lineNumber, const char* pFormat, va_list args)
834 {
835         if (unlikely(!iniLoaded))
836         {
837                 __InitializeLogInfo();
838         }
839
840         if (!__GetEnableInfo(static_cast<LogID>(id)))
841         {
842                 return;
843         }
844
845         char logBody[LOG_LEN_MAX];
846         snprintf(logBody, LOG_LEN_MAX, "%s(%d) > %s", pFunction, lineNumber, pFormat);
847         logBody[LOG_LEN_MAX -1] = '\0';
848
849         char logTag[LOG_MODULE_NAME_LEN_MAX + LOG_TAG_LEN_MAX];
850
851         snprintf(logTag, LOG_MODULE_NAME_LEN_MAX + LOG_TAG_LEN_MAX, "%s | %s", __GetModuleName(static_cast<LogID>(id)), pTag);
852         logTag[LOG_MODULE_NAME_LEN_MAX + LOG_TAG_LEN_MAX - 1] = '\0';
853
854         switch (type)
855         {
856         case static_cast<_LogType>(LOG_INFO):
857                 ALOG_VA(LOG_INFO, logTag, logBody, args);
858                 break;
859
860         case static_cast<_LogType>(LOG_DEBUG):
861                 ALOG_VA(LOG_DEBUG, logTag, logBody, args);
862                 break;
863
864         case static_cast<_LogType>(LOG_EXCEPTION):
865                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
866                 break;
867
868         case static_cast<_LogType>(LOG_USER):
869                 ALOG_VA(LOG_ERROR, logTag, logBody, args);
870                 break;
871
872         default:
873                 ALOG_VA(LOG_DEBUG, LOG_TAG_NULL, logBody, args);
874                 break;
875         }
876 }
877
878 const char*
879 __GetModuleName(LogID id)
880 {
881         return logInfo.logTable[id].logModuleName;
882 }
883
884 bool
885 __GetEnableInfo(LogID id)
886 {
887         return logInfo.logTable[id].loggingEnabled;
888 }
889
890 void
891 __InitializeLogInfo()
892 {
893         iniLoaded = true;
894
895         Registry reg;
896
897         const String regPath(L"/opt/usr/etc/system-log.ini");
898
899         result r;
900
901         r = reg.Construct(regPath, REG_OPEN_READ_ONLY, 0);
902
903         if (IsFailed(r))
904         {
905                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION] opening ini file failed.\n");
906                 return;
907         }
908
909         __InitializeLogLevel(reg);
910         __InitializePlatformModule(reg);
911 }
912
913 void
914 __InitializeLogLevel(const Registry& reg)
915 {
916         const String sectApp(L"Application");
917         const String sectPlatform(L"Platform");
918
919         const String entryInfo(L"INFO");
920         const String entryDebug(L"DEBUG");
921         const String entryException(L"EXCEPTION");
922
923         const String strYes(L"YES");
924         String retString;
925
926         result r;
927
928         r = reg.GetValue(sectApp, entryInfo, retString);
929         if (IsFailed(r))
930         {
931                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Application/INFO failed.\n");
932                 return;
933         }
934         logInfo.applicationInfoEnabled = retString.Equals(strYes);
935         retString.Clear();
936
937         r = reg.GetValue(sectApp, entryDebug, retString);
938         if (IsFailed(r))
939         {
940                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Application/DEBUG failed.\n");
941                 return;
942         }
943         logInfo.applicationDebugEnabled = retString.Equals(strYes);
944         retString.Clear();
945
946         r = reg.GetValue(sectApp, entryException, retString);
947         if (IsFailed(r))
948         {
949                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Application/EXCEPTION failed.\n");
950                 return;
951         }
952         logInfo.applicationExceptionEnabled = retString.Equals(strYes);
953         retString.Clear();
954
955         r = reg.GetValue(sectPlatform, entryInfo, retString);
956         if (IsFailed(r))
957         {
958                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Platform/INFO failed.\n");
959                 return;
960         }
961         logInfo.platformInfoEnabled = retString.Equals(strYes);
962         retString.Clear();
963
964         r = reg.GetValue(sectPlatform, entryException, retString);
965         if (IsFailed(r))
966         {
967                 ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION]  finding Platform/EXCEPTION failed.\n");
968                 return;
969         }
970         logInfo.platformExceptionEnabled = retString.Equals(strYes);
971         retString.Clear();
972 }
973
974 void
975 __InitializePlatformModule(const Registry& reg)
976 {
977         const String strYes(L"YES");
978         String retString;
979
980         const String sectModule(L"PlatformModules");
981
982         result r;
983
984         for (int i = 0; i < NID_MAX; i++)
985         {
986                 String strEntry(logInfo.logTable[i].logIDName);
987                 r = reg.GetValue(sectModule, strEntry, retString);
988                 if (IsFailed(r))
989                 {
990                         ALOG(LOG_ERROR, LOG_TAG, "[EXCEPTION] finding PlatformModules/%ls failed.\n", strEntry.GetPointer());
991                 }
992                 else
993                 {
994                         logInfo.logTable[i].loggingEnabled = retString.Equals(strYes);
995                 }
996
997                 strEntry.Clear();
998                 retString.Clear();
999         }
1000 }
1001