git-svn-id: svn://db.shs.com.ru/libs@415 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -61,6 +61,7 @@ CDCore::CDCore() {
|
||||
setName("CDCore");
|
||||
datatr.setPacketSize(960);
|
||||
CONNECTU(&connection, dataReceivedEvent, this, dataReceived);
|
||||
CONNECTU(PICout::Notifier::object(), finished, this, piCoutFinished);
|
||||
/*PIString s(app_config);
|
||||
connection.configureFromString(&s);
|
||||
connection.start();*/
|
||||
@@ -68,9 +69,11 @@ CDCore::CDCore() {
|
||||
k_.cd_type_ = CDType::cdK;
|
||||
x_.cd_type_ = CDType::cdX;
|
||||
c_.cd_type_ = CDType::cdC;
|
||||
m_.cd_type_ = CDType::cdM;
|
||||
initRoot(&k_);
|
||||
initRoot(&x_);
|
||||
initRoot(&c_);
|
||||
initRoot(&m_);
|
||||
|
||||
CONNECTU(&datatr, sendRequest, this, dtSendRequest)
|
||||
CONNECTU(&datatr, receiveFinished, this, dtReceiveFinished)
|
||||
@@ -169,6 +172,7 @@ void CDCore::send(CDType::cdT cdt) {
|
||||
case CDType::cdK: pt = CD_KSend; break;
|
||||
case CDType::cdX: pt = CD_XSend; break;
|
||||
case CDType::cdC: pt = CD_CSend; break;
|
||||
case CDType::cdM: pt = CD_MSend; break;
|
||||
default: break;
|
||||
}
|
||||
piCoutObj << "send" << typeLetter(cdt);
|
||||
@@ -182,6 +186,7 @@ void CDCore::request(CDType::cdT cdt) {
|
||||
case CDType::cdK: pt = CD_KQuery; break;
|
||||
case CDType::cdX: pt = CD_XQuery; break;
|
||||
case CDType::cdC: pt = CD_CQuery; break;
|
||||
case CDType::cdM: pt = CD_MQuery; break;
|
||||
default: break;
|
||||
}
|
||||
piCoutObj << "request" << typeLetter(cdt);
|
||||
@@ -253,11 +258,20 @@ void CDCore::registerCHandler(const CDType & c, PIObject * o, Handler h) {
|
||||
}
|
||||
|
||||
|
||||
void CDCore::sendMessage(const CDType & m, MessageType mt, const PIString & msg) {
|
||||
if (msg.isEmpty() || (m.cd_type() != CDType::cdM)) return;
|
||||
PIByteArray sba = makeHeader(CD_Message, 0);
|
||||
sba << m.path() << int(mt) << msg;
|
||||
sendDirect(sba);
|
||||
}
|
||||
|
||||
|
||||
CDSection * CDCore::root(CDType::cdT cdt) {
|
||||
switch (cdt) {
|
||||
case CDType::cdK: return &k_; break;
|
||||
case CDType::cdX: return &x_; break;
|
||||
case CDType::cdC: return &c_; break;
|
||||
case CDType::cdM: return &m_; break;
|
||||
default: break;
|
||||
}
|
||||
return 0;
|
||||
@@ -269,6 +283,7 @@ PIString CDCore::typeLetter(CDType::cdT cdt) {
|
||||
case CDType::cdK: return PIStringAscii("k"); break;
|
||||
case CDType::cdX: return PIStringAscii("x"); break;
|
||||
case CDType::cdC: return PIStringAscii("c"); break;
|
||||
case CDType::cdM: return PIStringAscii("m"); break;
|
||||
default: break;
|
||||
}
|
||||
return PIString();
|
||||
@@ -320,6 +335,13 @@ void CDCore::sendThread() {
|
||||
case CD_CQuery:
|
||||
if (!ok) C_ReceiveFail();
|
||||
break;
|
||||
case CD_MSend:
|
||||
if (ok) M_Sended();
|
||||
else M_SendFail();
|
||||
break;
|
||||
case CD_MQuery:
|
||||
if (!ok) M_ReceiveFail();
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@@ -351,6 +373,15 @@ void CDCore::xTimerTick() {
|
||||
}
|
||||
|
||||
|
||||
void CDCore::piCoutFinished(int id, PIString * buffer) {
|
||||
if (!buffer || !(id == 1)) return;
|
||||
PIString sp = buffer->takeRange("[", "]");
|
||||
PIDeque<int> p = CDCore::stringToPath(sp);
|
||||
sendMessage(m_[p], Log, *buffer);
|
||||
delete buffer;
|
||||
}
|
||||
|
||||
|
||||
void CDCore::initRoot(CDSection * r) {
|
||||
r->name = "__root__";
|
||||
r->alias = "root";
|
||||
@@ -470,6 +501,31 @@ void CDCore::procReceivedPacket(PIByteArray & ba) {
|
||||
//piCoutObj << "found" << sp << h.first;
|
||||
if (h.first && h.second) h.second(h.first);
|
||||
} break;
|
||||
case CD_MQuery:
|
||||
send(CDType::cdM);
|
||||
break;
|
||||
case CD_MSend: {
|
||||
piCoutObj << "M received";
|
||||
PIByteArray c;
|
||||
ba >> c;
|
||||
c << uchar(0);
|
||||
PIString s = PIString::fromUTF8((const char *)c.data());
|
||||
PIIOString ios(&s);
|
||||
cd_read(&m_, &ios);
|
||||
M_Received();
|
||||
} break;
|
||||
case CD_Message: {
|
||||
PIDeque<int> p;
|
||||
ba >> p;
|
||||
piCoutObj << "M message" << p;
|
||||
if (p.isEmpty()) return;
|
||||
int t = 0;
|
||||
PIString msg;
|
||||
ba >> t >> msg;
|
||||
//piCoutObj << "found" << sp << h.first;
|
||||
//piCoutObj << "M message invoke";
|
||||
M_Message(p, t, msg);
|
||||
} break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@@ -480,6 +536,7 @@ void CDCore::raiseChangedGlobal(CDType::cdT cdt) {
|
||||
case CDType::cdK: K_ChangedGlobal(); break;
|
||||
case CDType::cdX: X_ChangedGlobal(); break;
|
||||
case CDType::cdC: C_ChangedGlobal(); break;
|
||||
case CDType::cdM: M_ChangedGlobal(); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user