hxsym_dprintf.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:4k
源码类别:

Symbian

开发平台:

C/C++

  1. /*****************************************************************************
  2.  * hxsym_log_util.cpp
  3.  * ---------------
  4.  *
  5.  *
  6.  * Target:
  7.  * Symbian OS
  8.  *
  9.  *
  10.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  11.  *
  12.  *****************************************************************************/
  13. // Symbian includes... 
  14. #include <e32base.h>
  15. #include <e32def.h>
  16. #include <e32svr.h>
  17. #include <string.h>
  18. #include <stdarg.h>
  19. #include "safestring.h"
  20. #include "hxtypes.h"
  21. #include "hxtime.h"
  22. #include "hxassert.h"
  23. #include "hxsym_console_util.h"
  24. #include "hxsym_dprintf.h"
  25. #if !defined (HELIX_FEATURE_DPRINTF)
  26. #error file should not be included in build
  27. #endif
  28. namespace
  29. {
  30. // called by dprintf
  31. void dprintfHelper(const char* fmt, va_list args)
  32.     const UINT32 BUF_SIZE = 4096;
  33.     CHXString str;
  34.     char *pszBuf = str.GetBuffer(BUF_SIZE);
  35.     if (!pszBuf)
  36.     {
  37. return;
  38.     }
  39.     TInt idxBuf = 0;
  40.     DPrintfData* pData = dprintfGetData();
  41.     if (!pData)
  42.     {
  43.         return;
  44.     }
  45.     //
  46.     // print dprint header
  47.     //
  48.     // get date and time (assume we'll be printing)
  49.     HXTime now;
  50.     gettimeofday(&now, 0);
  51.     struct tm* tm = localtime((const time_t *)&now.tv_sec);
  52.     if(pData->printFlags & PRINT_DATE)
  53.     {
  54.         idxBuf += strftime(pszBuf + idxBuf, BUF_SIZE - idxBuf, "%d-%b-%y ", tm);
  55.     }
  56.     if(pData->printFlags & PRINT_TIME)
  57.     {
  58.         if(pData->printFlags & PRINT_TIME_INCLUDE_MS)
  59.         {
  60.             idxBuf += strftime(pszBuf + idxBuf, BUF_SIZE - idxBuf, "%H:%M:%S", tm);
  61.             idxBuf += SafeSprintf(pszBuf + idxBuf, BUF_SIZE - idxBuf, ":%03lu ", now.tv_usec/1000);
  62.         }
  63.         else
  64.         {
  65.             idxBuf += strftime(pszBuf + idxBuf, BUF_SIZE - idxBuf, "%H:%M:%S ", tm);
  66.         }
  67.     }
  68.     if(pData->printFlags & PRINT_TID)
  69.     {
  70.         TThreadId tid = RThread().Id();
  71.         idxBuf += SafeSprintf(pszBuf + idxBuf, BUF_SIZE - idxBuf, "(%d) ", tid);
  72.     }
  73.     //
  74.     // print text
  75.     //
  76.     HX_ASSERT(BUF_SIZE - idxBuf > 0);
  77.     vsnprintf(pszBuf + idxBuf, BUF_SIZE - idxBuf, fmt, args);
  78.     CHXString strName = pData->sinkName;
  79.     if(!strName.IsEmpty())
  80.     {
  81.         if( 0 == strName.CompareNoCase("console") )
  82.         {
  83.             // send to console
  84.             PrintConsole(pszBuf);
  85.         }
  86.         else
  87.         {
  88.             // send to logfile
  89.             FILE* file = fopen(strName, "a+");
  90.             if( file )
  91.             {
  92.                 fprintf(file, pszBuf);
  93.                 fclose(file);
  94.             }
  95.         }
  96.     } 
  97. }
  98. } // locals
  99. static void destroyDPrintfData(void* pObj)
  100. {
  101.     DPrintfData* pData = (DPrintfData*)pObj;
  102.     delete pData;
  103. }
  104. DPrintfData* dprintfGetData()
  105. {
  106.     static const INT32 key = 0;
  107.     HXGlobalManager* pGM = HXGlobalManager::Instance();
  108.     DPrintfData** ppData = reinterpret_cast<DPrintfData**>(pGM->Get(&key));
  109.     DPrintfData* pRet = NULL;
  110.     
  111.     if (!ppData)
  112.     {
  113. pRet = new DPrintfData();
  114. if (pRet)
  115. {
  116.     pGM->Add(&key, pRet, &destroyDPrintfData);
  117. }
  118.     }
  119.     else
  120.     {
  121. pRet = *ppData;
  122.     }
  123.     return pRet;
  124. }
  125. UINT32& debug_level()
  126. {
  127.     return dprintfGetData()->mask;
  128. }
  129. UINT32& debug_func_level()
  130. {
  131.     return dprintfGetData()->funcTraceMask;
  132. }
  133. UINT32 dprintfGetMask()
  134. {
  135.     UINT32 mask = 0;
  136.     DPrintfData* pData = dprintfGetData();
  137.     if( pData )
  138.     {
  139.         mask = pData->mask;
  140.     }
  141.     return mask;
  142. }
  143. //
  144. // called by DPRINTF macro
  145. //
  146. void dprintf(const char* fmt, ...)
  147. {
  148.     va_list args;
  149.     va_start(args, fmt);
  150.     dprintfHelper(fmt, args);
  151.     va_end(args);
  152. }