some more thinking about delay manager

This commit is contained in:
Blue 2023-03-07 21:45:01 +03:00
parent 99fd001292
commit 9fff409630
Signed by: blue
GPG key ID: 9B203B252A63EE38
17 changed files with 320 additions and 96 deletions

View file

@ -21,7 +21,7 @@
#include "owncardinternal.h"
#include "owninfoforuser.h"
Core::DelayManager::DelayManager(Job::Id mpj, QObject* parent) :
Core::DelayManager::Manager::Manager(Job::Id mpj, QObject* parent) :
QObject(parent),
maxParallelJobs(mpj),
nextJobId(1),
@ -33,13 +33,23 @@ Core::DelayManager::DelayManager(Job::Id mpj, QObject* parent) :
ownInfoJobId(0),
scheduledVCards(),
requestedVCards(),
#ifdef WITH_OMEMO
requestedBundles()
#endif
{
}
Core::DelayManager::~DelayManager() {}
Core::DelayManager::Manager::~Manager() {
for (const std::pair<const Job::Id, Job*>& pair : runningJobs) {
delete pair.second;
}
Core::Job::Id Core::DelayManager::getNextJobId() {
for (Job* job : jobSequence) {
delete job;
}
}
Core::Job::Id Core::DelayManager::Manager::getNextJobId() {
Job::Id id = nextJobId++;
if (id == 0)
id = nextJobId++;
@ -47,7 +57,7 @@ Core::Job::Id Core::DelayManager::getNextJobId() {
return id;
}
void Core::DelayManager::getInfo(const QString& jid) {
void Core::DelayManager::Manager::getInfo(const QString& jid) {
Job* job = nullptr;
#ifdef WITH_OMEMO
std::map<QString, Job::Id>::const_iterator bitr = requestedBundles.find(jid);
@ -58,13 +68,13 @@ void Core::DelayManager::getInfo(const QString& jid) {
job = getVCardJob(jid);
if (job != nullptr) {
if (job->getType() == Job::Type::cardInternal)
if (job->type == Job::Type::cardInternal)
replaceJob(new InfoForUser(job->id, jid));
} else
scheduleJob(new InfoForUser(getNextJobId(), jid));
}
void Core::DelayManager::getOwnInfo() {
void Core::DelayManager::Manager::getOwnInfo() {
if (ownInfoJobId == 0) {
if (ownVCardJobId != 0)
replaceJob(new OwnInfoForUser(ownVCardJobId));
@ -73,18 +83,18 @@ void Core::DelayManager::getOwnInfo() {
}
}
void Core::DelayManager::getVCard(const QString& jid) {
void Core::DelayManager::Manager::getVCard(const QString& jid) {
Job* job = getVCardJob(jid);
if (job == nullptr)
scheduleJob(new CardInternal(getNextJobId(), jid));
}
void Core::DelayManager::getOwnVCard() {
void Core::DelayManager::Manager::getOwnVCard() {
if (ownInfoJobId == 0)
scheduleJob(new OwnCardInternal(getNextJobId()));
}
Core::Job* Core::DelayManager::getVCardJob(const QString& jid) {
Core::Job* Core::DelayManager::Manager::getVCardJob(const QString& jid) {
Job* job = nullptr;
std::map<QString, Job::Id>::const_iterator sitr = scheduledVCards.find(jid);
if (sitr == scheduledVCards.end()) {
@ -97,16 +107,16 @@ Core::Job* Core::DelayManager::getVCardJob(const QString& jid) {
return job;
}
void Core::DelayManager::preScheduleJob(Core::Job* job) {
switch (job->getType()) {
void Core::DelayManager::Manager::preScheduleJob(Core::Job* job) {
switch (job->type) {
case Job::Type::cardInternal:
scheduledVCards.emplace(static_cast<CardInternal*>(job)->jid, job->id);
scheduledVCards.emplace(dynamic_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);
scheduledVCards.emplace(dynamic_cast<InfoForUser*>(job)->jid, job->id);
break;
case Job::Type::ownInfoForUser:
ownVCardJobId = job->id;
@ -115,7 +125,7 @@ void Core::DelayManager::preScheduleJob(Core::Job* job) {
}
}
void Core::DelayManager::scheduleJob(Core::Job* job) {
void Core::DelayManager::Manager::scheduleJob(Core::Job* job) {
preScheduleJob(job);
if (runningJobs.size() < maxParallelJobs) {
executeJob(job);
@ -124,11 +134,11 @@ void Core::DelayManager::scheduleJob(Core::Job* job) {
}
}
void Core::DelayManager::preExecuteJob(Core::Job* job) {
switch (job->getType()) {
void Core::DelayManager::Manager::preExecuteJob(Core::Job* job) {
switch (job->type) {
case Job::Type::cardInternal:
case Job::Type::infoForUser: {
CardInternal* cij = static_cast<CardInternal*>(job);
Contact* cij = dynamic_cast<Contact*>(job);
requestedVCards.emplace(cij->jid, job->id);
scheduledVCards.erase(cij->jid);
}
@ -139,13 +149,13 @@ void Core::DelayManager::preExecuteJob(Core::Job* job) {
}
}
void Core::DelayManager::executeJob(Core::Job* job) {
void Core::DelayManager::Manager::executeJob(Core::Job* job) {
preExecuteJob(job);
runningJobs.emplace(job->id, job);
switch (job->getType()) {
switch (job->type) {
case Job::Type::cardInternal:
case Job::Type::infoForUser:
emit requestVCard(static_cast<CardInternal*>(job)->jid);
emit requestVCard(dynamic_cast<Contact*>(job)->jid);
break;
case Job::Type::ownInfoForUser:
case Job::Type::ownCardInternal:
@ -154,7 +164,7 @@ void Core::DelayManager::executeJob(Core::Job* job) {
}
}
void Core::DelayManager::jobIsDone(Job::Id jobId) {
void Core::DelayManager::Manager::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
@ -169,7 +179,7 @@ void Core::DelayManager::jobIsDone(Job::Id jobId) {
}
}
void Core::DelayManager::replaceJob(Core::Job* job) {
void Core::DelayManager::Manager::replaceJob(Core::Job* job) {
preScheduleJob(job);
std::map<Job::Id, Job*>::iterator itr = runningJobs.find(job->id);
if (itr != runningJobs.end()) {
@ -187,7 +197,63 @@ void Core::DelayManager::replaceJob(Core::Job* job) {
}
}
void Core::DelayManager::receivedVCard(const QString& jid, const Shared::VCard& card) {
void Core::DelayManager::Manager::jobIsCanceled(Core::Job* job, bool wasRunning) {
switch (job->type) {
case Job::Type::cardInternal: {
CardInternal* jb = dynamic_cast<CardInternal*>(job);
if (wasRunning)
requestedVCards.erase(jb->jid);
else
scheduledVCards.erase(jb->jid);
emit receivedVCard(jb->jid, Shared::VCard());
}
break;
case Job::Type::infoForUser: {
InfoForUser* jb = dynamic_cast<InfoForUser*>(job);
if (jb->getStage() == InfoForUser::Stage::waitingForVCard) {
if (wasRunning)
requestedVCards.erase(jb->jid);
else
scheduledVCards.erase(jb->jid);
emit receivedVCard(jb->jid, Shared::VCard());
}
emit receivedInfo(Shared::Info(jb->jid));
}
break;
case Job::Type::ownInfoForUser: {
OwnInfoForUser* jb = dynamic_cast<OwnInfoForUser*>(job);
if (jb->getStage() == OwnInfoForUser::Stage::waitingForVCard) {
ownVCardJobId = 0;
emit receivedOwnCard(Shared::VCard());
}
ownInfoJobId = 0;
emit receivedOwnInfo(Shared::Info (""));
}
break;
case Job::Type::ownCardInternal:
ownVCardJobId = 0;
emit receivedOwnCard(Shared::VCard());
break;
}
delete job;
}
void Core::DelayManager::Manager::disconnected() {
for (const std::pair<const Job::Id, Job*> pair : runningJobs)
jobIsCanceled(pair.second, true);
for (Job* job : scheduledJobs)
jobIsCanceled(job, false);
runningJobs.clear();
scheduledJobs.clear();
}
void Core::DelayManager::Manager::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;
@ -195,7 +261,7 @@ void Core::DelayManager::receivedVCard(const QString& jid, const Shared::VCard&
Job::Id jobId = cardItr->second;
requestedVCards.erase(cardItr);
Job* job = runningJobs.at(jobId);
switch (job->getType()) {
switch (job->type) {
case Job::Type::cardInternal:
jobIsDone(jobId);
emit receivedCard(jid, card);
@ -221,11 +287,11 @@ void Core::DelayManager::receivedVCard(const QString& jid, const Shared::VCard&
}
}
void Core::DelayManager::ownVCardReceived(const Shared::VCard& card) {
void Core::DelayManager::Manager::ownVCardReceived(const Shared::VCard& card) {
Job::Id jobId = ownVCardJobId;
ownVCardJobId = 0;
Job* job = runningJobs.at(jobId);
switch (job->getType()) {
switch (job->type) {
case Job::Type::ownCardInternal:
jobIsDone(jobId);
emit receivedOwnCard(card);
@ -250,6 +316,6 @@ void Core::DelayManager::ownVCardReceived(const Shared::VCard& card) {
}
}
void Core::DelayManager::receivedBundles(const QString& jid) {
void Core::DelayManager::Manager::receivedBundles(const QString& jid) {
}