FileAccess::FileAccess( ConfigElem& elem ) :
	AllowWrite( elem.remove_bool( "AllowWrite", false ) ),
	AllowAppend( elem.remove_bool( "AllowAppend", false ) ),
	AllowRead( elem.remove_bool( "AllowRead", false ) ),
	AllowRemote( elem.remove_bool( "AllowRemote", false ) ),
	AllPackages( false ),
	AllDirectories( false ),
	AllExtensions( false )
{
	string tmp;
	while (elem.remove_prop( "Package", &tmp ))
	{
		if (tmp == "*")
			AllPackages = true;
		else
			Packages.insert( tmp );
	}
	while (elem.remove_prop( "Directory", &tmp ))
	{
		if (tmp == "*")
			AllDirectories = true;
		else
			Directories.push_back( tmp );
	}
	while (elem.remove_prop( "Extension", &tmp ))
	{
		if (tmp == "*")
			AllExtensions = true;
		else
			Extensions.push_back( tmp );
	}
}
SerialSet::SerialSet( ConfigElem& elem, const char* tag )
{
    unsigned long tmp;
    while (elem.remove_prop( tag, &tmp ))
    {
        insert( tmp );
    }
}
void StorageArea::load_item( ConfigElem& elem )
{
    // if this object is modified in a subsequent incremental save,
    // don't load it yet. 
    pol_serial_t serial = 0;
    elem.get_prop( "SERIAL", &serial );
    if (get_save_index( serial ) > current_incremental_save)
        return;

	u32 container_serial = 0;
	elem.remove_prop( "CONTAINER", &container_serial );

    Item *item = read_item( elem );
	//Austin added 8/10/2006, protect against further crash if item is null. Should throw instead?
	if (item == NULL)
	{
		elem.warn_with_line("Error reading item SERIAL or OBJTYPE.");
		return;
	}
	if (container_serial == 0)
    {
        insert_root_item( item );
    }
	else
	{
        Item *cont_item = ::system_find_item( container_serial );

		if (cont_item)
		{
            add_loaded_item( cont_item, item );
		}
        else
        {
            defer_item_insertion( item, container_serial );
        }
	}
}
void CompilerConfig::Read( const string& path )
{
    ConfigFile cf( path.c_str() );
    ConfigElem elem;
    cf.readraw( elem );

    PackageRoot.clear();
    IncludeDirectory.clear();

    string tmp;
    while (elem.remove_prop( "PackageRoot", &tmp ))
    {
        PackageRoot.push_back( normalized_dir_form(tmp) );
    }
    if (elem.remove_prop( "IncludeDirectory", &tmp ))
    {
        IncludeDirectory = normalized_dir_form(tmp);
    }
    ModuleDirectory = normalized_dir_form(elem.remove_string( "ModuleDirectory" ));
    PolScriptRoot = normalized_dir_form(elem.remove_string( "PolScriptRoot" ));
	GenerateListing = elem.remove_bool( "GenerateListing", false );
	GenerateDebugInfo = elem.remove_bool( "GenerateDebugInfo", false );
	GenerateDebugTextInfo = elem.remove_bool( "GenerateDebugTextInfo", false );
    DisplayWarnings = elem.remove_bool( "DisplayWarnings", false );
    CompileAspPages = elem.remove_bool( "CompileAspPages", false );
    AutoCompileByDefault = elem.remove_bool( "AutoCompileByDefault", false );
    UpdateOnlyOnAutoCompile = elem.remove_bool( "UpdateOnlyOnAutoCompile", false );
    OnlyCompileUpdatedScripts = elem.remove_bool( "OnlyCompileUpdatedScripts", false );
    DisplaySummary = elem.remove_bool( "DisplaySummary", false );
    OptimizeObjectMembers = elem.remove_bool( "OptimizeObjectMembers", true);
    GenerateDependencyInfo = elem.remove_bool( "GenerateDependencyInfo", OnlyCompileUpdatedScripts );

	ThreadedCompilation = elem.remove_bool( "ThreadedCompilation", false );
    DisplayUpToDateScripts = elem.remove_bool( "DisplayUpToDateScripts", true );    

	// This is where we TRY to validate full paths from what was provided in the
	// ecompile.cfg. Maybe Turley or Shini can find the best way to do this in *nix.
#ifdef WIN32
	string MyPath = path.c_str();
	// If it's just "ecompile.cfg", let's change it to the exe's path which it SHOULD be
	// with. 
	if (stricmp(MyPath.c_str(), "ecompile.cfg") == 0)
	{
		// Let's find the NEXT-TO-LAST / in the path, and remove from there on. Oh yay!
		// To bad we can't just force everyone to use ABSOLUTE PATHS NANDO. :o
		MyPath = xmain_exedir.substr(0, xmain_exedir.length()-1);
		MyPath = MyPath.substr(0, MyPath.find_last_of( '/')+1);
	}
	if (IncludeDirectory.find(':') == string::npos)
	{
		if (IncludeDirectory.substr(0, 1) != ".") // Let's make sure they didn't try using this method
		{
			IncludeDirectory = MyPath + IncludeDirectory;
		}
	}
	if (ModuleDirectory.find(':') == string::npos)
	{
		if (ModuleDirectory.substr(0, 1) != ".") // Let's make sure they didn't try using this method
		{
			ModuleDirectory = MyPath + ModuleDirectory;
		}
	}
	if (PolScriptRoot.find(':') == string::npos)
	{
		if (PolScriptRoot.substr(0, 1) != ".") // Let's make sure they didn't try using this method
		{
			PolScriptRoot = MyPath + PolScriptRoot;
		}
	}
	for( unsigned pr = 0; pr < PackageRoot.size(); ++pr )
    {
		if (PackageRoot[pr].find(':') == string::npos)
		{
			if (PackageRoot[pr].substr(0, 1) != ".") // Let's make sure they didn't try using this method
			{
				PackageRoot[pr] = MyPath + PackageRoot[pr];
			}
		}
    }

#endif
}