radio/lib/wController/collection.cpp
2018-08-05 00:48:17 +03:00

137 lines
3.3 KiB
C++

#include "collection.h"
C::Collection::Collection(const W::Address p_address, QObject* parent):
C::Catalogue(p_address, parent),
elements(),
waitingElements(),
hasData(false)
{
}
C::Collection::~Collection()
{
}
void C::Collection::addChildVocabulary(const W::Uint64& id)
{
C::Vocabulary* ctrl = new C::Vocabulary(pairAddress + id);
elements.insert(std::make_pair(id, ctrl));
waitingElements.insert(ctrl);
addController(ctrl);
connect(ctrl, SIGNAL(data()), this, SLOT(onChildVCData()));
if (hasData) {
hasData = false;
}
}
void C::Collection::addElement(const W::Uint64& id, const W::Uint64& before)
{
C::Catalogue::addElement(id, before);
addChildVocabulary(id);
}
void C::Collection::clearCatalogue()
{
C::Catalogue::clearCatalogue();
std::set<C::Vocabulary*>::const_iterator itr = waitingElements.begin();
std::set<C::Vocabulary*>::const_iterator end = waitingElements.end();
for (; itr != end; ++itr) {
disconnect(*itr, SIGNAL(data()), this, SLOT(onChildVCData()));
}
elements.clear();
waitingElements.clear();
cleanChildren();
}
void C::Collection::removeElement(const W::Uint64& id)
{
C::Catalogue::removeElement(id);
Elements::const_iterator itr = elements.find(id);
C::Vocabulary* ctrl = itr->second;
removeController(ctrl);
elements.erase(itr);
if (!hasData) {
std::set<C::Vocabulary*>::const_iterator witr = waitingElements.find(ctrl);
if (witr != waitingElements.end()) {
disconnect(ctrl, SIGNAL(data()), this, SLOT(onChildVCData()));
waitingElements.erase(witr);
if (waitingElements.size() == 0) {
hasData = true;
emit ready();
}
}
}
delete ctrl;
}
void C::Collection::h_get(const W::Event& ev)
{
hasData = false;
C::Catalogue::h_get(ev);
if (waitingElements.size() == 0) {
hasData = true;
emit ready();
}
}
void C::Collection::h_clear(const W::Event& ev)
{
C::Catalogue::h_clear(ev);
if (!hasData) {
hasData = true;
emit ready();
}
}
void C::Collection::onChildVCData()
{
C::Vocabulary* child = static_cast<C::Vocabulary*>(sender());
std::set<C::Vocabulary*>::const_iterator itr = waitingElements.find(child);
waitingElements.erase(itr);
disconnect(child, SIGNAL(data()), this, SLOT(onChildVCData()));
if (waitingElements.size() == 0) {
hasData = true;
emit ready();
}
}
std::set<uint64_t> C::Collection::find(const W::String& field, const W::Object& value)
{
if (!hasData) {
emit serviceMessage(QString("An attempt to look for record where ") + field.toString().c_str() + " == " + value.toString().c_str() + " in " + address.toString().c_str() + " but controller has no data yet");
throw 2;
}
std::set<uint64_t> response;
Elements::const_iterator itr = elements.begin();
Elements::const_iterator end = elements.end();
for (; itr != end; ++itr) {
if (itr->second->at(field) == value) {
response.insert(itr->first);
}
}
return response;
}
const C::Vocabulary & C::Collection::get(uint64_t id) const
{
return *(elements.find(id)->second);
}