- Add specific properties to the keyboardlayout module type. They will assist us...
[reactos.git] / reactos / tools / rbuild / module.cpp
index c43c917..b2b4958 100644 (file)
@@ -466,6 +466,32 @@ Module::Module ( const Project& project,
                }
        }
 
+       att = moduleNode.GetAttribute ( "description", false );
+       if (att != NULL )
+       {
+               description = project.ResolveProperties(att->value);
+       }
+       else
+               description = "";
+
+       att = moduleNode.GetAttribute ( "lcid", false );
+       if (type == KeyboardLayout && att != NULL )
+               lcid = att->value;
+       else
+               lcid = "";
+
+       att = moduleNode.GetAttribute ( "layoutid", false );
+       if (type == KeyboardLayout && att != NULL )
+               layoutId = att->value;
+       else
+               layoutId = "";
+
+       att = moduleNode.GetAttribute ( "layoutnameresid", false );
+       if (type == KeyboardLayout && att != NULL )
+               layoutNameResId = att->value;
+       else
+               layoutNameResId = "";
+
        SetImportLibrary ( NULL );
 }
 
@@ -488,14 +514,18 @@ Module::~Module ()
                delete pch;
        if ( install )
                delete install;
-       if ( output )
-               delete output;
        if ( metadata )
                delete metadata;
        if ( bootstrap )
                delete bootstrap;
        if ( importLibrary )
                delete importLibrary;
+       if ( dependency )
+               delete  dependency;
+       if ( autoRegister )
+               delete autoRegister;
+       if ( output )
+               delete output;          
 }
 
 void
@@ -780,14 +810,14 @@ Module::ProcessXMLSubElement ( const XMLElement& e,
                if ( pos == string::npos )
                {
                        linkerScript = new LinkerScript (
-                               e, *this, FileLocation ( SourceDirectory, relative_path, e.value, &e ) );
+                               e, *this, new FileLocation ( SourceDirectory, relative_path, e.value, &e ) );
                }
                else
                {
                        string dir = e.value.substr ( 0, pos );
                        string name = e.value.substr ( pos + 1);
                        linkerScript = new LinkerScript (
-                               e, *this, FileLocation ( SourceDirectory, relative_path + sSep + dir, name, &e ) );
+                               e, *this, new FileLocation ( SourceDirectory, relative_path + sSep + dir, name, &e ) );
                }
                subs_invalid = true;
        }
@@ -825,14 +855,14 @@ Module::ProcessXMLSubElement ( const XMLElement& e,
                if ( pos == string::npos )
                {
                        pch = new PchFile (
-                               e, *this, FileLocation ( SourceDirectory, relative_path, e.value, &e ) );
+                               e, *this, new FileLocation ( SourceDirectory, relative_path, e.value, &e ) );
                }
                else
                {
                        string dir = e.value.substr ( 0, pos );
                        string name = e.value.substr ( pos + 1);
                        pch = new PchFile (
-                               e, *this, FileLocation ( SourceDirectory, relative_path + sSep + dir, name, &e ) );
+                               e, *this, new FileLocation ( SourceDirectory, relative_path + sSep + dir, name, &e ) );
                }
                subs_invalid = true;
        }
@@ -881,6 +911,8 @@ Module::GetModuleType ( const string& location, const XMLAttribute& attribute )
                return BuildTool;
        if ( attribute.value == "staticlibrary" )
                return StaticLibrary;
+       if ( attribute.value == "hoststaticlibrary" )
+               return HostStaticLibrary;
        if ( attribute.value == "objectlibrary" )
                return ObjectLibrary;
        if ( attribute.value == "kernel" )
@@ -893,6 +925,8 @@ Module::GetModuleType ( const string& location, const XMLAttribute& attribute )
                return NativeDLL;
        if ( attribute.value == "nativecui" )
                return NativeCUI;
+       if ( attribute.value == "keyboardlayout" )
+               return KeyboardLayout;
        if ( attribute.value == "win32dll" )
                return Win32DLL;
        if ( attribute.value == "win32ocx" )
@@ -933,6 +967,8 @@ Module::GetModuleType ( const string& location, const XMLAttribute& attribute )
                return EmbeddedTypeLib;
        if ( attribute.value == "elfexecutable" )
                return ElfExecutable;
+       if ( attribute.value == "cabinet" )
+               return Cabinet;
        throw InvalidAttributeValueException ( location,
                                               attribute.name,
                                               attribute.value );
