void LLMessageTemplateParserTestObject::test<4>() // tests variable parsing method { LLTemplateTokenizer tokens(std::string("{ Test0 \n\t\n U32 \n\n }")); LLMessageVariable * var = LLTemplateParser::parseVariable(tokens); ensure("test0 var parsed", var != 0); ensure_equals("name of variable", std::string(var->getName()), std::string("Test0")); ensure_equals("type of variable is U32", var->getType(), MVT_U32); ensure_equals("size of variable", var->getSize(), 4); delete var; std::string message_string("\n\t{ \t Test1 Fixed \n 523 }\n\n"); tokens = LLTemplateTokenizer(message_string); var = LLTemplateParser::parseVariable(tokens); ensure("test1 var parsed", var != 0); ensure_equals("name of variable", std::string(var->getName()), std::string("Test1")); ensure_equals("type of variable is Fixed", var->getType(), MVT_FIXED); ensure_equals("size of variable", var->getSize(), 523); delete var; // *NOTE: the parsers call llerrs on invalid input, so we can't really // test that :-( }
// static void LLFloaterMessageBuilder::onCommitPacketCombo(LLUICtrl* ctrl, void* user_data) { LLFloaterMessageBuilder* floaterp = (LLFloaterMessageBuilder*)user_data; LLViewerObject* selected_objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); LLParcel* agent_parcelp = LLViewerParcelMgr::getInstance()->getAgentParcel(); std::string message = ctrl->getValue(); std::map<const char *, LLMessageTemplate*>::iterator template_iter; template_iter = gMessageSystem->mMessageTemplates.find( LLMessageStringTable::getInstance()->getString(message.c_str()) ); if(template_iter == gMessageSystem->mMessageTemplates.end()) { floaterp->childSetText("message_edit", std::string("")); return; } std::string text(llformat((*template_iter).second->getTrust() == MT_NOTRUST ? "out %s\n" : "in %s\n", message.c_str())); LLMessageTemplate* temp = (*template_iter).second; LLMessageTemplate::message_block_map_t::iterator blocks_end = temp->mMemberBlocks.end(); for (LLMessageTemplate::message_block_map_t::iterator blocks_iter = temp->mMemberBlocks.begin(); blocks_iter != blocks_end; ++blocks_iter) { LLMessageBlock* block = (*blocks_iter); const char* block_name = block->mName; std::string block_name_string = std::string(block_name); S32 num_blocks = 1; if(block->mType == MBT_MULTIPLE) num_blocks = block->mNumber; else if(("ObjectLink" == message && "ObjectData" == block_name_string)) num_blocks = 2; for(S32 i = 0; i < num_blocks; i++) { text.append(llformat("[%s]\n", block_name)); LLMessageBlock::message_variable_map_t::iterator var_end = block->mMemberVariables.end(); for (LLMessageBlock::message_variable_map_t::iterator var_iter = block->mMemberVariables.begin(); var_iter != var_end; ++var_iter) { LLMessageVariable* variable = (*var_iter); const char* var_name = variable->getName(); std::string var_name_string = std::string(var_name); text.append(llformat("%s = ", var_name)); std::string value(""); S32 size = variable->getSize(); switch(variable->getType()) { case MVT_U8: case MVT_U16: case MVT_U32: case MVT_U64: case MVT_S8: case MVT_S16: case MVT_S32: case MVT_IP_ADDR: case MVT_IP_PORT: if("RegionHandle" == var_name_string || "Handle" == var_name_string) value = "$RegionHandle"; else if("CircuitCode" == var_name_string || "ViewerCircuitCode" == var_name_string || ("Code" == var_name_string && "CircuitCode" == block_name_string) ) { value = "$CircuitCode"; } else if(selected_objectp && ( "ObjectLocalID" == var_name_string || "TaskLocalID" == var_name_string || ("LocalID" == var_name_string && ( "ObjectData" == block_name_string || "UpdateData" == block_name_string || "InventoryData" == block_name_string ) ) ) ) { std::stringstream temp_stream; temp_stream << selected_objectp->getLocalID(); value = temp_stream.str(); } else if( agent_parcelp && "LocalID" == var_name_string && ( "ParcelData" == block_name_string || message.find("Parcel") != message.npos ) ) { std::stringstream temp_stream; temp_stream << agent_parcelp->getLocalID(); value = temp_stream.str(); } else if("PCode" == var_name_string) value = "9"; else if("PathCurve" == var_name_string) value = "16"; else if("ProfileCurve" == var_name_string) value = "1"; else if("PathScaleX" == var_name_string || "PathScaleY" == var_name_string) value = "100"; else if("BypassRaycast" == var_name_string) value = "1"; else value = "0"; break; case MVT_F32: case MVT_F64: value = "0.0"; break; case MVT_LLVector3: case MVT_LLVector3d: case MVT_LLQuaternion: if("Position" == var_name_string || "RayStart" == var_name_string || "RayEnd" == var_name_string) value = "$Position"; else if("Scale" == var_name_string) value = "<0.5, 0.5, 0.5>"; else value = "<0, 0, 0>"; break; case MVT_LLVector4: value = "<0, 0, 0, 0>"; break; case MVT_LLUUID: if("AgentID" == var_name_string) value = "$AgentID"; else if("SessionID" == var_name_string) value = "$SessionID"; else if("ObjectID" == var_name_string && selected_objectp) value = selected_objectp->getID().asString(); else if("ParcelID" == var_name_string && agent_parcelp) value = agent_parcelp->getID().asString(); else value = "00000000-0000-0000-0000-000000000000"; break; case MVT_BOOL: value = "false"; break; case MVT_VARIABLE: value = "Hello, world!"; break; case MVT_FIXED: for(S32 si = 0; si < size; si++) value.append("a"); break; default: value = ""; break; } text.append(llformat("%s\n", value.c_str())); } } } text = text.substr(0, text.length() - 1); floaterp->childSetText("message_edit", text); }