increased ipc message length.

This commit is contained in:
Nick Bolton 2012-07-03 17:33:19 +00:00
parent 7d5fbde71d
commit 0537bbdfad
6 changed files with 42 additions and 36 deletions

View File

@ -44,14 +44,15 @@ void IpcClient::read()
switch (codeBuf[0]) { switch (codeBuf[0]) {
case kIpcLogLine: { case kIpcLogLine: {
char lenBuf[1]; // TODO: qt must have a built in way of converting bytes to int.
stream.readRawData(lenBuf, 1); char lenBuf[2];
stream.readRawData(lenBuf, 2);
int len = (lenBuf[0] << 8) + lenBuf[1];
char* data = new char[lenBuf[0] + 1]; char* data = new char[len];
stream.readRawData(data, lenBuf[0]); stream.readRawData(data, len);
data[(int)lenBuf[0]] = 0;
QString s = QString::fromUtf8(data, len);
QString s(data);
readLogLine(s); readLogLine(s);
} }
break; break;
@ -60,7 +61,7 @@ void IpcClient::read()
void IpcClient::error(QAbstractSocket::SocketError error) void IpcClient::error(QAbstractSocket::SocketError error)
{ {
errorMessage("ERROR: Could not connect to background service."); errorMessage(QString("ERROR: could not connect to background service, code=%1").arg(error));
} }
void IpcClient::write(unsigned char code, unsigned char length, const char* data) void IpcClient::write(unsigned char code, unsigned char length, const char* data)
@ -73,9 +74,12 @@ void IpcClient::write(unsigned char code, unsigned char length, const char* data
switch (code) { switch (code) {
case kIpcCommand: { case kIpcCommand: {
char lenBuf[1]; // TODO: qt must have a built in way of converting int to bytes.
lenBuf[0] = length; char lenBuf[2];
stream.writeRawData(lenBuf, 1); lenBuf[0] = (length >> 8) & 0xff;
lenBuf[1] = length & 0xff;
stream.writeRawData(lenBuf, 2);
stream.writeRawData(data, length); stream.writeRawData(data, length);
} }
break; break;

View File

@ -93,7 +93,7 @@ MainWindow::MainWindow(QSettings& settings, AppConfig& appConfig) :
connect(&m_IpcClient, SIGNAL(readLogLine(const QString&)), this, SLOT(appendLog(const QString&))); connect(&m_IpcClient, SIGNAL(readLogLine(const QString&)), this, SLOT(appendLog(const QString&)));
connect(&m_IpcClient, SIGNAL(errorMessage(const QString&)), this, SLOT(appendLog(const QString&))); connect(&m_IpcClient, SIGNAL(errorMessage(const QString&)), this, SLOT(appendLog(const QString&)));
m_IpcClient.connectToHost(); m_IpcClient.connectToHost();
appendLog("INFO: Connecting to background service..."); appendLog("INFO: connecting to background service...");
} }
} }

View File

@ -21,6 +21,7 @@
#include "Ipc.h" #include "Ipc.h"
#include "CLog.h" #include "CLog.h"
#include "CIpcMessage.h" #include "CIpcMessage.h"
#include "CProtocolUtil.h"
CEvent::Type CIpcClientProxy::s_messageReceivedEvent = CEvent::kUnknown; CEvent::Type CIpcClientProxy::s_messageReceivedEvent = CEvent::kUnknown;
@ -88,11 +89,9 @@ CIpcClientProxy::send(const CIpcMessage& message)
case kIpcLogLine: { case kIpcLogLine: {
CString* s = (CString*)message.m_data; CString* s = (CString*)message.m_data;
const char* data = s->c_str(); const char* data = s->c_str();
int len = strlen(data); int len = strlen(data);
CProtocolUtil::writef(&m_stream, "%2i", len);
UInt8 lenBuf[1];
lenBuf[0] = len;
m_stream.write(lenBuf, 1);
m_stream.write(data, len); m_stream.write(data, len);
} }
@ -109,13 +108,13 @@ CIpcClientProxy::send(const CIpcMessage& message)
void* void*
CIpcClientProxy::parseCommand() CIpcClientProxy::parseCommand()
{ {
UInt8 len[1]; int len = 0;
m_stream.read(len, 1); CProtocolUtil::readf(&m_stream, "%2i", &len);
UInt8* buffer = new UInt8[len[0]]; UInt8* buffer = new UInt8[len];
m_stream.read(buffer, len[0]); m_stream.read(buffer, len);
return new CString((const char*)buffer, len[0]); return new CString((const char*)buffer, len);
} }
void void

View File

@ -21,6 +21,7 @@
#include "CLog.h" #include "CLog.h"
#include "CIpcMessage.h" #include "CIpcMessage.h"
#include "Ipc.h" #include "Ipc.h"
#include "CProtocolUtil.h"
CEvent::Type CIpcServerProxy::s_messageReceivedEvent = CEvent::kUnknown; CEvent::Type CIpcServerProxy::s_messageReceivedEvent = CEvent::kUnknown;
@ -80,12 +81,12 @@ CIpcServerProxy::send(const CIpcMessage& message)
switch (message.m_type) { switch (message.m_type) {
case kIpcCommand: { case kIpcCommand: {
CString* s = (CString*)message.m_data; CString* s = (CString*)message.m_data;
const char* data = s->c_str();
int len = strlen(data);
CProtocolUtil::writef(&m_stream, "%2i", len);
UInt8 len[1]; m_stream.write(data, len);
len[0] = s->size();
m_stream.write(len, 1);
m_stream.write(s->c_str(), s->size());
} }
break; break;
@ -98,13 +99,13 @@ CIpcServerProxy::send(const CIpcMessage& message)
void* void*
CIpcServerProxy::parseLogLine() CIpcServerProxy::parseLogLine()
{ {
UInt8 len[1]; int len = 0;
m_stream.read(len, 1); CProtocolUtil::readf(&m_stream, "%2i", &len);
UInt8* buffer = new UInt8[len[0]]; UInt8* buffer = new UInt8[len];
m_stream.read(buffer, len[0]); m_stream.read(buffer, len);
return new CString((const char*)buffer, len[0]); return new CString((const char*)buffer, len);
} }
void void

View File

@ -43,6 +43,7 @@ set(inc
../io ../io
../mt ../mt
../net ../net
../synergy
) )
if (UNIX) if (UNIX)
@ -55,5 +56,5 @@ include_directories(${inc})
add_library(ipc STATIC ${src}) add_library(ipc STATIC ${src})
if (UNIX) if (UNIX)
target_link_libraries(arch base common mt io net) target_link_libraries(arch base common mt io net synergy)
endif() endif()

View File

@ -277,11 +277,12 @@ CDaemonApp::handleIpcMessage(const CEvent& e, void*)
{ {
CIpcMessage& m = *reinterpret_cast<CIpcMessage*>(e.getData()); CIpcMessage& m = *reinterpret_cast<CIpcMessage*>(e.getData());
LOG((CLOG_DEBUG "ipc message: %d", m.m_type)); LOG((CLOG_DEBUG "ipc message, type=%d", m.m_type));
switch (m.m_type) { switch (m.m_type) {
case kIpcCommand: { case kIpcCommand: {
CString& command = *reinterpret_cast<CString*>(m.m_data); CString& command = *reinterpret_cast<CString*>(m.m_data);
LOG((CLOG_DEBUG "got new command: %s", command.c_str()));
try { try {
// store command in system settings. this is used when the daemon // store command in system settings. this is used when the daemon
@ -289,9 +290,9 @@ CDaemonApp::handleIpcMessage(const CEvent& e, void*)
ARCH->setting("Command", command); ARCH->setting("Command", command);
} }
catch (XArch& e) { catch (XArch& e) {
//LOG((CLOG_ERR "failed to save setting: %s", e.what().c_str())); LOG((CLOG_ERR "failed to save setting, %s", e.what().c_str()));
} }
// tell the relauncher about the new command. this causes the // tell the relauncher about the new command. this causes the
// relauncher to stop the existing command and start the new // relauncher to stop the existing command and start the new
// command. // command.
@ -300,7 +301,7 @@ CDaemonApp::handleIpcMessage(const CEvent& e, void*)
break; break;
default: default:
LOG((CLOG_ERR "ipc message not supported: %d", m.m_type)); LOG((CLOG_ERR "ipc message not supported, type=%d", m.m_type));
break; break;
} }
} }