@@ -945,6 +981,7 @@ Module::GetTargetDirectoryTree () const
        {
                case Kernel:
                case KernelModeDLL:
+               case KeyboardLayout:
                case NativeDLL:
                case Win32DLL:
                case Win32OCX:
@@ -962,10 +999,12 @@ Module::GetTargetDirectoryTree () const
                case LiveIso:
                case IsoRegTest:
                case LiveIsoRegTest:
-               case EmbeddedTypeLib:
                case ElfExecutable:
+               case Cabinet:
                        return OutputDirectory;
+               case EmbeddedTypeLib:
                case StaticLibrary:
+               case HostStaticLibrary:
                case ObjectLibrary:
                case RpcServer:
                case RpcClient:
@@ -991,6 +1030,7 @@ Module::GetDefaultModuleExtension () const
                        return ExePostfix;
                case BootProgram:
                case StaticLibrary:
+               case HostStaticLibrary:
                        return ".a";
                case ObjectLibrary:
                        return ".o";
@@ -1004,6 +1044,7 @@ Module::GetDefaultModuleExtension () const
 
                case KernelModeDLL:
                case NativeDLL:
+               case KeyboardLayout:
                case Win32DLL:
                        return ".dll";
                case Win32OCX:
@@ -1011,6 +1052,8 @@ Module::GetDefaultModuleExtension () const
                case KernelModeDriver:
                case BootLoader:
                        return ".sys";
+               case Cabinet:
+                       return ".cab";
                case BootSector:
                        return ".o";
                case Iso:
@@ -1044,6 +1087,7 @@ Module::GetDefaultModuleEntrypoint () const
        {
                case Kernel:
                        return "KiSystemStartup";
+               case KeyboardLayout:
                case KernelModeDLL:
                case KernelModeDriver:
                        return "DriverEntry@8";
@@ -1068,6 +1112,7 @@ Module::GetDefaultModuleEntrypoint () const
                                return "WinMainCRTStartup";
                case BuildTool:
                case StaticLibrary:
+               case HostStaticLibrary:
                case ObjectLibrary:
                case BootLoader:
                case BootSector:
@@ -1083,6 +1128,7 @@ Module::GetDefaultModuleEntrypoint () const
                case IdlHeader:
                case ElfExecutable:
                case EmbeddedTypeLib:
+               case Cabinet:
                        return "";
                case TypeDontCare:
                        break;
@@ -1109,6 +1155,7 @@ Module::GetDefaultModuleBaseaddress () const
                case Win32SCR:
                case Win32GUI:
                        return "0x00400000";
+               case KeyboardLayout:
                case KernelModeDLL:
                case KernelModeDriver:
                        return "0x00010000";
@@ -1116,6 +1163,7 @@ Module::GetDefaultModuleBaseaddress () const
                        return "0xe00000";
                case BuildTool:
                case StaticLibrary:
+               case HostStaticLibrary:
                case ObjectLibrary:
                case BootLoader:
                case BootSector:
@@ -1130,6 +1178,7 @@ Module::GetDefaultModuleBaseaddress () const
                case BootProgram:
                case IdlHeader:
                case EmbeddedTypeLib:
+               case Cabinet:
                        return "";
                case TypeDontCare:
                        break;
@@ -1141,7 +1190,7 @@ Module::GetDefaultModuleBaseaddress () const
 bool
 Module::HasImportLibrary () const
 {
-       return importLibrary != NULL && type != StaticLibrary;
+       return importLibrary != NULL && type != StaticLibrary && type != HostStaticLibrary;
 }
 
 bool
@@ -1152,6 +1201,7 @@ Module::IsDLL () const
                case Kernel:
                case KernelModeDLL:
                case NativeDLL:
+               case KeyboardLayout:
                case Win32DLL:
                case Win32OCX:
                case KernelModeDriver:
@@ -1163,6 +1213,7 @@ Module::IsDLL () const
                case Win32GUI:
                case BuildTool:
                case StaticLibrary:
+               case HostStaticLibrary:
                case ObjectLibrary:
                case BootLoader:
                case BootSector:
@@ -1178,6 +1229,7 @@ Module::IsDLL () const
                case IdlHeader:
                case EmbeddedTypeLib:
                case ElfExecutable:
+               case Cabinet:
                        return false;
                case TypeDontCare:
                        break;
@@ -1598,8 +1650,7 @@ Metadata::Metadata ( const XMLElement& _node,
 
 ImportLibrary::~ImportLibrary ()
 {
-       if ( source )
-               delete source;
+       delete source;
 }
 
 
@@ -1615,7 +1666,7 @@ ImportLibrary::ImportLibrary ( const Project& project,
 
        if ( dllname )
                this->dllname = dllname->value;
-       else if ( module.type == StaticLibrary )
+       else if ( module.type == StaticLibrary || module.type == HostStaticLibrary )
                throw XMLInvalidBuildFileException (
                    node.location,
                    "<importlibrary> dllname attribute required." );
@@ -1687,6 +1738,25 @@ Property::Property ( const XMLElement& node_,
        att = node_.GetAttribute ( "value", true );
        assert(att);
        value = att->value;
+
+       att = node_.GetAttribute ( "internal", false );
+       if ( att != NULL )
+       {
+               const char* p = att->value.c_str();
+               if ( !stricmp ( p, "true" ) || !stricmp ( p, "yes" ) )
+                       isInternal = true;
+               else if ( !stricmp ( p, "false" ) || !stricmp ( p, "no" ) )
+                       isInternal = false;
+               else
+               {
+                       throw InvalidAttributeValueException (
+                               node_.location,
+                               "internal",
+                               att->value );
+               }
+       }
+       else
+               isInternal = false;
 }
 
 Property::Property ( const Project& project_,
@@ -1706,11 +1776,16 @@ Property::ProcessXML()
 PchFile::PchFile (
        const XMLElement& node_,
        const Module& module_,
-       const FileLocationfile_ )
+       const FileLocation *file_ )
        : node(node_), module(module_), file(file_)
 {
 }
 
+PchFile::~PchFile()
+{
+       delete file;
+}
+
 void
 PchFile::ProcessXML()
 {