home *** CD-ROM | disk | FTP | other *** search
/ Softwarová Záchrana 3 / Softwarova-zachrana-3.bin / pserv.cpl / pserv-2.4.exe / source / PXmlReader.cpp < prev    next >
C/C++ Source or Header  |  2005-01-05  |  6KB  |  211 lines

  1. #include "stdafx.h"
  2. #include "PXmlReader.h"
  3. #include "XML\xmlparse.h"
  4.  
  5. PXmlReader::PXmlReader()
  6.     :   m_lpParser( NULL ), m_bRecordStartType( FALSE ),
  7.         m_dwFlags( XMLREADERF_STRIP_TRAILING_WHITESPACES|XMLREADERF_STRIP_EMPTY_CONTENT )
  8. {
  9. }
  10.  
  11. PXmlReader::~PXmlReader()
  12. {
  13.     if( m_lpParser )
  14.     {
  15.         XML_ParserFree( m_lpParser );
  16.     }
  17.  
  18.     while( m_Actions.GetCount() )
  19.     {
  20.         ServiceAction* a = (ServiceAction*)m_Actions.GetHead();
  21.         m_Actions.RemoveHead();
  22.         delete a;
  23.     }
  24. }
  25.  
  26. void PXmlReader::OnStartElement( LPCTSTR lpszName, LPCTSTR* lpszAttributes )
  27. {
  28.     m_bRecordStartType = FALSE;
  29.  
  30.     if( !lstrcmpi( lpszName, _T("service") ) )
  31.     {
  32.         if( lpszAttributes[0] && lpszAttributes[1] && !lpszAttributes[2] )
  33.         {
  34.             m_lpCurrentAction = new ServiceAction( lpszAttributes[1] );
  35.             if( m_lpCurrentAction != NULL )
  36.             {
  37.                 m_Actions.AddTail( m_lpCurrentAction );
  38.             }
  39.         }
  40.     }
  41.     else if( !lstrcmpi( lpszName, _T("start") ) )
  42.     {
  43.         m_bRecordStartType = TRUE;
  44.     }
  45. }
  46.  
  47. void PXmlReader::OnEndElement( LPCTSTR lpszName )
  48. {
  49.     m_bRecordStartType = FALSE;
  50. }
  51.  
  52.  
  53. #define SERVICE_BOOT_START             0x00000000
  54. #define SERVICE_SYSTEM_START           0x00000001
  55. #define SERVICE_AUTO_START             0x00000002
  56. #define SERVICE_DEMAND_START           0x00000003
  57. #define SERVICE_DISABLED               0x00000004
  58.  
  59. void PXmlReader::OnCharacters( LPCTSTR lpszContent, int len )
  60. {
  61.     if( (m_lpCurrentAction != NULL) && (m_bRecordStartType != FALSE) )
  62.     {
  63.         if( !lstrcmpi( lpszContent, _T("Boot") ) )
  64.         {
  65.             m_lpCurrentAction->m_dwActionToTake = SERVICE_BOOT_START;
  66.         }
  67.         else if( !lstrcmpi( lpszContent, _T("System") ) )
  68.         {
  69.             m_lpCurrentAction->m_dwActionToTake = SERVICE_SYSTEM_START;
  70.         }
  71.         else if( !lstrcmpi( lpszContent, _T("Automatic") ) )
  72.         {
  73.             m_lpCurrentAction->m_dwActionToTake = SERVICE_AUTO_START;
  74.         }
  75.         else if( !lstrcmpi( lpszContent, _T("Manual") ) )
  76.         {
  77.             m_lpCurrentAction->m_dwActionToTake = SERVICE_DEMAND_START;
  78.         }
  79.         else if( !lstrcmpi( lpszContent, _T("Disabled") ) )
  80.         {
  81.             m_lpCurrentAction->m_dwActionToTake = SERVICE_DISABLED;
  82.         }
  83.     }
  84. }
  85.  
  86. void PXmlReader_OnStartElement( LPVOID lpUserData, LPCTSTR lpszName, LPCTSTR* lpszAttributes )
  87. {
  88.     ((PXmlReader*)lpUserData)->OnStartElement( lpszName, lpszAttributes );
  89. }
  90.  
  91. void PXmlReader_OnEndElement( LPVOID lpUserData, LPCTSTR lpszName )
  92. {
  93.     ((PXmlReader*)lpUserData)->OnEndElement( lpszName );
  94. }
  95.  
  96. void PXmlReader_OnCharacter(void *userData, LPCTSTR s, int len)
  97. {
  98.     ((PXmlReader*)userData)->OnCharactersNotZeroTerminated( s, len );
  99. }
  100.  
  101. void PXmlReader::OnCharactersNotZeroTerminated( LPCTSTR s, int len )
  102. {
  103.     if( m_dwFlags & XMLREADERF_STRIP_TRAILING_WHITESPACES )
  104.     {
  105.         int nCharIndex;
  106.  
  107.         for( nCharIndex = 0; nCharIndex < len; nCharIndex++ )
  108.         {
  109.             if( !isspace(s[nCharIndex]) )
  110.             {
  111.                 break;
  112.             }
  113.         }
  114.  
  115.         s += nCharIndex;
  116.         len -= nCharIndex;
  117.  
  118.         for( nCharIndex = len -1; nCharIndex >= 0; nCharIndex-- )
  119.         {
  120.             if( !isspace(s[nCharIndex]) )
  121.             {
  122.                 break;
  123.             }
  124.         }
  125.         len = nCharIndex+1;
  126.     }
  127.     if( (m_dwFlags & XMLREADERF_STRIP_EMPTY_CONTENT) && !len )
  128.     {
  129.     }
  130.     else
  131.     {
  132.         if( len < (sizeof(m_szContentBuffer)-1) )
  133.         {
  134.             CopyMemory( m_szContentBuffer, s, len );
  135.             m_szContentBuffer[len] = 0;
  136.             OnCharacters( m_szContentBuffer, len );
  137.         }
  138.         else
  139.         {
  140.             TCHAR* buffer = new TCHAR[len+1];
  141.             if( buffer )
  142.             {   
  143.                 CopyMemory( buffer, s, len );
  144.                 buffer[len] = 0;
  145.                 OnCharacters( buffer, len );
  146.                 delete [] buffer;
  147.             }
  148.             else
  149.             {
  150.                 // notl÷sung: teilschritte im read-buffer
  151.                 while( len )
  152.                 {
  153.                     int nBytes = sizeof(m_szContentBuffer)-1;
  154.                     CopyMemory( m_szContentBuffer, s, nBytes );
  155.                     m_szContentBuffer[nBytes] = 0;
  156.                     OnCharacters( m_szContentBuffer, nBytes );
  157.                     len -= nBytes;
  158.                 }
  159.             }
  160.         }
  161.     }
  162. }
  163.  
  164. BOOL PXmlReader::Read( LPCTSTR lpszFilename )
  165. {
  166. #ifdef UNICODE
  167. return FALSE;
  168. #else
  169.     FILE* fp = fopen(lpszFilename, TEXT("r"));
  170.     if( fp == NULL )
  171.         return FALSE;
  172.  
  173.     if( m_lpParser )
  174.     {
  175.         XML_ParserFree( m_lpParser );
  176.     }
  177.     m_lpParser = XML_ParserCreate(NULL);
  178.     if( !m_lpParser )
  179.         return FALSE;
  180.  
  181.     BOOL bSuccess = TRUE;
  182.     int done;
  183.     int depth = 0;
  184.     XML_SetUserData(m_lpParser, this);
  185.     XML_SetElementHandler(m_lpParser, PXmlReader_OnStartElement, PXmlReader_OnEndElement);
  186.     XML_SetCharacterDataHandler(m_lpParser, PXmlReader_OnCharacter);
  187.     m_lpCurrentAction = NULL;
  188.     do
  189.     {
  190.         size_t len = fread(m_szReadBuffer, 1, sizeof(m_szReadBuffer), fp);
  191.         done = len < sizeof(m_szReadBuffer);
  192.         if( !XML_Parse(m_lpParser, m_szReadBuffer, len, done) )
  193.         {
  194.             /*printf("ERROR, %s at line %d\n",
  195.               XML_ErrorString(XML_GetErrorCode(m_lpParser)),
  196.               XML_GetCurrentLineNumber(m_lpParser));*/
  197.             bSuccess = FALSE;
  198.             break;
  199.         }
  200.     }
  201.     while( !done );
  202.     fclose(fp);
  203.     XML_ParserFree( m_lpParser );
  204.     m_lpParser = NULL;
  205.  
  206.     return bSuccess;
  207. #endif
  208. }
  209.  
  210.  
  211.