const char *XBL_MM_GetServerName( const int index ) { static char retVal[XATTRIB_SESSION_NAME_MAX_LEN+1]; wcharToChar( retVal, query.Results[index].SessionName ); return retVal; }
void cLog::writeW(const std::wstring & buffer) { #ifdef _UNICODE write(buffer); #else write(wcharToChar(buffer)); #endif }
int _tmain(int argc, _TCHAR* argv[]) { bool enableEnum = false; bool enableName = false; argv++; argc--; bool okArgs = false; if (argc == 1) okArgs = true; else if (argc == 2) { if (argv[1][0] == '-' && (argv[1][1] == 'e' || argv[1][1] == 'E' || argv[2][1] == 's' || argv[2][1] == 'S') ) okArgs = true; } else if (argc == 3) { if (argv[1][0] == '-' && argv[2][0] == '-' && (argv[1][1] == 'e' || argv[1][1] == 'E' || argv[1][1] == 's' || argv[1][1] == 'S') && (argv[2][1] == 'e' || argv[2][1] == 'E' || argv[2][1] == 's' || argv[2][1] == 'S') ) okArgs = true; } if (okArgs) { if (argc >= 2) { if (argv[1][1] == 'e' || argv[1][1] == 'E') enableEnum = true; if (argv[1][1] == 's' || argv[1][1] == 'S') enableName = true; } if (argc >= 3) { if (argv[2][1] == 'e' || argv[2][1] == 'E') enableEnum = true; if (argv[2][1] == 's' || argv[2][1] == 'S') enableName = true; } if (!enableEnum && !enableName) enableEnum = true; TCHAR* inputFilename = argv[0]; //TCHAR* inputFilename = _T("D:\\Projects\\Tools\\EditableEditor2\\exml\\EditorSave.exbn"); //int _len = _tcslen(argv[0]); char package[256] = {0}; if (argc == 3) { char* _package = package; wcharToChar(argv[2] , &_package , 256 ); } //if (argc < 3) { _tprintf(_T("input file\n")); DBG_TRACE(inputFilename); ByteArray ba(inputFilename); ba.endian = Endian::BIG; for (int i = _tcslen(inputFilename) ; i >=0 ; i-- ) { if (inputFilename[i] == '\\' || inputFilename[i] == '/') { TCHAR back = inputFilename[i]; inputFilename[i] = '\0'; char path[256] = {0}; char* _path = path; wcharToChar(inputFilename , &_path , 256 ); _chdir(path); inputFilename[i] = back; break; } } if (readFileHead(ba)) { _tprintf(_T("file head ok!!\n")); ////////////////////////////////////////////////////////////////////////// int strPoolLength= ba.readUnsignedByteOrShort(); DBG_TRACE(_T("strPoolLength %d") , strPoolLength); ASSERT(strPoolLength < countof(s_stringPool) , _T("too much strPoolLength")); for (int i = 0 ; i < strPoolLength; i++ ) { int strLeng = ba.readUnsignedByteOrShort(); char* _name = new char[strLeng+1]; ba.readBytes((unsigned char* )(_name) ,strLeng+1 , 0 , strLeng ); _name[strLeng] = '\0'; printf("Get string[%d]: %s\n" , s_stringPool_index , _name ); s_stringPool[s_stringPool_index++] = _name; } ////////////////////////////////////////////////////////////////////////// //int classPoolDataLength = ba.readUnsignedShortOrInt(); //int destEnd = ba.getPosition() + classPoolDataLength; int classPoolLength = ba.readUnsignedByteOrShort(); DBG_TRACE(_T("classPoolLength %d") , classPoolLength); ASSERT(classPoolLength < countof(s_classPool) , _T("too much classPoolLength")); for (int i = 0 ; i < classPoolLength; i++ ) { ClassBinStruct& _cbs = s_classPool[s_classPool_index++]; _cbs.needExport = false; _cbs.classNameId = ba.readUnsignedByteOrShort(); ASSERT(_cbs.classNameId < s_stringPool_index , _T("error string")); _cbs.className = s_stringPool[_cbs.classNameId]; _cbs.variableNum = ba.readUnsignedByteOrShort(); ASSERT(_cbs.variableNum < countof(_cbs.variableArray) , _T("too much variableNum")); printf("find class %s _cbs.className %d\n" , _cbs.className , _cbs.variableNum); for (int vi = 0 ; vi < _cbs.variableNum; vi++ ) { VariableBinStruct& vbs = _cbs.variableArray[vi]; vbs.variableNameId = ba.readUnsignedByteOrShort(); ASSERT(vbs.variableNameId < s_stringPool_index , _T("error string")); vbs.variableName = s_stringPool[vbs.variableNameId]; vbs.type = (VariableBinStruct::eVType)ba.readByte(); vbs.inlineClassId = -1; if (vbs.type == VariableBinStruct::TYPE_INSTANCE_UID_INLINE || vbs.type == VariableBinStruct::TYPE_INSTANCE_UID) vbs.inlineClassId = ba.readUnsignedByteOrShort(); else vbs.inlineClassId = -1; if (vbs.type == VariableBinStruct::TYPE_INSTANCE_UID_INLINE) { printf((" var %d %s type %d inline class %s\n") , vi , vbs.variableName , vbs.type , s_classPool[vbs.inlineClassId].className); } else if (vbs.type == VariableBinStruct::TYPE_INSTANCE_UID) { printf((" var %d %s type %d class %s\n") , vi , vbs.variableName , vbs.type , s_classPool[vbs.inlineClassId].className); } else { printf((" var %d %s type %d\n") , vi , vbs.variableName , vbs.type); } } } //ASSERT(destEnd == ba.getPosition() , _T("error")); ////////////////////////////////////////////////////////////////////////// //find root class int classInstanceLength = ba.readUnsignedByteOrShort(); //int instancPose = ba.getPosition(); printf("classInstanceLength %d\n" , classInstanceLength); for (int i = 0 ; i < classInstanceLength; i++ ) { int classDataLength = ba.readUnsignedByteOrShort(); int pos = ba.getPosition(); int endPos = pos + classDataLength; int clsId = ba.readUnsignedByteOrShort(); ASSERT(clsId < s_classPool_index , _T("error string")); ClassBinStruct& _cbs = s_classPool[clsId]; _cbs.needExport = true; ba.setPosition(endPos); } for (int classi = 0; classi < s_classPool_index ; classi++) { ClassBinStruct& _cbs = s_classPool[classi]; if (_cbs.needExport) { printf("export class %s\n" , _cbs.className); bool hasInstance = false; ByteArray output; output.writeMultiByte("#ifndef __EXBN_"); output.writeMultiByte(_cbs.className); output.writeMultiByte("_H__\n"); output.writeMultiByte("#define __EXBN_"); output.writeMultiByte(_cbs.className); output.writeMultiByte("_H__\n"); //output.writeMultiByte("\timport ExbnDecoder.*;\n"); //output.writeMultiByte("\timport flash.utils.ByteArray;\n"); output.writeMultiByte("\nclass "); output.writeMultiByte(_cbs.className); output.writeMultiByte(" : public ExbnClassBase {\n"); output.writeMultiByte("\npublic : \n"); output.writeMultiByte("\n\t"); output.writeMultiByte("static ExbnClassBase* createInstace(unsigned int a_instanceUID) {return NEW "); output.writeMultiByte(_cbs.className); output.writeMultiByte("(a_instanceUID);}"); output.writeMultiByte("\n\t"); output.writeMultiByte(_cbs.className); output.writeMultiByte("(unsigned int a_instanceUID) : ExbnClassBase(a_instanceUID) {"); if (enableEnum) { output.writeMultiByte("\n\t\t"); output.writeMultiByte("EXBN_CLS_ENUM = EXBN_ENUM_"); output.writeMultiByte(_cbs.className); output.writeMultiByte(";"); } if (enableName) { output.writeMultiByte("\n\t\t"); output.writeMultiByte("EXBN_CLS_NAME = _T(\""); output.writeMultiByte(_cbs.className); output.writeMultiByte("\");"); } output.writeMultiByte("\n\t}\n"); for (int vi = 0 ; vi < _cbs.variableNum; vi++ ) { VariableBinStruct& vbs = _cbs.variableArray[vi]; if (getInlineTypeNeedDispose(vbs)) hasInstance = true; output.writeMultiByte("\t"); output.writeMultiByte(getInlineTypeType(vbs)); output.writeMultiByte(" "); output.writeMultiByte(vbs.variableName); output.writeMultiByte(";\n"); } output.writeMultiByte("\n\n"); { output.writeMultiByte("\tvoid virtual decode(ByteArray& ba , ExbnEnv& a_env ) {\n"); for (int vi = 0 ; vi < _cbs.variableNum; vi++ ) { VariableBinStruct& vbs = _cbs.variableArray[vi]; output.writeMultiByte("\t\t"); output.writeMultiByte(vbs.variableName); output.writeMultiByte(" = "); output.writeMultiByte(getInlineTypeRead(vbs)); output.writeMultiByte("\n"); } output.writeMultiByte("\n\t}\n\n"); } /* if (hasInstance) { output.writeMultiByte("\n\n"); output.writeMultiByte("\t\tpublic override function dispose() : void {\n"); for (int vi = 0 ; vi < _cbs.variableNum; vi++ ) { VariableBinStruct& vbs = _cbs.variableArray[vi]; if (getInlineTypeNeedDispose(vbs)) { if (vbs.inlineClassId != -1 && (vbs.type == VariableBinStruct::TYPE_INSTANCE_UID)) { output.writeMultiByte("\t\t\tif ("); output.writeMultiByte(vbs.variableName); output.writeMultiByte(") "); output.writeMultiByte(vbs.variableName); output.writeMultiByte(".dispose();\n"); } output.writeMultiByte("\t\t\t"); output.writeMultiByte(vbs.variableName); output.writeMultiByte(" = null;\n"); } } output.writeMultiByte("\n\t\t\t"); output.writeMultiByte("super.dispose();"); output.writeMultiByte("\n"); output.writeMultiByte("\n\t\t}\n\n"); } output.writeMultiByte("\t}\n");*/ output.writeMultiByte("};\n#endif\n\0"); char outputfilename[256]; sprintf_s(outputfilename, 256, "%s.hpp" , _cbs.className); output.save(outputfilename); } } ////////////////////////////////////////////////////////////////////////// //system("pause"); } } } else { _tprintf(_T("\a"));//di _tprintf( _T("plz use as ExbnExporter inputFilename (-enum -string) \ne.g. ExbnExporter c:\\a.exbn -enum -string\n")); for (int i = 0 ; i< argc; i++) { _tprintf(_T("\n %d:") , i ); _tprintf(argv[i]); } _tprintf(_T("\n")); system("pause"); } return 0; }