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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcompilequeue.cpp
  3.  * @brief LLCompileQueueData class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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. /**
  33.  *
  34.  * Implementation of the script queue which keeps an array of object
  35.  * UUIDs and manipulates all of the scripts on each of them. 
  36.  *
  37.  */
  38. #include "llviewerprecompiledheaders.h"
  39. #include "llcompilequeue.h"
  40. #include "llagent.h"
  41. #include "llassetuploadqueue.h"
  42. #include "llassetuploadresponders.h"
  43. #include "llchat.h"
  44. #include "llfloaterreg.h"
  45. #include "llviewerwindow.h"
  46. #include "llviewerobject.h"
  47. #include "llviewerobjectlist.h"
  48. #include "llviewerregion.h"
  49. #include "lscript_rt_interface.h"
  50. #include "llviewercontrol.h"
  51. #include "llviewerobject.h"
  52. #include "llviewerregion.h"
  53. #include "llresmgr.h"
  54. #include "llbutton.h"
  55. #include "lldir.h"
  56. #include "llnotificationsutil.h"
  57. #include "llviewerstats.h"
  58. #include "llvfile.h"
  59. #include "lluictrlfactory.h"
  60. #include "lltrans.h"
  61. #include "llselectmgr.h"
  62. // *TODO: This should be separated into the script queue, and the floater views of that queue.
  63. // There should only be one floater class that can view any queue type
  64. ///----------------------------------------------------------------------------
  65. /// Local function declarations, constants, enums, and typedefs
  66. ///----------------------------------------------------------------------------
  67. struct LLScriptQueueData
  68. {
  69. LLUUID mQueueID;
  70. std::string mScriptName;
  71. LLUUID mTaskId;
  72. LLUUID mItemId;
  73. LLScriptQueueData(const LLUUID& q_id, const std::string& name, const LLUUID& task_id, const LLUUID& item_id) :
  74. mQueueID(q_id), mScriptName(name), mTaskId(task_id), mItemId(item_id) {}
  75. };
  76. ///----------------------------------------------------------------------------
  77. /// Class LLFloaterScriptQueue
  78. ///----------------------------------------------------------------------------
  79. // Default constructor
  80. LLFloaterScriptQueue::LLFloaterScriptQueue(const LLSD& key) :
  81. LLFloater(key),
  82. mDone(false),
  83. mMono(false)
  84. {
  85. //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_script_queue.xml", FALSE);
  86. }
  87. // Destroys the object
  88. LLFloaterScriptQueue::~LLFloaterScriptQueue()
  89. {
  90. }
  91. BOOL LLFloaterScriptQueue::postBuild()
  92. {
  93. childSetAction("close",onCloseBtn,this);
  94. childSetEnabled("close",FALSE);
  95. return TRUE;
  96. }
  97. // This is the callback method for the viewer object currently being
  98. // worked on.
  99. // NOT static, virtual!
  100. void LLFloaterScriptQueue::inventoryChanged(LLViewerObject* viewer_object,
  101.  InventoryObjectList* inv,
  102.  S32,
  103.  void* q_id)
  104. {
  105. llinfos << "LLFloaterScriptQueue::inventoryChanged() for  object "
  106. << viewer_object->getID() << llendl;
  107. //Remove this listener from the object since its
  108. //listener callback is now being executed.
  109. //We remove the listener here because the function
  110. //removeVOInventoryListener removes the listener from a ViewerObject
  111. //which it internally stores.
  112. //If we call this further down in the function, calls to handleInventory
  113. //and nextObject may update the interally stored viewer object causing
  114. //the removal of the incorrect listener from an incorrect object.
  115. //Fixes SL-6119:Recompile scripts fails to complete
  116. removeVOInventoryListener();
  117. if (viewer_object && inv && (viewer_object->getID() == mCurrentObjectID) )
  118. {
  119. handleInventory(viewer_object, inv);
  120. }
  121. else
  122. {
  123. // something went wrong...
  124. // note that we're not working on this one, and move onto the
  125. // next object in the list.
  126. llwarns << "No inventory for " << mCurrentObjectID
  127. << llendl;
  128. nextObject();
  129. }
  130. }
  131. // static
  132. void LLFloaterScriptQueue::onCloseBtn(void* user_data)
  133. {
  134. LLFloaterScriptQueue* self = (LLFloaterScriptQueue*)user_data;
  135. self->closeFloater();
  136. }
  137. void LLFloaterScriptQueue::addObject(const LLUUID& id)
  138. {
  139. mObjectIDs.put(id);
  140. }
  141. BOOL LLFloaterScriptQueue::start()
  142. {
  143. //llinfos << "LLFloaterCompileQueue::start()" << llendl;
  144. std::string buffer;
  145. LLSelectMgr *mgr = LLSelectMgr::getInstance();
  146. LLObjectSelectionHandle selectHandle = mgr->getSelection();
  147. U32 n_objects = 0;
  148. if (gSavedSettings.getBOOL("EditLinkedParts"))
  149. {
  150. n_objects = selectHandle->getObjectCount();
  151. }
  152. else
  153. {
  154. n_objects = selectHandle->getRootObjectCount();
  155. }
  156. LLStringUtil::format_map_t args;
  157. args["[START]"] = mStartString;
  158. args["[COUNT]"] = llformat ("%d", mObjectIDs.count());
  159. buffer = getString ("Starting", args);
  160. getChild<LLScrollListCtrl>("queue output")->setCommentText(buffer);
  161. return nextObject();
  162. }
  163. BOOL LLFloaterScriptQueue::isDone() const
  164. {
  165. return (mCurrentObjectID.isNull() && (mObjectIDs.count() == 0));
  166. }
  167. // go to the next object. If no objects left, it falls out silently
  168. // and waits to be killed by the window being closed.
  169. BOOL LLFloaterScriptQueue::nextObject()
  170. {
  171. S32 count;
  172. BOOL successful_start = FALSE;
  173. do
  174. {
  175. count = mObjectIDs.count();
  176. llinfos << "LLFloaterScriptQueue::nextObject() - " << count
  177. << " objects left to process." << llendl;
  178. mCurrentObjectID.setNull();
  179. if(count > 0)
  180. {
  181. successful_start = popNext();
  182. }
  183. llinfos << "LLFloaterScriptQueue::nextObject() "
  184. << (successful_start ? "successful" : "unsuccessful")
  185. << llendl; 
  186. } while((mObjectIDs.count() > 0) && !successful_start);
  187. if(isDone() && !mDone)
  188. {
  189. mDone = true;
  190. getChild<LLScrollListCtrl>("queue output")->setCommentText(getString("Done"));
  191. childSetEnabled("close",TRUE);
  192. }
  193. return successful_start;
  194. }
  195. // returns true if the queue has started, otherwise false.  This
  196. // method pops the top object off of the queue.
  197. BOOL LLFloaterScriptQueue::popNext()
  198. {
  199. // get the first element off of the container, and attempt to get
  200. // the inventory.
  201. BOOL rv = FALSE;
  202. S32 count = mObjectIDs.count();
  203. if(mCurrentObjectID.isNull() && (count > 0))
  204. {
  205. mCurrentObjectID = mObjectIDs.get(0);
  206. llinfos << "LLFloaterScriptQueue::popNext() - mCurrentID: "
  207. << mCurrentObjectID << llendl;
  208. mObjectIDs.remove(0);
  209. LLViewerObject* obj = gObjectList.findObject(mCurrentObjectID);
  210. if(obj)
  211. {
  212. llinfos << "LLFloaterScriptQueue::popNext() requesting inv for "
  213. << mCurrentObjectID << llendl;
  214. LLUUID* id = new LLUUID(getKey().asUUID());
  215. registerVOInventoryListener(obj,id);
  216. requestVOInventory();
  217. rv = TRUE;
  218. }
  219. }
  220. return rv;
  221. }
  222. ///----------------------------------------------------------------------------
  223. /// Class LLFloaterCompileQueue
  224. ///----------------------------------------------------------------------------
  225. class LLCompileFloaterUploadQueueSupplier : public LLAssetUploadQueueSupplier
  226. {
  227. public:
  228. LLCompileFloaterUploadQueueSupplier(const LLUUID& queue_id) :
  229. mQueueId(queue_id)
  230. {
  231. }
  232. virtual LLAssetUploadQueue* get() const 
  233. {
  234. LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", LLSD(mQueueId));
  235. if(NULL == queue)
  236. {
  237. return NULL;
  238. }
  239. return queue->getUploadQueue();
  240. }
  241. virtual void log(std::string message) const
  242. {
  243. LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", LLSD(mQueueId));
  244. if(NULL == queue)
  245. {
  246. return;
  247. }
  248. queue->getChild<LLScrollListCtrl>("queue output")->setCommentText(message);
  249. }
  250. private:
  251. LLUUID mQueueId;
  252. };
  253. LLFloaterCompileQueue::LLFloaterCompileQueue(const LLSD& key)
  254.   : LLFloaterScriptQueue(key)
  255. {
  256. setTitle(LLTrans::getString("CompileQueueTitle"));
  257. setStartString(LLTrans::getString("CompileQueueStart"));
  258.    
  259. mUploadQueue = new LLAssetUploadQueue(new LLCompileFloaterUploadQueueSupplier(key.asUUID()));
  260. }
  261. LLFloaterCompileQueue::~LLFloaterCompileQueue()
  262. }
  263. void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object,
  264. InventoryObjectList* inv)
  265. {
  266. // find all of the lsl, leaving off duplicates. We'll remove
  267. // all matching asset uuids on compilation success.
  268. typedef std::multimap<LLUUID, LLPointer<LLInventoryItem> > uuid_item_map;
  269. uuid_item_map asset_item_map;
  270. InventoryObjectList::const_iterator it = inv->begin();
  271. InventoryObjectList::const_iterator end = inv->end();
  272. for ( ; it != end; ++it)
  273. {
  274. if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
  275. {
  276. LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
  277. // Check permissions before allowing the user to retrieve data.
  278. if (item->getPermissions().allowModifyBy(gAgent.getID(), gAgent.getGroupID())  &&
  279. item->getPermissions().allowCopyBy(gAgent.getID(), gAgent.getGroupID()) )
  280. {
  281. LLPointer<LLViewerInventoryItem> script = new LLViewerInventoryItem(item);
  282. mCurrentScripts.put(script);
  283. asset_item_map.insert(std::make_pair(item->getAssetUUID(), item));
  284. }
  285. }
  286. }
  287. if (asset_item_map.empty())
  288. {
  289. // There are no scripts in this object.  move on.
  290. nextObject();
  291. }
  292. else
  293. {
  294. // request all of the assets.
  295. uuid_item_map::iterator iter;
  296. for(iter = asset_item_map.begin(); iter != asset_item_map.end(); iter++)
  297. {
  298. LLInventoryItem *itemp = iter->second;
  299. LLScriptQueueData* datap = new LLScriptQueueData(getKey().asUUID(),
  300.  itemp->getName(),
  301.  viewer_object->getID(),
  302.  itemp->getUUID());
  303. //llinfos << "ITEM NAME 2: " << names.get(i) << llendl;
  304. gAssetStorage->getInvItemAsset(viewer_object->getRegion()->getHost(),
  305. gAgent.getID(),
  306. gAgent.getSessionID(),
  307. itemp->getPermissions().getOwner(),
  308. viewer_object->getID(),
  309. itemp->getUUID(),
  310. itemp->getAssetUUID(),
  311. itemp->getType(),
  312. LLFloaterCompileQueue::scriptArrived,
  313. (void*)datap);
  314. }
  315. }
  316. }
  317. // This is the callback for when each script arrives
  318. // static
  319. void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
  320.   LLAssetType::EType type,
  321.   void* user_data, S32 status, LLExtStat ext_status)
  322. {
  323. llinfos << "LLFloaterCompileQueue::scriptArrived()" << llendl;
  324. LLScriptQueueData* data = (LLScriptQueueData*)user_data;
  325. if(!data)
  326. {
  327. return;
  328. }
  329. LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", data->mQueueID);
  330. std::string buffer;
  331. if(queue && (0 == status))
  332. {
  333. //llinfos << "ITEM NAME 3: " << data->mScriptName << llendl;
  334. // Dump this into a file on the local disk so we can compile it.
  335. std::string filename;
  336. LLVFile file(vfs, asset_id, type);
  337. std::string uuid_str;
  338. asset_id.toString(uuid_str);
  339. filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str) + llformat(".%s",LLAssetType::lookup(type));
  340. const bool is_running = true;
  341. LLViewerObject* object = gObjectList.findObject(data->mTaskId);
  342. if (object)
  343. {
  344. std::string url = object->getRegion()->getCapability("UpdateScriptTask");
  345. if(!url.empty())
  346. {
  347. // Read script source in to buffer.
  348. U32 script_size = file.getSize();
  349. U8* script_data = new U8[script_size];
  350. file.read(script_data, script_size);
  351. queue->mUploadQueue->queue(filename, data->mTaskId, 
  352.    data->mItemId, is_running, queue->mMono, queue->getKey().asUUID(),
  353.    script_data, script_size, data->mScriptName);
  354. }
  355. else
  356. {
  357. // It's now in the file, now compile it.
  358. buffer = LLTrans::getString("CompileQueueDownloadedCompiling") + (": ") + data->mScriptName;
  359. // Write script to local file for compilation.
  360. LLFILE *fp = LLFile::fopen(filename, "wb");  /*Flawfinder: ignore*/
  361. if (fp)
  362. {
  363. const S32 buf_size = 65536;
  364. U8 copy_buf[buf_size];
  365. while (file.read(copy_buf, buf_size))   /*Flawfinder: ignore*/
  366. {
  367. if (fwrite(copy_buf, file.getLastBytesRead(), 1, fp) < 1)
  368. {
  369. // return a bad file error if we can't write the whole thing
  370. status = LL_ERR_CANNOT_OPEN_FILE;
  371. }
  372. }
  373. fclose(fp);
  374. }
  375. else
  376. {
  377. llerrs << "Unable to find object to compile" << llendl;
  378. }
  379. // TODO: babbage: No compile if no cap.
  380. queue->compile(filename, data->mItemId);
  381. // Delete it after we're done compiling?
  382. LLFile::remove(filename);
  383. }
  384. }
  385. }
  386. else
  387. {
  388. LLViewerStats::getInstance()->incStat( LLViewerStats::ST_DOWNLOAD_FAILED );
  389. if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status )
  390. {
  391. LLSD args;
  392. args["MESSAGE"] = LLTrans::getString("CompileQueueScriptNotFound");
  393. LLNotificationsUtil::add("SystemMessage", args);
  394. buffer = LLTrans::getString("CompileQueueProblemDownloading") + (": ") + data->mScriptName;
  395. }
  396. else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
  397. {
  398. LLSD args;
  399. args["MESSAGE"] = LLTrans::getString("CompileQueueInsufficientPermDownload");
  400. LLNotificationsUtil::add("SystemMessage", args);
  401. buffer = LLTrans::getString("CompileQueueInsufficientPermFor") + (": ") + data->mScriptName;
  402. }
  403. else
  404. {
  405. buffer = LLTrans::getString("CompileQueueUnknownFailure") + (" ") + data->mScriptName;
  406. }
  407. llwarns << "Problem downloading script asset." << llendl;
  408. if(queue) queue->removeItemByItemID(data->mItemId);
  409. }
  410. if(queue && (buffer.size() > 0)) 
  411. {
  412. queue->getChild<LLScrollListCtrl>("queue output")->setCommentText(buffer);
  413. }
  414. delete data;
  415. }
  416. // static
  417. void LLFloaterCompileQueue::onSaveTextComplete(const LLUUID& asset_id, void* user_data, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed)
  418. {
  419. llinfos << "LLFloaterCompileQueue::onSaveTextComplete()" << llendl;
  420. if (status)
  421. {
  422. llwarns << "Unable to save text for script." << llendl;
  423. LLSD args;
  424. args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
  425. LLNotificationsUtil::add("CompileQueueSaveText", args);
  426. }
  427. }
  428. // static
  429. void LLFloaterCompileQueue::onSaveBytecodeComplete(const LLUUID& asset_id, void* user_data, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed)
  430. {
  431. llinfos << "LLFloaterCompileQueue::onSaveBytecodeComplete()" << llendl;
  432. LLCompileQueueData* data = (LLCompileQueueData*)user_data;
  433. LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", data->mQueueID);
  434. if(queue && (0 == status) && data)
  435. {
  436. queue->saveItemByItemID(data->mItemId);
  437. queue->removeItemByItemID(data->mItemId);
  438. }
  439. else
  440. {
  441. llwarns << "Unable to save bytecode for script." << llendl;
  442. LLSD args;
  443. args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
  444. LLNotificationsUtil::add("CompileQueueSaveBytecode", args);
  445. }
  446. delete data;
  447. data = NULL;
  448. }
  449. // compile the file given and save it out.
  450. void LLFloaterCompileQueue::compile(const std::string& filename,
  451. const LLUUID& item_id)
  452. {
  453. LLUUID new_asset_id;
  454. LLTransactionID tid;
  455. tid.generate();
  456. new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
  457. std::string uuid_string;
  458. new_asset_id.toString(uuid_string);
  459. std::string dst_filename;
  460. dst_filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_string) + ".lso";
  461. std::string err_filename;
  462. err_filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_string) + ".out";
  463. gAssetStorage->storeAssetData(filename, tid,
  464.   LLAssetType::AT_LSL_TEXT,
  465.   &onSaveTextComplete, NULL, FALSE);
  466. const BOOL compile_to_mono = FALSE;
  467. if(!lscript_compile(filename.c_str(), dst_filename.c_str(),
  468. err_filename.c_str(), compile_to_mono,
  469. uuid_string.c_str(), gAgent.isGodlike()))
  470. {
  471. llwarns << "compile failed" << llendl;
  472. removeItemByItemID(item_id);
  473. }
  474. else
  475. {
  476. llinfos << "compile successful." << llendl;
  477. // Save LSL bytecode
  478. LLCompileQueueData* data = new LLCompileQueueData(getKey().asUUID(), item_id);
  479. gAssetStorage->storeAssetData(dst_filename, new_asset_id,
  480. LLAssetType::AT_LSL_BYTECODE,
  481. &LLFloaterCompileQueue::onSaveBytecodeComplete,
  482. (void*)data, FALSE);
  483. }
  484. }
  485. void LLFloaterCompileQueue::removeItemByItemID(const LLUUID& asset_id)
  486. {
  487. llinfos << "LLFloaterCompileQueue::removeItemByAssetID()" << llendl;
  488. for(S32 i = 0; i < mCurrentScripts.count(); )
  489. {
  490. if(asset_id == mCurrentScripts.get(i)->getUUID())
  491. {
  492. mCurrentScripts.remove(i);
  493. }
  494. else
  495. {
  496. ++i;
  497. }
  498. }
  499. if(mCurrentScripts.count() == 0)
  500. {
  501. nextObject();
  502. }
  503. }
  504. const LLInventoryItem* LLFloaterCompileQueue::findItemByItemID(const LLUUID& asset_id) const
  505. {
  506. LLInventoryItem* result = NULL;
  507. S32 count = mCurrentScripts.count();
  508. for(S32 i = 0; i < count; ++i)
  509. {
  510. if(asset_id == mCurrentScripts.get(i)->getUUID())
  511. {
  512. result = mCurrentScripts.get(i);
  513. }
  514. }
  515. return result;
  516. }
  517. void LLFloaterCompileQueue::saveItemByItemID(const LLUUID& asset_id)
  518. {
  519. llinfos << "LLFloaterCompileQueue::saveItemByAssetID()" << llendl;
  520. LLViewerObject* viewer_object = gObjectList.findObject(mCurrentObjectID);
  521. if(viewer_object)
  522. {
  523. S32 count = mCurrentScripts.count();
  524. for(S32 i = 0; i < count; ++i)
  525. {
  526. if(asset_id == mCurrentScripts.get(i)->getUUID())
  527. {
  528. // *FIX: this auto-resets active to TRUE. That might
  529. // be a bad idea.
  530. viewer_object->saveScript(mCurrentScripts.get(i), TRUE, false);
  531. }
  532. }
  533. }
  534. else
  535. {
  536. llwarns << "Unable to finish save!" << llendl;
  537. }
  538. }
  539. ///----------------------------------------------------------------------------
  540. /// Class LLFloaterResetQueue
  541. ///----------------------------------------------------------------------------
  542. LLFloaterResetQueue::LLFloaterResetQueue(const LLSD& key)
  543.   : LLFloaterScriptQueue(key)
  544. {
  545. setTitle(LLTrans::getString("ResetQueueTitle"));
  546. setStartString(LLTrans::getString("ResetQueueStart"));
  547. }
  548. LLFloaterResetQueue::~LLFloaterResetQueue()
  549. }
  550. void LLFloaterResetQueue::handleInventory(LLViewerObject* viewer_obj,
  551.   InventoryObjectList* inv)
  552. {
  553. // find all of the lsl, leaving off duplicates. We'll remove
  554. // all matching asset uuids on compilation success.
  555. LLDynamicArray<const char*> names;
  556. InventoryObjectList::const_iterator it = inv->begin();
  557. InventoryObjectList::const_iterator end = inv->end();
  558. for ( ; it != end; ++it)
  559. {
  560. if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
  561. {
  562. LLViewerObject* object = gObjectList.findObject(viewer_obj->getID());
  563. if (object)
  564. {
  565. LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
  566. std::string buffer;
  567. buffer = getString("Resetting") + (": ") + item->getName();
  568. getChild<LLScrollListCtrl>("queue output")->setCommentText(buffer);
  569. LLMessageSystem* msg = gMessageSystem;
  570. msg->newMessageFast(_PREHASH_ScriptReset);
  571. msg->nextBlockFast(_PREHASH_AgentData);
  572. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  573. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  574. msg->nextBlockFast(_PREHASH_Script);
  575. msg->addUUIDFast(_PREHASH_ObjectID, viewer_obj->getID());
  576. msg->addUUIDFast(_PREHASH_ItemID, (*it)->getUUID());
  577. msg->sendReliable(object->getRegion()->getHost());
  578. }
  579. }
  580. }
  581. nextObject();
  582. }
  583. ///----------------------------------------------------------------------------
  584. /// Class LLFloaterRunQueue
  585. ///----------------------------------------------------------------------------
  586. LLFloaterRunQueue::LLFloaterRunQueue(const LLSD& key)
  587.   : LLFloaterScriptQueue(key)
  588. {
  589. setTitle(LLTrans::getString("RunQueueTitle"));
  590. setStartString(LLTrans::getString("RunQueueStart"));
  591. }
  592. LLFloaterRunQueue::~LLFloaterRunQueue()
  593. }
  594. void LLFloaterRunQueue::handleInventory(LLViewerObject* viewer_obj,
  595.   InventoryObjectList* inv)
  596. {
  597. // find all of the lsl, leaving off duplicates. We'll remove
  598. // all matching asset uuids on compilation success.
  599. LLDynamicArray<const char*> names;
  600. InventoryObjectList::const_iterator it = inv->begin();
  601. InventoryObjectList::const_iterator end = inv->end();
  602. for ( ; it != end; ++it)
  603. {
  604. if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
  605. {
  606. LLViewerObject* object = gObjectList.findObject(viewer_obj->getID());
  607. if (object)
  608. {
  609. LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
  610. LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
  611. std::string buffer;
  612. buffer = getString("Running") + (": ") + item->getName();
  613. list->setCommentText(buffer);
  614. LLMessageSystem* msg = gMessageSystem;
  615. msg->newMessageFast(_PREHASH_SetScriptRunning);
  616. msg->nextBlockFast(_PREHASH_AgentData);
  617. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  618. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  619. msg->nextBlockFast(_PREHASH_Script);
  620. msg->addUUIDFast(_PREHASH_ObjectID, viewer_obj->getID());
  621. msg->addUUIDFast(_PREHASH_ItemID, (*it)->getUUID());
  622. msg->addBOOLFast(_PREHASH_Running, TRUE);
  623. msg->sendReliable(object->getRegion()->getHost());
  624. }
  625. }
  626. }
  627. nextObject();
  628. }
  629. ///----------------------------------------------------------------------------
  630. /// Class LLFloaterNotRunQueue
  631. ///----------------------------------------------------------------------------
  632. LLFloaterNotRunQueue::LLFloaterNotRunQueue(const LLSD& key)
  633.   : LLFloaterScriptQueue(key)
  634. {
  635. setTitle(LLTrans::getString("NotRunQueueTitle"));
  636. setStartString(LLTrans::getString("NotRunQueueStart"));
  637. }
  638. LLFloaterNotRunQueue::~LLFloaterNotRunQueue()
  639. }
  640. void LLFloaterNotRunQueue::handleInventory(LLViewerObject* viewer_obj,
  641.   InventoryObjectList* inv)
  642. {
  643. // find all of the lsl, leaving off duplicates. We'll remove
  644. // all matching asset uuids on compilation success.
  645. LLDynamicArray<const char*> names;
  646. InventoryObjectList::const_iterator it = inv->begin();
  647. InventoryObjectList::const_iterator end = inv->end();
  648. for ( ; it != end; ++it)
  649. {
  650. if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
  651. {
  652. LLViewerObject* object = gObjectList.findObject(viewer_obj->getID());
  653. if (object)
  654. {
  655. LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
  656. LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
  657. std::string buffer;
  658. buffer = getString("NotRunning") + (": ") +item->getName();
  659. list->setCommentText(buffer);
  660. LLMessageSystem* msg = gMessageSystem;
  661. msg->newMessageFast(_PREHASH_SetScriptRunning);
  662. msg->nextBlockFast(_PREHASH_AgentData);
  663. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  664. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  665. msg->nextBlockFast(_PREHASH_Script);
  666. msg->addUUIDFast(_PREHASH_ObjectID, viewer_obj->getID());
  667. msg->addUUIDFast(_PREHASH_ItemID, (*it)->getUUID());
  668. msg->addBOOLFast(_PREHASH_Running, FALSE);
  669. msg->sendReliable(object->getRegion()->getHost());
  670. }
  671. }
  672. }
  673. nextObject();
  674. }
  675. ///----------------------------------------------------------------------------
  676. /// Local function definitions
  677. ///----------------------------------------------------------------------------