diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp index 7df2a8140..99f338742 100644 --- a/indra/llvfs/llvfs.cpp +++ b/indra/llvfs/llvfs.cpp @@ -2062,6 +2062,16 @@ void LLVFS::listFiles() unlockData(); } +std::map LLVFS::getFileList() +{ + //have to do this so as not to mess with the gods of threading + lockData(); + fileblock_map mFileList = mFileBlocks; + unlockData(); + + return mFileList; +} + #include "llapr.h" void LLVFS::dumpFiles() { diff --git a/indra/llvfs/llvfs.h b/indra/llvfs/llvfs.h index a68c8f4ef..df2d42d9b 100644 --- a/indra/llvfs/llvfs.h +++ b/indra/llvfs/llvfs.h @@ -143,10 +143,14 @@ protected: void lockData() { mDataMutex->lock(); } void unlockData() { mDataMutex->unlock(); } -protected: LLMutex* mDataMutex; - + +// +public: typedef std::map fileblock_map; + std::map getFileList(); +// +protected: fileblock_map mFileBlocks; typedef std::multimap blocks_length_map_t; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e7a0642f0..5424b50a9 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -215,6 +215,7 @@ set(viewer_SOURCE_FILES llfloaterurldisplay.cpp llfloaterurlentry.cpp llfloatervfs.cpp + llfloatervfsexplorer.cpp llfloatervoicedevicesettings.cpp llfloaterwater.cpp llfloaterwindlight.cpp @@ -653,6 +654,7 @@ set(viewer_HEADER_FILES llfloaterurldisplay.h llfloaterurlentry.h llfloatervfs.h + llfloatervfsexplorer.h llfloatervoicedevicesettings.h llfloaterwater.h llfloaterwindlight.h diff --git a/indra/newview/llfloatervfs.cpp b/indra/newview/llfloatervfs.cpp index b7e75e89c..4360cf3b1 100644 --- a/indra/newview/llfloatervfs.cpp +++ b/indra/newview/llfloatervfs.cpp @@ -3,6 +3,7 @@ #include "llfloatervfs.h" #include "lluictrlfactory.h" #include "llscrolllistctrl.h" +#include "llcheckboxctrl.h" #include "llfilepicker.h" #include "lllocalinventory.h" #include "llviewerwindow.h" @@ -94,6 +95,8 @@ void LLFloaterVFS::reloadAll() } void LLFloaterVFS::reloadEntry(entry file) { + LLUUID asset_id = file.mID; + LLAssetType::EType asset_type = file.mType; gVFS->removeFile(file.mID, file.mType); std::string file_name = file.mFilename; S32 file_size; @@ -101,7 +104,7 @@ void LLFloaterVFS::reloadEntry(entry file) fp.open(file_name, LL_APR_RB, LLAPRFile::global, &file_size); if(fp.getFileHandle()) { - LLVFile file(gVFS, file.mFileID, file.mFileType, LLVFile::WRITE); + LLVFile file(gVFS, asset_id, asset_type, LLVFile::WRITE); file.setMaxSize(file_size); const S32 buf_size = 65536; U8 copy_buf[buf_size]; @@ -188,6 +191,7 @@ void LLFloaterVFS::commitEdit() gVFS->renameFile(file.mID, file.mType, edited_file.mID, edited_file.mType); mEditID = edited_file.mID; } + (*iter) = edited_file; refresh(); } @@ -207,7 +211,7 @@ void LLFloaterVFS::removeEntry() void LLFloaterVFS::setMassEnabled(bool enabled) { childSetEnabled("clear_btn", enabled); - childSetEnabled("reload_all_btn", false); // DOESN'T WORK + childSetEnabled("reload_all_btn", enabled); // SHOULD WORK NOW! } void LLFloaterVFS::setEditEnabled(bool enabled) { @@ -216,7 +220,7 @@ void LLFloaterVFS::setEditEnabled(bool enabled) childSetEnabled("type_combo", false); // DOESN'T WORK childSetEnabled("copy_uuid_btn", enabled); childSetEnabled("item_btn", enabled); - childSetEnabled("reload_btn", false); // DOESN'T WORK + childSetEnabled("reload_btn", enabled); // WORKS! childSetEnabled("remove_btn", enabled); } // static @@ -270,6 +274,10 @@ void LLFloaterVFS::onClickAdd(void* user_data) file.mType = asset_type; file.mName = gDirUtilp->getBaseFileName(file_name, true); floaterp->add(file); + if(floaterp->getChild("create_pretend_item")->get()) + { + LLLocalInventory::addItem(file.mName, (int)file.mType, file.mID, true); + } } } // static diff --git a/indra/newview/llfloatervfsexplorer.cpp b/indra/newview/llfloatervfsexplorer.cpp new file mode 100644 index 000000000..395d7c280 --- /dev/null +++ b/indra/newview/llfloatervfsexplorer.cpp @@ -0,0 +1,172 @@ +// +#include "llviewerprecompiledheaders.h" +#include "llfloatervfsexplorer.h" +#include "lluictrlfactory.h" +#include "llscrolllistctrl.h" +#include "llcheckboxctrl.h" +#include "llfilepicker.h" +#include "llvfs.h" +#include "lllocalinventory.h" +#include "llviewerwindow.h" +#include "llassetconverter.h" + +LLFloaterVFSExplorer* LLFloaterVFSExplorer::sInstance; +std::map LLFloaterVFSExplorer::sVFSFileMap; + +LLFloaterVFSExplorer::LLFloaterVFSExplorer() +: LLFloater(), + mEditID(LLUUID::null) +{ + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_vfs_explorer.xml"); +} +LLFloaterVFSExplorer::~LLFloaterVFSExplorer() +{ + sInstance = NULL; +} +// static +void LLFloaterVFSExplorer::show() +{ + if(sInstance) + sInstance->open(); + else + { + sInstance = new LLFloaterVFSExplorer(); + sInstance->open(); + } +} +BOOL LLFloaterVFSExplorer::postBuild() +{ + childSetCommitCallback("file_list", onCommitFileList, this); + childSetAction("remove_btn", onClickRemove, this); + childSetAction("reload_all_btn", onClickReload, this); + childSetAction("copy_uuid_btn", onClickCopyUUID, this); + refresh(); + return TRUE; +} +void LLFloaterVFSExplorer::refresh() +{ + LLScrollListCtrl* list = getChild("file_list"); + list->clearRows(); + sVFSFileMap = gVFS->getFileList(); + std::map::iterator end = sVFSFileMap.end(); + for(std::map::iterator iter = sVFSFileMap.begin(); iter != end; ++iter) + { + LLVFSFileSpecifier file_spec = iter->first; + LLSD element; + element["id"] = file_spec.mFileID; + LLSD& name_column = element["columns"][0]; + name_column["column"] = "name"; + name_column["value"] = file_spec.mFileID.asString(); + LLSD& type_column = element["columns"][1]; + type_column["column"] = "type"; + type_column["value"] = std::string(LLAssetType::lookup(file_spec.mFileType)); + list->addElement(element, ADD_BOTTOM); + } + setEditID(mEditID); +} +void LLFloaterVFSExplorer::reloadAll() +{ + //get our magic from gvfs here + refresh(); +} +void LLFloaterVFSExplorer::setEditID(LLUUID edit_id) +{ + LLScrollListCtrl* list = getChild("file_list"); + bool found_in_list = (list->getItemIndex(edit_id) != -1); + bool found_in_files = false; + LLVFSFileSpecifier file; + std::map::iterator end = sVFSFileMap.end(); + for(std::map::iterator iter = sVFSFileMap.begin(); iter != end; ++iter) + { + if((*iter).first.mFileID == edit_id) + { + found_in_files = true; + file = (*iter).first; + break; + } + } + if(found_in_files && found_in_list) + { + mEditID = edit_id; + list->selectByID(edit_id); + setEditEnabled(true); + childSetText("name_edit", file.mFileID.asString()); + childSetText("id_edit", file.mFileID.asString()); + childSetValue("type_combo", std::string(LLAssetType::lookup(file.mFileType))); + } + else + { + mEditID = LLUUID::null; + list->deselectAllItems(TRUE); + setEditEnabled(false); + childSetText("name_edit", std::string("")); + childSetText("id_edit", std::string("")); + childSetValue("type_combo", std::string("animatn")); + } +} +LLVFSFileSpecifier LLFloaterVFSExplorer::getEditEntry() +{ + LLVFSFileSpecifier file; + std::map::iterator end = sVFSFileMap.end(); + for(std::map::iterator iter = sVFSFileMap.begin(); iter != end; ++iter) + { + if((*iter).first.mFileID == mEditID) + return (*iter).first; + } + file.mFileID = LLUUID::null; + return file; +} + +void LLFloaterVFSExplorer::removeEntry() +{ + std::map::iterator end = sVFSFileMap.end(); + for(std::map::iterator iter = sVFSFileMap.begin(); iter != end; ++iter) + { + if((*iter).first.mFileID == mEditID) + { + gVFS->removeFile((*iter).first.mFileID, (*iter).first.mFileType); + sVFSFileMap.erase(iter); + break; + } + else ++iter; + } + refresh(); +} +void LLFloaterVFSExplorer::setEditEnabled(bool enabled) +{ + childSetEnabled("name_edit", false); + childSetEnabled("id_edit", false); + childSetEnabled("type_combo", false); + childSetEnabled("remove_btn", enabled); + childSetEnabled("copy_uuid_btn", enabled); +} +// static +void LLFloaterVFSExplorer::onCommitFileList(LLUICtrl* ctrl, void* user_data) +{ + LLFloaterVFSExplorer* floaterp = (LLFloaterVFSExplorer*)user_data; + LLScrollListCtrl* list = floaterp->getChild("file_list"); + LLUUID selected_id(LLUUID::null); + if(list->getFirstSelected()) + selected_id = list->getFirstSelected()->getUUID(); + floaterp->setEditID(selected_id); +} +// static +void LLFloaterVFSExplorer::onClickCopyUUID(void* user_data) +{ + LLFloaterVFSExplorer* floaterp = (LLFloaterVFSExplorer*)user_data; + LLVFSFileSpecifier file = floaterp->getEditEntry(); + gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(file.mFileID.asString())); +} +// static +void LLFloaterVFSExplorer::onClickRemove(void* user_data) +{ + LLFloaterVFSExplorer* floaterp = (LLFloaterVFSExplorer*)user_data; + floaterp->removeEntry(); +} +// static +void LLFloaterVFSExplorer::onClickReload(void* user_data) +{ + LLFloaterVFSExplorer* floaterp = (LLFloaterVFSExplorer*)user_data; + floaterp->reloadAll(); +} +// diff --git a/indra/newview/llfloatervfsexplorer.h b/indra/newview/llfloatervfsexplorer.h new file mode 100644 index 000000000..aa92de7c9 --- /dev/null +++ b/indra/newview/llfloatervfsexplorer.h @@ -0,0 +1,39 @@ +// +#ifndef LL_LLFLOATERVFSEXPLORER_H +#define LL_LLFLOATERVFSEXPLORER_H + +#include "llfloater.h" +#include "llassettype.h" +#include "llvfs.h" + +class LLFloaterVFSExplorer : LLFloater +{ +typedef struct +{ + std::string mFilename; + std::string mName; + LLUUID mID; + LLAssetType::EType mType; +} entry; +public: + LLFloaterVFSExplorer(); + ~LLFloaterVFSExplorer(); + static void show(); + BOOL postBuild(); + void refresh(); + void reloadAll(); + void removeEntry(); + void setEditID(LLUUID edit_id); + LLVFSFileSpecifier getEditEntry(); + static void onCommitFileList(LLUICtrl* ctrl, void* user_data); + static void onClickCopyUUID(void* user_data); + static void onClickRemove(void* user_data); + static void onClickReload(void* user_data); +private: + static LLFloaterVFSExplorer* sInstance; + static std::map sVFSFileMap; + LLUUID mEditID; + void setEditEnabled(bool enabled); +}; +#endif +// diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 79298762f..2600d8317 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -235,6 +235,7 @@ #include "llfloatermessagebuilder.h" #include "llao.h" #include "llfloatervfs.h" +#include "llfloatervfsexplorer.h" #include "llfloaterexportregion.h" // @@ -404,6 +405,7 @@ void handle_open_message_log(void*); void handle_open_message_builder(void*); void handle_edit_ao(void*); void handle_local_assets(void*); +void handle_vfs_explorer(void*); // BOOL is_inventory_visible( void* user_data ); @@ -757,6 +759,8 @@ void init_client_menu(LLMenuGL* menu) sub->append(new LLMenuItemCallGL( "Local Assets...", &handle_local_assets, NULL)); + sub->append(new LLMenuItemCallGL( "VFS Explorer", + &handle_vfs_explorer, NULL)); sub->append(new LLMenuItemCheckGL( "Enable AO", &menu_toggle_control, @@ -2478,8 +2482,8 @@ class LLAvatarEnableDebug : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - bool new_value = gAgent.isGodlike(); - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); + //bool new_value = gAgent.isGodlike(); + //gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } }; @@ -3094,6 +3098,11 @@ void handle_local_assets(void*) LLFloaterVFS::show(); } +void handle_vfs_explorer(void*) +{ + LLFloaterVFSExplorer::show(); +} + void handle_close_all_notifications(void*) { LLView::child_list_t child_list(*(gNotifyBoxView->getChildList())); diff --git a/indra/newview/skins/default/xui/en-us/floater_vfs.xml b/indra/newview/skins/default/xui/en-us/floater_vfs.xml index 5dfb892de..e71544b6b 100644 --- a/indra/newview/skins/default/xui/en-us/floater_vfs.xml +++ b/indra/newview/skins/default/xui/en-us/floater_vfs.xml @@ -1,13 +1,14 @@