diff --git a/backends/skype/skype.cpp b/backends/skype/skype.cpp index 9f054efe..78c1aad3 100644 --- a/backends/skype/skype.cpp +++ b/backends/skype/skype.cpp @@ -20,6 +20,7 @@ #include "skype.h" #include "skypeplugin.h" +#include "skypedb.h" #include "transport/config.h" #include "transport/logging.h" @@ -95,9 +96,9 @@ void Skype::login() { return; } - std::string db_path = createSkypeDirectory(); + m_db = createSkypeDirectory(); - bool spawned = spawnSkype(db_path); + bool spawned = spawnSkype(m_db); if (!spawned) { m_np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Error spawning the Skype instance."); return; @@ -229,51 +230,55 @@ bool Skype::loadSkypeBuddies() { } } - std::string friends = send_command("GET AUTH_CONTACTS_PROFILES"); + // Try to load skype buddies from database, if it fails + // fallback to old method. + if (!SkypeDB::loadBuddies(m_np, m_db, m_user, group_map)) { + std::string friends = send_command("GET AUTH_CONTACTS_PROFILES"); - char **full_friends_list = g_strsplit((strchr(friends.c_str(), ' ')+1), ";", 0); - if (full_friends_list && full_friends_list[0]) - { - //in the format of: username;full name;phone;office phone;mobile phone; - // online status;friendly name;voicemail;mood - // (comma-seperated lines, usernames can have comma's) - - for (int i=0; full_friends_list[i] && full_friends_list[i+1] && *full_friends_list[i] != '\0'; i+=8) + char **full_friends_list = g_strsplit((strchr(friends.c_str(), ' ')+1), ";", 0); + if (full_friends_list && full_friends_list[0]) { - std::string buddy = full_friends_list[i]; + //in the format of: username;full name;phone;office phone;mobile phone; + // online status;friendly name;voicemail;mood + // (comma-seperated lines, usernames can have comma's) - if (buddy[0] == ',') { - buddy.erase(buddy.begin()); + for (int i=0; full_friends_list[i] && full_friends_list[i+1] && *full_friends_list[i] != '\0'; i+=8) + { + std::string buddy = full_friends_list[i]; + + if (buddy[0] == ',') { + buddy.erase(buddy.begin()); + } + + if (buddy.rfind(",") != std::string::npos) { + buddy = buddy.substr(buddy.rfind(",")); + } + + if (buddy[0] == ',') { + buddy.erase(buddy.begin()); + } + + LOG4CXX_INFO(logger, "Got buddy " << buddy); + std::string st = full_friends_list[i + 5]; + + pbnetwork::StatusType status = getStatus(st); + + std::string alias = full_friends_list[i + 6]; + + std::string mood_text = ""; + if (full_friends_list[i + 8] && *full_friends_list[i + 8] != '\0' && *full_friends_list[i + 8] != ',') { + mood_text = full_friends_list[i + 8]; + } + + std::vector groups; + if (group_map.find(buddy) != group_map.end()) { + groups.push_back(group_map[buddy]); + } + m_np->handleBuddyChanged(m_user, buddy, alias, groups, status, mood_text); } - - if (buddy.rfind(",") != std::string::npos) { - buddy = buddy.substr(buddy.rfind(",")); - } - - if (buddy[0] == ',') { - buddy.erase(buddy.begin()); - } - - LOG4CXX_INFO(logger, "Got buddy " << buddy); - std::string st = full_friends_list[i + 5]; - - pbnetwork::StatusType status = getStatus(st); - - std::string alias = full_friends_list[i + 6]; - - std::string mood_text = ""; - if (full_friends_list[i + 8] && *full_friends_list[i + 8] != '\0' && *full_friends_list[i + 8] != ',') { - mood_text = full_friends_list[i + 8]; - } - - std::vector groups; - if (group_map.find(buddy) != group_map.end()) { - groups.push_back(group_map[buddy]); - } - m_np->handleBuddyChanged(m_user, buddy, alias, groups, status, mood_text); } + g_strfreev(full_friends_list); } - g_strfreev(full_friends_list); send_command("SET AUTOAWAY OFF"); send_command("SET USERSTATUS ONLINE"); diff --git a/backends/skype/skype.h b/backends/skype/skype.h index 9b321bc5..5230b4d8 100644 --- a/backends/skype/skype.h +++ b/backends/skype/skype.h @@ -87,5 +87,6 @@ class Skype { int fd_output; std::map m_groups; SkypePlugin *m_np; + std::string m_db; }; diff --git a/backends/skype/skypedb.cpp b/backends/skype/skypedb.cpp index 16c332a7..beff1267 100644 --- a/backends/skype/skypedb.cpp +++ b/backends/skype/skypedb.cpp @@ -42,8 +42,6 @@ #include "skypeplugin.h" -#include "skypeplugin.h" - // Prepare the SQL statement #define PREP_STMT(sql, str) \ if(sqlite3_prepare_v2(db, std::string(str).c_str(), -1, &sql, NULL)) { \ @@ -116,41 +114,51 @@ bool getAvatar(const std::string &db_path, const std::string &name, std::string return ret; } -bool loadBuddies(Transport::NetworkPlugin *np, const std::string &db_path) { +bool loadBuddies(SkypePlugin *np, const std::string &db_path, std::string &user, std::map &group_map) { 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 create prepared statement"); -// LOG4CXX_ERROR(logger, (sqlite3_errmsg(db) == NULL ? "" : sqlite3_errmsg(db))); -// } -// sqlite3_close(db); -// } + 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 skypename, aliases, fullname, displayname, mood_text from Contacts;"); + if (stmt) { + BEGIN(stmt); + int ret2; + while((ret2 = sqlite3_step(stmt)) == SQLITE_ROW) { + std::string buddy = (const char *) sqlite3_column_text(stmt, 0); + std::string alias = (const char *) sqlite3_column_text(stmt, 1); + std::string fullname = (const char *) sqlite3_column_text(stmt, 2); + std::string displayname = (const char *) sqlite3_column_text(stmt, 3); + std::string mood_text = (const char *) sqlite3_column_text(stmt, 4); + + if (alias.empty()) { + alias = displayname; + } + + std::vector groups; + if (group_map.find(buddy) != group_map.end()) { + groups.push_back(group_map[buddy]); + } + np->handleBuddyChanged(user, buddy, alias, groups, pbnetwork::STATUS_NONE, mood_text); + } + if (ret2 != SQLITE_DONE) { + FINALIZE_STMT(stmt); + ret = false; + } + else { + ret = true; + } + } + else { + LOG4CXX_ERROR(logger, "Can't create 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 index 264157ec..d3490b00 100644 --- a/backends/skype/skypedb.h +++ b/backends/skype/skypedb.h @@ -30,6 +30,6 @@ class SkypePlugin; namespace SkypeDB { bool getAvatar(const std::string &db, const std::string &name, std::string &avatar); - bool loadBuddies(SkypePlugin *np, const std::string &db); + bool loadBuddies(SkypePlugin *np, const std::string &db, std::string &user, std::map &group_map); }