6e8fbca745
match the genesis editor version 1.3.0.653.
246 lines
7.2 KiB
C++
246 lines
7.2 KiB
C++
/****************************************************************************
|
||
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 "serialization/serializeserver.h"
|
||
#include "io/iointerface.h"
|
||
#include "io/memorystream.h"
|
||
#include "io/iointerfaceprotocol.h"
|
||
#include "serialization/xmserialize.h"
|
||
#include "serialization/binaryserialize.h"
|
||
|
||
namespace Serialization
|
||
{
|
||
__ImplementClass(Serialization::SerializationServer, 'GSLM', Core::RefCounted);
|
||
__ImplementImageSingleton(Serialization::SerializationServer);
|
||
|
||
FileType SerializationServer::SDefaultType = FT_BINARY;
|
||
//------------------------------------------------------------------------
|
||
SerializationServer::SerializationServer()
|
||
{
|
||
__ConstructImageSingleton;
|
||
}
|
||
//------------------------------------------------------------------------
|
||
SerializationServer::~SerializationServer()
|
||
{
|
||
__DestructImageSingleton;
|
||
}
|
||
//--------------------------------------------------------------------------------
|
||
GPtr<SerializeReader>
|
||
SerializationServer::OpenReadFile( const IO::TStreamPtr& pFileStream, FileType aft /*= FT_DEFAULT*/ )
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>reader
|
||
GPtr<SerializeReader> pReader(NULL);
|
||
if ( aft == FT_DEFAULT )
|
||
{
|
||
aft = SerializationServer::SDefaultType;
|
||
|
||
}
|
||
pReader = _CreateReaderByFT(aft,pFileStream);
|
||
|
||
if ( pReader )
|
||
{
|
||
pReader->SetStream( pFileStream );
|
||
pReader->BeginFileSerialize();
|
||
pReader->SetOpen(true);
|
||
}
|
||
|
||
return pReader;
|
||
|
||
}
|
||
//------------------------------------------------------------------------
|
||
GPtr<SerializeReader>
|
||
SerializationServer::_CreateReaderByFT(FileType aft,const IO::TStreamPtr& pFileStream)
|
||
{
|
||
//n_assert(aft != FT_DEFAULT);
|
||
//#ifdef __GENESIS_EDITOR__
|
||
#define __AUTO_IDENTIFY__
|
||
//#endif
|
||
|
||
#ifdef __AUTO_IDENTIFY__
|
||
aft = FT_AUTO;
|
||
#endif
|
||
|
||
GPtr<SerializeReader> pReader(NULL);
|
||
if ( aft == FT_XML )
|
||
{
|
||
pReader = Serialization::SerializeXmlReader::Create();
|
||
}
|
||
else if ( aft == FT_BINARY )
|
||
{
|
||
pReader = Serialization::SerializeBinaryReader::Create();
|
||
}
|
||
else if (aft == FT_AUTO)
|
||
{
|
||
//char* pXml = const_cast<char*>(s_ciXmlTag);
|
||
uint* pXmlBinary = const_cast<uint*>(&s_ciXmlBinaryTag);
|
||
|
||
if ( pFileStream->GetSize() >= sizeof(s_ciXmlBinaryTag) &&
|
||
pFileStream->IsHeader(pXmlBinary,sizeof(s_ciXmlBinaryTag)) )
|
||
{
|
||
pReader = Serialization::SerializeBinaryReader::Create();
|
||
}
|
||
else
|
||
{
|
||
pReader = Serialization::SerializeXmlReader::Create();
|
||
}
|
||
|
||
}
|
||
else if ( aft == FT_BXML )
|
||
{
|
||
n_error(" SerializationServer::OpenReadFile: not support AFT_BXML now ");
|
||
}
|
||
else
|
||
{
|
||
n_error(" SerializationServer::OpenReadFile: not support this FileType now! ");
|
||
}
|
||
return pReader;
|
||
}
|
||
//------------------------------------------------------------------------
|
||
GPtr<SerializeReader>
|
||
SerializationServer::OpenReadFile( const Util::String& filePath, FileType aft /*= FT_AUTO*/ )
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<49><4F><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
||
GPtr<IO::Stream> pStream = IO::MemoryStream::Create();
|
||
n_assert( pStream );
|
||
GPtr<IO::ReadStream> readStreamMsg = IO::ReadStream::Create();
|
||
n_assert( readStreamMsg );
|
||
|
||
readStreamMsg->SetFileName( filePath );
|
||
readStreamMsg->SetStream( pStream );
|
||
|
||
IO::IoInterface::Instance()->SendWait( readStreamMsg.upcast<Messaging::Message>() );
|
||
|
||
if ( !readStreamMsg->GetResult() )
|
||
{
|
||
n_warning( "SerializationServer::OpenReadFile: can not open %s!Maybe the size of file is 0.",
|
||
filePath.AsCharPtr() );
|
||
return NULL;
|
||
}
|
||
|
||
GPtr<SerializeReader> pReader = OpenReadFile(pStream, aft);
|
||
if ( !pReader )
|
||
{
|
||
n_warning( "SerializationServer::OpenReadFile: can not read %s!Maybe the file format is wrong.",
|
||
filePath.AsCharPtr() );
|
||
return NULL;
|
||
}
|
||
|
||
return pReader;
|
||
}
|
||
//------------------------------------------------------------------------
|
||
bool
|
||
SerializationServer::CloseReadFile( const GPtr<SerializeReader>& pReader )
|
||
{
|
||
if ( !pReader || !pReader->IsOpen() )
|
||
return false;
|
||
|
||
pReader->EndFileSerialize();
|
||
pReader->SetOpen(false);
|
||
return true;
|
||
}
|
||
//--------------------------------------------------------------------------------
|
||
GPtr<SerializeWriter> SerializationServer::OpenWriteFile( const IO::TStreamPtr& pFileStream, FileType aft )
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>writer
|
||
GPtr<SerializeWriter> pWriter = NULL;
|
||
|
||
if ( aft == FT_DEFAULT )
|
||
{
|
||
aft = SerializationServer::SDefaultType;
|
||
}
|
||
|
||
if ( aft == FT_BXML )
|
||
{
|
||
n_error(" SerializationManager::OpenWriteFile: not support AFT_BXML now ");
|
||
}
|
||
else if ( aft == FT_XML )
|
||
{
|
||
pWriter = Serialization::SerializeXmlWriter::Create();
|
||
}
|
||
else if ( aft == FT_BINARY )
|
||
{
|
||
pWriter = Serialization::SerializeBinaryWriter::Create();
|
||
}
|
||
else
|
||
{
|
||
pWriter = Serialization::SerializeXmlWriter::Create();
|
||
}
|
||
|
||
if ( pWriter )
|
||
{
|
||
pWriter->SetStream( pFileStream );
|
||
pWriter->BeginFileSerialize();
|
||
pWriter->SetOpen(true);
|
||
}
|
||
|
||
return pWriter;
|
||
}
|
||
//------------------------------------------------------------------------
|
||
GPtr<SerializeWriter>
|
||
SerializationServer::OpenWriteFile( const Util::String& filePath, FileType aft /*= AFT_DEFAULT*/ )
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
||
GPtr<IO::Stream> pStream = IO::MemoryStream::Create();
|
||
n_assert( pStream );
|
||
pStream->SetURI( filePath );
|
||
|
||
return OpenWriteFile(pStream, aft);
|
||
|
||
}
|
||
//------------------------------------------------------------------------
|
||
bool
|
||
SerializationServer::CloseWriteFile( const GPtr<SerializeWriter>& pWriter )
|
||
{
|
||
if( !pWriter || !pWriter->IsOpen())
|
||
return false;
|
||
|
||
pWriter->EndFileSerialize();
|
||
pWriter->SetOpen(false);
|
||
|
||
const GPtr<IO::Stream> pStream = pWriter->GetStream();
|
||
if ( !pStream )
|
||
{
|
||
n_warning("SerializationManager::CloseWriteFile Error: Can Not Get Steam" );
|
||
return false;
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||
GPtr<IO::WriteStream> writeStreamMsg = IO::WriteStream::Create();
|
||
n_assert( writeStreamMsg );
|
||
|
||
writeStreamMsg->SetURI( pStream->GetURI() );
|
||
writeStreamMsg->SetStream( pStream );
|
||
|
||
IO::IoInterface::Instance()->SendWait( writeStreamMsg.upcast<Messaging::Message>() );
|
||
|
||
if ( !writeStreamMsg->GetResult() )
|
||
{
|
||
n_warning("SerializationManager::CloseWriteFile write file error" );
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
}
|