diff --git a/backends/skype/skype.cpp b/backends/skype/skype.cpp index 050e9722..9f054efe 100644 --- a/backends/skype/skype.cpp +++ b/backends/skype/skype.cpp @@ -42,45 +42,6 @@ #endif -#define GET_RESPONSE_DATA(RESP, DATA) ((RESP.find(std::string(DATA) + " ") != std::string::npos) ? RESP.substr(RESP.find(DATA) + strlen(DATA) + 1) : ""); -#define GET_PROPERTY(VAR, OBJ, WHICH, PROP) std::string VAR = send_command(std::string("GET ") + OBJ + " " + WHICH + " " + PROP); \ - try {\ - VAR = GET_RESPONSE_DATA(VAR, PROP);\ - }\ - catch (std::out_of_range& oor) {\ - VAR="";\ - } - - - -// 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)));\ - } - DEFINE_LOGGER(logger, "Skype"); Skype::Skype(SkypePlugin *np, const std::string &user, const std::string &username, const std::string &password) { diff --git a/backends/skype/skype.h b/backends/skype/skype.h index ec22b335..9b321bc5 100644 --- a/backends/skype/skype.h +++ b/backends/skype/skype.h @@ -26,6 +26,15 @@ #include #include +#define GET_RESPONSE_DATA(RESP, DATA) ((RESP.find(std::string(DATA) + " ") != std::string::npos) ? RESP.substr(RESP.find(DATA) + strlen(DATA) + 1) : ""); +#define GET_PROPERTY(VAR, OBJ, WHICH, PROP) std::string VAR = send_command(std::string("GET ") + OBJ + " " + WHICH + " " + PROP); \ + try {\ + VAR = GET_RESPONSE_DATA(VAR, PROP);\ + }\ + catch (std::out_of_range& oor) {\ + VAR="";\ + } + class SkypePlugin; class Skype { diff --git a/backends/skype/skypedb.cpp b/backends/skype/skypedb.cpp new file mode 100644 index 00000000..4daf44ee --- /dev/null +++ b/backends/skype/skypedb.cpp @@ -0,0 +1,115 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#include "skypedb.h" + +#include "transport/config.h" +#include "transport/logging.h" +#include "transport/transport.h" +#include "transport/usermanager.h" +#include "transport/memoryusage.h" +#include "transport/sqlite3backend.h" +#include "transport/userregistration.h" +#include "transport/user.h" +#include "transport/storagebackend.h" +#include "transport/rostermanager.h" +#include "transport/conversation.h" +#include "transport/networkplugin.h" +#include +#include "sys/wait.h" +#include "sys/signal.h" +// #include "valgrind/memcheck.h" +#ifndef __FreeBSD__ +#include "malloc.h" +#endif + +// 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)));\ + } + +using namespace Transport; + +DEFINE_LOGGER(logger, "SkypeDB"); + +namespace SkypeDB { + +bool getAvatar(const std::string &db_path, const std::string &name, std::string &photo) { + bool ret = false; + sqlite3 *db; + LOG4CXX_INFO(logger, "Opening database " << db_path); + if (sqlite3_open(db_path.c_str(), &db)) { + sqlite3_close(db); + LOG4CXX_ERROR(logger, "Can't open database"); + } + 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 + 1, size - 1); + ret = true; + } + else { + LOG4CXX_ERROR(logger, (sqlite3_errmsg(db) == NULL ? "" : sqlite3_errmsg(db))); + } + + int ret; + while((ret = sqlite3_step(stmt)) == SQLITE_ROW) { + } + FINALIZE_STMT(stmt); + } + else { + LOG4CXX_ERROR(logger, "Can't created prepared statement"); + LOG4CXX_ERROR(logger, (sqlite3_errmsg(db) == NULL ? "" : sqlite3_errmsg(db))); + } + sqlite3_close(db); + } + return ret; +} + +} diff --git a/backends/skype/skypedb.h b/backends/skype/skypedb.h new file mode 100644 index 00000000..d0ba9f27 --- /dev/null +++ b/backends/skype/skypedb.h @@ -0,0 +1,33 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#pragma once + +#include "glib.h" +#include +#include "sqlite3.h" +#include +#include + +namespace SkypeDB { + bool getAvatar(const std::string &db, const std::string &name, std::string &avatar); + +} + diff --git a/backends/skype/skypeplugin.cpp b/backends/skype/skypeplugin.cpp index 9ef2867b..61a38c5c 100644 --- a/backends/skype/skypeplugin.cpp +++ b/backends/skype/skypeplugin.cpp @@ -20,6 +20,7 @@ #include "skypeplugin.h" #include "skype.h" +#include "skypedb.h" #include "transport/config.h" #include "transport/logging.h" @@ -41,17 +42,6 @@ #include "malloc.h" #endif -#define GET_RESPONSE_DATA(RESP, DATA) ((RESP.find(std::string(DATA) + " ") != std::string::npos) ? RESP.substr(RESP.find(DATA) + strlen(DATA) + 1) : ""); -#define GET_PROPERTY(VAR, OBJ, WHICH, PROP) std::string VAR = sk->send_command(std::string("GET ") + OBJ + " " + WHICH + " " + PROP); \ - try {\ - VAR = GET_RESPONSE_DATA(VAR, PROP);\ - }\ - catch (std::out_of_range& oor) {\ - VAR="";\ - } - - - // Prepare the SQL statement #define PREP_STMT(sql, str) \ if(sqlite3_prepare_v2(db, std::string(str).c_str(), -1, &sql, NULL)) { \ @@ -314,39 +304,8 @@ void SkypePlugin::handleVCardRequest(const std::string &user, const std::string g_free(username); if (photo.empty()) { - sqlite3 *db; std::string db_path = std::string("/tmp/skype/") + skype->getUsername() + "/" + skype->getUsername() + "/main.db"; - LOG4CXX_INFO(logger, "Opening database " << db_path); - if (sqlite3_open(db_path.c_str(), &db)) { - sqlite3_close(db); - LOG4CXX_ERROR(logger, "Can't open database"); - } - 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 + 1, size - 1); - } - else { - LOG4CXX_ERROR(logger, (sqlite3_errmsg(db) == NULL ? "" : sqlite3_errmsg(db))); - } - - int ret; - while((ret = sqlite3_step(stmt)) == SQLITE_ROW) { - } - FINALIZE_STMT(stmt); - } - else { - LOG4CXX_ERROR(logger, "Can't created prepared statement"); - LOG4CXX_ERROR(logger, (sqlite3_errmsg(db) == NULL ? "" : sqlite3_errmsg(db))); - } - sqlite3_close(db); - } + SkypeDB::getAvatar(db_path, name, photo); } std::string alias;