diff options
| author | Merov Linden <merov@lindenlab.com> | 2014-05-06 21:24:06 -0700 | 
|---|---|---|
| committer | Merov Linden <merov@lindenlab.com> | 2014-05-06 21:24:06 -0700 | 
| commit | e916b47f12ba0e84ee6b1faed687b920e49633f8 (patch) | |
| tree | 93ff68492910edf072d20c430987a7ef5a020fdd | |
| parent | d24ff0bf0adeae1ce000551e3b9bdac528f5c162 (diff) | |
DD-22 : WIP : Implement the modify listing route. Made the code more readable and cleared old debug code
| -rwxr-xr-x | indra/newview/llinventorybridge.cpp | 8 | ||||
| -rwxr-xr-x | indra/newview/llmarketplacefunctions.cpp | 172 | ||||
| -rwxr-xr-x | indra/newview/llmarketplacefunctions.h | 19 | 
3 files changed, 162 insertions, 37 deletions
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index e9abe6a466..f68d69b1c3 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3178,7 +3178,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)  	{          if (depth_nesting_in_marketplace(mUUID) == 1)          { -            LLMarketplaceData::instance().setActivation(mUUID,true); +            LLMarketplaceData::instance().activateListing(mUUID,true);          }  		return;  	} @@ -3187,7 +3187,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)          if (depth_nesting_in_marketplace(mUUID) == 2)          {  			LLInventoryCategory* category = gInventory.getCategory(mUUID); -            LLMarketplaceData::instance().setVersionFolderID(category->getParentUUID(), mUUID); +            LLMarketplaceData::instance().setVersionFolder(category->getParentUUID(), mUUID);          }  		return;  	} @@ -3195,7 +3195,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)  	{          if (depth_nesting_in_marketplace(mUUID) == 1)          { -            LLMarketplaceData::instance().setActivation(mUUID,false); +            LLMarketplaceData::instance().activateListing(mUUID,false);          }  		return;  	} @@ -3204,7 +3204,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)          if (depth_nesting_in_marketplace(mUUID) == 2)          {  			LLInventoryCategory* category = gInventory.getCategory(mUUID); -            LLMarketplaceData::instance().setVersionFolderID(category->getParentUUID(), LLUUID::null); +            LLMarketplaceData::instance().setVersionFolder(category->getParentUUID(), LLUUID::null);          }  		return;  	} diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp index 2178ecaaa2..15c1630a2a 100755 --- a/indra/newview/llmarketplacefunctions.cpp +++ b/indra/newview/llmarketplacefunctions.cpp @@ -104,19 +104,19 @@ LLSD getMarketplaceStringSubstitutions()  // SLM Responders  void log_SLM_error(const std::string& request, U32 status, const std::string& reason, const std::string& code, const std::string& description)  { -		LL_WARNS("SLM") << request << " request failed. status : " << status << ". reason : " << reason << ". code : " << code << ". description : " << description << LL_ENDL; +		LL_WARNS("SLM") << "Merov : " << request << " request failed. status : " << status << ", reason : " << reason << ", code : " << code << ", description : " << description << LL_ENDL;  }  // Merov: This is a temporary hack used by dev while secondlife-staging is down...  // *TODO : Suppress that before shipping! -static bool sBypassMerchant = false; +static bool sBypassMerchant = true; -class LLSLMMerchantResponder : public LLHTTPClient::Responder +class LLSLMGetMerchantResponder : public LLHTTPClient::Responder  { -	LOG_CLASS(LLSLMMerchantResponder); +	LOG_CLASS(LLSLMGetMerchantResponder);  public: -    LLSLMMerchantResponder() {} +    LLSLMGetMerchantResponder() {}  	virtual void completed(U32 status, const std::string& reason, const LLSD& content) { } @@ -138,12 +138,12 @@ public:      }  }; -class LLSLMListingsResponder : public LLHTTPClient::Responder +class LLSLMGetListingsResponder : public LLHTTPClient::Responder  { -	LOG_CLASS(LLSLMListingsResponder); +	LOG_CLASS(LLSLMGetListingsResponder);  public: -    LLSLMListingsResponder() {} +    LLSLMGetListingsResponder() {}      virtual void completedRaw(U32 status,                                const std::string& reason, @@ -152,8 +152,7 @@ public:      {  		if (!isGoodStatus(status))  		{ -            std::string error_code = llformat("%d",status); -            log_SLM_error("Get listings", status, reason, error_code, ""); +            log_SLM_error("Get listings", status, reason, "", "");              return;  		} @@ -169,7 +168,9 @@ public:              log_SLM_error("Get listings", status, "Json parsing failed", reader.getFormatedErrorMessages(), body);              return;          } -         + +        llinfos << "Merov : Get listings completedRaw : data = " << body << llendl; +          // Extract the info from the Json string          Json::ValueIterator it = root["listings"].begin(); @@ -204,8 +205,7 @@ public:      {  		if (!isGoodStatus(status))  		{ -            std::string error_code = llformat("%d",status); -            log_SLM_error("Post listings", status, reason, error_code, ""); +            log_SLM_error("Post listings", status, reason, "", "");              return;  		} @@ -221,7 +221,9 @@ public:              log_SLM_error("Post listings", status, "Json parsing failed", reader.getFormatedErrorMessages(), body);              return;          } -         + +        llinfos << "Merov : Create listing completedRaw : data = " << body << llendl; +          // Extract the info from the Json string          Json::ValueIterator it = root["listings"].begin(); @@ -241,6 +243,64 @@ public:          }      }  }; + +class LLSLMUpdateListingsResponder : public LLHTTPClient::Responder +{ +	LOG_CLASS(LLSLMUpdateListingsResponder); +public: +	 +    LLSLMUpdateListingsResponder() {} +     +    virtual void completedRaw(U32 status, +                              const std::string& reason, +                              const LLChannelDescriptors& channels, +                              const LLIOPipe::buffer_ptr_t& buffer) +    { +		if (!isGoodStatus(status)) +		{ +            log_SLM_error("Put listings", status, reason, "", ""); +            return; +		} +         +        LLBufferStream istr(channels, buffer.get()); +        std::stringstream strstrm; +        strstrm << istr.rdbuf(); +        const std::string body = strstrm.str(); +         +        Json::Value root; +        Json::Reader reader; +        if (!reader.parse(body,root)) +        { +            log_SLM_error("Put listings", status, "Json parsing failed", reader.getFormatedErrorMessages(), body); +            return; +        } +         +        llinfos << "Merov : Update listing completedRaw : data = " << body << llendl; + +        // Extract the info from the Json string +        Json::ValueIterator it = root["listings"].begin(); +         +        while (it != root["listings"].end()) +        { +            Json::Value listing = *it; +             +            int listing_id = listing["id"].asInt(); +            bool is_listed = listing["is_listed"].asBool(); +            std::string folder_uuid_string = listing["inventory_info"]["listing_folder_id"].asString(); +            std::string version_uuid_string = listing["inventory_info"]["version_folder_id"].asString(); +             +            LLUUID folder_id(folder_uuid_string); +            LLUUID version_id(version_uuid_string); +             +            // Update that listing +            LLMarketplaceData::instance().setListingID(folder_id, listing_id); +            LLMarketplaceData::instance().setVersionFolderID(folder_id, version_id); +            LLMarketplaceData::instance().setActivation(folder_id, is_listed); +             +            it++; +        } +    } +};  // SLM Responders End  /////////////////////////////////////////////////////////////////////////////// @@ -763,7 +823,6 @@ LLMarketplaceData::LLMarketplaceData() :   mStatusUpdatedSignal(NULL),   mDirtyCount(false)  { -    mTestCurrentMarketplaceID = 1234567;      mInventoryObserver = new LLMarketplaceInventoryObserver;      gInventory.addObserver(mInventoryObserver);  } @@ -773,11 +832,6 @@ LLMarketplaceData::~LLMarketplaceData()  	gInventory.removeObserver(mInventoryObserver);  } -S32 LLMarketplaceData::getTestMarketplaceID() -{ -    return mTestCurrentMarketplaceID++; -} -  void LLMarketplaceData::initializeSLM(const status_updated_signal_t::slot_type& cb)  {      mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING; @@ -786,12 +840,12 @@ void LLMarketplaceData::initializeSLM(const status_updated_signal_t::slot_type&  		mStatusUpdatedSignal = new status_updated_signal_t();  	}  	mStatusUpdatedSignal->connect(cb); -	LLHTTPClient::get(getSLMConnectURL("/merchant"), new LLSLMMerchantResponder(), LLSD()); +	LLHTTPClient::get(getSLMConnectURL("/merchant"), new LLSLMGetMerchantResponder(), LLSD());  }  void LLMarketplaceData::getSLMListings()  { -	LLHTTPClient::get(getSLMConnectURL("/listings"), new LLSLMListingsResponder(), LLSD()); +	LLHTTPClient::get(getSLMConnectURL("/listings"), new LLSLMGetListingsResponder(), LLSD());  }  void LLMarketplaceData::createSLMListing(const LLUUID& folder_id) @@ -819,6 +873,36 @@ void LLMarketplaceData::createSLMListing(const LLUUID& folder_id)  	LLHTTPClient::postRaw(getSLMConnectURL("/listings"), data, size, new LLSLMCreateListingsResponder(), headers);  } +void LLMarketplaceData::updateSLMListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed) +{ +	LLSD headers = LLSD::emptyMap(); +	headers["Accept"] = "application/json"; +	headers["Content-Type"] = "application/json"; + +    Json::Value root; +    Json::FastWriter writer; +     +    // Note : we're assuming that sending unchanged info won't break anything server side... +    root["listing"]["id"] = listing_id; +    root["listing"]["is_listed"] = is_listed; +    root["listing"]["inventory_info"]["listing_folder_id"] = folder_id.asString(); +    root["listing"]["inventory_info"]["version_folder_id"] = version_id.asString(); +     +    std::string json_str = writer.write(root); +     +	// postRaw() takes ownership of the buffer and releases it later. +	size_t size = json_str.size(); +	U8 *data = new U8[size]; +	memcpy(data, (U8*)(json_str.c_str()), size); +     +	// Send request +    std::string url = getSLMConnectURL("/listing/") + llformat("%d",listing_id); +    llinfos << "Merov : updating listing : " << url << ", data = " << json_str << llendl; +	LLHTTPClient::putRaw(url, data, size, new LLSLMUpdateListingsResponder(), headers); +} + +// PUT /associate_inventory/:listing_folder_id/:version_folder_id/:listing_id +  std::string LLMarketplaceData::getSLMConnectURL(const std::string& route)  {      std::string url(""); @@ -847,7 +931,8 @@ void LLMarketplaceData::setSLMStatus(U32 status)      }  } -// Creation / Deletion +// Creation / Deletion / Update +// Methods publicly called  bool LLMarketplaceData::createListing(const LLUUID& folder_id)  {      if (isListed(folder_id)) @@ -862,6 +947,47 @@ bool LLMarketplaceData::createListing(const LLUUID& folder_id)      return true;  } +bool LLMarketplaceData::activateListing(const LLUUID& folder_id, bool activate) +{ +    // Folder id can be the root of the listing or not so we need to retrieve the root first +    S32 depth = depth_nesting_in_marketplace(folder_id); +    LLUUID listing_uuid = nested_parent_id(folder_id, depth); +    S32 listing_id = getListingID(listing_uuid); +    if (listing_id == 0) +    { +        // Listing doesn't exists -> exit with error +        return false; +    } +     +    LLUUID version_uuid = getVersionFolderID(listing_uuid); + +    // Post the listing update request to SLM +    updateSLMListing(listing_uuid, listing_id, version_uuid, activate); +     +    return true; +} + +bool LLMarketplaceData::setVersionFolder(const LLUUID& folder_id, const LLUUID& version_id) +{ +    // Folder id can be the root of the listing or not so we need to retrieve the root first +    S32 depth = depth_nesting_in_marketplace(folder_id); +    LLUUID listing_uuid = nested_parent_id(folder_id, depth); +    S32 listing_id = getListingID(listing_uuid); +    if (listing_id == 0) +    { +        // Listing doesn't exists -> exit with error +        return false; +    } +     +    bool is_listed = getActivationState(listing_uuid); +     +    // Post the listing update request to SLM +    updateSLMListing(listing_uuid, listing_id, version_id, is_listed); +     +    return true; +} + +// Methods privately called or called by SLM responders to perform changes  bool LLMarketplaceData::addListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed)  {      if (isListed(folder_id)) diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h index aa286adcc8..f0a1f2f4b8 100755 --- a/indra/newview/llmarketplacefunctions.h +++ b/indra/newview/llmarketplacefunctions.h @@ -164,8 +164,7 @@ public:      void getSLMListings();      //void getSLMListing();      void createSLMListing(const LLUUID& folder_id); -    //void modifySLMListing(); -    //void associateSLMListing(); +    void updateSLMListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed);      bool isEmpty() { return (mMarketplaceItems.size() == 0); } @@ -175,6 +174,9 @@ public:      // Create/Delete Marketplace data set  : each method returns true if the function succeeds, false if error      bool createListing(const LLUUID& folder_id); +    bool activateListing(const LLUUID& folder_id, bool activate); +    bool setVersionFolder(const LLUUID& folder_id, const LLUUID& version_id); +          bool addListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed);      bool associateListing(const LLUUID& folder_id, S32 listing_id);      bool deleteListing(const LLUUID& folder_id); @@ -191,25 +193,22 @@ public:      bool setVersionFolderID(const LLUUID& folder_id, const LLUUID& version_id);      bool setActivation(const LLUUID& folder_id, bool activate); +    // Used to flag if count values for Marketplace are likely to have to be updated      bool checkDirtyCount() { if (mDirtyCount) { mDirtyCount = false; return true; } else { return false; } }      void setDirtyCount() { mDirtyCount = true; } -    // Merov : Test method while waiting for SLM API -    S32 getTestMarketplaceID(); -      private:      // SLM Private      std::string getSLMConnectURL(const std::string& route); -    marketplace_items_list_t mMarketplaceItems; -     +    // Handling Marketplace connection and inventory connection  	U32  mMarketPlaceStatus;  	status_updated_signal_t *	mStatusUpdatedSignal;  	LLInventoryObserver* mInventoryObserver; -    bool mDirtyCount; +    bool mDirtyCount;   // If true, stock count value will be updating at the next check -    // Merov : This is for test only, waiting for SLM API -    S32 mTestCurrentMarketplaceID; +    // The cache of SLM data (at last...) +    marketplace_items_list_t mMarketplaceItems;  };  | 
