Files
FC1/ResourceCompiler/ExtensionManager.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

129 lines
3.1 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: extensionmanager.cpp
// Version: v1.00
// Created: 5/11/2002 by Timur.
// Compilers: Visual Studio.NET
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include <time.h>
#include "ExtensionManager.h"
#include "IConvertor.h"
#include "IResCompiler.h" // IResourceCompiler
#include "IRCLog.h" // IRCLog
//////////////////////////////////////////////////////////////////////////
ExtensionManager::ExtensionManager()
{
}
//////////////////////////////////////////////////////////////////////////
ExtensionManager::~ExtensionManager()
{
for (int i = 0; i < (int)m_convertors.size(); i++)
{
IConvertor *conv = m_convertors[i];
conv->Release();
}
}
//////////////////////////////////////////////////////////////////////////
IConvertor* ExtensionManager::FindConvertor( Platform platform,const char *ext ) const
{
const ExtMap *extMap = &(m_extMap[platform]);
ExtMap::const_iterator it;
for (it=extMap->begin(); it!=extMap->end(); it++)
{
CString strExtName = (* it).first;
assert((* it).second != NULL);
}
IConvertor *foundConvertor = 0;
ExtMap::const_iterator low = extMap->find(ext);
if (low != extMap->end())
{
IConvertor* conv = low->second;
return conv;
/*
ExtMap::const_iterator up = extMap->upper_bound(ext);
for (ExtMap::const_iterator it = low; it != up; ++it)
{
IConvertor* conv = *it;
// Find convertor that matches platform.
int numPlatforms = conv->GetNumPlatforms();
for (int i = 0; i < numPlatforms; i++)
{
if (conv->GetPlatform(i) == platform)
{
// Matching Convertor found.
return conv;
}
}
}
*/
}
return 0;
}
//////////////////////////////////////////////////////////////////////////
void ExtensionManager::RegisterConvertor( IConvertor *conv, IResourceCompiler *rc )
{
assert(conv);
assert(rc);
IRCLog *log=rc->GetIRCLog(); assert(log);
m_convertors.push_back( conv );
string strExt;
for (int i = 0; i < conv->GetNumExt(); ++i)
{
if (i)
strExt += ", ";
strExt += conv->GetExt(i);
}
time_t nTime = conv->GetTimestamp();
char* szTime = "unknown";
if (nTime)
{
szTime = asctime(localtime(&nTime));
szTime[strlen(szTime)-1] = '\0';
}
// Info ("timestamp %s", szTime);
log->Log(" Registered convertor for %s", strExt.c_str());
assert( conv );
for (int k = 0; k < conv->GetNumPlatforms(); k++)
{
Platform platform = conv->GetPlatform(k);
for (int i = 0; i < conv->GetNumExt(); i++)
{
const char *ext = conv->GetExt(i);
assert(ext);
m_extMap[platform].insert( ExtMap::value_type(ext,conv) );
}
}
}
//////////////////////////////////////////////////////////////////////////
void ExtensionManager::UnregisterAll()
{
for (int i = 0; i < PLATFORM_LAST; i++)
{
m_extMap[i].clear();
}
m_convertors.clear();
}