Google Summer of Code is over, so there is a need for a little summary. Pidgin was accepted with four projects, three of them (this one too) succeeded. Gadu-Gadu related project changed a bit since it was accepted, but I’m still satisfied with progress done – you can judge it for yourself by reading this post. Some promised features weren’t completed yet, mainly because of need to make changes in libgadu. They will be done, but it must take time: discussion, libgadu implementation, libgadu release, updating libgadu in Pidgin, Pidgin protocol plugin implementation and finally pidgin release.
This project wasn’t only stripped down. There were improvements, which were not planned, but they came up to be really useful to bring better experience for Gadu-Gadu users. This is the point, where we got perks from 3.0.0 break – I was allowed to change anything I liked to in libpurple API. This is also a point, where other protocols gets benefits.
Proposal promises – reckoning
At first, I will compare actual state of work done with accepted project.
File transfer: I have succeeded with reverse engineering of newest GG11 protocol, even with successfully implemented example client, that sends a file. Unfortunately, one thing prevented me from implementing it in Pidgin: authorization method. To do a file transfer, I have to provide a hash, that is accessible only when user connects using newest session protocol. Libgadu doesn’t handle it yet. However, I plan to reverse engineer and implement it in the meantime, but it may take some time. On the other hand, there were a possibility to implement old file transfer protocol, but Gadu-Gadu service provider is dropping support for it, so it could be a waste of time.
Contact list synchronization: succeeded. It requires libgadu to be compiled with zlib.
Windows SSL support: Pidgin 2.x on windows doesn’t support GnuTLS, which is required by libgadu for encryption support. I had planned before, to implement encryption through Mozilla NSS for libgadu, but it turned out, that Pidgin 3.x will switch to GnuTLS. It seems, that SSL will be supported on Windows without any effort from my side.
Code refactoring: GG protocol plugin implementation was full of old, buggy and difficult to maintain code. Rewriting it from scratch was the easiest way to higher its quality. I have managed to rewrite half of its code by producing twice more than whole previous implementation was. On the occasion of code refactoring, a lot of bugs were fixed.
Voice chat support: failed. According to libgadu documentation, it was possible to talk with GG clients over SIP protocol. I wasn’t able to communicate this way now – it seems, that protocol has changed: new GG11 uses flash player based voice chat client.
SOCKS proxy support: work in progress. This one requires deep changes in libgadu, discussion isn’t finished yet.
Multiple gadu-gadu servers support: succeeded. Connection servers history is hold, so user is able to select one without searching for them on external websites.
Multi-login support: mostly done, without possibility to disconnect other sessions yet.
Better inline images support: succeeded.
Account management directly from Pidgin: succeeded, without option to restore lost password, because I haven’t had any idea to where it should be attached to.
Full avatars support: succeeded.
Setting public profile information: succeeded, unfortunately with not-so-recent GG10.5 protocol (for the same reason, like for file transfer).
Using public directory nickname for new contact’s alias: succeeded.
Full text formatting support: failed. This part of code have to be refactored. I haven’t reached here yet.
Closed tickets: #6263, #9463, #13739, #14305, #14649, #14776, #14951, #2188, #6918, #11693, #14012, #15132, #a11300, #a6595. Six more left: #343 (mostly done), #372 (waiting for libgadu), #5576 (also waiting for libgadu), #8945 (this code have to be refactored), #13584 (there is also need for code refactoring), #14366 (almost done).
Additional work done
Besides working on objectives set in project proposal, I have done some work more, mostly for libpurple API.
The most important thing done, was reverse engineering of GG11 protocol. This wasn’t complete, but it’s a good start for further work. Moving to new protocol have to be done, to fully support features like file transfer or public directory. Additional gain from this task was creating Gadu-Gadu protocol dissector for Wireshark.
Pidgin’s account setup dialog was significantly improved for protocols with automatically assigned user identifiers.
Username validation feature will affect user experience with eliminating mistakes when adding buddies or setting up new account.
Similiar feature introduced was validation for dialogs created with Request API. Before, it was only possible to validate entered data after closing a dialog, now we can do this just after filling in certain field.
Introducing GG connection servers history wouldn’t be possible without an option to attach hint list for text fields in account setup dialog. Of course, other protocols (like IRC) will get benefits from it.
There are also some discussions in progress, described in my previous post.
Code implemented during GSoC is available through hg repositories, or directly, in packages prepared below:
- set of all committed patches;
- all changes gathered into one big patch (only these directly made in GG prpl);
- whole GG prpl source code (files rewritten entirely by me, has note Rewritten from scratch during Google Summer of Code 2012);
- dissector plugin source code (not included in any above).
As you could notice, the biggest issue, which disallowed me to do well many features, was lack of GG11 protocol support. Reverse-engineering and implementing it in libgadu is the main goal for me after GSoC.
When I do above point, I will finally introduce file transfer support. It’s one of the most desired features, requested by users from the beginning of GG protocol plugin.
Next task to do will be refactoring of remaining code and completing documentation.