Changeset - f742dae46248
[Not reviewed]
0 1 0
HanzZ - 14 years ago 2012-02-17 11:50:33
hanzz.k@gmail.com
wait 10s
1 file changed with 1 insertions and 1 deletions:
0 comments (0 inline, 0 general)
backends/skype/main.cpp
Show inline comments
 
@@ -273,193 +273,193 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
 
		}
 

	
 
		void handleTypingRequest(const std::string &user, const std::string &buddyName) {
 

	
 
		}
 

	
 
		void handleTypedRequest(const std::string &user, const std::string &buddyName) {
 

	
 
		}
 

	
 
		void handleStoppedTypingRequest(const std::string &user, const std::string &buddyName) {
 

	
 
		}
 

	
 
		void handleAttentionRequest(const std::string &user, const std::string &buddyName, const std::string &message) {
 

	
 
		}
 

	
 
		std::map<std::string, Skype *> m_sessions;
 
		std::map<Skype *, std::string> m_accounts;
 
		std::map<std::string, unsigned int> m_vcards;
 
		Config *config;
 
		
 
};
 

	
 
		Skype::Skype(const std::string &user, const std::string &username, const std::string &password) {
 
			m_username = username;
 
			m_user = user;
 
			m_password = password;
 
			m_pid = 0;
 
			m_connection = 0;
 
			m_proxy = 0;
 
		}
 

	
 
		void Skype::login() {
 
			boost::filesystem::path	path(std::string("/tmp/skype/") + m_username);
 
			if (!boost::filesystem::exists(path)) {
 
				boost::filesystem::create_directories(path);
 
				boost::filesystem::path	path2(std::string("/tmp/skype/") + m_username + "/" + m_username );
 
				boost::filesystem::create_directories(path2);
 
			}
 

	
 
			std::string shared_xml = "<?xml version=\"1.0\"?>\n"
 
									"<config version=\"1.0\" serial=\"28\" timestamp=\"" + boost::lexical_cast<std::string>(time(NULL)) + ".0\">\n"
 
									"<UI>\n"
 
										"<Installed>2</Installed>\n"
 
										"<Language>en</Language>\n"
 
									"</UI>\n"
 
									"</config>\n";
 
			g_file_set_contents(std::string(std::string("/tmp/skype/") + m_username + "/shared.xml").c_str(), shared_xml.c_str(), -1, NULL);
 

	
 
			std::string config_xml = "<?xml version=\"1.0\"?>\n"
 
									"<config version=\"1.0\" serial=\"7\" timestamp=\"" + boost::lexical_cast<std::string>(time(NULL)) + ".0\">\n"
 
										"<Lib>\n"
 
											"<Account>\n"
 
											"<IdleTimeForAway>30000000</IdleTimeForAway>\n"
 
											"<IdleTimeForNA>300000000</IdleTimeForNA>\n"
 
											"<LastUsed>" + boost::lexical_cast<std::string>(time(NULL)) + "</LastUsed>\n"
 
											"</Account>\n"
 
										"</Lib>\n"
 
										"<UI>\n"
 
											"<API>\n"
 
											"<Authorizations>Spectrum</Authorizations>\n"
 
											"<BlockedPrograms></BlockedPrograms>\n"
 
											"</API>\n"
 
										"</UI>\n"
 
									"</config>\n";
 
			g_file_set_contents(std::string(std::string("/tmp/skype/") + m_username + "/" + m_username +"/config.xml").c_str(), config_xml.c_str(), -1, NULL);
 
			std::string db_path = std::string("/tmp/skype/") + m_username;
 
			char *db = (char *) malloc(db_path.size() + 1);
 
			strcpy(db, db_path.c_str());
 
			LOG4CXX_INFO(logger,  m_username << ": Spawning new Skype instance dbpath=" << db);
 
			gchar* argv[6] = {"skype", "--disable-cleanlooks", "--pipelogin", "--dbpath", db, 0};
 

	
 
			int fd;
 
			int fd_output;
 
			g_spawn_async_with_pipes(NULL,
 
				argv,
 
				NULL /*envp*/,
 
				G_SPAWN_SEARCH_PATH,
 
				NULL /*child_setup*/,
 
				NULL /*user_data*/,
 
				&m_pid /*child_pid*/,
 
				&fd,
 
				NULL,
 
				&fd_output,
 
				NULL /*error*/);
 
			std::string login_data = std::string(m_username + " " + m_password + "\n");
 
			LOG4CXX_INFO(logger,  m_username << ": Login data=" << login_data);
 
			write(fd, login_data.c_str(), login_data.size());
 
			close(fd);
 
			
 
			fcntl (fd_output, F_SETFL, O_NONBLOCK);
 

	
 
			free(db);
 

	
 
			sleep(2);
 
			sleep(10);
 

	
 
			GError *error = NULL;
 
			DBusObjectPathVTable vtable;
 

	
 
			//Initialise threading
 
			dbus_threads_init_default();
 
			
 
			if (m_connection == NULL)
 
			{
 
				m_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
 
				if (m_connection == NULL && error != NULL)
 
				{
 
					LOG4CXX_INFO(logger,  m_username << ": DBUS Error: " << error->message);
 
					g_error_free(error);
 
					return;
 
				}
 
			}
 
			
 
			if (m_proxy == NULL)
 
			{
 
				m_proxy = dbus_g_proxy_new_for_name_owner (m_connection,
 
												"com.Skype.API",
 
												"/com/Skype",
 
												"com.Skype.API",
 
												&error);
 
				if (m_proxy == NULL && error != NULL)
 
				{
 
					LOG4CXX_INFO(logger,  m_username << ":" << error->message);
 
					g_error_free(error);
 
				}
 
				
 
				vtable.message_function = &skype_notify_handler;
 
				dbus_connection_register_object_path(dbus_g_connection_get_connection(m_connection), "/com/Skype/Client", &vtable, this);
 
			}
 

	
 
			int counter = 0;
 
			std::string re = "CONNSTATUS OFFLINE";
 
			while (re == "CONNSTATUS OFFLINE" || re.empty()) {
 
				sleep(1);
 
				gchar buffer[1024];
 
				int bytes_read;
 
				bytes_read = read (fd_output, buffer, 1023);
 
				if (bytes_read > 0) {
 
					buffer[bytes_read] = 0;
 
					np->handleDisconnected(m_user, 0, buffer);
 
					close(fd_output);
 
					logout();
 
					return;
 
				}
 
				re = send_command("NAME Spectrum");
 
				if (counter++ > 15)
 
					break;
 
			}
 

	
 
			close(fd_output);
 

	
 
			if (send_command("PROTOCOL 7") != "PROTOCOL 7") {
 
				np->handleDisconnected(m_user, 0, "Skype is not ready");
 
				logout();
 
				return;
 
			}
 
			
 
			np->handleConnected(m_user);
 

	
 
			std::map<std::string, std::string> group_map;
 
			std::string groups = send_command("SEARCH GROUPS CUSTOM");
 
			groups = groups.substr(groups.find(' ') + 1);
 
			std::vector<std::string> grps;
 
			boost::split(grps, groups, boost::is_any_of(","));
 
			BOOST_FOREACH(std::string grp, grps) {
 
				std::vector<std::string> data;
 
				std::string name = send_command("GET GROUP " + grp + " DISPLAYNAME");
 
				boost::split(data, name, boost::is_any_of(" "));
 
				name = name.substr(name.find("DISPLAYNAME") + 12);
 

	
 
				std::string users = send_command("GET GROUP " + data[1] + " USERS");
 
				users = name.substr(name.find("USERS") + 6);
 
				boost::split(data, users, boost::is_any_of(","));
 
				BOOST_FOREACH(std::string u, data) {
 
					group_map[u] = grp;
 
				}
 
			}
 

	
 
			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] != '\0'; i+=8)
 
				{
 
					std::string buddy = full_friends_list[i];
 

	
0 comments (0 inline, 0 general)