#include "../Rbuild.h"\r
#include "backend.h"\r
\r
-Backend::Backend ( Project& project ) : ProjectNode(project)\r
+Backend::Backend ( Project& project )\r
+ : ProjectNode ( project )\r
{\r
}\r
class Backend\r
{\r
public:\r
- Backend ( Project& );\r
+ Backend ( Project& project );\r
+ virtual void Process () = 0;\r
protected:\r
Project& ProjectNode;\r
};\r
\r
#include "mingw.h"\r
\r
-MingwBackend::MingwBackend(Project& project)\r
- : Backend(project)\r
+using std::string;\r
+using std::vector;\r
+\r
+MingwBackend::MingwBackend ( Project& project )\r
+ : Backend ( project )\r
+{\r
+}\r
+\r
+void MingwBackend::Process ()\r
+{\r
+ for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )\r
+ {\r
+ Module& module = *ProjectNode.modules[i];\r
+ ProcessModule ( module );\r
+ }\r
+}\r
+\r
+void MingwBackend::ProcessModule ( Module& module )\r
+{\r
+ MingwModuleHandlerList moduleHandlers;\r
+ GetModuleHandlers ( moduleHandlers );\r
+ for (size_t i = 0; i < moduleHandlers.size(); i++)\r
+ {\r
+ MingwModuleHandler& moduleHandler = *moduleHandlers[i];\r
+ if (moduleHandler.CanHandleModule ( module ) )\r
+ {\r
+ moduleHandler.Process ( module );\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+void MingwBackend::GetModuleHandlers ( MingwModuleHandlerList& moduleHandlers )\r
{\r
+ moduleHandlers.push_back ( new MingwKernelModuleHandler () );\r
}\r
#define MINGW_H\r
\r
#include "../backend.h"\r
+#include "modulehandler.h"\r
+\r
+class MingwModuleHandlerList : public std::vector<MingwModuleHandler*>\r
+{\r
+public:\r
+ ~MingwModuleHandlerList()\r
+ {\r
+ for ( size_t i = 0; i < size(); i++ )\r
+ {\r
+ delete (*this)[i];\r
+ }\r
+ }\r
+};\r
+\r
\r
class MingwBackend : public Backend\r
{\r
public:\r
- MingwBackend ( Project& );\r
+ MingwBackend ( Project& project );\r
+ virtual void Process ();\r
+private:\r
+ void ProcessModule ( Module& module );\r
+ void GetModuleHandlers ( MingwModuleHandlerList& moduleHandlers );\r
};\r
\r
#endif /* MINGW_H */\r
--- /dev/null
+\r
+#include "../../pch.h"\r
+\r
+#include "../../rbuild.h"\r
+#include "mingw.h"\r
+#include "modulehandler.h"\r
+\r
+MingwModuleHandler::MingwModuleHandler ()\r
+{\r
+}\r
+\r
+\r
+MingwKernelModuleHandler::MingwKernelModuleHandler ()\r
+{\r
+}\r
+\r
+bool MingwKernelModuleHandler::CanHandleModule ( Module& module )\r
+{\r
+ return true;\r
+}\r
+\r
+void MingwKernelModuleHandler::Process ( Module& module )\r
+{\r
+}\r
--- /dev/null
+#ifndef MINGW_MODULEHANDLER_H\r
+#define MINGW_MODULEHANDLER_H\r
+\r
+#include "../backend.h"\r
+\r
+class MingwModuleHandler\r
+{\r
+public:\r
+ MingwModuleHandler ();\r
+ virtual bool CanHandleModule ( Module& module ) = 0;\r
+ virtual void Process ( Module& module ) = 0;\r
+};\r
+\r
+\r
+class MingwKernelModuleHandler : public MingwModuleHandler\r
+{\r
+public:\r
+ MingwKernelModuleHandler ();\r
+ virtual bool CanHandleModule ( Module& module );\r
+ virtual void Process ( Module& module );\r
+};\r
+\r
+#endif /* MINGW_MODULEHANDLER_H */\r
all: $(TARGET)\r
\r
BACKEND_MINGW_BASE_OBJECTS = \\r
- backend/mingw/mingw.cpp\r
-\r
+ backend/mingw/mingw.cpp \\r
+ backend/mingw/modulehandler.cpp\r
+ \r
BACKEND_BASE_OBJECTS = \\r
$(BACKEND_MINGW_BASE_OBJECTS) \\r
backend/backend.cpp\r
{\r
}\r
\r
-Project::Project(const string& filename)\r
+Project::Project ( const string& filename )\r
{\r
if ( !xmlfile.open ( filename ) )\r
throw FileNotFoundException ( filename );\r
ReadXml();\r
}\r
\r
-Project::~Project()\r
+Project::~Project ()\r
{\r
- for ( size_t i = 0; i < modules.size(); i++ )\r
+ for ( size_t i = 0; i < modules.size (); i++ )\r
delete modules[i];\r
delete head;\r
}\r
\r
-void Project::ReadXml()\r
+void Project::ReadXml ()\r
{\r
Path path;\r
\r
return;\r
subpath = path + "/" + att->value;\r
}\r
- for ( size_t i = 0; i < e.subElements.size(); i++ )\r
+ for ( size_t i = 0; i < e.subElements.size (); i++ )\r
ProcessXML ( *e.subElements[i], subpath );\r
}\r
\r
#include <assert.h>\r
\r
#include "rbuild.h"\r
+#include "backend/backend.h"\r
+#include "backend/mingw/mingw.h"\r
\r
using std::string;\r
using std::vector;\r
try\r
{\r
string projectFilename ( "ReactOS.xml" );\r
- Project project ( projectFilename );\r
- project.GenerateOutput();\r
-\r
+ Project project = Project ( projectFilename );\r
+ Backend* backend = new MingwBackend ( project );\r
+ backend->Process ();\r
+ \r
// REM TODO FIXME actually do something with Project object...\r
#if 0\r
printf ( "Found %d modules:\n", project.modules.size() );\r
Project ();\r
Project ( const std::string& filename );\r
~Project ();\r
- void ProcessXML ( const XMLElement& e, const std::string& path );\r
+ void ProcessXML ( const XMLElement& e,\r
+ const std::string& path );\r
bool GenerateOutput();\r
private:\r
void ReadXml ();\r