/* * @file DBServiceAPI.cpp * @author Mateusz Piesta (mateusz.piesta@mudita.com) * @date 06.06.19 * @brief * @copyright Copyright (C) 2019 mudita.com * @details */ #include "DBServiceAPI.hpp" #include "../messages/DBMessage.hpp" #include "../ServiceDB.hpp" #include SettingsRecord DBServiceAPI::SettingsGet(sys::Service *serv) { std::shared_ptr msg = std::make_shared(MessageType::DBSettingsGet); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); if (ret.first == sys::ReturnCodes::Success) { auto respMsg = ret.second; DBSettingsResponseMessage *settingsResponse = reinterpret_cast(respMsg.get()); if (settingsResponse->retCode == true) { return settingsResponse->record; } else { return SettingsRecord{}; } } else { return SettingsRecord{}; } } bool DBServiceAPI::SettingsUpdate(sys::Service *serv, const SettingsRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBSettingsUpdate, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); if (ret.first == sys::ReturnCodes::Success) { return true; } else { return false; } } uint32_t DBServiceAPI::SMSAdd(sys::Service *serv, const SMSRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBSMSAdd, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBSMSResponseMessage *smsResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (smsResponse->retCode == true)) { return (*smsResponse->records)[0].ID; } else { return 0; } } bool DBServiceAPI::SMSRemove(sys::Service *serv, uint32_t id) { std::shared_ptr msg = std::make_shared(MessageType::DBSMSRemove); msg->id = id; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBSMSResponseMessage *smsResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (smsResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::SMSUpdate(sys::Service *serv, const SMSRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBSMSUpdate, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBSMSResponseMessage *smsResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (smsResponse->retCode == true)) { return true; } else { return false; } } SMSRecord DBServiceAPI::SMSGetLastRecord(sys::Service *serv) { std::shared_ptr msg = std::make_shared(MessageType::DBSMSGetLastRecord); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBSMSResponseMessage *smsResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (smsResponse->retCode == true)) { return (*smsResponse->records)[0]; } else { SMSRecord rec; rec.ID = 0; return rec; } } std::unique_ptr> DBServiceAPI::SMSGetLimitOffset(sys::Service *serv, uint32_t offset, uint32_t limit) { std::shared_ptr msg = std::make_shared(MessageType::DBSMSGetSMSLimitOffset); msg->offset = offset; msg->limit = limit; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBSMSResponseMessage *smsResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (smsResponse->retCode == true)) { return std::move(smsResponse->records); } else { return std::make_unique>(); } } std::unique_ptr> DBServiceAPI::SMSGetLimitOffsetByThreadID(sys::Service *serv, uint32_t offset, uint32_t limit, uint32_t id) { std::shared_ptr msg = std::make_shared(MessageType::DBSMSGetSMSLimitOffsetByThreadID); msg->offset = offset; msg->limit = limit; msg->id = id; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBSMSResponseMessage *smsResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (smsResponse->retCode == true)) { return std::move(smsResponse->records); } else { return std::make_unique>(); } } uint32_t DBServiceAPI::SMSGetCount(sys::Service *serv) { std::shared_ptr msg = std::make_shared(MessageType::DBSMSGetCount); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); auto *sms = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (sms->retCode == true)) { return sms->count; } else { return 0; } } std::unique_ptr DBServiceAPI::ThreadGet(sys::Service *serv, uint32_t id) { std::shared_ptr msg = std::make_shared(MessageType::DBThreadGet); msg->id = id; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBThreadResponseMessage *threadResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (threadResponse->retCode == true)) { return std::make_unique((*threadResponse->records)[0]); } else { return nullptr; } } std::unique_ptr DBServiceAPI::ThreadGetByContact(sys::Service *serv, uint32_t contact) { std::shared_ptr msg = std::make_shared(MessageType::DBThreadGetForContact, contact); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBThreadResponseMessage *threadResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (threadResponse->retCode == true)) { return std::make_unique((*threadResponse->records)[0]); } else { return nullptr; } } bool DBServiceAPI::ThreadRemove(sys::Service *serv, uint32_t id) { std::shared_ptr msg = std::make_shared(MessageType::DBThreadRemove); msg->id = id; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBThreadResponseMessage *threadResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (threadResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::ThreadGetLimitOffset(sys::Service *serv, uint32_t offset, uint32_t limit) { std::shared_ptr msg = std::make_shared(MessageType::DBThreadGetLimitOffset); msg->offset = offset; msg->limit = limit; sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv); return true; } uint32_t DBServiceAPI::ThreadGetCount(sys::Service *serv) { std::shared_ptr msg = std::make_shared(MessageType::DBThreadGetCount); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBThreadResponseMessage *threadResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (threadResponse->retCode == true)) { return threadResponse->count; } else { return false; } } std::unique_ptr> DBServiceAPI::ContactGetByName(sys::Service *serv, UTF8 primaryName, UTF8 alternativeName) { ContactRecord rec; rec.primaryName = primaryName; rec.alternativeName = alternativeName; std::shared_ptr msg = std::make_shared(MessageType::DBContactGetByName, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return std::move(contactResponse->records); } else { return std::make_unique>(); } } std::unique_ptr> DBServiceAPI::ContactGetByID(sys::Service *serv, uint32_t contactID) { ContactRecord rec; rec.dbID = contactID; std::shared_ptr msg = std::make_shared(MessageType::DBContactGetByID, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return std::move(contactResponse->records); } else { return std::make_unique>(); } } std::unique_ptr> DBServiceAPI::ContactGetBySpeeddial(sys::Service *serv, uint8_t speeddial) { ContactRecord rec; rec.speeddial = speeddial; std::shared_ptr msg = std::make_shared(MessageType::DBContactGetBySpeedDial, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return std::move(contactResponse->records); } else { return std::make_unique>(); } } std::unique_ptr> DBServiceAPI::ContactGetByPhoneNumber(sys::Service *serv, UTF8 phoneNumber) { ContactRecord rec; rec.number = phoneNumber; std::shared_ptr msg = std::make_shared(MessageType::DBContactGetByNumber, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return std::move(contactResponse->records); } else { return std::make_unique>(); } } DBServiceAPI::ContactVerificationError DBServiceAPI::verifyContact(sys::Service *serv, const ContactRecord &rec, ContactRecord &errName, ContactRecord &errPhone1, ContactRecord &errPhone2, ContactRecord &speedDial) { auto retName = ContactGetByName(serv, rec.primaryName, rec.alternativeName); if (retName->size() != 0) { errName = retName->operator[](0); return (nameError); } auto retSpeedDial = ContactGetBySpeeddial(serv, rec.speeddial); if (retSpeedDial->size() != 0) { speedDial = retSpeedDial->operator[](0); return (speedDialError); } // request contact by speed dial if (rec.numbers.size() > 0) { auto retPhone1 = ContactGetByPhoneNumber(serv, rec.numbers[0].numberE164); if (retPhone1->size() != 0) { errPhone1 = retPhone1->operator[](0); return (primaryNumberError); } } if (rec.numbers.size() > 1) { auto retPhone2 = ContactGetByPhoneNumber(serv, rec.numbers[1].numberE164); if (retPhone2->size() != 0) { errPhone2 = retPhone2->operator[](0); return (secondaryNumberError); } } return (noError); } std::string DBServiceAPI::getVerificationErrorString(const ContactVerificationError err) { switch (err) { case noError: return ("No error occured"); case nameError: return ("Invalid name format"); case speedDialError: return ("Invalid or duplicate speed dial number"); case primaryNumberError: return ("Invalid or duplicate primary number"); case secondaryNumberError: return ("Invalid or duplicate secondary number"); default: return "(Unknonw error)"; } } bool DBServiceAPI::ContactAdd(sys::Service *serv, const ContactRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBContactAdd, rec); msg->record.contactType = ContactType::USER; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::ContactRemove(sys::Service *serv, uint32_t id) { std::shared_ptr msg = std::make_shared(MessageType::DBContactRemove); msg->id = id; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::ContactUpdate(sys::Service *serv, const ContactRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBContactUpdate, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::ContactBlock(sys::Service *serv, uint32_t id, const bool shouldBeBlocked) { std::shared_ptr msg = std::make_shared(MessageType::DBContactBlock, id, shouldBeBlocked); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return true; } else { return false; } } uint32_t DBServiceAPI::ContactGetCount(sys::Service *serv, bool favourites) { std::shared_ptr msg = std::make_shared(MessageType::DBContactGetCount, ContactRecord{}, favourites); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return contactResponse->count; } else { return false; } } // std::unique_ptr> DBServiceAPI::ContactGetLimitOffset(sys::Service *serv, uint32_t offset, bool DBServiceAPI::ContactGetLimitOffset(sys::Service *serv, uint32_t offset, uint32_t limit, bool favourites) { std::shared_ptr msg = std::make_shared(MessageType::DBContactGetLimitOffset, ContactRecord{}, favourites); msg->offset = offset; msg->limit = limit; // auto ret = sys::Bus::SendUnicast(msg,ServiceDB::serviceName,serv,5000); // DBContactResponseMessage* contactResponse = reinterpret_cast(ret.second.get()); // contactResponse->offset = msg->offset; // contactResponse->limit = msg->limit; // contactResponse->favourite = favourites; // // if((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)){ // return std::move(contactResponse->records); // } // else{ // return std::make_unique>(); // } sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv); return true; } std::unique_ptr> DBServiceAPI::ContactSearch(sys::Service *serv, UTF8 primaryName, UTF8 alternativeName, UTF8 number) { std::shared_ptr msg = std::make_shared(MessageType::DBContactSearch, (primaryName.length() > 0) ? primaryName.c_str() : "", (alternativeName.length() > 0) ? alternativeName.c_str() : "", (number.length() > 0) ? number.c_str() : ""); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBContactResponseMessage *contactResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) { return std::move(contactResponse->records); } else { return std::make_unique>(); } } bool DBServiceAPI::AlarmAdd(sys::Service *serv, const AlarmsRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBAlarmAdd, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBAlarmResponseMessage *alarmResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (alarmResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::AlarmRemove(sys::Service *serv, uint32_t id) { std::shared_ptr msg = std::make_shared(MessageType::DBAlarmRemove); msg->id = id; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBAlarmResponseMessage *alarmResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (alarmResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::AlarmUpdate(sys::Service *serv, const AlarmsRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBAlarmUpdate, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBAlarmResponseMessage *alarmResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (alarmResponse->retCode == true)) { return true; } else { return false; } } uint32_t DBServiceAPI::AlarmGetCount(sys::Service *serv) { std::shared_ptr msg = std::make_shared(MessageType::DBAlarmGetCount); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBAlarmResponseMessage *alarmResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (alarmResponse->retCode == true)) { return alarmResponse->count; } else { return false; } } std::unique_ptr> DBServiceAPI::AlarmGetLimitOffset(sys::Service *serv, uint32_t offset, uint32_t limit) { std::shared_ptr msg = std::make_shared(MessageType::DBAlarmGetLimitOffset); msg->offset = offset; msg->limit = limit; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBAlarmResponseMessage *alarmResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (alarmResponse->retCode == true)) { return std::move(alarmResponse->records); } else { return std::make_unique>(); } } AlarmsRecord DBServiceAPI::AlarmGetNext(sys::Service *serv, time_t time) { std::shared_ptr msg = std::make_shared(MessageType::DBAlarmGetNext); msg->time = time; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBAlarmResponseMessage *alarmResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (alarmResponse->retCode == true)) { return std::move((*alarmResponse->records)[0]); } else { return AlarmsRecord{}; } } bool DBServiceAPI::NotesAdd(sys::Service *serv, const NotesRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBNotesAdd, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBNotesResponseMessage *notesResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (notesResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::NotesRemove(sys::Service *serv, uint32_t id) { std::shared_ptr msg = std::make_shared(MessageType::DBNotesRemove); msg->id = id; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBNotesResponseMessage *notesResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (notesResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::NotesUpdate(sys::Service *serv, const NotesRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBNotesUpdate, rec); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBNotesResponseMessage *notesResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (notesResponse->retCode == true)) { return true; } else { return false; } } uint32_t DBServiceAPI::NotesGetCount(sys::Service *serv) { std::shared_ptr msg = std::make_shared(MessageType::DBNotesGetCount); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBNotesResponseMessage *notesResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (notesResponse->retCode == true)) { return notesResponse->count; } else { return false; } } bool DBServiceAPI::NotesGetLimitOffset(sys::Service *serv, uint32_t offset, uint32_t limit) { std::shared_ptr msg = std::make_shared(MessageType::DBNotesGetLimitOffset); msg->offset = offset; msg->limit = limit; sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv); return true; } uint32_t DBServiceAPI::CalllogAdd(sys::Service *serv, const CalllogRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBCalllogAdd, rec); LOG_DEBUG("CalllogAdd %s", utils::to_string(rec).c_str()); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBCalllogResponseMessage *calllogResponse = reinterpret_cast(ret.second.get()); uint32_t recId = DB_ID_NONE; if ((ret.first == sys::ReturnCodes::Success) && (calllogResponse->retCode == true)) { auto records = *calllogResponse->records; if (!records.empty()) { recId = records[0].id; } } return recId; } bool DBServiceAPI::CalllogRemove(sys::Service *serv, uint32_t id) { std::shared_ptr msg = std::make_shared(MessageType::DBCalllogRemove); msg->id = id; auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBCalllogResponseMessage *calllogResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (calllogResponse->retCode == true)) { return true; } else { return false; } } bool DBServiceAPI::CalllogUpdate(sys::Service *serv, const CalllogRecord &rec) { std::shared_ptr msg = std::make_shared(MessageType::DBCalllogUpdate, rec); LOG_DEBUG("CalllogUpdate %s", utils::to_string(rec).c_str()); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBCalllogResponseMessage *calllogResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (calllogResponse->retCode == true)) { return true; } else { return false; } } uint32_t DBServiceAPI::CalllogGetCount(sys::Service *serv) { std::shared_ptr msg = std::make_shared(MessageType::DBCalllogGetCount); auto ret = sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv, 5000); DBCalllogResponseMessage *calllogResponse = reinterpret_cast(ret.second.get()); if ((ret.first == sys::ReturnCodes::Success) && (calllogResponse->retCode == true)) { return calllogResponse->count; } else { return 0; } } bool DBServiceAPI::CalllogGetLimitOffset(sys::Service *serv, uint32_t offset, uint32_t limit) { std::shared_ptr msg = std::make_shared(MessageType::DBCalllogGetLimitOffset); msg->offset = offset; msg->limit = limit; sys::Bus::SendUnicast(msg, ServiceDB::serviceName, serv); return true; }