//----------------------------------------------- // getString // //----------------------------------------------- bool CClientChatManager::getString( ucstring &result, std::vector<uint64>& args, const ucstring &ucstrbase ) { result = ucstrbase; bool finalString = true; // deal with parameters uint32 dynParamIdx = 0; bool dynParamSearch = true; char chTmp[1024]; while( dynParamSearch ) { // search if a parameter exists in the string sprintf(chTmp,"$%d",dynParamIdx); ucstring ucstrTmp( chTmp ); ucstring::size_type idx = result.find(ucstrTmp); // if there's a parameter in the string if( idx != ucstring::npos ) { ucstring rep; rep = "???"; if (dynParamIdx >= args.size()) { nlwarning ("Missing args for string '%s', only %d args, need arg %d", ucstrbase.toString().c_str(), args.size(), dynParamIdx); } else { char c = (char)result[idx+ucstrTmp.size()]; switch( c ) { // parameter is an entry in the dynamic database case 'e': { // #ifdef OLD_STRING_SYSTEM // CDynamicStringInfos *res = _DynamicDB.getDynamicStringInfos ((uint32)args[dynParamIdx]); // if (!res->Associated) // #endif finalString = false; // #ifdef OLD_STRING_SYSTEM // rep = res->Str; // #endif } break; // parameter is a string case 's': { nlwarning ("string param not implemented in the vector<uint64> decoding"); } break; // parameter is an unsigned integer case 'u': { uint32 nb = (uint32) args[dynParamIdx]; rep = toString(nb); } break; // parameter is a signed integer case 'i': { sint32 nb = (sint32) args[dynParamIdx]; rep = toString(nb); } break; // parameter is a float case 'f': { float nb = *(float *) &(args[dynParamIdx]); rep = toString(nb); } break; // parameter type is unknown default : { nlwarning("<CClientChatManager::getString> The dynamic type %c is unknown",c); } break; } } result.replace( idx, ucstrTmp.size()+1, rep ); dynParamIdx++; } else { dynParamSearch = false; } }; return finalString; } // getString //
//----------------------------------------------- // getString // //----------------------------------------------- ucstring CClientChatManager::getString( CBitMemStream& bms, ucstring& ucstr ) { // deal with parameters uint32 dynParamIdx = 0; bool dynParamSearch = true; char chTmp[1024]; while( dynParamSearch ) { // search if a parameter exists in the string sprintf(chTmp,"$%d",dynParamIdx); ucstring ucstrTmp( chTmp ); ucstring::size_type idx = ucstr.find(ucstrTmp); // if there's a parameter in the string if( idx != ucstring::npos ) { char c = (char)ucstr[idx+ucstrTmp.size()]; switch( c ) { // parameter is an entry in the dynamic database case 'e': { bool huff; bms.serialBit(huff); const ucstring dynStr("???"); if( huff ) { nldebug("<CClientChatManager::getString> receiving huffman dynamic parameter in static string"); // #ifdef OLD_STRING_SYSTEM // _DynamicDB.decodeString( dynStr, bms ); // #endif } else { //if( (sint32)bms.length()*8 - bms.getPosInBit() >= 32 ) { uint32 nameIndex; bms.serial(nameIndex); // #ifdef OLD_STRING_SYSTEM // dynStr = _DynamicDB.getDynamicStringInfos(nameIndex)->Str; // #endif } } ucstr.replace( idx, ucstrTmp.size()+1, dynStr ); } break; // parameter is a string case 's': { string dynStr; bms.serial( dynStr ); ucstring ucDynStr(dynStr); ucstr.replace( idx, ucstrTmp.size()+1, ucDynStr ); } break; // parameter is an unsigned integer case 'u': { uint32 nb; bms.serial( nb ); ucstr.replace( idx, ucstrTmp.size()+1, ucstring(toString(nb)) ); } break; /* case 'u': { uint i = idx + strTmp.size() + 1; string bitCountStr; while( isdigit(str[i]) ) { bitCountStr += str[i]; i++; } nlassert( !bitCountStr.empty() ); uint32 bitCount; fromString(bitCountStr, bitCount); nlassert( bitCount <= 64 ); uint64 nb; bms.serial( nb, bitCount ); str.replace( idx, strTmp.size() + 1 + bitCountStr.size(), toString(nb) ); } break; */ // parameter is a signed integer case 'i': { sint32 nb; bms.serial( nb ); ucstr.replace( idx, ucstrTmp.size()+1, ucstring(toString(nb)) ); } break; /* case 'i': { uint i = idx + strTmp.size() + 1; string bitCountStr; while( isdigit(str[i]) ) { bitCountStr += str[i]; i++; } nlassert( !bitCountStr.empty() ); uint32 bitCount; fromString(bitCountStr, bitCount); nlassert( bitCount <= 64 ); uint64 nb; bms.serial( nb, bitCount ); str.replace( idx, strTmp.size() + 1 + bitCountStr.size(), toString(nb) ); } break; */ // parameter is a float case 'f': { float nb; bms.serial( nb ); ucstr.replace( idx, ucstrTmp.size()+1, ucstring(toString(nb)) ); } break; // parameter type is unknown default : { nlwarning("<CClientChatManager::getString> The dynamic type %c is unknown",c); } } dynParamIdx++; } else { dynParamSearch = false; } }; return ucstr; } // getString //