void FSFloaterObjectExport::onIdle() { switch(mExportState) { case IDLE: break; case INVENTORY_DOWNLOAD: if (gDisconnected) { return; } if (mInventoryRequests.empty()) { mLastRequest = mAssetRequests.size(); mWaitTimer.start(); mExportState = ASSET_DOWNLOAD; } else if (mLastRequest != mInventoryRequests.size()) { mWaitTimer.start(); mLastRequest = mInventoryRequests.size(); updateTitleProgress(INVENTORY_DOWNLOAD); } else if (mWaitTimer.getElapsedTimeF32() > MAX_INVENTORY_WAIT_TIME) { mWaitTimer.start(); for (uuid_vec_t::const_iterator iter = mInventoryRequests.begin(); iter != mInventoryRequests.end(); ++iter) { LLViewerObject* object = gObjectList.findObject((*iter)); object->dirtyInventory(); object->requestInventory(); LL_DEBUGS("export") << "re-requested inventory of " << (*iter).asString() << LL_ENDL; } } break; case ASSET_DOWNLOAD: if (gDisconnected) { return; } if (mAssetRequests.empty()) { mLastRequest = mRequestedTexture.size(); mWaitTimer.start(); mExportState = TEXTURE_DOWNLOAD; } else if (mLastRequest != mAssetRequests.size()) { mWaitTimer.start(); mLastRequest = mAssetRequests.size(); updateTitleProgress(ASSET_DOWNLOAD); } else if (mWaitTimer.getElapsedTimeF32() > MAX_ASSET_WAIT_TIME) { //abort for now LL_DEBUGS("export") << "Asset timeout with " << (S32)mAssetRequests.size() << " requests left." << LL_ENDL; for (uuid_vec_t::iterator iter = mAssetRequests.begin(); iter != mAssetRequests.end(); ++iter) { LL_DEBUGS("export") << "Asset: " << (*iter).asString() << LL_ENDL; } mAssetRequests.clear(); } break; case TEXTURE_DOWNLOAD: if (gDisconnected) { return; } if(mRequestedTexture.empty()) { mExportState = IDLE; if (!gIdleCallbacks.deleteFunction(onIdle, this)) { LL_WARNS("export") << "Failed to delete idle callback" << LL_ENDL; } mWaitTimer.stop(); llofstream file; file.open(mFilename.c_str(), std::ios_base::out | std::ios_base::binary); std::string zip_data = zip_llsd(mManifest); file.write(zip_data.data(), zip_data.size()); file.close(); LL_DEBUGS("export") << "Export finished and written to " << mFilename << LL_ENDL; LLSD args; args["FILENAME"] = mFilename; LLNotificationsUtil::add("ExportFinished", args); closeFloater(); } else if (mLastRequest != mRequestedTexture.size()) { mWaitTimer.start(); mLastRequest = mRequestedTexture.size(); updateTitleProgress(TEXTURE_DOWNLOAD); } else if (mWaitTimer.getElapsedTimeF32() > MAX_TEXTURE_WAIT_TIME) { mWaitTimer.start(); for (std::map<LLUUID, FSAssetResourceData>::iterator iter = mRequestedTexture.begin(); iter != mRequestedTexture.end(); ++iter) { LLUUID texture_id = iter->first; LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(texture_id, FTT_DEFAULT, MIPMAP_TRUE); image->setBoostLevel(LLViewerTexture::BOOST_MAX_LEVEL); image->forceToSaveRawImage(0); image->setLoadedCallback(FSFloaterObjectExport::onImageLoaded, 0, TRUE, FALSE, this, &mCallbackTextureList); LL_DEBUGS("export") << "re-requested texture " << texture_id.asString() << LL_ENDL; } } break; default: break; } }
bool FSFloaterObjectExport::exportTexture(const LLUUID& texture_id) { if(texture_id.isNull()) { LL_WARNS("export") << "Attempted to export NULL texture." << LL_ENDL; return false; } if (mTextureChecked.count(texture_id) != 0) { return mTextureChecked[texture_id]; } if (gAssetStorage->mStaticVFS->getExists(texture_id, LLAssetType::AT_TEXTURE)) { LL_DEBUGS("export") << "Texture " << texture_id.asString() << " is local static." << LL_ENDL; // no need to save the texture data as the viewer already has it in a local file. mTextureChecked[texture_id] = true; return true; } //TODO: check for local file static texture. The above will only get the static texture in the static db, not individual textures. LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(texture_id); bool texture_export = false; std::string name; std::string description; if (LLGridManager::getInstance()->isInSecondLife()) { if (imagep->mComment.find("a") != imagep->mComment.end()) { if (LLUUID(imagep->mComment["a"]) == gAgentID) { texture_export = true; LL_DEBUGS("export") << texture_id << " pass texture export comment check." << LL_ENDL; } } } if (texture_export) { FSExportPermsCheck::canExportAsset(texture_id, &name, &description); } else { texture_export = FSExportPermsCheck::canExportAsset(texture_id, &name, &description); } mTextureChecked[texture_id] = texture_export; if (!texture_export) { LL_DEBUGS("export") << "Texture " << texture_id << " failed export check." << LL_ENDL; return false; } LL_DEBUGS("export") << "Loading image texture " << texture_id << LL_ENDL; mRequestedTexture[texture_id].name = name; mRequestedTexture[texture_id].description = description; LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(texture_id, FTT_DEFAULT, MIPMAP_TRUE); image->setBoostLevel(LLViewerTexture::BOOST_MAX_LEVEL); image->forceToSaveRawImage(0); image->setLoadedCallback(FSFloaterObjectExport::onImageLoaded, 0, TRUE, FALSE, this, &mCallbackTextureList); return true; }