From ac2fd6dbfb75ac8010fdff1122cfccfefd30d9dc Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 30 Jan 2013 17:29:08 +0100 Subject: [PATCH] Skype: Try to read avatars from main.db sqlite3 database --- backends/skype/main.cpp | 59 ++++++++++++++++++++++++++++++++++++++++- src/sqlite3backend.cpp | 1 + 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 82ecb06d..49966325 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -22,6 +22,8 @@ #endif #include +#include "sqlite3.h" + DEFINE_LOGGER(logger, "backend"); @@ -39,6 +41,34 @@ class SpectrumNetworkPlugin; } + +// Prepare the SQL statement +#define PREP_STMT(sql, str) \ + if(sqlite3_prepare_v2(db, std::string(str).c_str(), -1, &sql, NULL)) { \ + LOG4CXX_ERROR(logger, str<< (sqlite3_errmsg(db) == NULL ? "" : sqlite3_errmsg(db))); \ + sql = NULL; \ + } + +// Finalize the prepared statement +#define FINALIZE_STMT(prep) \ + if(prep != NULL) { \ + sqlite3_finalize(prep); \ + } + +#define BEGIN(STATEMENT) sqlite3_reset(STATEMENT);\ + int STATEMENT##_id = 1;\ + int STATEMENT##_id_get = 0;\ + (void)STATEMENT##_id_get; + +#define BIND_INT(STATEMENT, VARIABLE) sqlite3_bind_int(STATEMENT, STATEMENT##_id++, VARIABLE) +#define BIND_STR(STATEMENT, VARIABLE) sqlite3_bind_text(STATEMENT, STATEMENT##_id++, VARIABLE.c_str(), -1, SQLITE_STATIC) +#define RESET_GET_COUNTER(STATEMENT) STATEMENT##_id_get = 0; +#define GET_INT(STATEMENT) sqlite3_column_int(STATEMENT, STATEMENT##_id_get++) +#define GET_STR(STATEMENT) (const char *) sqlite3_column_text(STATEMENT, STATEMENT##_id_get++) +#define GET_BLOB(STATEMENT) (const void *) sqlite3_column_blob(STATEMENT, STATEMENT##_id_get++) +#define EXECUTE_STATEMENT(STATEMENT, NAME) if(sqlite3_step(STATEMENT) != SQLITE_DONE) {\ + LOG4CXX_ERROR(logger, NAME<< (sqlite3_errmsg(db) == NULL ? "" : sqlite3_errmsg(db)));\ + } SpectrumNetworkPlugin *np; @@ -277,7 +307,34 @@ class SpectrumNetworkPlugin : public NetworkPlugin { g_free(filename); } g_free(username); - + + if (photo.empty()) { + sqlite3 *db; + std::string db_path = std::string("/tmp/skype/") + skype->getUsername() + "/" + skype->getUsername() + "/main.db"; + if (sqlite3_open(db_path.c_str(), &db)) { + sqlite3_close(db); + } + else { + sqlite3_stmt *stmt; + PREP_STMT(stmt, "SELECT avatar_image FROM Contacts WHERE skypename=?"); + if (stmt) { + BEGIN(stmt); + BIND_STR(stmt, name); + if(sqlite3_step(stmt) == SQLITE_ROW) { + int size = sqlite3_column_bytes(stmt, 0); + const void *data = sqlite3_column_blob(stmt, 0); + photo = std::string((const char *)data, size); + } + + int ret; + while((ret = sqlite3_step(stmt)) == SQLITE_ROW) { + } + FINALIZE_STMT(stmt); + } + sqlite3_close(db); + } + } + std::string alias = ""; std::cout << skype->getUsername() << " " << name << "\n"; if (skype->getUsername() == name) { diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index b7e839bb..4290d9cf 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -55,6 +55,7 @@ #define RESET_GET_COUNTER(STATEMENT) STATEMENT##_id_get = 0; #define GET_INT(STATEMENT) sqlite3_column_int(STATEMENT, STATEMENT##_id_get++) #define GET_STR(STATEMENT) (const char *) sqlite3_column_text(STATEMENT, STATEMENT##_id_get++) +#define GET_BLOB(STATEMENT) (const void *) sqlite3_column_blob(STATEMENT, STATEMENT##_id_get++) #define EXECUTE_STATEMENT(STATEMENT, NAME) if(sqlite3_step(STATEMENT) != SQLITE_DONE) {\ LOG4CXX_ERROR(logger, NAME<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));\ }