git-svn-id: svn://db.shs.com.ru/libs@378 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -30,6 +30,8 @@ const char CDCore::pult_config[] =
|
||||
|
||||
int __Core_Initializer__::count_(0);
|
||||
CDCore * __Core_Initializer__::__instance__(0);
|
||||
const uchar header_direct = 0x80;
|
||||
const uchar header_transfer = 0x81;
|
||||
|
||||
|
||||
__Core_Initializer__::__Core_Initializer__() {
|
||||
@@ -62,7 +64,12 @@ CDCore::CDCore() {
|
||||
/*PIString s(app_config);
|
||||
connection.configureFromString(&s);
|
||||
connection.start();*/
|
||||
initRoot(k_);
|
||||
k_.cd_type_ = CDType::cdK;
|
||||
x_.cd_type_ = CDType::cdX;
|
||||
c_.cd_type_ = CDType::cdC;
|
||||
initRoot(&k_);
|
||||
initRoot(&x_);
|
||||
initRoot(&c_);
|
||||
|
||||
CONNECTU(&datatr, sendRequest, this, dtSendRequest)
|
||||
CONNECTU(&datatr, receiveFinished, this, dtReceiveFinished)
|
||||
@@ -90,15 +97,15 @@ CDCore::~CDCore() {
|
||||
}
|
||||
|
||||
|
||||
void CDCore::k_write(PIIODevice * d) {
|
||||
k_.write(d, CDType::cdK, PIString());
|
||||
void CDCore::cd_write(CDSection * cd, PIIODevice * d) {
|
||||
cd->write(d, PIString());
|
||||
}
|
||||
|
||||
|
||||
void CDCore::k_read(PIIODevice * d) {
|
||||
void CDCore::cd_read(CDSection * cd, PIIODevice * d) {
|
||||
PIConfig conf(d, PIIODevice::ReadOnly);
|
||||
k_.read(&(conf.rootEntry()), CDType::cdK);
|
||||
initRoot(k_);
|
||||
cd->read(&(conf.rootEntry()));
|
||||
initRoot(cd);
|
||||
K_ChangedGlobal();
|
||||
/*PIVector<PIIODevice * > ds = connection.allDevices();
|
||||
piForeach(PIIODevice * d, ds) {
|
||||
@@ -108,36 +115,50 @@ void CDCore::k_read(PIIODevice * d) {
|
||||
}
|
||||
|
||||
|
||||
void CDCore::k_parse(PIIODevice * d) {
|
||||
k_ = CDParser::parse(d, CDType::cdK);
|
||||
initRoot(k_);
|
||||
void CDCore::cd_parse(CDSection * cd, PIIODevice * d) {
|
||||
*cd = CDParser::parse(d, cd->cd_type_);
|
||||
initRoot(cd);
|
||||
K_ChangedGlobal();
|
||||
}
|
||||
|
||||
|
||||
void CDCore::k_update(PIIODevice * d, UpdateModeFlags mode) {
|
||||
CDSection uk = k_;
|
||||
k_parse(d);
|
||||
void CDCore::cd_update(CDSection * cd, PIIODevice * d, UpdateModeFlags mode) {
|
||||
CDSection ucd = *cd;
|
||||
cd_parse(cd, d);
|
||||
/*bool kn = true;
|
||||
if (!uk.isEmpty())
|
||||
if (!uk.isSameStructure(k_)) {
|
||||
if (!ucd.isEmpty())
|
||||
if (!ucd.isSameStructure(k_)) {
|
||||
piCout << "ask for save names";
|
||||
K_KeepNamesRequest(&kn);
|
||||
}*/
|
||||
uk.update(k_, mode);
|
||||
//piCout << k_.count() << uk.count();
|
||||
k_ = uk;
|
||||
initRoot(k_);
|
||||
ucd.update(*cd, mode);
|
||||
//piCout << k_.count() << ucd.count();
|
||||
*cd = ucd;
|
||||
initRoot(cd);
|
||||
K_ChangedGlobal();
|
||||
}
|
||||
|
||||
|
||||
void CDCore::k_calculate() {
|
||||
k_.calculate();
|
||||
void CDCore::cd_calculate(CDSection * cd) {
|
||||
cd->calculate();
|
||||
K_ChangedGlobal();
|
||||
}
|
||||
|
||||
|
||||
void CDCore::cd_send(CDSection * cd, CDPacketType pt, bool direct) {
|
||||
PIByteArray ba, sba;
|
||||
PIIOByteArray iob(&ba, PIIODevice::ReadWrite);
|
||||
cd_write(cd, &iob);
|
||||
//piCoutObj << PIString(ba);
|
||||
sba = makeHeader(pt, 0);
|
||||
sba << ba;
|
||||
if (direct)
|
||||
sendDirect(sba);
|
||||
else
|
||||
sendThreaded(sba);
|
||||
}
|
||||
|
||||
|
||||
void CDCore::initApp() {
|
||||
init(appConfig());
|
||||
}
|
||||
@@ -163,30 +184,25 @@ void CDCore::startPing() {
|
||||
}
|
||||
|
||||
|
||||
void CDUtils::CDCore::dataReceived(const PIString & from, const PIByteArray & data) {
|
||||
// piCoutObj << "dataReceived" << from << data.size();
|
||||
PIIODevice * d = connection.deviceByName("cd");
|
||||
if (d && d == connection.deviceByFullPath(from)) {
|
||||
if (data.size() >= sizeof(4)) {
|
||||
const uint sig = *((const uint*)(data.data()));
|
||||
if (sig == PIBaseTransfer::packetSignature()) datatr.received(data);
|
||||
else {
|
||||
CDPacketType pt = (CDPacketType)sig;
|
||||
switch(pt) {
|
||||
case CD_Ping: {
|
||||
//piCoutObj << "ping";
|
||||
} break;
|
||||
case CD_KDirectChange: {
|
||||
PIByteArray ba = data;
|
||||
PacketKDirectChange p;
|
||||
ba >> p;
|
||||
k_[p.path].setValue(p.value);
|
||||
} break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
default: break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
PIString CDCore::typeLetter(CDType::cdT cdt) {
|
||||
switch (cdt) {
|
||||
case CDType::cdK: return PIStringAscii("k"); break;
|
||||
case CDType::cdX: return PIStringAscii("x"); break;
|
||||
case CDType::cdC: return PIStringAscii("c"); break;
|
||||
default: break;
|
||||
}
|
||||
return PIString();
|
||||
}
|
||||
|
||||
|
||||
@@ -199,60 +215,34 @@ CDCore * CDCore::instance() {
|
||||
|
||||
void CDCore::K_Send() {
|
||||
piCoutObj << "K_Send";
|
||||
PIByteArray ba;
|
||||
PIIOByteArray iob(&ba, PIIODevice::ReadWrite);
|
||||
k_write(&iob);
|
||||
//piCoutObj << PIString(ba);
|
||||
if (sendt.isRunning()) {
|
||||
piCoutObj << "send in process...";
|
||||
return;
|
||||
}
|
||||
wheader.session_id = 0;
|
||||
wheader.type = CD_KSend;
|
||||
send_data.clear();
|
||||
send_data << wheader << ba;
|
||||
sendt.startOnce();
|
||||
// ios.close();
|
||||
// piCout << s;
|
||||
//PIByteArray ba = PIByteArray::fromString(s);
|
||||
// PIFile pf("k.txt", PIIODevice::ReadWrite);
|
||||
// pf.resize(0);
|
||||
// pf.write(s.toUTF8());
|
||||
//k_write(&pf);
|
||||
//piCout << pf.readLine();
|
||||
cd_send(&k_, CD_KSend);
|
||||
}
|
||||
|
||||
|
||||
void CDCore::K_Request() {
|
||||
piCoutObj << "K_Request";
|
||||
if (sendt.isRunning()) {
|
||||
piCoutObj << "send in process...";
|
||||
return;
|
||||
}
|
||||
wheader.session_id = 0;
|
||||
wheader.type = CD_KQuery;
|
||||
send_data.clear();
|
||||
send_data << wheader;
|
||||
sendt.startOnce();
|
||||
PIByteArray sba = makeHeader(CD_KQuery, 0);
|
||||
sendThreaded(sba);
|
||||
}
|
||||
|
||||
|
||||
void CDUtils::CDCore::K_DirectChange(PIDeque<int> path, PIString value) {
|
||||
piCoutObj << "K_DirectChange";
|
||||
PacketKDirectChange p;
|
||||
p.header.session_id = 0;
|
||||
p.header.type = CD_KDirectChange;
|
||||
p.path = path;
|
||||
p.value = value;
|
||||
PIByteArray ba;
|
||||
ba << p;
|
||||
connection.writeByName("cd", ba);
|
||||
PIByteArray sba = makeHeader(CD_KDirectChange, 0);
|
||||
sba << p;
|
||||
sendDirect(sba);
|
||||
}
|
||||
|
||||
|
||||
void CDCore::sendThread() {
|
||||
if (send_data.size_s() < 4) return;
|
||||
PacketHeader h;
|
||||
memcpy(&h, send_data.data(), sizeof(h));
|
||||
bool ok = datatr.send(send_data);
|
||||
CDPacketType pt = (CDPacketType)wheader.type;
|
||||
switch (pt) {
|
||||
switch (h.type) {
|
||||
case CD_KSend:
|
||||
if (ok) K_Sended();
|
||||
else K_SendFail();
|
||||
@@ -275,42 +265,97 @@ void CDCore::xTimerTick() {
|
||||
}
|
||||
|
||||
|
||||
void CDCore::initRoot(CDSection & r) {
|
||||
r.name = "__root__";
|
||||
r.alias = "root";
|
||||
r.makePath();
|
||||
r.calculate();
|
||||
void CDCore::initRoot(CDSection * r) {
|
||||
r->name = "__root__";
|
||||
r->alias = "root";
|
||||
r->makePath();
|
||||
r->calculate();
|
||||
}
|
||||
|
||||
|
||||
void CDCore::dtSendRequest(PIByteArray &data) {
|
||||
connection.writeByName("cd", data);
|
||||
// piCoutObj << "send" << data.size() << ret;
|
||||
PIByteArray CDCore::makeHeader(CDPacketType type, int session_id) const {
|
||||
PacketHeader h;
|
||||
h.type = type;
|
||||
h.session_id = session_id;
|
||||
PIByteArray ret; ret << h;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void CDCore::dtReceiveFinished(bool ok) {
|
||||
if (ok) {
|
||||
PIByteArray ba = datatr.data();
|
||||
PacketHeader p;
|
||||
void CDCore::sendDirect(PIByteArray & ba) {
|
||||
ba.push_front(header_direct);
|
||||
connection.writeByName("cd", ba);
|
||||
}
|
||||
|
||||
|
||||
void CDCore::sendThreaded(PIByteArray & ba) {
|
||||
if (sendt.isRunning()) {
|
||||
piCoutObj << "Send in process, abort";
|
||||
return;
|
||||
}
|
||||
send_data = ba;
|
||||
sendt.startOnce();
|
||||
}
|
||||
|
||||
|
||||
void CDCore::procReceivedPacket(PIByteArray & ba) {
|
||||
PacketHeader h;
|
||||
ba >> h;
|
||||
switch(h.type) {
|
||||
case CD_Ping:
|
||||
//piCoutObj << "ping";
|
||||
break;
|
||||
case CD_KQuery:
|
||||
K_Send();
|
||||
break;
|
||||
case CD_KSend: {
|
||||
piCoutObj << "K received";
|
||||
PIByteArray k;
|
||||
ba >> k;
|
||||
k << uchar(0);
|
||||
PIString s = PIString::fromUTF8((const char *)k.data());
|
||||
PIIOString ios(&s);
|
||||
cd_read(&k_, &ios);
|
||||
K_Received();
|
||||
} break;
|
||||
case CD_KDirectChange: {
|
||||
PacketKDirectChange p;
|
||||
ba >> p;
|
||||
CDPacketType pt = (CDPacketType)p.type;
|
||||
switch (pt) {
|
||||
case CD_KQuery:
|
||||
K_Send();
|
||||
break;
|
||||
case CD_KSend: {
|
||||
piCoutObj << "K received";
|
||||
PIByteArray k;
|
||||
ba >> k;
|
||||
k << uchar(0);
|
||||
PIString s = PIString::fromUTF8((const char *)k.data());
|
||||
PIIOString ios(&s);
|
||||
k_read(&ios);
|
||||
K_Received();
|
||||
} break;
|
||||
default: break;
|
||||
k_[p.path].setValue(p.value);
|
||||
} break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CDUtils::CDCore::dataReceived(const PIString & from, const PIByteArray & data) {
|
||||
//piCoutObj << "dataReceived" << from << data.size();
|
||||
PIIODevice * d = connection.deviceByName("cd");
|
||||
if (d && d == connection.deviceByFullPath(from)) {
|
||||
if (data.size() >= sizeof(4)) {
|
||||
PIByteArray ba = data;
|
||||
uchar header = ba.take_front();
|
||||
if (header == header_transfer) {
|
||||
datatr.received(ba);
|
||||
}
|
||||
if (header == header_direct) {
|
||||
procReceivedPacket(ba);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CDCore::dtSendRequest(PIByteArray & data) {
|
||||
data.push_front(header_transfer);
|
||||
connection.writeByName("cd", data);
|
||||
//piCoutObj << "send" << data.size() << ret;
|
||||
}
|
||||
|
||||
|
||||
void CDCore::dtReceiveFinished(bool ok) {
|
||||
if (!ok) return;
|
||||
PIByteArray ba = datatr.data();
|
||||
procReceivedPacket(ba);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user