From d30dfb047a82f90e8b1de11151c07f6ff2c81038 Mon Sep 17 00:00:00 2001 From: Yuri Date: Mon, 24 Nov 2014 23:01:58 +0300 Subject: [PATCH 01/17] Better icons --- imgs/telegram.png | Bin 3145 -> 1850 bytes imgs/telegram16.png | Bin 671 -> 432 bytes imgs/telegram22.png | Bin 1032 -> 943 bytes imgs/telegram48.png | Bin 2268 -> 2000 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/imgs/telegram.png b/imgs/telegram.png index b4ae1e548f1bd0e183d0a323293dac9227a7d6e2..b368dca676f746652ac3a81902b4a27cb87237f5 100644 GIT binary patch delta 1836 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%0DrDoY{w1t zWmr{J3X70_@#6LdG3xd~k_6N*bV3vpmn>cG5M)IG(p8fr#7*)bULi5iq@_|yW(Wf@ zGE8Qw7AdMnwcUzM4P{tg@51~H2@L>3VHrac)9?i&C@zvvUFm?3WTi&{I>-GnFB_6* zEVod`JfJWdB}L(7L{YL#v47H(Ob*$|qev34uFi$;TvU#xa$AJGu zD;CZ#O(0JOJs)=m)$Erd{4-%NNWe0Q2=jpq;h%*(RxPq){Sp_hUhF`rMa(*r`$G{7 zO-v&gk^ulNyA2D&LDnAxuH^yd5+Wn&(Q zVXZV8Gvd!=U#o{*dqd5mIt64Azls|{`2t>yxcW{6_s{eRe$ZoH8oDuJ8daT+u+1B z{K1Inyd(;!sdT_<5z~gd7Ks#FwW4FxA6x9sZ0+HZSm6;6)g=r6bXWnz1K5Asn?Sy}NJ7m5C#<3nB}E3Elje0wa$Y+o z93Ay1*{RBJ=L!nC1OT0>x-;gOry057Pe*(Sb6zmt4u4Ugq)CnpUKa>)#{>dFAfRJR zm6UgR_uBa(MvU-oE8hw-DVUq<3?=^PHtTj*R+Dt*`do z?!ieM>K#NVENAq(@%+(YpC)egH;`HmndBk!yZW{`G40Fufs}Oe==KCKsg^7`t`?ql z`*H8v-8eGjP3m={B(&o%Mtug48lwPlQIT05kbmfT-2nYNTG|OXI+G`JlF36>80}+z zQv?8jUsmvR?-ULX`>^$`9_(%(gu>?JXO=`%F6|@JaUSMGIbBPTJO`5!} zjiVzzC`h(8i6fp_9%qA!^C@j!edl88A5Vv!>+iA>(X}Yxh%h4{GrS=g`%ZW;=#Lmy zeWn|T2t*ifoR|OuShdJ*+7bGD&o~a8@qfa+xl6fYqF?uJY1*Ik_IT~?56TJFE(TX( zR!6MQPla0-JMh@G7h++F1rdd@;gwGGOa$^LuHGJ3iUN&2w_V{$`G`#I69;Yw;{}|P zk=_uc77^FgyU^zj;0v{+#z#$h9Cx3CgdcWq{rXGkpAllF+T8~~0-+V>a3nm~kbe`= z%u&F=2fcS)x&}m?{uv=6mL%y10LIUy0cN`P$WR@|AVhu?Pd?>yf+y}>IRNH6^{(-p zj{Mdh$#$-^CO{$Oj^3>;r*e8wa$ra6>tO7{c^idUngjgkiMv<6k@JI+T0W@ReQ*yE zwqj0<%+wT@2FP9>On9@zRlGeN`OF3Y(6PBW zbh6^)jR5VzoEhom!N4>9uD(s#yhfAL3lp^q4(MiV*kr f?`WCT*XRESGmU`i0(n3D00000NkvXXu0mjfwSUXg diff --git a/imgs/telegram16.png b/imgs/telegram16.png index 91de69dd304e95b47bf417f8289b819614bcb72a..73ebafcb8f0681db4411cbe9d8457704dc80703b 100644 GIT binary patch delta 417 zcmV;S0bc%}1+W8<8Gi!+001a04^sdD0FY2jR7C&)04$~8ET-TrrQra8fGnlpE2iNr zrQj{6;Vh)!Ev4ZsrQj{5;Vh=$E2ZHpquwm0;VY%zET!Q8|Nk+j;Www@0H5D4vhpvm z?=7n5ET`fCoZkKZ|Jm&L0HNRa{QiQ$>2bQ}CZ^%%^ZLr;^?$kA@}JJ_Qn2J1qu>vs z->1>;k;m&|w&h>6FuU~u zq5uE@y-7qtR2b7$k5>|dFbqUxJBIWk%c2DWB%!3<|8|j?;Uhcxd74>i7hnN!h-@6& z=qNCa#x%?GEPq8kA#4*=2GI~DI}qtaAtHIISS4EgDDwVWR82jQS;9V5)H3&7>2B=P z2sRm2`SW&h&eiNQ3oFlEptHNSh25D?(QKDl($nb8v61*QV2FjZ&4{D(f`UBJ=Z-(b{f65dKusc;;9g+hWpT_00000 LNkvXXu0mjfgG9{u delta 658 zcmV;D0&V@U1D^$u8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000fw z000fw0YWI7cmMzZ2XskIMF-vl8V~~(?Hhw80006kNklQLzocaMrrS&Rez9<>!7GW3MD9^28*WA zCUkUkzIpexu+dLzI&gT8%f08^v$(<`^gPXWiE~3nqz`BT5cm$vJL9Ha4W^gE{ZjpO z&MZdjTx?84MnuFD5vmNqf=pEMx%+Q#_XK+aoimG3zY=*SB7Nb(!wlKZ6@!g|#haaF z1HcZCRc)WD<$wQFoO9r~nus(!0+2IL-kmqbEFfZPy0iN>#e527t=6r0bo=Ub*eRyg zP_oXaKi$CfbR!K>!;Q>JwZ{|3u&=7UBJRMTXM~=X1lKx}Txm^^+t}eq%&=70LDhzh zdVN)GtGYGEqYR!t%D|~4$LgcxHv@8OMN-K)@u2Nb-uwf!qQp^Ro#mxBKQu?I_0d0koo+R`7Z@7wbXOxTr=&hNn#O$ z5y3O?KEH+9{RqZL)`+-S0OuU4imLJ^zsaxdGB1{M{MZVJc*3`0nbocGUXQ9`t$Xe} z>rG?yE`Q)vg-U^CZly@(YmxZE8soj~ENcsN3V+x~f@^zOu sI|TFt9e>KpA}-@Zrm`a!51jLFUKI#*GTbef01E&B07*qoM6N<$f-HqS5C8xG diff --git a/imgs/telegram22.png b/imgs/telegram22.png index 709f356a12d9fc397d23f1d4cf76377da7de73f9..a51680106afe9744ae13c59eecbbd3d0e1a4bc35 100644 GIT binary patch delta 921 zcmV;K17`e)2(Jf_B!2{RLP=Bz2nYy#2xN!=003foR9JLUVRs;Ka&Km7Y-J#Hd2nSQ zK~PXJ004NLRmiaofG`XI!QNANgm)YqG7drkMM8kGe?b8aSDx(cY@@Gwk8A5k6IE4J z&ys7dX#r+l25uM$C|@o7OhgS2D;@?Q4@kBY$$C)ma{vGW_3IpO?xp5(lqGiyRP>u`3hzTo246%&MKG>JhSs2*krh(SCb7q_bF1uH)-j(zm6 z;F%A0%Hjp{+Ky0{4r&N7770Q$Zm(}HO_chAr*GW<&UpTuYexft`7l9StXuo%xz<#Rirpk+f;f=`x7bj2f>}WvcmnIiK zsWa~X^Q%laf*A9%m$sv2$qk1BO{X*xWz-69K40L{WP!6!gqeHa{(8WWA)A}TICR+) z=cW+JKz|#F^7@%!UVY&Nb59NRmFB%WdlXD=V$~t4Q=TeC=~8Mpc6|EElT43?42s*k z2kgX-=Yo96imDb(R(?2Xg=;_j!JpCK<@osLhm6^tiwl5Jkw&)^p%HF9Xfb-d#@nCO z`E5VxnRxYXli^-q5mcmM#F%X)+fHbN>Co_gt$)ebjT&FpvJ>+~Z6AmBHX1PqX4}{x zToupnS=ERY&JI~tzG`I7KfLphlYL|m&&P)0s@W(ND=uzT#n_$~J%QWJl+W+&0T4Uo z-TMcG`DvhIO0M0iZj_1@17JM6B0>KtnD7m6RelHH*4;hEZGQ3(!9j@e?Fw|c+sw_K zvVU0H*DoTcJQG^(MJYq(IM@Usnx;qg`AD{zDi}F#;sb3HVC(Yf^O~mXoqa#9xy?bv zSWGyArpbCY^cWamb7`W4CW{JH6OJHWfLO2dS{U2;_JR%&s%Wyfx%6}?&*{H996qM4 v=rvTQK#PYd4MeuR;lk>VmmdG7U+&+47!o}0gA0?s00000NkvXXu0mjf@l3YZ delta 1010 zcmVrLaR2}Vl}SWFR5;6xl}l_?WfaGM|9kIr+L=Bqr6BeJ0`<{E zLcxF-acxTwfr#w8B`$~>*}7n3Ow_1}3l}CP>V%q?n+D>2d zy5Dhe@62=xB|XVa&iCE#{LbT^?_9BpJbU)94UXg?GaEqk7;F$Su)BgkF)wd4UTrc!S@vp#bUXAb9#svfVcx;C?A?;K{)9>&uy z;B^2!@#%1ztn@eK4;ANC)}wNiqpxP-N%XcQnOq2&DSx=-S5BK@u*}?GGTGr zRb9voDPEgsZ}53xb2I&$8|g?Vc;{+{i=*?El9^cxz8wzCg$E*tQ42SSfprr5H>DYP zw3$5{(_|Klq>~;1Bmd>1QV=~K7Yl~7@5uE97tBlN>Xp&oO@XDhDjs?@#3~t4sL6ucU?o}gWsOZv$&9BV{4jJ zGQbnu%;qVU!l>@1D%|Ojz|3TE9fjDjKFyKs>*#5%2VlNXVkWypt`O4I-b8)E#}jxG zzfb3I&Q?Sl>49@@LQ+puQsc*oEXOD2=xR=K{C}}FcDE$(JkizONJCu}>ItrAmT=~x zjEj+SY!>&av#2-CF_z8o;nhh>p~HYwoloE?ejxC~wW;~2-(#DqZo{6zxn*}g zYX11Zd?Dn{o%Kq(Ab{?VuABl+^FWFE+mm?Z$#(867Wwv8 z77^b}QJx!bj12a@9RQU4;JqLWUk2-29c-9EXvUfAcWQ?b!lI5C%D3b{s2Q6b?_cTk z6I{mVWQ`KRE76XX0)OAF!CeyoUir}Yt835v8;05me6v>YvTpjiP;|S>&>Aqn_=&xl zy3%yN#A`ri4eTj1oorg)*gt+^Z{~sjys|w0$)%=TK5@{nBZ8+4x?_Ve6W7e?Y^uI^ g;g7-R=I&?zKQ|Qfcwj9#UH||907*qoM6N<$f~cbM)c^nh diff --git a/imgs/telegram48.png b/imgs/telegram48.png index 3d7263f1b318d5955ae7218434104445653224ad..aa5f885292ad5e2d1155cc4e4ea4cf3b10088db9 100644 GIT binary patch delta 1986 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 ezu|(f+x#DcE@{`2k-zHz0000 Date: Wed, 26 Nov 2014 09:40:13 +0100 Subject: [PATCH 02/17] Implement better fallback mode in case requests is missing Open a dummy chat to query the user for the entered SMS code --- telegram-base.c | 21 ++++++++++----------- telegram-base.h | 1 + telegram-purple.c | 17 +++++++++-------- telegram-purple.h | 1 + 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/telegram-base.c b/telegram-base.c index de06b49..58026c7 100644 --- a/telegram-base.c +++ b/telegram-base.c @@ -259,7 +259,7 @@ static void code_auth_receive_result (struct tgl_state *TLS, void *extra, int su } } -static void request_code_entered (gpointer data, const gchar *code) { +void request_code_entered (gpointer data, const gchar *code) { struct tgl_state *TLS = data; telegram_conn *conn = TLS->ev_base; char const *username = purple_account_get_username(conn->pa); @@ -299,16 +299,15 @@ static void request_code (struct tgl_state *TLS) { "Telegram wants to verify your identity, please enter the code, that you have received via SMS.", NULL, 0, 0, "code", "OK", G_CALLBACK(request_code_entered), "Cancel", G_CALLBACK(request_code_canceled), conn->pa, NULL, NULL, TLS)) { - const char *sms = purple_account_get_string(tg_get_acc(TLS), "code", ""); - if (*sms == '\0') { - const char *error = "Could not prompt for sms code, please set SMS code in account settings and reconnect."; - purple_connection_error_reason(conn->gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, error); - purple_notify_error(_telegram_protocol, "Enter SMS code", "Enter SMS code", error); - return; - } - - request_code_entered (TLS, sms); - purple_account_set_string(tg_get_acc(TLS), "code", ""); + + // purple request API is not available, so we create a new conversation (the Telegram system + // account "7770000") to prompt the user for the code + + conn->in_fallback_chat = 1; + purple_connection_set_state (conn->gc, PURPLE_CONNECTED); + PurpleConversation *conv = purple_conversation_new (PURPLE_CONV_TYPE_IM, conn->pa, "777000"); + purple_conversation_write (conv, "777000", "What is your SMS verification code?", + PURPLE_MESSAGE_RECV | PURPLE_MESSAGE_SYSTEM, 0); } } diff --git a/telegram-base.h b/telegram-base.h index 76a5b28..5d6a484 100644 --- a/telegram-base.h +++ b/telegram-base.h @@ -28,4 +28,5 @@ void telegram_login (struct tgl_state *TLS); PurpleConversation *chat_show (PurpleConnection *gc, int id); int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text); void chat_add_all_users (PurpleConversation *pc, struct tgl_chat *chat); +void request_code_entered (gpointer data, const gchar *code); #endif diff --git a/telegram-purple.c b/telegram-purple.c index 87b00a9..7e58843 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -627,6 +627,14 @@ static int tgprpl_send_im (PurpleConnection * gc, const char *who, const char *m telegram_conn *conn = purple_connection_get_protocol_data(gc); PurpleAccount *pa = conn->pa; + + // this is part of a workaround to support clients without + // the request API (request.h), see telegram-base.c:request_code() + if (conn->in_fallback_chat) { + request_code_entered (conn->TLS, message); + conn->in_fallback_chat = 0; + return 1; + } PurpleBuddy *b = purple_find_buddy (pa, who); if (!b) { @@ -893,16 +901,9 @@ static PurplePluginProtocolInfo prpl_info = { static void tgprpl_init (PurplePlugin *plugin) { - //PurpleAccountOption *option; - //GList *verification_values = NULL; - PurpleAccountOption *opt; - opt = purple_account_option_bool_new("Compatibility Mode (read SMS code from settings)", - "compat-verification", 0); - prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, opt); - - opt = purple_account_option_string_new("SMS Code", "code", ""); + opt = purple_account_option_bool_new("Fallback SMS verification", "compat-verification", 0); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, opt); _telegram_protocol = plugin; diff --git a/telegram-purple.h b/telegram-purple.h index bb02709..3b36565 100644 --- a/telegram-purple.h +++ b/telegram-purple.h @@ -47,6 +47,7 @@ typedef struct { GQueue *new_messages; GHashTable *joining_chats; guint timer; + int in_fallback_chat; } telegram_conn; struct download_desc { From 8dcc2a55f7d12352f01d8d2f0f8f6f25611805a1 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Wed, 26 Nov 2014 15:11:05 +0100 Subject: [PATCH 03/17] Update README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 52dc722..c93485e 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ When encountering a crash or some other bugs, please report it to us, preferably - Support changing own profile picture - Support adding new contacts - Display service messages - + - Works with libpurple proxy settings ## Version 0.4 @@ -45,7 +45,6 @@ The following features are currently planned and will probably be added in the f - File transfers - Geo-locations - Multiple accounts on one client - - Respect libpurple proxy settings (implemented but untested) ## Platform Support From 433a96a9d1a810a2a2f257a206a59dfd74f10f7f Mon Sep 17 00:00:00 2001 From: vvaltman Date: Thu, 27 Nov 2014 17:33:17 +0300 Subject: [PATCH 04/17] Show outgoing messages --- telegram-purple.c | 19 ++++++++++++++----- tgl | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/telegram-purple.c b/telegram-purple.c index 7e58843..4972c9c 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -182,6 +182,11 @@ static char *format_service_msg (struct tgl_state *TLS, struct tgl_message *M) static int our_msg (struct tgl_state *TLS, struct tgl_message *M) { //return tgl_get_peer_id(M->from_id) == TLS->our_id; + //return M->out; + return (M->flags & FLAG_SESSION_OUTBOUND) != 0; +} + +static int out_msg (struct tgl_state *TLS, struct tgl_message *M) { return M->out; } @@ -240,14 +245,14 @@ void on_message_load_photo (struct tgl_state *TLS, void *extra, int success, cha switch (tgl_get_peer_type (M->to_id)) { case TGL_PEER_CHAT: debug ("PEER_CHAT\n"); - if (! our_msg(TLS, M)) { + if (!our_msg(TLS, M)) { chat_add_message (TLS, M, image); } break; case TGL_PEER_USER: debug ("PEER_USER\n"); - if (our_msg(TLS, M)) { + if (out_msg(TLS, M)) { p2tgl_got_im (TLS, M->to_id, image, PURPLE_MESSAGE_SEND | PURPLE_MESSAGE_IMAGES, M->date); } else { p2tgl_got_im (TLS, M->from_id, image, PURPLE_MESSAGE_RECV | PURPLE_MESSAGE_IMAGES, M->date); @@ -311,7 +316,7 @@ static void update_message_received (struct tgl_state *TLS, struct tgl_message * switch (tgl_get_peer_type (M->to_id)) { case TGL_PEER_CHAT: debug ("PEER_CHAT\n"); - if (! our_msg(TLS, M)) { + if (!our_msg(TLS, M)) { chat_add_message (TLS, M, text); } break; @@ -321,8 +326,12 @@ static void update_message_received (struct tgl_state *TLS, struct tgl_message * // p2tgl_got_im (TLS, M->to_id, text, PURPLE_MESSAGE_SEND, M->date); // :TODO: figure out how to add messages from different devices to history - if (! our_msg(TLS, M)) { - p2tgl_got_im (TLS, M->from_id, text, PURPLE_MESSAGE_RECV, M->date); + if (!our_msg(TLS, M)) { + if (out_msg(TLS, M)) { + p2tgl_got_im (TLS, M->to_id, text, PURPLE_MESSAGE_SEND, M->date); + } else { + p2tgl_got_im (TLS, M->from_id, text, PURPLE_MESSAGE_RECV, M->date); + } } break; diff --git a/tgl b/tgl index d78ebeb..4a22827 160000 --- a/tgl +++ b/tgl @@ -1 +1 @@ -Subproject commit d78ebeb6c61b63755052ef6d0f08113396173657 +Subproject commit 4a2282719f03e6f48be84fef3fca961bbb24b94a From 68d69e1da8d29ed45002eee4eed66730f0865553 Mon Sep 17 00:00:00 2001 From: vvaltman Date: Thu, 27 Nov 2014 21:53:21 +0300 Subject: [PATCH 05/17] Use latest version of tgl --- tgl | 2 +- tgp-net.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tgl b/tgl index 4a22827..cebe282 160000 --- a/tgl +++ b/tgl @@ -1 +1 @@ -Subproject commit 4a2282719f03e6f48be84fef3fca961bbb24b94a +Subproject commit cebe2822a2620961692ac45b0ea2ee99d396c5fb diff --git a/tgp-net.c b/tgp-net.c index 1117fd2..23482cb 100644 --- a/tgp-net.c +++ b/tgp-net.c @@ -83,6 +83,7 @@ static int ping_alarm (gpointer arg) { static void stop_ping_timer (struct connection *c) { purple_timeout_remove (c->ping_ev); + c->ping_ev = -1; } static void start_ping_timer (struct connection *c) { @@ -457,7 +458,9 @@ static void try_rpc_read (struct connection *c) { len *= 4; int op; assert (tgln_read_in_lookup (c, &op, 4) == 4); - c->methods->execute (TLS, c, op, len); + if (c->methods->execute (TLS, c, op, len) < 0) { + return; + } } } @@ -593,6 +596,7 @@ static void tgln_free (struct connection *c) { purple_input_remove (c->write_ev); } + if (c->fd >= 0) { close (c->fd); } c->fd = -1; } From b2c26771b5613be707d15f7d00f066d946b8eea1 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Sat, 13 Dec 2014 16:09:09 +0100 Subject: [PATCH 06/17] Fix segmentation fault on chat creation update Check for null-pointer before passing hash table content to strcmp --- tgp-2prpl.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tgp-2prpl.c b/tgp-2prpl.c index e85be99..22bc976 100644 --- a/tgp-2prpl.c +++ b/tgp-2prpl.c @@ -105,7 +105,11 @@ static PurpleChat *blist_find_chat_by_hasht_cond(PurpleConnection *gc, } static int hasht_cmp_id(GHashTable *hasht, void *data) { - return !strcmp(g_hash_table_lookup(hasht, "id"), *((char **)data)); + gpointer id = g_hash_table_lookup(hasht, "id"); + if (!id || !data) { + return 0; + } + return !strcmp(id, ((char *)data)); } @@ -248,7 +252,7 @@ PurpleChat *p2tgl_chat_new (struct tgl_state *TLS, struct tgl_chat *chat) { PurpleChat *p2tgl_chat_find (struct tgl_state *TLS, tgl_peer_id_t id) { char *name = peer_strdup_id(id); - PurpleChat *c = blist_find_chat_by_hasht_cond(tg_get_conn(TLS), hasht_cmp_id, &name); + PurpleChat *c = blist_find_chat_by_hasht_cond(tg_get_conn(TLS), hasht_cmp_id, name); g_free(name); return c; } From 91b8cb5bb1f504726b6a614a97693e67f3ed5510 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Fri, 19 Dec 2014 10:47:09 +0100 Subject: [PATCH 07/17] Add proper error handling for login phase --- telegram-base.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/telegram-base.c b/telegram-base.c index 58026c7..9f52841 100644 --- a/telegram-base.c +++ b/telegram-base.c @@ -163,6 +163,15 @@ void read_dc (struct tgl_state *TLS, int auth_file_fd, int id, unsigned ver) { bl_do_dc_signed (TLS, id); } +int error_if_val_false (struct tgl_state *TLS, int val, const char *msg) { + if (!val) { + telegram_conn *conn = TLS->ev_base; + purple_connection_error_reason (conn->gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, msg); + return 1; + } + return 0; +} + void empty_auth_file (struct tgl_state *TLS) { if (TLS->test_mode) { bl_do_dc_option (TLS, 1, 0, "", strlen (TG_SERVER_TEST_1), TG_SERVER_TEST_1, 443); @@ -225,8 +234,9 @@ void read_auth_file (struct tgl_state *TLS) { void telegram_export_authorization (struct tgl_state *TLS); void export_auth_callback (struct tgl_state *TLS, void *extra, int success) { - assert (success); - telegram_export_authorization (TLS); + if (!error_if_val_false(TLS, success, "Authentication Export failed.")) { + telegram_export_authorization (TLS); + } } void telegram_export_authorization (struct tgl_state *TLS) { @@ -341,14 +351,14 @@ static void request_name_and_code (struct tgl_state *TLS) { } static void sign_in_callback (struct tgl_state *TLS, void *extra, int success, int registered, const char *mhash) { - assert (success); // TODO proper error handle telegram_conn *conn = TLS->ev_base; - conn->hash = strdup (mhash); - - if (registered) { - request_code (TLS); - } else { - request_name_and_code (TLS); + if (!error_if_val_false (TLS, success, "Invalid or non-existing phone number.")) { + conn->hash = strdup (mhash); + if (registered) { + request_code (TLS); + } else { + request_name_and_code (TLS); + } } } From 4fa2b91eaae861c05db9e96008c30e94aab208af Mon Sep 17 00:00:00 2001 From: mjentsch Date: Wed, 24 Dec 2014 02:44:10 +0100 Subject: [PATCH 08/17] Mark messages as read Send a mark_read command for each received message as soon as the user is available. --- telegram-base.c | 43 ++++++++++++++++++++++++++++++++++++++++++ telegram-base.h | 8 ++++++++ telegram-purple.c | 48 +++++++++++++++++++++++++++++++++++++++-------- telegram-purple.h | 1 + tgp-2prpl.c | 6 ++++++ tgp-2prpl.h | 1 + 6 files changed, 99 insertions(+), 8 deletions(-) diff --git a/telegram-base.c b/telegram-base.c index 9f52841..7b87cae 100644 --- a/telegram-base.c +++ b/telegram-base.c @@ -450,3 +450,46 @@ void chat_add_all_users (PurpleConversation *pc, struct tgl_chat *chat) { p2tgl_conv_add_user(pc, *uid, NULL, flags, 0); } } + + +static void pending_reads_cb (struct tgl_state *TLS, void *extra, int success) +{ + debug ("ack state: %d", success); +} + +static gint pending_reads_compare (gconstpointer a, gconstpointer b) +{ + return !memcmp ((tgl_peer_id_t *)a, (tgl_peer_id_t *)b, sizeof(tgl_peer_id_t)); +} + +void pending_reads_send_all (GQueue *queue, struct tgl_state *TLS) +{ + debug ("send all pending ack"); + + tgl_peer_id_t *pending; + + while ((pending = (tgl_peer_id_t*) g_queue_pop_head(queue))) { + tgl_do_mark_read (TLS, *pending, pending_reads_cb, queue); + debug ("tgl_do_mark_read (%d)", pending->id); + free (pending); + } +} + +void pending_reads_add (GQueue *queue, tgl_peer_id_t id) +{ + tgl_peer_id_t *copy = malloc (sizeof(tgl_peer_id_t)); + *copy = id; + if (! g_queue_find_custom (queue, copy, pending_reads_compare)) { + g_queue_push_tail (queue, copy); + } +} + +void pending_reads_clear (GQueue *queue) +{ + tgl_peer_id_t *pending; + + while ((pending = (tgl_peer_id_t*) g_queue_pop_head(queue))) { + free (pending); + } +} + diff --git a/telegram-base.h b/telegram-base.h index 5d6a484..bd0615e 100644 --- a/telegram-base.h +++ b/telegram-base.h @@ -19,6 +19,9 @@ */ #ifndef __TELEGRAM_BASE_H__ #define __TELEGRAM_BASE_H__ + +#include "telegram-purple.h" + void read_state_file (struct tgl_state *TLS); void read_auth_file (struct tgl_state *TLS); void write_auth_file (struct tgl_state *TLS); @@ -29,4 +32,9 @@ PurpleConversation *chat_show (PurpleConnection *gc, int id); int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text); void chat_add_all_users (PurpleConversation *pc, struct tgl_chat *chat); void request_code_entered (gpointer data, const gchar *code); + +void pending_reads_send_all (GQueue *queue, struct tgl_state *TLS); +void pending_reads_add (GQueue *queue, tgl_peer_id_t id); +void pending_reads_clear (GQueue *queue); + #endif diff --git a/telegram-purple.c b/telegram-purple.c index 4972c9c..cc92393 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -331,6 +331,12 @@ static void update_message_received (struct tgl_state *TLS, struct tgl_message * p2tgl_got_im (TLS, M->to_id, text, PURPLE_MESSAGE_SEND, M->date); } else { p2tgl_got_im (TLS, M->from_id, text, PURPLE_MESSAGE_RECV, M->date); + + pending_reads_add (conn->pending_reads, M->from_id); + PurpleStatus *status = purple_account_get_active_status(conn->pa); + if (p2tgl_status_is_present(status)) { + pending_reads_send_all (conn->pending_reads, conn->TLS); + } } } break; @@ -552,16 +558,25 @@ static GList *tgprpl_status_types (PurpleAccount * acct) { debug ("tgprpl_status_types()\n"); GList *types = NULL; PurpleStatusType *type; - type = purple_status_type_new_with_attrs (PURPLE_STATUS_AVAILABLE, NULL, NULL, - 1, 1, 0, "last online", "last online", purple_value_new (PURPLE_TYPE_STRING), NULL); + + type = purple_status_type_new_full(PURPLE_STATUS_AVAILABLE, NULL, NULL, FALSE, TRUE, FALSE); types = g_list_prepend (types, type); - type = purple_status_type_new_with_attrs (PURPLE_STATUS_MOBILE, NULL, NULL, 1, - 1, 0, "last online", "last online", purple_value_new (PURPLE_TYPE_STRING), NULL); + type = purple_status_type_new_full(PURPLE_STATUS_MOBILE, NULL, NULL, FALSE, TRUE, FALSE); + types = g_list_prepend (types, type); + + type = purple_status_type_new_full(PURPLE_STATUS_OFFLINE, NULL, NULL, FALSE, TRUE, FALSE); types = g_list_prepend (types, type); - type = purple_status_type_new (PURPLE_STATUS_OFFLINE, NULL, NULL, 1); - types = g_list_append (types, type); + /* + The states below are only registered internally so that we get notified about + state changes to away and unavailable. This is useful for deciding when to send + No other peer should ever have those states. + */ + type = purple_status_type_new_full(PURPLE_STATUS_AWAY, NULL, NULL, FALSE, TRUE, FALSE); + types = g_list_prepend (types, type); + type = purple_status_type_new_full(PURPLE_STATUS_UNAVAILABLE, NULL, NULL, FALSE, TRUE, FALSE); + types = g_list_prepend (types, type); return g_list_reverse (types); } @@ -609,7 +624,8 @@ static void tgprpl_login (PurpleAccount * acct) { conn->gc = gc; conn->pa = acct; conn->new_messages = g_queue_new (); - conn->joining_chats = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + conn->pending_reads = g_queue_new (); + conn->joining_chats = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); purple_connection_set_protocol_data (gc, conn); tgl_set_ev_base (TLS, conn); @@ -628,7 +644,14 @@ static void tgprpl_close (PurpleConnection * gc) { debug ("tgprpl_close()\n"); telegram_conn *conn = purple_connection_get_protocol_data(gc); purple_timeout_remove(conn->timer); + + pending_reads_clear (conn->pending_reads); + tgl_free_all (conn->TLS); + g_queue_free (conn->new_messages); + g_queue_free (conn->pending_reads); + g_hash_table_destroy (conn->joining_chats); + } static int tgprpl_send_im (PurpleConnection * gc, const char *who, const char *message, PurpleMessageFlags flags) { @@ -685,7 +708,16 @@ static void tgprpl_get_info (PurpleConnection * gc, const char *username) { } static void tgprpl_set_status (PurpleAccount * acct, PurpleStatus * status) { - debug ("tgprpl_set_status()\n"); + debug ("tgprpl_set_status(%s)\n", purple_status_get_name (status)); + debug ("tgprpl_set_status(currstatus=%s)\n", purple_status_get_name(purple_account_get_active_status(acct))); + + PurpleConnection *gc = purple_account_get_connection(acct); + if (!gc) { return; } + telegram_conn *conn = purple_connection_get_protocol_data (gc); + + if (p2tgl_status_is_present(status)) { + pending_reads_send_all (conn->pending_reads, conn->TLS); + } } static void tgprpl_add_buddy (PurpleConnection * gc, PurpleBuddy * buddy, PurpleGroup * group) { diff --git a/telegram-purple.h b/telegram-purple.h index 3b36565..c72f638 100644 --- a/telegram-purple.h +++ b/telegram-purple.h @@ -45,6 +45,7 @@ typedef struct { PurpleConnection *gc; int updated; GQueue *new_messages; + GQueue *pending_reads; GHashTable *joining_chats; guint timer; int in_fallback_chat; diff --git a/tgp-2prpl.c b/tgp-2prpl.c index 22bc976..fd29c6f 100644 --- a/tgp-2prpl.c +++ b/tgp-2prpl.c @@ -85,6 +85,12 @@ char *p2tgl_strdup_alias(tgl_peer_t *user) { return g_alias; } +int p2tgl_status_is_present (PurpleStatus *status) +{ + const char *name = purple_status_get_id (status); + return !(strcmp (name, "unavailable") == 0 || strcmp (name, "away") == 0); +} + static PurpleChat *blist_find_chat_by_hasht_cond(PurpleConnection *gc, int (*fn)(GHashTable *hasht, void *data), void *data) { PurpleAccount *account = purple_connection_get_account(gc); diff --git a/tgp-2prpl.h b/tgp-2prpl.h index 319281a..77f04a5 100644 --- a/tgp-2prpl.h +++ b/tgp-2prpl.h @@ -36,6 +36,7 @@ tgl_peer_t *p2tgl_get_peer (tgl_peer_id_t peer); tgl_peer_t *p2tgl_get_peer_by_id (int id); char *p2tgl_strdup_alias(tgl_peer_t *user); +int p2tgl_status_is_present (PurpleStatus *status); PurpleConversation *p2tgl_got_joined_chat (struct tgl_state *TLS, struct tgl_chat *chat); void p2tgl_got_chat_invite (PurpleConnection *gc, tgl_peer_t *chat, tgl_peer_id_t inviter, const char *message); From d08e54d3e0657e3b84bd6dc71e42980c31326875 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Fri, 26 Dec 2014 18:54:12 +0100 Subject: [PATCH 09/17] Move functions and defintions for plugin-internal structs into separate file and fix memory leak --- telegram-base.c | 67 +++++----------------------- telegram-base.h | 4 -- telegram-purple.c | 57 ++++++++++-------------- telegram-purple.h | 24 ---------- tgp-2prpl.c | 7 +-- tgp-net.c | 9 ++-- tgp-structs.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++ tgp-structs.h | 61 ++++++++++++++++++++++++++ 8 files changed, 214 insertions(+), 124 deletions(-) create mode 100644 tgp-structs.c create mode 100644 tgp-structs.h diff --git a/telegram-base.c b/telegram-base.c index 7b87cae..21da401 100644 --- a/telegram-base.c +++ b/telegram-base.c @@ -35,6 +35,7 @@ #include #include #include +#include "tgp-structs.h" #define DC_SERIALIZED_MAGIC 0x868aa81d #define STATE_FILE_MAGIC 0x28949a93 @@ -165,7 +166,7 @@ void read_dc (struct tgl_state *TLS, int auth_file_fd, int id, unsigned ver) { int error_if_val_false (struct tgl_state *TLS, int val, const char *msg) { if (!val) { - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; purple_connection_error_reason (conn->gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, msg); return 1; } @@ -271,21 +272,21 @@ static void code_auth_receive_result (struct tgl_state *TLS, void *extra, int su void request_code_entered (gpointer data, const gchar *code) { struct tgl_state *TLS = data; - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; char const *username = purple_account_get_username(conn->pa); tgl_do_send_code_result (TLS, username, conn->hash, code, code_receive_result, 0) ; } static void request_code_canceled (gpointer data) { struct tgl_state *TLS = data; - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; purple_connection_error_reason(conn->gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, "registration canceled"); } static void request_name_code_entered (PurpleConnection* gc, PurpleRequestFields* fields) { - telegram_conn *conn = purple_connection_get_protocol_data(gc); + connection_data *conn = purple_connection_get_protocol_data(gc); struct tgl_state *TLS = conn->TLS; char const *username = purple_account_get_username(conn->pa); @@ -302,7 +303,7 @@ static void request_name_code_entered (PurpleConnection* gc, PurpleRequestFields static void request_code (struct tgl_state *TLS) { debug ("Client is not registered, registering...\n"); - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; int compat = purple_account_get_bool (tg_get_acc(TLS), "compat-verification", 0); if (compat || ! purple_request_input (conn->gc, "Telegram Code", "Enter Telegram Code", @@ -324,7 +325,7 @@ static void request_code (struct tgl_state *TLS) { static void request_name_and_code (struct tgl_state *TLS) { debug ("Phone is not registered, registering...\n"); - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; PurpleRequestFields* fields = purple_request_fields_new(); PurpleRequestField* field = 0; @@ -351,7 +352,7 @@ static void request_name_and_code (struct tgl_state *TLS) { } static void sign_in_callback (struct tgl_state *TLS, void *extra, int success, int registered, const char *mhash) { - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; if (!error_if_val_false (TLS, success, "Invalid or non-existing phone number.")) { conn->hash = strdup (mhash); if (registered) { @@ -367,7 +368,7 @@ static void telegram_send_sms (struct tgl_state *TLS) { telegram_export_authorization (TLS); return; } - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; char const *username = purple_account_get_username(conn->pa); tgl_do_send_code (TLS, username, sign_in_callback, 0); } @@ -404,7 +405,7 @@ void telegram_login (struct tgl_state *TLS) { PurpleConversation *chat_show (PurpleConnection *gc, int id) { debug ("show chat"); - telegram_conn *conn = purple_connection_get_protocol_data(gc); + connection_data *conn = purple_connection_get_protocol_data(gc); PurpleConversation *convo = purple_find_chat(gc, id); if (! convo) { @@ -420,7 +421,7 @@ PurpleConversation *chat_show (PurpleConnection *gc, int id) { } int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text) { - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; if (chat_show (conn->gc, tgl_get_peer_id (M->to_id))) { p2tgl_got_chat_in(TLS, M->to_id, M->from_id, text ? text : M->message, @@ -428,9 +429,7 @@ int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text) return 1; } else { // add message once the chat was initialised - struct message_text *mt = malloc (sizeof (*mt)); - mt->M = M; - mt->text = text ? g_strdup (text) : text; + struct message_text *mt = message_text_init (M, text); g_queue_push_tail (conn->new_messages, mt); return 0; } @@ -451,45 +450,3 @@ void chat_add_all_users (PurpleConversation *pc, struct tgl_chat *chat) { } } - -static void pending_reads_cb (struct tgl_state *TLS, void *extra, int success) -{ - debug ("ack state: %d", success); -} - -static gint pending_reads_compare (gconstpointer a, gconstpointer b) -{ - return !memcmp ((tgl_peer_id_t *)a, (tgl_peer_id_t *)b, sizeof(tgl_peer_id_t)); -} - -void pending_reads_send_all (GQueue *queue, struct tgl_state *TLS) -{ - debug ("send all pending ack"); - - tgl_peer_id_t *pending; - - while ((pending = (tgl_peer_id_t*) g_queue_pop_head(queue))) { - tgl_do_mark_read (TLS, *pending, pending_reads_cb, queue); - debug ("tgl_do_mark_read (%d)", pending->id); - free (pending); - } -} - -void pending_reads_add (GQueue *queue, tgl_peer_id_t id) -{ - tgl_peer_id_t *copy = malloc (sizeof(tgl_peer_id_t)); - *copy = id; - if (! g_queue_find_custom (queue, copy, pending_reads_compare)) { - g_queue_push_tail (queue, copy); - } -} - -void pending_reads_clear (GQueue *queue) -{ - tgl_peer_id_t *pending; - - while ((pending = (tgl_peer_id_t*) g_queue_pop_head(queue))) { - free (pending); - } -} - diff --git a/telegram-base.h b/telegram-base.h index bd0615e..c335988 100644 --- a/telegram-base.h +++ b/telegram-base.h @@ -33,8 +33,4 @@ int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text); void chat_add_all_users (PurpleConversation *pc, struct tgl_chat *chat); void request_code_entered (gpointer data, const gchar *code); -void pending_reads_send_all (GQueue *queue, struct tgl_state *TLS); -void pending_reads_add (GQueue *queue, tgl_peer_id_t id); -void pending_reads_clear (GQueue *queue); - #endif diff --git a/telegram-purple.c b/telegram-purple.c index cc92393..0533a03 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -51,6 +51,7 @@ #include "request.h" #include +#include "tgp-structs.h" #include "tgp-2prpl.h" #include "tgp-net.h" #include "tgp-timers.h" @@ -66,8 +67,8 @@ const char *pk_path = "/etc/telegram-purple/server.pub"; void tgprpl_login_on_connected(); void on_user_get_info (struct tgl_state *TLS, void *show_info, int success, struct tgl_user *U); -static telegram_conn *get_conn_from_buddy (PurpleBuddy *buddy) { - telegram_conn *c = purple_connection_get_protocol_data ( +static connection_data *get_conn_from_buddy (PurpleBuddy *buddy) { + connection_data *c = purple_connection_get_protocol_data ( purple_account_get_connection (purple_buddy_get_account (buddy))); return c; } @@ -192,7 +193,7 @@ static int out_msg (struct tgl_state *TLS, struct tgl_message *M) { static gboolean queries_timerfunc (gpointer data) { debug ("queries_timerfunc()\n"); - telegram_conn *conn = data; + connection_data *conn = data; if (conn->updated) { conn->updated = 0; @@ -267,13 +268,13 @@ void on_message_load_photo (struct tgl_state *TLS, void *extra, int success, cha } g_free (image); - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; conn->updated = 1; } static void update_message_received (struct tgl_state *TLS, struct tgl_message *M) { debug ("received message\n"); - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; conn->updated = 1; if (M->service) { @@ -436,7 +437,7 @@ static void on_userpic_loaded (struct tgl_state *TLS, void *extra, int success, struct tgl_user *U = dld->data; warning ("Can not load userpic for user %s %s\n", U->first_name, U->last_name); } - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; gchar *data = NULL; size_t len; @@ -484,7 +485,7 @@ void on_chat_get_info (struct tgl_state *TLS, void *extra, int success, struct t assert (success); debug ("on_chat_joined(%d)\n", tgl_get_peer_id (C->id)); - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; PurpleConversation *conv; if (!(conv = purple_find_chat(conn->gc, tgl_get_peer_id(C->id)))) { @@ -513,7 +514,7 @@ void on_chat_get_info (struct tgl_state *TLS, void *extra, int success, struct t void on_ready (struct tgl_state *TLS) { debug ("on_ready().\n"); - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; purple_connection_set_state(conn->gc, PURPLE_CONNECTED); purple_connection_set_display_name(conn->gc, purple_account_get_username(conn->pa)); @@ -619,13 +620,7 @@ static void tgprpl_login (PurpleAccount * acct) { // create handle to store additional info for libpurple in // the new telegram instance - telegram_conn *conn = g_new0(telegram_conn, 1); - conn->TLS = TLS; - conn->gc = gc; - conn->pa = acct; - conn->new_messages = g_queue_new (); - conn->pending_reads = g_queue_new (); - conn->joining_chats = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + connection_data *conn = connection_data_init (TLS, gc, acct); purple_connection_set_protocol_data (gc, conn); tgl_set_ev_base (TLS, conn); @@ -642,22 +637,16 @@ static void tgprpl_login (PurpleAccount * acct) { static void tgprpl_close (PurpleConnection * gc) { debug ("tgprpl_close()\n"); - telegram_conn *conn = purple_connection_get_protocol_data(gc); - purple_timeout_remove(conn->timer); - - pending_reads_clear (conn->pending_reads); - - tgl_free_all (conn->TLS); - g_queue_free (conn->new_messages); - g_queue_free (conn->pending_reads); - g_hash_table_destroy (conn->joining_chats); + connection_data *conn = purple_connection_get_protocol_data (gc); + purple_timeout_remove (conn->timer); + connection_data_free (conn); } static int tgprpl_send_im (PurpleConnection * gc, const char *who, const char *message, PurpleMessageFlags flags) { debug ("tgprpl_send_im()\n"); - telegram_conn *conn = purple_connection_get_protocol_data(gc); + connection_data *conn = purple_connection_get_protocol_data(gc); PurpleAccount *pa = conn->pa; // this is part of a workaround to support clients without @@ -688,7 +677,7 @@ static int tgprpl_send_im (PurpleConnection * gc, const char *who, const char *m static unsigned int tgprpl_send_typing (PurpleConnection * gc, const char *who, PurpleTypingState typing) { debug ("tgprpl_send_typing()\n"); int id = atoi (who); - telegram_conn *conn = purple_connection_get_protocol_data(gc); + connection_data *conn = purple_connection_get_protocol_data(gc); tgl_peer_t *U = tgl_peer_get (conn->TLS, TGL_MK_USER (id)); if (U) { if (typing == PURPLE_TYPING) { @@ -702,7 +691,7 @@ static unsigned int tgprpl_send_typing (PurpleConnection * gc, const char *who, static void tgprpl_get_info (PurpleConnection * gc, const char *username) { debug ("tgprpl_get_info()\n"); - telegram_conn *conn = purple_connection_get_protocol_data(gc); + connection_data *conn = purple_connection_get_protocol_data(gc); tgl_peer_id_t u = TGL_MK_USER(atoi(username)); tgl_do_get_user_info (conn->TLS, u, 0, on_user_get_info, (void *)1l); } @@ -713,7 +702,7 @@ static void tgprpl_set_status (PurpleAccount * acct, PurpleStatus * status) { PurpleConnection *gc = purple_account_get_connection(acct); if (!gc) { return; } - telegram_conn *conn = purple_connection_get_protocol_data (gc); + connection_data *conn = purple_connection_get_protocol_data (gc); if (p2tgl_status_is_present(status)) { pending_reads_send_all (conn->pending_reads, conn->TLS); @@ -721,7 +710,7 @@ static void tgprpl_set_status (PurpleAccount * acct, PurpleStatus * status) { } static void tgprpl_add_buddy (PurpleConnection * gc, PurpleBuddy * buddy, PurpleGroup * group) { - telegram_conn *conn = purple_connection_get_protocol_data(gc); + connection_data *conn = purple_connection_get_protocol_data(gc); const char* first = buddy->alias ? buddy->alias : ""; tgl_do_add_contact (conn->TLS, buddy->name, (int)strlen (buddy->name), first, (int)strlen (first), "", 0, 0, on_contact_added, buddy); @@ -735,7 +724,7 @@ static void tgprpl_remove_buddy (PurpleConnection * gc, PurpleBuddy * buddy, Pur debug ("tgprpl_remove_buddy()\n"); if (!buddy) { return; } - telegram_conn *conn = purple_connection_get_protocol_data (gc); + connection_data *conn = purple_connection_get_protocol_data (gc); struct tgl_user *user = purple_buddy_get_protocol_data (buddy); if (!user) { warning ("cannot remove buddy '%s', no protocol data found\n", buddy->name); return; } @@ -757,7 +746,7 @@ static void tgprpl_rem_deny (PurpleConnection * gc, const char *name){ static void tgprpl_chat_join (PurpleConnection * gc, GHashTable * data) { debug ("tgprpl_chat_join()\n"); - telegram_conn *conn = purple_connection_get_protocol_data (gc); + connection_data *conn = purple_connection_get_protocol_data (gc); const char *groupname = g_hash_table_lookup (data, "subject"); char *id = g_hash_table_lookup(data, "id"); @@ -794,7 +783,7 @@ static GHashTable *tgprpl_chat_info_deflt (PurpleConnection * gc, const char *ch static void tgprpl_chat_invite (PurpleConnection * gc, int id, const char *message, const char *name) { debug ("tgprpl_chat_invite()\n"); - telegram_conn *conn = purple_connection_get_protocol_data (gc); + connection_data *conn = purple_connection_get_protocol_data (gc); tgl_peer_t *chat = tgl_peer_get(conn->TLS, TGL_MK_CHAT (id)); tgl_peer_t *user = tgl_peer_get(conn->TLS, TGL_MK_USER (atoi(name))); @@ -808,7 +797,7 @@ static void tgprpl_chat_invite (PurpleConnection * gc, int id, const char *messa static int tgprpl_send_chat (PurpleConnection * gc, int id, const char *message, PurpleMessageFlags flags) { debug ("tgprpl_send_chat()\n"); - telegram_conn *conn = purple_connection_get_protocol_data (gc); + connection_data *conn = purple_connection_get_protocol_data (gc); gchar *raw = purple_unescape_html(message); tgl_do_send_message (conn->TLS, TGL_MK_CHAT(id), raw, (int)strlen (raw), 0, 0); @@ -834,7 +823,7 @@ static void tgprpl_convo_closed (PurpleConnection * gc, const char *who){ static void tgprpl_set_buddy_icon (PurpleConnection * gc, PurpleStoredImage * img) { debug ("tgprpl_set_buddy_icon()\n"); - telegram_conn *conn = purple_connection_get_protocol_data (gc); + connection_data *conn = purple_connection_get_protocol_data (gc); if (purple_imgstore_get_filename (img)) { char* filename = g_strdup_printf ("%s/icons/%s", purple_user_dir(), purple_imgstore_get_filename (img)); debug (filename); diff --git a/telegram-purple.h b/telegram-purple.h index c72f638..af0a216 100644 --- a/telegram-purple.h +++ b/telegram-purple.h @@ -28,7 +28,6 @@ #define TG_VERSION "0.5" #define TG_BUILD "10" -#include #include #include #include @@ -38,29 +37,6 @@ #define TGP_APP_HASH "99428c722d0ed59b9cd844e4577cb4bb" #define TGP_APP_ID 16154 -typedef struct { - struct tgl_state *TLS; - char *hash; - PurpleAccount *pa; - PurpleConnection *gc; - int updated; - GQueue *new_messages; - GQueue *pending_reads; - GHashTable *joining_chats; - guint timer; - int in_fallback_chat; -} telegram_conn; - -struct download_desc { - int type; - void *data; -}; - -struct message_text { - struct tgl_message *M; - char *text; -}; - void on_chat_get_info (struct tgl_state *TLS, void *extra, int success, struct tgl_chat *C); void on_ready (struct tgl_state *TLS); extern const char *pk_path; diff --git a/tgp-2prpl.c b/tgp-2prpl.c index fd29c6f..c77fcdb 100644 --- a/tgp-2prpl.c +++ b/tgp-2prpl.c @@ -19,6 +19,7 @@ */ #include "telegram-purple.h" #include "tgp-2prpl.h" +#include "tgp-structs.h" #include #include @@ -56,11 +57,11 @@ static int user_get_alias (tgl_peer_t *user, char *buffer, int maxlen) { } PurpleAccount *tg_get_acc (struct tgl_state *TLS) { - return (PurpleAccount *) ((telegram_conn *)TLS->ev_base)->pa; + return (PurpleAccount *) ((connection_data *)TLS->ev_base)->pa; } PurpleConnection *tg_get_conn (struct tgl_state *TLS) { - return (PurpleConnection *) ((telegram_conn *)TLS->ev_base)->gc; + return (PurpleConnection *) ((connection_data *)TLS->ev_base)->gc; } static char *peer_strdup_id(tgl_peer_id_t user) { @@ -120,7 +121,7 @@ static int hasht_cmp_id(GHashTable *hasht, void *data) { PurpleConversation *p2tgl_got_joined_chat (struct tgl_state *TLS, struct tgl_chat *chat) { - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; gchar *alias = p2tgl_strdup_alias((tgl_peer_t *)chat); PurpleConversation *conv = serv_got_joined_chat(conn->gc, tgl_get_peer_id(chat->id), alias); diff --git a/tgp-net.c b/tgp-net.c index 23482cb..24279ab 100644 --- a/tgp-net.c +++ b/tgp-net.c @@ -42,6 +42,7 @@ #include #include "tgp-net.h" +#include "tgp-structs.h" #include #include @@ -334,7 +335,7 @@ struct connection *tgln_create_connection (struct tgl_state *TLS, const char *ho c->conn_timeout = MIN_EXP_TIMEOUT; - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; c->prpl_data = purple_proxy_connect (conn->gc, conn->pa, host, port, net_on_connected, c); return c; @@ -347,8 +348,8 @@ static void restart_connection (struct connection *c) { return; } - telegram_conn *conn = TLS->ev_base; - c->prpl_data = purple_proxy_connect (conn->gc, conn->pa, c->ip, c->port, net_on_connected, c); + connection_data *conn = TLS->ev_base; + // c->prpl_data = purple_proxy_connect (conn->gc, conn->pa, c->ip, c->port, net_on_connected, c); } static void fail_connection (struct connection *c) { @@ -384,7 +385,7 @@ static void fail_connection (struct connection *c) { c->out_bytes = c->in_bytes = 0; if (c->state == conn_ready) { - telegram_conn *conn = TLS->ev_base; + connection_data *conn = TLS->ev_base; purple_connection_error_reason(conn->gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, "connection fail"); } c->prpl_data = NULL; // Did not find any destroy code. What should be done here? diff --git a/tgp-structs.c b/tgp-structs.c new file mode 100644 index 0000000..a4fe427 --- /dev/null +++ b/tgp-structs.c @@ -0,0 +1,109 @@ +/* + This file is part of telegram-purple + + 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 + + Copyright Matthias Jentsch 2014 + */ + +#include "tgp-structs.h" +#include "purple.h" +#include "msglog.h" + +#include +#include + +/* + tgp-structs.c: Structs that are only used internally by the protocol plugin + */ + +void pending_reads_free_cb (gpointer data) +{ + free (data); +} + +static void pending_reads_cb (struct tgl_state *TLS, void *extra, int success) +{ + debug ("ack state: %d", success); +} + +static gint pending_reads_compare (gconstpointer a, gconstpointer b) +{ + return !memcmp ((tgl_peer_id_t *)a, (tgl_peer_id_t *)b, sizeof(tgl_peer_id_t)); +} + +void pending_reads_send_all (GQueue *queue, struct tgl_state *TLS) +{ + debug ("send all pending ack"); + + tgl_peer_id_t *pending; + + while ((pending = (tgl_peer_id_t*) g_queue_pop_head(queue))) { + tgl_do_mark_read (TLS, *pending, pending_reads_cb, queue); + debug ("tgl_do_mark_read (%d)", pending->id); + free (pending); + } +} + +void pending_reads_add (GQueue *queue, tgl_peer_id_t id) +{ + tgl_peer_id_t *copy = malloc (sizeof(tgl_peer_id_t)); + *copy = id; + if (! g_queue_find_custom (queue, copy, pending_reads_compare)) { + g_queue_push_tail (queue, copy); + } +} + +struct message_text *message_text_init (struct tgl_message *M, gchar *text) +{ + struct message_text *mt = malloc (sizeof (struct message_text)); + mt->M = M; + mt->text = text ? g_strdup (text) : text; + return mt; +} + +void message_text_free (gpointer data) +{ + struct message_text *mt = (struct message_text*)data; + if (mt->text) { + g_free (mt->text); + } + free (mt); +} + + +connection_data *connection_data_init (struct tgl_state *TLS, PurpleConnection *gc, PurpleAccount *pa) +{ + connection_data *conn = g_new0 (connection_data, 1); + conn->TLS = TLS; + conn->gc = gc; + conn->pa = pa; + conn->new_messages = g_queue_new (); + conn->pending_reads = g_queue_new (); + conn->joining_chats = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + return conn; +} + +void *connection_data_free (connection_data *conn) +{ + purple_timeout_remove(conn->timer); + g_queue_free_full (conn->pending_reads, pending_reads_free_cb); + g_queue_free_full (conn->new_messages, message_text_free); + g_hash_table_destroy (conn->joining_chats); + tgl_free_all (conn->TLS); + free (conn); + return NULL; +} + diff --git a/tgp-structs.h b/tgp-structs.h new file mode 100644 index 0000000..5db2b59 --- /dev/null +++ b/tgp-structs.h @@ -0,0 +1,61 @@ +/* + This file is part of telegram-purple + + 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 + + Copyright Matthias Jentsch 2014 + */ + +#ifndef __telegram_adium__tgp_data__ +#define __telegram_adium__tgp_data__ + +#include "purple.h" + +#include +#include + +typedef struct { + struct tgl_state *TLS; + char *hash; + PurpleAccount *pa; + PurpleConnection *gc; + int updated; + GQueue *new_messages; + GQueue *pending_reads; + GHashTable *joining_chats; + guint timer; + int in_fallback_chat; +} connection_data; + +struct download_desc { + int type; + void *data; +}; + +struct message_text { + struct tgl_message *M; + char *text; +}; + +void pending_reads_send_all (GQueue *queue, struct tgl_state *TLS); +void pending_reads_add (GQueue *queue, tgl_peer_id_t id); + +struct message_text *message_text_init (struct tgl_message *M, gchar *text); +void message_text_free (gpointer data); + +void *connection_data_free (connection_data *conn); +connection_data *connection_data_init (struct tgl_state *TLS, PurpleConnection *gc, PurpleAccount *pa); + +#endif From e3caa6acdb7ca56038c49ca03eaa6d5bccef2da3 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Fri, 26 Dec 2014 19:19:29 +0100 Subject: [PATCH 10/17] Remove unused functions and add some comments --- msglog.c | 12 +++--------- msglog.h | 2 -- tgp-2prpl.c | 4 ++++ 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/msglog.c b/msglog.c index 42bc597..c0fe878 100644 --- a/msglog.c +++ b/msglog.c @@ -38,15 +38,9 @@ #define COLOR_NORMAL "" #endif -void hexdump (int *in_ptr, int *in_end) { - // TODO: figure out how to log hexdumps to purple log - int *ptr = in_ptr; - while (ptr < in_end) { - ++ ptr; - //printf (" %08x", *(ptr ++)); - } - //printf ("\n"); -} +/* + msglog.c: Convenience methods for logging to libpurple log + */ void log_level_printf (const char* format, va_list ap, int level, char *color) { char buffer[256]; diff --git a/msglog.h b/msglog.h index 43fe8f8..bb9f256 100644 --- a/msglog.h +++ b/msglog.h @@ -19,8 +19,6 @@ */ #include -void hexdump (int *in_ptr, int *in_end); - void debug(const char* format, ...); void info(const char* format, ...); void warning(const char* format, ...); diff --git a/tgp-2prpl.c b/tgp-2prpl.c index c77fcdb..16f4774 100644 --- a/tgp-2prpl.c +++ b/tgp-2prpl.c @@ -26,6 +26,10 @@ #include #include +/* + tgp-2prpl.c: Libpurple functions that can be called with tgl data types + */ + static void sanitize_alias(char *buffer) { size_t len = strlen(buffer); gchar *curr; From 00ece8a3b487d321d8e490c5946f44ab158e4743 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Sat, 27 Dec 2014 22:43:31 +0100 Subject: [PATCH 11/17] Fix huge memory leak Implement proper handling of imgstore reference counting and remove several leaky memdup functions --- telegram-purple.c | 13 +++++++++---- tgp-structs.c | 13 +++++++++++++ tgp-structs.h | 3 +++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/telegram-purple.c b/telegram-purple.c index 0533a03..3fdcec3 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -235,13 +235,16 @@ struct tgl_update_callback tgp_callback = { }; void on_message_load_photo (struct tgl_state *TLS, void *extra, int success, char *filename) { + connection_data *conn = TLS->ev_base; + gchar *data = NULL; size_t len; GError *err = NULL; g_file_get_contents (filename, &data, &len, &err); int imgStoreId = purple_imgstore_add_with_id (g_memdup(data, (guint)len), len, NULL); - - char *image = format_img_full(imgStoreId); + used_images_add (conn, imgStoreId); + + char *image = format_img_full (imgStoreId); struct tgl_message *M = extra; switch (tgl_get_peer_type (M->to_id)) { case TGL_PEER_CHAT: @@ -268,7 +271,7 @@ void on_message_load_photo (struct tgl_state *TLS, void *extra, int success, cha } g_free (image); - connection_data *conn = TLS->ev_base; + conn = TLS->ev_base; conn->updated = 1; } @@ -443,7 +446,9 @@ static void on_userpic_loaded (struct tgl_state *TLS, void *extra, int success, size_t len; GError *err = NULL; g_file_get_contents (filename, &data, &len, &err); + int imgStoreId = purple_imgstore_add_with_id (g_memdup(data, (guint)len), len, NULL); + used_images_add (conn, imgStoreId); struct download_desc *dld = extra; struct tgl_user *U = dld->data; @@ -460,7 +465,7 @@ static void on_userpic_loaded (struct tgl_state *TLS, void *extra, int success, purple_notify_userinfo (conn->gc, who, info, NULL, NULL); g_free (profile_image); } - purple_buddy_icons_set_for_user(conn->pa, who, g_memdup(data, (guint)len), len, NULL); + purple_buddy_icons_set_for_user(conn->pa, who, data, len, NULL); g_free(who); } diff --git a/tgp-structs.c b/tgp-structs.c index a4fe427..138e777 100644 --- a/tgp-structs.c +++ b/tgp-structs.c @@ -83,6 +83,18 @@ void message_text_free (gpointer data) free (mt); } +static void used_image_free (gpointer data) +{ + int id = GPOINTER_TO_INT(data); + purple_imgstore_unref_by_id (id); + debug ("used_image: unref %d", id); +} + +void used_images_add (connection_data *data, gint imgid) +{ + data->used_images = g_list_append (data->used_images, GINT_TO_POINTER(imgid)); + debug ("used_image: add %d", imgid); +} connection_data *connection_data_init (struct tgl_state *TLS, PurpleConnection *gc, PurpleAccount *pa) { @@ -102,6 +114,7 @@ void *connection_data_free (connection_data *conn) g_queue_free_full (conn->pending_reads, pending_reads_free_cb); g_queue_free_full (conn->new_messages, message_text_free); g_hash_table_destroy (conn->joining_chats); + g_list_free_full (conn->used_images, used_image_free); tgl_free_all (conn->TLS); free (conn); return NULL; diff --git a/tgp-structs.h b/tgp-structs.h index 5db2b59..fe0dc0b 100644 --- a/tgp-structs.h +++ b/tgp-structs.h @@ -34,6 +34,7 @@ typedef struct { int updated; GQueue *new_messages; GQueue *pending_reads; + GList *used_images; GHashTable *joining_chats; guint timer; int in_fallback_chat; @@ -55,6 +56,8 @@ void pending_reads_add (GQueue *queue, tgl_peer_id_t id); struct message_text *message_text_init (struct tgl_message *M, gchar *text); void message_text_free (gpointer data); +void used_images_add (connection_data *data, gint imgid); + void *connection_data_free (connection_data *conn); connection_data *connection_data_init (struct tgl_state *TLS, PurpleConnection *gc, PurpleAccount *pa); From 94b4390c8c534b100bc2fafd16c8c5e256035bb9 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Sun, 28 Dec 2014 00:23:35 +0100 Subject: [PATCH 12/17] Add new files to Makefile --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 997bd0a..954a649 100644 --- a/Makefile.in +++ b/Makefile.in @@ -16,7 +16,7 @@ LIB=libs DIR_LIST=${DEP} ${AUTO} ${EXE} ${OBJ} ${LIB} ${DEP}/auto ${OBJ}/auto -PLUGIN_OBJECTS=${OBJ}/tgp-net.o ${OBJ}/tgp-timers.o ${OBJ}/msglog.o ${OBJ}/telegram-base.o ${OBJ}/telegram-purple.o ${OBJ}/tgp-2prpl.o +PLUGIN_OBJECTS=${OBJ}/tgp-net.o ${OBJ}/tgp-timers.o ${OBJ}/msglog.o ${OBJ}/telegram-base.o ${OBJ}/telegram-purple.o ${OBJ}/tgp-2prpl.o ${OBJ}/tgp-structs.o ALL_OBJS=${PLUGIN_OBJECTS} .SUFFIXES: From c1ab317f1b0374806dba8eacdeacc956ff89835a Mon Sep 17 00:00:00 2001 From: mjentsch Date: Wed, 31 Dec 2014 16:17:11 +0100 Subject: [PATCH 13/17] Error connection instead of reconnecting Reconnection attempts are expected to be handled by libpurple and not by the protocol plugin, so it is visible to the user when the connection is not working. --- tgp-net.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tgp-net.c b/tgp-net.c index 24279ab..dc49408 100644 --- a/tgp-net.c +++ b/tgp-net.c @@ -349,6 +349,7 @@ static void restart_connection (struct connection *c) { } connection_data *conn = TLS->ev_base; + purple_connection_error_reason (conn->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, "Lost connection with server"); // c->prpl_data = purple_proxy_connect (conn->gc, conn->pa, c->ip, c->port, net_on_connected, c); } From 9d61f6815b6b559c444a66ef36e5d6dd323aadba Mon Sep 17 00:00:00 2001 From: mjentsch Date: Thu, 1 Jan 2015 17:27:05 +0100 Subject: [PATCH 14/17] Remove duplicate user alias change handling --- telegram-purple.c | 3 --- tgp-2prpl.c | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/telegram-purple.c b/telegram-purple.c index 3fdcec3..3e33687 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -372,9 +372,6 @@ static void update_user_handler (struct tgl_state *TLS, struct tgl_user *user, u p2tgl_prpl_got_user_status (TLS, user->id, &user->status); p2tgl_buddy_update (TLS, (tgl_peer_t *)user, flags); } - if (flags & (TGL_UPDATE_NAME | TGL_UPDATE_REAL_NAME | TGL_UPDATE_USERNAME) && buddy) { - p2tgl_blist_alias_buddy (buddy, user); - } if (flags & TGL_UPDATE_PHOTO) { tgl_do_get_user_info (TLS, user->id, 0, on_user_get_info, 0); } diff --git a/tgp-2prpl.c b/tgp-2prpl.c index 16f4774..e6e4191 100644 --- a/tgp-2prpl.c +++ b/tgp-2prpl.c @@ -196,7 +196,7 @@ PurpleBuddy *p2tgl_buddy_update (struct tgl_state *TLS, tgl_peer_t *user, unsign if (!b) { b = p2tgl_buddy_new (TLS, user); } - if (flags & TGL_UPDATE_NAME) { + if (flags & (TGL_UPDATE_NAME | TGL_UPDATE_REAL_NAME | TGL_UPDATE_USERNAME)) { debug ("Update username for id%d (name %s %s)\n", tgl_get_peer_id (user->id), user->user.first_name, user->user.last_name); char *alias = p2tgl_strdup_alias (user); purple_blist_alias_buddy(b, alias); From 4a4179d262219d36774fdc29d81774543a6bb438 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Thu, 1 Jan 2015 18:02:14 +0100 Subject: [PATCH 15/17] Fix group-message sending in Adium --- telegram-purple.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/telegram-purple.c b/telegram-purple.c index 3e33687..f5ad7b3 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -805,8 +805,14 @@ static int tgprpl_send_chat (PurpleConnection * gc, int id, const char *message, tgl_do_send_message (conn->TLS, TGL_MK_CHAT(id), raw, (int)strlen (raw), 0, 0); g_free (raw); + /* Pidgin won't display the written message if we don't call this, Adium will display it twice + if we call it, so we don't do it for the adium Plugin. + TODO: there has to be a better way to do this, figure out how. + */ +#ifndef __ADIUM_ p2tgl_got_chat_in(conn->TLS, TGL_MK_CHAT(id), TGL_MK_USER(conn->TLS->our_id), message, - PURPLE_MESSAGE_RECV, time(NULL)); + PURPLE_MESSAGE_RECV, time(NULL)); +#endif return 1; } From 106f828b9e416a9b8a08d31d6bf5bb43be7c9fbc Mon Sep 17 00:00:00 2001 From: mjentsch Date: Fri, 2 Jan 2015 12:54:41 +0100 Subject: [PATCH 16/17] Mark chat messages as read --- telegram-base.c | 5 +++++ telegram-purple.c | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/telegram-base.c b/telegram-base.c index 21da401..666a5e7 100644 --- a/telegram-base.c +++ b/telegram-base.c @@ -426,6 +426,11 @@ int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text) if (chat_show (conn->gc, tgl_get_peer_id (M->to_id))) { p2tgl_got_chat_in(TLS, M->to_id, M->from_id, text ? text : M->message, M->service ? PURPLE_MESSAGE_SYSTEM : PURPLE_MESSAGE_RECV, M->date); + + pending_reads_add (conn->pending_reads, M->to_id); + if (p2tgl_status_is_present(purple_account_get_active_status(conn->pa))) { + pending_reads_send_all (conn->pending_reads, conn->TLS); + } return 1; } else { // add message once the chat was initialised diff --git a/telegram-purple.c b/telegram-purple.c index f5ad7b3..3fadfff 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -337,8 +337,7 @@ static void update_message_received (struct tgl_state *TLS, struct tgl_message * p2tgl_got_im (TLS, M->from_id, text, PURPLE_MESSAGE_RECV, M->date); pending_reads_add (conn->pending_reads, M->from_id); - PurpleStatus *status = purple_account_get_active_status(conn->pa); - if (p2tgl_status_is_present(status)) { + if (p2tgl_status_is_present(purple_account_get_active_status(conn->pa))) { pending_reads_send_all (conn->pending_reads, conn->TLS); } } From 4dba56db584c5f7ff2f888752c6c4a61ea85de9c Mon Sep 17 00:00:00 2001 From: mjentsch Date: Fri, 2 Jan 2015 13:51:48 +0100 Subject: [PATCH 17/17] Remove unused functions for adding/removing multiple buddies Libpurple will automatically iterate the list of buddies and call purple_add_buddy for each entrie if those functions are missing. --- telegram-purple.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/telegram-purple.c b/telegram-purple.c index 3fadfff..1044626 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -717,10 +717,6 @@ static void tgprpl_add_buddy (PurpleConnection * gc, PurpleBuddy * buddy, Purple tgl_do_add_contact (conn->TLS, buddy->name, (int)strlen (buddy->name), first, (int)strlen (first), "", 0, 0, on_contact_added, buddy); } -static void tgprpl_add_buddies (PurpleConnection * gc, GList * buddies, GList * groups) { - debug ("tgprpl_add_buddies()\n"); -} - static void tgprpl_remove_buddy (PurpleConnection * gc, PurpleBuddy * buddy, PurpleGroup * group) { debug ("tgprpl_remove_buddy()\n"); if (!buddy) { return; } @@ -732,10 +728,6 @@ static void tgprpl_remove_buddy (PurpleConnection * gc, PurpleBuddy * buddy, Pur tgl_do_del_contact (conn->TLS, user->id, NULL, NULL); } -static void tgprpl_remove_buddies (PurpleConnection * gc, GList * buddies, GList * groups){ - debug ("tgprpl_remove_buddies()\n"); -} - static void tgprpl_add_deny (PurpleConnection * gc, const char *name){ debug ("tgprpl_add_deny()\n"); } @@ -882,9 +874,9 @@ static PurplePluginProtocolInfo prpl_info = { NULL, // set_idle NULL, // change_passwd tgprpl_add_buddy, - tgprpl_add_buddies, + NULL, // add_buddies tgprpl_remove_buddy, - tgprpl_remove_buddies, + NULL, // remove_buddies NULL, // add_permit tgprpl_add_deny, NULL, // rem_permit