Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      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
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 
     19 // test_pv_author_engine_logger.cpp: implementation of the PVAELogger class.
     20 //
     21 //////////////////////////////////////////////////////////////////////
     22 #ifndef PVLOGGER_FILE_APPENDER_H_INCLUDED
     23 #include "pvlogger_file_appender.h"
     24 #endif
     25 #ifndef PVLOGGER_STDERR_APPENDER_H_INCLUDED
     26 #include "pvlogger_stderr_appender.h"
     27 #endif
     28 #ifndef PVLOGGER_MEM_APPENDER_H_INCLUDED
     29 #include "pvlogger_mem_appender.h"
     30 #endif
     31 #ifndef PVLOGGER_TIME_AND_ID_LAYOUT_H_INCLUDED
     32 #include "pvlogger_time_and_id_layout.h"
     33 #endif
     34 #ifndef OSCL_MEM_H_INCLUDED
     35 #include "oscl_mem.h"
     36 #endif
     37 #ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
     38 #include "oscl_string_containers.h"
     39 #endif
     40 #ifndef TEST_PV_AUTHOR_ENGINE_LOGGER_H_INCLUDED
     41 #include "test_pv_author_engine_logger.h"
     42 #endif
     43 
     44 ////////////////////////////////////////////////////////////////////////////////
     45 // Macro redefinition for typing convenience : define an 8-bit char* or 16-bit wchar
     46 #define _CSTR(x) _STRLIT_CHAR(x)
     47 #define _W(x) _STRLIT_WCHAR(x)
     48 
     49 #define KLogFile ((OSCL_TCHAR*) _STRLIT("pvauthorlog.txt"))
     50 
     51 typedef OSCL_HeapString<OsclMemAllocator> HeapString;
     52 typedef OSCL_wHeapString<OsclMemAllocator> wHeapString;
     53 
     54 // Open pwszConfigFile to read nodes (and levels) to log
     55 // Returns true on success
     56 OSCL_EXPORT_REF bool PVAELogger::ParseConfigFile(const oscl_wchar *pwszConfigFile)
     57 {
     58     OSCL_ASSERT(pwszConfigFile);
     59     if (!pwszConfigFile)
     60         return false;
     61 
     62     int32 iStatus = 0;
     63     PVLogger         *loggernode = NULL;
     64 
     65     bool bFileExists = false;
     66     Oscl_FileServer fs;
     67     Oscl_File       filehandle;
     68 
     69     // read configuration file pvaelogger.txt in working directory
     70     fs.Connect();
     71     if (filehandle.Open(pwszConfigFile, Oscl_File::MODE_READ, fs) == 0)
     72         bFileExists = true;
     73 
     74     //If the file "pvaelogger.txt" does not exist in the working dir or
     75     //is empty, set default: log "AuthorEngine", debug level to StdErr
     76     if (!bFileExists || 0 == filehandle.Size())
     77     {
     78         if (bFileExists)
     79             filehandle.Close();
     80         fs.Close();
     81         return false;
     82     }
     83 
     84     int32 MAXLENGTH = filehandle.Size();
     85     uint32 lastlineterminator = 0, firstline = 0;
     86 
     87     PVLoggerAppender *appender = NULL;
     88     OsclRefCounter   *refCounter = NULL;
     89     OsclSharedPtr<PVLoggerAppender> sharedAppenderPtr;
     90 
     91     bool bEof = false;
     92     while (!bEof)
     93     {
     94         char *buf = (char *)OSCL_MALLOC(MAXLENGTH + 1);
     95         filehandle.Seek(lastlineterminator, Oscl_File::SEEKSET);
     96         if (filehandle.Read((void *)buf, 1, MAXLENGTH))
     97         {
     98             //delibrately remove const-ness char* output from oscl_strstr to a modifiable char* for further operation
     99             char *ptr = OSCL_CONST_CAST(char*, oscl_strstr(buf, _CSTR("\n")));
    100             if (ptr)
    101             {
    102                 if (*(ptr - 1) == '\r')
    103                 {
    104                     *(ptr - 1) = '\0';
    105                 }
    106                 else
    107                 {
    108                     *ptr = '\0';
    109                 }
    110 
    111                 lastlineterminator += ptr - buf + 1;
    112 
    113             }
    114             else
    115             {
    116                 bEof = true;
    117             }
    118 
    119             // Check if this is a commented line
    120             if (*buf == '#')
    121             {
    122                 firstline = lastlineterminator;
    123                 if (buf)
    124                 {
    125                     OSCL_FREE(buf);
    126                     buf = NULL;
    127                 }
    128                 continue;
    129             }
    130 
    131             //If the first uncommented line in the file is NO_LOGGING all logging will be disabled
    132             //If the first uncommented line in the file is LOGTOFILE, a file appender shall be created
    133             //If the first uncommented line in the file is LOGTOMEM, a memory appender shall be created
    134             //otherwise all logs shall be dumped on the cmd wnd
    135 
    136             if (appender == NULL &&
    137                     ((lastlineterminator == 0) || (firstline == lastlineterminator - (ptr - buf + 1))))
    138 
    139             {
    140                 if (oscl_strstr(buf, _CSTR("NO_LOGGING")))
    141                 {
    142                     filehandle.Close();
    143                     fs.Close();
    144                     if (buf)
    145                     {
    146                         OSCL_FREE(buf);
    147                         buf = NULL;
    148                     }
    149                     return true;
    150                 }
    151 
    152                 iStatus = PVAELogger::CreateTestAppender(buf, appender, refCounter, sharedAppenderPtr);
    153 
    154                 if (iStatus != OsclErrNone)
    155                 {
    156                     OSCL_ASSERT(!_CSTR("Author Engine Unittest: unable to create log appender"));
    157                     sharedAppenderPtr.Unbind();
    158                     if (refCounter)
    159                         delete refCounter;
    160                     if (appender)
    161                         delete appender;
    162                     if (buf)
    163                     {
    164                         OSCL_FREE(buf);
    165                         buf = NULL;
    166                     }
    167                     return false;
    168                 }
    169             }
    170 
    171             //Extract the node
    172             char *node = (char *)OSCL_MALLOC(MAXLENGTH + 1);
    173             if (!node)
    174             {
    175                 if (NULL != buf)
    176                 {
    177                     OSCL_FREE(buf);
    178                     buf = NULL;
    179                 }
    180                 return false;
    181             }
    182 
    183             const char *marker = oscl_strstr(buf, _CSTR(";"));
    184 
    185             if (!marker)
    186             {
    187                 OSCL_FREE(node);
    188                 if (buf)
    189                 {
    190                     OSCL_FREE(buf);
    191                     buf = NULL;
    192                 }
    193                 continue;
    194             }
    195 
    196             uint32 node_size = marker - buf;
    197 
    198             oscl_strncpy(node, buf, node_size);
    199             *(node + node_size) = '\0';
    200 
    201             //Extract the log level
    202             HeapString *loglevel = OSCL_NEW(HeapString, (oscl_strstr(buf, _CSTR(";")) + 1));
    203             if (!loglevel)
    204             {
    205                 OSCL_FREE(node);
    206                 if (buf)
    207                 {
    208                     OSCL_FREE(buf);
    209                     buf = NULL;
    210                 }
    211                 return false;
    212             }
    213 
    214             char *tmp = loglevel->get_str();
    215             bool logallnodes = false;
    216 
    217             //If node = ALLNODES; enable logging for all
    218             //ALLNODES should be written in the file before any other logger node
    219             if (oscl_strstr(node, _CSTR("ALLNODES")))
    220             {
    221                 loggernode = PVLogger::GetLoggerObject("");
    222                 logallnodes = true;
    223             }
    224             else
    225             {
    226                 loggernode = PVLogger::GetLoggerObject(node);
    227             }
    228 
    229             loggernode->AddAppender(sharedAppenderPtr);
    230 
    231             //Set log level
    232             if (oscl_strstr(tmp, _CSTR("PVLOGMSG_EMERG")))
    233                 loggernode->SetLogLevel(PVLOGMSG_EMERG);
    234             else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_ALERT")))
    235                 loggernode->SetLogLevel(PVLOGMSG_ALERT);
    236             else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_CRIT")))
    237                 loggernode->SetLogLevel(PVLOGMSG_CRIT);
    238             else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_ERR")))
    239                 loggernode->SetLogLevel(PVLOGMSG_ERR);
    240             else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_WARNING")))
    241                 loggernode->SetLogLevel(PVLOGMSG_WARNING);
    242             else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_NOTICE")))
    243                 loggernode->SetLogLevel(PVLOGMSG_NOTICE);
    244             else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_INFO")))
    245                 loggernode->SetLogLevel(PVLOGMSG_INFO);
    246             else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_STACK_TRACE")))
    247                 loggernode->SetLogLevel(PVLOGMSG_STACK_TRACE);
    248             else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_DEBUG")))
    249                 loggernode->SetLogLevel(PVLOGMSG_DEBUG);
    250 
    251             if (logallnodes == true)
    252                 bEof = true;
    253 
    254             if (node)
    255                 OSCL_FREE(node);
    256             if (loglevel)
    257                 OSCL_DELETE(loglevel);
    258             if (buf)
    259             {
    260                 OSCL_FREE(buf);
    261                 buf = NULL;
    262             }
    263 
    264         }
    265         else //file read returns 0
    266         {
    267             //We have reached the end of the file
    268             bEof = true;
    269         }
    270 
    271         if (buf)
    272         {
    273             OSCL_FREE(buf);
    274             buf = NULL;
    275         }
    276 
    277     }//end of while loop
    278 
    279     filehandle.Close();
    280     fs.Close();
    281     return true;
    282 }
    283 
    284 // Attach a StdErrAppender to "PVAuthorEngine" at level PVLOGMSG_DEBUG
    285 // Returns true on success
    286 
    287 OSCL_EXPORT_REF bool PVAELogger::MakeStdErrAppender()
    288 {
    289     int32 iStatus;
    290     PVLoggerAppender *appender   = NULL;
    291     OsclRefCounter   *refCounter = NULL;
    292     PVLogger         *loggernode = NULL;
    293 
    294     typedef StdErrAppender<TimeAndIdLayout, 1024> typeStdErrAppender;
    295     OSCL_TRY(iStatus,
    296              appender = new typeStdErrAppender() ;
    297              OsclRefCounterSA<LogAppenderDestructDealloc<typeStdErrAppender > > *appenderRefCounter =
    298                  new OsclRefCounterSA<LogAppenderDestructDealloc<typeStdErrAppender > >(appender);
    299              refCounter = appenderRefCounter;
    300             );
    301 
    302     if (iStatus != OsclErrNone)
    303     {
    304         delete refCounter;
    305         delete appender;
    306         return false;
    307     }
    308 
    309     OsclSharedPtr<PVLoggerAppender> appenderPtr(appender, refCounter);
    310     loggernode = PVLogger::GetLoggerObject(_CSTR("PVAuthorEngine"));
    311     loggernode->AddAppender(appenderPtr);
    312     loggernode->SetLogLevel(PVLOGMSG_DEBUG);
    313 
    314     return true;
    315 }
    316 
    317 OSCL_EXPORT_REF int32 PVAELogger::CreateTestAppender(char* aBuf, PVLoggerAppender*& aAppender, OsclRefCounter*& aRefCounter, OsclSharedPtr<PVLoggerAppender> &aSharedAppenderPtr)
    318 {
    319     int32 err;
    320     if (oscl_strstr(aBuf, _CSTR("LOGTOFILE")))
    321     {
    322         typedef TextFileAppender<TimeAndIdLayout, 1024> typeAppender;
    323 
    324         OSCL_TRY(err,
    325                  aAppender = (PVLoggerAppender*)typeAppender::CreateAppender(KLogFile);
    326                  aRefCounter = new OsclRefCounterSA<LogAppenderDestructDealloc<typeAppender> >(aAppender);
    327                  aSharedAppenderPtr.Bind(aAppender, aRefCounter);
    328                 );
    329 
    330     }
    331 
    332     else if (oscl_strstr(aBuf, _CSTR("LOGTOMEM")))
    333     {
    334         typedef MemAppender<TimeAndIdLayout, 1024> typeAppender;
    335         OSCL_TRY(err,
    336                  aAppender = (PVLoggerAppender*)typeAppender::CreateAppender(KLogFile);
    337                  aRefCounter = new OsclRefCounterSA<LogAppenderDestructDealloc<typeAppender> >(aAppender);
    338                  aSharedAppenderPtr.Bind(aAppender, aRefCounter);
    339                 );
    340     }
    341     else
    342     {
    343         typedef StdErrAppender<TimeAndIdLayout, 1024> typeAppender;
    344         OSCL_TRY(err,
    345                  aAppender = new typeAppender() ;
    346                  aRefCounter = new OsclRefCounterSA<LogAppenderDestructDealloc<typeAppender> >(aAppender);
    347                  aSharedAppenderPtr.Bind(aAppender, aRefCounter);
    348                 );
    349     }
    350 
    351     return err;
    352 }
    353