diff options
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/FacebookRM/src/client.h | 4 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/connection.cpp | 2 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/contacts.cpp | 64 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/dialogs.cpp | 2 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/entities.h | 4 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/json.cpp | 69 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/json.h | 18 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/messages.cpp | 5 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/process.cpp | 89 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/proto.cpp | 18 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/proto.h | 1 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/theme.cpp | 2 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/utils.cpp | 1 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/version.h | 2 | 
14 files changed, 137 insertions, 144 deletions
diff --git a/protocols/FacebookRM/src/client.h b/protocols/FacebookRM/src/client.h index ca121b8722..bc1fb30d97 100644 --- a/protocols/FacebookRM/src/client.h +++ b/protocols/FacebookRM/src/client.h @@ -41,10 +41,12 @@ public:  		https_ = is_idle_ = is_typing_ = false;
 -		buddies_lock_ = send_message_lock_ = notifications_lock_ = NULL;
 +		buddies_lock_ = send_message_lock_ = notifications_lock_ = cookies_lock_ = NULL;
  		hMsgCon = NULL;
  		hFcbCon = NULL;
  		fcb_conn_lock_ = NULL;
 +		handle_ = NULL;
 +		parent = NULL;
  	}
  	HANDLE hMsgCon;
 diff --git a/protocols/FacebookRM/src/connection.cpp b/protocols/FacebookRM/src/connection.cpp index dfeabb0973..e38706ae61 100644 --- a/protocols/FacebookRM/src/connection.cpp +++ b/protocols/FacebookRM/src/connection.cpp @@ -92,7 +92,7 @@ void FacebookProto::ChangeStatus(void*)  		debugLogA("***** Beginning SignOn process"); -		m_enableChat = getBool(FACEBOOK_KEY_ENABLE_CHATS, true); +		m_enableChat = getBool(FACEBOOK_KEY_ENABLE_CHATS, DEFAULT_ENABLE_CHATS);  		m_iStatus = facy.self_.status_id = ID_STATUS_CONNECTING;  		ProtoBroadcastAck(0, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, m_iStatus); diff --git a/protocols/FacebookRM/src/contacts.cpp b/protocols/FacebookRM/src/contacts.cpp index 6e7c281d17..a7196e5653 100644 --- a/protocols/FacebookRM/src/contacts.cpp +++ b/protocols/FacebookRM/src/contacts.cpp @@ -406,13 +406,11 @@ void FacebookProto::DeleteContactFromServer(void *data)  	if (data == NULL)  		return; -	if (isOffline()) { -		delete (std::string*)data; -		return; -	} +	std::string id = *(std::string*)data; +	delete (std::string*)data; -	std::string id = (*(std::string*)data); -	delete data; +	if (isOffline()) +		return;  	std::string query = "norefresh=true&unref=button_dropdown&confirmed=1&__a=1";  	query += "&fb_dtsg=" + facy.dtsg_; @@ -457,13 +455,11 @@ void FacebookProto::AddContactToServer(void *data)  	if (data == NULL)  		return; -	if (isOffline()) { -		delete (std::string*)data; -		return; -	} +	std::string id = *(std::string*)data; +	delete (std::string*)data; -	std::string id = (*(std::string*)data); -	delete data; +	if (isOffline()) +		return;  	std::string query = "action=add_friend&how_found=profile_button&ref_param=ts&outgoing_id=&unwanted=&logging_location=&no_flyout_on_click=false&ego_log_data=&lsd=";  	query += "&fb_dtsg=" + facy.dtsg_; @@ -486,7 +482,6 @@ void FacebookProto::AddContactToServer(void *data)  	if (resp.code != HTTP_CODE_OK)  		facy.handle_error("AddContactToServer"); -  }  void FacebookProto::ApproveContactToServer(void *data) @@ -496,15 +491,13 @@ void FacebookProto::ApproveContactToServer(void *data)  	if (data == NULL)  		return; -	if (isOffline()) { -		delete (MCONTACT*)data; -		return; -	} -  	MCONTACT hContact = *(MCONTACT*)data; -	delete data; +	delete (MCONTACT*)data; + +	if (isOffline()) +		return; -	ptrA id(ptrA(getStringA(hContact, FACEBOOK_KEY_ID))); +	ptrA id(getStringA(hContact, FACEBOOK_KEY_ID));  	if (!id)  		return; @@ -534,13 +527,11 @@ void FacebookProto::CancelFriendsRequest(void *data)  	if (data == NULL)  		return; -	if (isOffline()) { -		delete (MCONTACT*)data; -		return; -	} -  	MCONTACT hContact = *(MCONTACT*)data; -	delete data; +	delete (MCONTACT*)data; + +	if (isOffline()) +		return;  	ptrA id(getStringA(hContact, FACEBOOK_KEY_ID));  	if (!id) @@ -572,13 +563,11 @@ void FacebookProto::IgnoreFriendshipRequest(void *data)  	if (data == NULL)  		return; -	if (isOffline()) { -		delete (MCONTACT*)data; -		return; -	} -  	MCONTACT hContact = *(MCONTACT*)data; -	delete data; +	delete (MCONTACT*)data; + +	if (isOffline()) +		return;  	ptrA id(getStringA(hContact, FACEBOOK_KEY_ID));  	if (!id) @@ -614,15 +603,14 @@ void FacebookProto::SendPokeWorker(void *p)  	if (p == NULL)  		return; +	std::string *id = (std::string*)p; +  	if (isOffline()) { -		delete (std::string*)p; +		delete id;  		return;  	} -	std::string id = (*(std::string*)p); -	delete p; - -	std::string data = "poke_target=" + id; +	std::string data = "poke_target=" + *id;  	data += "&do_confirm=0";  	data += "&fb_dtsg=" + facy.dtsg_;  	data += "&__user=" + facy.self_.user_id; @@ -648,6 +636,8 @@ void FacebookProto::SendPokeWorker(void *p)  	}  	facy.handle_success("SendPokeWorker"); + +	delete id;  } diff --git a/protocols/FacebookRM/src/dialogs.cpp b/protocols/FacebookRM/src/dialogs.cpp index d124c2191d..d6a94a4f1a 100644 --- a/protocols/FacebookRM/src/dialogs.cpp +++ b/protocols/FacebookRM/src/dialogs.cpp @@ -398,6 +398,8 @@ INT_PTR CALLBACK FBOptionsProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp  		case IDC_SECURE_CHANNEL:  			if (IsDlgButtonChecked(hwnd, IDC_SECURE_CHANNEL))  				MessageBox(hwnd, TranslateT("Note: Make sure you have disabled 'Validate SSL certificates' option in Network options to work properly."), proto->m_tszUserName, MB_OK); +			SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); +			break;  		default:  			SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0);  		} diff --git a/protocols/FacebookRM/src/entities.h b/protocols/FacebookRM/src/entities.h index 99e171348b..384e0b2ec9 100644 --- a/protocols/FacebookRM/src/entities.h +++ b/protocols/FacebookRM/src/entities.h @@ -71,7 +71,9 @@ struct facebook_user  struct facebook_chatroom  { -	facebook_chatroom(std::tstring thread_id) : thread_id(thread_id) {} +	facebook_chatroom(std::tstring thread_id) : thread_id(thread_id) { +		this->last_active = 0; +	}  	std::tstring thread_id;  	std::tstring chat_name; diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp index b7f85d04d5..a8d8e8ea7a 100644 --- a/protocols/FacebookRM/src/json.cpp +++ b/protocols/FacebookRM/src/json.cpp @@ -22,10 +22,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "common.h" -int facebook_json_parser::parse_buddy_list(void* data, List::List< facebook_user >* buddy_list) +int facebook_json_parser::parse_buddy_list(std::string *data, List::List< facebook_user >* buddy_list)  {  	facebook_user* current = NULL; -	std::string jsonData = static_cast<std::string*>(data)->substr(9); +	std::string jsonData = data->substr(9);  	JSONROOT root(jsonData.c_str());  	if (root == NULL) @@ -196,9 +196,9 @@ void parseUser(JSONNODE *it, facebook_user *fbu)  	}  } -int facebook_json_parser::parse_friends(void* data, std::map< std::string, facebook_user* >* friends) +int facebook_json_parser::parse_friends(std::string *data, std::map< std::string, facebook_user* >* friends)  { -	std::string jsonData = static_cast<std::string*>(data)->substr(9); +	std::string jsonData = data->substr(9);  	JSONROOT root(jsonData.c_str());  	if (root == NULL) @@ -222,9 +222,9 @@ int facebook_json_parser::parse_friends(void* data, std::map< std::string, faceb  } -int facebook_json_parser::parse_notifications(void *data, std::map< std::string, facebook_notification* > *notifications) +int facebook_json_parser::parse_notifications(std::string *data, std::map< std::string, facebook_notification* > *notifications)  { -	std::string jsonData = static_cast<std::string*>(data)->substr(9); +	std::string jsonData = data->substr(9);  	JSONROOT root(jsonData.c_str());  	if (root == NULL) @@ -396,7 +396,7 @@ void parseAttachments(FacebookProto *proto, std::string *message_text, JSONNODE  	}  } -int facebook_json_parser::parse_messages(void* data, std::vector< facebook_message* >* messages, std::map< std::string, facebook_notification* >* notifications, bool inboxOnly) +int facebook_json_parser::parse_messages(std::string *data, std::vector< facebook_message* >* messages, std::map< std::string, facebook_notification* >* notifications, bool inboxOnly)  {  	// remove old received messages from map		  	for (std::map<std::string, int>::iterator it = proto->facy.messages_ignore.begin(); it != proto->facy.messages_ignore.end();) { @@ -409,7 +409,7 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa  		}  	} -	std::string jsonData = static_cast<std::string*>(data)->substr(9); +	std::string jsonData = data->substr(9);  	JSONROOT root(jsonData.c_str());  	if (root == NULL) @@ -457,7 +457,7 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa  					if (!proto->m_enableChat)  						continue; -					std::tstring tid = json_as_string(threadid); +					std::tstring tid = ptrT(json_as_string(threadid));  					std::string reader_id = json_as_pstring(reader);  					std::map<std::tstring, facebook_chatroom*>::iterator it = proto->facy.chat_rooms.find(tid); @@ -656,7 +656,7 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa  			if (from_ == NULL || thread_ == NULL || st_ == NULL)  				continue; -			std::tstring tid = json_as_string(thread_); +			std::tstring tid = ptrT(json_as_string(thread_));  			std::string from_id = json_as_pstring(from_);  			std::map<std::tstring, facebook_chatroom*>::iterator it = proto->facy.chat_rooms.find(tid); @@ -714,8 +714,9 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa  		else if (t == "buddylist_overlay") {  			// we opened/closed chat window - pretty useless info for us  			continue; -		} -		else if (t == "ticker_update:home") { +		} else if (t == "ticker_update:home") { +			JSONNODE *actor_ = json_get(it, "actor"); +			JSONNODE *time_ = json_get(it, "time");  			JSONNODE *story_ = json_get(it, "story_xhp");  			std::string text = json_as_pstring(story_); @@ -747,7 +748,7 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa  				if (!log_data_ || !log_body_ || !thread_id_ || !log_type_)  					continue; -				std::tstring thread_id = json_as_string(thread_id_); +				std::tstring thread_id = ptrT(json_as_string(thread_id_));  				std::string type = json_as_pstring(log_type_);  				std::string message_text = json_as_pstring(log_body_); @@ -816,9 +817,9 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa  	return EXIT_SUCCESS;  } -int facebook_json_parser::parse_unread_threads(void* data, std::vector< std::string >* threads, bool inboxOnly) +int facebook_json_parser::parse_unread_threads(std::string *data, std::vector< std::string >* threads, bool inboxOnly)  { -	std::string jsonData = static_cast<std::string*>(data)->substr(9); +	std::string jsonData = data->substr(9);  	JSONROOT root(jsonData.c_str());  	if (root == NULL) @@ -852,9 +853,9 @@ int facebook_json_parser::parse_unread_threads(void* data, std::vector< std::str  	return EXIT_SUCCESS;  } -int facebook_json_parser::parse_thread_messages(void* data, std::vector< facebook_message* >* messages, std::map< std::string, facebook_chatroom* >* chatrooms, bool unreadOnly, bool inboxOnly) +int facebook_json_parser::parse_thread_messages(std::string *data, std::vector< facebook_message* >* messages, std::map< std::string, facebook_chatroom* >* chatrooms, bool unreadOnly, bool inboxOnly)  { -	std::string jsonData = static_cast<std::string*>(data)->substr(9); +	std::string jsonData = data->substr(9);  	JSONROOT root(jsonData.c_str());  	if (root == NULL) @@ -908,7 +909,7 @@ int facebook_json_parser::parse_thread_messages(void* data, std::vector< faceboo  				chatrooms->erase(iter); // this is not chatroom  			}  			else { -				iter->second->chat_name = json_as_string(name); // TODO: create name from users if there is no name... +				iter->second->chat_name = ptrT(json_as_string(name)); // TODO: create name from users if there is no name...  				JSONNODE *participants = json_get(it, "participants");  				for (unsigned int j = 0; j < json_size(participants); j++) { @@ -970,6 +971,12 @@ int facebook_json_parser::parse_thread_messages(void* data, std::vector< faceboo  		if (message_text.empty())  			continue; +		bool isUnread = (is_unread != NULL && json_as_bool(is_unread)); + +		// Ignore read messages if we want only unread messages +		if (unreadOnly && !isUnread) +			continue; +  		facebook_message* message = new facebook_message();  		message->message_text = message_text;  		if (author_email != NULL) @@ -978,11 +985,7 @@ int facebook_json_parser::parse_thread_messages(void* data, std::vector< faceboo  		message->thread_id = thread_id;  		message->message_id = message_id;  		message->isIncoming = (author_id != proto->facy.self_.user_id); -		message->isUnread = (is_unread != NULL && json_as_bool(is_unread)); - -		// Ignore read messages if we want only unread messages -		if (unreadOnly && !message->isUnread) -			continue; +		message->isUnread = isUnread;  		std::map<std::string, facebook_chatroom*>::iterator iter = chatrooms->find(thread_id);  		if (iter != chatrooms->end()) { @@ -996,8 +999,8 @@ int facebook_json_parser::parse_thread_messages(void* data, std::vector< faceboo  			std::map<std::string, std::string>::iterator iter = thread_ids.find(thread_id);  			if (iter != thread_ids.end()) {  				message->user_id = iter->second; // TODO: Check if we have contact with this ID in friendlist and otherwise do something different? -			} -			else { +			} else { +				delete message;  				continue;  			}  		} @@ -1008,9 +1011,9 @@ int facebook_json_parser::parse_thread_messages(void* data, std::vector< faceboo  	return EXIT_SUCCESS;  } -int facebook_json_parser::parse_thread_info(void* data, std::string* user_id) +int facebook_json_parser::parse_thread_info(std::string *data, std::string* user_id)  { -	std::string jsonData = static_cast<std::string*>(data)->substr(9); +	std::string jsonData = data->substr(9);  	JSONROOT root(jsonData.c_str());  	if (root == NULL) @@ -1047,9 +1050,9 @@ int facebook_json_parser::parse_thread_info(void* data, std::string* user_id)  } -int facebook_json_parser::parse_user_info(void* data, facebook_user* fbu) +int facebook_json_parser::parse_user_info(std::string *data, facebook_user* fbu)  { -	std::string jsonData = static_cast<std::string*>(data)->substr(9); +	std::string jsonData = data->substr(9);  	JSONROOT root(jsonData.c_str());  	if (root == NULL) @@ -1081,9 +1084,9 @@ int facebook_json_parser::parse_user_info(void* data, facebook_user* fbu)  	return EXIT_SUCCESS;  } -int facebook_json_parser::parse_chat_info(void* data, facebook_chatroom* fbc) +int facebook_json_parser::parse_chat_info(std::string *data, facebook_chatroom* fbc)  { -	std::string jsonData = static_cast<std::string*>(data)->substr(9); +	std::string jsonData = data->substr(9);  	JSONROOT root(jsonData.c_str());  	if (root == NULL) @@ -1129,7 +1132,7 @@ int facebook_json_parser::parse_chat_info(void* data, facebook_chatroom* fbc)  		if (thread_id_ == NULL || is_canonical_user_ == NULL || json_as_bool(is_canonical_user_))  			continue; -		std::tstring tid = json_as_string(thread_id_); +		std::tstring tid = ptrT(json_as_string(thread_id_));  		// TODO: allow more users to parse at once  		if (fbc->thread_id != tid) { @@ -1143,7 +1146,7 @@ int facebook_json_parser::parse_chat_info(void* data, facebook_chatroom* fbc)  			fbc->participants.insert(std::make_pair(user_id.substr(5), ""));  		} -		fbc->chat_name = json_as_string(name_); +		fbc->chat_name = ptrT(json_as_string(name_));  	}  	return EXIT_SUCCESS; diff --git a/protocols/FacebookRM/src/json.h b/protocols/FacebookRM/src/json.h index cae57eb412..ed224cd805 100644 --- a/protocols/FacebookRM/src/json.h +++ b/protocols/FacebookRM/src/json.h @@ -30,15 +30,15 @@ class facebook_json_parser  {
  public:
  	FacebookProto* proto;
 -	int parse_buddy_list(void*, List::List< facebook_user >*);
 -	int parse_friends(void*, std::map< std::string, facebook_user* >*);
 -	int parse_notifications(void*, std::map< std::string, facebook_notification* >*);
 -	int parse_messages(void*, std::vector< facebook_message* >*, std::map< std::string, facebook_notification* >*, bool inboxOnly);
 -	int parse_unread_threads(void*, std::vector< std::string >*, bool inboxOnly);
 -	int parse_thread_messages(void*, std::vector< facebook_message* >*, std::map< std::string, facebook_chatroom* >*, bool unreadOnly, bool inboxOnly);
 -	int parse_thread_info(void* data, std::string* user_id);
 -	int parse_user_info(void* data, facebook_user* fbu);
 -	int parse_chat_info(void* data, facebook_chatroom* fbc);
 +	int parse_buddy_list(std::string*, List::List< facebook_user >*);
 +	int parse_friends(std::string*, std::map< std::string, facebook_user* >*);
 +	int parse_notifications(std::string*, std::map< std::string, facebook_notification* >*);
 +	int parse_messages(std::string*, std::vector< facebook_message* >*, std::map< std::string, facebook_notification* >*, bool inboxOnly);
 +	int parse_unread_threads(std::string*, std::vector< std::string >*, bool inboxOnly);
 +	int parse_thread_messages(std::string*, std::vector< facebook_message* >*, std::map< std::string, facebook_chatroom* >*, bool unreadOnly, bool inboxOnly);
 +	int parse_thread_info(std::string* data, std::string* user_id);
 +	int parse_user_info(std::string* data, facebook_user* fbu);
 +	int parse_chat_info(std::string* data, facebook_chatroom* fbc);
  	facebook_json_parser(FacebookProto* proto)
  	{
 diff --git a/protocols/FacebookRM/src/messages.cpp b/protocols/FacebookRM/src/messages.cpp index de6811cf2c..192ef1fb8c 100644 --- a/protocols/FacebookRM/src/messages.cpp +++ b/protocols/FacebookRM/src/messages.cpp @@ -114,11 +114,10 @@ void FacebookProto::SendChatMsgWorker(void *p)  int FacebookProto::SendMsg(MCONTACT hContact, int flags, const char *msg)  {  	// TODO: msg comes as Unicode (retyped wchar_t*), why should we convert it as ANSI to UTF-8? o_O -	if (flags & PREF_UNICODE) -		msg = mir_utf8encode(msg); +	std::string message = (flags & PREF_UNICODE) ? ptrA(mir_utf8encode(msg)) : msg;  	facy.msgid_ = (facy.msgid_ % 1024) + 1; -	ForkThread(&FacebookProto::SendMsgWorker, new send_direct(hContact, msg, (HANDLE)facy.msgid_)); +	ForkThread(&FacebookProto::SendMsgWorker, new send_direct(hContact, message, (HANDLE)facy.msgid_));  	return facy.msgid_;  } diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp index 36b95aad68..c0e6f28ee2 100644 --- a/protocols/FacebookRM/src/process.cpp +++ b/protocols/FacebookRM/src/process.cpp @@ -56,7 +56,7 @@ void FacebookProto::ProcessBuddyList(void*)  	CODE_BLOCK_TRY -		facebook_json_parser* p = new facebook_json_parser(this); +	facebook_json_parser* p = new facebook_json_parser(this);  	p->parse_buddy_list(&resp.data, &facy.buddies);  	delete p; @@ -338,21 +338,20 @@ void FacebookProto::ProcessUnreadMessages(void*)  		facy.handle_success("ProcessUnreadMessages");  } -void FacebookProto::ProcessUnreadMessage(void *p) +void FacebookProto::ProcessUnreadMessage(void *data)  { -	if (p == NULL) +	if (data == NULL)  		return; +	std::vector<std::string> *threads = (std::vector<std::string>*)data; +  	if (isOffline()) { -		delete (std::vector<std::string>*)p; +		delete threads;  		return;  	}  	facy.handle_entry("ProcessUnreadMessage"); -	std::vector<std::string> threads = *(std::vector<std::string>*)p; -	delete (std::vector<std::string>*)p; -  	int offset = 0;  	int limit = 21; @@ -363,14 +362,14 @@ void FacebookProto::ProcessUnreadMessage(void *p)  	http::response resp; -	while (!threads.empty()) { +	while (!threads->empty()) {  		std::string data = "client=mercury";  		data += "&__user=" + facy.self_.user_id;  		data += "&fb_dtsg=" + facy.dtsg_;  		data += "&__a=1&__dyn=&__req=&ttstamp=" + facy.ttstamp(); -		for (std::vector<std::string>::size_type i = 0; i < threads.size(); i++) { -			std::string thread_id = utils::url::encode(threads[i]); +		for (std::vector<std::string>::size_type i = 0; i < threads->size(); i++) { +			std::string thread_id = utils::url::encode(threads->at(i));  			// request messages from thread  			data += "&messages[thread_ids][" + thread_id; @@ -389,7 +388,7 @@ void FacebookProto::ProcessUnreadMessage(void *p)  			CODE_BLOCK_TRY -				std::vector<facebook_message*> messages; +			std::vector<facebook_message*> messages;  			std::map<std::string, facebook_chatroom*> chatrooms;  			facebook_json_parser* p = new facebook_json_parser(this); @@ -431,11 +430,11 @@ void FacebookProto::ProcessUnreadMessage(void *p)  			CODE_BLOCK_CATCH -				debugLogA("***** Error processing unread messages: %s", e.what()); +			debugLogA("***** Error processing unread messages: %s", e.what());  			CODE_BLOCK_END -				facy.handle_success("ProcessUnreadMessage"); +			facy.handle_success("ProcessUnreadMessage");  		}  		else {  			facy.handle_error("ProcessUnreadMessage"); @@ -444,8 +443,10 @@ void FacebookProto::ProcessUnreadMessage(void *p)  		offset += limit;  		limit = 20; // TODO: use better limits? -		threads.clear(); // TODO: if we have limit messages from one user, there may be more unread messages... continue with it... otherwise remove that threadd from threads list -- or do it in json parser? hm			 = allow more than "limit" unread messages to be parsed +		threads->clear(); // TODO: if we have limit messages from one user, there may be more unread messages... continue with it... otherwise remove that threadd from threads list -- or do it in json parser? hm			 = allow more than "limit" unread messages to be parsed  	} + +	delete threads;  }  void FacebookProto::LoadLastMessages(void *p) @@ -849,19 +850,16 @@ void FacebookProto::ProcessMessages(void* data)  	if (data == NULL)  		return; +	std::string* resp = (std::string*)data; +  	if (isOffline()) { -		delete (std::string*)data; +		delete resp;  		return;  	} -	std::string* resp = (std::string*)data; -  	// receive messages from all folders by default, use hidden setting to receive only inbox messages  	bool inboxOnly = getBool(FACEBOOK_KEY_INBOX_ONLY, 0); -	if (isOffline()) -		goto exit; -  	debugLogA("***** Starting processing messages");  	CODE_BLOCK_TRY @@ -869,7 +867,7 @@ void FacebookProto::ProcessMessages(void* data)  		std::vector< facebook_message* > messages;  	facebook_json_parser* p = new facebook_json_parser(this); -	p->parse_messages(data, &messages, &facy.notifications, inboxOnly); +	p->parse_messages(resp, &messages, &facy.notifications, inboxOnly);  	delete p;  	bool local_timestamp = getBool(FACEBOOK_KEY_LOCAL_TIMESTAMP, 0); @@ -886,7 +884,6 @@ void FacebookProto::ProcessMessages(void* data)  	CODE_BLOCK_END -	exit :  	delete resp;  } @@ -929,7 +926,7 @@ void FacebookProto::ProcessNotifications(void*)  	CODE_BLOCK_TRY -		facebook_json_parser* p = new facebook_json_parser(this); +	facebook_json_parser* p = new facebook_json_parser(this);  	p->parse_notifications(&(resp.data), &facy.notifications);  	delete p; @@ -971,8 +968,7 @@ void FacebookProto::ProcessFriendRequests(void*)  		if ((pos2 = reqs.find("<img src=", pos)) != std::string::npos) {  			req = reqs.substr(pos, pos2 - pos);  			pos = pos2 + 9; -		} -		else { +		} else {  			req = reqs.substr(pos);  			last = true;  		} @@ -981,18 +977,19 @@ void FacebookProto::ProcessFriendRequests(void*)  		std::string time = utils::text::source_get_value2(&get, "seenrequesttime=", "&\"");  		std::string reason = utils::text::remove_html(utils::text::source_get_value(&req, 3, "<span", ">", "</span>")); -		facebook_user *fbu = new facebook_user(); -		fbu->real_name = utils::text::remove_html(utils::text::source_get_value(&req, 3, "<strong", ">", "</strong>")); -		fbu->user_id = utils::text::source_get_value2(&get, "id=", "&\""); +		facebook_user fbu; +		fbu.real_name = utils::text::remove_html(utils::text::source_get_value(&req, 3, "<strong", ">", "</strong>")); +		fbu.user_id = utils::text::source_get_value2(&get, "id=", "&\""); -		if (!fbu->user_id.empty() && !fbu->real_name.empty()) -		{ -			MCONTACT hContact = AddToContactList(fbu, CONTACT_APPROVE); +		if (!fbu.user_id.empty() && !fbu.real_name.empty()) { +			MCONTACT hContact = AddToContactList(&fbu, CONTACT_APPROVE);  			setByte(hContact, FACEBOOK_KEY_CONTACT_TYPE, CONTACT_APPROVE); +			bool isNew = false;  			ptrA oldTime(getStringA(hContact, "RequestTime"));  			if (oldTime == NULL || strcmp(oldTime, time.c_str())) {  				// This is new request +				isNew = true;  				setString(hContact, "RequestTime", time.c_str());  				//blob is: uin(DWORD), hContact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ), reason(ASCIIZ) @@ -1003,26 +1000,21 @@ void FacebookProto::ProcessFriendRequests(void*)  				dbei.timestamp = ::time(NULL);  				dbei.flags = DBEF_UTF;  				dbei.eventType = EVENTTYPE_AUTHREQUEST; -				dbei.cbBlob = (DWORD)(sizeof(DWORD) * 2 + fbu->real_name.length() + fbu->user_id.length() + reason.length() + 5); +				dbei.cbBlob = (DWORD)(sizeof(DWORD) * 2 + fbu.real_name.length() + fbu.user_id.length() + reason.length() + 5);  				PBYTE pCurBlob = dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob);  				*(PDWORD)pCurBlob = 0; pCurBlob += sizeof(DWORD);                    // UID  				*(PDWORD)pCurBlob = (DWORD)hContact; pCurBlob += sizeof(DWORD);      // Contact Handle -				strcpy((char*)pCurBlob, fbu->real_name.data()); pCurBlob += fbu->real_name.length() + 1;	// Nickname +				strcpy((char*)pCurBlob, fbu.real_name.data()); pCurBlob += fbu.real_name.length() + 1;	// Nickname  				*pCurBlob = '\0'; pCurBlob++;                                        // First Name  				*pCurBlob = '\0'; pCurBlob++;                                        // Last Name -				strcpy((char*)pCurBlob, fbu->user_id.data()); pCurBlob += fbu->user_id.length() + 1;	// E-mail (we use it for string ID) +				strcpy((char*)pCurBlob, fbu.user_id.data()); pCurBlob += fbu.user_id.length() + 1;	// E-mail (we use it for string ID)  				strcpy((char*)pCurBlob, reason.data()); pCurBlob += reason.length() + 1;	// Reason (we use it for info about common friends)  				db_event_add(0, &dbei); - -				debugLogA("      (New) Friendship request from: %s (%s) [%s]", fbu->real_name.c_str(), fbu->user_id.c_str(), time.c_str());  			} -			else { -				debugLogA("      (Old) Friendship request from: %s (%s) [%s]", fbu->real_name.c_str(), fbu->user_id.c_str(), time.c_str()); -			} -		} -		else { +			debugLogA("      (%s) Friendship request from: %s (%s) [%s]", (isNew ? "New" : "Old"), fbu.real_name.c_str(), fbu.user_id.c_str(), time.c_str()); +		} else {  			debugLogA(" !!!  Wrong friendship request");  			debugLogA("%s", req.c_str());  		} @@ -1180,16 +1172,13 @@ void FacebookProto::ProcessFeeds(void*)  	for (std::vector<facebook_newsfeed*>::size_type i = 0; i < news.size(); i++)  	{ -		ptrT tszTitle(mir_utf8decodeT(news[i]->title.c_str())); -		ptrT tszText(mir_utf8decodeT(news[i]->text.c_str())); -  		// Truncate text of newsfeed when it's too long -		if (_tcslen(tszText) > MAX_NEWSFEED_LEN) { -			TCHAR buf[MAX_NEWSFEED_LEN + 3 + 1] = { 0 }; -			_tcsncpy(buf, tszText, MAX_NEWSFEED_LEN); -			_tcsncpy(&buf[MAX_NEWSFEED_LEN], _T("..."), 3); -			tszText = buf; -		} +		std::tstring text = ptrT(mir_utf8decodeT(news[i]->text.c_str())); +		if (text.length() > MAX_NEWSFEED_LEN) +			text = text.substr(0, MAX_NEWSFEED_LEN) + _T("..."); + +		ptrT tszTitle(mir_utf8decodeT(news[i]->title.c_str())); +		ptrT tszText(mir_tstrdup(text.c_str()));  		NotifyEvent(tszTitle, tszText, this->ContactIDToHContact(news[i]->user_id), FACEBOOK_EVENT_NEWSFEED, &news[i]->link);  		delete news[i]; diff --git a/protocols/FacebookRM/src/proto.cpp b/protocols/FacebookRM/src/proto.cpp index 94fc964b18..aacb6f08a7 100644 --- a/protocols/FacebookRM/src/proto.cpp +++ b/protocols/FacebookRM/src/proto.cpp @@ -35,9 +35,13 @@ PROTO<FacebookProto>(proto_name, username)  	facy.send_message_lock_ = CreateMutex(NULL, FALSE, NULL);  	facy.fcb_conn_lock_ = CreateMutex(NULL, FALSE, NULL);  	facy.notifications_lock_ = CreateMutex(NULL, FALSE, NULL); +	facy.cookies_lock_ = CreateMutex(NULL, FALSE, NULL); + +	m_hMenuRoot = m_hMenuServicesRoot = m_hStatusMind = NULL;  	m_invisible = false;  	m_signingOut = false; +	m_enableChat = DEFAULT_ENABLE_CHATS;  	// Load custom locale, if set  	ptrA locale(getStringA(FACEBOOK_KEY_LOCALE)); @@ -118,6 +122,7 @@ FacebookProto::~FacebookProto()  	WaitForSingleObject(facy.buddies_lock_, IGNORE);  	WaitForSingleObject(facy.send_message_lock_, IGNORE);  	WaitForSingleObject(facy.notifications_lock_, IGNORE); +	WaitForSingleObject(facy.cookies_lock_, IGNORE);  	CloseHandle(signon_lock_);  	CloseHandle(avatar_lock_); @@ -127,6 +132,7 @@ FacebookProto::~FacebookProto()  	CloseHandle(facy.send_message_lock_);  	CloseHandle(facy.fcb_conn_lock_);  	CloseHandle(facy.notifications_lock_); +	CloseHandle(facy.cookies_lock_);  }  ////////////////////////////////////////////////////////////////////////////// @@ -864,20 +870,20 @@ void FacebookProto::ReadNotificationWorker(void *p)  	if (p == NULL)  		return; +	std::string *id = (std::string*)p; +  	if (isOffline()) { -		delete (std::string*)p; +		delete id;  		return;  	} -	std::string *id = static_cast<std::string*>(p); -  	std::string data = "seen=0&asyncSignal=&__dyn=&__req=a&alert_ids%5B0%5D=" + utils::url::encode(*id);  	data += "&fb_dtsg=" + facy.dtsg_;  	data += "&__user=" + facy.self_.user_id;  	facy.flap(REQUEST_NOTIFICATIONS_READ, NULL, &data); -	delete p; +	delete id;  }  /** @@ -982,8 +988,8 @@ void FacebookProto::InitPopups()  void FacebookProto::InitHotkeys()  {  	char text[200]; -	strcpy(text, m_szModuleName); -	char* tDest = text + strlen(text); +	mir_strncpy(text, m_szModuleName, 100); +	char *tDest = text + strlen(text);  	HOTKEYDESC hkd = { sizeof(hkd) };  	hkd.pszName = text; diff --git a/protocols/FacebookRM/src/proto.h b/protocols/FacebookRM/src/proto.h index ce78c98f4a..9c7153309f 100644 --- a/protocols/FacebookRM/src/proto.h +++ b/protocols/FacebookRM/src/proto.h @@ -253,7 +253,6 @@ public:  	std::vector<HANDLE> popupClasses;  	std::string last_status_msg_; -	HANDLE	hSmileysFolder_;  	std::vector<MCONTACT> avatar_queue;  	static void CALLBACK APC_callback(ULONG_PTR p); diff --git a/protocols/FacebookRM/src/theme.cpp b/protocols/FacebookRM/src/theme.cpp index 67b6701a2f..387388f712 100644 --- a/protocols/FacebookRM/src/theme.cpp +++ b/protocols/FacebookRM/src/theme.cpp @@ -197,7 +197,7 @@ int FacebookProto::OnPrebuildContactMenu(WPARAM wParam, LPARAM)  int FacebookProto::OnBuildStatusMenu(WPARAM, LPARAM)
  {
  	char text[200];
 -	strcpy(text, m_szModuleName);
 +	mir_strncpy(text, m_szModuleName, 100);
  	char *tDest = text + strlen(text);
  	CLISTMENUITEM mi = { sizeof(mi) };
 diff --git a/protocols/FacebookRM/src/utils.cpp b/protocols/FacebookRM/src/utils.cpp index 4ca4e0ea85..48f15876e9 100644 --- a/protocols/FacebookRM/src/utils.cpp +++ b/protocols/FacebookRM/src/utils.cpp @@ -80,6 +80,7 @@ std::string utils::conversion::to_string(void* data, WORD type)  	{
  	case UTILS_CONV_BOOLEAN:
  		out << (data ? "true" : "false");
 +		break;
  	case UTILS_CONV_TIME_T:
  		out << (*(time_t*)data);
 diff --git a/protocols/FacebookRM/src/version.h b/protocols/FacebookRM/src/version.h index f093240753..fd1aaf6101 100644 --- a/protocols/FacebookRM/src/version.h +++ b/protocols/FacebookRM/src/version.h @@ -1,7 +1,7 @@  #define __MAJOR_VERSION            0
  #define __MINOR_VERSION            2
  #define __RELEASE_NUM              9
 -#define __BUILD_NUM                7
 +#define __BUILD_NUM                8
  #include <stdver.h>
  | 
