void LLXmlImport::onUpdatePrim(LLViewerObject* object) { if(object != NULL) if( !(LLXmlImport::sImportInProgress && LLXmlImport::sExpectedUpdate == object->getID())) return; LLImportObject* from = sPrims[sPrimIndex]; // Volume params LLVolumeParams params = from->getVolume()->getParams(); object->setVolume(params, 0, false); object->sendShapeUpdate(); // Extra params if(from->isFlexible()) { LLFlexibleObjectData flex = *((LLFlexibleObjectData*)from->getParameterEntry(LLNetworkData::PARAMS_FLEXIBLE)); object->setParameterEntry(LLNetworkData::PARAMS_FLEXIBLE, flex, true); object->setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, TRUE, true); object->parameterChanged(LLNetworkData::PARAMS_FLEXIBLE, true); } else { // send param not in use in case the supply prim has it object->setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, FALSE, true); object->parameterChanged(LLNetworkData::PARAMS_FLEXIBLE, true); } if (from->getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT)) { LLLightParams light = *((LLLightParams*)from->getParameterEntry(LLNetworkData::PARAMS_LIGHT)); object->setParameterEntry(LLNetworkData::PARAMS_LIGHT, light, true); object->setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT, TRUE, true); object->parameterChanged(LLNetworkData::PARAMS_LIGHT, true); } else { // send param not in use in case the supply prim has it object->setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT, FALSE, true); object->parameterChanged(LLNetworkData::PARAMS_LIGHT, true); } if (from->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT)) { LLSculptParams sculpt = *((LLSculptParams*)from->getParameterEntry(LLNetworkData::PARAMS_SCULPT)); if(sXmlImportOptions->mReplaceTexture && sTextureReplace.find(sculpt.getSculptTexture()) != sTextureReplace.end()) sculpt.setSculptTexture(sTextureReplace[sculpt.getSculptTexture()]); object->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt, true); object->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, TRUE, true); object->parameterChanged(LLNetworkData::PARAMS_SCULPT, true); } else { // send param not in use in case the supply prim has it object->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, FALSE, true); object->parameterChanged(LLNetworkData::PARAMS_SCULPT, true); } // Textures U8 te_count = from->getNumTEs(); for (U8 i = 0; i < te_count; i++) { const LLTextureEntry* wat = from->getTE(i); LLTextureEntry te = *wat; if(sXmlImportOptions->mReplaceTexture && sTextureReplace.find(te.getID()) != sTextureReplace.end()) te.setID(sTextureReplace[te.getID()]); object->setTE(i, te); } object->sendTEUpdate(); // Name std::string name = from->mPrimName; if(name.empty()) name = "Object"; //set to Object just incase the import prim isnt Object. gMessageSystem->newMessageFast(_PREHASH_ObjectName); gMessageSystem->nextBlockFast(_PREHASH_AgentData); gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); gMessageSystem->nextBlockFast(_PREHASH_ObjectData); gMessageSystem->addU32Fast(_PREHASH_LocalID, object->getLocalID()); gMessageSystem->addStringFast(_PREHASH_Name, name); gAgent.sendReliableMessage(); //Description std::string desc = from->mPrimDescription; if(from->importIsAttachment) //special description tracker { desc = from->mId; } else { if(desc.empty()) desc = "(No Description)"; } send_desc(object->getLocalID(), desc); sExpectedUpdate = LLUUID::null; sPrimIndex++; /////// finished block ///////// if(sPrimIndex >= (int)sPrims.size()) { // TODO: Remove LLSelectMgr dependencies // Link time for(std::map<U32, std::vector<LLViewerObject*> >::iterator itr = sLinkSets.begin();itr != sLinkSets.end();++itr) { std::vector<LLViewerObject*> linkset = (*itr).second; LLSelectMgr::getInstance()->deselectAll(); LLSelectMgr::getInstance()->selectObjectAndFamily(linkset, true); // LLSelectMgr::getInstance()->sendLink(); } if(sId2attachpt.size() == 0) { sImportInProgress = false; std::string msg = "Imported " + sXmlImportOptions->mName; LLChat chat(msg); LLFloaterChat::addChat(chat); LLFloaterImportProgress::update(); } else { // Take attachables into inventory sAttachmentsDone = 0; if(sLinkSets.size() > 0) { U32 ip = gAgent.getRegionHost().getAddress(); U32 port = gAgent.getRegionHost().getPort(); std::vector<LLUUID> roots; roots.resize(sLinkSets.size()); for(std::map<U32, std::vector<LLViewerObject*> >::iterator itr = sLinkSets.begin();itr != sLinkSets.end();++itr) { LLUUID id = LLUUID::null; LLViewerObjectList::getUUIDFromLocal(id,itr->first,ip,port); if(id.notNull()) { roots.push_back(id); } } } finish_link(); } } else { LLFloaterImportProgress::update(); rez_supply(); } }
// for testing and debugging only VALUE Wikitext_parser_tokenize(VALUE self, VALUE string, VALUE file1, VALUE file2, VALUE doc_id_v) { if (NIL_P(string)) return Qnil; int doc_id = FIX2INT(doc_id_v); rb_io_t * file_p_struct; Check_Type(file1,T_FILE); rb_io_binmode(file1); GetOpenFile(file1,file_p_struct); rb_io_check_writable(file_p_struct); FILE * file_p1 = rb_io_stdio_file(file_p_struct); Check_Type(file2,T_FILE); rb_io_binmode(file2); GetOpenFile(file2,file_p_struct); rb_io_check_writable(file_p_struct); FILE * file_p2 = rb_io_stdio_file(file_p_struct); string = StringValue(string); VALUE tokens = rb_ary_new(); char *p = RSTRING_PTR(string); long len = RSTRING_LEN(string); char *pe = p + len; const char *type = NULL; int state = DEFAULT; int ts[1000]; int ss[1000]; int ts_size = 1 ; int ss_size = 1 ; ss[0] = 0; ts[0] = 0; token_t token; token_t stack1[1000]; //tail, TODO add checks token_t stack2[1000]; //head, TODO add checks int s1_size = 0; int s2_size = 0; int start = 1; do { //printf("%i %i\n",s1_size,s2_size); if(start) { next_token(&token, NULL, p, pe, ts, ss, &ts_size, &ss_size, file_p1, doc_id); start = 0; } else { next_token(&token, &token, NULL, pe, ts, ss, &ts_size, &ss_size, file_p1, doc_id); } //rb_funcall(rb_mKernel, rb_intern("puts"), 1, wiki_token(&token)); if(token.type == END_OF_FILE){ if(state == POST_LINK) { finish_link1(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id); } break; } switch(token.type) { case SEPARATOR : memcpy(stack2,stack1,sizeof(token_t)*s1_size); s2_size = s1_size; s1_size = 0; state = SEPARATOR; break; case LINK_START : state = LINK; break; case LINK_END : if(state != SEPARATOR) { memcpy(stack2,stack1,sizeof(token_t)*s1_size); s2_size = s1_size; } state = POST_LINK; break; case EXT_LINK_START : state = EXT_LINK; break; case EXT_LINK_END : // TODO print what should be printed s1_size = 0; s2_size = 0; break; case ALNUM : if(state == POST_LINK){ finish_link(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id,&token); state = DEFAULT; } else { if(s1_size < 1000) memcpy(&(stack1[s1_size++]),&token,sizeof(token_t)); else printf("[%i]Token stack overflow\n",doc_id); } break; case SPACE : type = space_type; case PRINTABLE : case DEFAULT : if(type == NULL) type = printable_type; case NUM : if(type == NULL) type = num_type; if(state == POST_LINK) { finish_link1(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id); wikitext_print_token(&token,file_p1,doc_id,type); state = DEFAULT; } else { if(s1_size < 1000) memcpy(&(stack1[s1_size++]),&token,sizeof(token_t)); else printf("[%i]Token stack overflow\n",doc_id); } break; case CRLF : if(state == POST_LINK){ finish_link1(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id); wikitext_print_crlf(&token,file_p1,doc_id); state = DEFAULT; } else { if(s1_size < 1000) memcpy(&(stack1[s1_size++]),&token,sizeof(token_t)); else printf("[%i]Token stack overflow\n",doc_id); } break; case SKIP : if(state == POST_LINK){ finish_link1(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id); state = DEFAULT; } break; } type = NULL; } while(1); return tokens; }