carnold     2005/03/03 11:27:44

  Modified:    .        build.xml
               include/log4cxx/nt nteventlogappender.h
               src      nteventlogappender.cpp
               tests/src/nt nteventlogappendertestcase.cpp
  Log:
  LOGCXX-67: NTEventLogAppender always uses RPC...
  
  Revision  Changes    Path
  1.47      +1 -2      logging-log4cxx/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/build.xml,v
  retrieving revision 1.46
  retrieving revision 1.47
  diff -u -r1.46 -r1.47
  --- build.xml 1 Mar 2005 23:30:43 -0000       1.46
  +++ build.xml 3 Mar 2005 19:27:44 -0000       1.47
  @@ -812,13 +812,12 @@
                   unless="apriconv.lib.dir"/>
           <libset libs="${cppunit.lib.name}${lib-suffix}" 
dir="${cppunit.lib.dir}" if="cppunit.lib.dir"/>
           <libset libs="${cppunit.lib.name}${lib-suffix}" 
unless="cppunit.lib.dir"/>
  -        <libset libs="advapi32 odbc32 ws2_32" if="is-windows"/>
  +        <syslibset libs="advapi32 odbc32 ws2_32" if="is-windows"/>
   
           <includepath path="${include.dir}"/>
           <includepath path="/usr/include/libxml2" if="is-unix"/>
           <includepath path="${apr.include.dir}"/>
           <defineset define="LOG4CXX"/>
  -        <libset libs="advapi32 odbc32 ws2_32" if="is-windows"/>
           <libset libs="xml2" if="is-unix"/>
           <libset libs="cw32mt" if="is-bcc"/>
   
  
  
  
  1.18      +8 -3      logging-log4cxx/include/log4cxx/nt/nteventlogappender.h
  
  Index: nteventlogappender.h
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/include/log4cxx/nt/nteventlogappender.h,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- nteventlogappender.h      26 Dec 2004 07:31:53 -0000      1.17
  +++ nteventlogappender.h      3 Mar 2005 19:27:44 -0000       1.18
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 2003,2004 The Apache Software Foundation.
  + * Copyright 2003,2005 The Apache Software Foundation.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
  @@ -70,7 +70,8 @@
                                   { this->server.assign(server); }
   
                           const LogString& getServer() const
  -                                { return server; }
  +                                { return server; }
  +
   
                   protected:
                           //
  @@ -98,11 +99,15 @@
                           LogString source;
                           HANDLE hEventLog;
                           SID * pCurrentUserSID;
  +                        static LogString getErrorString(const LogString& 
function);
   
                   private:
                           NTEventLogAppender(const NTEventLogAppender&);
                           NTEventLogAppender& operator=(const 
NTEventLogAppender&);
  -                }; // class NTEventLogAppender
  +                }; // class NTEventLogAppender
  +
  +                typedef helpers::ObjectPtrT<NTEventLogAppender> 
