void AMCPProtocolStrategy::Parse(const TCHAR* pData, int charCount, ClientInfoPtr pClientInfo)\r
{\r
size_t pos;\r
- std::wstring recvData(pData, charCount);\r
- std::wstring availibleData = (pClientInfo != nullptr ? pClientInfo->currentMessage_ : L"") + recvData;\r
+ size_t oldLength = pClientInfo->currentMessage_.length();\r
+\r
+ if(pClientInfo->currentMessage_.capacity() < (oldLength + charCount))\r
+ pClientInfo->currentMessage_.reserve(8192 * 4);\r
+\r
+ pClientInfo->currentMessage_.append(pData, charCount);\r
\r
while(true) {\r
- pos = availibleData.find(MessageDelimiter);\r
+ pos = pClientInfo->currentMessage_.find(MessageDelimiter, (oldLength>(MessageDelimiter.size()-1)) ? oldLength-(MessageDelimiter.size()-1) : 0);\r
if(pos != std::wstring::npos)\r
{\r
- std::wstring message = availibleData.substr(0,pos);\r
+ std::wstring message = pClientInfo->currentMessage_.substr(0,pos);\r
\r
//This is where a complete message gets taken care of\r
if(message.length() > 0) {\r
}\r
\r
std::size_t nextStartPos = pos + MessageDelimiter.length();\r
- if(nextStartPos < availibleData.length())\r
- availibleData = availibleData.substr(nextStartPos);\r
+ if(nextStartPos < pClientInfo->currentMessage_.length())\r
+ pClientInfo->currentMessage_ = pClientInfo->currentMessage_.substr(nextStartPos);\r
else {\r
- availibleData.clear();\r
+ pClientInfo->currentMessage_.clear();\r
break;\r
}\r
}\r
break;\r
}\r
}\r
- if(pClientInfo)\r
- pClientInfo->currentMessage_ = availibleData;\r
}\r
\r
void AMCPProtocolStrategy::ProcessMessage(const std::wstring& message, ClientInfoPtr& pClientInfo)\r
{ \r
- CASPAR_LOG(info) << L"Received message from " << pClientInfo->print() << ": " << message << L"\\r\\n";\r
+ if(message.length() < 512)\r
+ CASPAR_LOG(info) << L"Received message from " << pClientInfo->print() << ": " << message << L"\\r\\n";\r
+ else\r
+ CASPAR_LOG(info) << L"Received long message from " << pClientInfo->print() << ": " << message.substr(0, 510) << " [...]\\r\\n";\r
\r
bool bError = true;\r
MessageParserState state = New;\r