summaryrefslogtreecommitdiff
path: root/indra/newview/llviewermessage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llviewermessage.cpp')
-rw-r--r--indra/newview/llviewermessage.cpp212
1 files changed, 153 insertions, 59 deletions
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 1676cc782c..c929e81ea4 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -33,7 +33,9 @@
#include "llviewerprecompiledheaders.h"
#include "llviewermessage.h"
+#include "llanimationstates.h"
#include "llaudioengine.h"
+#include "llavataractions.h"
#include "lscript_byteformat.h"
#include "lleconomy.h"
#include "llfloaterreg.h"
@@ -49,7 +51,7 @@
#include "llagent.h"
#include "llcallingcard.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llfloaterbuycurrency.h"
#include "llfloaterbuyland.h"
#include "llfloaterchat.h"
@@ -192,19 +194,25 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
msg->sendReliable(LLHost(payload["sender"].asString()));
break;
}
- case 1:
- {
- // decline
- // We no longer notify other viewers, but we DO still send
- // the rejection to the simulator to delete the pending userop.
- msg->newMessageFast(_PREHASH_DeclineFriendship);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_TransactionBlock);
- msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
- msg->sendReliable(LLHost(payload["sender"].asString()));
- break;
+ case 1: // Decline
+ case 2: // Send IM - decline and start IM session
+ {
+ // decline
+ // We no longer notify other viewers, but we DO still send
+ // the rejection to the simulator to delete the pending userop.
+ msg->newMessageFast(_PREHASH_DeclineFriendship);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_TransactionBlock);
+ msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
+ msg->sendReliable(LLHost(payload["sender"].asString()));
+
+ // start IM session
+ if(2 == option)
+ {
+ LLAvatarActions::startIM(payload["from_id"].asUUID());
+ }
}
default:
// close button probably, possibly timed out
@@ -703,6 +711,18 @@ protected:
}
};
+class LLOpenTaskGroupOffer : public LLInventoryAddedObserver
+{
+protected:
+ /*virtual*/ void done()
+ {
+ open_inventory_offer(mAdded, "group_offer");
+ mAdded.clear();
+ gInventory.removeObserver(this);
+ delete this;
+ }
+};
+
//one global instance to bind them
LLOpenTaskOffer* gNewInventoryObserver=NULL;
@@ -718,6 +738,7 @@ void start_new_inventory_observer()
class LLDiscardAgentOffer : public LLInventoryFetchComboObserver
{
+ LOG_CLASS(LLDiscardAgentOffer);
public:
LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) :
mFolderID(folder_id),
@@ -896,7 +917,19 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
LLPanelPlaces *places_panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->showPanel("panel_places", LLSD()));
if (places_panel)
{
- places_panel->setItem(item);
+ // we are creating a landmark
+ if("create_landmark" == places_panel->getPlaceInfoType() && !places_panel->getItem())
+ {
+ places_panel->setItem(item);
+ }
+ // we are opening a group notice attachment
+ else
+ {
+ LLSD args;
+ args["type"] = "landmark";
+ args["id"] = item_id;
+ LLSideTray::getInstance()->showPanel("panel_places", args);
+ }
}
}
}
@@ -906,6 +939,15 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
LLFloaterReg::showInstance("preview_texture", LLSD(item_id), take_focus);
break;
}
+ case LLAssetType::AT_ANIMATION:
+ LLFloaterReg::showInstance("preview_anim", LLSD(item_id), take_focus);
+ break;
+ case LLAssetType::AT_SCRIPT:
+ LLFloaterReg::showInstance("preview_script", LLSD(item_id), take_focus);
+ break;
+ case LLAssetType::AT_SOUND:
+ LLFloaterReg::showInstance("preview_sound", LLSD(item_id), take_focus);
+ break;
default:
break;
}
@@ -1073,33 +1115,11 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
// * callback may be called immediately,
// * adding the mute sends a message,
// * we can't build two messages at once.
- if (2 == button)
+ if (2 == button) // Block
{
gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4,this));
}
- // *NOTE dzaporozhan
- // Restored from viewer-1-23 to fix EXT-3520
- // Saves Group Notice Attachments to inventory.
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_MessageBlock);
- msg->addBOOLFast(_PREHASH_FromGroup, FALSE);
- msg->addUUIDFast(_PREHASH_ToAgentID, mFromID);
- msg->addU8Fast(_PREHASH_Offline, IM_ONLINE);
- msg->addUUIDFast(_PREHASH_ID, mTransactionID);
- msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
- std::string name;
- LLAgentUI::buildFullname(name);
- msg->addStringFast(_PREHASH_FromAgentName, name);
- msg->addStringFast(_PREHASH_Message, "");
- msg->addU32Fast(_PREHASH_ParentEstateID, 0);
- msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
- msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
-
std::string from_string; // Used in the pop-up.
std::string chatHistory_string; // Used in chat history.
@@ -1135,8 +1155,11 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
}
}
break;
- case IM_TASK_INVENTORY_OFFERED:
case IM_GROUP_NOTICE:
+ opener = new LLOpenTaskGroupOffer;
+ send_auto_receive_response();
+ break;
+ case IM_TASK_INVENTORY_OFFERED:
case IM_GROUP_NOTICE_REQUESTED:
// This is an offer from a task or group.
// We don't use a new instance of an opener
@@ -1146,15 +1169,11 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
default:
LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL;
break;
- } // end switch (mIM)
-
- // Show falls through to accept.
+ }
+ break;
+ // end switch (mIM)
case IOR_ACCEPT:
- msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1));
- msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData), sizeof(mFolderID.mData));
- msg->sendReliable(mHost);
-
//don't spam them if they are getting flooded
if (check_offer_throttle(mFromName, true))
{
@@ -1177,7 +1196,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
{
chat.mMuted = TRUE;
}
- LLFloaterChat::addChatHistory(chat);
+
+ // *NOTE dzaporozhan
+ // Disabled logging to old chat floater to fix crash in group notices - EXT-4149
+ // LLFloaterChat::addChatHistory(chat);
LLInventoryFetchComboObserver::folder_ref_t folders;
LLInventoryFetchComboObserver::item_ref_t items;
@@ -1748,10 +1770,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else if (from_id.isNull())
{
- // Messages from "Second Life" ID don't go to IM history
- // messages which should be routed to IM window come from a user ID with name=SYSTEM_NAME
- chat.mText = name + ": " + message;
- LLFloaterChat::addChat(chat, FALSE, FALSE);
+ LLSD args;
+ args["MESSAGE"] = message;
+ LLNotificationsUtil::add("SystemMessage", args);
}
else if (to_id.isNull())
{
@@ -1837,7 +1858,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// This is a block, modeless dialog.
//*TODO: Translate
args["MESSAGE"] = message;
- LLNotificationsUtil::add("SystemMessage", args);
+ LLNotificationsUtil::add("SystemMessageTip", args);
}
break;
case IM_GROUP_NOTICE:
@@ -2034,6 +2055,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
//if (((is_busy && !is_owned_by_me) || is_muted))
if ( is_muted || mute_im)
{
+ // Prefetch the offered item so that it can be discarded by the appropriate observer. (EXT-4331)
+ LLInventoryFetchObserver::item_ref_t items;
+ items.push_back(info->mObjectID);
+ LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver();
+ fetch_item->fetchItems(items);
+ delete fetch_item;
+
// Same as closing window
info->forceResponse(IOR_DECLINE);
}
@@ -2126,6 +2154,48 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Build a link to open the object IM info window.
std::string location = ll_safe_string((char*)binary_bucket, binary_bucket_size-1);
+ if (session_id.notNull())
+ {
+ chat.mFromID = session_id;
+ }
+ else
+ {
+ // This message originated on a region without the updated code for task id and slurl information.
+ // We just need a unique ID for this object that isn't the owner ID.
+ // If it is the owner ID it will overwrite the style that contains the link to that owner's profile.
+ // This isn't ideal - it will make 1 style for all objects owned by the the same person/group.
+ // This works because the only thing we can really do in this case is show the owner name and link to their profile.
+ chat.mFromID = from_id ^ gAgent.getSessionID();
+ }
+
+ LLSD query_string;
+ query_string["owner"] = from_id;
+ query_string["slurl"] = location;
+ query_string["name"] = name;
+ if (from_group)
+ {
+ query_string["groupowned"] = "true";
+ }
+
+ std::ostringstream link;
+ link << "secondlife:///app/objectim/" << session_id << LLURI::mapToQueryString(query_string);
+
+ chat.mURL = link.str();
+ chat.mText = message;
+ chat.mSourceType = CHAT_SOURCE_OBJECT;
+
+ // Note: lie to Nearby Chat, pretending that this is NOT an IM, because
+ // IMs from obejcts don't open IM sessions.
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ if(nearby_chat)
+ {
+ nearby_chat->addMessage(chat);
+ }
+
+
+ //Object IMs send with from name: 'Second Life' need to be displayed also in notification toasts (EXT-1590)
+ if (SYSTEM_FROM != name) break;
+
LLSD substitutions;
substitutions["NAME"] = name;
substitutions["MSG"] = message;
@@ -2624,9 +2694,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
LLNotificationsUI::LLNotificationManager::instance().onChat(
chat, LLNotificationsUI::NT_NEARBYCHAT);
- // adding temporarily so that communications window chat bar
- // works until the new chat window is ready
- chat.mText = from_name + ": " + chat.mText;
LLFloaterChat::addChat(chat, FALSE, FALSE);
}
else
@@ -3929,6 +3996,17 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
avatarp->mSignaledAnimations[animation_id] = anim_sequence_id;
+ // *HACK: Disabling flying mode if it has been enabled shortly before the agent
+ // stand up animation is signaled. In this case we don't get a signal to start
+ // flying animation from server, the AGENT_CONTROL_FLY flag remains set but the
+ // avatar does not play flying animation, so we switch flying mode off.
+ // See LLAgent::setFlying(). This may cause "Stop Flying" button to blink.
+ // See EXT-2781.
+ if (animation_id == ANIM_AGENT_STANDUP && gAgent.getFlying())
+ {
+ gAgent.setFlying(FALSE);
+ }
+
if (i < num_source_blocks)
{
mesgsys->getUUIDFast(_PREHASH_AnimationSourceList, _PREHASH_ObjectID, object_id, i);
@@ -4317,10 +4395,10 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
if (gStatusBar)
{
- S32 old_balance = gStatusBar->getBalance();
+ // S32 old_balance = gStatusBar->getBalance();
// This is an update, not the first transmission of balance
- if (old_balance != 0)
+ /* if (old_balance != 0)
{
// this is actually an update
if (balance > old_balance)
@@ -4332,7 +4410,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
LLFirstUse::useBalanceDecrease(balance - old_balance);
}
}
-
+ */
gStatusBar->setBalance(balance);
gStatusBar->setLandCredit(credit);
gStatusBar->setLandCommitted(committed);
@@ -5342,8 +5420,24 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)
it != notification["payload"]["ids"].endArray();
++it)
{
+ LLUUID target_id = it->asUUID();
+
msg->nextBlockFast(_PREHASH_TargetData);
- msg->addUUIDFast(_PREHASH_TargetID, it->asUUID());
+ msg->addUUIDFast(_PREHASH_TargetID, target_id);
+
+ // Record the offer.
+ {
+ std::string target_name;
+ gCacheName->getFullName(target_id, target_name);
+ LLSD args;
+ args["TO_NAME"] = target_name;
+
+ LLSD payload;
+ payload["from_id"] = target_id;
+ payload["SESSION_NAME"] = target_name;
+ payload["SUPPRESS_TOAST"] = true;
+ LLNotificationsUtil::add("TeleportOfferSent", args, payload);
+ }
}
gAgent.sendReliableMessage();
}