[Sphere-axis-commits] CVS: Axis/S_ScriptsBase FileMap.cpp,NONE,1.1 FileMap.h,NONE,1.1 MD5Hash.cpp,NO
Brought to you by:
pesterle
From: Philip E. <pes...@us...> - 2003-06-18 22:45:28
|
Update of /cvsroot/sphere-axis/Axis/S_ScriptsBase In directory sc8-pr-cvs1:/tmp/cvs-serv20089/S_ScriptsBase Modified Files: AxisLibWrapper.cpp S_ScriptsBase.vcproj Added Files: FileMap.cpp FileMap.h MD5Hash.cpp MD5Hash.h Log Message: no message --- NEW FILE: FileMap.cpp --- #include "StdAfx.h" #include "filemap.h" CString CFileMap::m_sErrors = _T(""); int CFileMap::m_iErrorCount = 0; void CFileMap::xmlError(void *ctx, const char *msg, ...) { m_iErrorCount++; xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; CString s, message; va_list args; va_start(args, msg); s.FormatV(msg, args); va_end(args); s.Replace(_T('\t'), _T(' ')); if ( s.GetLength() > 0 ) m_sErrors += s; return; } CFileMap::CFileMap(void) { } CFileMap::~CFileMap(void) { } bool CFileMap::Load() { if ( m_sLocalFilename.GetLength() == 0 ) return false; TCHAR szXMLFile[MAX_PATH]; CString sFile = m_sLocalFilename; if ( sFile.Find(_T("\\")) != -1 ) sFile.Insert(sFile.ReverseFind(_T('\\')) + 1, _T(".")); else sFile.Insert(0, _T(".")); _stprintf(szXMLFile, sFile); xmlInitParser(); xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(szXMLFile); if ( ctxt == NULL ) return false; xmlDoValidityCheckingDefaultValue = 1; xmlSetGenericErrorFunc(ctxt, &CFileMap::xmlError); m_iErrorCount = 0; m_sErrors = _T(""); xmlParseDocument(ctxt); xmlDocPtr pXMLDoc = ctxt->myDoc; int wellFormed = ctxt->wellFormed; if ( pXMLDoc == NULL ) return false; if ( !wellFormed ) { CString sMessage; sMessage.Format(_T("Unable to parse file %s. The XML Parser returned the following errors:\n%s"), szXMLFile, m_sErrors); AfxMessageBox(sMessage, MB_OK|MB_ICONEXCLAMATION); return false; } // Parse the file xmlNodePtr pRoot = FindNode(pXMLDoc, _T("FileMapping")); if ( pRoot != NULL ) { ReadValue(pRoot, _T("RemoteFile"), (void*)&m_sRemoteFilename, XML_String); ReadValue(pRoot, _T("Checksum"), (void*)&m_dwRemoteChecksum, XML_DWord); ReadValue(pRoot, _T("LastUpdate"), (void*)&m_tLastUpdate, XML_Int); } return true; } bool CFileMap::Save() { if ( m_sLocalFilename.GetLength() == 0 ) return false; xmlDocPtr pDoc = xmlNewDoc((const xmlChar*) _T("1.0")); CString sComments; sComments.Append(_T("Local<->Remote file mapping for use with AxisServer.\n")); sComments.Append(_T("DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING!\n")); pDoc->children = xmlNewDocComment(pDoc, (const xmlChar*) LPCTSTR(sComments)); xmlNodePtr pRoot = xmlNewDocNode(pDoc, NULL, (const xmlChar*) _T("FileMapping"), NULL); xmlAddNextSibling(pDoc->children, pRoot); AddValue(pDoc, pRoot, _T("LocalFile"), (void*) &m_sLocalFilename, XML_String, 1); AddValue(pDoc, pRoot, _T("RemoteFile"), (void*)&m_sRemoteFilename, XML_String, 1); AddValue(pDoc, pRoot, _T("Checksum"), (void*)&m_dwRemoteChecksum, XML_DWord, 1); AddValue(pDoc, pRoot, _T("LastUpdate"), (void*)&m_tLastUpdate, XML_Int, 1); TCHAR szXMLFile[MAX_PATH]; CString sFile = m_sLocalFilename; if ( sFile.Find(_T("\\")) != -1 ) sFile.Insert(sFile.ReverseFind(_T('\\')) + 1, _T(".")); else sFile.Insert(0, _T(".")); _stprintf(szXMLFile, sFile); xmlSaveFormatFileEnc(szXMLFile, pDoc, "UTF-8", 1); // Hide the file SetFileAttributes(szXMLFile, FILE_ATTRIBUTE_HIDDEN); return true; } --- NEW FILE: FileMap.h --- #pragma once #include "XMLBase.h" #include <libxml/parser.h> #include <libxml/parserinternals.h> #include "time.h" class __declspec(dllexport) CFileMap : public CXMLBase { public: CFileMap(void); CFileMap(CString sLocal, CString sRemote, DWORD cs=0, time_t t=0) { LocalName(sLocal); RemoteName(sRemote); Checksum(cs); LastUpdate(t); } ~CFileMap(void); bool Load(); bool Save(); CString LocalName() { return m_sLocalFilename; } CString RemoteName() { return m_sRemoteFilename; } DWORD Checksum() { return m_dwRemoteChecksum; } time_t LastUpdate() { return m_tLastUpdate; } void LocalName(CString s) { m_sLocalFilename = s; } void RemoteName(CString s) { m_sRemoteFilename = s; } void Checksum(DWORD c) { m_dwRemoteChecksum = c; } void LastUpdate(time_t t) { m_tLastUpdate = t; } protected: static void xmlError(void *ctx, const char *msg, ...); static CString m_sErrors; static int m_iErrorCount; CString m_sLocalFilename; CString m_sRemoteFilename; DWORD m_dwRemoteChecksum; time_t m_tLastUpdate; }; --- NEW FILE: MD5Hash.cpp --- #include "StdAfx.h" #include "md5hash.h" #include <vector> #include <string> using namespace std; #include "md5.h" using namespace CryptoPP; CMD5Hash::CMD5Hash(void) { } CMD5Hash::~CMD5Hash(void) { } CString CMD5Hash::GetHash(LPCTSTR pszText) { CryptoPP::MD5 md5; BYTE bMD5Data[16]; md5.CalculateDigest(bMD5Data, (const byte*) pszText, _tcslen(pszText)); TCHAR szMD5String[64]; memset(szMD5String, 0x00, sizeof(szMD5String)); for ( int m = 0; m < 16; m++ ) { TCHAR szByte[3]; _stprintf(szByte, _T("%02x"), bMD5Data[m]); _tcscat(szMD5String, szByte); } CString s(szMD5String); return s; } --- NEW FILE: MD5Hash.h --- #pragma once class CMD5Hash { public: CMD5Hash(void); ~CMD5Hash(void); static CString GetHash(LPCTSTR pszText); }; Index: AxisLibWrapper.cpp =================================================================== RCS file: /cvsroot/sphere-axis/Axis/S_ScriptsBase/AxisLibWrapper.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -r1.4 -r1.5 *** AxisLibWrapper.cpp 17 Jun 2003 22:32:51 -0000 1.4 --- AxisLibWrapper.cpp 18 Jun 2003 22:45:25 -0000 1.5 *************** *** 1,4 **** --- 1,5 ---- #include "StdAfx.h" #include "axislibwrapper.h" + #include "FileMap.h" using namespace AxisLib; *************** *** 75,106 **** bool CAxisLibWrapper::GetDirectoryList(CString sPath, CStringArray *aFiles, CStringArray *aDirectories) { ! BSTR bPath = sPath.AllocSysString(); ! BSTR files = ::SysAllocString( L"" ); ! BSTR directories = ::SysAllocString( L"" ); ! VARIANT_BOOL b = m_pAxisServer->GetDirectoryList(bPath, &files, &directories); if ( b ) { CString sFiles, sDirectories; #ifdef UNICODE ! sFiles.Format(_T("%s"), files); ! sDirectories.Format(_T("%s"), directories); #else ! sFiles.Format(_T("%S"), files); ! sDirectories.Format(_T("%S"), directories); #endif // Parse the files and directories int pos = 0; ! CString resToken = sFiles.Tokenize(_T(":"), pos); while ( resToken != _T("") ) { aFiles->Add(resToken); ! resToken = sFiles.Tokenize(_T(":"), pos); } pos = 0; ! resToken = sDirectories.Tokenize(_T(":"), pos); while ( resToken != _T("") ) { aDirectories->Add(resToken); ! resToken = sDirectories.Tokenize(_T(":"), pos); } } --- 76,111 ---- bool CAxisLibWrapper::GetDirectoryList(CString sPath, CStringArray *aFiles, CStringArray *aDirectories) { ! _bstr_t bPath = sPath.AllocSysString(); ! _bstr_t files = ::SysAllocString( L"" ); ! _bstr_t directories = ::SysAllocString( L"" ); ! VARIANT_BOOL b = m_pAxisServer->GetDirectoryList(bPath, files.GetAddress(), directories.GetAddress()); if ( b ) { CString sFiles, sDirectories; #ifdef UNICODE ! if ( files.length() ) ! sFiles.Format(_T("%s"), files.GetBSTR()); ! if ( directories.length() ) ! sDirectories.Format(_T("%s"), directories.GetBSTR()); #else ! if ( files.length() ) ! sFiles.Format(_T("%S"), files.GetBSTR()); ! if ( directories.length() ) ! sDirectories.Format(_T("%S"), directories.GetBSTR()); #endif // Parse the files and directories int pos = 0; ! CString resToken = sFiles.Tokenize(_T("*"), pos); while ( resToken != _T("") ) { aFiles->Add(resToken); ! resToken = sFiles.Tokenize(_T("*"), pos); } pos = 0; ! resToken = sDirectories.Tokenize(_T("*"), pos); while ( resToken != _T("") ) { aDirectories->Add(resToken); ! resToken = sDirectories.Tokenize(_T("*"), pos); } } *************** *** 111,117 **** --- 116,140 ---- bool CAxisLibWrapper::GetRemoteFile(CString sRemote, CString sLocal) { + CFileMap m(sLocal, sRemote); + ULONG checksum = 0; + if ( m.Load() ) + { + // Compare the checksum from the last time we got this + if ( GetFileChecksum(_T(""), sRemote, &checksum) && checksum == m.Checksum() ) + // We have the latest version already + return true; + } + // Get the file + BSTR bRemote = sRemote.AllocSysString(); BSTR bLocal = sLocal.AllocSysString(); + VARIANT_BOOL b = m_pAxisServer->GetRemoteFile(bRemote, bLocal); + if ( b ) + { + m.Checksum(checksum); + m.LastUpdate(time(NULL)); + m.Save(); + } return b ? true : false; } Index: S_ScriptsBase.vcproj =================================================================== RCS file: /cvsroot/sphere-axis/Axis/S_ScriptsBase/S_ScriptsBase.vcproj,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** S_ScriptsBase.vcproj 12 Jun 2003 04:56:59 -0000 1.5 --- S_ScriptsBase.vcproj 18 Jun 2003 22:45:25 -0000 1.6 *************** *** 21,24 **** --- 21,25 ---- Name="VCCLCompilerTool" Optimization="0" + AdditionalIncludeDirectories="../../crypto51" PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;_USRDLL" MinimalRebuild="TRUE" *************** *** 34,38 **** <Tool Name="VCLinkerTool" ! AdditionalDependencies="libxml2.lib comsvcs.lib" ShowProgress="0" OutputFile="$(OutDir)/S_ScriptsBase.dll" --- 35,39 ---- <Tool Name="VCLinkerTool" ! AdditionalDependencies="libxml2.lib comsvcs.lib ..\..\crypto51\release\cryptlib.lib" ShowProgress="0" OutputFile="$(OutDir)/S_ScriptsBase.dll" *************** *** 142,145 **** --- 143,149 ---- </File> <File + RelativePath="FileMap.cpp"> + </File> + <File RelativePath="FloatRange.cpp"> </File> *************** *** 148,151 **** --- 152,158 ---- </File> <File + RelativePath="MD5Hash.cpp"> + </File> + <File RelativePath="S_ScriptsBase.cpp"> </File> *************** *** 209,216 **** --- 216,229 ---- </File> <File + RelativePath="FileMap.h"> + </File> + <File RelativePath="FloatRange.h"> </File> <File RelativePath="IntRange.h"> + </File> + <File + RelativePath="MD5Hash.h"> </File> <File |