diff options
Diffstat (limited to 'utils/vprojtomake/vcprojconvert.h')
| -rw-r--r-- | utils/vprojtomake/vcprojconvert.h | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/utils/vprojtomake/vcprojconvert.h b/utils/vprojtomake/vcprojconvert.h new file mode 100644 index 0000000..2b79779 --- /dev/null +++ b/utils/vprojtomake/vcprojconvert.h @@ -0,0 +1,120 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#ifndef VCPROJCONVERT_H +#define VCPROJCONVERT_H +#ifdef _WIN32 +#pragma once +#endif + +#include "stdafx.h" +#include "utlvector.h" +#include "utlsymbol.h" +#ifdef _WIN32 +#include "msxml2.h" +#elif _LINUX +#include "xercesc/dom/DOMDocument.hpp" +#define IXMLDOMDocument DOMDocument +#define IXMLDOMElement DOMElement +XERCES_CPP_NAMESPACE_USE + +#else +#error "Unsupported Platform" +#endif + +//----------------------------------------------------------------------------- +// Purpose: constructor +//----------------------------------------------------------------------------- +class CVCProjConvert +{ +public: + CVCProjConvert(); + ~CVCProjConvert(); + + bool LoadProject( const char *project ); + int GetNumConfigurations(); + CUtlSymbol & GetName() { return m_Name; } + CUtlSymbol & GetBaseDir() { return m_BaseDir; } + + class CConfiguration + { + public: + CConfiguration() {} + ~CConfiguration() {} + + typedef enum + { + FILE_SOURCE, + FILE_HEADER, + FILE_LIBRARY, + FILE_TYPE_UNKNOWN_E + } FileType_e; + + class CFileEntry + { + public: + CFileEntry( CUtlSymbol name, FileType_e type ) { m_Name = name; m_Type = type; } + ~CFileEntry() {} + + const char *GetName() { return m_Name.String(); } + FileType_e GetType() { return m_Type; } + bool operator==( const CFileEntry other ) const { return m_Name == other.m_Name; } + + private: + FileType_e m_Type; + CUtlSymbol m_Name; + }; + + void InsertFile( CFileEntry file ) { m_Files.AddToTail( file ); } + void RemoveFile( CUtlSymbol file ) { m_Files.FindAndRemove( CFileEntry( file, FILE_TYPE_UNKNOWN_E ) ); } // file type doesn't matter on remove + void SetName( CUtlSymbol name ) { m_Name = name; } + + int GetNumFileNames() { return m_Files.Count(); } + const char * GetFileName(int i) { return m_Files[i].GetName(); } + FileType_e GetFileType(int i) { return m_Files[i].GetType(); } + CUtlSymbol & GetName() { return m_Name; } + + void ResetDefines() { m_Defines.RemoveAll(); } + void AddDefine( CUtlSymbol define ) { m_Defines.AddToTail( define ); } + int GetNumDefines() { return m_Defines.Count(); } + const char *GetDefine( int i ) { return m_Defines[i].String(); } + + void ResetIncludes() { m_Includes.RemoveAll(); } + void AddInclude( CUtlSymbol include ) { m_Includes.AddToTail( include ); } + int GetNumIncludes() { return m_Includes.Count(); } + const char *GetInclude( int i ) { return m_Includes[i].String(); } + + private: + CUtlSymbol m_Name; + CUtlVector<CUtlSymbol> m_Defines; + CUtlVector<CUtlSymbol> m_Includes; + CUtlVector<CFileEntry> m_Files; + }; + + CConfiguration & GetConfiguration( int i ); + int FindConfiguration( CUtlSymbol name ); + +private: + bool ExtractFiles( IXMLDOMDocument *pDoc ); + bool ExtractConfigurations( IXMLDOMDocument *pDoc ); + bool ExtractProjectName( IXMLDOMDocument *pDoc ); + bool ExtractIncludes( IXMLDOMElement *pDoc, CConfiguration & config ); + bool IterateFileConfigurations( IXMLDOMElement *pFile, CUtlSymbol fileName ); + + // helper funcs + CUtlSymbol GetXMLNodeName( IXMLDOMElement *p ); + CUtlSymbol GetXMLAttribValue( IXMLDOMElement *p, const char *attribName ); + CConfiguration::FileType_e GetFileType( const char *fileName ); + void FindFileCaseInsensitive( char *file, int fileNameSize ); + + // data + CUtlVector<CConfiguration> m_Configurations; + CUtlSymbol m_Name; + CUtlSymbol m_BaseDir; + bool m_bProjectLoaded; +}; + +#endif // VCPROJCONVERT_H |