// 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; }
// static void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID& uuid, void* userdata, S32 status, LLExtStat ext_status ) { BOOL isNewWearable = FALSE; LLWearableArrivedData* data = (LLWearableArrivedData*) userdata; // LLViewerWearable* wearable = NULL; // NULL indicates failure // [SL:KB] - Patch: Appearance-Misc | Checked: 2010-08-13 (Catznip-2.1) LLViewerWearable* wearable = get_if_there(LLWearableList::instance().mList, uuid, (LLViewerWearable*)NULL); if (wearable) { LL_DEBUGS("Wearable") << "processGetAssetReply()" << LL_ENDL; LL_DEBUGS("Wearable") << wearable << LL_ENDL; if(data->mCallback) { data->mCallback(wearable, data->mUserdata); } delete data; return; } // [/SL:KB] LLAvatarAppearance *avatarp = data->mAvatarp; if( !filename ) { LL_WARNS("Wearable") << "Bad Wearable Asset: missing file." << LL_ENDL; } else if(!avatarp) { LL_WARNS("Wearable") << "Bad asset request: missing avatar pointer." << LL_ENDL; } else if (status >= 0) { // read the file llifstream ifs(filename, llifstream::binary); if( !ifs.is_open() ) { LL_WARNS("Wearable") << "Bad Wearable Asset: unable to open file: '" << filename << "'" << LL_ENDL; } else { wearable = new LLViewerWearable(uuid); LLWearable::EImportResult result = wearable->importStream( ifs, avatarp ); if (LLWearable::SUCCESS != result) { if (wearable->getType() == LLWearableType::WT_COUNT) { isNewWearable = TRUE; } delete wearable; wearable = NULL; } if(filename) { if (ifs.is_open()) { ifs.close(); } 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; args["TYPE"] =LLTrans::getString(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; }