Skip to content

Commit

Permalink
Fix RTComEl leak
Browse files Browse the repository at this point in the history
Get rid of rtcom_query struct while at it. Fix RTComElQuery owhership.

Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>
  • Loading branch information
freemangordon committed Jan 8, 2024
1 parent 435df3d commit f67ef3d
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 65 deletions.
56 changes: 29 additions & 27 deletions src/lib/rtcom.cpp
@@ -1,12 +1,16 @@
#include "lib/rtcom.h"

rtcom_query* rtcomStartQuery(const int limit, const int offset, const RTComElQueryGroupBy group_by) {
RTComElQuery *query = NULL;
RTComElIter *it = NULL;
RTComEl *el = NULL;
RTComEl *rtcomel() {
static RTComEl *el = NULL;

el = rtcom_el_new();
query = rtcom_el_query_new(el);
if (!el)
el = rtcom_el_new();

return el;
}

RTComElQuery *rtcomStartQuery(const int limit, const int offset, const RTComElQueryGroupBy group_by) {
RTComElQuery *query = rtcom_el_query_new(rtcomel());

if(group_by != RTCOM_EL_QUERY_GROUP_BY_NONE)
rtcom_el_query_set_group_by(query, group_by);
Expand All @@ -16,18 +20,19 @@ rtcom_query* rtcomStartQuery(const int limit, const int offset, const RTComElQue
if(offset > 0)
rtcom_el_query_set_offset(query, offset);

return new rtcom_query{query, it , el};
return query;
}

QList<ChatMessage*> rtcomIterateResults(rtcom_query *query_struct) {
QList<ChatMessage*> results;
query_struct->it = rtcom_el_get_events(query_struct->el, query_struct->query);
QList<ChatMessage*> rtcomIterateResults(RTComElQuery *query) {
QList<ChatMessage *> results;
RTComElIter *it = rtcom_el_get_events(rtcomel(), query);

if(query_struct->it && rtcom_el_iter_first(query_struct->it)) {
if(it && rtcom_el_iter_first(it)) {
do {
GHashTable *values = NULL;

values = rtcom_el_iter_get_value_map(
query_struct->it,
it,
"id",
"service",
"group-uid",
Expand Down Expand Up @@ -64,22 +69,20 @@ QList<ChatMessage*> rtcomIterateResults(rtcom_query *query_struct) {
LOOKUP_BOOL("outgoing"),
LOOKUP_INT("flags"));

g_hash_table_destroy(values);
g_hash_table_destroy(values);
results << item;
} while (rtcom_el_iter_next(query_struct->it));
g_object_unref(query_struct->it);
} while (rtcom_el_iter_next(it));

g_object_unref(it);
} else {
qCritical() << "Failed to init iterator to start";
}

g_object_unref(query_struct->query);
return results;
}

void create_event(time_t start_time, time_t end_time, const char* self_name, const char* backend_name, const char *remote_uid, const char *remote_name, const char* abook_uid, const char* text, bool is_outgoing, const char* protocol, const char* channel, const char* group_uid, int flags) {
void rtcomCreateEvent(time_t start_time, time_t end_time, const char* self_name, const char* backend_name, const char *remote_uid, const char *remote_name, const char* abook_uid, const char* text, bool is_outgoing, const char* protocol, const char* channel, const char* group_uid, int flags) {
qDebug() << "create_event";
if(evlog == NULL)
evlog = rtcom_el_new();

RTComElEvent *ev = rtcom_el_event_new();

Expand Down Expand Up @@ -114,7 +117,7 @@ void create_event(time_t start_time, time_t end_time, const char* self_name, con

RTCOM_EL_EVENT_SET_FIELD(ev, outgoing, is_outgoing);

if(rtcom_el_add_event(evlog, ev, NULL) < 0) {
if(rtcom_el_add_event(rtcomel(), ev, NULL) < 0) {
qDebug() << "Failed to add event to RTCom";
// todo: log failure
int wegw = 1;
Expand All @@ -125,15 +128,14 @@ void create_event(time_t start_time, time_t end_time, const char* self_name, con

QList<QString> rtcomGetLocalUids() {
QList<QString> protocols;
rtcom_query* query_struct = rtcomStartQuery(0, 0, RTCOM_EL_QUERY_GROUP_BY_EVENTS_LOCAL_UID);
if(!rtcom_el_query_prepare(query_struct->query, NULL)) {
RTComElQuery *query = rtcomStartQuery(0, 0, RTCOM_EL_QUERY_GROUP_BY_EVENTS_LOCAL_UID);
if(!rtcom_el_query_prepare(query, NULL)) {
qCritical() << __FUNCTION__ << "Could not prepare query";
g_object_unref(query_struct->query);
delete query_struct;
g_object_unref(query);
return protocols;
}

auto items = rtcomIterateResults(query_struct);
auto items = rtcomIterateResults(query);
for(auto &item: items) {
auto local_uid = item->local_uid();
if(local_uid.count("/") != 2) continue;
Expand All @@ -142,7 +144,7 @@ QList<QString> rtcomGetLocalUids() {
}
qDeleteAll(items);

g_object_unref(query_struct->query);
delete query_struct;
g_object_unref(query);

return protocols;
}
15 changes: 6 additions & 9 deletions src/lib/rtcom.h
Expand Up @@ -7,12 +7,7 @@

#include "models/ChatMessage.h"

static RTComEl *evlog;
struct rtcom_query {
RTComElQuery *query = NULL;
RTComElIter *it = NULL;
RTComEl *el = NULL;
};
RTComEl *rtcomel();

#define LOOKUP_INT(x) \
g_value_get_int((const GValue*)g_hash_table_lookup(values, x))
Expand All @@ -21,9 +16,11 @@ struct rtcom_query {
#define LOOKUP_STR(x) \
g_value_get_string((const GValue*)g_hash_table_lookup(values, x))

rtcom_query* rtcomStartQuery(int limit, int offset, RTComElQueryGroupBy group_by);
QList<ChatMessage*> rtcomIterateResults(rtcom_query *query_struct);
void create_event(time_t start_time, time_t end_time, const char* self_name, const char* backend_name, const char *remote_uid, const char *remote_name, const char* abook_uid, const char* text, bool is_outgoing, const char* protocol, const char* channel, const char* group_uid, int flags);
RTComElQuery *rtcomStartQuery(int limit, int offset, RTComElQueryGroupBy group_by);

QList<ChatMessage *> rtcomIterateResults(RTComElQuery *query_struct);

void rtcomCreateEvent(time_t start_time, time_t end_time, const char* self_name, const char* backend_name, const char *remote_uid, const char *remote_name, const char* abook_uid, const char* text, bool is_outgoing, const char* protocol, const char* channel, const char* group_uid, int flags);
QList<QString> rtcomGetLocalUids();

#endif
14 changes: 7 additions & 7 deletions src/lib/tp.cpp
Expand Up @@ -320,13 +320,13 @@ bool TelepathyAccount::log_event(time_t epoch, const QString &text, bool outgoin
remote_name = remote_alias.toLocal8Bit();
}

create_event(epoch, epoch, m_nickname.toLocal8Bit().data(),
m_backend_name.toLocal8Bit().data(),
remote_uid.toLocal8Bit(),
remote_name, abook_uid,
text.toLocal8Bit(), outgoing, m_protocol_name.toStdString().c_str(),
channel_str, group_uid,
0 /* TODO: flags */);
rtcomCreateEvent(epoch, epoch, m_nickname.toLocal8Bit().data(),
m_backend_name.toLocal8Bit().data(),
remote_uid.toLocal8Bit(),
remote_name, abook_uid,
text.toLocal8Bit(), outgoing, m_protocol_name.toStdString().c_str(),
channel_str, group_uid,
0 /* TODO: flags */);

auto service = Utils::protocolToRTCOMServiceID(m_protocol_name);
auto *msg = new ChatMessage(1, /* TODO: event id is wrong here but should not matter */
Expand Down
49 changes: 27 additions & 22 deletions src/models/ChatModel.cpp
Expand Up @@ -178,31 +178,33 @@ void ChatModel::onProtocolFilter(QString protocol) {
void ChatModel::onGetOverviewMessages(const int limit, const int offset) {
this->clear();

rtcom_query* query_struct = rtcomStartQuery(limit, offset, RTCOM_EL_QUERY_GROUP_BY_GROUP);
RTComElQuery *query = rtcomStartQuery(limit, offset, RTCOM_EL_QUERY_GROUP_BY_GROUP);
bool query_prepared = FALSE;

if(m_filterProtocol.isEmpty()) {
gint service_id = rtcom_el_get_service_id(query_struct->el, "RTCOM_EL_SERVICE_CALL");
query_prepared = rtcom_el_query_prepare(query_struct->query, "service-id", service_id, RTCOM_EL_OP_NOT_EQUAL, NULL);
gint service_id = rtcom_el_get_service_id(rtcomel(), "RTCOM_EL_SERVICE_CALL");
query_prepared = rtcom_el_query_prepare(query, "service-id", service_id, RTCOM_EL_OP_NOT_EQUAL, NULL);
} else {
gint service_id = (m_filterProtocol == "sms" || m_filterProtocol == "tel" || m_filterProtocol == "ofono") ?
rtcom_el_get_service_id(query_struct->el, "RTCOM_EL_SERVICE_SMS") :
rtcom_el_get_service_id(query_struct->el, "RTCOM_EL_SERVICE_CHAT");
rtcom_el_get_service_id(rtcomel(), "RTCOM_EL_SERVICE_SMS") :
rtcom_el_get_service_id(rtcomel(), "RTCOM_EL_SERVICE_CHAT");

QString filterProtocol = QString("%%/" + m_filterProtocol + "/%%");
query_prepared = rtcom_el_query_prepare(query_struct->query,
query_prepared = rtcom_el_query_prepare(query,
"service-id", service_id, RTCOM_EL_OP_EQUAL,
"local-uid", filterProtocol.toStdString().c_str(), RTCOM_EL_OP_STR_LIKE, NULL);
}

if(!query_prepared) {
qCritical() << "Couldn't prepare query";
g_object_unref(query_struct->query);
delete query_struct;
g_object_unref(query);
return;
}

auto results = rtcomIterateResults(query_struct);
auto results = rtcomIterateResults(query);

g_object_unref(query);

for (const auto &message: results)
this->appendMessage(message);
}
Expand All @@ -226,20 +228,20 @@ unsigned int ChatModel::searchMessages(const QString &search, const QString &gro
#else
this->clear();

rtcom_query* query_struct = rtcomStartQuery(20, 0, RTCOM_EL_QUERY_GROUP_BY_NONE);
gint rtcom_sms_service_id = rtcom_el_get_service_id(query_struct->el, "RTCOM_EL_SERVICE_SMS");
RTComElQuery *query = rtcomStartQuery(20, 0, RTCOM_EL_QUERY_GROUP_BY_NONE);
gint rtcom_sms_service_id = rtcom_el_get_service_id(rtcomel(), "RTCOM_EL_SERVICE_SMS");
bool query_prepared = FALSE;

if(group_uid == nullptr) {
query_prepared = rtcom_el_query_prepare(
query_struct->query,
query,
"free-text", search.toStdString().c_str(), RTCOM_EL_OP_STR_LIKE,
// "service-id", rtcom_sms_service_id, RTCOM_EL_OP_EQUAL,
NULL);
} else {
m_group_uid = group_uid;
query_prepared = rtcom_el_query_prepare(
query_struct->query,
query,
"free-text", search.toStdString().c_str(), RTCOM_EL_OP_STR_LIKE,
"group-uid", group_uid.toStdString().c_str(), RTCOM_EL_OP_EQUAL,
// "service-id", rtcom_sms_service_id, RTCOM_EL_OP_EQUAL,
Expand All @@ -248,12 +250,14 @@ unsigned int ChatModel::searchMessages(const QString &search, const QString &gro

if(!query_prepared) {
qCritical() << "Couldn't prepare query";
g_object_unref(query_struct->query);
delete query_struct;
g_object_unref(query);
return 0;
}

auto results = rtcomIterateResults(query_struct);
auto results = rtcomIterateResults(query);

g_object_unref(query);

for(auto const &message: results) {
this->appendMessage(message);
}
Expand All @@ -269,22 +273,23 @@ unsigned int ChatModel::getMessages(const QString &service_id, const QString &gr
m_group_uid = group_uid;
m_service_id = service_id;

rtcom_query* query_struct = rtcomStartQuery(limit, offset, RTCOM_EL_QUERY_GROUP_BY_NONE);
gint sid = rtcom_el_get_service_id(query_struct->el, m_service_id.toStdString().c_str());
RTComElQuery *query = rtcomStartQuery(limit, offset, RTCOM_EL_QUERY_GROUP_BY_NONE);
gint sid = rtcom_el_get_service_id(rtcomel(), m_service_id.toStdString().c_str());
bool query_prepared = FALSE;
query_prepared = rtcom_el_query_prepare(query_struct->query,
query_prepared = rtcom_el_query_prepare(query,
"group-uid", group_uid.toStdString().c_str(), RTCOM_EL_OP_EQUAL,
"service-id", sid, RTCOM_EL_OP_EQUAL,
NULL);

if(!query_prepared) {
qCritical() << "Couldn't prepare query";
g_object_unref(query_struct->query);
delete query_struct;
g_object_unref(query);
return 0;
}

auto results = rtcomIterateResults(query_struct);
auto results = rtcomIterateResults(query);

g_object_unref(query);

bool prepend = offset != 0;
if(prepend) {
Expand Down

0 comments on commit f67ef3d

Please sign in to comment.