371 lines
11 KiB
C++
371 lines
11 KiB
C++
|
/****************************************************************************
|
|||
|
Copyright (c) 2008, Radon Labs GmbH
|
|||
|
Copyright (c) 2011-2013,WebJet Business Division,CYOU
|
|||
|
|
|||
|
http://www.genesis-3d.com.cn
|
|||
|
|
|||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|||
|
of this software and associated documentation files (the "Software"), to deal
|
|||
|
in the Software without restriction, including without limitation the rights
|
|||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
|
copies of the Software, and to permit persons to whom the Software is
|
|||
|
furnished to do so, subject to the following conditions:
|
|||
|
|
|||
|
The above copyright notice and this permission notice shall be included in
|
|||
|
all copies or substantial portions of the Software.
|
|||
|
|
|||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|||
|
THE SOFTWARE.
|
|||
|
****************************************************************************/
|
|||
|
|
|||
|
#include "stdneb.h"
|
|||
|
#include "io/assignregistry.h"
|
|||
|
#include "io/fswrapper.h"
|
|||
|
#include "core/coreserver.h"
|
|||
|
|
|||
|
namespace IO
|
|||
|
{
|
|||
|
//__ImplementClass(IO::AssignRegistry, 'ASRG', Core::RefCounted);
|
|||
|
__ImplementImageSingleton(IO::AssignRegistry);
|
|||
|
|
|||
|
using namespace Util;
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
AssignRegistry::AssignRegistry() :
|
|||
|
isValid(false)
|
|||
|
{
|
|||
|
__ConstructImageSingleton;
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
AssignRegistry::~AssignRegistry()
|
|||
|
{
|
|||
|
if (this->IsValid())
|
|||
|
{
|
|||
|
this->Discard();
|
|||
|
}
|
|||
|
__DestructImageSingleton;
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
void
|
|||
|
AssignRegistry::Setup()
|
|||
|
{
|
|||
|
//this->critSect.Enter();
|
|||
|
|
|||
|
n_assert(!this->IsValid());
|
|||
|
this->isValid = true;
|
|||
|
//this->SetupSystemAssigns();
|
|||
|
//this->SetupProjectAssigns();
|
|||
|
|
|||
|
//this->critSect.Leave();
|
|||
|
|
|||
|
String binLocation = FSWrapper::GetBinDirectory();
|
|||
|
if (binLocation.IsValid())
|
|||
|
{
|
|||
|
this->SetAssign(Assign("bin", binLocation));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
void
|
|||
|
AssignRegistry::Discard()
|
|||
|
{
|
|||
|
//this->critSect.Enter();
|
|||
|
|
|||
|
n_assert(this->IsValid());
|
|||
|
this->assignTable.Clear();
|
|||
|
this->isValid = false;
|
|||
|
|
|||
|
//this->critSect.Leave();
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
bool
|
|||
|
AssignRegistry::IsValid() const
|
|||
|
{
|
|||
|
return this->isValid;
|
|||
|
}
|
|||
|
|
|||
|
////------------------------------------------------------------------------------
|
|||
|
///**
|
|||
|
//*/
|
|||
|
//void
|
|||
|
//AssignRegistry::SetupSystemAssigns()
|
|||
|
//{
|
|||
|
// //this->critSect.Enter();
|
|||
|
//
|
|||
|
// n_assert(this->IsValid());
|
|||
|
//
|
|||
|
// String homeLocation = FSWrapper::GetHomeDirectory();
|
|||
|
// if (homeLocation.IsValid())
|
|||
|
// {
|
|||
|
// this->SetAssign(Assign("home", homeLocation));
|
|||
|
// }
|
|||
|
// #if !(__WII__ || __PS3__)
|
|||
|
// String binLocation = FSWrapper::GetBinDirectory();
|
|||
|
// if (binLocation.IsValid())
|
|||
|
// {
|
|||
|
// this->SetAssign(Assign("bin", binLocation));
|
|||
|
// }
|
|||
|
// String tempLocation = FSWrapper::GetTempDirectory();
|
|||
|
// if (tempLocation.IsValid())
|
|||
|
// {
|
|||
|
// this->SetAssign(Assign("temp", tempLocation));
|
|||
|
// }
|
|||
|
// String userLocation = FSWrapper::GetUserDirectory();
|
|||
|
// if (userLocation.IsValid())
|
|||
|
// {
|
|||
|
// this->SetAssign(Assign("user", userLocation));
|
|||
|
// }
|
|||
|
// //#ifdef __GENESIS_EDITOR__
|
|||
|
// //String editorAssetLocation = FSWrapper::GetEditorAssetDirectory();
|
|||
|
// //if (editorAssetLocation.IsValid())
|
|||
|
// //{
|
|||
|
// // this->SetAssign(Assign("editor", editorAssetLocation));
|
|||
|
// //}
|
|||
|
// //#endif // __GENESIS_EDITOR__
|
|||
|
// #endif
|
|||
|
//
|
|||
|
// #if __WIN32__
|
|||
|
// String appDataLocation = FSWrapper::GetAppDataDirectory();
|
|||
|
// if (appDataLocation.IsValid())
|
|||
|
// {
|
|||
|
// this->SetAssign(Assign("appdata", appDataLocation));
|
|||
|
// }
|
|||
|
// String programsLocation = FSWrapper::GetProgramsDirectory();
|
|||
|
// if (programsLocation.IsValid())
|
|||
|
// {
|
|||
|
// this->SetAssign(Assign("programs", programsLocation));
|
|||
|
// }
|
|||
|
// #endif
|
|||
|
//
|
|||
|
// //this->critSect.Leave();
|
|||
|
//}
|
|||
|
//
|
|||
|
////------------------------------------------------------------------------------
|
|||
|
///**
|
|||
|
//*/
|
|||
|
//void
|
|||
|
//AssignRegistry::SetupProjectAssigns()
|
|||
|
//{
|
|||
|
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>
|
|||
|
// return;
|
|||
|
//
|
|||
|
// // //this->critSect.Enter();
|
|||
|
// //
|
|||
|
// // n_assert(this->IsValid());
|
|||
|
//
|
|||
|
// // String rootDir = Core::CoreServer::Instance()->GetRootDirectory().AsString();
|
|||
|
// // this->SetAssign(Assign("root", rootDir));
|
|||
|
//
|
|||
|
// // #if __WIN32__
|
|||
|
// // this->SetAssign(Assign("export", "root:export_win32"));
|
|||
|
// // #elif __XBOX360__
|
|||
|
// // this->SetAssign(Assign("export", "root:export_xbox360"));
|
|||
|
// // #elif __WII__
|
|||
|
// // this->SetAssign(Assign("export", "root:export_wii"));
|
|||
|
// // #elif __PS3__
|
|||
|
// // this->SetAssign(Assign("export", "root:export_ps3"));
|
|||
|
// // #elif __OSX__
|
|||
|
// // this->SetAssign(Assign("export", "root:export_osx"));
|
|||
|
// // #else
|
|||
|
// // #error "PLATFORM FIXME: setup platform specific assigns!"
|
|||
|
// // #endif
|
|||
|
//
|
|||
|
// ////temp code
|
|||
|
// ////SetAssign( IO::Assign("Net","http://10.7.82.13:8080") );
|
|||
|
// ////SetAssign( IO::Assign("export", "Net:export_win32"));
|
|||
|
//
|
|||
|
// // // setup content assigns
|
|||
|
// // this->SetAssign(Assign("msh", "export:meshes"));
|
|||
|
// // this->SetAssign(Assign("ani", "export:anims"));
|
|||
|
// // this->SetAssign(Assign("data", "export:data"));
|
|||
|
// // this->SetAssign(Assign("video", "export:video"));
|
|||
|
// // this->SetAssign(Assign("seq", "export:sequences"));
|
|||
|
// // this->SetAssign(Assign("stream", "export:audio"));
|
|||
|
// // this->SetAssign(Assign("shd", "export:shaders"));
|
|||
|
// // this->SetAssign(Assign("tex", "export:textures"));
|
|||
|
// // this->SetAssign(Assign("frame", "export:frame"));
|
|||
|
// // this->SetAssign(Assign("mdl", "export:models"));
|
|||
|
// // this->SetAssign(Assign("audio", "export:audio"));
|
|||
|
// // this->SetAssign(Assign("sui", "export:sui"));
|
|||
|
// // this->SetAssign(Assign("wiidata", "export:wiidata"));
|
|||
|
//
|
|||
|
// // // setup special system assigns (for placeholders, etc...)
|
|||
|
// // this->SetAssign(Assign("sysmsh", "export:meshes"));
|
|||
|
// // this->SetAssign(Assign("systex", "export:textures"));
|
|||
|
// // this->SetAssign(Assign("sysanim", "export:anims"));
|
|||
|
//
|
|||
|
// // // Nebula2 backward compat assigns:
|
|||
|
// // this->SetAssign(Assign("meshes", "export:meshes"));
|
|||
|
// // this->SetAssign(Assign("anims", "export:anims"));
|
|||
|
// // this->SetAssign(Assign("textures", "export:textures"));
|
|||
|
//
|
|||
|
// // //this->critSect.Leave();
|
|||
|
//}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
void
|
|||
|
AssignRegistry::SetAssign(const Assign& assign)
|
|||
|
{
|
|||
|
//this->critSect.Enter();
|
|||
|
|
|||
|
n_assert(this->IsValid());
|
|||
|
if (this->HasAssign(assign.GetName()))
|
|||
|
{
|
|||
|
this->ClearAssign(assign.GetName());
|
|||
|
}
|
|||
|
this->assignTable.Add(assign);
|
|||
|
|
|||
|
//this->critSect.Leave();
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
bool
|
|||
|
AssignRegistry::HasAssign(const String& assignName) const
|
|||
|
{
|
|||
|
//this->critSect.Enter();
|
|||
|
n_assert(assignName.IsValid());
|
|||
|
bool result = this->assignTable.Contains(assignName);
|
|||
|
//this->critSect.Leave();
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
String
|
|||
|
AssignRegistry::GetAssign(const String& assignName) const
|
|||
|
{
|
|||
|
//this->critSect.Enter();
|
|||
|
|
|||
|
n_assert(assignName.IsValid());
|
|||
|
n_assert(this->HasAssign(assignName));
|
|||
|
String result = this->assignTable[assignName];
|
|||
|
|
|||
|
//this->critSect.Leave();
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
void
|
|||
|
AssignRegistry::ClearAssign(const String& assignName)
|
|||
|
{
|
|||
|
//this->critSect.Enter();
|
|||
|
|
|||
|
n_assert(assignName.IsValid());
|
|||
|
n_assert(this->HasAssign(assignName));
|
|||
|
this->assignTable.Erase(assignName);
|
|||
|
|
|||
|
//this->critSect.Leave();
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
*/
|
|||
|
Array<Assign>
|
|||
|
AssignRegistry::GetAllAssigns() const
|
|||
|
{
|
|||
|
//this->critSect.Enter();
|
|||
|
|
|||
|
Array<KeyValuePair<String,String> > content = this->assignTable.Content();
|
|||
|
Array<Assign> assigns(content.Size(), 0);
|
|||
|
IndexT i;
|
|||
|
for (i = 0; i < content.Size(); i++)
|
|||
|
{
|
|||
|
assigns.Append(Assign(content[i].Key(), content[i].Value()));
|
|||
|
}
|
|||
|
|
|||
|
//this->critSect.Leave();
|
|||
|
return assigns;
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
Resolves all assigns from an URI returning an URI. It is allowed to
|
|||
|
"stack" assigns, which means, defining an assign as pointing to
|
|||
|
another assign.
|
|||
|
*/
|
|||
|
URI
|
|||
|
AssignRegistry::ResolveAssigns(const URI& uri) const
|
|||
|
{
|
|||
|
//this->critSect.Enter();
|
|||
|
URI resolvedUri = this->ResolveAssignsInString(uri.AsString());
|
|||
|
//this->critSect.Leave();
|
|||
|
return resolvedUri;
|
|||
|
}
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/**
|
|||
|
Resolves all assigns from a URI. It is allowed to
|
|||
|
"stack" assigns, which means, defining an assign as pointing to
|
|||
|
another assign.s
|
|||
|
*/
|
|||
|
String
|
|||
|
AssignRegistry::ResolveAssignsInString(const String& uriString) const
|
|||
|
{
|
|||
|
//this->critSect.Enter();
|
|||
|
String result = uriString;
|
|||
|
|
|||
|
// check for assigns
|
|||
|
int colonIndex;
|
|||
|
while ((colonIndex = result.FindCharIndex(':', 0)) > 0)
|
|||
|
{
|
|||
|
// special case: ignore one-caracter "assigns" because they are
|
|||
|
// really DOS drive letters
|
|||
|
if (colonIndex > 1)
|
|||
|
{
|
|||
|
String assignString = result.ExtractRange(0, colonIndex);
|
|||
|
|
|||
|
// ignore unknown assigns, because these may be part of an URI
|
|||
|
if (this->HasAssign(assignString))
|
|||
|
{
|
|||
|
String postAssignString = result.ExtractRange(colonIndex + 1, result.Length() - (colonIndex + 1));
|
|||
|
String replace = this->GetAssign(assignString);
|
|||
|
if (!replace.IsEmpty())
|
|||
|
{
|
|||
|
if (replace[replace.Length()-1] != ':'
|
|||
|
&& (replace[replace.Length()-1] != '/'
|
|||
|
|| replace[replace.Length()-2] != ':'))
|
|||
|
{
|
|||
|
replace.Append("/");
|
|||
|
}
|
|||
|
replace.Append(postAssignString);
|
|||
|
}
|
|||
|
result = replace;
|
|||
|
}
|
|||
|
else break;
|
|||
|
}
|
|||
|
else break;
|
|||
|
}
|
|||
|
result.ConvertBackslashes();
|
|||
|
result.TrimRight("/");
|
|||
|
//this->critSect.Leave();
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
} // namespace IO
|