#pragma once #include "V8Tree/Instance.h" #include "V8Tree/Service.h" #include "V8DataModel/ContentProvider.h" #include "rbx/signal.h" #include "rbx/boost.hpp" #include "boost/thread.hpp" #include namespace RBX { extern const char* const sInsertService; class InsertService : public DescribedCreatable , public Service { private: typedef DescribedCreatable Super; public: InsertService(); rbx::remote_signal insertRequestSignal; rbx::remote_signal insertRequestAssetSignal; rbx::remote_signal insertRequestAssetVersionSignal; rbx::remote_signal)> insertReadySignal; rbx::remote_signal insertErrorSignal; rbx::remote_signal)> internalDeleteSignal; void setTrustLevel(float); void setFreeModelUrl(std::string); void setFreeDecalUrl(std::string); void setBaseSetsUrl(std::string); void setUserSetsUrl(std::string); void setCollectionUrl(std::string); void setAssetUrl(std::string); void setAssetVersionUrl(std::string); void setAdvancedResults(bool advancedResults, bool userMode); void getFreeDecals(std::string searchText, int pageNum, boost::function)> resumeFunction, boost::function errorFunction); void getFreeModels(std::string searchText, int pageNum, boost::function)> resumeFunction, boost::function errorFunction); void getBaseSets(boost::function)> resumeFunction, boost::function errorFunction); void getUserSets(int userId, boost::function)> resumeFunction, boost::function errorFunction); void getCollection(int collectionId, boost::function)> resumeFunction, boost::function errorFunction); void loadAsset(int id, boost::function)> resumeFunction, boost::function errorFunction); void loadAssetVersion(int id, boost::function)> resumeFunction, boost::function errorFunction); void getLatestAssetVersion(int id, boost::function resumeFunction, boost::function errorFunction); void insert(shared_ptr instance); void internalDelete(shared_ptr instance); enum InsertRequestType { ASSET, ASSET_VERSION }; void safeInsert(ContentId asset, bool clientInsert, boost::function, AsyncHttpQueue::RequestResult requestResult, shared_ptr requestError)> callback); void safeInsert(InsertRequestType requestType, int id, bool clientInsert, boost::function, AsyncHttpQueue::RequestResult requestResult, shared_ptr requestError)> callback); /*override*/ void onServiceProvider(ServiceProvider* oldProvider, ServiceProvider* newProvider); void backendApproveAssetId(int assetId); void backendApproveAssetVersionId(int assetVersionId); bool getAllowInsertFreeModels() const { return allowInsertFreeModels; } void setAllowInsertFreeModels(bool value); private: void dispatchRequest(const std::string& url, boost::function)> resumeFunction, boost::function errorFunction); void privateLoadAsset(int id, bool isAssetVersion, boost::function)> resumeFunction, boost::function errorFunction); void populateExtraInsertUrlParams(std::stringstream& url, bool clientInsert); rbx::signals::connection backendInsertConnection; rbx::signals::connection backendInsertAssetConnection; rbx::signals::connection backendInsertAssetVersionConnection; rbx::signals::scoped_connection backendInternalDeleteConnection; void backendInsertRequested(std::string key, bool clientInsert, ContentId contentId); void backendInsertRequested(InsertRequestType requestType, int id, std::string key, bool clientInsert); void backendInsertAssetRequested(std::string key, bool clientInsert, int assetId, int userId); void backendInsertAssetVersionRequested(std::string key, bool clientInsert, int assetVersionId, int userId); void getLatestAssetVersionSuccess(std::string result, boost::function resumeFunction, boost::function errorFunction); void getLatestAssetVersionError(std::string error, boost::function errorFunction); void backendInsertReady( std::string key, shared_ptr pseudoRoot, AsyncHttpQueue::RequestResult requestResult, shared_ptr requestError); static void BackendInsertReadyHelper( weak_ptr insertService, std::string key, shared_ptr pseudoRoot, AsyncHttpQueue::RequestResult requestResult, shared_ptr requestError); void remoteInsertItemsLoaded( weak_ptr weakCp, AsyncHttpQueue::RequestResult requestResult, shared_ptr instances, shared_ptr requestError, boost::function, AsyncHttpQueue::RequestResult, shared_ptr)> resultFunction); static void RemoteInsertItemsLoadedHelper( weak_ptr insertService, weak_ptr cp, AsyncHttpQueue::RequestResult requestResult, shared_ptr instances, shared_ptr requestError, boost::function, AsyncHttpQueue::RequestResult, shared_ptr)> resultFunction); rbx::signals::connection frontendInsertReadyConnection; rbx::signals::connection frontendInsertErrorConnection; void insertResultsReady(std::string key, shared_ptr container); void insertResultsError(std::string key, std::string message); std::string addBaseUrl(const std::string& urlPiece); std::string addBaseUrlAndId(const std::string& urlPiece, int id); std::string addBaseUrlAndQuery(const std::string& urlPiece, const std::string& query, int page); boost::recursive_mutex callbackSync; // synchronizes the callbackLibrary struct Callback { boost::function)> resumeFunction; boost::function errorFunction; }; typedef std::map CallbackLibrary; CallbackLibrary callbackLibrary; rbx::atomic loadCount; // used to uniquely identify a load asset request shared_ptr holder; // items are initially loaded into this Folder bool allowInsertFreeModels; }; }