NTEventLogAppenderPtr;
  +
       }  // namespace nt
   } // namespace log4cxx
   
  
  
  
  1.16      +50 -12    logging-log4cxx/src/nteventlogappender.cpp
  
  Index: nteventlogappender.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/src/nteventlogappender.cpp,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- nteventlogappender.cpp    1 Mar 2005 23:30:44 -0000       1.15
  +++ nteventlogappender.cpp    3 Mar 2005 19:27:44 -0000       1.16
  @@ -24,7 +24,7 @@
   #include <log4cxx/level.h>
   #include <log4cxx/helpers/stringhelper.h>
   #include <log4cxx/helpers/transcoder.h>
  -#include <log4cxx/helpers/pool.h>
  +#include <log4cxx/helpers/pool.h>
   
   using namespace log4cxx;
   using namespace log4cxx::spi;
  @@ -162,12 +162,24 @@
           CCtUserSIDHelper::GetCurrentUserSID((::SID**) &pCurrentUserSID);
   
           addRegistryInfo();
  -
  -    std::wstring wserver;
  -    Transcoder::encode(server, wserver);
  -    std::wstring wsource;
  -    Transcoder::encode(source, wsource);
  -        hEventLog = ::RegisterEventSourceW(wserver.c_str(), wsource.c_str());
  +
  +        std::wstring wsource;
  +        Transcoder::encode(source, wsource);
  +        std::wstring wserver;
  +        const wchar_t* pServer = NULL;
  +        if (!server.empty()) {
  +            Transcoder::encode(server, wserver);
  +            pServer = wserver.c_str();
  +        }
  +        hEventLog = ::RegisterEventSourceW(pServer, wsource.c_str());
  +        if (hEventLog == NULL) {
  +            LogString msg(LOG4CXX_STR("Cannot register NT EventLog -- 
server: '"));
  +            msg.append(server);
  +            msg.append(LOG4CXX_STR("' source: '"));
  +            msg.append(source);
  +            LogLog::error(msg);
  +            
LogLog::error(getErrorString(LOG4CXX_STR("RegisterEventSource")));
  +        }
   }
   
   void NTEventLogAppender::append(const LoggingEventPtr& event, Pool& p)
  @@ -180,10 +192,10 @@
   
           LogString oss;
           layout->format(oss, event, p);
  -    std::wstring s;
  -    log4cxx::helpers::Transcoder::encode(oss, s);
  -    const wchar_t* msgs[1];
  -    msgs[0] = s.c_str() ;
  +        std::wstring s;
  +        log4cxx::helpers::Transcoder::encode(oss, s);
  +        const wchar_t* msgs[1];
  +        msgs[0] = s.c_str() ;
           BOOL bSuccess = ::ReportEventW(
                   hEventLog,
                   getEventType(event),
  @@ -197,7 +209,7 @@
   
           if (!bSuccess)
           {
  -                LogLog::error(LOG4CXX_STR("Cannot report event in NT 
EventLog."));
  +                LogLog::error(getErrorString(LOG4CXX_STR("ReportEvent")));
           }
   }
   
  @@ -295,6 +307,32 @@
           }
   
           return ret_val;
  +}
  +
  +LogString NTEventLogAppender::getErrorString(const LogString& function) 
  +{ 
  +    Pool p;
  +    enum { MSGSIZE = 5000 };
  +    wchar_t* lpMsgBuf = (wchar_t*) p.palloc(MSGSIZE * sizeof(wchar_t));
  +    DWORD dw = GetLastError(); 
  +
  +    FormatMessageW(
  +        FORMAT_MESSAGE_FROM_SYSTEM,
  +        NULL,
  +        dw,
  +        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  +        lpMsgBuf,
  +        MSGSIZE, NULL );
  +
  +    std::wstring sysmsg(lpMsgBuf);
  +
  +    LogString msg(function);
  +    msg.append(LOG4CXX_STR(" failed with error "));
  +    StringHelper::toString((size_t) dw, p, msg);
  +    msg.append(LOG4CXX_STR(": "));
  +    Transcoder::decode(sysmsg, msg);
  +
  +    return msg; 
   }
   
   #endif // WIN32
  
  
  
  1.3       +45 -2     
logging-log4cxx/tests/src/nt/nteventlogappendertestcase.cpp
  
  Index: nteventlogappendertestcase.cpp
  ===================================================================
  RCS file: 
/home/cvs/logging-log4cxx/tests/src/nt/nteventlogappendertestcase.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- nteventlogappendertestcase.cpp    15 Feb 2005 23:56:04 -0000      1.2
  +++ nteventlogappendertestcase.cpp    3 Mar 2005 19:27:44 -0000       1.3
  @@ -18,10 +18,18 @@
   #include <cppunit/TestFixture.h>
   #include <cppunit/extensions/HelperMacros.h>
   #include <log4cxx/nt/nteventlogappender.h>
  -#include "../appenderskeletontestcase.h"
  +#include "../appenderskeletontestcase.h"
  +#include <apr_time.h>
  +#include "windows.h"
  +#include <log4cxx/logger.h>
  +#include <log4cxx/spi/loggingevent.h>
  +#include <log4cxx/patternlayout.h>
  +#include "../insertwide.h"
   
   using namespace log4cxx;
  -using namespace log4cxx::helpers;
  +using namespace log4cxx::helpers;
  +using namespace log4cxx::nt;
  +using namespace log4cxx::spi;
   
   /**
      Unit tests of log4cxx::nt::NTEventLogAppender
  @@ -34,6 +42,7 @@
                   //
                   CPPUNIT_TEST(testDefaultThreshold);
                   CPPUNIT_TEST(testSetOptionThreshold);
  +                CPPUNIT_TEST(testHelloWorld);
   
      CPPUNIT_TEST_SUITE_END();
   
  @@ -42,6 +51,40 @@
   
           AppenderSkeleton* createAppenderSkeleton() const {
             return new log4cxx::nt::NTEventLogAppender();
  +        }
  +
  +        void testHelloWorld() {
  +           DWORD expectedCount = 1;
  +           HANDLE hEventLog = ::OpenEventLogW(NULL, L"log4cxx_test");
  +           if (hEventLog != NULL) {
  +               BOOL stat = GetNumberOfEventLogRecords(hEventLog, 
&expectedCount);
  +               CPPUNIT_ASSERT(stat);
  +               CloseEventLog(hEventLog);
  +               expectedCount++;
  +           }
  + 
  +
  +            Pool p;
  +            DWORD expectedTime = apr_time_sec(apr_time_now());
  +            {
  +                NTEventLogAppenderPtr appender(new NTEventLogAppender());
  +                appender->setSource(LOG4CXX_STR("log4cxx_test"));
  +                LayoutPtr layout(new PatternLayout(LOG4CXX_STR("%c - 
%m%n")));
  +                appender->setLayout(layout);
  +                appender->activateOptions(p);
  +                LoggerPtr logger(Logger::getLogger(L"org.foobar"));
  +
  +                LoggingEventPtr event(new LoggingEvent(
  +                    logger, Level::INFO, LOG4CXX_STR("Hello,  World"), 
LOG4CXX_LOCATION));
  +                appender->doAppend(event, p);
  +            }
  +            hEventLog = ::OpenEventLogW(NULL, L"log4cxx_test");
  +            CPPUNIT_ASSERT(hEventLog != NULL);
  +            DWORD actualCount;
  +            BOOL stat = GetNumberOfEventLogRecords(hEventLog, &actualCount);
  +            CloseEventLog(hEventLog);
  +            CPPUNIT_ASSERT(stat);
  +            CPPUNIT_ASSERT_EQUAL(expectedCount, actualCount);
           }
   };
   
  
  
  

Reply via email to