mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 07:03:10 +00:00
Parse module type.
svn path=/branches/xmlbuildsystem/; revision=12839
This commit is contained in:
parent
1568981925
commit
91d97cbc91
6 changed files with 45 additions and 11 deletions
|
@ -63,5 +63,13 @@ RequiredAttributeNotFoundException::RequiredAttributeNotFoundException(const std
|
||||||
attributeName.c_str (),
|
attributeName.c_str (),
|
||||||
elementName.c_str ())
|
elementName.c_str ())
|
||||||
{
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
InvalidAttributeValueException::InvalidAttributeValueException(const std::string& name,
|
||||||
|
const std::string& value)
|
||||||
|
: InvalidBuildFileException ( "Attribute '%s' has an invalid value '%s'.",
|
||||||
|
name.c_str (),
|
||||||
|
value.c_str ())
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,4 +48,12 @@ public:
|
||||||
const std::string& elementName);
|
const std::string& elementName);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidAttributeValueException : public InvalidBuildFileException
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InvalidAttributeValueException(const std::string& name,
|
||||||
|
const std::string& value);
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* __EXCEPTION_H */
|
#endif /* __EXCEPTION_H */
|
||||||
|
|
|
@ -14,35 +14,43 @@ Module::Module ( const XMLElement& moduleNode,
|
||||||
name(moduleName),
|
name(moduleName),
|
||||||
path(modulePath)
|
path(modulePath)
|
||||||
{
|
{
|
||||||
|
type = GetModuleType ( *moduleNode.GetAttribute ( "type", true ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
Module::~Module()
|
Module::~Module ()
|
||||||
{
|
{
|
||||||
for ( size_t i = 0; i < files.size(); i++ )
|
for ( size_t i = 0; i < files.size(); i++ )
|
||||||
delete files[i];
|
delete files[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void Module::ProcessXML ( const XMLElement& e,
|
||||||
Module::ProcessXML ( const XMLElement& e, const string& path )
|
const string& path )
|
||||||
{
|
{
|
||||||
string subpath ( path );
|
string subpath ( path );
|
||||||
if ( e.name == "file" && e.value.size() )
|
if ( e.name == "file" && e.value.size () )
|
||||||
{
|
{
|
||||||
files.push_back ( new File(path + "/" + e.value) );
|
files.push_back ( new File ( path + "/" + e.value ) );
|
||||||
}
|
}
|
||||||
else if ( e.name == "directory" )
|
else if ( e.name == "directory" )
|
||||||
{
|
{
|
||||||
// this code is duplicated between Project::ProcessXML() and Module::ProcessXML() :(
|
|
||||||
const XMLAttribute* att = e.GetAttribute ( "name", true );
|
const XMLAttribute* att = e.GetAttribute ( "name", true );
|
||||||
if ( !att )
|
|
||||||
return;
|
|
||||||
subpath = path + "/" + att->value;
|
subpath = path + "/" + att->value;
|
||||||
}
|
}
|
||||||
for ( size_t i = 0; i < e.subElements.size(); i++ )
|
for ( size_t i = 0; i < e.subElements.size (); i++ )
|
||||||
ProcessXML ( *e.subElements[i], subpath );
|
ProcessXML ( *e.subElements[i], subpath );
|
||||||
}
|
}
|
||||||
|
|
||||||
File::File ( const std::string& _name )
|
ModuleType Module::GetModuleType ( const XMLAttribute& attribute )
|
||||||
|
{
|
||||||
|
if ( attribute.value == "buildtool" )
|
||||||
|
return BuildTool;
|
||||||
|
if ( attribute.value == "kernelmodedll" )
|
||||||
|
return KernelModeDLL;
|
||||||
|
throw InvalidAttributeValueException ( attribute.name,
|
||||||
|
attribute.value );
|
||||||
|
}
|
||||||
|
|
||||||
|
File::File ( const string& _name )
|
||||||
: name(_name)
|
: name(_name)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,12 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum ModuleType
|
||||||
|
{
|
||||||
|
BuildTool,
|
||||||
|
KernelModeDLL
|
||||||
|
};
|
||||||
|
|
||||||
class Module
|
class Module
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -37,10 +43,12 @@ public:
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string path;
|
std::string path;
|
||||||
std::vector<File*> files;
|
std::vector<File*> files;
|
||||||
|
ModuleType type;
|
||||||
|
|
||||||
Module ( const XMLElement& moduleNode,
|
Module ( const XMLElement& moduleNode,
|
||||||
const std::string& moduleName,
|
const std::string& moduleName,
|
||||||
const std::string& modulePath );
|
const std::string& modulePath );
|
||||||
|
ModuleType GetModuleType (const XMLAttribute& attribute );
|
||||||
|
|
||||||
~Module();
|
~Module();
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
</module>
|
</module>
|
||||||
</directory>
|
</directory>
|
||||||
<directory name="dir2">
|
<directory name="dir2">
|
||||||
<module name="module2" type="buildtool">
|
<module name="module2" type="kernelmodedll">
|
||||||
<file>file3.c</file>
|
<file>file3.c</file>
|
||||||
<file>file4.c</file>
|
<file>file4.c</file>
|
||||||
</module>
|
</module>
|
||||||
|
|
|
@ -9,11 +9,13 @@ void ModuleTest::Run()
|
||||||
ARE_EQUAL(2, project.modules.size());
|
ARE_EQUAL(2, project.modules.size());
|
||||||
|
|
||||||
Module& module1 = *project.modules[0];
|
Module& module1 = *project.modules[0];
|
||||||
|
IS_TRUE(module1.type == BuildTool);
|
||||||
ARE_EQUAL(2, module1.files.size());
|
ARE_EQUAL(2, module1.files.size());
|
||||||
ARE_EQUAL("./dir1/file1.c", module1.files[0]->name);
|
ARE_EQUAL("./dir1/file1.c", module1.files[0]->name);
|
||||||
ARE_EQUAL("./dir1/file2.c", module1.files[1]->name);
|
ARE_EQUAL("./dir1/file2.c", module1.files[1]->name);
|
||||||
|
|
||||||
Module& module2 = *project.modules[1];
|
Module& module2 = *project.modules[1];
|
||||||
|
IS_TRUE(module2.type == KernelModeDLL);
|
||||||
ARE_EQUAL(2, module2.files.size());
|
ARE_EQUAL(2, module2.files.size());
|
||||||
ARE_EQUAL("./dir2/file3.c", module2.files[0]->name);
|
ARE_EQUAL("./dir2/file3.c", module2.files[0]->name);
|
||||||
ARE_EQUAL("./dir2/file4.c", module2.files[1]->name);
|
ARE_EQUAL("./dir2/file4.c", module2.files[1]->name);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue