@@ -718,10 +718,37 @@ gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message
718718 gchar * error_msg_formatted = g_strdup_printf (_ ("Connection error: %s." ), error_message );
719719 purple_connection_error (conn -> ya -> pc , PURPLE_CONNECTION_ERROR_NETWORK_ERROR , error_msg_formatted );
720720 g_free (error_msg_formatted );
721- g_object_unref (parser );
722- g_free (conn );
723- return ;
721+ goto out ;
724722 }
723+ #if !PURPLE_VERSION_CHECK (3 , 0 , 0 )
724+ else {
725+ /* Purple 2.x doesn't check for the http status to be successful so let's
726+ * do that here quick.
727+ * Borrowed and then adapted from purple2compat http.c
728+ */
729+ if (!error_message ) {
730+ gsize header_len = (body + 4 - url_text );
731+ gchar header [header_len ];
732+ g_strlcpy (header , url_text , header_len );
733+ gchar * * header_by_word = g_strsplit_set (header , " " , 2 );
734+ gint code = -1 ;
735+
736+ sscanf (header_by_word [1 ], "%d" , & code );
737+ g_strfreev (header_by_word );
738+
739+ if (!(code <= 0 || code / 100 == 2 )) {
740+ gchar * error_msg_formatted = g_strdup_printf (
741+ _ ("Connection error: Invalid HTTP response code (%d)." ),
742+ code );
743+ purple_connection_error (conn -> ya -> pc ,
744+ PURPLE_CONNECTION_ERROR_NETWORK_ERROR ,
745+ error_msg_formatted );
746+ g_free (error_msg_formatted );
747+ goto out ;
748+ }
749+ }
750+ }
751+ #endif
725752 if (body != NULL && !json_parser_load_from_data (parser , body , body_len , NULL )) {
726753 //purple_debug_error("rocketchat", "Error parsing response: %s\n", body);
727754 if (conn -> callback ) {
@@ -747,9 +774,12 @@ gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message
747774 conn -> callback (conn -> ya , root , conn -> user_data , NULL );
748775 }
749776 }
750-
777+
778+ out :
751779 g_object_unref (parser );
752780 g_free (conn );
781+
782+ return ;
753783}
754784
755785static void
@@ -2041,6 +2071,8 @@ static guint rc_conv_send_typing(PurpleConversation *conv, PurpleIMTypingState s
20412071static gulong chat_conversation_typing_signal = 0 ;
20422072static void rc_mark_conv_seen (PurpleConversation * conv , PurpleConversationUpdateType type );
20432073static gulong conversation_updated_signal = 0 ;
2074+ static void rc_login_me_cb (RocketChatAccount * ya , JsonNode * node , gpointer user_data ,
2075+ JsonObject * error );
20442076
20452077static void
20462078rc_free_proxy (gpointer data )
@@ -2131,20 +2163,33 @@ rc_login(PurpleAccount *account)
21312163
21322164 //Build the initial hash tables from the current buddy list
21332165 rc_build_groups_from_blist (ya );
2134-
2135- //TODO do something with this callback to make sure it's actually a rocket.chat server
2166+
21362167 url = g_strconcat ("https://" , ya -> server , ya -> path , "/api/me" , NULL );
2137- rc_fetch_url (ya , url , NULL , NULL , NULL );
2168+ rc_fetch_url (ya , url , NULL , rc_login_me_cb , NULL );
21382169 g_free (url );
2139-
2170+ }
2171+
2172+
2173+ static void
2174+ rc_login_me_cb (RocketChatAccount * ya , JsonNode * node , gpointer user_data ,
2175+ JsonObject * error )
2176+ {
2177+ if (!ya ) return ;
2178+ // TODO: Add else that parses the error status
2179+
21402180 rc_start_socket (ya );
2141-
2142-
2181+
21432182 if (!chat_conversation_typing_signal ) {
2144- chat_conversation_typing_signal = purple_signal_connect (purple_conversations_get_handle (), "chat-conversation-typing" , purple_connection_get_protocol (pc ), PURPLE_CALLBACK (rc_conv_send_typing ), NULL );
2183+ chat_conversation_typing_signal = purple_signal_connect (
2184+ purple_conversations_get_handle (), "chat-conversation-typing" ,
2185+ purple_connection_get_protocol (ya -> pc ), PURPLE_CALLBACK (rc_conv_send_typing ),
2186+ NULL );
21452187 }
21462188 if (!conversation_updated_signal ) {
2147- conversation_updated_signal = purple_signal_connect (purple_conversations_get_handle (), "conversation-updated" , purple_connection_get_protocol (pc ), PURPLE_CALLBACK (rc_mark_conv_seen ), NULL );
2189+ conversation_updated_signal = purple_signal_connect (
2190+ purple_conversations_get_handle (), "conversation-updated" ,
2191+ purple_connection_get_protocol (ya -> pc ), PURPLE_CALLBACK (rc_mark_conv_seen ),
2192+ NULL );
21482193 }
21492194}
21502195
0 commit comments