diff options
Diffstat (limited to 'indra/llmessage/llinstantmessage.cpp')
-rw-r--r-- | indra/llmessage/llinstantmessage.cpp | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/indra/llmessage/llinstantmessage.cpp b/indra/llmessage/llinstantmessage.cpp new file mode 100644 index 0000000000..2bfa82a0ce --- /dev/null +++ b/indra/llmessage/llinstantmessage.cpp @@ -0,0 +1,299 @@ +/** + * @file llinstantmessage.cpp + * @author Phoenix + * @date 2005-08-29 + * @brief Constants and functions used in IM. + * + * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#include "linden_common.h" + +#include "lldbstrings.h" +#include "llinstantmessage.h" +#include "llhost.h" +#include "lluuid.h" +#include "llsd.h" +#include "llsdserialize.h" +#include "llmemory.h" +#include "message.h" + +#include "message.h" + +const U8 IM_ONLINE = 0; +const U8 IM_OFFLINE = 1; + +const S32 VOTE_YES = 1; +const S32 VOTE_NO = 0; +const S32 VOTE_ABSTAIN = -1; + +const S32 VOTE_MAJORITY = 0; +const S32 VOTE_SUPER_MAJORITY = 1; +const S32 VOTE_UNANIMOUS = 2; + +const char EMPTY_BINARY_BUCKET[] = ""; +const S32 EMPTY_BINARY_BUCKET_SIZE = 1; +const U32 NO_TIMESTAMP = 0; +const char SYSTEM_FROM[] = "Second Life"; +const S32 IM_TTL = 1; + + +/** + * LLIMInfo + */ +LLIMInfo::LLIMInfo() : + mParentEstateID(0), + mOffline(0), + mViewerThinksToIsOnline(false), + mTimeStamp(0), + mSource(IM_FROM_SIM), + mTTL(IM_TTL) +{ +} + +LLIMInfo::LLIMInfo( + const LLUUID& from_id, + BOOL from_group, + const LLUUID& to_id, + EInstantMessage im_type, + const std::string& name, + const std::string& message, + const LLUUID& id, + U32 parent_estate_id, + const LLUUID& region_id, + const LLVector3& position, + LLSD data, + U8 offline, + U32 timestamp, + EIMSource source, + S32 ttl) : + mFromID(from_id), + mFromGroup(from_group), + mToID(to_id), + mParentEstateID(0), + mRegionID(region_id), + mPosition(position), + mOffline(offline), + mViewerThinksToIsOnline(false), + mIMType(im_type), + mID(id), + mTimeStamp(timestamp), + mName(name), + mMessage(message), + mData(data), + mSource(source), + mTTL(ttl) +{ +} + +LLIMInfo::LLIMInfo(LLMessageSystem* msg, EIMSource source, S32 ttl) : + mViewerThinksToIsOnline(false), + mSource(source), + mTTL(ttl) +{ + unpackMessageBlock(msg); +} + +LLIMInfo::~LLIMInfo() +{ +} + +void LLIMInfo::packInstantMessage(LLMessageSystem* msg) const +{ + lldebugs << "LLIMInfo::packInstantMessage()" << llendl; + msg->newMessageFast(_PREHASH_ImprovedInstantMessage); + packMessageBlock(msg); +} + +void LLIMInfo::packMessageBlock(LLMessageSystem* msg) const +{ + // Construct binary bucket + std::vector<U8> bucket; + if (mData.has("binary_bucket")) + { + bucket = mData["binary_bucket"].asBinary(); + } + pack_instant_message_block( + msg, + mFromID, + mFromGroup, + LLUUID::null, + mToID, + mName.c_str(), + mMessage.c_str(), + mOffline, + mIMType, + mID, + mParentEstateID, + mRegionID, + mPosition, + mTimeStamp, + &bucket[0], + bucket.size()); +} + +void pack_instant_message( + LLMessageSystem* msg, + const LLUUID& from_id, + BOOL from_group, + const LLUUID& session_id, + const LLUUID& to_id, + const char* name, + const char* message, + U8 offline, + EInstantMessage dialog, + const LLUUID& id, + U32 parent_estate_id, + const LLUUID& region_id, + const LLVector3& position, + U32 timestamp, + const U8* binary_bucket, + S32 binary_bucket_size) +{ + lldebugs << "pack_instant_message()" << llendl; + msg->newMessageFast(_PREHASH_ImprovedInstantMessage); + pack_instant_message_block( + msg, + from_id, + from_group, + session_id, + to_id, + name, + message, + offline, + dialog, + id, + parent_estate_id, + region_id, + position, + timestamp, + binary_bucket, + binary_bucket_size); +} + +void pack_instant_message_block( + LLMessageSystem* msg, + const LLUUID& from_id, + BOOL from_group, + const LLUUID& session_id, + const LLUUID& to_id, + const char* name, + const char* message, + U8 offline, + EInstantMessage dialog, + const LLUUID& id, + U32 parent_estate_id, + const LLUUID& region_id, + const LLVector3& position, + U32 timestamp, + const U8* binary_bucket, + S32 binary_bucket_size) +{ + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, from_id); + msg->addUUIDFast(_PREHASH_SessionID, session_id); + msg->nextBlockFast(_PREHASH_MessageBlock); + msg->addBOOLFast(_PREHASH_FromGroup, from_group); + msg->addUUIDFast(_PREHASH_ToAgentID, to_id); + msg->addU32Fast(_PREHASH_ParentEstateID, parent_estate_id); + msg->addUUIDFast(_PREHASH_RegionID, region_id); + msg->addVector3Fast(_PREHASH_Position, position); + msg->addU8Fast(_PREHASH_Offline, offline); + msg->addU8Fast(_PREHASH_Dialog, (U8) dialog); + msg->addUUIDFast(_PREHASH_ID, id); + msg->addU32Fast(_PREHASH_Timestamp, timestamp); + msg->addStringFast(_PREHASH_FromAgentName, name); + S32 bytes_left = MTUBYTES; + if(message) + { + char buffer[MTUBYTES]; + bytes_left -= snprintf(buffer, MTUBYTES, "%s", message); + bytes_left = llmax(0, bytes_left); + msg->addStringFast(_PREHASH_Message, buffer); + } + else + { + msg->addStringFast(_PREHASH_Message, NULL); + } + const U8* bb; + if(binary_bucket) + { + bb = binary_bucket; + binary_bucket_size = llmin(bytes_left, binary_bucket_size); + } + else + { + bb = (const U8*)EMPTY_BINARY_BUCKET; + binary_bucket_size = EMPTY_BINARY_BUCKET_SIZE; + } + msg->addBinaryDataFast(_PREHASH_BinaryBucket, bb, binary_bucket_size); +} + +void LLIMInfo::unpackMessageBlock(LLMessageSystem* msg) +{ + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, mFromID); + msg->getBOOLFast(_PREHASH_MessageBlock, _PREHASH_FromGroup, mFromGroup); + msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ToAgentID, mToID); + msg->getU32Fast(_PREHASH_MessageBlock, _PREHASH_ParentEstateID, mParentEstateID); + msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_RegionID, mRegionID); + msg->getVector3Fast(_PREHASH_MessageBlock, _PREHASH_Position, mPosition); + msg->getU8Fast(_PREHASH_MessageBlock, _PREHASH_Offline, mOffline); + U8 dialog; + msg->getU8Fast(_PREHASH_MessageBlock, _PREHASH_Dialog, dialog); + mIMType = (EInstantMessage) dialog; + msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ID, mID); + msg->getU32Fast(_PREHASH_MessageBlock, _PREHASH_Timestamp, mTimeStamp); + char name[DB_FULL_NAME_BUF_SIZE]; + msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_FromAgentName, DB_FULL_NAME_BUF_SIZE, name); + mName.assign(name); + + char message[DB_IM_MSG_BUF_SIZE]; + msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_Message, DB_IM_MSG_BUF_SIZE, message); + mMessage.assign(message); + + S32 binary_bucket_size = llmin( + MTUBYTES, + msg->getSizeFast( + _PREHASH_MessageBlock, + _PREHASH_BinaryBucket)); + if(binary_bucket_size) + { + std::vector<U8> bucket; + bucket.resize(binary_bucket_size); + + msg->getBinaryDataFast( + _PREHASH_MessageBlock, + _PREHASH_BinaryBucket, + &bucket[0], + 0, + 0, + binary_bucket_size); + mData["binary_bucket"] = bucket; + } + else + { + mData.clear(); + } +} + +LLPointer<LLIMInfo> LLIMInfo::clone() +{ + return new LLIMInfo( + mFromID, + mFromGroup, + mToID, + mIMType, + mName, + mMessage, + mID, + mParentEstateID, + mRegionID, + mPosition, + mData, + mOffline, + mTimeStamp, + mSource, + mTTL); +} + |