forked from blue/squawk
some more thinking about delay manager
This commit is contained in:
parent
2d8f32c257
commit
99fd001292
@ -34,3 +34,4 @@ add_subdirectory(handlers)
|
|||||||
add_subdirectory(storage)
|
add_subdirectory(storage)
|
||||||
add_subdirectory(passwordStorageEngines)
|
add_subdirectory(passwordStorageEngines)
|
||||||
add_subdirectory(components)
|
add_subdirectory(components)
|
||||||
|
add_subdirectory(delayManager)
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
set(SOURCE_FILES
|
set(SOURCE_FILES
|
||||||
networkaccess.cpp
|
networkaccess.cpp
|
||||||
clientcache.cpp
|
clientcache.cpp
|
||||||
delaymanager.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(HEADER_FILES
|
set(HEADER_FILES
|
||||||
networkaccess.h
|
networkaccess.h
|
||||||
clientcache.h
|
clientcache.h
|
||||||
delaymanager.h
|
|
||||||
)
|
)
|
||||||
|
|
||||||
target_sources(squawk PRIVATE
|
target_sources(squawk PRIVATE
|
||||||
|
@ -1,136 +0,0 @@
|
|||||||
// Squawk messenger.
|
|
||||||
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "delaymanager.h"
|
|
||||||
|
|
||||||
Core::DelayManager::DelayManager(uint16_t mpj, QObject* parent) :
|
|
||||||
QObject(parent),
|
|
||||||
maxParallelJobs(mpj),
|
|
||||||
nextJobId(0),
|
|
||||||
scheduledJobs(),
|
|
||||||
runningJobs(),
|
|
||||||
pendingVCards(),
|
|
||||||
requestedVCards()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Core::DelayManager::~DelayManager() {}
|
|
||||||
|
|
||||||
void Core::DelayManager::requestInfo(const QString& jid) {
|
|
||||||
bool needToRequest = false;
|
|
||||||
std::pair<std::set<QString>::const_iterator, bool> result = pendingVCards.insert(jid);
|
|
||||||
if (result.second) { //if there is a clear evidence that we have not alredy been asked to request a VCard - just request it
|
|
||||||
needToRequest = true;
|
|
||||||
} else {
|
|
||||||
std::map<QString, uint16_t>::const_iterator itr = requestedVCards.find(jid);
|
|
||||||
if (itr != requestedVCards.end()) { //first check if the card is already requested, and if it is make sure we reply to user after we receive it
|
|
||||||
runningJobs[itr->second].first = TaskType::infoForUser;
|
|
||||||
} else {
|
|
||||||
needToRequest = true;
|
|
||||||
for (Job& job : scheduledJobs) { //looks like we need to manually check all the scheduled job and find the one with that jid there
|
|
||||||
if (job.first == TaskType::cardInternal || job.first == TaskType::infoForUser) { //to make sure we reply to user after we receive it
|
|
||||||
QString* jobJid = static_cast<QString*>(job.second);
|
|
||||||
if (*jobJid == jid) {
|
|
||||||
needToRequest = false;
|
|
||||||
job.first = TaskType::infoForUser;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (needToRequest) {
|
|
||||||
throw 8573; //something went terribly wrong here, the state is not correct;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needToRequest)
|
|
||||||
scheduleJob(TaskType::infoForUser, new QString(jid));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Core::DelayManager::requestVCard(const QString& jid) {
|
|
||||||
std::pair<std::set<QString>::const_iterator, bool> result = pendingVCards.insert(jid);
|
|
||||||
if (result.second)
|
|
||||||
scheduleJob(TaskType::cardInternal, new QString(jid));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Core::DelayManager::scheduleJob(Core::DelayManager::TaskType type, void* data) {
|
|
||||||
if (runningJobs.size() < maxParallelJobs) {
|
|
||||||
uint16_t currentJobId = nextJobId++;
|
|
||||||
runningJobs.emplace(currentJobId, std::make_pair(type, data));
|
|
||||||
switch (type) {
|
|
||||||
case TaskType::cardInternal:
|
|
||||||
case TaskType::infoForUser: {
|
|
||||||
QString* jid = static_cast<QString*>(data);
|
|
||||||
requestedVCards.emplace(*jid, currentJobId);
|
|
||||||
emit requestVCard(*jid);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
scheduledJobs.emplace_back(type, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Core::DelayManager::executeJob(Core::DelayManager::Job job) {
|
|
||||||
uint16_t currentJobId = nextJobId++;
|
|
||||||
runningJobs.emplace(currentJobId, job);
|
|
||||||
switch (job.first) {
|
|
||||||
case TaskType::cardInternal:
|
|
||||||
case TaskType::infoForUser: {
|
|
||||||
QString* jid = static_cast<QString*>(job.second);
|
|
||||||
requestedVCards.emplace(*jid, currentJobId);
|
|
||||||
emit requestVCard(*jid);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Core::DelayManager::jobIsDone(uint16_t jobId) {
|
|
||||||
std::map<uint16_t, Job>::const_iterator itr = runningJobs.find(jobId);
|
|
||||||
if (itr == runningJobs.end()) {
|
|
||||||
throw 8574; //not supposed to happen, never
|
|
||||||
}
|
|
||||||
runningJobs.erase(itr);
|
|
||||||
if (scheduledJobs.size() > 0) {
|
|
||||||
Job job = scheduledJobs.front();
|
|
||||||
scheduledJobs.pop_front();
|
|
||||||
executeJob(job);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Core::DelayManager::receivedVCard(const QString& jid, const Shared::VCard& card) {
|
|
||||||
std::map<QString, uint16_t>::const_iterator cardItr = requestedVCards.find(jid);
|
|
||||||
if (cardItr == requestedVCards.end()) {
|
|
||||||
throw 8575; //never supposed to happen, the state is not correct;
|
|
||||||
} else {
|
|
||||||
uint16_t jobId = cardItr->second;
|
|
||||||
requestedVCards.erase(cardItr);
|
|
||||||
pendingVCards.erase(jid);
|
|
||||||
const Job& job = runningJobs[jobId];
|
|
||||||
switch (job.first) {
|
|
||||||
case TaskType::cardInternal:
|
|
||||||
jobIsDone(jobId);
|
|
||||||
break;
|
|
||||||
case TaskType::infoForUser:
|
|
||||||
//all that stuff with further requesting
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw 8576;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
// Squawk messenger.
|
|
||||||
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef CORE_DELAYMANAGER_H
|
|
||||||
#define CORE_DELAYMANAGER_H
|
|
||||||
|
|
||||||
#include <list>
|
|
||||||
#include <set>
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
#include <shared/vcard.h>
|
|
||||||
#include <shared/info.h>
|
|
||||||
|
|
||||||
namespace Core {
|
|
||||||
|
|
||||||
class DelayManager : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
enum class TaskType {
|
|
||||||
cardInternal,
|
|
||||||
infoForUser
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
DelayManager(uint16_t maxParallelJobs = 5, QObject* parent = nullptr);
|
|
||||||
~DelayManager();
|
|
||||||
|
|
||||||
void requestVCard(const QString& jid);
|
|
||||||
void requestInfo(const QString& jid);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void requestVCard(const QString& jid);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void receivedVCard(const QString& jid, const Shared::VCard& card);
|
|
||||||
|
|
||||||
private:
|
|
||||||
typedef std::pair<TaskType, void*> Job;
|
|
||||||
|
|
||||||
void scheduleJob(TaskType type, void* data);
|
|
||||||
void executeJob(Job job);
|
|
||||||
void jobIsDone(uint16_t jobId);
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint16_t maxParallelJobs;
|
|
||||||
uint16_t nextJobId;
|
|
||||||
std::list<Job> scheduledJobs;
|
|
||||||
std::map<uint16_t, Job> runningJobs;
|
|
||||||
|
|
||||||
std::set<QString> pendingVCards;
|
|
||||||
std::map<QString, uint16_t> requestedVCards;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // CORE_DELAYMANAGER_H
|
|
22
core/delayManager/CMakeLists.txt
Normal file
22
core/delayManager/CMakeLists.txt
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
set(SOURCE_FILES
|
||||||
|
delaymanager.cpp
|
||||||
|
job.cpp
|
||||||
|
cardinternal.cpp
|
||||||
|
infoforuser.cpp
|
||||||
|
owncardinternal.cpp
|
||||||
|
owninfoforuser.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(HEADER_FILES
|
||||||
|
delaymanager.h
|
||||||
|
job.h
|
||||||
|
cardinternal.h
|
||||||
|
infoforuser.h
|
||||||
|
owncardinternal.h
|
||||||
|
owninfoforuser.h
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(squawk PRIVATE
|
||||||
|
${SOURCE_FILES}
|
||||||
|
${HEADER_FILES}
|
||||||
|
)
|
32
core/delayManager/cardinternal.cpp
Normal file
32
core/delayManager/cardinternal.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "cardinternal.h"
|
||||||
|
|
||||||
|
Core::CardInternal::CardInternal(Job::Id p_id, const QString& p_jid) :
|
||||||
|
Job(p_id, Type::cardInternal),
|
||||||
|
jid(p_id)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Core::CardInternal::CardInternal(Job::Id p_id, const QString& p_jid, Job::Type p_type) :
|
||||||
|
Job(p_id, p_type),
|
||||||
|
jid(p_id)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Core::CardInternal::CardInternal(const Core::CardInternal& other) :
|
||||||
|
Job(other),
|
||||||
|
jid(other.jid)
|
||||||
|
{}
|
41
core/delayManager/cardinternal.h
Normal file
41
core/delayManager/cardinternal.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CORE_CARDINTERNAL_H
|
||||||
|
#define CORE_CARDINTERNAL_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
#include "job.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
|
||||||
|
class CardInternal : public Job {
|
||||||
|
protected:
|
||||||
|
CardInternal(Job::Id id, const QString& jid, Job::Type type);
|
||||||
|
|
||||||
|
public:
|
||||||
|
CardInternal(Job::Id id, const QString& jid);
|
||||||
|
CardInternal(const CardInternal& other);
|
||||||
|
|
||||||
|
const QString jid;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CORE_CARDINTERNAL_H
|
255
core/delayManager/delaymanager.cpp
Normal file
255
core/delayManager/delaymanager.cpp
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "delaymanager.h"
|
||||||
|
|
||||||
|
#include "cardinternal.h"
|
||||||
|
#include "infoforuser.h"
|
||||||
|
#include "owncardinternal.h"
|
||||||
|
#include "owninfoforuser.h"
|
||||||
|
|
||||||
|
Core::DelayManager::DelayManager(Job::Id mpj, QObject* parent) :
|
||||||
|
QObject(parent),
|
||||||
|
maxParallelJobs(mpj),
|
||||||
|
nextJobId(1),
|
||||||
|
scheduledJobs(),
|
||||||
|
scheduledJobsById(scheduledJobs.get<id>()),
|
||||||
|
jobSequence(scheduledJobs.get<sequence>()),
|
||||||
|
runningJobs(),
|
||||||
|
ownVCardJobId(0),
|
||||||
|
ownInfoJobId(0),
|
||||||
|
scheduledVCards(),
|
||||||
|
requestedVCards(),
|
||||||
|
requestedBundles()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::DelayManager::~DelayManager() {}
|
||||||
|
|
||||||
|
Core::Job::Id Core::DelayManager::getNextJobId() {
|
||||||
|
Job::Id id = nextJobId++;
|
||||||
|
if (id == 0)
|
||||||
|
id = nextJobId++;
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::getInfo(const QString& jid) {
|
||||||
|
Job* job = nullptr;
|
||||||
|
#ifdef WITH_OMEMO
|
||||||
|
std::map<QString, Job::Id>::const_iterator bitr = requestedBundles.find(jid);
|
||||||
|
if (bitr != requestedBundles.end())
|
||||||
|
job = runningJobs.at(bitr->second);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
job = getVCardJob(jid);
|
||||||
|
|
||||||
|
if (job != nullptr) {
|
||||||
|
if (job->getType() == Job::Type::cardInternal)
|
||||||
|
replaceJob(new InfoForUser(job->id, jid));
|
||||||
|
} else
|
||||||
|
scheduleJob(new InfoForUser(getNextJobId(), jid));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::getOwnInfo() {
|
||||||
|
if (ownInfoJobId == 0) {
|
||||||
|
if (ownVCardJobId != 0)
|
||||||
|
replaceJob(new OwnInfoForUser(ownVCardJobId));
|
||||||
|
else
|
||||||
|
scheduleJob(new OwnInfoForUser(getNextJobId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::getVCard(const QString& jid) {
|
||||||
|
Job* job = getVCardJob(jid);
|
||||||
|
if (job == nullptr)
|
||||||
|
scheduleJob(new CardInternal(getNextJobId(), jid));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::getOwnVCard() {
|
||||||
|
if (ownInfoJobId == 0)
|
||||||
|
scheduleJob(new OwnCardInternal(getNextJobId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::Job* Core::DelayManager::getVCardJob(const QString& jid) {
|
||||||
|
Job* job = nullptr;
|
||||||
|
std::map<QString, Job::Id>::const_iterator sitr = scheduledVCards.find(jid);
|
||||||
|
if (sitr == scheduledVCards.end()) {
|
||||||
|
std::map<QString, Job::Id>::const_iterator ritr = requestedVCards.find(jid);
|
||||||
|
if (ritr != requestedVCards.end())
|
||||||
|
job = runningJobs.at(ritr->second);
|
||||||
|
} else {
|
||||||
|
job = *(scheduledJobsById.find(sitr->second));
|
||||||
|
}
|
||||||
|
|
||||||
|
return job;
|
||||||
|
}
|
||||||
|
void Core::DelayManager::preScheduleJob(Core::Job* job) {
|
||||||
|
switch (job->getType()) {
|
||||||
|
case Job::Type::cardInternal:
|
||||||
|
scheduledVCards.emplace(static_cast<CardInternal*>(job)->jid, job->id);
|
||||||
|
break;
|
||||||
|
case Job::Type::ownCardInternal:
|
||||||
|
ownVCardJobId = job->id;
|
||||||
|
break;
|
||||||
|
case Job::Type::infoForUser:
|
||||||
|
scheduledVCards.emplace(static_cast<InfoForUser*>(job)->jid, job->id);
|
||||||
|
break;
|
||||||
|
case Job::Type::ownInfoForUser:
|
||||||
|
ownVCardJobId = job->id;
|
||||||
|
ownInfoJobId = job->id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::scheduleJob(Core::Job* job) {
|
||||||
|
preScheduleJob(job);
|
||||||
|
if (runningJobs.size() < maxParallelJobs) {
|
||||||
|
executeJob(job);
|
||||||
|
} else {
|
||||||
|
scheduledJobs.push_back(job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::preExecuteJob(Core::Job* job) {
|
||||||
|
switch (job->getType()) {
|
||||||
|
case Job::Type::cardInternal:
|
||||||
|
case Job::Type::infoForUser: {
|
||||||
|
CardInternal* cij = static_cast<CardInternal*>(job);
|
||||||
|
requestedVCards.emplace(cij->jid, job->id);
|
||||||
|
scheduledVCards.erase(cij->jid);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Job::Type::ownInfoForUser:
|
||||||
|
case Job::Type::ownCardInternal:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::executeJob(Core::Job* job) {
|
||||||
|
preExecuteJob(job);
|
||||||
|
runningJobs.emplace(job->id, job);
|
||||||
|
switch (job->getType()) {
|
||||||
|
case Job::Type::cardInternal:
|
||||||
|
case Job::Type::infoForUser:
|
||||||
|
emit requestVCard(static_cast<CardInternal*>(job)->jid);
|
||||||
|
break;
|
||||||
|
case Job::Type::ownInfoForUser:
|
||||||
|
case Job::Type::ownCardInternal:
|
||||||
|
emit requestOwnVCard();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::jobIsDone(Job::Id jobId) {
|
||||||
|
std::map<Job::Id, Job*>::const_iterator itr = runningJobs.find(jobId);
|
||||||
|
if (itr == runningJobs.end()) {
|
||||||
|
throw 8573; //not supposed to happen, ever
|
||||||
|
}
|
||||||
|
Job* job = itr->second;
|
||||||
|
delete job;
|
||||||
|
runningJobs.erase(itr);
|
||||||
|
if (scheduledJobs.size() > 0) {
|
||||||
|
Job* job = scheduledJobs.front();
|
||||||
|
scheduledJobs.pop_front();
|
||||||
|
executeJob(job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::replaceJob(Core::Job* job) {
|
||||||
|
preScheduleJob(job);
|
||||||
|
std::map<Job::Id, Job*>::iterator itr = runningJobs.find(job->id);
|
||||||
|
if (itr != runningJobs.end()) {
|
||||||
|
preExecuteJob(job);
|
||||||
|
delete itr->second;
|
||||||
|
itr->second = job;
|
||||||
|
} else {
|
||||||
|
StorageById::iterator sitr = scheduledJobsById.find(job->id);
|
||||||
|
if (sitr != scheduledJobsById.end()) {
|
||||||
|
delete *(sitr);
|
||||||
|
scheduledJobsById.replace(sitr, job);
|
||||||
|
} else {
|
||||||
|
throw 8574; //not supposed to happen, ever
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::receivedVCard(const QString& jid, const Shared::VCard& card) {
|
||||||
|
std::map<QString, Job::Id>::const_iterator cardItr = requestedVCards.find(jid);
|
||||||
|
if (cardItr == requestedVCards.end()) {
|
||||||
|
throw 8575; //never supposed to happen, the state is not correct;
|
||||||
|
} else {
|
||||||
|
Job::Id jobId = cardItr->second;
|
||||||
|
requestedVCards.erase(cardItr);
|
||||||
|
Job* job = runningJobs.at(jobId);
|
||||||
|
switch (job->getType()) {
|
||||||
|
case Job::Type::cardInternal:
|
||||||
|
jobIsDone(jobId);
|
||||||
|
emit receivedCard(jid, card);
|
||||||
|
break;
|
||||||
|
case Job::Type::infoForUser:
|
||||||
|
#ifdef WITH_OMEMO
|
||||||
|
requestedBundles.emplace(jid, jobId);
|
||||||
|
//TODO save card!
|
||||||
|
emit requestBundles(jid);
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
Shared::Info info(jid);
|
||||||
|
info.turnIntoContact(card);
|
||||||
|
emit receivedInfo(info);
|
||||||
|
}
|
||||||
|
jobIsDone(jobId);
|
||||||
|
#endif
|
||||||
|
emit receivedCard(jid, card);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw 8576;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::ownVCardReceived(const Shared::VCard& card) {
|
||||||
|
Job::Id jobId = ownVCardJobId;
|
||||||
|
ownVCardJobId = 0;
|
||||||
|
Job* job = runningJobs.at(jobId);
|
||||||
|
switch (job->getType()) {
|
||||||
|
case Job::Type::ownCardInternal:
|
||||||
|
jobIsDone(jobId);
|
||||||
|
emit receivedOwnCard(card);
|
||||||
|
break;
|
||||||
|
case Job::Type::ownInfoForUser:
|
||||||
|
#ifdef WITH_OMEMO
|
||||||
|
//requestedBundles.emplace(jid, jobId);
|
||||||
|
//TODO save card!
|
||||||
|
emit requestOwnBundle();
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
Shared::Info info("");
|
||||||
|
info.turnIntoOwnAccount(card);
|
||||||
|
emit receivedOwnInfo(info);
|
||||||
|
}
|
||||||
|
jobIsDone(jobId);
|
||||||
|
#endif
|
||||||
|
emit receivedOwnCard(card);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw 8576;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::DelayManager::receivedBundles(const QString& jid) {
|
||||||
|
|
||||||
|
}
|
116
core/delayManager/delaymanager.h
Normal file
116
core/delayManager/delaymanager.h
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CORE_DELAYMANAGER_H
|
||||||
|
#define CORE_DELAYMANAGER_H
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <boost/multi_index_container.hpp>
|
||||||
|
#include <boost/multi_index/ordered_index.hpp>
|
||||||
|
#include <boost/multi_index/sequenced_index.hpp>
|
||||||
|
#include <boost/multi_index/member.hpp>
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
#include <shared/vcard.h>
|
||||||
|
#include <shared/info.h>
|
||||||
|
|
||||||
|
#include "job.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
|
||||||
|
class DelayManager : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
DelayManager(Job::Id maxParallelJobs = 5, QObject* parent = nullptr);
|
||||||
|
~DelayManager();
|
||||||
|
|
||||||
|
void getOwnVCard();
|
||||||
|
void getOwnInfo();
|
||||||
|
void getVCard(const QString& jid);
|
||||||
|
void getInfo(const QString& jid);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void requestVCard(const QString& jid);
|
||||||
|
void requestOwnVCard();
|
||||||
|
void requestBundles(const QString& jid);
|
||||||
|
void requestOwnBundle();
|
||||||
|
void receivedCard(const QString& jid, const Shared::VCard& info);
|
||||||
|
void receivedOwnCard(const Shared::VCard& info);
|
||||||
|
void receivedInfo(const Shared::Info& info);
|
||||||
|
void receivedOwnInfo(const Shared::Info& info);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void ownVCardReceived(const Shared::VCard& card);
|
||||||
|
void receivedVCard(const QString& jid, const Shared::VCard& card);
|
||||||
|
void receivedBundles(const QString& jid);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void preScheduleJob(Job* job);
|
||||||
|
void scheduleJob(Job* job);
|
||||||
|
void preExecuteJob(Job* job);
|
||||||
|
void executeJob(Job* job);
|
||||||
|
void jobIsDone(Job::Id jobId);
|
||||||
|
Job::Id getNextJobId();
|
||||||
|
void replaceJob(Job* job);
|
||||||
|
Job* getVCardJob(const QString& jid);
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct id {};
|
||||||
|
struct sequence {};
|
||||||
|
|
||||||
|
typedef boost::multi_index_container<
|
||||||
|
Job*,
|
||||||
|
boost::multi_index::indexed_by<
|
||||||
|
boost::multi_index::sequenced<
|
||||||
|
boost::multi_index::tag<sequence>
|
||||||
|
>,
|
||||||
|
boost::multi_index::ordered_unique<
|
||||||
|
boost::multi_index::tag<id>,
|
||||||
|
boost::multi_index::member<
|
||||||
|
Job,
|
||||||
|
const Job::Id,
|
||||||
|
&Job::id
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>
|
||||||
|
> Storage;
|
||||||
|
|
||||||
|
|
||||||
|
typedef Storage::index<id>::type StorageById;
|
||||||
|
typedef Storage::index<sequence>::type StorageSequence;
|
||||||
|
Job::Id maxParallelJobs;
|
||||||
|
Job::Id nextJobId;
|
||||||
|
|
||||||
|
Storage scheduledJobs;
|
||||||
|
StorageById& scheduledJobsById;
|
||||||
|
StorageSequence& jobSequence;
|
||||||
|
std::map<Job::Id, Job*> runningJobs;
|
||||||
|
|
||||||
|
Job::Id ownVCardJobId;
|
||||||
|
Job::Id ownInfoJobId;
|
||||||
|
std::map<QString, Job::Id> scheduledVCards;
|
||||||
|
std::map<QString, Job::Id> requestedVCards;
|
||||||
|
std::map<QString, Job::Id> requestedBundles;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CORE_DELAYMANAGER_H
|
26
core/delayManager/infoforuser.cpp
Normal file
26
core/delayManager/infoforuser.cpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "infoforuser.h"
|
||||||
|
|
||||||
|
Core::InfoForUser::InfoForUser(Job::Id p_id, const QString& p_jid) :
|
||||||
|
CardInternal(p_id, p_jid, Type::infoForUser)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Core::InfoForUser::InfoForUser(const Core::InfoForUser& other) :
|
||||||
|
CardInternal(other)
|
||||||
|
{}
|
||||||
|
|
32
core/delayManager/infoforuser.h
Normal file
32
core/delayManager/infoforuser.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CORE_INFOFORUSER_H
|
||||||
|
#define CORE_INFOFORUSER_H
|
||||||
|
|
||||||
|
#include "cardinternal.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
|
||||||
|
class InfoForUser : public CardInternal {
|
||||||
|
public:
|
||||||
|
InfoForUser(Job::Id id, const QString& jid);
|
||||||
|
InfoForUser(const InfoForUser& other);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CORE_INFOFORUSER_H
|
32
core/delayManager/job.cpp
Normal file
32
core/delayManager/job.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "job.h"
|
||||||
|
|
||||||
|
Core::Job::Job(Core::Job::Id p_id, Core::Job::Type p_type) :
|
||||||
|
id (p_id),
|
||||||
|
type (p_type) {}
|
||||||
|
|
||||||
|
|
||||||
|
Core::Job::Job(const Core::Job& other) :
|
||||||
|
id(other.id),
|
||||||
|
type(other.type) {}
|
||||||
|
|
||||||
|
Core::Job::~Job() {}
|
||||||
|
|
||||||
|
Core::Job::Type Core::Job::getType() const {
|
||||||
|
return type;
|
||||||
|
}
|
50
core/delayManager/job.h
Normal file
50
core/delayManager/job.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CORE_DELAYMANAGER_JOB_H
|
||||||
|
#define CORE_DELAYMANAGER_JOB_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
|
||||||
|
class Job {
|
||||||
|
public:
|
||||||
|
typedef uint16_t Id;
|
||||||
|
|
||||||
|
enum class Type {
|
||||||
|
cardInternal,
|
||||||
|
ownCardInternal,
|
||||||
|
infoForUser,
|
||||||
|
ownInfoForUser
|
||||||
|
};
|
||||||
|
|
||||||
|
Job(Id id, Type type);
|
||||||
|
Job(const Job& other);
|
||||||
|
virtual ~Job();
|
||||||
|
|
||||||
|
const Id id;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Type getType() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Type type;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CORE_DELAYMANAGER_JOB_H
|
30
core/delayManager/owncardinternal.cpp
Normal file
30
core/delayManager/owncardinternal.cpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "owncardinternal.h"
|
||||||
|
|
||||||
|
Core::OwnCardInternal::OwnCardInternal(Job::Id p_id) :
|
||||||
|
Job(p_id, Type::ownCardInternal)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Core::OwnCardInternal::OwnCardInternal(Job::Id p_id, Job::Type p_type) :
|
||||||
|
Job(p_id, p_type)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Core::OwnCardInternal::OwnCardInternal(const Core::OwnCardInternal& other) :
|
||||||
|
Job(other)
|
||||||
|
{}
|
||||||
|
|
35
core/delayManager/owncardinternal.h
Normal file
35
core/delayManager/owncardinternal.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CORE_OWNCARDINTERNAL_H
|
||||||
|
#define CORE_OWNCARDINTERNAL_H
|
||||||
|
|
||||||
|
#include "job.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
|
||||||
|
class OwnCardInternal : public Job {
|
||||||
|
protected:
|
||||||
|
OwnCardInternal(Job::Id id, Job::Type type);
|
||||||
|
|
||||||
|
public:
|
||||||
|
OwnCardInternal(Job::Id id);
|
||||||
|
OwnCardInternal(const OwnCardInternal& other);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CORE_OWNCARDINTERNAL_H
|
25
core/delayManager/owninfoforuser.cpp
Normal file
25
core/delayManager/owninfoforuser.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "owninfoforuser.h"
|
||||||
|
|
||||||
|
Core::OwnInfoForUser::OwnInfoForUser(Job::Id p_id) :
|
||||||
|
OwnCardInternal(p_id, Type::ownInfoForUser)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Core::OwnInfoForUser::OwnInfoForUser(const Core::OwnInfoForUser& other) :
|
||||||
|
OwnCardInternal(other)
|
||||||
|
{}
|
32
core/delayManager/owninfoforuser.h
Normal file
32
core/delayManager/owninfoforuser.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Squawk messenger.
|
||||||
|
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CORE_OWNINFOFORUSER_H
|
||||||
|
#define CORE_OWNINFOFORUSER_H
|
||||||
|
|
||||||
|
#include "owncardinternal.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
|
||||||
|
class OwnInfoForUser : public OwnCardInternal {
|
||||||
|
public:
|
||||||
|
OwnInfoForUser(Job::Id id);
|
||||||
|
OwnInfoForUser(const OwnInfoForUser& other);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CORE_OWNINFOFORUSER_H
|
Loading…
Reference in New Issue
Block a user