implement the keyserver lookup threading gedöns

JSON-28
Roker 6 years ago
parent 17738c81b9
commit 03e2efb60d

@ -527,7 +527,7 @@ struct JsonAdapter::Internal
// keyserver lookup
locked_queue< pEp_identity*, &free_identity> keyserver_lookup_queue;
PEP_SESSION keyserver_lookup_session = nullptr;
ThreadPtr ksl_thread{nullptr, ThreadDeleter};
ThreadPtr keyserver_lookup_thread{nullptr, ThreadDeleter};
Internal(std::ostream& logger) : Log(logger) {}
@ -696,6 +696,43 @@ void JsonAdapter::stopSync()
i->sync_queue.clear();
release(i->sync_session);
i->sync_session = nullptr;
}
void JsonAdapter::startKeyserverLookup()
{
PEP_STATUS status = init(&i->keyserver_lookup_session);
if(status != PEP_STATUS_OK || i->keyserver_lookup_session==nullptr)
{
throw std::runtime_error("Cannot create keyserver lookup session! status: " + status_to_string(status));
}
i->keyserver_lookup_queue.clear();
status = register_examine_function(i->sync_session,
JsonAdapter::examineIdentity,
(void*) this
);
if (status != PEP_STATUS_OK)
throw std::runtime_error("Cannot register keyserver lookup callbacks! status: " + status_to_string(status));
i->keyserver_lookup_thread.reset( new std::thread( JsonAdapter::keyserverLookupThreadRoutine, (void*)this ) );
}
void JsonAdapter::stopKeyserverLookup()
{
// No keyserver lookup session active
if(i->keyserver_lookup_session == nullptr)
return
i->keyserver_lookup_queue.push_front(NULL);
i->keyserver_lookup_thread->join();
// there is no unregister_examine_callback() function. hum...
i->keyserver_lookup_queue.clear();
release(i->keyserver_lookup_session);
i->keyserver_lookup_session = nullptr;
}
@ -713,6 +750,15 @@ pEp_identity* JsonAdapter::retrieveNextIdentity(void* obj)
}
void* JsonAdapter::keyserverLookupThreadRoutine(void* arg)
{
JsonAdapter* ja = static_cast<JsonAdapter*>(arg);
PEP_STATUS status = do_keymanagement(&JsonAdapter::retrieveNextIdentity, arg); // does the whole work
ja->i->keyserver_lookup_queue.clear();
return (void*) status;
}
JsonAdapter::JsonAdapter(const std::string& address, unsigned start_port, unsigned end_port, bool silent, bool do_sync)
: i(new Internal( silent ? nulllogger : std::cerr ))
{

@ -63,15 +63,18 @@ public:
static void* retrieveNextSyncMsg(void* obj, time_t* timeout);
static void* syncThreadRoutine(void* arg);
void startSync(void);
void stopSync(void);
void startSync();
void stopSync();
void startKeyserverLookup();
void stopKeyserverLookup();
static int examineIdentity(pEp_identity*, void* obj);
static pEp_identity* retrieveNextIdentity(void* obj);
static void* keyserverLookupThreadRoutine(void* arg);
// returns the associated log stream (either std::cerr or nulllogger)
std::ostream& Log() const;
private:
struct Internal;

Loading…
Cancel
Save