diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index a667f67a9..a66a1013f 100644 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -529,10 +529,10 @@ LLCircuitData* LLMessageSystem::findCircuit(const LLHost& host, } // Returns TRUE if a valid, on-circuit message has been received. -BOOL LLMessageSystem::checkMessages( S64 frame_count ) +BOOL LLMessageSystem::checkMessages( S64 frame_count, bool faked_message, U8 fake_buffer[MAX_BUFFER_SIZE], LLHost fake_host, S32 fake_size ) { // Pump - BOOL valid_packet = FALSE; + BOOL valid_packet = FALSE; mMessageReader = mTemplateMessageReader; LLTransferTargetVFile::updateQueue(); @@ -559,16 +559,25 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) U8* buffer = mTrueReceiveBuffer.buffer; - mTrueReceiveSize = mPacketRing.receivePacket(mSocket, (char *)mTrueReceiveBuffer.buffer); - receive_size = mTrueReceiveSize; - mLastSender = mPacketRing.getLastSender(); - mLastReceivingIF = mPacketRing.getLastReceivingInterface(); + if(!faked_message) + { + mTrueReceiveSize = mPacketRing.receivePacket(mSocket, (char *)mTrueReceiveBuffer.buffer); + receive_size = mTrueReceiveSize; + mLastSender = mPacketRing.getLastSender(); + mLastReceivingIF = mPacketRing.getLastReceivingInterface(); + } else { + buffer = fake_buffer; //true my ass. + mTrueReceiveSize = fake_size; + receive_size = mTrueReceiveSize; + mLastSender = fake_host; + mLastReceivingIF = mPacketRing.getLastReceivingInterface(); //don't really give two tits about the interface, just leave it + } // If you want to dump all received packets into SecondLife.log, uncomment this //dumpPacketToLog(); // - if(mTrueReceiveSize && receive_size > (S32) LL_MINIMUM_VALID_PACKET_SIZE) + if(mTrueReceiveSize && receive_size > (S32) LL_MINIMUM_VALID_PACKET_SIZE && !faked_message) { LLMessageLog::log(mLastSender, LLHost(16777343, mPort), buffer, mTrueReceiveSize); } @@ -593,7 +602,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) LLCircuitData* cdp; // note if packet acks are appended. - if(buffer[0] & LL_ACK_FLAG) + if(buffer[0] & LL_ACK_FLAG && !faked_message) { acks += buffer[--receive_size]; true_rcv_size = receive_size; @@ -625,7 +634,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) // this message came in on if it's valid, and NULL if the // circuit was bogus. - if(cdp && (acks > 0) && ((S32)(acks * sizeof(TPACKETID)) < (true_rcv_size))) + if(cdp && (acks > 0) && ((S32)(acks * sizeof(TPACKETID)) < (true_rcv_size)) && !faked_message) { TPACKETID packet_id; U32 mem_id=0; diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h index 8fd215b58..ba6738bf1 100644 --- a/indra/llmessage/message.h +++ b/indra/llmessage/message.h @@ -346,7 +346,7 @@ public: bool addCircuitCode(U32 code, const LLUUID& session_id); BOOL poll(F32 seconds); // Number of seconds that we want to block waiting for data, returns if data was received - BOOL checkMessages( S64 frame_count = 0 ); + BOOL checkMessages( S64 frame_count = 0, bool faked_message = false, U8 fake_buffer[MAX_BUFFER_SIZE] = NULL, LLHost fake_host = LLHost(), S32 fake_size = NULL ); void processAcks(); BOOL isMessageFast(const char *msg); @@ -825,12 +825,16 @@ private: S32 mIncomingCompressedSize; // original size of compressed msg (0 if uncomp.) TPACKETID mCurrentRecvPacketID; // packet ID of current receive packet (for reporting) + // +public: LLMessageBuilder* mMessageBuilder; LLTemplateMessageBuilder* mTemplateMessageBuilder; LLSDMessageBuilder* mLLSDMessageBuilder; LLMessageReader* mMessageReader; LLTemplateMessageReader* mTemplateMessageReader; LLSDMessageReader* mLLSDMessageReader; +private: + // friend class LLMessageHandlerBridge; diff --git a/indra/newview/llfloatermessagebuilder.cpp b/indra/newview/llfloatermessagebuilder.cpp index d78a29f3e..90c0f9ee1 100644 --- a/indra/newview/llfloatermessagebuilder.cpp +++ b/indra/newview/llfloatermessagebuilder.cpp @@ -13,6 +13,7 @@ #include "llviewerparcelmgr.h" // same for parcel #include "llscrolllistctrl.h" #include "llworld.h" +#include "lltemplatemessagebuilder.h" //////////////////////////////// // LLNetListItem @@ -900,54 +901,66 @@ void LLFloaterMessageBuilder::onClickSend(void* user_data) return; } // Build and send - if(outgoing) + gMessageSystem->newMessage( message.c_str() ); + for(parts_iter = parts.begin(); parts_iter != parts_end; ++parts_iter) { - gMessageSystem->newMessage( message.c_str() ); - for(parts_iter = parts.begin(); parts_iter != parts_end; ++parts_iter) + const char* block_name = (*parts_iter).name.c_str(); + gMessageSystem->nextBlock(block_name); + std::vector::iterator part_var_end = (*parts_iter).vars.end(); + for(std::vector::iterator part_var_iter = (*parts_iter).vars.begin(); + part_var_iter != part_var_end; ++part_var_iter) { - const char* block_name = (*parts_iter).name.c_str(); - gMessageSystem->nextBlock(block_name); - std::vector::iterator part_var_end = (*parts_iter).vars.end(); - for(std::vector::iterator part_var_iter = (*parts_iter).vars.begin(); - part_var_iter != part_var_end; ++part_var_iter) + parts_var pv = (*part_var_iter); + if(!addField(pv.var_type, pv.name.c_str(), pv.value, pv.hex)) { - parts_var pv = (*part_var_iter); - if(!addField(pv.var_type, pv.name.c_str(), pv.value, pv.hex)) - { - LLFloaterChat::addChat(LLChat(llformat("Error adding the provided data for %s '%s' to '%s' block", mvtstr(pv.var_type).c_str(), pv.name.c_str(), block_name))); - gMessageSystem->clearMessage(); - return; - } - } - } - - LLScrollListCtrl* scrollp = floaterp->getChild("net_list"); - LLScrollListItem* selected_itemp = scrollp->getFirstSelected(); - - //if a specific circuit is selected, send it to that, otherwise send it to the current sim - if(selected_itemp) - { - LLNetListItem* itemp = findNetListItem(selected_itemp->getUUID()); - LLScrollListText* textColumn = (LLScrollListText*)selected_itemp->getColumn(1); - - //why would you send data through a dead circuit? - if(textColumn->getValue().asString() == "Dead") - { - LLFloaterChat::addChat(LLChat("No sending messages through dead circuits!")); + LLFloaterChat::addChat(LLChat(llformat("Error adding the provided data for %s '%s' to '%s' block", mvtstr(pv.var_type).c_str(), pv.name.c_str(), block_name))); + gMessageSystem->clearMessage(); return; } - - gMessageSystem->sendMessage(itemp->mCircuitData->getHost()); - } else { - gMessageSystem->sendMessage(gAgent.getRegionHost()); } } - else + + LLScrollListCtrl* scrollp = floaterp->getChild("net_list"); + LLScrollListItem* selected_itemp = scrollp->getFirstSelected(); + + //if a specific circuit is selected, send it to that, otherwise send it to the current sim + if(selected_itemp) { - LLFloaterChat::addChat(LLChat("Incoming message isn't supported yet :(")); - return; + LLNetListItem* itemp = findNetListItem(selected_itemp->getUUID()); + LLScrollListText* textColumn = (LLScrollListText*)selected_itemp->getColumn(1); + + //why would you send data through a dead circuit? + if(textColumn->getValue().asString() == "Dead") + { + LLFloaterChat::addChat(LLChat("No sending messages through dead circuits!")); + return; + } + if(outgoing) + { + gMessageSystem->sendMessage(itemp->mCircuitData->getHost()); + } else { + U8 builtMessageBuffer[MAX_BUFFER_SIZE]; + + S32 message_size = gMessageSystem->mTemplateMessageBuilder->buildMessage(builtMessageBuffer, MAX_BUFFER_SIZE, 0); + gMessageSystem->clearMessage(); + gMessageSystem->checkMessages(0, true, builtMessageBuffer, itemp->mCircuitData->getHost(), message_size); + + } + } else { + if(outgoing) + { + gMessageSystem->sendMessage(gAgent.getRegionHost()); + } else { + U8 builtMessageBuffer[MAX_BUFFER_SIZE]; + + S32 message_size = gMessageSystem->mTemplateMessageBuilder->buildMessage(builtMessageBuffer, MAX_BUFFER_SIZE, 0); + gMessageSystem->clearMessage(); + gMessageSystem->checkMessages(0, true, builtMessageBuffer, gAgent.getRegionHost(), message_size); + + } } } + BOOL LLFloaterMessageBuilder::handleKeyHere(KEY key, MASK mask) { if(key == KEY_RETURN && (mask & MASK_CONTROL))