<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7595920238142263865</id><updated>2012-01-30T15:40:01.764-08:00</updated><category term='Team'/><category term='Screenshot'/><category term='Usability'/><category term='Git'/><category term='sound'/><category term='Summer Of Code'/><category term='Release'/><category term='0.6.6'/><category term='XMPP'/><category term='History'/><category term='Storage'/><category term='Security'/><category term='DBUS'/><category term='API'/><category term='Kadu'/><category term='mockups'/><category term='Jabber'/><category term='DCC'/><category term='Tlen'/><category term='Gadu-Gadu'/><title type='text'>Kadu Blog</title><subtitle type='html'>Qt-based IM for Jabber/XMPP and Gadu Gadu protocols. Work on Window, Mac OS X and Linux.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.kadu.im/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Piotr Galiszewski</name><uri>http://www.blogger.com/profile/05016507025151454406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-584707635326415853</id><published>2012-01-06T02:33:00.000-08:00</published><updated>2012-01-06T02:33:33.620-08:00</updated><title type='text'>0.11.0 - part four - visual improvements</title><content type='html'>During 0.11.0 cycle we have spent some time improving UI of Kadu. Here I'll present a short list of most visible changes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Toolbar buttons with menus&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In 0.10.0 menus for toolbar buttons were implemented in Kadu and it was not very pretty - there was no distinction between normal buttons and menu button.In 0.11.0 we use Qt functionality and there is a small arrow to indicate that menu is available.&lt;br /&gt;&lt;br /&gt;Button with menu can have default action (that is executed when button is clicked) or not. First ones have a small arrow next to button, second ones have an arrow directly on button.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5wklQ5krZwQ/TwbI1fT0i2I/AAAAAAAAAwg/13B5vD2HSVs/s1600/menu-button-2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-5wklQ5krZwQ/TwbI1fT0i2I/AAAAAAAAAwg/13B5vD2HSVs/s1600/menu-button-2.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Menu button without default action&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZtDZKk8aGNE/TwbI1EIDPoI/AAAAAAAAAwc/j1K2IJqMAQA/s1600/menu-button-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ZtDZKk8aGNE/TwbI1EIDPoI/AAAAAAAAAwc/j1K2IJqMAQA/s1600/menu-button-1.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Menu button with default action&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;More tabs&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tabs now will shrink when you have a lot of open chats. This allows to show more of them without need to scroll.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7j_85Siic78/TwbJiyFs93I/AAAAAAAAAws/BIILdZJjKNA/s1600/lots-of-tabs.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="48" src="http://3.bp.blogspot.com/-7j_85Siic78/TwbJiyFs93I/AAAAAAAAAws/BIILdZJjKNA/s320/lots-of-tabs.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Really lot tabs shown at once&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Unfortunately, tabs icons will no longer blink. There is Qt bug that caused all tabs to scroll to left when icon was changed - reaching tabs that were far on the right was impossible.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Message notifications&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You will no more miss a message - every unread one is now indicated on dock icon, roster, window icon and tab icon. In 0.10.0 only messages for non-open chats were shown. Also placement of icon on roster was improved - it is now shown instead of status icon, non next to it.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3egLtDgCaRo/TwbK7fl6y5I/AAAAAAAAAw0/QO5zO3wQjN8/s1600/message-icon.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="132" src="http://1.bp.blogspot.com/-3egLtDgCaRo/TwbK7fl6y5I/AAAAAAAAAw0/QO5zO3wQjN8/s320/message-icon.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;New message icons on roster&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;Add conference window&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Creating a conference required a lot of work - one had to Ctrl+select all needed buddies and then right-click and select "Chat..." command. New window will make this easier - you can easily select buddies, name a conference (or not, if it is one-time only) and start it. Lets have a look:&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-91tZGGPQCC8/TwbMzWwuwaI/AAAAAAAAAw8/XOYVxIk8NB8/s1600/add-conference.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="286" src="http://3.bp.blogspot.com/-91tZGGPQCC8/TwbMzWwuwaI/AAAAAAAAAw8/XOYVxIk8NB8/s320/add-conference.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Add conference window&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;In this window you will no longer lose any selection by accidental click. Filtering by name, group, id&amp;nbsp; makes it very easy to find required buddies. Visible name can be set for a conference - then it will be displayed on top of roster widget.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-584707635326415853?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/584707635326415853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2012/01/0110-part-four-visual-improvements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/584707635326415853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/584707635326415853'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2012/01/0110-part-four-visual-improvements.html' title='0.11.0 - part four - visual improvements'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-5wklQ5krZwQ/TwbI1fT0i2I/AAAAAAAAAwg/13B5vD2HSVs/s72-c/menu-button-2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3749534054647788488</id><published>2011-12-29T07:04:00.000-08:00</published><updated>2012-01-01T06:04:15.667-08:00</updated><title type='text'>Summary of 2011</title><content type='html'>End of the year is the best time for making summaries of any type, so here is one about Kadu:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Releases&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;This was really great year for Kadu - 0.9.0, the biggest rewrite/release ever, was finished in March (just look how many bugs and regressions we had to fix on &lt;a href="http://www.kadu.im/redmine/issues/905"&gt;redmine&lt;/a&gt;). After that we had a quick 0.9.1 and 0.9.2 bugfix releases, not-so-big 0.10.0 feature release and another one with bugfixes - 0.10.1. This means 5 total releases in one year, after more than 2 years of waiting for 0.9.0. We want to keep this pace and create at least 3 big releases in 2012.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ports&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Kadu on Windows had became official port, so we cannot ignore Windows' bugs anymore. MacOS X support is not bad, someone created port on Haiku, but nobody cares anymore about N900. Linux is still our primary taget.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Changes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In this year 2764 (2161 since 0.9.0) changes were pushed to Kadu source control system by 16 developers. This is pretty amazing for a small IM application.&lt;br /&gt;&lt;br /&gt;A lot of these changes are about improving our codebase, so we can add features and fix bugs faster. Rest is about features - like GG10 roster support, new chat notifier, better proxy support, network awareness and so on...&lt;br /&gt;&lt;br /&gt;A lot of new translations were added in this year, unfortunately only four are complete enough to be included in official release - Polski, English, Deutsch and Cesky. Uncomplete translations are available for French, Spanish, Italian and Slovak.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;New server&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We have&lt;b&gt; &lt;/b&gt;also moved from our old server (from Chilan and Silvercoders) to new one (from Uni-Lux) and we gained a new domain: kadu.im (it is much shorter and easier to type than old kadu.net).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Future&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Future&lt;b&gt; &lt;/b&gt;is very bright for us, 1.0 is so close that you can almost touch it, bugs are fixed quicker than new ones are created and no regressions are allowed! 2012 will be the year of Linux on desktops and Kadu everywhere!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Happy New Year everyone!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3749534054647788488?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3749534054647788488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/12/summary-of-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3749534054647788488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3749534054647788488'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/12/summary-of-2011.html' title='Summary of 2011'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-4475731367901122970</id><published>2011-12-23T09:24:00.000-08:00</published><updated>2011-12-23T15:06:00.535-08:00</updated><title type='text'>0.11.0 - part three - conferences</title><content type='html'>&lt;b&gt;Conferences on roster&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Conference is a way in Gadu-Gadu to talk with many people at once. It is very different from XMPP MUC or IRC chatrooms, as you cannot add new people or remove them. Until 0.11.0 ithe only way to start &amp;nbsp;start a conference was to select all buddies (using Ctrl+mouse click), then right-click of one of buddies and select "Chat" action. It is not convientant all at, escpecially if you chat with the same people all the time.&lt;br /&gt;&lt;br /&gt;So we've added possibility to add conference to roster widget. To do that just select all buddies, right click, select "View Chat Properties" menu item and fill in "Visible Name" for given chat. This conference will be then available at top of roster widget. You can also add conference to groups and search for them in roster widget by typing its name.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implementation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It was implemented by creating &lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;MergedProxyModel&lt;/span&gt; for Qt that allows to merge two or more models into one. Model for roster widget merges model of all used chats and conferences (unnamed are filtered out) with model of all available buddies. Then other model (named &lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;TalkableProxyModel&lt;/span&gt;) sorts all items and pass them to widget.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Screenshots&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Some screenshots of this new amazing feature:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-3hOBsqJZvTk/TvS5oKn1s_I/AAAAAAAAAwE/WbrSgGA9NxE/s1600/chat-on-roster-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="224" src="http://3.bp.blogspot.com/-3hOBsqJZvTk/TvS5oKn1s_I/AAAAAAAAAwE/WbrSgGA9NxE/s320/chat-on-roster-1.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Conference on roster widget&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Ycs_aKFl0yk/TvS5oqbqKXI/AAAAAAAAAwI/UnS9rlllCu0/s1600/chat-on-roster-2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="303" src="http://3.bp.blogspot.com/-Ycs_aKFl0yk/TvS5oqbqKXI/AAAAAAAAAwI/UnS9rlllCu0/s320/chat-on-roster-2.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Expanded conference on roster widget - you can see who takes part in it&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Ckn_qvvWGj4/TvS5pJXNv0I/AAAAAAAAAwU/M2M0jLb4D_0/s1600/chat-on-roster-3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-Ckn_qvvWGj4/TvS5pJXNv0I/AAAAAAAAAwU/M2M0jLb4D_0/s320/chat-on-roster-3.png" width="289" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Conference data edit window - you can set name and select groups&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Beta1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Beta 1 was released a few days ago. Give it a try! It is available at &lt;a href="http://code.google.com/p/kadu/downloads/detail?name=kadu-0.11.0-beta1.tar.bz2&amp;amp;can=2&amp;amp;q="&gt;Kadu's Google Code page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-4475731367901122970?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/4475731367901122970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/12/0110-part-three-conferences.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4475731367901122970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4475731367901122970'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/12/0110-part-three-conferences.html' title='0.11.0 - part three - conferences'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-3hOBsqJZvTk/TvS5oKn1s_I/AAAAAAAAAwE/WbrSgGA9NxE/s72-c/chat-on-roster-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-4773102911490169572</id><published>2011-12-13T11:42:00.000-08:00</published><updated>2011-12-13T11:42:12.721-08:00</updated><title type='text'>0.11.0 - part two - history</title><content type='html'>&lt;b&gt;Better, faster, smaller&lt;/b&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In 0.11.0 development cycle Juzef did a great job identifying and resolving performance problems with our history SQL backend. He basically normalized database scheme and voila - history file is now 2 to 3 times smaller than before (with the same information!). That means that loading history into memory is 2 to 3 times faster and processing indexes is also a lot faster. So opening history window is also a lot faster than before!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Asynchronous loading&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Messages from history are loaded into chat windows so you can remebmer last conversation with given person. In 0.11.0 this loading is asynchronous - that means you get your window open instantly and you can send and receive messages right away. Old messages are inserted into chat window when they are ready - which can take a second or two for really big histories. In Kadu 0.10.0 you had to wait for that to happen before you could even chat.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Import&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;History is imported automatically - you don't have to do anything (only wait 30 second at first run of 0.11.0). After import new history is available under &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;~/.kadu/history1.db&lt;/span&gt; file instead of old &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;~/.kadu/history/history.db&lt;/span&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-4773102911490169572?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/4773102911490169572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/12/0110-part-two-history.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4773102911490169572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4773102911490169572'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/12/0110-part-two-history.html' title='0.11.0 - part two - history'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3196875725352718737</id><published>2011-12-09T11:45:00.001-08:00</published><updated>2011-12-09T12:20:55.022-08:00</updated><title type='text'>0.11.0 - part one</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;This is first post from a series describing new features and improvements of incoming Kadu 0.11.0. As we are aiming for shorter release cycles this list will not be as long as 0.9.0 one.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Proxy configuration&lt;/b&gt;&lt;br /&gt;Lets start with the oldest bug in:&amp;nbsp;&lt;a href="http://www.kadu.im/redmine/issues/3"&gt;http://www.kadu.im/redmine/issues/3&lt;/a&gt;&amp;nbsp;Its took whole 8 years to close this one. After last year's rewrite of SMS code to use JavaScript code instead of C++ one this was easy to fix - just use &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;QNetworkAccessManager&lt;/span&gt; to set proxy and you are done.&lt;br /&gt;&lt;br /&gt;But our proxy configuration was lacking - every account had separate proxy setting and there was no way to easily change proxy for all accounts at once (that would be nice to have for people who often changes networks).&lt;br /&gt;&lt;br /&gt;New mechanism was created - there is centralized place for configuring as many proxy setting as one may want. Each account can now choose proxy from the list as well as SMS plugin (or select special Default one). Default proxy can be changed at any time from configuration window or from toolbar button (note: it is not added by default to any toolbar, you need to do it yourself).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mandatory screenshots&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0ufpKSDptn4/TuJsnTov4KI/AAAAAAAAAvY/EpBVMVj569o/s1600/proxy-window.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="181" src="http://3.bp.blogspot.com/-0ufpKSDptn4/TuJsnTov4KI/AAAAAAAAAvY/EpBVMVj569o/s320/proxy-window.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Window for creating proxy configurations&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-javliB3QYcs/TuJsmztso4I/AAAAAAAAAvM/hu1Kj7amEwg/s1600/proxy-selection.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="105" src="http://3.bp.blogspot.com/-javliB3QYcs/TuJsmztso4I/AAAAAAAAAvM/hu1Kj7amEwg/s320/proxy-selection.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Selecting proxy for an account - you can select Default configuration&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-OcKkZzasd64/TuJsmVNHVsI/AAAAAAAAAvI/rnwjzeWcPQc/s1600/proxy-menu.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-OcKkZzasd64/TuJsmVNHVsI/AAAAAAAAAvI/rnwjzeWcPQc/s1600/proxy-menu.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Selecting default proxy for whole application from toolbar button&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3196875725352718737?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3196875725352718737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/12/0110-part-one.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3196875725352718737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3196875725352718737'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/12/0110-part-one.html' title='0.11.0 - part one'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-0ufpKSDptn4/TuJsnTov4KI/AAAAAAAAAvY/EpBVMVj569o/s72-c/proxy-window.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3507605533828204928</id><published>2011-09-24T12:26:00.000-07:00</published><updated>2011-09-24T12:26:25.494-07:00</updated><title type='text'>Half a year later...</title><content type='html'>&lt;h2&gt;Lots of news&lt;/h2&gt;Since last blog post a lot of things happened... 0.10.0 was released, we got a new server and moved from mantis to redmine...&lt;h2&gt;0.10.0 release and 0.11.0&lt;/h2&gt;0.10.0 is our first release using new release cycle - that means only 5 month after 0.9.0. That is great, because we don't have so many new features to test - we can focus more on stability. That does not mean that nothing changes - Kadu got new plugin code, new build method, better system integration and one new notify plugin. Kadu Team plans to release 0.11.0 sometime about February 2012. 0.11.0 release will be about faster startup times, faster plugin loading and general performance problems fixing. We may be able to fix some of our ugly APIs (status and details APIs).&lt;h2&gt;New server&lt;/h2&gt;After releasing 0.9.0 we decided that we need a new server. Old one just wasn't enough to handle all the traffic that comes with releases. We had move from our old server sponsored by &lt;a href="http://www.chilan.com"&gt;'Chilan'&lt;/a&gt; and &lt;a href="http://www.silvercoders.com"&gt;Silvercoders&lt;/a&gt; (both are companies run by former developers of Kadu: Tomasz Chiliński and Adrian Smarzewski) - we are very thankful for all of these years when we could use this hardware. Kadu now uses server provided by &lt;a href="http://www.uni-lux.pl/"&gt;Uni-Lux sp. z o.o.&lt;/a&gt; where Tomarz Jarzynka is working (he is the father of Kadu).We also got new, shorter domain: kadu.im instead of kadu.net.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3507605533828204928?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3507605533828204928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/09/half-year-later.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3507605533828204928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3507605533828204928'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/09/half-year-later.html' title='Half a year later...'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3011960947380818368</id><published>2011-05-18T13:41:00.000-07:00</published><updated>2011-05-18T13:41:53.010-07:00</updated><title type='text'>0.10.0 progress, part two</title><content type='html'>Second month since 0.9.0 release has passed. In our new release cycle that means that we are close to feature freeze (we are just waiting for GaduGadu 10 roster support). This is short list of new features since last blog post:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Plugins cleanup&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;Unsupported and old plugins were removed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;server_monitor&lt;/span&gt; (removed in 0.9.2 release)&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;parser_extender&lt;/span&gt; (merged into core) &lt;/li&gt;&lt;li&gt;all blacklisted plugins (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;dbus&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;tlen_protocol&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;echo&lt;/span&gt;) &lt;/li&gt;&lt;li&gt;all sound &lt;span style="font-family: inherit;"&gt;plugins&lt;/span&gt; but &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;phonon_sound&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;qt_sound&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ext_sound&lt;/span&gt;&lt;/li&gt;&lt;li&gt;many mediaplayer plugins were merged into &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mprisplayer_mediaplayer&lt;/span&gt; (dont worry, configuration will be imported automatically)&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;SDK and build changes, autodownload removed&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Kadu has now SDK - &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;FindKadu&lt;/span&gt; CMake modules for external plugins and own set of C++ headers for installation in /include prefix. Plugins can install its own C++ headers as well.&lt;br /&gt;&lt;br /&gt;It means that every plugin can now be build outside of Kadu source tree and without modification of any Kadu source files.&lt;br /&gt;&lt;br /&gt;Old .config file was removed. Installing non-standard icons, emoticons and sound themes is not supported anymore from Kadu build system - you have to do it on your own or just copy somewhere and configure Kadu at runtime to use your themes. Plugins are now configured inside new &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Plugins.cmake&lt;/span&gt; file and thanks to SDK additional plugins can be compiled and installed at any moment.&lt;br /&gt;&lt;br /&gt;Autodownload is completely removed (I think distribution packagers will be very happy for that) as it is not really needed - everything needed for Kadu compilation is available in source packages and addons should be installed separately.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In-chat notification&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;New chat-notify plugins provides status-change notifications in chat window:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SAraMM_0t20/TdQs1iLud4I/AAAAAAAAAVU/-ZD4ExNzIJg/s1600/chat-notify.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="357" src="http://1.bp.blogspot.com/-SAraMM_0t20/TdQs1iLud4I/AAAAAAAAAVU/-ZD4ExNzIJg/s400/chat-notify.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Myself on buddy list&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It is again possible to have Myself buddy on buddy list. Just enable it from Buddies menu and you are done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Message confirmations for GaduGadu protocol&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ultr has implemented GUI for message confirmations for GaduGadu protocol. Each message in standard Satin style has now icon attached to it: (...) for messages on the way, (v) for delivered messages and (x) for undelivered messages. This allows you to see if your network or GaduGadu servers are working properly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3011960947380818368?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3011960947380818368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/05/0100-progress-part-two.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3011960947380818368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3011960947380818368'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/05/0100-progress-part-two.html' title='0.10.0 progress, part two'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-SAraMM_0t20/TdQs1iLud4I/AAAAAAAAAVU/-ZD4ExNzIJg/s72-c/chat-notify.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-4742369172621719610</id><published>2011-04-16T05:13:00.000-07:00</published><updated>2011-04-16T07:25:35.955-07:00</updated><title type='text'>0.10.0 progress</title><content type='html'>It is almost full month since 0.9.0 has been released (and one week since 0.9.1). KaduTeam is now busy working on the upcoming 0.10.0 release, which will bring a lot of new shinny features. Here is brief list of what has been already done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Blinking status icons&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Maybe this is not the biggest feature ever, but is is really nice. When Kadu is logging to IM network all status icons (in dock, on buttons and in toolbars) connected with this network are blinking offline &amp;lt;-&amp;gt; your&lt;b&gt; &lt;/b&gt;logging status. This is nice indication of what is happening&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Better hibernation support&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Kadu now knows about your network state (using NTrack library or Qt's &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;QNetworkConfigurationManager&lt;/span&gt; on systems where NTrack is not available). When network goes offline Kadu automatically disconnects all accounts and connects them after network is back online. Kadu now properly reconnects after wake up!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Better Gnome3 and Ubuntu support&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;WhiteEagle has rewritten our kde4_notify plugin into freedesktop_notify (as it never required anything from KDE4) that works better with notification deamon from Gnome3 and Ubuntu (ie. does not put buttons on every notification as Ubuntu deamon does not support buttons).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Suggestions for spellchecker&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Our new&lt;b&gt; &lt;/b&gt;contributor, Dienet, sent us a set of patches adding suggestions for misspelled words to context menu of chat window. It looks like this:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-VcP0d0MM2ac/TamA0rOH4zI/AAAAAAAAACo/YxoIhgYzEDw/s1600/spellchecker.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-VcP0d0MM2ac/TamA0rOH4zI/AAAAAAAAACo/YxoIhgYzEDw/s1600/spellchecker.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Sugestie wyrazów&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;Better XMPP and Gadu-Gadu support&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We are&lt;b&gt; &lt;/b&gt;working hard with libgadu team to make file transfers in Gadu Gadu possible again. Also work on file transfers and MUC for Jabber/XMPP is on the way (hopefully it will be ready for 0.10.0 release).&lt;br /&gt;Gadu Gadu will also receive contacts list synchronization that is available in Gadu Gadu 10 original client.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;History importers&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Plugin for importing GG from original Gadu Gadu 6/7 clients is already available: &lt;a href="http://www.kadu.net/w/English:Plugins#External_plugins"&gt;check it on wiki&lt;/a&gt;. KaduTeam will cooperate with author of this plugin to add it to default Kadu 0.10.0 package and to extend it to support Gadu Gadu 8 and 10 histories.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Future for Kadu is very bright ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-4742369172621719610?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/4742369172621719610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/04/0100-progress.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4742369172621719610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4742369172621719610'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/04/0100-progress.html' title='0.10.0 progress'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-VcP0d0MM2ac/TamA0rOH4zI/AAAAAAAAACo/YxoIhgYzEDw/s72-c/spellchecker.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7925153567586689429</id><published>2011-03-21T02:06:00.000-07:00</published><updated>2011-03-21T09:05:59.343-07:00</updated><title type='text'>Kadu 0.9.0 has been released</title><content type='html'>0.9.0 version of Kadu Instant Messenger is available!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Source code:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/download/stable/kadu-0.9.0.tar.bz2"&gt;kadu.net&lt;/a&gt; (&lt;a href="http://www.kadu.net/download/stable/kadu-0.9.0.tar.bz2.md5"&gt;MD5&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/kadu/downloads/detail?name=kadu-0.9.0.tar.bz2"&gt;code.google.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/kadu/files/kadu/0.9.0/kadu-0.9.0.exe/download"&gt;sourceforge.net&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Packages:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Packages for many Linux distributions are available (or will be soon available) at: &lt;a href="http://kadu.net/w/English:Download"&gt;Download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installers:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mac OS X:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://kadu.net/%7Edorr/MacOSX/Kadu-0.9.0-Intel-Leopard.dmg"&gt;kadu.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/kadu/downloads/detail?name=Kadu-0.9.0-Intel-Leopard.dmg"&gt;code.google.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/kadu/files/kadu/0.9.0/kadu-0.9.0-Intel-Leopard.dmg/download"&gt;sourceforge.net&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Windows:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://kadu.net/%7Edorr/Windows/Kadu-0.9.0.exe"&gt;kadu.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/kadu/downloads/detail?name=Kadu-0.9.0.exe"&gt;code.google.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/kadu/files/kadu/0.9.0/kadu-0.9.0.exe/download"&gt;sourceforge.net&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;After over two and a half years of hard work, we are really proud to announce availability of the new and revolutionary version of Kadu IM 0.9.0.&lt;br /&gt;&lt;br /&gt;This version brings many long awaited features, such as support for XMPP network (Jabber, GTalk, Facebook Chat, etc.), possibility of using many accounts from different networks in one instance of the program, completely new history module, and Adium chat styles support. New version is supported on Linux, BSD, Windows and Mac OS X platforms.&lt;br /&gt;&lt;br /&gt;Despite significant growth, Kadu does not intend to join the club of overgrown multi-IM's. If you like Kadu for its simplicity and usability, you will find these features in even better shape in the new release. With simple but powerful configuration, Kadu can be either a simple one account client, or a full-featured multi-IM.&lt;br /&gt;&lt;br /&gt;Kadu consistently provides free and easy communication across multiple platforms, without any intrusive advertisements and unnecessary additions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;List of most important changes since the 0.6.5 release:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;multiple communication protocols, support for Jabber/XMPP (including Facebook, GTalk)&lt;/li&gt;&lt;li&gt;support for multiple accounts in one instance of the program&lt;/li&gt;&lt;li&gt;ease of use with made from scratch menus and dialog boxes&lt;/li&gt;&lt;li&gt;ease of talk with many improvements in the chat window - including copying text representation of emoticons, support for Adium styles and much better toolbars&lt;/li&gt;&lt;li&gt;new emoticon selector displaying items in correct proportions&lt;/li&gt;&lt;li&gt;editable groups of buddies&lt;/li&gt;&lt;li&gt;simplified notifications configuration&lt;/li&gt;&lt;li&gt;added Czech translation&lt;/li&gt;&lt;li&gt;Support for TLS connections and multilogon in Gadu-Gadu&lt;/li&gt;&lt;li&gt;history plugin based on the SQLite database, with brand new interface&lt;/li&gt;&lt;li&gt;new, improved Setup Wizard&lt;/li&gt;&lt;li&gt;new experimental ImageLink plugin for displaying images and youtube videos directly in the chat window&lt;/li&gt;&lt;li&gt;SMS plugin now uses JavaScript to send messages, so changes in the SMS gateways will not require full release of the program, only scripts update&lt;/li&gt;&lt;li&gt;refactorized source code with a much more friendly and readable API allows for quick changes and improvements&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Since the release of Kadu 0.9.0 we introduce a new cycle of release:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;once a month a small release with amendments (0.9.1, 0.9.2) repairing the most troublesome bugs found after the major release&lt;/li&gt;&lt;li&gt;every 3-4 months a large release (0.10.0, 0.11.0), adding new features and changing API a little bit&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;No more waiting several years for new Kadu ;)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;More information&lt;/b&gt; &lt;a href="http://www.kadu.net/w/English:Release_notes"&gt;in Release Notes&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7925153567586689429?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7925153567586689429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/03/kadu-090-has-been-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7925153567586689429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7925153567586689429'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/03/kadu-090-has-been-released.html' title='Kadu 0.9.0 has been released'/><author><name>Piotr Galiszewski</name><uri>http://www.blogger.com/profile/05016507025151454406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-4341217527768219495</id><published>2011-02-16T13:04:00.000-08:00</published><updated>2011-02-16T13:08:51.990-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>0.6.6 beta16 is out</title><content type='html'>Another great beta is out ;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Big changes&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;encryption is now enabled on Windows&lt;/li&gt;&lt;li&gt;toolbar editing is possible on Windows&lt;/li&gt;&lt;li&gt;libgadu 1.10 is supported, with TLS and multilogon&lt;/li&gt;&lt;li&gt;items in history can be deleted now&lt;/li&gt;&lt;li&gt;search buddy window is now stable and does not crash&lt;/li&gt;&lt;li&gt;added support for typing notifications in XMPP and GaduGadu (requires libgadu 1.10)&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://gitorious.org/kadu/kadu/blobs/0.6.6-beta16/ChangeLog"&gt;Full changelog is here&lt;/a&gt;. Downloads are available on our Google Code ans SourceForge pages (links in sidebar).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-4341217527768219495?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/4341217527768219495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/02/066-beta16-is-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4341217527768219495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4341217527768219495'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/02/066-beta16-is-out.html' title='0.6.6 beta16 is out'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3540109216855232770</id><published>2011-02-11T11:31:00.000-08:00</published><updated>2011-02-11T12:04:06.222-08:00</updated><title type='text'>Multilogon, TLS and libgadu 1.10</title><content type='html'>Libgadu 1.10 (not-yet-released) brings us a few extra features that were implemented in Gadu-Gadu protocol for GG10. We have decided to include these in Kadu, but only for people with 1.10.0-pre version of libgadu installed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TLS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;TLS in an encryption protocol used in HTTPS connections. GaduGadu 10 can use it to secure connection between client and server. Each message is decrypted at GG server and then encrypted for the second client (if it also supports TLS connection). This is not ideal solution, but at least it allows for &lt;span style="font-weight: bold;"&gt;real&lt;/span&gt; secure login.&lt;br /&gt;&lt;br /&gt;Second level of protection is Kadu's &lt;span style="font-weight: bold;"&gt;encryption&lt;/span&gt; plugin that allows for sending and receiving encrypted messages - this is client-to-client encryption - messages can be decrypted only by receiver (this is supported only by Kadu and EKG messengers).&lt;br /&gt;&lt;br /&gt;I hope these two levels of protection are enough for everyone ;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Multilogon&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;GaduGadu 10 also supports multilogon. Multiple clients can be logged on one account (before GG10 each login would disconnect other clients). Received messages are sent to each of the client and sent messages are broadcasted between them. Latest git versions of Kadu support this new broadcast message.&lt;br /&gt;&lt;br /&gt;Kadu can also notify you about every other connection, both by our notification system and by new special multilogon window. Each session can be disconnected by Kadu both in window and in notifications.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9fee86tSEAE/TVWVWisednI/AAAAAAAAACY/OAfN6G_1OwE/s1600/multilogon-window.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 233px;" src="http://4.bp.blogspot.com/-9fee86tSEAE/TVWVWisednI/AAAAAAAAACY/OAfN6G_1OwE/s400/multilogon-window.png" alt="" id="BLOGGER_PHOTO_ID_5572524328443868786" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;multilogon window shows 2 additional conenctions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-BqnKRG6vjrQ/TVWVj73RIEI/AAAAAAAAACg/QwUaOoKUjlg/s1600/multilogon-notificaiton.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 209px;" src="http://4.bp.blogspot.com/-BqnKRG6vjrQ/TVWVj73RIEI/AAAAAAAAACg/QwUaOoKUjlg/s400/multilogon-notificaiton.png" alt="" id="BLOGGER_PHOTO_ID_5572524558538317890" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;multilogon notification shows new connection&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3540109216855232770?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3540109216855232770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/02/multilogon-tls-and-libgadu-110.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3540109216855232770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3540109216855232770'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/02/multilogon-tls-and-libgadu-110.html' title='Multilogon, TLS and libgadu 1.10'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-9fee86tSEAE/TVWVWisednI/AAAAAAAAACY/OAfN6G_1OwE/s72-c/multilogon-window.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-1844757241047836757</id><published>2011-01-24T14:37:00.001-08:00</published><updated>2011-02-11T11:35:15.279-08:00</updated><title type='text'>Toolbars</title><content type='html'>&lt;b&gt;More actions&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Kadu has a lot of available actions, added by core, our modules and external modules. Some of these are only available as toolbuttons that can be added to chat window or other windows. So each module added its actions to toolbars by default and the toolbar became cluttered... (mediaplayer module added 5 actions itself!).&lt;br /&gt;&lt;br /&gt;To fix that I've disabled the possibility to easily add toolbuttons by API, so no module can do this now ;) I've also added new action, called "More..." that can be added to toolbar. This action just shows a menu with all chat and users actions that are not in toolbar. It is not very pretty, menu is not sorted/categorized in any way, but it works for now. In future versions this will looks better, I promise.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Smjxg7rcxQs/TT4A1cMWUKI/AAAAAAAAACM/Nl0PD7hLUjY/s1600/more-actions.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Smjxg7rcxQs/TT4A1cMWUKI/AAAAAAAAACM/Nl0PD7hLUjY/s320/more-actions.png" alt="" id="BLOGGER_PHOTO_ID_5565887107577565346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Toolbars synchronization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This was a pain for anyone that wanted to change toolbar layout in chat window. Changes were reverted all the time. The proper solution was to open only one chat window, setup toolbars and close this window. Now toolbar layout is synchronized between all opened chat window and it is stored after every change - so it now works as it should ;)&lt;br /&gt;&lt;br /&gt;These changes will be available in beta15, as soon as kadu.net server will be up again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-1844757241047836757?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/1844757241047836757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2011/01/toolbars.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1844757241047836757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1844757241047836757'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2011/01/toolbars.html' title='Toolbars'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Smjxg7rcxQs/TT4A1cMWUKI/AAAAAAAAACM/Nl0PD7hLUjY/s72-c/more-actions.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-8302532349693057130</id><published>2010-11-21T04:08:00.000-08:00</published><updated>2010-11-21T04:14:28.313-08:00</updated><title type='text'>Invalid password</title><content type='html'>Kadu never had good support for &lt;span style="font-weight: bold;"&gt;Invalid Password&lt;/span&gt; message. If you were lucky you would get a notification about that and then you had to find a place to enter your valid password. This has changed recently. When Kadu receives "invalid password" error from server a new notification is displayed (it is nice and transparent):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Smjxg7rcxQs/TOkMbq_r1qI/AAAAAAAAABw/XbFk2yhAU-w/s1600/invalid-password-1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer" src="http://1.bp.blogspot.com/_Smjxg7rcxQs/TOkMbq_r1qI/AAAAAAAAABw/XbFk2yhAU-w/s320/invalid-password-1.png" alt="" id="BLOGGER_PHOTO_ID_5541974485993510562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If you dont remember your password, you can click "Ignore" and Kadu will stop trying to connect. If you know your real password, you can click "Enter new password" button and get this pretty window:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Smjxg7rcxQs/TOkMt9QpZGI/AAAAAAAAAB4/gdmp40baYTM/s1600/invalid-password-2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Smjxg7rcxQs/TOkMt9QpZGI/AAAAAAAAAB4/gdmp40baYTM/s320/invalid-password-2.png" alt="" id="BLOGGER_PHOTO_ID_5541974800134136930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;(yes, it is still half-translated).&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;After clicking "Ok" Kadu will try to connect again. So easy and so nice ;)&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-8302532349693057130?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/8302532349693057130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2010/11/invalid-password.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8302532349693057130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8302532349693057130'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2010/11/invalid-password.html' title='Invalid password'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Smjxg7rcxQs/TOkMbq_r1qI/AAAAAAAAABw/XbFk2yhAU-w/s72-c/invalid-password-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-1065203097408364913</id><published>2010-11-10T11:58:00.001-08:00</published><updated>2010-11-11T13:43:49.204-08:00</updated><title type='text'>Beyond 0.6.6</title><content type='html'>As 0.6.6 release of Kadu is getting closer and closer Kadu Team is already thinking about future versions. We do not have as huge plans as after 0.6.5, but still :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Releases&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We want to make releases faster (there is almost a year now from 0.6.6-alpha0 release)!&lt;br /&gt;Ideally we will have new full release every 3 to 4 months (that means 3 to 4 full releases every year, 6 to 8 times more than now)! This will of course make these releases smaller and MUCH easier to maintain. And with less features every release we will have less bugs, so everyone wins :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Usability and look &amp;amp; feel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Our usability and look &amp;amp; feel improved a lot (transparency!) last two years thanks to our usability team, but there is still very much to do. We have modules window that is ugly. Syntax editors in configuration dialog are not very pretty... We need better widgets for color themes and shortcut editors. A fresh new "Open chat with..." window would be nice too.&lt;br /&gt;&lt;br /&gt;I hope at some time we will get &lt;a href="http://en.wikipedia.org/wiki/QML"&gt;QML&lt;/a&gt;-based buddies list widget. With animations, transitions and all the fancy stuff everybody loves ;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Modules/plugins support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have pretty good modules system. But... Our plugin manager window is not usable at all. We need new one. We need a method for auto-loading of needed modules (based on user's configuration) so users could check "i want this feature" instead of going to modules window and search for module name in plain list. We need per-plugin configuration windows so users do not need to search for options. Moving from Kadu-specific .desc files to standard .desktop would be nice too.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Better protocols support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We do not have full GG10 protocol support. That is sad, as Kadu was created as Gadu-Gadu only application.&lt;br /&gt;&lt;br /&gt;0.6.6 is first release with XMPP support, so I'm sure we don't have all features implemented ;)&lt;br /&gt;Kadu does not supports transports or XMPP services now :(&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Better code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No much to say here. Code always can be better. I'm trying to improve our code in every place so it is/will be very easy to maintain and modify.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1.0 release?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I hope we will have it before end of the world in 2012 ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-1065203097408364913?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/1065203097408364913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2010/11/beyond-066.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1065203097408364913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1065203097408364913'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2010/11/beyond-066.html' title='Beyond 0.6.6'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-8712726398374717266</id><published>2010-06-12T13:48:00.000-07:00</published><updated>2010-06-12T13:59:32.594-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>New delete buddy window</title><content type='html'>I know there was no blog posts for some time... I was busy moving to new place and I've got my Starcraft II Beta Key so you know ;) No time for anything else ;)&lt;br /&gt;&lt;br /&gt;But SC II Beta is now over and I've got back to work on Kadu. Today I've finished a small feature that allows us to use one window for deleting contacts. It seems silly, but we had two in Kadu 0.6.5: one for deleting contact and one for removing its history. Now every module can add an checkbox to this window, and this is how it looks now:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Smjxg7rcxQs/TBP0D7Z_KgI/AAAAAAAAABY/ySmbRKlTXf8/s1600/delete-buddy.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 194px;" src="http://4.bp.blogspot.com/_Smjxg7rcxQs/TBP0D7Z_KgI/AAAAAAAAABY/ySmbRKlTXf8/s320/delete-buddy.png" alt="" id="BLOGGER_PHOTO_ID_5481993519763499522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We need different icons for these two buttons, I know ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-8712726398374717266?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/8712726398374717266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2010/06/new-delete-buddy-window.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8712726398374717266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8712726398374717266'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2010/06/new-delete-buddy-window.html' title='New delete buddy window'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Smjxg7rcxQs/TBP0D7Z_KgI/AAAAAAAAABY/ySmbRKlTXf8/s72-c/delete-buddy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-1296541613621269215</id><published>2010-02-26T02:30:00.000-08:00</published><updated>2010-03-06T08:53:36.341-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Screenshot'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Story of Screenshot module</title><content type='html'>I haven't wrote anything about Kadu code recently, because there was nothing exciting there during last months. Bugfixing and polishing everything (yes, we created best IM ever, but it still has bugs!). This is so boring I've decided I need to learn something new, like Qt's &lt;a href="http://doc.trolltech.com/4.6/qgraphicsview.html"&gt;QGraphicsView&lt;/a&gt;. Kadu's screenshot module was ideal target for moving to this framework (next one - for 0.8 or 0.9 - will be our buddy list).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Old code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To port module required reading old (legacy) code. That was not hard - it was only one big file: &lt;a href="http://gitorious.org/kadu/kadu/blobs/0.6.5.x/modules/screenshot/screenshot.cpp"&gt;screenshot.cpp&lt;/a&gt;. As you know I don't like big files and big classes. Fortunately, the code was split into 3 classes: &lt;span style="font-family:courier new;"&gt;ShotSizeHint&lt;/span&gt; (small widget that displays image size in pixels and kB), &lt;span style="font-family:courier new;"&gt;ScreenShotConfigurationUiHandler&lt;/span&gt; (class that handles configuration widgets in configuration window) and &lt;span style="font-family:courier new;"&gt;Screenshot&lt;/span&gt; (class that was doing eveything else).&lt;br /&gt;&lt;br /&gt;One thing scared me: for doing one real screenshot this module could take 4 or more (instead of storing first one in &lt;span style="font-family:courier new;"&gt;QPixmap&lt;/span&gt; object).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. New classes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Big splitting began (remember: one class, one purpose!). Each extracted class deserves its own file. Global variable were moved to classes as static fields, so initialization of module looks like this: &lt;a href="http://gitorious.org/kadu/kadu/blobs/master/modules/screenshot/screenshot-module.cpp"&gt;screenshot_module.cpp&lt;/a&gt;. This is excellent example of small and clean file that is easily understandable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PixmapGrabber&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some part of old big &lt;span style="font-family:courier new;"&gt;Screenshot&lt;/span&gt; class was commented as code taken from KSnapshot from KDE. And it didn't use a single field from this class. Moving these methods to their own class and making them static was an easy step. This is how it looks now: &lt;a href="http://gitorious.org/kadu/kadu/blobs/master/modules/screenshot/pixmap-grabber.h"&gt;pixmap-grabber.h&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ScreenShotConfiguration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This class is a small experiment. It is the only class in screenshot module that has access to &lt;span style="font-family:courier new;"&gt;config_file&lt;/span&gt; global variable. Other classes does not have to how configuration variables are stored and how to access them. This removed some duplication (like reading the same value in many places of code).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ScreenShotSaver&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This class has only one purpose - save a &lt;span style="font-family:courier new;"&gt;QPixmap&lt;/span&gt; like a screenshot and return path to the file. It chooses path, format, creates needed directories and so on.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ScreenshotActions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This class creates and manages toolbar buttons that you can add to each chat window. It also reacts on menu click by creating new &lt;span style="font-family:courier new;"&gt;Screenshot&lt;/span&gt; objects and delegating all the hard work to them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Screenshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This class is as simple as others. It creates &lt;span style="font-family:courier new;"&gt;ScreenshotTaker&lt;/span&gt; widget, waits for screenshot or 'cancel' signal. It can also create widget for cropping image and display it until image is cropped by user. Then it paste result into chat edit window (if not cancelled and contact's max image size is bigger than screenshot size).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ScreenshotTaker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is possibly the most complicated class. It behaves differently depending on screenshot mode. In full-screen modes it is not even shown, it just takes screenshot by using &lt;span style="font-family:courier new;"&gt;PixmapGrabber&lt;/span&gt; static methods and return them to &lt;span style="font-family:courier new;"&gt;Screenshot&lt;/span&gt; class. In window mode it shows itself and allows to drag an icon to any window, then it takes screenshot of that window. I'm not sure if I did it right, maybe some code should be moved to &lt;span style="font-family:courier new;"&gt;ScreenshotWidget&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CropImageWidget&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The only purpose of this widget is to allow user to select an rectangle of image and crop it. It also displays subwidget with image size (in pixels and kB) and 'Crop' button.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ScreenshotWidget&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This widgets wraps around &lt;span style="font-family:courier new;"&gt;CropImageWidget&lt;/span&gt; and adds full-screen behaviors to it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ScreenshotToolBox&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This widgets displays size of image and Crop button.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. QGraphicsView&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using QGraphicsView allowed me to easily create editable crop rectangle with eight crop handlers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SelectionFrameItem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is &lt;span style="font-family:courier new;"&gt;QGraphicsItem&lt;/span&gt; subclass that draws four transparent black rectangles (shadow arount crop rectangle).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;HandlerRectItem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is &lt;span style="font-family:courier new;"&gt;QGraphicsWidget&lt;/span&gt; subclass (it can receive mouse events) that draws small white rectangle with black outline. It can be dragged by mouse - that causes crop rect to change. All these items are controlled by &lt;span style="font-family:courier new;"&gt;CropImageWidget&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As  you can see, I was able to split screenshot module to some small classes that can be described by one or two sentences by general. This is something that makes design good - anybody can look into any of these classes and understand them easily and change them. I would be very happy if all kadu modules would be so easy to understand.&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_tPadQt2g80&amp;hl=pl_PL&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/_tPadQt2g80&amp;hl=pl_PL&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-1296541613621269215?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/1296541613621269215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2010/02/story-of-screenshot-module.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1296541613621269215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1296541613621269215'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2010/02/story-of-screenshot-module.html' title='Story of Screenshot module'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7865543469929728434</id><published>2010-02-08T14:48:00.000-08:00</published><updated>2010-03-30T07:43:43.136-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mockups'/><category scheme='http://www.blogger.com/atom/ns#' term='0.6.6'/><category scheme='http://www.blogger.com/atom/ns#' term='History'/><title type='text'>Mockups of Chats History Window</title><content type='html'>Hello again,&lt;br /&gt;&lt;br /&gt;Today we present to you two alternative mockups of "Chats History Window". For a long time our users were requesting improvements to History Window (in Polish):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://kadu.net/mantis/view.php?id=376"&gt;mantis 376&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kadu.net/mantis/view.php?id=354"&gt;mantis 354&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kadu.net/mantis/view.php?id=341"&gt;mantis 341&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kadu.net/mantis/view.php?id=161"&gt;mantis 161&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/forum/viewtopic.php?f=3&amp;amp;t=10177"&gt;forum post 10177&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/forum/viewtopic.php?f=3&amp;amp;t=8975&amp;amp;hilit=Historia"&gt;forum post 8975&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/forum/viewtopic.php?f=3&amp;amp;t=6746&amp;amp;hilit=Historia"&gt;forum post 6746&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/forum/viewtopic.php?f=3&amp;amp;t=6712&amp;amp;hilit=Historia"&gt;forum post 6712&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Both mockups try to implement those ideas. It is up to you to decide which approach is better. Feel free to comment on those mockups here (in English) or in &lt;a href="http://www.kadu.net/forum/viewtopic.php?f=3&amp;amp;t=10344&amp;amp;start=0"&gt;this forum post&lt;/a&gt; (in Polish).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Mockup 1&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; - 3 panel mockup&lt;/span&gt;: &lt;a href="http://i40.tinypic.com/j9olkx.jpg"&gt;link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/history%20window%20-%203panel.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Mockup 2&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; - 2 panel mockup&lt;/span&gt;: &lt;a href="http://i39.tinypic.com/2upxu8k.jpg"&gt;link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/history%20window%20-%202panel.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;We would love to hear your feedback,&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kadu.net/w/Usability"&gt;Kadu Usability Team&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;edit:&lt;br /&gt;based on your feedback on our forum we have choosen 3 panel version. It is going to look something like this: &lt;a href="http://akai.opsat.net/history2.png"&gt;link&lt;br /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://akai.opsat.net/history2.png"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 941px; height: 600px;" src="http://akai.opsat.net/history2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7865543469929728434?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7865543469929728434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2010/02/mockups-of-chats-history-window.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7865543469929728434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7865543469929728434'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2010/02/mockups-of-chats-history-window.html' title='Mockups of Chats History Window'/><author><name>Piotr Pełzowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3309785602105435894</id><published>2010-01-19T11:57:00.000-08:00</published><updated>2010-01-19T12:24:48.758-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DBUS'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Releases and stuff</title><content type='html'>A lot has happened since last blog entry. More than 380 commits were submitted and about 10 merge requests were merged (most of them from &lt;a href="http://gitorious.org/%7Ebeevvy/kadu/beevvy-kadu-sandbox"&gt;beevvy&lt;/a&gt;) ;) - see our number of clones on &lt;a href="http://gitorious.org/kadu/kadu"&gt;gitorious&lt;/a&gt; - 9 for now. And 0.6.5.4 will be released very soon.&lt;br /&gt;&lt;br /&gt;Regular alpha releases give us more control over what was done and what needs to be done in close future. We are using short &lt;a href="http://kadu.net/forum/viewtopic.php?f=7&amp;amp;t=10220"&gt;TODO lists&lt;/a&gt; (polish), so testers know what they should expect in next alpha. Thanks to them a lot of critical (crash) issues were resolved: 0.6.6 is now very usable and I've now got a single crash for whole week (but we really need &lt;span style="font-weight: bold;"&gt;more testers&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;We are getting not only fixes, but also new code (this is just alpha, so no core API changes only) like new emoticons selector (beevvy's work):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Smjxg7rcxQs/S1YR-xSv0LI/AAAAAAAAAA0/cTGv3XHw92k/s1600-h/emoticons.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 271px;" src="http://3.bp.blogspot.com/_Smjxg7rcxQs/S1YR-xSv0LI/AAAAAAAAAA0/cTGv3XHw92k/s320/emoticons.png" alt="" id="BLOGGER_PHOTO_ID_5428546170923241650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;and improved expandable contacts list (my and White Eagle work :P):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Smjxg7rcxQs/S1YSYMD4LHI/AAAAAAAAAA8/TD1cIJMx40k/s1600-h/buddy-list1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 245px; height: 223px;" src="http://1.bp.blogspot.com/_Smjxg7rcxQs/S1YSYMD4LHI/AAAAAAAAAA8/TD1cIJMx40k/s320/buddy-list1.png" alt="" id="BLOGGER_PHOTO_ID_5428546607605361778" border="0" /&gt;&lt;/a&gt;We now have DBUS module by Uzi (very simple for now, but this will change).&lt;br /&gt;&lt;br /&gt;Also history got huge improvements: importing from older versions of Kadu is now about 10-50x faster than before (thanks to sqlite transactions support) and does now blocks Kadu anymore (again, transactions and threading - this is first time I've used producer-consumer pattern in real life). Now I'm working on bringing back status and SMS saving.&lt;br /&gt;&lt;br /&gt;Still a lot work has left to do: GUI work (many mockups from our Season of Usability are still not implemented), modules porting, bug fixing, logic fixing and so on. After all that is done we will stop doing alpha releases and start doing beta ones - for bug fixing only.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3309785602105435894?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3309785602105435894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2010/01/releases-and-stuff.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3309785602105435894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3309785602105435894'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2010/01/releases-and-stuff.html' title='Releases and stuff'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Smjxg7rcxQs/S1YR-xSv0LI/AAAAAAAAAA0/cTGv3XHw92k/s72-c/emoticons.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7054663667816366167</id><published>2009-12-23T03:21:00.000-08:00</published><updated>2010-02-19T05:52:39.589-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mockups'/><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><category scheme='http://www.blogger.com/atom/ns#' term='Gadu-Gadu'/><category scheme='http://www.blogger.com/atom/ns#' term='XMPP'/><title type='text'>State of the Kadu Usability Project as of 12.2009</title><content type='html'>Hello,&lt;br /&gt;&lt;br /&gt;This my first post on this blog, so I would like to say "Hello". ;) My name is Piotr Pełzowski, I'm working on Kadu project in my free time - mostly I work on usability and PR. Today I am going to report about c&lt;span class="mw-headline"&gt;urrent state of usability work done for upcoming version of  Kadu Instant Messenger. &lt;/span&gt;I will present mockups that had been done by Season of Usability  student, &lt;a href="http://mikeharmala.com/"&gt;Mike Harmala&lt;/a&gt; with cooperation with the &lt;a href="http://www.kadu.net/w/Usability/Contributors"&gt;Kadu Usability Project Contributors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/addAContact.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 446px; height: 138px;" src="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/addAContact.png" alt="" border="0" /&gt;&lt;/a&gt;Adding a New Contact in Kadu IM 0.6.6&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="mw-headline"&gt;&lt;a href="http://www.kadu.net/w/Usability"&gt;Kadu Usability Project&lt;/a&gt;&lt;/span&gt; aims to make the current Kadu interface more user-friendly and easily accessible for users with different levels of proficiency as well as help the development team with the introduction of new features in the best way possible usability-wise. In short: KaduTeam is serious about building usable universal instant messenger.&lt;br /&gt;&lt;br /&gt;As you probably know Kadu IM is an open-source IM client currently supporting only proprietary Gadu-Gadu protocol, Gadu-Gadu is the most popular IM network in Poland. In addition to GG network in next version of Kadu IM the XMPP/Jabber and Tlen networks are going to be officially supported. In fact three days ago &lt;a href="http://kadu-im.blogspot.com/2009/12/kadu-066-alpha0.html"&gt;Kadu 0.6.6 alpha0&lt;/a&gt; has been released - this is the first development snapshot with XMPP support. As Rafał Malinowski stated:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Alpha0 releases in Kadu are soft-API freeze releases. That means that no one is allowed to make big API changes (small changes are still allowed). (...) Now we will focus on adjusting our GUI to mockups provided by Usability Team and on fixing remaining (less important) API parts - like Pending Messages, File Transfers or Status Changer (...)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So now it is time for GUI changes in Kadu, changes which are required and needed.&lt;br /&gt;&lt;br /&gt;Ever since its creation in 2001 Kadu IM has been developed and designed primarily for Polish users of GG protocol. Now we hope to attract international user base with Kadu as a XMPP/Jabber client as well as make life easier for Polish users, many of whom use XMPP/Jabber on a daily basis (according to our user survey, that's the case for ~30% of Kadu users). Along with adding support for multiple protocols, we're planning to support simultaneous connections to more than one communication network, usage of multiple accounts of the same protocol and 'metacontacts'. All these enhancements require big changes, sometimes radical changes, in the interface of Kadu.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_yAxn9xJt1Js/SzKdb07xtqI/AAAAAAAABq4/Qem5dMj-LyA/s1600-h/im+networks.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 90px;" src="http://1.bp.blogspot.com/_yAxn9xJt1Js/SzKdb07xtqI/AAAAAAAABq4/Qem5dMj-LyA/s320/im+networks.jpg" alt="" id="BLOGGER_PHOTO_ID_5418566403071522466" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;IM Networks drop-down list&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Those changes are not results of &lt;a href="http://www.kadu.net/w/Usability/Contributors"&gt;UsabilityTeam&lt;/a&gt; whim ;) , our design is based on &lt;a href="http://kadu.net/ankieta/Raport_z_ankiety_dla_uzytkownikow_Kadu.pdf"&gt;kadu user survey results (in polish)&lt;/a&gt;, the survey which has been completed by 5035 participants provided us with vast amounts of useful data. Based on the data acquired from the developers and user survey &lt;a href="http://akai.opsat.net/Personas_for_the_Kadu_IM.pdf"&gt;personas for the Kadu IM&lt;/a&gt; has been built by Joanna Pierożek.  In 11.2008 the actual work on the design of the multiprotocol user interface has been started. Draft mockups for most of the windows that needed to be introduced or redesigned were ready by the time &lt;a href="http://mikeharmala.com/"&gt;Mike Harmala&lt;/a&gt; joined our team in July 2009 as a &lt;a href="http://season.openusability.org/"&gt;Season of Usability&lt;/a&gt; student. In the course of his work with us Mike has conducted &lt;a href="http://spreadsheets.google.com/ccc?key=tV32uFV1u0kKPIhVg5blXOw"&gt;a heuristic evaluation&lt;/a&gt; of the mockups we've previously prepared, based on &lt;a href="http://www.useit.com/papers/heuristic/heuristic_list.html"&gt;Nielsen Heuristics&lt;/a&gt;, &lt;a href="http://techbase.kde.org/Projects/Usability/HIG"&gt;KDE4 Human Interface Guidelines&lt;/a&gt; - which we want to comply with - and other resources identifying &lt;a href="https://docs.google.com/View?id=dccv387s_5d2m4s4nr"&gt;a lot of issues&lt;/a&gt; that needed to be cleared up before the final version of the mockups could start to be implemented. The final contribution Mike has made to Kadu was a set of almost final, both functionally and visually polished mockups for most of the windows that would be introduced into Kadu as soon as it becomes a MultiIM. Those mockups were tweaked/polished a little bit by us and today we will present proposed final design to you.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Let's start with guideline that better explains some of the interactions in the new multiprotocol GUI:&lt;/span&gt;&lt;br /&gt;&lt;iframe src="http://show.zoho.com/embed?id=665863000000005563" name="kadu-IM-mockups-066-ppt" style="border: 1px solid rgb(170, 187, 204);" frameborder="0" height="335" scrolling="no" width="450"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Main mockups in png format:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Click to see big version of each mockup.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/addAContact.png"&gt;Adding a New Contact&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/subscriptionWindow.png"&gt;Subscription Window&lt;/a&gt; (for XMPP-like networks)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/contactProperties.png"&gt;Contact Properties&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/yourAccountsManage.png"&gt;Your Accounts Window- Manage&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/yourAccountsAdd.png"&gt;Your Accounts Window - Add/Create Account &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/Menus.png"&gt;Menu and Context Menu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/merge%20contacts.png"&gt;Merging Contacts&lt;/a&gt; (so called "Metacontacts")&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/configurationWindow.png"&gt;Preferences&lt;/a&gt; (switching between Simple Mode and Advanced Mode changes ContactsList appearance as described in presentation)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/configurationWizard.png"&gt;Configuration (First Run) Wizard&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/%7Epatpi/Mockups/0.6.6/Chat.png"&gt;Chat window&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;At this point we've almost finished full specification of all the windows that need to change or need to be introduced into Kadu 0.6.6 to make it a user-friendly multiprotocol Internet Messenger. We know the risks of radical changes to the design our users have enjoyed and gotten used to so far but we hope what we've come up with is good enough to both make our current users stay with Kadu and enjoy its enhanced functionality and improved usability and attract new users who either need a multiprotocol messenger or a user-friendly XMPP/Jabber client.&lt;br /&gt;&lt;p&gt;We still have few windows to design but those mockups should be consider as final GUI proposal for upcoming Kadu 0.6.6 version. We are eager to hear your feedback on our proposal. So if you have any comments feel free to comment! &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;Get Involved&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Do you like our vision of usable  multiprotocol messenger? Do you like our 'regionalization' concept visible in "Your Accounts Window - Add/Create Account", "Configuration Wizard" and "Adding a New Contact" window? Or maybe you like our efforts to integrate "branded" XMPP providers into GUI (which will probably lower the entry barriers for newcomers in XMPP world.)?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If additional you are interested or involved somehow in usability please consider joining &lt;a href="http://groups.google.com/group/kadu-design-feedback"&gt;Kadu Design Feedback mailinglist&lt;/a&gt; and became a member of UsabilityTeam. We have still many things to design, improve or fix. ;) Currently &lt;a href="http://www.kadu.net/w/Usability/Contributors"&gt;UsabilityTeam&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;consists of two active contributors Joanna Pierożek and me. Previously the work on the Usability project has been conducted mostly in Polish. However during the summer we've switched almost entirely to English on the mailing list, in the documents and in the mock-ups we've produced. As far as the Usability project goes, we're ready to accommodate international contribution without making anyone feel intimidated. Hopefully, along with introducing XMPP/Jabber and other protocols useful for people from outside Poland into Kadu, regular contributors from other countries will indeed join our ranks.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7054663667816366167?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7054663667816366167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/11/state-of-kadu-usability-project-as-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7054663667816366167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7054663667816366167'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/11/state-of-kadu-usability-project-as-of.html' title='State of the Kadu Usability Project as of 12.2009'/><author><name>Piotr Pełzowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_yAxn9xJt1Js/SzKdb07xtqI/AAAAAAAABq4/Qem5dMj-LyA/s72-c/im+networks.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-609724846228280037</id><published>2009-12-21T01:13:00.000-08:00</published><updated>2009-12-21T01:27:42.126-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>Kadu 0.6.6 alpha0</title><content type='html'>Kadu 0.6.6 alpha0 was released.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Warning:&lt;/span&gt; This version will eat your children. Do not use if you are not sure what you are doing. Configuration file format was changed (configuration file too), history format was changed. Reverting back to older versions is be possible, but with loss of all new history and configuration changes. If you can, use new Kadu from new user or with CONFIG_DIR set to kadu_alpha. &lt;span style="font-weight: bold;"&gt;We will not provide any official packages for this version.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alpha0 releases in Kadu are soft-API freeze releases. That means that no one is allowed to make big API changes (small changes are still allowed). Stability in general is very good, history works, chats works, file transfers - we don't really know yet ;)&lt;br /&gt;&lt;br /&gt;Now we will focus on adjusting our GUI to mockups provided by Usability Team and on fixing remaining (less important) API parts - like Pending Messages, File Transfers or Status Chagner. Many modules needs to be adjusted to new API too.&lt;br /&gt;&lt;br /&gt;And of course: stability, stability and stability ;)&lt;br /&gt;&lt;br /&gt;ChangeLog available at &lt;a href="http://gitorious.org/kadu/kadu/blobs/master/ChangeLog"&gt;gitorious&lt;/a&gt;.&lt;br /&gt;Source package available at &lt;a href="http://www.kadu.net/download/unstable/kadu-0.6.6-alpha0.tar.bz2"&gt;kadu.net&lt;/a&gt; (2MB).&lt;br /&gt;&lt;br /&gt;Good lock!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-609724846228280037?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/609724846228280037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/12/kadu-066-alpha0.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/609724846228280037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/609724846228280037'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/12/kadu-066-alpha0.html' title='Kadu 0.6.6 alpha0'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-1124823303027388784</id><published>2009-12-02T15:19:00.000-08:00</published><updated>2009-12-02T15:54:51.791-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Storage'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Storage Layer</title><content type='html'>Code I've started writing almost year ago (&lt;a href="http://kadu-im.blogspot.com/2009/02/new-alternative-configuration-api.html"&gt;new configuration API&lt;/a&gt;) have grown to whole new layer of code. Now it is called &lt;a href="http://gitorious.org/kadu/kadu/trees/doc-storage/kadu-core/storage"&gt;Kadu Storage API&lt;/a&gt; and this is the first thing that will get documentation (by Doxygen) for new release.&lt;br /&gt;&lt;br /&gt;This API has some really nice features:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Details&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some classes, like &lt;span style="font-family:courier new;"&gt;Contact&lt;/span&gt; or &lt;span style="font-family:courier new;"&gt;Chat&lt;/span&gt;, have data that depends on some plugins (like XMPP/Jabber contact data, or Gadu-Gadu contact data, or IRC chatroom data, or ...). We want to give user view to this data even if plugin is not loaded/unavailable for some reason. So as much data as possible were extracted to generic classes like &lt;span style="font-family:courier new;"&gt;Contact&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Chat&lt;/span&gt;, or &lt;span style="font-family:courier new;"&gt;Account&lt;/span&gt; (&lt;a href="http://gitorious.org/kadu/kadu/blobs/doc-storage/modules/gadu_protocol/gadu-account-details.h"&gt;see how much extra data Gadu-Gadu needs for Account&lt;/a&gt;).This data can be loaded from Storage at any moment and be displayed to user and manipulated.&lt;br /&gt;But that data cannot be used to do anything useful: you can't talk with someone on XMPP account if Jabber plugin is not loaded (but you can view this chat history). So when the plugin is loaded every object that depends on it loads extra data by using specific &lt;a href="http://gitorious.org/kadu/kadu/blobs/doc-storage/kadu-core/storage/details.h"&gt;&lt;span style="font-family:courier new;"&gt;Details&lt;/span&gt;&lt;/a&gt; class. This class uses the same &lt;a style="font-family: courier new;" href="http://gitorious.org/kadu/kadu/blobs/doc-storage/kadu-core/storage/storage-point.h"&gt;StoragePoint&lt;/a&gt; as main class so it can load extra data from the same configuration node. After extra data is loaded, the object can be used (to connect to server, make some chat and so on).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Shared classes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Shared classes bring some Java-like API to Kadu. It is just a trick to hide that given class is really a pointer. Just a good usage of &lt;span class="typ"  style="font-family:courier new;"&gt;QExplicitlySharedDataPointer&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;QSharedData&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;.&lt;/span&gt; But with lazy-loading and &lt;a style="font-family: courier new;" href="http://gitorious.org/kadu/kadu/blobs/doc-storage/kadu-core/storage/storable-object.h"&gt;StorableObject&lt;/a&gt; support ;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Generic managers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Kadu has now two generic (template-based) managers: &lt;a href="http://gitorious.org/kadu/kadu/blobs/doc-storage/kadu-core/storage/manager.h"&gt;&lt;span style="font-family:courier new;"&gt;Manager&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://gitorious.org/kadu/kadu/blobs/doc-storage/kadu-core/storage/simple-manager.h"&gt;&lt;span style="font-family:courier new;"&gt;SimpleManager&lt;/span&gt;&lt;/a&gt;. The first one has built-in support for classes that use &lt;span style="font-family:courier new;"&gt;Details&lt;/span&gt; (like &lt;a href="http://gitorious.org/kadu/kadu/blobs/doc-storage/kadu-core/storage/details-holder.h"&gt;&lt;span style="font-family:courier new;"&gt;DetailsHolder&lt;/span&gt;&lt;/a&gt; subclasses) - it only exposes object without &lt;span style="font-family:courier new;"&gt;Details&lt;/span&gt; loaded when code explicitly asks for that. Just look for &lt;span style="font-family:courier new;"&gt;ChatManager&lt;/span&gt; implementation to see how little code is now needed to implement manager that fully supports loading/storing and many more features using these generics:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/kadu/kadu/blobs/doc-storage/kadu-core/chat/chat-manager.h"&gt;&lt;span style="font-family:courier new;"&gt;chat-manager.h&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/kadu/kadu/blobs/doc-storage/kadu-core/chat/chat-manager.cpp"&gt;&lt;span style="font-family:courier new;"&gt;chat-manager.cpp&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Simple constructors and intuitive behavior of StorableObject&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/kadu/kadu/blobs/doc-storage/kadu-core/storage/storable-object.h"&gt;&lt;span style="font-family:courier new;"&gt;StorableObject&lt;/span&gt;&lt;/a&gt; class (and all subclasses) has now only one constructor (instead of 4). Passing parent objects, node names and so on in constructors was replaced with nice virtual functions.&lt;br /&gt;&lt;br /&gt;This class has now &lt;span style="font-family:courier new;"&gt;State&lt;/span&gt; field. It can has three values: &lt;span style="font-family:courier new;"&gt;StateLoaded&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;StateNotLoaded&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;StateNew&lt;/span&gt;. Code of &lt;span style="font-family:courier new;"&gt;load&lt;/span&gt; method is executed only if the state is &lt;span style="font-family:courier new;"&gt;StateNotLoaded&lt;/span&gt;. By default object is treated as "new" (so no need to load, but only default data is available). To make object "not loaded" (so it will be eventually "loaded") you need to set up its &lt;span style="font-family:courier new;"&gt;StoragePoint&lt;/span&gt; using &lt;span style="font-family:courier new;"&gt;setStorage&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;All that simple changes give more natural and intuitive feel of how this object behave. It also allows us to remove some code, because these new default are what we need in most of our code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What is next?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After Doxygen documentation for Storage is written, I'll focus myself on little higher layers: Buddy Storage, Chat Storage, anything Storage to make sure everything is nice and clean ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-1124823303027388784?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/1124823303027388784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/12/storage-layer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1124823303027388784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1124823303027388784'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/12/storage-layer.html' title='Storage Layer'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-2733531914986454902</id><published>2009-11-10T13:34:00.000-08:00</published><updated>2009-11-11T07:20:37.172-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>API unification</title><content type='html'>I am working on last bits of new Kadu API. Works that needs to be done can be summarized in 3 points:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;move all important classes to base/shared/details model&lt;/li&gt;&lt;li&gt;extract as much as possible from base/shared/details model to common base classes&lt;/li&gt;&lt;li&gt;remove Buddy::contact(Account) method (or remove unnecessary uses of it)&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Base/Shared/Details model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is the improved structure of our main classes (&lt;span style="font-family:courier new;"&gt;Buddy&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Contact&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Identity&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Avatar&lt;/span&gt;...). &lt;span style="font-family:courier new;"&gt;Base&lt;/span&gt; class (named simply &lt;span style="font-family:courier new;"&gt;Contact&lt;/span&gt;) is responsible to give access to object data. Every copy of such object contains pointer to the same &lt;span style="font-family:courier new;"&gt;Shared&lt;/span&gt; class (like &lt;span style="font-family:courier new;"&gt;ContactShared&lt;/span&gt;) contains data, can read and store it (it is always &lt;span style="font-family:courier new;"&gt;UuidStorableObject&lt;/span&gt;). Thanks to that we don't need to worry about working on copy of object instead of original one (the only class that knows about &lt;span style="font-family:courier new;"&gt;Shared&lt;/span&gt; class is the &lt;span style="font-family:courier new;"&gt;Base&lt;/span&gt; class).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Details&lt;/span&gt; classes allowed us to switch from IS-A to HAS-A relation (now &lt;span style="font-family:courier new;"&gt;GaduContact&lt;/span&gt; does not inherits &lt;span style="font-family:courier new;"&gt;Contact&lt;/span&gt;, just &lt;span style="font-family:courier new;"&gt;GaduContactDetails&lt;/span&gt; inherits &lt;span style="font-family:courier new;"&gt;ContactDetails&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;ContactShared&lt;/span&gt; object contains one of &lt;span style="font-family:courier new;"&gt;ContactDetails&lt;/span&gt; objects). This allows us to load all accounts/buddies and contacts at once and only populate details fields when protocol module is loaded. So situation where some object exists only in configuration and not in running program is not possible now. You can read history of such contact now ;)&lt;br /&gt;&lt;br /&gt;A lot of code for these classes is duplicated: it needs extraction to template classes, and it will be done after &lt;span style="font-family:courier new;"&gt;Contact&lt;/span&gt; is ported to this new model.&lt;br /&gt;&lt;br /&gt;BTW: I've renamed Contact to Buddy and ContactAccountData to Contact, so the names do make sense now ;) It was very problematically but I think that it was worth the effort.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Removing Buddy::contact(Account) method&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This method assumes that a Buddy can have only one Contact for one Account. We don't like this assumption (someone can have a friend with 10 Jabber accounts, so why limit connections to only one?). After this function is removed (or its usage reduced as much as possible) this will be possible. We also need to remove functions with &lt;span style="font-family:courier new;"&gt;Account&lt;/span&gt;/&lt;span style="font-family:courier new;"&gt;Buddy&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt; pairs and replace that with &lt;span style="font-family:courier new;"&gt;Contact&lt;/span&gt;. It will also make moving Contacts between Buddies simpler (and merging and splitting &lt;span style="font-family:courier new;"&gt;Buddies&lt;/span&gt; too).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;0.6.6 alpha0 - soft API freeze (or I will not mess so much anymore)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These are the last three things I want to do before soft API freeze. Be prepared to testing first alpha release ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-2733531914986454902?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/2733531914986454902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/11/api-unification.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/2733531914986454902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/2733531914986454902'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/11/api-unification.html' title='API unification'/><author><name>Rafał Malinowski</name><uri>http://www.blogger.com/profile/16381816269519198253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Smjxg7rcxQs/SvFx6HZW1QI/AAAAAAAAAAM/ZCD2ZlZmItE/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-974816261643882688</id><published>2009-10-11T13:02:00.000-07:00</published><updated>2009-10-11T13:16:49.606-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Power of proxy models</title><content type='html'>Our Usability Team created mockup of new "Add Buddy" window. It contains combobox for selecting group new contact will belong to. It looks like that:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;- Select group -&lt;/li&gt;&lt;li&gt;Group 1&lt;/li&gt;&lt;li&gt;Group 2&lt;/li&gt;&lt;li&gt;Group 3&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Create new group...&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;We have model for groups, but using it for that combobox would only show 3 groups, without additional items at top and at bottom. So I had to use proxy model.&lt;br /&gt;&lt;br /&gt;Proxy models are models that you can stack (many of them) on another model (like our group model) to filter them, sort them or process data in any way. For "Add buddy" window there are 2 proxy models on top on group model:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;QSortFilterProxyModel&lt;/li&gt;&lt;li&gt;ActionsProxyModel&lt;/li&gt;&lt;/ul&gt;First proxy model sorts groups by name, the second one adds items at top and at bottom of the list (it even make it italics). Code for stacking proxy models looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;GroupsModel *groupComboModel =&lt;br /&gt;new GroupsModel(GroupCombo);&lt;br /&gt;  QSortFilterProxyModel *sortModel =&lt;br /&gt;new QSortFilterProxyModel(GroupCombo);&lt;br /&gt;  sortModel-&gt;setSourceModel(groupComboModel);&lt;br /&gt;ActionsProxyModel *groupsProxyModel =&lt;br /&gt;new ActionsProxyModel(groupsModelBeforeActions,&lt;br /&gt;  groupsModelAfterActions, GroupCombo);&lt;br /&gt;  groupsProxyModel-&gt;setSourceModel(sortModel);&lt;br /&gt;GroupCombo-&gt;setModel(groupsProxyModel);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The most important part is that you can reuse these proxy models everywhere you want and you don't have to manually update this combobox when new groups are created ;) Models do everything for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-974816261643882688?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/974816261643882688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/10/power-of-proxy-models.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/974816261643882688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/974816261643882688'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/10/power-of-proxy-models.html' title='Power of proxy models'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3161822102361529253</id><published>2009-09-22T14:06:00.000-07:00</published><updated>2009-09-22T14:20:54.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>How not to use signals and slots</title><content type='html'>I wanted sound module to work for brand-new git/master Kadu with Phonon backend. So I've looked at code of &lt;span style="font-family:courier new;"&gt;sound&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;phonon_sound&lt;/span&gt; modules and I've discovered a big misuse of signal-slot mechanism.&lt;br /&gt;&lt;br /&gt;Please look at &lt;a href="http://gitorious.org/kadu/kadu/blobs/0.6.5.x/modules/sound/sound.h"&gt;sound.h file from 0.6.5 branch&lt;/a&gt;. The interesting part is &lt;span style="font-family:courier new;"&gt;signals:&lt;/span&gt; from &lt;span style="font-family:courier new;"&gt;SoundManager&lt;/span&gt; class:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;signals:&lt;br /&gt;  void openDeviceImpl(SoundDeviceType type,&lt;br /&gt;       int sample_rate, int channels,&lt;br /&gt;       SoundDevice* device);&lt;br /&gt;  void closeDeviceImpl(SoundDevice device);&lt;br /&gt;  void playSampleImpl(SoundDevice device,&lt;br /&gt;       const int16_t* data, int length,&lt;br /&gt;       bool *result);&lt;br /&gt;  void recordSampleImpl(SoundDevice device,&lt;br /&gt;       int16_t* data, int length, bool *result);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;How this works? A module such as &lt;span style="font-family:courier new;"&gt;phonon_module&lt;/span&gt; creates new object that connects to these signals. Then a signal is emited and a slot is executed. Everything works, but this creates a lot of problems:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;many object can conencts to these slots so sound may be played many times by different backend&lt;/li&gt;&lt;li&gt;so we need to ensure that only one backend is loaded, this requires additional code in module-managing classes&lt;/li&gt;&lt;li&gt;object can just ignore some signals and do not implement slots and/or connect them&lt;/li&gt;&lt;li&gt;results are returned using pointers in last parameters of these signals&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;This kind of problem requires another solution, that is still very simple and nice to implement:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create abstract class, like &lt;a href="http://gitorious.org/kadu/kadu/blobs/master/modules/sound/sound-player.h"&gt;SoundPlayer&lt;/a&gt;, that has methods like SoundDevice *openDevice() and so on&lt;br /&gt;&lt;/li&gt;&lt;li&gt;create object SoundPlayer *Player in SoundManager&lt;/li&gt;&lt;li&gt;use this object instead of emitting signals&lt;/li&gt;&lt;li&gt;make SoundPlayer parent class of backend classes instead of connecting signals&lt;/li&gt;&lt;/ul&gt;Thats all today ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3161822102361529253?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3161822102361529253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/09/how-not-to-use-signals-and-slots.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3161822102361529253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3161822102361529253'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/09/how-not-to-use-signals-and-slots.html' title='How not to use signals and slots'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7645917073820106317</id><published>2009-09-14T13:18:00.000-07:00</published><updated>2009-09-14T13:45:32.729-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><category scheme='http://www.blogger.com/atom/ns#' term='History'/><title type='text'>New history window</title><content type='html'>Juzef has been working on new history window (and SQL history backend) for some time. So I've finally give it a try and after some tweaks I will show you effects of his work (this window still needs lot of work from our UI team, but it works as it should):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RmbcIB8klGo/Sq6pPcwHquI/AAAAAAAAACY/Swla61Dc8qI/s1600-h/history1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 403px; height: 288px;" src="http://1.bp.blogspot.com/_RmbcIB8klGo/Sq6pPcwHquI/AAAAAAAAACY/Swla61Dc8qI/s320/history1.png" alt="" id="BLOGGER_PHOTO_ID_5381424687635475170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On the left side there is list of all chats (single ones and conferences - future modules like irc_protocol would be able to add new types of chats). You can use edit box above this tree view to filter chats by name, contacts, contacts' ids and whatever you want.&lt;br /&gt;&lt;br /&gt;On the right side you have list of dates. You can select any one of them and you will get list of messages from that date. Above that is edit box for searching words (it will filter chats and dates lists too) and for selecting date range (it will filter chats list also).&lt;br /&gt;&lt;br /&gt;What needs to be done:&lt;br /&gt;* usability (this window does not have any)&lt;br /&gt;* highlighting of found words (needs backport from 0.6.5.3)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7645917073820106317?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7645917073820106317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/09/new-history-window.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7645917073820106317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7645917073820106317'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/09/new-history-window.html' title='New history window'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RmbcIB8klGo/Sq6pPcwHquI/AAAAAAAAACY/Swla61Dc8qI/s72-c/history1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7605147520871250188</id><published>2009-09-07T14:35:00.001-07:00</published><updated>2009-09-07T14:37:19.301-07:00</updated><title type='text'>New channels</title><content type='html'>Three new channels for KaduTeam-world communication were open today:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://identi.ca/kadu/"&gt;identi.ca&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://twitter.com/kaduIM"&gt;twitter&lt;/a&gt; (mirror of identi.ca microblog)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kadu.blip.pl/"&gt;blip.pl&lt;/a&gt; (only polish)&lt;/li&gt;&lt;/ul&gt;I hope you will enjoy reading our microblogs ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7605147520871250188?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7605147520871250188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/09/new-channels.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7605147520871250188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7605147520871250188'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/09/new-channels.html' title='New channels'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-1462249132997399916</id><published>2009-09-05T11:22:00.000-07:00</published><updated>2009-09-05T11:31:26.688-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>New history feature</title><content type='html'>Yesterday I've added a feature known from Skype - user can display messages from yesterday/last 7 days/last 30 days in chat window. I needed only one hour to implement it, thanks to Juzef's SQL history and improving Kadu API ;)&lt;br /&gt;&lt;br /&gt;Screenshot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RmbcIB8klGo/SqKt-Lw9XUI/AAAAAAAAABs/SG83lG3HJ7k/s1600-h/history.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_RmbcIB8klGo/SqKt-Lw9XUI/AAAAAAAAABs/SG83lG3HJ7k/s320/history.png" alt="" id="BLOGGER_PHOTO_ID_5378052188855426370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I know, the icon is the same as "Show history" one. I'll ask our art team to make a new one :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-1462249132997399916?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/1462249132997399916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/09/new-history-feature.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1462249132997399916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1462249132997399916'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/09/new-history-feature.html' title='New history feature'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RmbcIB8klGo/SqKt-Lw9XUI/AAAAAAAAABs/SG83lG3HJ7k/s72-c/history.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-6424687728998073943</id><published>2009-09-02T13:45:00.001-07:00</published><updated>2009-09-02T13:49:25.453-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Git'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Another git repository</title><content type='html'>White Eagle has set up a new git repository for Kadu: on &lt;a href="http://gitorious.org/kadu"&gt;gitorious.org&lt;/a&gt;. It is way better that the one I've set: it has all our SVN tags, branches and externals (libiris). He has spent a lot of time to do that ;)&lt;br /&gt;&lt;br /&gt;So now repositorium on Github is just a mirror of master branch and other git branches (not including old svn-ones). Feel free to ask for access to any of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-6424687728998073943?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/6424687728998073943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/09/another-git-repository.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/6424687728998073943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/6424687728998073943'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/09/another-git-repository.html' title='Another git repository'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-4751892284680831624</id><published>2009-08-26T17:32:00.000-07:00</published><updated>2009-08-27T01:11:30.566-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Avatars</title><content type='html'>Kadu now supports avatars on contacts list and chat window with Adium styles (now only for GaduGadu accounts). Implementation was done by me, Juzef and White Eagle (team work ;) ). Thanks to Qt model-view framework and to Kadu protocols' service framework this was very easy to do. Now we only need to optimize it a bit (don't ask server every time for avatar data) and to use original aspect-ratio of images.&lt;br /&gt;&lt;br /&gt;Below is screenshot with contacts from my list that have avatars and two contacts without one, so you can see the temporary default-avatar image too.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RmbcIB8klGo/SpXUJqm3vFI/AAAAAAAAABk/g7AHOlLk9Ng/s1600-h/avatars.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 194px; height: 320px;" src="http://1.bp.blogspot.com/_RmbcIB8klGo/SpXUJqm3vFI/AAAAAAAAABk/g7AHOlLk9Ng/s320/avatars.png" alt="" id="BLOGGER_PHOTO_ID_5374434992857791570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And the chat window:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img339.imageshack.us/img339/1398/zrzutekranu2x.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 436px; height: 332px;" src="http://img339.imageshack.us/img339/1398/zrzutekranu2x.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Next feature that will be implemented by me is choosed by community on our &lt;a href="http://www.kadu.net/forum/viewtopic.php?f=6&amp;amp;t=9342&amp;amp;p=86507"&gt;forum&lt;/a&gt; - support for "Show messages from today/last day/last week" in chat window (similar to what is in Skype 4).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-4751892284680831624?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/4751892284680831624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/08/avatars.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4751892284680831624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4751892284680831624'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/08/avatars.html' title='Avatars'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RmbcIB8klGo/SpXUJqm3vFI/AAAAAAAAABk/g7AHOlLk9Ng/s72-c/avatars.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7070368075615003549</id><published>2009-08-19T14:19:00.000-07:00</published><updated>2009-08-28T03:34:43.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Contacts tree view</title><content type='html'>With one of last revision Kadu got a new feature - tree view for contacts. Now you can expand (with right-arrow button) any contact to see all connection to it (like Gadu-Gadu and Jabber ones). In near future double-clicking on any item will open chat window using choosen protocol and account, and every item will have its own context menu... Now just a simple screenshot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RmbcIB8klGo/SoxvQ2lIpwI/AAAAAAAAABc/gxzsNoZqv7o/s1600-h/tree-view.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_RmbcIB8klGo/SoxvQ2lIpwI/AAAAAAAAABc/gxzsNoZqv7o/s320/tree-view.png" alt="" id="BLOGGER_PHOTO_ID_5371790790866020098" border="0" /&gt;&lt;/a&gt;My number is shown (btw: if you want to talk to me, use Private Messages on our forum or comments on this blog).&lt;br /&gt;&lt;br /&gt;If someone has a screenshot with contact that has more than one subcontact - please send it to me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Edit: screenshot from White Eagle&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img34.imageshack.us/img34/8991/metakontakty.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 279px; height: 374px;" src="http://img34.imageshack.us/img34/8991/metakontakty.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7070368075615003549?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7070368075615003549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/08/contacts-tree-view.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7070368075615003549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7070368075615003549'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/08/contacts-tree-view.html' title='Contacts tree view'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RmbcIB8klGo/SoxvQ2lIpwI/AAAAAAAAABc/gxzsNoZqv7o/s72-c/tree-view.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3656307639186162361</id><published>2009-08-13T15:45:00.000-07:00</published><updated>2009-08-13T15:59:34.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Another manager</title><content type='html'>GaduGadu protocol supports delivery acknowledges - you can be sure that message was received. Kadu implemented it in two ways (you can choose one in Configuration):&lt;br /&gt;* ignore it&lt;br /&gt;* block chat window until ack is received&lt;br /&gt;&lt;br /&gt;The first one sucks, because message could be lost in deep network and you will never know, second one sucks, because you sometimes have to wait for more than 5 second until you could write another message.&lt;br /&gt;&lt;br /&gt;On 2007 mishaaq wrote a patch that would display a status icon next to each message. So you have information about delivery and chat window is not blocked. This patch was not applied (don't remember why) and is not available now (url is invalid now). This functionality is so much needed - I decided to write simple version of it from scratch.&lt;br /&gt;&lt;br /&gt;As usual for me I started with looking again at the whole messages code and I've found that we need to make &lt;span style="font-family:courier new;"&gt;MessagesManager&lt;/span&gt;, remove &lt;span style="font-family:courier new;"&gt;PendingMessagesManager&lt;/span&gt; (or change it into &lt;span style="font-family:courier new;"&gt;MessagesManager&lt;/span&gt;), make &lt;span style="font-family:courier new;"&gt;Message&lt;/span&gt; a &lt;span style="font-family:courier new;"&gt;StorableObject&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;QSharedData&lt;/span&gt; and then everything will work great and look great and will be very hackable ;)&lt;br /&gt;&lt;br /&gt;In near future 50% of Kadu classes will be managers. I hope it is a right way - it still looks so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3656307639186162361?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3656307639186162361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/08/another-manager.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3656307639186162361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3656307639186162361'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/08/another-manager.html' title='Another manager'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3232104272795785092</id><published>2009-08-05T15:09:00.000-07:00</published><updated>2009-08-05T15:14:03.624-07:00</updated><title type='text'>Back in Poznań</title><content type='html'>I'm now back from my two weeks of sailing on Mazury's lakes. My thesis is almost-approved by my mentor and amount of my free time will be greater than zero in next week. Be prepared for next big changes for Kadu 0.6.6 ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3232104272795785092?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3232104272795785092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/08/back-in-poznan.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3232104272795785092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3232104272795785092'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/08/back-in-poznan.html' title='Back in Poznań'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-5788706020338385350</id><published>2009-07-04T04:05:00.001-07:00</published><updated>2009-07-05T00:41:53.553-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Git'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Git repository</title><content type='html'>Kadu has now an unofficial (read only) Git repository:  git://github.com/vogel/kadu.git (&lt;a href="http://github.com/vogel/kadu/"&gt;http://github.com/vogel/kadu/&lt;/a&gt;). For write access please create an account on Github and ask me on our forum then. It is connected with our SVN by my local repo created by git-svn, so I hope I'll be able to synchronize these two.&lt;br /&gt;&lt;br /&gt;I am curious how it will works and how the Kadu Team will like it. From the &lt;a href="http://learn.github.com/"&gt;tutorial&lt;/a&gt; on github it seems like git is superior to SVN in every possible case. The future will show the truth ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-5788706020338385350?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/5788706020338385350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/07/git-repository.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/5788706020338385350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/5788706020338385350'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/07/git-repository.html' title='Git repository'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7895483093065678321</id><published>2009-06-29T13:30:00.000-07:00</published><updated>2009-06-29T13:44:40.176-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Changing status for multiple accounts</title><content type='html'>We now supports multiple accounts. Each account can have its own status and description. We need a way to allow user to change these easily. Our usability team created two modes for kadu: advanced and simple one. In advanced mode each account will have its own status button and status menu, each identity will have own button and menu (accounts can be joined in identities like Work and Private).&lt;br /&gt;&lt;br /&gt;Development team has to put these ideas into code. In Kadu 0.6.5 each status change goes through &lt;span style="font-family:courier new;"&gt;StatusChangerManager&lt;/span&gt; singleton, that stores current user-set status and computes real status (modules can change what user set). &lt;span style="font-family:courier new;"&gt;StatusButton&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;StatusMenu&lt;/span&gt; uses this singleton.&lt;br /&gt;&lt;br /&gt;The new code will be a little more complicated. &lt;span style="font-family:courier new;"&gt;StatusContainer&lt;/span&gt; interface (empty class) is introduced. It contains methods to set status, get current status and signal &lt;span style="font-family:courier new;"&gt;statusChanged&lt;/span&gt;. This interface will be implemented by two classes: &lt;span style="font-family:courier new;"&gt;Account&lt;/span&gt; (already done) and &lt;span style="font-family:courier new;"&gt;Identity&lt;/span&gt; (this class does not exists yet). Singleton &lt;span style="font-family:courier new;"&gt;StatusContainerManager&lt;/span&gt; will be created, as well as &lt;span style="font-family:courier new;"&gt;StatusContainerAwareObject&lt;/span&gt; class. Each &lt;span style="font-family:courier new;"&gt;StatusMenu&lt;/span&gt; object will get an &lt;span style="font-family:courier new;"&gt;StatusContainer&lt;/span&gt; object as contructor parameter, the samy apply for &lt;span style="font-family:courier new;"&gt;StatusButton&lt;/span&gt;. New widget, &lt;span style="font-family:courier new;"&gt;StatusButtons&lt;/span&gt;, is an &lt;span style="font-family:courier new;"&gt;StatusContainerAwareObject&lt;/span&gt; so it can adjust itself to new accounts/identities. It is just a horizontal box that contains multiple &lt;span style="font-family:courier new;"&gt;StatusButton&lt;/span&gt; widgets.&lt;br /&gt;&lt;br /&gt;I thinks that this architecture will cover all needed functionality. Any other ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7895483093065678321?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7895483093065678321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/06/changing-status-for-multiple-accounts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7895483093065678321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7895483093065678321'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/06/changing-status-for-multiple-accounts.html' title='Changing status for multiple accounts'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-8079540073302044043</id><published>2009-06-23T14:54:00.000-07:00</published><updated>2009-06-23T15:03:02.370-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Git'/><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Status updates</title><content type='html'>Kadu is now slowly progressing to 0.6.6:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I'm moving files and classes around, so as few files as possible will remaing in kadu-core directory;&lt;/li&gt;&lt;li&gt;after this is done, I'll finish Your accounts window and start to enhance &lt;span style="font-family: courier new;"&gt;ContactsListWidget&lt;/span&gt; to support visualizing of metacontacts&lt;br /&gt;&lt;/li&gt;&lt;li&gt;our Season of Usability mentor and student connected (at least) with us, so we will have more GUI mockups to code;&lt;/li&gt;&lt;li&gt;I've switched locally to git (with git-svn as gateway to our official repository). I hope we will be able to move official repo to git after team members' exams, so everyone would be able to work on own branch(es), and I hope that this will also speed up our development a bit.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-8079540073302044043?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/8079540073302044043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/06/status-updates.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8079540073302044043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8079540073302044043'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/06/status-updates.html' title='Status updates'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7254131020008491077</id><published>2009-06-10T14:14:00.000-07:00</published><updated>2009-06-10T14:22:09.551-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Password protection</title><content type='html'>I did not have much time to work on Kadu last time (thesis work), but I would like to present a small feature I've just implemented. Now you can use "Your accounts" window to uncheck "Remember password" field. When you'll try to login to this account a nice window will appear to get the password from you:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RmbcIB8klGo/SjAjU3HH5oI/AAAAAAAAAAs/IMXC8yI88_c/s1600-h/kadu-password.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 111px;" src="http://1.bp.blogspot.com/_RmbcIB8klGo/SjAjU3HH5oI/AAAAAAAAAAs/IMXC8yI88_c/s320/kadu-password.png" alt="" id="BLOGGER_PHOTO_ID_5345811598986962562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You don't need to worry again about someone stealing your identity ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7254131020008491077?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7254131020008491077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/06/password-protection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7254131020008491077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7254131020008491077'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/06/password-protection.html' title='Password protection'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RmbcIB8klGo/SjAjU3HH5oI/AAAAAAAAAAs/IMXC8yI88_c/s72-c/kadu-password.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3957568972900173146</id><published>2009-05-19T13:08:00.000-07:00</published><updated>2009-06-10T14:21:13.222-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>New Accounts window</title><content type='html'>Our Usability team worked hard for bringing some nice windows for users. The first one I've implemented (almost) is "Your accounts" (White Eagle is working on "Add buddy" window now).&lt;br /&gt;&lt;br /&gt;Maybe some screenshots now:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RmbcIB8klGo/ShMT2FgyYJI/AAAAAAAAAAM/vEoYQ0iDesM/s1600-h/your-accounts-1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 203px;" src="http://4.bp.blogspot.com/_RmbcIB8klGo/ShMT2FgyYJI/AAAAAAAAAAM/vEoYQ0iDesM/s320/your-accounts-1.png" alt="" id="BLOGGER_PHOTO_ID_5337631803277729938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is the window in "New account mode" (the only one already implemented). It lacks edit/delete functions, but anyone really needs them?&lt;br /&gt;&lt;br /&gt;Lets select "Gadu-Gadu" from protocols combobox. What do you get?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RmbcIB8klGo/ShMVWqU5dtI/AAAAAAAAAAU/VVC3lU9nDF8/s1600-h/your-accounts-2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 203px;" src="http://1.bp.blogspot.com/_RmbcIB8klGo/ShMVWqU5dtI/AAAAAAAAAAU/VVC3lU9nDF8/s320/your-accounts-2.png" alt="" id="BLOGGER_PHOTO_ID_5337633462427416274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You can enter things like "Account name", "Gadu-Gadu number" and "Password". Below is something called "Account description" - not yet implemented too. If you don't have an Gadu-Gadu account go select "I don't have a Gadu-Gadu number" and you'll get this window:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RmbcIB8klGo/ShMVu24Z_9I/AAAAAAAAAAc/BduwZTIqLLU/s1600-h/your-accounts-3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 203px;" src="http://2.bp.blogspot.com/_RmbcIB8klGo/ShMVu24Z_9I/AAAAAAAAAAc/BduwZTIqLLU/s320/your-accounts-3.png" alt="" id="BLOGGER_PHOTO_ID_5337633878114435026" border="0" /&gt;&lt;/a&gt;You need to provide e-mail address and a password (two times). And the "captcha" has to be solved (it is Gadu-Gadu's thing, not our invention). Click "Register" and with some luck you'll be granted with new account!&lt;br /&gt;&lt;br /&gt;Next click "Add this account" and you'll get this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RmbcIB8klGo/ShMVyue99OI/AAAAAAAAAAk/RjneF68Z8H8/s1600-h/your-accounts-4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 203px;" src="http://1.bp.blogspot.com/_RmbcIB8klGo/ShMVyue99OI/AAAAAAAAAAk/RjneF68Z8H8/s320/your-accounts-4.png" alt="" id="BLOGGER_PHOTO_ID_5337633944579732706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Voila.&lt;br /&gt;&lt;br /&gt;Implementing this window required some strange code:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;CreateAccountWidget was added, each ProtocolFactory now has to provide function that create one of these window (like GaduAccountCreateWidget, that is visible above),&lt;/li&gt;&lt;li&gt;Creating FirstEmpty model class that adds an item before any other items in a model (like "Select a network to add" in example above); I think there is a better way to do that, but I haven't found one.&lt;/li&gt;&lt;/ol&gt;We (with the whole Kadu Usability Team) hopes that our users will love these windows. If you have any suggestions please put them in comments or on Kadu forum (we have special subforum for English users).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3957568972900173146?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3957568972900173146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/05/new-accounts-window.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3957568972900173146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3957568972900173146'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/05/new-accounts-window.html' title='New Accounts window'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RmbcIB8klGo/ShMT2FgyYJI/AAAAAAAAAAM/vEoYQ0iDesM/s72-c/your-accounts-1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-434102753720687597</id><published>2009-04-29T05:56:00.000-07:00</published><updated>2009-04-29T23:28:18.406-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Broken server</title><content type='html'>Out server is broken now ;( It means no access to our web page, Wiki, Forum, Mantis, even SVN... What is worse: we cannot reach admins of the machine... Maybe it is time to think about mirroring on SourceForge or on Google Code? And to move development from SVN to git?&lt;br /&gt;&lt;br /&gt;And of course this had to happen when we got Season of Usability slot... Sigh.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: server is online again! It was only broken net connection, so no backup restore needed ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-434102753720687597?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/434102753720687597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/04/broken-server.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/434102753720687597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/434102753720687597'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/04/broken-server.html' title='Broken server'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7011023510107495182</id><published>2009-04-27T02:36:00.000-07:00</published><updated>2009-04-28T13:34:17.735-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Season of Usability</title><content type='html'>I have a good news from our Usability Team:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Kadu accepted as a Season of Usability project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://season.openusability.org/" target="_blank"&gt;&lt;span style="font-weight: bold;"&gt;Season of Usability&lt;/span&gt;&lt;/a&gt; is a series of sponsored student projects to encourage students of usability, user-interface design, and interaction design to get involved with Free/Libre/Open-Source Software (FLOSS) projects. Inspired by Google's &lt;a href="http://code.google.com/summerofcode.html" target="_blank"&gt;Summer of Code&lt;/a&gt;, &lt;a href="http://www.openusability.org/" target="_blank"&gt;OpenUsability&lt;/a&gt; offers sponsored student projects. The Season of Usability 2009, sponsored by Google and Canonical, will be supporting 10 students to work on 10 open source projects during the June 1 - August 31 2009 season.&lt;br /&gt;&lt;br /&gt;Kadu has been accepted as one of the projects. If you want to apply and work on our &lt;a href="http://www.kadu.net/w/Usability" target="_blank"&gt;Usability Project&lt;/a&gt;) find out the details at the &lt;a href="http://season.openusability.org/index.php/projects" target="_blank"&gt;Season of Usability 2009 website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Joanna "akai" Pierożek&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7011023510107495182?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7011023510107495182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/04/season-of-usability.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7011023510107495182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7011023510107495182'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/04/season-of-usability.html' title='Season of Usability'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-6435899199099066408</id><published>2009-04-19T14:40:00.000-07:00</published><updated>2009-04-26T23:54:07.490-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Status updates</title><content type='html'>&lt;ul&gt;&lt;li&gt;Code a lot more stable that before ;) Almost everyday-usable (if you do not count modules...)&lt;/li&gt;&lt;li&gt;Gadu descriptions now properly decoded&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Work on "Your accounts" window was started - it will allow users to configure their accounts (add, edit, delete). Mockups are available at &lt;a href="http://www.kadu.net/w/Usability/Workshop/MultiUI_Prototypes"&gt;our wiki page&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;New class added: &lt;span style="font-family:courier new;"&gt;ContactSet&lt;/span&gt; (based on &lt;span style="font-family:courier new;"&gt;QSet&lt;/span&gt;). It will replace &lt;span style="font-family:courier new;"&gt;ContactList&lt;/span&gt; in many places.&lt;/li&gt;&lt;li&gt;Managers are now lazy-loading.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;ConfigurationManager&lt;/span&gt; class added - it stores list of classes, that wants to save themselves before aplication exits (like &lt;span style="font-family:courier new;"&gt;AccountManager&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Many signals in &lt;span style="font-family:courier new;"&gt;ContactManager&lt;/span&gt; added - to allow watching for contact data changes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;ChatWidgetManager&lt;/span&gt; will be added, replacing old ChatManager (that was renamed recently to ChatManagerOld [sic]).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-6435899199099066408?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/6435899199099066408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/04/status-updates.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/6435899199099066408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/6435899199099066408'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/04/status-updates.html' title='Status updates'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-36951290556057510</id><published>2009-04-01T11:06:00.000-07:00</published><updated>2009-04-01T15:48:49.857-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>0.6.6 in middle of the way</title><content type='html'>Kadu 0.6.6 is now half done. I've decided to stop adding new features and reorganizing/rewriting code and to focus on stabilization and functionality that was lost in the development process after 0.6.5 (excluding modules, only core counts). So everyone is encouraged to get the last SVN snapshot and test it. I would like to have a stable version in a week or two, before the next part of API will go under review (the less important part).&lt;br /&gt;&lt;br /&gt;We've done a summary of changes (done so far) on our &lt;a href="http://www.kadu.net/forum/viewtopic.php?f=6&amp;amp;t=9782"&gt;forum&lt;/a&gt;. Here it is translated:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gadu protocol moved to gadu_protocol module;&lt;/li&gt;&lt;li&gt;kadu-core directory splitted, files moved to subdirectories;&lt;/li&gt;&lt;li&gt;splitted big classes (Kadu -&gt; KaduWindow, Core, KaduWindowActions, StatusMenu, StatusButton);&lt;/li&gt;&lt;li&gt;notify and window_notify modules moved to core;&lt;/li&gt;&lt;li&gt;static objects reimplemented as singletons (e.g. AccountsManager::instance());&lt;/li&gt;&lt;li&gt;a lot of new API to support multiple protocols: Account, Contact, AccountsManager, ContactsManager, ProtocolFactory, ContactAccountDat and many more;&lt;/li&gt;&lt;li&gt;UserListElement/UserListElements replaced by Contact/ContactList and probably ContactSet in nearest future;&lt;/li&gt;&lt;li&gt;services extracted from Protocol class, every implementor can just implement a subset of them - like Chat of FileTransfer;&lt;/li&gt;&lt;li&gt;Qt3Support removed, contacts list is MVC now;&lt;/li&gt;&lt;li&gt;Chat concept introduced (chat with one contact, GG conferences, IRC chatroom, XMPP chatroom - everything is a Chat), contacts list will be transfered into chat list in fututre;&lt;/li&gt;&lt;li&gt;simpler classes to support configuration storing (StorableObject, UuidStorableObject);&lt;/li&gt;&lt;li&gt;Adium chat styles support (with possibility to add more styles engines);&lt;/li&gt;&lt;li&gt;better X11 integration (by ultra);&lt;/li&gt;&lt;li&gt;idle module for supporting autoaway and similar modules (no more /proc reading);&lt;/li&gt;&lt;li&gt;better, splited menu (3 submenus);&lt;/li&gt;&lt;li&gt;extended group management (adding, removing, changing name and so on);&lt;/li&gt;&lt;li&gt;tlen and jabber modules added (Juzef, uzi);&lt;/li&gt;&lt;li&gt;a lot more.&lt;/li&gt;&lt;/ul&gt;And it's just half of the things that needs to be done...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Proof-read by Stiep&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-36951290556057510?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/36951290556057510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/04/066-in-middle-of-way.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/36951290556057510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/36951290556057510'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/04/066-in-middle-of-way.html' title='0.6.6 in middle of the way'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-1057126623202631092</id><published>2009-03-23T03:15:00.000-07:00</published><updated>2009-03-30T02:37:41.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Notifications</title><content type='html'>For the last few days I've been splitting the big &lt;span style="font-family:courier new;"&gt;Kadu&lt;/span&gt; god-class. It has so much code, that it's enough to make five other classes (&lt;span style="font-family:courier new;"&gt;Core&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;KaduWindow&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;KaduWindowActions&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;StatusMenu&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;StatusButton&lt;/span&gt;) and I think I could split it even more! &lt;span style="font-family:courier new;"&gt;Core&lt;/span&gt; (with &lt;span style="font-family: courier new;"&gt;Core::instance()&lt;/span&gt;) manages starting/stopping the application and setting/getting the current status. KaduWindow only implements gui of the main window... It is now closer to one-class one-purpose principle.&lt;br /&gt;&lt;br /&gt;The next task is to move notify and notify_window code from modules to core. There are many places in kadu_core that could use notify capabilities and I don't see any reason to forbid that (and it will allow us to remove the &lt;span style="font-family:courier new;"&gt;MessageBox&lt;/span&gt; class).&lt;br /&gt;&lt;br /&gt;I think our notify system is quite powerful, it supports many back-ends (like showing windows, playing sound, showing hints...) and it allows placing actions inside notifications. The only thing it is lacking is showing a value, e.g. a progress bar for file transfers. If we add it, it could be possible to integrate our notify system with KDE or GNOME notifications.&lt;br /&gt;&lt;br /&gt;A little bit about our system: it consists of two base classes, i.e. &lt;span style="font-family:courier new;"&gt;Notification&lt;/span&gt; (for a messages being displayed to the user) and &lt;span style="font-family:courier new;"&gt;Notifier&lt;/span&gt; (for backends), and the &lt;span style="font-family:courier new;"&gt;NotificationManager&lt;/span&gt; class (for managing the two former).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Notification&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you want to create a message for the user, you should use the &lt;span style="font-family:courier new;"&gt;Notification&lt;/span&gt; class (or one of its descenders). Each notification has a name (e.g.: "newChat", "incomingFile", "connectionError") that identifies an event (notifications are configurable by name). Other properties are: title (used in &lt;span style="font-family:courier new;"&gt;WindowNotifier&lt;/span&gt;), text (content displayed to user, e.g. "New message from XYZ"), details (less important data, e.g. content of message sent to us), list of contacts and of course an icon.&lt;br /&gt;&lt;br /&gt;Many notifications depend on the currently used account (e.g. "connectionError"). For those notifications the &lt;span style="font-family:courier new;"&gt;AccountNotification&lt;/span&gt; class should be used. Of course you could extend any of these classes to add new information, but not every notifier will be aware of them.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family:courier new;"&gt;Notification&lt;/span&gt; class has a concept of 'callbacks' - it's a list of actions that a user can perform (e.g.: 'accept' and 'ignore' on the 'incomingFile' notification). The only way to create a notification with a callback is to create a new class with slots for each action and call &lt;span style="font-family:courier new;"&gt;addCallback(tr("Action description"), SLOT(...))&lt;/span&gt;. You can also call &lt;span style="font-family:courier new;"&gt;setDefaultCallback(int timeout, SLOT(...))&lt;/span&gt; so the user won't have to decide by herself or himself. If you would want to receive only the default callbacks 'accepted' and 'discard' (e.g. generated by left and right-clicking on hint), then just overwrite the &lt;span style="font-family:courier new;"&gt;callbackAccept&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;callbackDiscard&lt;/span&gt; virtual methods.&lt;br /&gt;&lt;br /&gt;Also, notifications can live for some time. Every notifier can 'acquire' notification, so it won't be deleted until every 'acquirement' is canceled with 'release'. Sound notifiers do not 'acquire', but window and hint do. As long as the &lt;span style="font-family:courier new;"&gt;Notification&lt;/span&gt; is alive, it can be changed, but as I can see now, no signal is emitted. I consider it a flaw (look how the hints module appends new messages to hint...).&lt;br /&gt;&lt;br /&gt;The last thing to know about notifications is that they need to be registered (so users can edit settings for each of them individually). It is done by &lt;span style="font-family:courier new;"&gt;NotificationManager::registerEvent&lt;/span&gt; and you can unregister it (for example if your module gets unloaded) by &lt;span style="font-family:courier new;"&gt;NotificationManager::unregisterEvent&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Notifiers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For implementing a new notifier, you should create descendant from the &lt;span style="font-family:courier new;"&gt;Notifier&lt;/span&gt; class with an overridden method &lt;span style="font-family:courier new;"&gt;notify(Notification *)&lt;/span&gt; (and register it with &lt;span style="font-family:courier new;"&gt;NotificationManager::registerNotifier)&lt;/span&gt;. If your notifier will support callbacks, re-implement &lt;span style="font-family:courier new;"&gt;CallbackCapacity callbackCapacity()&lt;/span&gt; too (and return &lt;span style="font-family:courier new;"&gt;CallbackSupported&lt;/span&gt; there). You will also need to use &lt;span style="font-family:courier new;"&gt;notification-&gt;acquire()&lt;/span&gt; if it will display/update the notification content/icon anywhere. Of course after the notification has hidden use &lt;span style="font-family:courier new;"&gt;notification-&gt;release() &lt;/span&gt;to free memory.&lt;br /&gt;&lt;br /&gt;If notifier can be configured, you should also re-implement &lt;span style="font-family:courier new;"&gt;NotifierConfigurationWidget *createConfigurationWidget(QWidget *)&lt;/span&gt; - it should return a new instance of the new class descending from &lt;span style="font-family:courier new;"&gt;NotifierConfigurationWidget&lt;/span&gt;. The most important function to re-implement is &lt;span style="font-family:courier new;"&gt;switchToEvent(const QString &amp;amp;)&lt;/span&gt;. It should save the state of the currently edited event and display the state of the new one - given its method arguments.&lt;br /&gt;&lt;br /&gt;In the end, &lt;span style="font-family:courier new;"&gt;saveNotifyConfiguration&lt;/span&gt; should store all changes made by the user in the configuration file.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Proof-read by Stiep&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-1057126623202631092?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/1057126623202631092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/03/notifications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1057126623202631092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/1057126623202631092'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/03/notifications.html' title='Notifications'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-8783578564821642339</id><published>2009-03-18T16:02:00.000-07:00</published><updated>2009-03-19T03:58:24.114-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Summer Of Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>GSOC updates</title><content type='html'>Google rejected us ;(&lt;br /&gt;How sad. So we will have to do some of our projects without their support.&lt;br /&gt;Maybe next year... When we will have XMPP support and Kadu will be more recognizable in the world ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-8783578564821642339?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/8783578564821642339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/03/gsoc-updates.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8783578564821642339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8783578564821642339'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/03/gsoc-updates.html' title='GSOC updates'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-4170768039341370871</id><published>2009-03-18T03:10:00.000-07:00</published><updated>2009-03-18T05:44:35.914-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Summer Of Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Status updates</title><content type='html'>No big changes recently in Kadu code (lack of time as usuall), but there are some things I would like to share:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;we've got new developer - Juzef (&lt;a href="http://juzef.idl.pl/"&gt;http://juzef.idl.pl/&lt;/a&gt;) got full read-write access to Kadu svn repository, congratulations ;)&lt;/li&gt;&lt;li&gt;we've applied for Google Summer Of Code 2009 (our submission is still not verified), there is list of our ideas: &lt;a href="http://www.kadu.net/w/GSOC2009"&gt;http://www.kadu.net/w/GSOC2009&lt;/a&gt; - of course anyone can start working on it, even if Google does not want us ;(&lt;/li&gt;&lt;li&gt;big &lt;span style="font-family:courier new;"&gt;Kadu &lt;/span&gt;class will be splited into &lt;span style="font-family:courier new;"&gt;KaduWindow&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Core&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;CoreActions &lt;/span&gt;and maybe some others; mixing GUI logic with main class of Kadu is not a good idea (something like &lt;a href="http://en.wikipedia.org/wiki/God_object"&gt;God Object&lt;/a&gt; antipattern)&lt;/li&gt;&lt;li&gt;Chat concept appeared, it will allows to have Gadu-Gadu conferences on contact list and not only that ;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-4170768039341370871?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/4170768039341370871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/03/status-updated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4170768039341370871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4170768039341370871'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/03/status-updated.html' title='Status updates'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3168803660623533034</id><published>2009-03-11T02:43:00.000-07:00</published><updated>2009-03-11T04:08:12.376-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Signals, slots and ignoring OOP principies</title><content type='html'>Refactoring of gadu_protocol module is now in cleanup mode. There are still some missing things, like DCC not supporting NAT connections, DCC configuration is not moved to Account settings page and so on...&lt;br /&gt;&lt;br /&gt;I had some thoughts that I've got while I did the refactoring: about signals and slots overuse in gadu_protocol code. This Qt extension of C++ is supposed to help programmers with connecting events that happens on one object with actions that another object should perform when an event is triggered. The overuse occurs when the connection is always one-to-one and we know that no another object ever will try to connect to these slots or signals. Just like in gadu_protocol - classes like &lt;span style="font-family: courier new;"&gt;GaduProtocol&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;GaduProtocolSocketNotifiers&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;DccManager&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;DccSocketNotifiers &lt;/span&gt;were communicating with each other using this, but I think it is not the optimal solution. It needs connecting these objects (this is a lot of code to write!) and signals-slots invoking is really very slow (I know it is not a concern because of small frequency of these calls in protocol classes, but I still does not like this solution).&lt;br /&gt;&lt;br /&gt;I've got into conclusion that these classes are really an one big class that is just split for convenience. So I've removed signal-slots where it was possible and made these classes each ones friends. They can now access private members of each other ;) In the result, it is easier now to understand how this whole group works together. We did not lost any of flexibility, because there was not any either (you cannot just extend a closed communication protocol like this).&lt;br /&gt;&lt;br /&gt;This is not very good solution from view of OOP (no accessors, just friend classes), but it is the best one for my simple mind ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3168803660623533034?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3168803660623533034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/03/signals-slots-and-ignoring-oop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3168803660623533034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3168803660623533034'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/03/signals-slots-and-ignoring-oop.html' title='Signals, slots and ignoring OOP principies'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-2694477102736273877</id><published>2009-03-02T15:06:00.000-08:00</published><updated>2009-03-02T15:10:25.243-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DCC'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Sending files</title><content type='html'>Kadu trunk can now send and receive files. Dcc6 and Dcc7 are supported. NAT to NAT Dcc7 connections will not work (libgadu issue). I've not checked Dcc6 callback connections (public-ip to NAT). If anyone has Gadu Gadu 6.x and is behind NAT - please contact with me on Kadu forum, so we can test this too.&lt;br /&gt;&lt;br /&gt;What is left? Notify-based questions (accept file/reject file) and merging new file transfers with old ones (like sending rest of the same file in another session).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-2694477102736273877?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/2694477102736273877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/03/sending-files.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/2694477102736273877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/2694477102736273877'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/03/sending-files.html' title='Sending files'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-834525738572479275</id><published>2009-02-28T05:32:00.000-08:00</published><updated>2009-02-28T05:37:48.261-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DCC'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Receiving files</title><content type='html'>Gadu protocol can now receive files (again) - in Dcc6 mode ;) It now uses &lt;span style="font-family:courier new;"&gt;FileTransferService&lt;/span&gt; to do that. Now it needs support for incoming transfers from Gadu Gadu 7 and newer and support for outcoming transfers; file_transfer modue will get all functionality of old dcc module (like asking for accepting incoming connection) and everybody will be happy now.&lt;br /&gt;&lt;br /&gt;I've also found (and fixed) some fundamental mistakes in whole SocketNotifiers code. I hope now file transfers will be more reliable (eg: will work 100% of the time).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-834525738572479275?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/834525738572479275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/02/reciving-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/834525738572479275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/834525738572479275'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/02/reciving-files.html' title='Receiving files'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-726488016023306179</id><published>2009-02-23T14:27:00.001-08:00</published><updated>2009-02-26T03:59:13.964-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>New (alternative) configuration API</title><content type='html'>When I was updating Contacts API, then Accounts API and some more Kadu APIs ;) I've realized that current configuration API needs too much code to use. You basically have to use QXml to do anything more complicated that write one simple value (&lt;span style="font-family:courier new;"&gt;config_file.writeEntry()&lt;/span&gt; is not always good enough).&lt;br /&gt;&lt;br /&gt;Contacts, Accounts, File Transfers are complicated structures that needs simple API to save/restore (some kind of serialization). This API is now provided by &lt;span style="font-family:courier new;"&gt;StorableObject&lt;/span&gt; class (I think I'll rename it to &lt;span style="font-family:courier new;"&gt;Persistent&lt;/span&gt; or &lt;span style="font-family:courier new;"&gt;PersistentObject &lt;/span&gt; in API-review time). Class that need to be stored (persistent) must inherit from &lt;span style="font-family:courier new;"&gt;StorableObject&lt;/span&gt;. It only requires reimplementation of one method:&lt;span style="font-family:courier new;"&gt; virtual StoragePoint * createStoragePoint() const&lt;/span&gt;, where &lt;span style="font-family:courier new;"&gt;StoragePoint&lt;/span&gt; class contains pointer to &lt;span style="font-family:courier new;"&gt;XmlConfigFile&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;QDomElement&lt;/span&gt; that is root node for storing this object's configuration.&lt;br /&gt;&lt;br /&gt;For example, &lt;span style="font-family:courier new;"&gt;ContactData&lt;/span&gt; class implements it as:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;StoragePoint *parent = ContactManager::instance()-&gt;storage();&lt;br /&gt;if (!parent)&lt;br /&gt; return 0;&lt;br /&gt;&lt;br /&gt;QDomElement contactNode = parent-&gt;storage()-&gt;getUuidNode(parent-&gt;point(),&lt;br /&gt; "Contact", Uuid.toString());&lt;br /&gt;return new StoragePoint(parent-&gt;storage(), contactNode);&lt;br /&gt;&lt;/pre&gt;So we get new node under main &lt;span style="font-family:courier new;"&gt;ContactManager&lt;/span&gt; configuration tagged with the contact's Uuid. The &lt;span style="font-family:courier new;"&gt;storage()&lt;/span&gt; method is inherited and implemented in &lt;span style="font-family:courier new;"&gt;StorableObject&lt;/span&gt; class - it calls &lt;span style="font-family:courier new;"&gt;createStoragePoint&lt;/span&gt; when needed.&lt;br /&gt;&lt;br /&gt;Implementation of &lt;span style="font-family:courier new;"&gt;createStoragePoint&lt;/span&gt;  in &lt;span style="font-family:courier new;"&gt;ContactManager&lt;/span&gt;:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;QDomElement contactsNewNode = xml_config_file-&gt;getNode("ContactsNew");&lt;br /&gt;return new StoragePoint(xml_config_file, contactsNewNode);&lt;br /&gt;&lt;/pre&gt;It creates ContactsNew node under root node of main configuration file.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;StorableObject&lt;/span&gt; supports external setting of &lt;span style="font-family:courier new;"&gt;StoragePoint&lt;/span&gt; - see &lt;span style="font-family:courier new;"&gt;setStorage()&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;When we have all of that nice stuff, we can store object. For example, &lt;span style="font-family:courier new;"&gt;FileTransfer&lt;/span&gt; storage looks like that:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;void FileTransfer::storeConfiguration()&lt;br /&gt;{&lt;br /&gt; if (!isValidStorage())&lt;br /&gt;   return;&lt;br /&gt;&lt;br /&gt; storeValue("Account", CurrentAccount-&gt;uuid().toString());&lt;br /&gt; storeValue("Peer", Peer.uuid().toString());&lt;br /&gt; storeValue("LocalFileName", LocalFileName);&lt;br /&gt; storeValue("RemoteFileName", RemoteFileName);&lt;br /&gt; storeValue("TransferType", TypeSend == TransferType ? "Send" : "Receive");&lt;br /&gt; storeValue("FileSize", (qulonglong)FileSize);&lt;br /&gt; storeValue("TransferredSize", (qulonglong)TransferredSize);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Condition !isValidStorage() check if storage point exist, if not, it creates it (with all the needed hierarchy). It if fails, it returns &lt;span style="font-family:courier new;"&gt;false&lt;/span&gt; - we cannot do anything here about it. After that we store all values needed to recreate object in future. &lt;span style="font-family:courier new;"&gt;storeValue()&lt;/span&gt; method of &lt;span style="font-family:courier new;"&gt;StorableObject&lt;/span&gt; class writes data to subnodes of &lt;span style="font-family:courier new;"&gt;StoragePoint&lt;/span&gt; of this object (BTW: this method is not completed yet, it does not store objects Uuid, and I think that should be done be &lt;span style="font-family:courier new;"&gt;StorableObject&lt;/span&gt; or &lt;span style="font-family:courier new;"&gt;StorableObjectWithUuid&lt;/span&gt; class).&lt;br /&gt;&lt;br /&gt;Loading object is possible when &lt;span style="font-family:courier new;"&gt;setStorage()&lt;/span&gt; method was called from somewhere (object does not know anything about its &lt;span style="font-family:courier new;"&gt;StoragePoint&lt;/span&gt; before loading). Then we could do:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;void FileTransfer::loadConfiguration()&lt;br /&gt;{&lt;br /&gt; if (!isValidStorage())&lt;br /&gt;   return;&lt;br /&gt;&lt;br /&gt; CurrentAccount = AccountManager::instance()-&gt;byUuid(QUuid(loadValue&amp;lt;QString&amp;gt;("Account")));&lt;br /&gt; Peer = ContactManager::instance()-&gt;byUuid(QUuid(loadValue&amp;lt;QString&amp;gt;("Peer")));&lt;br /&gt; LocalFileName = loadValue&amp;lt;QString&amp;gt;("LocalFileName");&lt;br /&gt; RemoteFileName = loadValue&amp;lt;QString&amp;gt;("RemoteFileName");&lt;br /&gt; TransferType = ("Send" == loadValue&amp;lt;QString&amp;gt;("TransferType")) ? TypeSend : TypeReceive;&lt;br /&gt; FileSize = loadValue&amp;lt;qulonglong&amp;gt;("FileSize");&lt;br /&gt; TransferredSize = loadValue&amp;lt;qulonglong&amp;gt;("TransferredSize");&lt;br /&gt;}&lt;/pre&gt;Everyting is as simple as possible.&lt;br /&gt;&lt;br /&gt;And who sets the &lt;span style="font-family:courier new;"&gt;StoragePoint&lt;/span&gt;? &lt;span style="font-family:courier new;"&gt;FileTransferManager&lt;/span&gt;:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;StoragePoint *fileTransferStoragePoint =&lt;br /&gt; new StoragePoint(configurationStorage, fileTransferElement);&lt;br /&gt;FileTransfer *fileTransfer =&lt;br /&gt; FileTransfer::loadFromStorage(fileTransferStoragePoint);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The static method &lt;span style="font-family:courier new;"&gt;loadFromStorage&lt;/span&gt; does some magic to determine which &lt;span style="font-family:courier new;"&gt;Account&lt;/span&gt; this &lt;span style="font-family:courier new;"&gt;FileTransfer&lt;/span&gt; belongs to. Then it creates empty &lt;span style="font-family:courier new;"&gt;FileTransfer&lt;/span&gt; for this &lt;span style="font-family:courier new;"&gt;Account&lt;/span&gt; and calls something like this (for Gadu):&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;GaduFileTransfer *gft = new GaduFileTransfer(Protocol-&gt;account());&lt;br /&gt;gft-&gt;setStorage(fileTransferStoragePoint);&lt;br /&gt;gft-&gt;loadConfiguration();&lt;br /&gt;&lt;/pre&gt;Done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-726488016023306179?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/726488016023306179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/02/new-alternative-configuration-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/726488016023306179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/726488016023306179'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/02/new-alternative-configuration-api.html' title='New (alternative) configuration API'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-5489282439588191028</id><published>2009-02-20T15:19:00.000-08:00</published><updated>2009-02-20T15:23:23.336-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Dcc Porting</title><content type='html'>I'm in hell now. I've got working &lt;span style="font-family: courier new;"&gt;ChatService&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;ChatImagerService&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;PersonalInfoService&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;ContactListService&lt;/span&gt; and almost-working &lt;span style="font-family: courier new;"&gt;SerachService&lt;/span&gt;... But the &lt;span style="font-family: courier new;"&gt;FileTransferService&lt;/span&gt; need so much porting of DCC module, that I'm starting to cry... The worst part is that I've rewritten it before.&lt;br /&gt;&lt;br /&gt;The good news is that White Eagle is writing Adium chat styles support for Kadu ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-5489282439588191028?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/5489282439588191028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/02/dcc-porting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/5489282439588191028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/5489282439588191028'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/02/dcc-porting.html' title='Dcc Porting'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-7531665542404854056</id><published>2009-02-12T15:01:00.000-08:00</published><updated>2009-02-12T15:46:00.700-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>ULEs removed</title><content type='html'>I've finally managed to remove last uses of &lt;span style="font-family:courier new;"&gt;UserListElement&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;UserListElements&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;UserGroup&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;UserList&lt;/span&gt; in Kadu (not including modules, but it is work for post-alpha releases).&lt;br /&gt;&lt;br /&gt;Uzi is working on new &lt;span style="font-family:courier new;"&gt;ContactDataWindow&lt;/span&gt; (for editing contacts). After that we can restore contact management functionality - it is hard to use IM without that :(&lt;br /&gt;&lt;br /&gt;I'll work on removing &lt;span style="font-family:courier new;"&gt;UserStatus&lt;/span&gt; and renaming &lt;span style="font-family:courier new;"&gt;Status&lt;/span&gt; to &lt;span style="font-family:courier new;"&gt;Presence&lt;/span&gt;. After that - rest of Gadu-Gadu protocol refactorisations (&lt;span style="font-family:courier new;"&gt;FileTransferService&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;VoiceService&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;SearchService&lt;/span&gt;...).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-7531665542404854056?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/7531665542404854056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/02/ules-removed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7531665542404854056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/7531665542404854056'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/02/ules-removed.html' title='ULEs removed'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-335023357946126013</id><published>2009-02-12T02:53:00.000-08:00</published><updated>2009-02-12T04:12:47.525-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Protocol services</title><content type='html'>Some more thoughts about refactorisation of &lt;span style="font-family:courier new;"&gt;Protocol&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;GaduProtocol&lt;/span&gt; classes. When I was extracting contact list export-import functionality from &lt;span style="font-family:courier new;"&gt;GaduProtocol&lt;/span&gt;, I've got an excellent idea about how-to-split the whole big class into smaller ones. It is very simple and widelly used in other projects (so why did't I thought about it before?).&lt;br /&gt;&lt;br /&gt;We will have services: &lt;span style="font-family:courier new;"&gt;ContactListService&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;ChatService&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;FileTransferService&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;VoiceService&lt;/span&gt; and many others. Each of these will be an abstract class (call it an interface). &lt;span style="font-family:courier new;"&gt;Protocol&lt;/span&gt; class will implement methods like &lt;span style="font-family:courier new;"&gt;ChatService * chatService()&lt;/span&gt; - it will return &lt;span style="font-family:courier new;"&gt;0&lt;/span&gt; (no service implementation) by default. &lt;span style="font-family:courier new;"&gt;GaduProtocol&lt;/span&gt; for example will return &lt;span style="font-family:courier new;"&gt;GaduChatService&lt;/span&gt; object created in &lt;span style="font-family:courier new;"&gt;GaduProtocol&lt;/span&gt;'s contructor.&lt;br /&gt;&lt;br /&gt;Advantages? Smaller classes, possibility to query protocols for capabilities (if &lt;span style="font-family:courier new;"&gt;chatService() == 0&lt;/span&gt; we cannot chat by this protocol, &lt;span style="font-family:courier new;"&gt;fileTransferService() == 0&lt;/span&gt; - we cannot send/receive files).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-335023357946126013?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/335023357946126013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/02/protocol-services.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/335023357946126013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/335023357946126013'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/02/protocol-services.html' title='Protocol services'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-506545562021322519</id><published>2009-02-10T11:48:00.000-08:00</published><updated>2009-02-10T16:15:26.952-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Sometimes a function can became a class...</title><content type='html'>...and it happens after the function became too big (or complicated). Like account-management functions for &lt;span style="font-family:courier new;"&gt;GaduProtocol&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;registerAccount&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;unregisterAccount&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;remindPassword&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;changePassword&lt;/span&gt;). Each of these functions used &lt;span style="font-family:courier new;"&gt;getToken&lt;/span&gt; function and a &lt;span style="font-family:courier new;"&gt;Mode&lt;/span&gt; field of &lt;span style="font-family:courier new;"&gt;GaduProtocol&lt;/span&gt; object, so the &lt;span style="font-family:courier new;"&gt;getToken&lt;/span&gt; could choose right function to call after its work was done (it works asynchronically). And each of these has own slot!&lt;br /&gt;&lt;br /&gt;Why I don't like this solution? Without true reason it adds a new state field to &lt;span style="font-family:courier new;"&gt;GaduProtocol&lt;/span&gt; class - &lt;span style="font-family:courier new;"&gt;Mode&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;Register&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Unregister&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;RemindPassword&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;ChangePassword&lt;/span&gt;). It makes &lt;span style="font-family:courier new;"&gt;GaduProtocol&lt;/span&gt; do things that are not really involved with normal IM communication - account management. It uses copy-and-pasted code, becouse these methods are nearly identical.&lt;br /&gt;&lt;br /&gt;So I've decided to promote each of this funtion to a class of its own. With, of course, one base class: &lt;span style="font-family:courier new;"&gt;GaduServerConnector&lt;/span&gt; (ok, the name suck, it will be changed when I found a better one). This class does most of the work: it connects to server, fetches token (captcha) image, asks user for token value (using external object for that, so method of asking can be changed) and calls abstract method &lt;span style="font-family:courier new;"&gt;performAction(tokenId, tokenValue)&lt;/span&gt;. Classes like &lt;span style="font-family:courier new;"&gt;GaduServerRegisterAccount&lt;/span&gt; (this name sucks too) only implement &lt;span style="font-family:courier new;"&gt;performAction&lt;/span&gt; method (and should call &lt;span style="font-family:courier new;"&gt;finished(bool)&lt;/span&gt;, so &lt;span style="font-family:courier new;"&gt;GaduServerConnector&lt;/span&gt; can emit a signal for higher level code).&lt;br /&gt;&lt;br /&gt;For example (there is only one right now) &lt;span style="font-family:courier new;"&gt;GaduServerRegisterAccount&lt;/span&gt; implements &lt;span style="font-family:courier new;"&gt;performAction&lt;/span&gt; using &lt;span style="font-family:courier new;"&gt;gg_register3&lt;/span&gt; libgadu function. It wraps the connection in &lt;span style="font-family:courier new;"&gt;GaduPubdirSocketNotifiers&lt;/span&gt; and connects to its signal: &lt;span style="font-family:courier new;"&gt;done(bool, gg_http *)&lt;/span&gt;. So after registration if over, it receives that signal and sets its &lt;span style="font-family:courier new;"&gt;Uin&lt;/span&gt; field. The caller can then read &lt;span style="font-family:courier new;"&gt;GaduServerConnector::Result&lt;/span&gt; field (so it knows if it was successfully) and the &lt;span style="font-family:courier new;"&gt;GaduPubdirSocketNotifiers::Uin&lt;/span&gt; (so it knows id of the newly registered account). Voila.&lt;br /&gt;&lt;br /&gt;It makes &lt;span style="font-family:courier new;"&gt;GaduProtocol&lt;/span&gt; smaller and the flow of Register/Unregister/RemindPassword/ChangePassword a lot simples (I hope so...).&lt;br /&gt;&lt;br /&gt;BTW: it still don't work, it segfaults every time. But it is just a technical problem, not design one.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;UPDATE&lt;/span&gt;: I've fixed the crash. Registration does not work because (as I think) we are no longer compatible with GG protocol. I'll fix that later.&lt;br /&gt;&lt;br /&gt;Is there somebody who wants to promote last 3 functions to objects?&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;UPDATE 2&lt;/span&gt;: I've found error with registration - it was just sending 2x password instead of password and e-mail ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-506545562021322519?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/506545562021322519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/02/sometimes-function-can-became-class.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/506545562021322519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/506545562021322519'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/02/sometimes-function-can-became-class.html' title='Sometimes a function can became a class...'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-9060468945901595588</id><published>2009-02-03T02:03:00.000-08:00</published><updated>2009-02-03T10:06:27.461-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Time for GaduProtocol</title><content type='html'>Unfortunately it is impossible to do full ULE to &lt;span style="font-family:courier new;"&gt;ContactList&lt;/span&gt; transition without making some changes in Gadu-Gadu protocol implementation. Code responsible for exporting/importing list of contacts depends on old classes. So I had a look into &lt;span style="font-family:courier new;"&gt;gadu_protocol&lt;/span&gt; module and...&lt;br /&gt;&lt;br /&gt;And I started refactoring it a bit. I know I've done it about year ago, but now I see that it was not well done: files and classes are too large. Some method also. Yesterday three classes were moved to their own files. Next step require removing all references to old &lt;span style="font-family:courier new;"&gt;UserStatus&lt;/span&gt; (and &lt;span style="font-family:courier new;"&gt;GaduUserStatus&lt;/span&gt; classes) and replacing it with the brand-new &lt;span style="font-family:courier new;"&gt;Status&lt;/span&gt; class.&lt;br /&gt;&lt;br /&gt;But what was wrong with &lt;span style="font-family:courier new;"&gt;UserStatus&lt;/span&gt;? It does tasks that only &lt;span style="font-family:courier new;"&gt;Protocol&lt;/span&gt; class should have: it has slots, signals (for informing it was changed). Both protocol classes and Kadu main class conencted to it. The code flow:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Kadu: &lt;span style="font-family: courier new;"&gt;protocol-&gt;writeableStatus().setStatus(newStatus)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Status: &lt;span style="font-family: courier new;"&gt;emit goOnline("description")&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Protocol: &lt;span style="font-family: courier new;"&gt;slot iWantGoOnline("description")&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Protocol: communication with server&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Protocol: &lt;span style="font-family: courier new;"&gt;CurrentStatus-&gt;setStatus(newStatus)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;CurrentStatus &lt;span style="font-family: courier new;"&gt;emit goOnline("description")&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Kadu: &lt;span style="font-family: courier new;"&gt;wentOnline("description")&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Many unnecessary slots/signals. The right way to do it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Kadu: &lt;span style="font-family: courier new;"&gt;protocol-&gt;setStatus(newStatus)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Protocol: communication with server&lt;/li&gt;&lt;li&gt;Protocol: &lt;span style="font-family: courier new;"&gt;emit statusChanged(newStatus)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;We need the &lt;span style="font-family: courier new;"&gt;statusChanged&lt;/span&gt; signal, because the status setting can be asynchronous.&lt;br /&gt;&lt;br /&gt;So the &lt;span style="font-family: courier new;"&gt;Status&lt;/span&gt; class is now very lightweight and does just what it should do - stores 2 pieces of data. &lt;span style="font-family: courier new;"&gt;Protocol&lt;/span&gt; and &lt;span style="font-family: courier new;"&gt;Kadu&lt;/span&gt; classes lost lot of signals and slots. And logic is much simpler ;)&lt;br /&gt;&lt;br /&gt;After I sort out the &lt;span style="font-family: courier new;"&gt;Status&lt;/span&gt; class I'll look if splitting &lt;span style="font-family: courier new;"&gt;GaduProtocol&lt;/span&gt; into smaller classes (like &lt;span style="font-family: courier new;"&gt;GaduConnection&lt;/span&gt;) makes sense - I just like small classes ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-9060468945901595588?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/9060468945901595588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/02/time-for-gaduprotocol.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/9060468945901595588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/9060468945901595588'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/02/time-for-gaduprotocol.html' title='Time for GaduProtocol'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-913790935965949565</id><published>2009-01-29T01:59:00.000-08:00</published><updated>2009-01-29T02:01:51.337-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>New developer</title><content type='html'>Yesterday Uzi got a SVN account. Now he is an official Kadu developer ;)&lt;br /&gt;&lt;br /&gt;He is working with Juzef on making Jabber/XMPP and Tlen protocols first-class citizens in Kadu - expect impressive results in next few months ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-913790935965949565?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/913790935965949565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/01/new-developer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/913790935965949565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/913790935965949565'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/01/new-developer.html' title='New developer'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-6421142452409634461</id><published>2009-01-26T04:04:00.000-08:00</published><updated>2009-01-27T08:47:22.888-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>How much does it need to change to make sure everything remains as before (or the ContactsListWidget story)</title><content type='html'>Old widget used to display list of contacts in main window and in chat widget (used with conferences) was named &lt;span style="font-family:courier new;"&gt;UserBox&lt;/span&gt;. This class survived the transition to Qt4 only because Q3Support module.  In 0.6.6 we want to remove dependency on Q3Support, and to add more functionality there (like support for meta-contacts, avatars, trees).&lt;br /&gt;&lt;br /&gt;So we've started to writing it from scratch (almost).&lt;br /&gt;&lt;br /&gt;&lt;span&gt;The first thing to do: extract usefull classes from &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;userbox.h&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;userbox.cpp&lt;/span&gt;&lt;span&gt; to its own files.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Result:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;AbstractToolTip&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;ToolTipClassManager &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;ContactsListWidgetMenuManager&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;The last one was part of &lt;span style="font-family:courier new;"&gt;UserBox &lt;/span&gt;class, but I think it is better to have it separated.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Second thing to do: write new widget.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Result:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/viewvc/trunk/kadu-core/gui/widgets/contacts-list-widget.cpp?revision=6097&amp;amp;view=markup"&gt;ContactsListWidget&lt;/a&gt; based on &lt;a href="http://doc.trolltech.com/4.4/qlistview.html"&gt;QListView&lt;/a&gt; - part of Qt4 Model/View framework.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/viewvc/trunk/kadu-core/contacts/model/contacts-model.cpp?revision=6108&amp;amp;view=markup"&gt;ContactsModel&lt;/a&gt; to feed data from ContactsManager to the new widget&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/viewvc/trunk/kadu-core/contacts/model/contacts-model-proxy.cpp?revision=6079&amp;amp;view=markup"&gt;ContactsModelProxy&lt;/a&gt; to sort and filter contacts beetwen ContactsModel and ContactsListWidgets&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kadu.net/viewvc/trunk/kadu-core/gui/widgets/contacts-list-widget-delegate.cpp?revision=6101&amp;amp;view=markup"&gt;ContactsListWidgetDelegate&lt;/a&gt; to paint contacts with icons description&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I can say that this whole Model/View thing totally kicks ass. Most of the work is done by Qt: we don't have to care about sorting (with its performance when many contacts change status in one time) - we only provide compare function and signals triggered when something changes on ContactsManager.&lt;br /&gt;&lt;br /&gt;Also the refreshing code in old UserBox was not very easy to follow - there was methods like refresh(), refreshLater(), refreshAll(), refreshAllLater() and complicated structures that allowed to avoid refreshing list if not neccessary. I'm glad we could remove all that code and just belive that Qt will do it better than us ;)&lt;br /&gt;&lt;br /&gt;For each ContactsListWidget in Kadu there is exactly one ContactsListWidgetDelegate object that paints items on list. In Kadu 0.6.6 for each item on each UserBox there was one KaduListBoxPixmap. So I hope our memory ussage is a little bit lower that before (I'll do some measurements after we have 0.6.6 out). Painting code is almost the same - the only difference is description handling. Qt4 provides QTextDocument that we now use for that - Kadu 0.6.5 had custom (and long) code to compute description height and to paint it wrapped. It is another thing that Qt is doing for us now.&lt;br /&gt;&lt;br /&gt;But it is not done yet:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sorting does not works as good as it should (random contacts are not-sorted)&lt;/li&gt;&lt;li&gt;filtering not yet implemented&lt;/li&gt;&lt;li&gt;support for only one column (maybe it will be possible to have more columns, i don't know yet)&lt;/li&gt;&lt;li&gt;drag&amp;amp;drop not yet implemented&lt;/li&gt;&lt;li&gt;background images not yet implemented&lt;/li&gt;&lt;/ul&gt;So if you have some time, please go to &lt;a href="http://www.kadu.net/forum"&gt;Kadu forum&lt;/a&gt; and ask how you can help ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-6421142452409634461?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/6421142452409634461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/01/how-much-does-it-need-to-change-to-make.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/6421142452409634461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/6421142452409634461'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/01/how-much-does-it-need-to-change-to-make.html' title='How much does it need to change to make sure everything remains as before (or the ContactsListWidget story)'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-3057956089464017111</id><published>2009-01-20T02:24:00.000-08:00</published><updated>2009-02-26T03:53:18.733-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Aware objects</title><content type='html'>"Aware objects" were created because of my laziness. In Kadu exists lot of objects that should change their behaviour/look when the configuration changes. The change invokes &lt;span style="font-family:courier new;"&gt;ConfigurationWindow::updateConfig()&lt;/span&gt; which (before introduction of &lt;span style="font-family:courier new;"&gt;ConfigurationAwareObject&lt;/span&gt; class) emited a signal.&lt;br /&gt;&lt;br /&gt;Each object that wanted to be informed about it had to connect to this signal. It needed a lot of code: slot implementation, connection in constructor, disconnection in destructor. To free myself from writing this I've created &lt;span style="font-family:courier new;"&gt;ConfigurationAwareObject&lt;/span&gt; class. It has very simple interface:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;class KADUAPI ConfigurationAwareObject&lt;br /&gt;{&lt;br /&gt;  static QList&amp;lt;ConfigurationAwareObject *&amp;gt; objects;&lt;br /&gt;&lt;br /&gt;  static void registerObject(ConfigurationAwareObject *object);&lt;br /&gt;  static void unregisterObject(ConfigurationAwareObject *object);&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;  static void notifyAll();&lt;br /&gt;&lt;br /&gt;  ConfigurationAwareObject();&lt;br /&gt;  virtual ~ConfigurationAwareObject();&lt;br /&gt;&lt;br /&gt;  virtual void configurationUpdated() = 0;&lt;br /&gt;&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The objects field contains list of all objects of this class. Its gets updated each time the &lt;span style="font-family:courier new;"&gt;ConfigurationAwareObject&lt;/span&gt; contructor or destructor is called.&lt;br /&gt;&lt;br /&gt;Static method &lt;span style="font-family:courier new;"&gt;notifyAll&lt;/span&gt; (called from &lt;span style="font-family:courier new;"&gt;ConfigurationWindow::updateConfig()&lt;/span&gt;) iterates over all objects and calls configurationUpdated on them.&lt;br /&gt;&lt;br /&gt;So if you need to create a class that reacts to changes in configuration just make it inherit from &lt;span style="font-family:courier new;"&gt;ConfigurationAwareObject&lt;/span&gt; and reimplement virtual method &lt;span style="font-family:courier new;"&gt;configurationUpdated()&lt;/span&gt;. No need to connect/disconnect signals and slots.&lt;br /&gt;&lt;br /&gt;In 0.6.6 &lt;span style="font-family:courier new;"&gt;AccountsAwareObject&lt;/span&gt; class was added with 2 abstract virtual methods: &lt;span style="font-family:courier new;"&gt;accountRegistered(Account *)&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;accountUnregistered(Account *)&lt;/span&gt; and two normal methods: &lt;span style="font-family:courier new;"&gt;triggerAllAccountsRegistered&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;triggerAllAccountsUnregistered&lt;/span&gt; (these two just call virtual methods with all currently active account).&lt;br /&gt;&lt;br /&gt;So if you want information about accounts changes - make a class inherit from &lt;span style="font-family:courier new;"&gt;AccountsAwareObject&lt;/span&gt; and reimplement virtual methods. Also add call to &lt;span style="font-family:courier new;"&gt;triggerAllAccountsRegistered&lt;/span&gt; in constructor and &lt;span style="font-family:courier new;"&gt;triggerAllAccountsUnregistered&lt;/span&gt; in destructor - so it will be aware of accounts that existed before the object was created.&lt;br /&gt;&lt;br /&gt;You could ask why &lt;span style="font-family:courier new;"&gt;triggerAllAccountsRegistered&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;triggerAllAccountsUnregistered&lt;/span&gt; are not called in AccountsAwareObject's constructor/destructor. It is because &lt;span style="font-family:courier new;"&gt;AccountsAwareObject&lt;/span&gt;'s constructor will be called before your class constructor, and call &lt;span style="font-family:courier new;"&gt;accountRegistered(Account *)&lt;/span&gt; on object that can be not ready for this.&lt;br /&gt;&lt;br /&gt;I hope that in near future we will create more aware objects in Kadu and remove many unnecessary signal/slots connections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-3057956089464017111?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/3057956089464017111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/01/aware-objects.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3057956089464017111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/3057956089464017111'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/01/aware-objects.html' title='Aware objects'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-4884194083456693253</id><published>2009-01-19T02:39:00.000-08:00</published><updated>2009-01-19T02:54:15.364-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jabber'/><category scheme='http://www.blogger.com/atom/ns#' term='Tlen'/><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Tlen &amp; Jabber support</title><content type='html'>First screenshots of Tlen contacts in Kadu (Jabber is supported too, but we don't yet have icons for that):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kadu.net/forum/viewtopic.php?p=88749#p88749"&gt;http://www.kadu.net/forum/viewtopic.php?p=88749#p88749&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks for Juzef and uzi for the hard work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-4884194083456693253?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/4884194083456693253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/01/tlen-jabber-support.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4884194083456693253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4884194083456693253'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/01/tlen-jabber-support.html' title='Tlen &amp; Jabber support'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-8544133418590537439</id><published>2009-01-08T16:36:00.000-08:00</published><updated>2009-02-26T03:54:03.735-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Status and description</title><content type='html'>I had a GPU failure on my laptop, so I was unable to do any work for Kadu for 2 weeks. Now as the ULE to Contact porting is in progress, I'll present how status/description changes are done in Kadu internals.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Changing status seems to be an easy task - create an object with enum (Online, Busy, Invisible, Offline) and QString fields, modify values and pass it to protocol-handler object. But at some time people started writing plugins that were modifying statuses in many ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;amarok module - could add information about currently played song to description (before or after user-supplied one)&lt;/li&gt;&lt;li&gt;filedesc module - was reading lines from file, one by one, and setting it as user description&lt;/li&gt;&lt;li&gt;autoway - change status to offline/invisible/busy after some time of inactivity, description could also be modified as in amarok&lt;/li&gt;&lt;li&gt;...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;User could load and use any status-changing modules at one time.&lt;br /&gt;&lt;br /&gt;This is how amarok module worked:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;when amarok started to play song, current user status was stored&lt;/li&gt;&lt;li&gt;user description was changed by adding song information&lt;/li&gt;&lt;li&gt;when song stopped, old (stored) status was restored&lt;/li&gt;&lt;/ul&gt;And autoaway:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;when user was inactive for given period of time, current user status was stored&lt;/li&gt;&lt;li&gt;user description and status was changed&lt;/li&gt;&lt;li&gt;when user activated, user status was restored&lt;/li&gt;&lt;/ul&gt;If you have some experience with multithreaded programming, you'll see the possible problem right away. If user used amarok and autoaway modules and the steps were executed in following order:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;(amarok) 1 - amarok stores &lt;span style="font-weight: bold;"&gt;"user status"&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(amarok) 2 - amarok changes status to &lt;span style="font-weight: bold;"&gt;"amarok status"&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(autoaway) 1 - autoaway stores &lt;span style="font-weight: bold;"&gt;"amarok status"&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(autoaway) 2 - autoaway changes status to &lt;span style="font-weight: bold;"&gt;"autoaway status"&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(amarok) 3 - amarok restores &lt;span style="font-weight: bold;"&gt;"user status&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(autoaway) 3 - autoaway restores &lt;span style="font-weight: bold;"&gt;"amarok status"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;The status of user will not be set to &lt;span style="font-weight: bold;"&gt;"user status"&lt;/span&gt; - so the behavior is plain wrong.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The resolution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To resolve this problem I've created two classes: &lt;span style="font-family:courier new;"&gt;StatusChanger&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;StatusChangerManager&lt;/span&gt;. These two operates on old &lt;span style="font-family:courier new;"&gt;UserStatus&lt;/span&gt; class (that will be replaced by new, much simpler, &lt;span style="font-family:courier new;"&gt;Status&lt;/span&gt; - but this is another story).&lt;br /&gt;&lt;br /&gt;StatusChanger is abstract class with method &lt;span style="font-family:courier new;"&gt;virtual void changeStatus(UserStatus &amp;amp;status)&lt;span style="font-family:verdana;"&gt;. &lt;/span&gt;&lt;/span&gt;This method can do anything with status - append, prepend something to description, replace some tags with any content, even change the status to Offline (which means logout from Gadu Gadu network).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;StatusChangerManager&lt;/span&gt; allows for registration and unregistration of &lt;span style="font-family:courier new;"&gt;StatusChangers&lt;/span&gt;. &lt;span style="font-family:courier new;"&gt;StatusChangers&lt;/span&gt; are joined in chain, ordered by their priorities. The first &lt;span style="font-family:courier new;"&gt;StatusChanger&lt;/span&gt; in chain is always &lt;span style="font-family:courier new;"&gt;UserStatusChanger&lt;/span&gt;, which is controlled by user. When user changes status the &lt;span style="font-family:courier new;"&gt;UserStatusChanger::userStatusSet(UserStatus)&lt;/span&gt; is invoked, which emits &lt;span style="font-family:courier new;"&gt;signal statusChanged&lt;/span&gt;. This signal is received by &lt;span style="font-family:courier new;"&gt;StatusChangerManager&lt;/span&gt;, and every &lt;span style="font-family:courier new;"&gt;StatusChanger&lt;/span&gt;'s &lt;span style="font-family:courier new;"&gt;changeStatus&lt;/span&gt; is invoked:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;UserStatus status;&lt;br /&gt;for (int i = 0; i &lt; statusChangers.count(); i++)&lt;br /&gt; statusChangers.at(i)-&gt;changeStatus(status);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After that &lt;span style="font-family:courier new;"&gt;statusChanged(Userstatus)&lt;/span&gt; signal of &lt;span style="font-family:courier new;"&gt;StatusChangerManager&lt;/span&gt; is invoked, and resulting status is sent to server.&lt;br /&gt;&lt;br /&gt;Every &lt;span style="font-family:courier new;"&gt;StatusChanger&lt;/span&gt; can emit &lt;span style="font-family:courier new;"&gt;statusChanged&lt;/span&gt; slot and trigger status rebuild in chain.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resolved&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Now amarok module is replaced by mediaplayer (much more general module). All status-changing modules uses new classes. There is no problem like before, because all modules provides only 'operations' that changes copy of user status (so it is always remembered). After removing or changing one of 'operations' status is rebuild starting from the one that user set.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SplitStatusChanger&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Kadu has class &lt;span style="font-family:courier new;"&gt;SplitStatusChanger&lt;/span&gt; (in &lt;span style="font-family:courier new;"&gt;status_changer.cpp&lt;/span&gt;). It allows for setting statuses with description of any length for Gadu Gadu. If it is too long for protocol to handle it - it is splited in number of parts. Each part is displayed for specified period of time.&lt;br /&gt;&lt;br /&gt;If you want to test it - please find place in code suitable for inserting it in chain, also remove the description limit from status dialog (look in &lt;span style="font-family:courier new;"&gt;misc.cpp&lt;/span&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-8544133418590537439?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/8544133418590537439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2009/01/status-and-description.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8544133418590537439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/8544133418590537439'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2009/01/status-and-description.html' title='Status and description'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-5434639812817381126</id><published>2008-12-23T11:17:00.000-08:00</published><updated>2008-12-23T16:23:33.132-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>Crappy-code to Good-code transition</title><content type='html'>The current Kadu code is crappy in many places. Like the contact-management part. This is realized by some classes that really weren't written after deep consideration:&lt;br /&gt;&lt;br /&gt;* UserListElement&lt;br /&gt;* UserListElements&lt;br /&gt;* UserGroup&lt;br /&gt;* UserList&lt;br /&gt;* ULEPrivate&lt;br /&gt;&lt;br /&gt;UserListElement is really a wrapper on ULEPrivate (using QExplicitlySharedDataPointer allows us to have many copies of UserListElement object that points to the same data).&lt;br /&gt;&lt;br /&gt;UserListElements is a list of UserListElement. UserGroup is a set of UserListElements. Why there are two classes - nobody knows (it is really old code...).&lt;br /&gt;&lt;br /&gt;UserList is a global list of all known contacts.&lt;br /&gt;&lt;br /&gt;ULEPrivate stores all data for one contact.&lt;br /&gt;&lt;br /&gt;Problem is how it stores the data - in three big hashes (one of them is really a hash of hashes...). Unfortunately - almost no comments. Also, the main hashes key's are protocol names (with one used - Gadu) - subhashes have keys as names of properties.&lt;br /&gt;&lt;br /&gt;For Kadu 0.7.0 we need more elegant design. I started to rewrite contact-management and the results seems to be very good (at least a lot better). Now there are more classes (but with better names and one-class-one-task approach).&lt;br /&gt;&lt;br /&gt;Each contact is now stored in Contact class (UserListElement was a cryptic name). Like in previous version data is hidden with QExplicitlySharedDataPointer and stored in ContactData class. ContactData contains QMap that maps accounts into ContactAccountData object (as in Kadu you can have multiple accounts, you also can be connectect with each of your contacts on each of your accounts). There will be something like ContactModuleData - each module (plugin) will be allowed to add new data to each contact.&lt;br /&gt;&lt;br /&gt;Also ContactData contains (or will contain...) fields for data that is not specific per account - first/last name and so on.&lt;br /&gt;&lt;br /&gt;Classes UserListElements/UserGroup will be merged as ContactList (QList&lt;Contact&gt; with few additional methods). Class UserList will be replaced ContactManager.&lt;br /&gt;&lt;br /&gt;Now code is in mixed-state: half of it used old classes, half uses new. There are conversion methods that allows to move data from one type to another, so code does not have to be ported at once.&lt;br /&gt;&lt;br /&gt;Three people are doing the transition: uzi18, Juzef (they are from jabber-module team, so it is really important to them to make Kadu more multiprotocol) and me. And the work is progressing very, very fast ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-5434639812817381126?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/5434639812817381126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2008/12/crappy-code-to-good-code-transition.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/5434639812817381126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/5434639812817381126'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2008/12/crappy-code-to-good-code-transition.html' title='Crappy-code to Good-code transition'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7595920238142263865.post-4074226530364400088</id><published>2008-12-20T06:23:00.000-08:00</published><updated>2008-12-23T11:19:09.370-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kadu'/><title type='text'>About me and about Kadu</title><content type='html'>&lt;a href="http://www.kadu.net/"&gt;Kadu&lt;/a&gt; is a Polish open-source IM client. Currently (version 0.6.5) it supports only proprietary Gadu-Gadu protocol, but in next version the Jabber XMPP will be also supported. We (the Kadu Team) are planning to make the best IM on the world ;)&lt;br /&gt;&lt;br /&gt;And we have the power to really do it - Kadu in Poland is most popular Linux Gadu-Gadu client, and many of our users will use it instead of Psi when it gains XMPP support. We will have QGraphicsView-based contact list, Phonon-based multimedia support. We have chat dialog with full HTML and CSS support (thanks to WebKit), Kadu is the most configurable IM client out here - and the configuration dialog is really very convienant. We have our own usability team that work on upcoming 0.6.6 and 0.7 user interface.&lt;br /&gt;&lt;br /&gt;We have support for plugins (called modules) and a lot of users that write their own modules - it is one of the reason Kadu is so popular (imagine kadupanel module that turns the window into hideable panel just like Kicker in KDE 3.5, or screenshot module that allows sending images of part of the screen directly in chat).&lt;br /&gt;&lt;br /&gt;Some words about myself: my name is Rafał Malinowski, I'm a programmer from Poland and I'm working on Kadu project. I'm also working for &lt;a href="http://www.cognifide.com/"&gt;Cognifide Poland&lt;/a&gt;, where I'm writing ASP.NET internet pages (like &lt;a href="http://www.setanta.com/"&gt;Setanta&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I'm going to write more about Kadu in this blog, to promote it and to improve my english and general writing skills ;)&lt;br /&gt;&lt;br /&gt;I hope you will enjoy reading this blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7595920238142263865-4074226530364400088?l=blog.kadu.im' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kadu.im/feeds/4074226530364400088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.kadu.im/2008/12/about-me-and-about-kadu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4074226530364400088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7595920238142263865/posts/default/4074226530364400088'/><link rel='alternate' type='text/html' href='http://blog.kadu.im/2008/12/about-me-and-about-kadu.html' title='About me and about Kadu'/><author><name>Rafał Malinowski</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RmbcIB8klGo/SqZdh84ZZ_I/AAAAAAAAAB4/dnn1NhgfJMk/s1600-R/eee1a2a3148e51941d235c0f635e9ace%3Fs%3D80'/></author><thr:total>0</thr:total></entry></feed>
