/** * @file llaisapi.h * @brief classes and functions for interfacing with the v3+ ais inventory service. * * $LicenseInfo:firstyear=2013&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2013, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ #ifndef LL_LLAISAPI_H #define LL_LLAISAPI_H #include "lluuid.h" #include #include #include #include "llcurl.h" #include "llhttpclient.h" #include "llhttpretrypolicy.h" #include "llviewerinventory.h" #include "llcorehttputil.h" #include "llcoproceduremanager.h" #if 1 class AISAPI { public: typedef boost::function completion_t; static void CreateInventoryCommand(const LLUUID& parentId, const LLSD& newInventory, completion_t callback); static void SlamFolderCommand(const LLUUID& folderId, const LLSD& newInventory, completion_t callback); static void RemoveCategoryCommand(const LLUUID &categoryId, completion_t callback); static void RemoveItemCommand(const LLUUID &itemId, completion_t callback); static void PurgeDescendentsCommand(const LLUUID &categoryId, completion_t callback); static void UpdateCategoryCommand(const LLUUID &categoryId, const LLSD &updates, completion_t callback); static void UpdateItemCommand(const LLUUID &itemId, const LLSD &updates, completion_t callback); private: typedef boost::function < LLSD (LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t, LLCore::HttpRequest::ptr_t, const std::string, LLSD, LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t) > invokationFn_t; static void EnqueueAISCommand(const std::string &procName, LLCoprocedureManager::CoProcedure_t proc); static std::string getInvCap(); static std::string getLibCap(); static void InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter, invokationFn_t invoke, std::string url, LLUUID targetId, LLSD body, completion_t callback); #if 0 static void CreateInventoryCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter, LLUUID parentId, LLSD newInventory, completion_t callback); static void SlamFolderCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter, LLUUID folderId, LLSD newInventory, completion_t callback); static void RemoveItemCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter, LLUUID itemId, completion_t callback); #endif }; #endif class AISCommand: public LLHTTPClient::Responder { public: typedef boost::function command_func_type; AISCommand(LLPointer callback); virtual ~AISCommand() {} bool run_command(); void setCommandFunc(command_func_type command_func); // Need to do command-specific parsing to get an id here, for // LLInventoryCallback::fire(). May or may not need to bother, // since most LLInventoryCallbacks do their work in the // destructor. /* virtual */ void httpSuccess(); /* virtual */ void httpFailure(); static bool isAPIAvailable(); static bool getInvCap(std::string& cap); static bool getLibCap(std::string& cap); static void getCapabilityNames(LLSD& capabilityNames); protected: virtual bool getResponseUUID(const LLSD& content, LLUUID& id); private: command_func_type mCommandFunc; LLPointer mRetryPolicy; LLPointer mCallback; }; // class RemoveItemCommand: public AISCommand // { // public: // RemoveItemCommand(const LLUUID& item_id, // LLPointer callback); // }; // class RemoveCategoryCommand: public AISCommand // { // public: // RemoveCategoryCommand(const LLUUID& item_id, // LLPointer callback); // }; // class PurgeDescendentsCommand: public AISCommand // { // public: // PurgeDescendentsCommand(const LLUUID& item_id, // LLPointer callback); // }; // class UpdateItemCommand: public AISCommand // { // public: // UpdateItemCommand(const LLUUID& item_id, // const LLSD& updates, // LLPointer callback); // private: // LLSD mUpdates; // }; // class UpdateCategoryCommand: public AISCommand // { // public: // UpdateCategoryCommand(const LLUUID& cat_id, // const LLSD& updates, // LLPointer callback); // private: // LLSD mUpdates; // }; // class SlamFolderCommand: public AISCommand // { // public: // SlamFolderCommand(const LLUUID& folder_id, const LLSD& contents, LLPointer callback); // // private: // LLSD mContents; // }; class CopyLibraryCategoryCommand: public AISCommand { public: CopyLibraryCategoryCommand(const LLUUID& source_id, const LLUUID& dest_id, LLPointer callback); protected: /* virtual */ bool getResponseUUID(const LLSD& content, LLUUID& id); }; // class CreateInventoryCommand: public AISCommand // { // public: // CreateInventoryCommand(const LLUUID& parent_id, const LLSD& new_inventory, LLPointer callback); // // private: // LLSD mNewInventory; // }; class AISUpdate { public: AISUpdate(const LLSD& update); void parseUpdate(const LLSD& update); void parseMeta(const LLSD& update); void parseContent(const LLSD& update); void parseUUIDArray(const LLSD& content, const std::string& name, uuid_list_t& ids); void parseLink(const LLSD& link_map); void parseItem(const LLSD& link_map); void parseCategory(const LLSD& link_map); void parseDescendentCount(const LLUUID& category_id, const LLSD& embedded); void parseEmbedded(const LLSD& embedded); void parseEmbeddedLinks(const LLSD& links); void parseEmbeddedItems(const LLSD& items); void parseEmbeddedCategories(const LLSD& categories); void parseEmbeddedItem(const LLSD& item); void parseEmbeddedCategory(const LLSD& category); void doUpdate(); private: void clearParseResults(); typedef std::map uuid_int_map_t; uuid_int_map_t mCatDescendentDeltas; uuid_int_map_t mCatDescendentsKnown; uuid_int_map_t mCatVersionsUpdated; typedef std::map > deferred_item_map_t; deferred_item_map_t mItemsCreated; deferred_item_map_t mItemsUpdated; typedef std::map > deferred_category_map_t; deferred_category_map_t mCategoriesCreated; deferred_category_map_t mCategoriesUpdated; // These keep track of uuid's mentioned in meta values. // Useful for filtering out which content we are interested in. uuid_list_t mObjectsDeletedIds; uuid_list_t mItemIds; uuid_list_t mCategoryIds; }; #endif