bool FSLSLBridge :: lslToViewer(std::string message, LLUUID fromID, LLUUID ownerID) { if (!gSavedSettings.getBOOL("UseLSLBridge")) return false; llinfos << message << llendl; std::string tag = message.substr(0,11); if (tag == "<bridgeURL>") { // get the content of the message, between <tag> and </tag> mCurrentURL = message.substr(tag.length(), message.length() - ((tag.length() * 2) + 1)); llinfos << "New URL is: " << mCurrentURL << llendl; if (mpBridge == NULL) { LLUUID catID = findFSCategory(); LLViewerInventoryItem* fsBridge = findInvObject(mCurrentFullName, catID, LLAssetType::AT_OBJECT); if (fsBridge != NULL) mpBridge = fsBridge; } return viewerToLSL("URL Confirmed", new FSLSLBridgeRequestResponder()); } return false; }
bool FSLSLBridge::updateBoolSettingValue(std::string msgVal, bool contentVal) { std::string boolVal = "0"; if (contentVal) { boolVal = "1"; } return viewerToLSL(msgVal + "|" + boolVal, new FSLSLBridgeRequestResponder()); }
bool FSLSLBridge::updateBoolSettingValue(std::string msgVal) { std::string boolVal = "0"; if (gSavedSettings.getBOOL(msgVal)) { boolVal = "1"; } return viewerToLSL(msgVal + "|" + boolVal, new FSLSLBridgeRequestResponder()); }
bool FSLSLBridge::lslToViewer(std::string message, LLUUID fromID, LLUUID ownerID) { if (!gSavedSettings.getBOOL("UseLSLBridge")) { return false; } lldebugs << message << llendl; //<FS:TS> FIRE-962: Script controls for built-in AO if ((message[0]) != '<') { return false; // quick exit if no leading < } S32 closebracket = message.find('>'); S32 firstblank = message.find(' '); S32 tagend; if (closebracket == std::string::npos) { tagend = firstblank; } else if (firstblank == std::string::npos) { tagend = closebracket; } else { tagend = (closebracket < firstblank) ? closebracket : firstblank; } if (tagend == std::string::npos) { return false; } std::string tag = message.substr(0, tagend + 1); std::string ourBridge = gSavedPerAccountSettings.getString("FSLSLBridgeUUID"); //</FS:TS> FIRE-962 bool status = false; if (tag == "<bridgeURL>") { // brutish parsing S32 urlStart = message.find("<bridgeURL>") + 11; S32 urlEnd = message.find("</bridgeURL>"); S32 authStart = message.find("<bridgeAuth>") + 12; S32 authEnd = message.find("</bridgeAuth>"); S32 verStart = message.find("<bridgeVer>") + 11; S32 verEnd = message.find("</bridgeVer>"); std::string bURL = message.substr(urlStart,urlEnd - urlStart); std::string bAuth = message.substr(authStart,authEnd - authStart); std::string bVer = message.substr(verStart,verEnd - verStart); // Verify Version // todo // Verify Authorization if (ourBridge != bAuth) { llwarns << "BridgeURL message received from ("<< bAuth <<") , but not from our registered bridge ("<< ourBridge <<"). Ignoring." << llendl; // Failing bridge authorization automatically kicks off a bridge rebuild. This correctly handles the // case where a user logs in from multiple computers which cannot have the bridgeAuth ID locally // synchronized. // If something that looks like our current bridge is attached but failed auth, detach and recreate. LLUUID catID = findFSCategory(); LLViewerInventoryItem* fsBridge = findInvObject(mCurrentFullName, catID, LLAssetType::AT_OBJECT); if (fsBridge != NULL) { if (get_is_item_worn(fsBridge->getUUID())) { LLVOAvatarSelf::detachAttachmentIntoInventory(fsBridge->getUUID()); //This may have been an unfinished bridge. If so - stop the process before recreating. if (mBridgeCreating) mBridgeCreating = false; recreateBridge(); return true; } } // If something that didn't look like our current bridge failed auth, don't recreate, it might interfere with a bridge creation in progress // or normal bridge startup. Bridge creation isn't threadsafe yet. return true; } // Save the inworld UUID of this attached bridge for later checking mBridgeUUID = fromID; // Get URL mCurrentURL = bURL; llinfos << "New Bridge URL is: " << mCurrentURL << llendl; if (mpBridge == NULL) { LLUUID catID = findFSCategory(); LLViewerInventoryItem* fsBridge = findInvObject(mCurrentFullName, catID, LLAssetType::AT_OBJECT); mpBridge = fsBridge; } status = viewerToLSL("URL Confirmed", new FSLSLBridgeRequestResponder()); //updateBoolSettingValue("UseLSLFlightAssist"); if (!mIsFirstCallDone) { //on first call from bridge, confirm that we are here //then check options use updateBoolSettingValue("UseLSLFlightAssist"); updateBoolSettingValue("FSPublishRadarTag"); mIsFirstCallDone = true; } return true; } //<FS:TS> FIRE-962: Script controls for built-in AO if (fromID != mBridgeUUID) { return false; // ignore if not from the bridge } if (tag == "<clientAO ") { status = true; S32 valuepos = message.find("state=") + 6; if (valuepos != std::string::npos) { if (message.substr(valuepos, 2) == "on") { gSavedPerAccountSettings.setBOOL("UseAO", TRUE); } else if (message.substr(valuepos, 3) == "off") { gSavedPerAccountSettings.setBOOL("UseAO", FALSE); } } } //</FS:TS> FIRE-962 return status; }