llassetuploadqueue.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llassetupload.cpp
  3.  * @brief Serializes asset upload request
  4.  *
  5.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2007-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llassetuploadqueue.h"
  34. #include "llviewerregion.h"
  35. #include "llviewerobjectlist.h"
  36. #include "llassetuploadresponders.h"
  37. #include "llsd.h"
  38. #include <iostream>
  39. class LLAssetUploadChainResponder : public LLUpdateTaskInventoryResponder
  40. {
  41. public:
  42. LLAssetUploadChainResponder(const LLSD& post_data,
  43. const std::string& file_name,
  44. const LLUUID& queue_id,
  45. U8* data, 
  46. U32 data_size,
  47. std::string script_name,
  48. LLAssetUploadQueueSupplier *supplier) :
  49. LLUpdateTaskInventoryResponder(post_data, file_name, queue_id, LLAssetType::AT_LSL_TEXT),
  50. mSupplier(supplier),
  51. mData(data),
  52. mDataSize(data_size),
  53. mScriptName(script_name)
  54. {
  55.   }
  56. virtual ~LLAssetUploadChainResponder() 
  57.     {
  58.     if(mSupplier)
  59.     {
  60.     LLAssetUploadQueue *queue = mSupplier->get();
  61.     if (queue)
  62.     {
  63.     // Give ownership of supplier back to queue.
  64.     queue->mSupplier = mSupplier;
  65.     mSupplier = NULL;
  66.     }
  67.     }
  68.     delete mSupplier;
  69. delete mData;
  70.     }
  71. virtual void error(U32 statusNum, const std::string& reason)
  72.     {
  73. llwarns << "Error: " << reason << llendl;
  74. LLUpdateTaskInventoryResponder::error(statusNum, reason);
  75.     LLAssetUploadQueue *queue = mSupplier->get();
  76.     if (queue)
  77. {
  78.     queue->request(&mSupplier);
  79.     }
  80.     }
  81. virtual void result(const LLSD& content)
  82.     {
  83. LLUpdateTaskInventoryResponder::result(content);
  84.     LLAssetUploadQueue *queue = mSupplier->get();
  85.     if (queue)
  86.     {
  87.     // Responder is reused across 2 phase upload,
  88.     // so only start next upload after 2nd phase complete.
  89.     std::string state = content["state"];
  90.     if(state == "complete")
  91.     {
  92.     queue->request(&mSupplier);
  93.     }
  94.     }
  95.     }
  96. virtual void uploadUpload(const LLSD& content)
  97. {
  98. std::string uploader = content["uploader"];
  99. mSupplier->log(std::string("Compiling " + mScriptName).c_str());
  100. llinfos << "Compiling " << llendl;
  101. // postRaw takes ownership of mData and will delete it.
  102. LLHTTPClient::postRaw(uploader, mData, mDataSize, this);
  103. mData = NULL;
  104. mDataSize = 0;
  105. }
  106. virtual void uploadComplete(const LLSD& content)
  107. {
  108. // Bytecode save completed
  109. if (content["compiled"])
  110. {
  111. mSupplier->log("Compilation succeeded");
  112. llinfos << "Compiled!" << llendl;
  113. }
  114. else
  115. {
  116. LLSD compile_errors = content["errors"];
  117. for(LLSD::array_const_iterator line = compile_errors.beginArray();
  118. line < compile_errors.endArray(); line++)
  119. {
  120. mSupplier->log(line->asString());
  121. llinfos << content["errors"] << llendl;
  122. }
  123. }
  124. LLUpdateTaskInventoryResponder::uploadComplete(content);
  125. }
  126. LLAssetUploadQueueSupplier *mSupplier;
  127. U8* mData;
  128. U32 mDataSize;
  129. std::string mScriptName;
  130. };
  131. LLAssetUploadQueue::LLAssetUploadQueue(LLAssetUploadQueueSupplier *supplier) :
  132. mSupplier(supplier)
  133. {
  134. }
  135. //virtual 
  136. LLAssetUploadQueue::~LLAssetUploadQueue()
  137. {
  138. delete mSupplier;
  139. }
  140. // Takes ownership of supplier.
  141. void LLAssetUploadQueue::request(LLAssetUploadQueueSupplier** supplier)
  142. {
  143. if (mQueue.empty())
  144. return;
  145. UploadData data = mQueue.front();
  146. mQueue.pop_front();
  147. LLSD body;
  148. body["task_id"] = data.mTaskId;
  149. body["item_id"] = data.mItemId;
  150. body["is_script_running"] = data.mIsRunning;
  151. body["target"] = data.mIsTargetMono? "mono" : "lsl2";
  152. std::string url = "";
  153. LLViewerObject* object = gObjectList.findObject(data.mTaskId);
  154. if (object)
  155. {
  156. url = object->getRegion()->getCapability("UpdateScriptTask");
  157. LLHTTPClient::post(url, body,
  158. new LLAssetUploadChainResponder(
  159. body, data.mFilename, data.mQueueId, 
  160. data.mData, data.mDataSize, data.mScriptName, *supplier));
  161. }
  162. *supplier = NULL;
  163. }
  164. void LLAssetUploadQueue::queue(const std::string& filename,
  165.    const LLUUID& task_id,
  166.    const LLUUID& item_id,
  167.    BOOL is_running, 
  168.    BOOL is_target_mono, 
  169.    const LLUUID& queue_id,
  170.    U8* script_data,
  171.    U32 data_size,
  172.    std::string script_name)
  173. {
  174. UploadData data;
  175. data.mTaskId = task_id;
  176. data.mItemId = item_id;
  177. data.mIsRunning = is_running;
  178. data.mIsTargetMono = is_target_mono;
  179. data.mQueueId = queue_id;
  180. data.mFilename = filename;
  181. data.mData = script_data;
  182. data.mDataSize = data_size;
  183. data.mScriptName = script_name;
  184. mQueue.push_back(data);
  185. if(mSupplier)
  186. {
  187. request(&mSupplier);
  188. }
  189. }
  190. LLAssetUploadQueueSupplier::~LLAssetUploadQueueSupplier()
  191. {
  192. }