diff --git a/indra/newview/llnearbychathub.cpp b/indra/newview/llnearbychathub.cpp
index 57e2fdc83f..3c4e45f3b4 100644
--- a/indra/newview/llnearbychathub.cpp
+++ b/indra/newview/llnearbychathub.cpp
@@ -60,6 +60,11 @@
#include "llviewerstats.h"
//
+// FIRE-787: break up too long chat lines into multiple messages
+void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel);
+void really_send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel);
+// FIRE-787
+
struct LLChatTypeTrigger {
std::string name;
EChatType type;
@@ -139,6 +144,55 @@ void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channe
}
// [/RLVa:KB]
+// FIRE-787: break up too long chat lines into multiple messages
+ U32 split = MAX_MSG_BUF_SIZE - 1;
+ U32 pos = 0;
+ U32 total = utf8_out_text.length();
+
+ // Don't break null messages
+ if(total == 0)
+ {
+ really_send_chat_from_viewer(utf8_out_text, type, channel);
+ }
+
+ while(pos < total)
+ {
+ U32 next_split = split;
+
+ if(pos + next_split > total) next_split = total - pos;
+
+ // don't split utf-8 bytes
+ while((U8(utf8_out_text[pos + next_split]) >= 0x80)
+ && (U8(utf8_out_text[pos + next_split]) < 0xC0)
+ && (next_split > 0))
+ {
+ --next_split;
+ }
+
+ if(next_split == 0)
+ {
+ next_split = split;
+ LL_WARNS("Splitting") <<
+ "utf-8 couldn't be split correctly" << LL_ENDL;
+ }
+
+ std::string send = utf8_out_text.substr(pos, pos + next_split);
+ pos += next_split;
+
+ // *FIXME: Queue messages and wait for server
+ really_send_chat_from_viewer(send, type, channel);
+ }
+
+ // moved here so we don't bump the count for every message segment
+ LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
+// FIRE-787
+}
+
+// FIRE-787: break up too long chat lines into multiple messages
+// This function just sends the message, with no other processing. Moved out
+// of send_chat_from_viewer.
+void really_send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel)
+{
LLMessageSystem* msg = gMessageSystem;
if(channel >= 0)
{
@@ -165,9 +219,8 @@ void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channe
}
gAgent.sendReliableMessage();
-
- LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
}
+// FIRE-787
void LLNearbyChat::sendChatFromViewer(const std::string& utf8text, EChatType type, BOOL animate)
{