git-svn-id: svn://db.shs.com.ru/libs@378 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2018-05-12 09:57:00 +00:00
parent e62e5a0c95
commit 56e250c150
15 changed files with 512 additions and 374 deletions

View File

@@ -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);
}