// static void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID& uuid, void* userdata, S32 status, LLExtStat ext_status ) { BOOL isNewWearable = FALSE; LLWearableArrivedData* data = (LLWearableArrivedData*) userdata; LLWearable* wearable = NULL; // NULL indicates failure if( !filename ) { LL_WARNS("Wearable") << "Bad Wearable Asset: missing file." << LL_ENDL; } else if (status >= 0) { // read the file LLFILE* fp = LLFile::fopen(std::string(filename), "rb"); /*Flawfinder: ignore*/ if( !fp ) { LL_WARNS("Wearable") << "Bad Wearable Asset: unable to open file: '" << filename << "'" << LL_ENDL; } else { wearable = new LLWearable(uuid); bool res = wearable->importFile( fp ); if (!res) { if (wearable->getType() == LLWearableType::WT_COUNT) { isNewWearable = TRUE; } delete wearable; wearable = NULL; } fclose( fp ); if(filename) { LLFile::remove(std::string(filename)); } } } else { if(filename) { LLFile::remove(std::string(filename)); } LLViewerStats::getInstance()->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); LL_WARNS("Wearable") << "Wearable download failed: " << LLAssetStorage::getErrorString( status ) << " " << uuid << LL_ENDL; switch( status ) { case LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE: { // Fail break; } default: { static const S32 MAX_RETRIES = 3; if (data->mRetries < MAX_RETRIES) { // Try again data->mRetries++; gAssetStorage->getAssetData(uuid, data->mAssetType, LLWearableList::processGetAssetReply, userdata); // re-use instead of deleting. return; } else { // Fail break; } } } } if (wearable) // success { LLWearableList::instance().mList[ uuid ] = wearable; LL_DEBUGS("Wearable") << "processGetAssetReply()" << LL_ENDL; LL_DEBUGS("Wearable") << wearable << LL_ENDL; } else { LLSD args; // *TODO:translate args["TYPE"] = LLAssetType::lookupHumanReadable(data->mAssetType); if (isNewWearable) { LLNotificationsUtil::add("InvalidWearable"); } else if (data->mName.empty()) { LLNotificationsUtil::add("FailedToFindWearableUnnamed", args); } else { args["DESC"] = data->mName; LLNotificationsUtil::add("FailedToFindWearable", args); } } // Always call callback; wearable will be NULL if we failed { if( data->mCallback ) { data->mCallback( wearable, data->mUserdata ); } } delete data; }
void ImportTracker::send_inventory(LLSD& prim) { U32 local_id = prim["LocalID"].asInteger(); if (prim.has("inventory")) { std::string assetpre = asset_dir + gDirUtilp->getDirDelimiter(); LLSD inventory = prim["inventory"]; for (LLSD::array_iterator inv = inventory.beginArray(); inv != inventory.endArray(); ++inv) { LLSD item = (*inv); InventoryImportInfo* data = new InventoryImportInfo; data->localid = local_id; LLTransactionID tid; tid.generate(); LLUUID assetid = tid.makeAssetID(gAgent.getSecureSessionID()); data->tid = tid; data->assetid = assetid; data->type = LLAssetType::lookup(item["type"].asString());////LLAssetType::EType(U32(item["type"].asInteger())); data->name = item["name"].asString(); data->description = item["desc"].asString(); if(item.has("item_id")) { //cmdline_printchat("item id found"); std::string filename = assetpre + item["item_id"].asString() + "." + item["type"].asString(); //S32 file_size; //LLAPRFile infile ; //infile.open(filename, LL_APR_RB, NULL, &file_size); //apr_file_t* fp = infile.getFileHandle(); //if(fp) if(LLFile::isfile(filename)) { //cmdline_printchat("file "+filename+" exists"); data->filename = filename; //infile.close(); }else { //cmdline_printchat("file "+filename+" does not exist"); delete data; continue; } }else { //cmdline_printchat("item id not found"); delete data; continue; } data->wear_type = NOT_WEARABLE; //if(data->type == LLAssetType::AT_LSL_TEXT) { data->inv_type = LLInventoryType::defaultForAssetType(data->type); //printchat("is script"); data->compiled = false; // switch(data->type) { case LLAssetType::AT_TEXTURE: case LLAssetType::AT_TEXTURE_TGA: //cmdline_printchat("case textures"); { std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); S32 file_size; LLAPRFile infile ; infile.open(data->filename, LL_APR_RB, NULL, &file_size); if (infile.getFileHandle()) { //cmdline_printchat("got file handle"); LLVFile file(gVFS, data->assetid, data->type, LLVFile::WRITE); file.setMaxSize(file_size); const S32 buf_size = 65536; U8 copy_buf[buf_size]; while ((file_size = infile.read(copy_buf, buf_size))) { file.write(copy_buf, file_size); } LLSD body; body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); body["asset_type"] = LLAssetType::lookup(data->type); body["inventory_type"] = LLInventoryType::lookup(data->inv_type); body["name"] = data->name; body["description"] = data->description; body["next_owner_mask"] = LLSD::Integer(U32_MAX); body["group_mask"] = LLSD::Integer(U32_MAX); body["everyone_mask"] = LLSD::Integer(U32_MAX); body["expected_upload_cost"] = LLSD::Integer(LLGlobalEconomy::Singleton::getInstance()->getPriceUpload()); //cmdline_printchat("posting "+ data->assetid.asString()); LLHTTPClient::post(url, body, new JCImportInventoryResponder(body, data->assetid, data->type,data)); //error = TRUE; } } break; case LLAssetType::AT_CLOTHING: case LLAssetType::AT_BODYPART: //cmdline_printchat("case cloth/bodypart"); { S32 file_size; LLAPRFile infile ; infile.open(data->filename, LL_APR_RB, NULL, &file_size); if (infile.getFileHandle()) { //cmdline_printchat("got file handle @ cloth"); LLVFile file(gVFS, data->assetid, data->type, LLVFile::WRITE); file.setMaxSize(file_size); const S32 buf_size = 65536; U8 copy_buf[buf_size]; while ((file_size = infile.read(copy_buf, buf_size))) { file.write(copy_buf, file_size); } LLFILE* fp = LLFile::fopen(data->filename, "rb"); if(fp)//HACK LOL LOL LOL { LLWearable* wearable = new LLWearable(LLUUID::null); wearable->importFile( fp ); //if (!res) { data->wear_type = wearable->getType(); } delete wearable; } //cmdline_printchat("storing "+data->assetid.asString()); gAssetStorage->storeAssetData(data->tid, data->type, JCImportInventorycallback, (void*)data, FALSE, TRUE, FALSE); } } break; case LLAssetType::AT_NOTECARD: //cmdline_printchat("case notecard"); { //std::string agent_url = gAgent.getRegion()->getCapability("UpdateNotecardAgentInventory"); LLPointer<LLInventoryCallback> cb = new JCPostInvCallback(data); LLPermissions perm; LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); create_inventory_item(gAgent.getID(), gAgent.getSessionID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH), data->tid, data->name, data->description, data->type, LLInventoryType::defaultForAssetType(data->type), data->wear_type, LLFloaterPerms::getNextOwnerPerms(), cb); } break; case LLAssetType::AT_LSL_TEXT: { LLPointer<LLInventoryCallback> cb = new JCPostInvCallback(data); LLPermissions perm; LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); create_inventory_item(gAgent.getID(), gAgent.getSessionID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH), data->tid, data->name, data->description, data->type, LLInventoryType::defaultForAssetType(data->type), data->wear_type, LLFloaterPerms::getNextOwnerPerms(), cb); } break; case LLAssetType::AT_SCRIPT://this shouldn't happen as this is legacy shit case LLAssetType::AT_GESTURE://we don't import you atm... default: break; } asset_insertions += 1; } } } }