diff options
Diffstat (limited to 'indra')
-rw-r--r-- | indra/lib/python/indra/base/llsd.py | 11 | ||||
-rw-r--r-- | indra/llcommon/indra_constants.h | 13 | ||||
-rw-r--r-- | indra/llcommon/llapp.cpp | 26 | ||||
-rw-r--r-- | indra/llcommon/llapp.h | 8 | ||||
-rw-r--r-- | indra/llcommon/llversionserver.h | 4 | ||||
-rw-r--r-- | indra/llmessage/llcircuit.cpp | 33 | ||||
-rw-r--r-- | indra/llmessage/llcircuit.h | 16 | ||||
-rw-r--r-- | indra/llmessage/llregionflags.h | 8 | ||||
-rw-r--r-- | indra/llmessage/message.cpp | 12 | ||||
-rw-r--r-- | indra/llmessage/message.h | 9 | ||||
-rw-r--r-- | indra/lscript/lscript_compile/indra.l | 27 | ||||
-rw-r--r-- | indra/lscript/lscript_compile/lscript_tree.cpp | 4 | ||||
-rw-r--r-- | indra/lscript/lscript_execute/lscript_execute.cpp | 9 | ||||
-rw-r--r-- | indra/newview/llinventorybridge.cpp | 47 | ||||
-rw-r--r-- | indra/newview/llinventorybridge.h | 3 | ||||
-rw-r--r-- | indra/newview/llstartup.cpp | 14 | ||||
-rw-r--r-- | indra/test/lltemplatemessagebuilder_tut.cpp | 7 | ||||
-rw-r--r-- | indra/test/message_tut.cpp | 8 |
18 files changed, 202 insertions, 57 deletions
diff --git a/indra/lib/python/indra/base/llsd.py b/indra/lib/python/indra/base/llsd.py index 057d4e31dc..e6141b6265 100644 --- a/indra/lib/python/indra/base/llsd.py +++ b/indra/lib/python/indra/base/llsd.py @@ -36,10 +36,13 @@ import re from indra.util.fastest_elementtree import ElementTreeError, fromstring from indra.base import lluuid -try: - import cllsd -except ImportError: - cllsd = None +# cllsd.c in server/server-1.25 has memory leaks, +# so disabling cllsd for now +#try: +# import cllsd +#except ImportError: +# cllsd = None +cllsd = None int_regex = re.compile(r"[-+]?\d+") real_regex = re.compile(r"[-+]?(\d+(\.\d*)?|\d*\.\d+)([eE][-+]?\d+)?") diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index a3e3aec360..c13113a9f2 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2001&license=viewergpl$ * - * Copyright (c) 2001-2007, Linden Research, Inc. + * Copyright (c) 2001-2008, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -77,6 +77,14 @@ enum LAND_STAT_REPORT_TYPE const U32 STAT_FILTER_MASK = 0x1FFFFFFF; +// Region absolute limits +static const S32 REGION_AGENT_COUNT_MIN = 1; +static const S32 REGION_AGENT_COUNT_MAX = 200; // Must fit in U8 for the moment (RegionInfo msg) +static const S32 REGION_PRIM_COUNT_MIN = 0; +static const S32 REGION_PRIM_COUNT_MAX = 40000; +static const F32 REGION_PRIM_BONUS_MIN = 1.0; +static const F32 REGION_PRIM_BONUS_MAX = 10.0; + // Default maximum number of tasks/prims per region. const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000; @@ -229,10 +237,11 @@ const S32 KEY_COUNT = 256; const F32 DEFAULT_WATER_HEIGHT = 20.0f; // Maturity ratings for simulators -const U8 SIM_ACCESS_MIN = 0; +const U8 SIM_ACCESS_MIN = 0; // Treated as 'unknown', usually ends up being SIM_ACCESS_PG const U8 SIM_ACCESS_TRIAL = 7; const U8 SIM_ACCESS_PG = 13; const U8 SIM_ACCESS_MATURE = 21; +const U8 SIM_ACCESS_ADULT = 42; // Seriously Adult Only const U8 SIM_ACCESS_DOWN = 254; const U8 SIM_ACCESS_MAX = SIM_ACCESS_MATURE; diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 8826251617..c2f93b51ac 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -89,6 +89,12 @@ LLAppChildCallback LLApp::sDefaultChildCallback = NULL; LLApp::LLApp() : mThreadErrorp(NULL) { + commonCtor(); + startErrorThread(); +} + +void LLApp::commonCtor() +{ // Set our status to running setStatus(APP_STATUS_RUNNING); @@ -96,9 +102,9 @@ LLApp::LLApp() : mThreadErrorp(NULL) #if !LL_WINDOWS // This must be initialized before the error handler. - sSigChildCount = new LLAtomicU32(0); + sSigChildCount = new LLAtomicU32(0); #endif - + // Setup error handling setupErrorHandling(); @@ -118,6 +124,13 @@ LLApp::LLApp() : mThreadErrorp(NULL) // Set the application to this instance. sApplication = this; + +} + +LLApp::LLApp(LLErrorThread *error_thread) : + mThreadErrorp(error_thread) +{ + commonCtor(); } @@ -261,17 +274,20 @@ void LLApp::setupErrorHandling() #endif +} + +void LLApp::startErrorThread() +{ // // Start the error handling thread, which is responsible for taking action // when the app goes into the APP_STATUS_ERROR state // - llinfos << "LLApp::setupErrorHandling - Starting error thread" << llendl; + llinfos << "Starting error thread" << llendl; mThreadErrorp = new LLErrorThread(); mThreadErrorp->setUserData((void *) this); - mThreadErrorp->start(); + mThreadErrorp->start(); } - void LLApp::setErrorHandler(LLAppErrorHandler handler) { LLApp::sErrorHandler = handler; diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index c5a1546883..4142f8ece2 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -77,6 +77,11 @@ public: LLApp(); virtual ~LLApp(); +protected: + LLApp(LLErrorThread* error_thread); + void commonCtor(); +public: + /** * @brief Return the static app instance if one was created. */ @@ -245,8 +250,9 @@ protected: void stepFrame(); private: + void startErrorThread(); + void setupErrorHandling(); // Do platform-specific error-handling setup (signals, structured exceptions) - static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred. static void runSyncErrorHandler(); // run IMMEDIATELY when we get an error, ran in the context of the faulting thread. diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h index aa3d580dc1..2b5c48fd15 100644 --- a/indra/llcommon/llversionserver.h +++ b/indra/llcommon/llversionserver.h @@ -33,9 +33,9 @@ #define LL_LLVERSIONSERVER_H const S32 LL_VERSION_MAJOR = 1; -const S32 LL_VERSION_MINOR = 25; +const S32 LL_VERSION_MINOR = 26; const S32 LL_VERSION_PATCH = 0; -const S32 LL_VERSION_BUILD = 104413; +const S32 LL_VERSION_BUILD = 103578; const char * const LL_CHANNEL = "Second Life Server"; diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp index 9ad84d8242..cc05e9bf47 100644 --- a/indra/llmessage/llcircuit.cpp +++ b/indra/llmessage/llcircuit.cpp @@ -62,7 +62,6 @@ #include "lltransfermanager.h" #include "llmodularmath.h" -const F32 PING_INTERVAL = 5.f; // seconds const S32 PING_START_BLOCK = 3; // How many pings behind we have to be to consider ourself blocked. const S32 PING_RELEASE_BLOCK = 2; // How many pings behind we have to be to consider ourself unblocked. @@ -70,7 +69,8 @@ const F32 TARGET_PERIOD_LENGTH = 5.f; // seconds const F32 LL_DUPLICATE_SUPPRESSION_TIMEOUT = 60.f; //seconds - this can be long, as time-based cleanup is // only done when wrapping packetids, now... -LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id) +LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id, + const F32 circuit_heartbeat_interval, const F32 circuit_timeout) : mHost (host), mWrapID(0), mPacketsOutID(0), @@ -105,7 +105,9 @@ LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id) mPeakBPSOut(0), mPeriodTime(0.0), mExistenceTimer(), - mCurrentResendCount(0) + mCurrentResendCount(0), + mHeartbeatInterval(circuit_heartbeat_interval), + mHeartbeatTimeout(circuit_timeout) { // Need to guarantee that this time is up to date, we may be creating a circuit even though we haven't been // running a message system loop. @@ -113,9 +115,9 @@ LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id) F32 distribution_offset = ll_frand(); mPingTime = mt_sec; - mLastPingSendTime = mt_sec + PING_INTERVAL * distribution_offset; + mLastPingSendTime = mt_sec + mHeartbeatInterval * distribution_offset; mLastPingReceivedTime = mt_sec; - mNextPingSendTime = mLastPingSendTime + 0.95*PING_INTERVAL + ll_frand(0.1f*PING_INTERVAL); + mNextPingSendTime = mLastPingSendTime + 0.95*mHeartbeatInterval + ll_frand(0.1f*mHeartbeatInterval); mPeriodTime = mt_sec; mTimeoutCallback = NULL; @@ -429,7 +431,8 @@ S32 LLCircuitData::resendUnackedPackets(const F64 now) } -LLCircuit::LLCircuit() : mLastCircuit(NULL) +LLCircuit::LLCircuit(const F32 circuit_heartbeat_interval, const F32 circuit_timeout) : mLastCircuit(NULL), + mHeartbeatInterval(circuit_heartbeat_interval), mHeartbeatTimeout(circuit_timeout) { } @@ -447,7 +450,7 @@ LLCircuitData *LLCircuit::addCircuitData(const LLHost &host, TPACKETID in_id) { // This should really validate if one already exists llinfos << "LLCircuit::addCircuitData for " << host << llendl; - LLCircuitData *tempp = new LLCircuitData(host, in_id); + LLCircuitData *tempp = new LLCircuitData(host, in_id, mHeartbeatInterval, mHeartbeatTimeout); mCircuitData.insert(circuit_data_map::value_type(host, tempp)); mPingSet.insert(tempp); @@ -801,7 +804,7 @@ void LLCircuit::updateWatchDogTimers(LLMessageSystem *msgsys) // Always remember to remove it from the set before changing the sorting // key (mNextPingSendTime) mPingSet.erase(psit); - cdp->mNextPingSendTime = cur_time + PING_INTERVAL; + cdp->mNextPingSendTime = cur_time + mHeartbeatInterval; mPingSet.insert(cdp); continue; } @@ -819,7 +822,7 @@ void LLCircuit::updateWatchDogTimers(LLMessageSystem *msgsys) if (cdp->updateWatchDogTimers(msgsys)) { // Randomize our pings a bit by doing some up to 5% early or late - F64 dt = 0.95f*PING_INTERVAL + ll_frand(0.1f*PING_INTERVAL); + F64 dt = 0.95f*mHeartbeatInterval + ll_frand(0.1f*mHeartbeatInterval); // Remove it, and reinsert it with the new next ping time. // Always remove before changing the sorting key. @@ -1047,7 +1050,7 @@ BOOL LLCircuitData::checkCircuitTimeout() F64 time_since_last_ping = LLMessageSystem::getMessageTimeSeconds() - mLastPingReceivedTime; // Nota Bene: This needs to be turned off if you are debugging multiple simulators - if (time_since_last_ping > PING_INTERVAL_MAX) + if (time_since_last_ping > mHeartbeatTimeout) { llwarns << "LLCircuitData::checkCircuitTimeout for " << mHost << " last ping " << time_since_last_ping << " seconds ago." <<llendl; setAlive(FALSE); @@ -1063,10 +1066,7 @@ BOOL LLCircuitData::checkCircuitTimeout() return FALSE; } } - else if (time_since_last_ping > PING_INTERVAL_ALARM) - { - //llwarns << "Unresponsive circuit: " << mHost << ": " << time_since_last_ping << " seconds since last ping."<< llendl; - } + return TRUE; } @@ -1280,7 +1280,7 @@ void LLCircuitData::pingTimerStop(const U8 ping_id) delta_ping += 256; } - U32 msec = (U32) ((delta_ping*PING_INTERVAL + time) * 1000.f); + U32 msec = (U32) ((delta_ping*mHeartbeatInterval + time) * 1000.f); setPingDelay(msec); mPingsInTransit = delta_ping; @@ -1371,7 +1371,8 @@ F32 LLCircuitData::getPingInTransitTime() if (mPingsInTransit) { - time_since_ping_was_sent = (F32)((mPingsInTransit*PING_INTERVAL - 1) + (LLMessageSystem::getMessageTimeSeconds() - mPingTime))*1000.f; + time_since_ping_was_sent = (F32)((mPingsInTransit*mHeartbeatInterval - 1) + + (LLMessageSystem::getMessageTimeSeconds() - mPingTime))*1000.f; } return time_since_ping_was_sent; diff --git a/indra/llmessage/llcircuit.h b/indra/llmessage/llcircuit.h index 492313da93..99da6e7aaf 100644 --- a/indra/llmessage/llcircuit.h +++ b/indra/llmessage/llcircuit.h @@ -50,10 +50,6 @@ // // Constants // -const F32 PING_INTERVAL_MAX = 100.f; -const F32 PING_INTERVAL_ALARM = 50.f; - - const F32 LL_AVERAGED_PING_ALPHA = 0.2f; // relaxation constant on ping running average const F32 LL_AVERAGED_PING_MAX = 2000; // msec const F32 LL_AVERAGED_PING_MIN = 100; // msec // IW: increased to avoid retransmits when a process is slow @@ -85,7 +81,8 @@ class LLSD; class LLCircuitData { public: - LLCircuitData(const LLHost &host, TPACKETID in_id); + LLCircuitData(const LLHost &host, TPACKETID in_id, + const F32 circuit_heartbeat_interval, const F32 circuit_timeout); ~LLCircuitData(); S32 resendUnackedPackets(const F64 now); @@ -283,6 +280,9 @@ protected: S32 mCurrentResendCount; // Number of resent packets since last spam LLStatRate mOutOfOrderRate; // Rate of out of order packets coming in. U32 mLastPacketGap; // Gap in sequence number of last packet. + + const F32 mHeartbeatInterval; + const F32 mHeartbeatTimeout; }; @@ -292,7 +292,7 @@ class LLCircuit { public: // CREATORS - LLCircuit(); + LLCircuit(const F32 circuit_heartbeat_interval, const F32 circuit_timeout); ~LLCircuit(); // ACCESSORS @@ -345,5 +345,9 @@ protected: // optimize the many, many times we call findCircuit. This may be // set in otherwise const methods, so it is declared mutable. mutable LLCircuitData* mLastCircuit; + +private: + const F32 mHeartbeatInterval; + const F32 mHeartbeatTimeout; }; #endif diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index 972a184a62..53a1e4ea1a 100644 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2002&license=viewergpl$ * - * Copyright (c) 2002-2007, Linden Research, Inc. + * Copyright (c) 2002-2008, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -60,8 +60,10 @@ const U32 REGION_FLAGS_BLOCK_LAND_RESELL = (1 << 7); // All content wiped once per night const U32 REGION_FLAGS_SANDBOX = (1 << 8); const U32 REGION_FLAGS_NULL_LAYER = (1 << 9); -const U32 REGION_FLAGS_SKIP_AGENT_ACTION = (1 << 10); -const U32 REGION_FLAGS_SKIP_UPDATE_INTEREST_LIST= (1 << 11); +// const U32 REGION_FLAGS_SKIP_AGENT_ACTION = (1 << 10); +const U32 REGION_FLAGS_HARD_ALLOW_LAND_TRANSFER = (1 << 10); // Region allows land reselling +// const U32 REGION_FLAGS_SKIP_UPDATE_INTEREST_LIST= (1 << 11); +const U32 REGION_FLAGS_HARD_ALLOW_POST_CLASSIFIED = (1 << 11); // Region allows posting of classified ads const U32 REGION_FLAGS_SKIP_COLLISIONS = (1 << 12); // Pin all non agent rigid bodies const U32 REGION_FLAGS_SKIP_SCRIPTS = (1 << 13); const U32 REGION_FLAGS_SKIP_PHYSICS = (1 << 14); // Skip all physics diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index 0e2a5cbf7f..7c304bd00b 100644 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -290,7 +290,9 @@ LLMessageSystem::LLMessageSystem(const std::string& filename, U32 port, S32 version_major, S32 version_minor, S32 version_patch, - bool failure_is_fatal) + bool failure_is_fatal, + const F32 circuit_heartbeat_interval, const F32 circuit_timeout) : + mCircuitInfo(circuit_heartbeat_interval, circuit_timeout) { init(); @@ -2496,7 +2498,9 @@ bool start_messaging_system( bool b_dump_prehash_file, const std::string& secret, const LLUseCircuitCodeResponder* responder, - bool failure_is_fatal) + bool failure_is_fatal, + const F32 circuit_heartbeat_interval, + const F32 circuit_timeout) { gMessageSystem = new LLMessageSystem( template_name, @@ -2504,7 +2508,9 @@ bool start_messaging_system( version_major, version_minor, version_patch, - failure_is_fatal); + failure_is_fatal, + circuit_heartbeat_interval, + circuit_timeout); g_shared_secret.assign(secret); if (!gMessageSystem) diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h index 46fa3251de..2f10b149c6 100644 --- a/indra/llmessage/message.h +++ b/indra/llmessage/message.h @@ -285,7 +285,8 @@ public: // Read file and build message templates LLMessageSystem(const std::string& filename, U32 port, S32 version_major, S32 version_minor, S32 version_patch, - bool failure_is_fatal = true); + bool failure_is_fatal, + const F32 circuit_heartbeat_interval, const F32 circuit_timeout); ~LLMessageSystem(); @@ -780,8 +781,10 @@ bool start_messaging_system( S32 version_patch, bool b_dump_prehash_file, const std::string& secret, - const LLUseCircuitCodeResponder* responder = NULL, - bool failure_is_fatal = true); + const LLUseCircuitCodeResponder* responder, + bool failure_is_fatal, + const F32 circuit_heartbeat_interval, + const F32 circuit_timeout); void end_messaging_system(); diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l index 3e62195dc8..2616b47c73 100644 --- a/indra/lscript/lscript_compile/indra.l +++ b/indra/lscript/lscript_compile/indra.l @@ -36,7 +36,8 @@ FS (f|F) #include "llclickaction.h" void count(); -void comment(); +void line_comment(); +void block_comment(); void parse_string(); #define YYLMAX 16384 @@ -60,7 +61,8 @@ extern "C" { int yyerror(const char *fmt, ...); } %} %% -"//" { gInternalLine++; gInternalColumn = 0; comment(); } +"//" { gInternalLine++; gInternalColumn = 0; line_comment(); } +"/*" { block_comment(); } "integer" { count(); return(INTEGER); } "float" { count(); return(FLOAT_TYPE); } @@ -790,7 +792,7 @@ S32 yywrap() return(1); } -void comment() +void line_comment() { char c; @@ -798,6 +800,25 @@ void comment() ; } +void block_comment() +{ + char c1 = 0; + char c2 = yyinput(); + while (c2 != 0 && c2 != EOF && !(c1 == '*' && c2 == '/')) { + if (c2 == '\n') + { + gInternalLine++; + gInternalColumn = 0; + } + else if (c2 == '\t') + gInternalColumn += 4 - (gInternalColumn % 8); + else + gInternalColumn++; + c1 = c2; + c2 = yyinput(); + } +} + void count() { S32 i; diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp index 66f8825845..cd2dc87c5e 100644 --- a/indra/lscript/lscript_compile/lscript_tree.cpp +++ b/indra/lscript/lscript_compile/lscript_tree.cpp @@ -630,7 +630,9 @@ static void print_cil_cast(LLFILE* fp, LSCRIPTType srcType, LSCRIPTType targetTy switch(targetType) { case LST_INTEGER: - fprintf(fp, "conv.i4\n"); + //fprintf(fp, "call int32 [LslLibrary]LindenLab.SecondLife.LslRunTime::ToInteger(float32)\n"); + fprintf(fp, "conv.i4\n"); // TODO replace this line with the above + // we the entire grid is > 1.25.1 break; case LST_STRING: fprintf(fp, "call string [LslLibrary]LindenLab.SecondLife.LslRunTime::ToString(float32)\n"); diff --git a/indra/lscript/lscript_execute/lscript_execute.cpp b/indra/lscript/lscript_execute/lscript_execute.cpp index 52e3af320c..6280719748 100644 --- a/indra/lscript/lscript_execute/lscript_execute.cpp +++ b/indra/lscript/lscript_execute/lscript_execute.cpp @@ -891,14 +891,13 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id, b_done = TRUE; } - while (!b_done) + if (!b_done) { // Call handler for next queued event. if(getEventCount() > 0) { ++events_processed; callNextQueuedEventHandler(event_register, id, quanta); - b_done = TRUE; } else { @@ -910,8 +909,8 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id, ++events_processed; callEventHandler(event, id, quanta); } - b_done = TRUE; } + b_done = TRUE; } } } @@ -946,6 +945,10 @@ F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **erro timer_checks = 0; } } + if (inloop == 0.0f) + { + inloop = timer.getElapsedTimeF32(); + } return inloop; } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index d3671239bb..a4b80ed7c1 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -755,6 +755,10 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, model->deleteObject(mUUID); model->notifyObservers(); } + else if ("restoreToWorld" == action) + { + restoreToWorld(); + } else if ("restore" == action) { restoreItem(); @@ -811,6 +815,47 @@ void LLItemBridge::restoreItem() } } +void LLItemBridge::restoreToWorld() +{ + LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem(); + if (itemp) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("RezRestoreToWorld"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlockFast(_PREHASH_InventoryData); + itemp->packMessage(msg); + msg->sendReliable(gAgent.getRegion()->getHost()); + } + + //Similar functionality to the drag and drop rez logic + BOOL remove_from_inventory = FALSE; + + //remove local inventory copy, sim will deal with permissions and removing the item + //from the actual inventory if its a no-copy etc + if(!itemp->getPermissions().allowCopyBy(gAgent.getID())) + { + remove_from_inventory = TRUE; + } + + // Check if it's in the trash. (again similar to the normal rez logic) + LLUUID trash_id; + trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) + { + remove_from_inventory = TRUE; + } + + if(remove_from_inventory) + { + gInventory.deleteObject(itemp->getUUID()); + gInventory.notifyObservers(); + } +} + LLUIImagePtr LLItemBridge::getIcon() const { return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]); @@ -3375,6 +3420,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) items.push_back(std::string("Object Wear")); items.push_back(std::string("Attach To")); items.push_back(std::string("Attach To HUD")); + items.push_back(std::string("Restore to Last Position")); LLMenuGL* attach_menu = menu.getChildMenuByName("Attach To", TRUE); LLMenuGL* attach_hud_menu = menu.getChildMenuByName("Attach To HUD", TRUE); @@ -4363,7 +4409,6 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) items.push_back(std::string("Wearable Wear")); items.push_back(std::string("Wearable Edit")); - if ((flags & FIRST_SELECTED_ITEM) == 0) { disabled_items.push_back(std::string("Wearable Edit")); diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index d038c10c73..5df3ba23af 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -159,6 +159,7 @@ public: virtual const std::string& getPrefix() { return LLStringUtil::null; } virtual void restoreItem() {} + virtual void restoreToWorld() {} // LLFolderViewEventListener functions virtual const std::string& getName() const; @@ -234,6 +235,7 @@ public: virtual void selectItem(); virtual void restoreItem(); + virtual void restoreToWorld(); virtual LLUIImagePtr getIcon() const; virtual const std::string& getDisplayName() const; @@ -274,7 +276,6 @@ public: virtual void selectItem(); virtual void restoreItem(); - virtual LLUIImagePtr getIcon() const; virtual BOOL renameItem(const std::string& new_name); virtual BOOL removeItem(); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 21af491408..ca310cf8e4 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -478,6 +478,14 @@ bool idle_startup() } LLHTTPSender::setDefaultSender(new LLNullHTTPSender()); + + // TODO parameterize + const F32 circuit_heartbeat_interval = 5; + const F32 circuit_timeout = 100; + + const LLUseCircuitCodeResponder* responder = NULL; + bool failure_is_fatal = true; + if(!start_messaging_system( message_template_path, port, @@ -485,7 +493,11 @@ bool idle_startup() LL_VERSION_MINOR, LL_VERSION_PATCH, FALSE, - std::string())) + std::string(), + responder, + failure_is_fatal, + circuit_heartbeat_interval, + circuit_timeout)) { std::string msg = LLTrans::getString("LoginFailedNoNetwork"); msg.append(llformat(" Error: %d", gMessageSystem->getErrorCode())); diff --git a/indra/test/lltemplatemessagebuilder_tut.cpp b/indra/test/lltemplatemessagebuilder_tut.cpp index 52d1436761..c71d63a2d7 100644 --- a/indra/test/lltemplatemessagebuilder_tut.cpp +++ b/indra/test/lltemplatemessagebuilder_tut.cpp @@ -59,6 +59,9 @@ namespace tut if(! init) { ll_init_apr(); + const F32 circuit_heartbeat_interval=5; + const F32 circuit_timeout=100; + start_messaging_system("notafile", 13035, LL_VERSION_MAJOR, LL_VERSION_MINOR, @@ -66,7 +69,9 @@ namespace tut FALSE, "notasharedsecret", NULL, - false); + false, + circuit_heartbeat_interval, + circuit_timeout); //init_prehash_data(); init = true; } diff --git a/indra/test/message_tut.cpp b/indra/test/message_tut.cpp index d426511d24..0cafdcd679 100644 --- a/indra/test/message_tut.cpp +++ b/indra/test/message_tut.cpp @@ -70,6 +70,9 @@ namespace tut //init_prehash_data(); init = true; } + const F32 circuit_heartbeat_interval=5; + const F32 circuit_timeout=100; + // currently test disconnected message system start_messaging_system("notafile", 13035, @@ -79,7 +82,10 @@ namespace tut FALSE, "notasharedsecret", NULL, - false); + false, + circuit_heartbeat_interval, + circuit_timeout + ); // generate temp dir std::ostringstream ostr; #if LL_WINDOWS |