Proposal: Blist structure modification
Sulabh Mahajan
sulabh.dev at gmail.com
Wed Oct 3 09:15:01 EDT 2012
Hi,
In case the text-art didn't show properly, attached are the same in the
picture format.
Regards,
Sulabh Mahajan
On Tue, Oct 2, 2012 at 4:08 PM, Sulabh Mahajan <sulabh.dev at gmail.com> wrote:
> Hi,
>
> Earlier I was working on the privacy rewrite project, in order to continue
> with it I need modifications to the way blist is organized and stored on
> the disk.
>
> As per the discussions that happened during the project time frame, it was
> agreed upon that the best way to store "people" (buddies + chats + privacy
> contacts) is to have a single list for all of them, and annotate required
> information as tags to them.
> Rather than organizing the buddies based on groups, we can have "people"
> based on accounts. The groups the "people" belong to, settings, privacy
> information, presence, subscriptions, etc would be annotations to these
> people.
>
> Let me first describe the current model of blist organization:
> (Let me know if the following "text art" doesn't show up correctly, I will
> put them in jpeg and attach along)
>
> purplebuddylist
> |
> |------> root
> | |
> | |------> group1------->group2------>.....----->groupN
> | |
> | |
> |
> -----------------------------------------------------------------------------------------------------------
> | | | .... | |
> | .... | | ....
> | Setting1 Setting2 Contact1 Contact2 Person1 Chat1
> Chat2
> | |
> | |
> |
> ------------------------------------------------------------------
> | | | ..... | | ..... |
> | Setting1 Setting2 Buddy1 Buddy2 BuddyN
> | |
> | |
> | Setting
> |
> |
> |--------> buddies (hashtable): data "buddy", key "_purple_buddy"
>
>
> We also maintain a hashtable, "buddies_cache" to be able to get quick
> access to per account buddies.
>
> buddies_cache (hashtable): data "account_buddies", key "buddy->account"
> account_buddies (hashtable): data "buddy", key "_purple_hbuddy"
>
> buddies_cache
> |
> |
>
> ---------------------------------------------------------------------
> | | ...........
> |
> account1 account2 accountN
> |
> -------------------------------------------------
> | | ........... |
> buddy1 buddy2 buddyN
>
>
>
> blist is stored on disk in ~/.purple/blist.xml in the same format as is
> for purplebuddylist->root
> For instance:
>
> <purple version="1.0">
> <blist>
> <group name="groupN">
> <setting name="collapsed" type="bool">0</setting>
> <chat proto="xxxxx" account="xxxxx at xxxx.xxxx/">
> <component name="server">abcd.xyz.com
> </component>
> <setting name="gtk-persistent"
> type="bool">1</setting>
> </chat>
> <contact>
> <buddy account="accxxx/" proto="xyz">
> <name>abcd at xyz.com</name>
> <setting name="last_seen"
> type="int">1349128209</setting>
> </buddy>
> </contact>
> .
> .
> </group>
> .
> .
> </blist>
> <privacy>
> <account proto="xyz" name="xxxxxx at xxx.com" mode="1"/>
> <account proto="abcd" name="xyzxyz at xyzxyz.com/" mode="1">
> <block>xyabcd at xyabcd.com</block>
> </account>
> .
> .
> </privacy>
> </purple>
>
>
>
> Since we require per account buddies information,
> and maintain buddy_cache, a structure that contains per account buddies. I
> want to have a similar structure for our main blist. Besides that we can
> have a cached structure to maintain the list organized in
> "group->contact->buddy" format.
>
>
> My proposal for the new, lets call it, purplepeoplelist is as follows:
>
> purplepeoplelist
> |
> |------> root
> | |
> | |------> account1------->account2------>.....----->accountN
> | |
> | |
> |
> -------------------------------------------------------------------------------------------------------------------
> | | | .... |
> | | | ....
> | Setting1 Setting2 AccountPrivacySetting Individual1 Individual2 Chat1
> |
> | |
> |
> | |
> |
> -----------------------------------------------------------------------------
> --------------------
> | | | | ..... |
> | ... | |
> | IsBuddy? Setting1 Setting2 Presence Subscription
> Setting "Group2"
> | |
> | | (yes)
> | |
> | "Group2/Contact1"
> |
> |
> |--------> people (hashtable): data "individual", key "_purple_individual"
>
>
> Have a structure called, blist which will be cache of only buddies, along
> with group and contact settings/information organized in the
> "groups->contacts->buddies" format.
> This will be to store group and contact settings, and to have a quick way
> for the UI to present the blist.
>
> purplebuddyblist
> |
> --------------------------------------------------
>
> | | ............. |
> group1 group2 groupN
> |
> |
>
> --------------------------------------------------------------------------------
> | | .... | |
> | ....
> Setting1 Setting2 Contact1 Contact2 Chat1
> |
> |
>
> -----------------------------------------------------------------------
> | | ..... |
> | ...
> Setting1 Setting2 Buddy1(Individual1) BuddyN
>
>
> To store the above information on the disk, we will store it in say
> people.xml in the following form:
>
> <purple version="2.0">
> <peoplelist>
> <account="accxxx/" proto="xyz">
> <setting name="privacy-mode" type="int">1</setting>
> <setting name="blahblah" type="bool">1</setting>
> <chat proto="xxxxx/">
> <group="CoWorkers"></group>
> <component name="server">abcd.xyz.com
> </component>
> <setting name="gtk-persistent"
> type="bool">1</setting>
> </chat>
> <Individual>
> <name="mybestfriend"</name>
> <setting name="is-buddy"
> type="bool">1</setting>
> <group="CoWorkers">
>
> <Contact>"ProjectX"</Contact>
>
> <Contact>"ProjectZ"</Contact>
> </group>
> <group="FootballBuddies"></group>
> <alias>abcd efgh</alias>
> <setting name="presence" type="int">0</setting>
> <setting name="subscription"
> type="int">1</setting>
> .
> .
> </individual>
> <Individual>
> <name="blocked_guy"</name>
> <setting name="is-buddy"
> type="bool">0</setting>
> <alias>theboringguy</alias>
> <setting name="presence" type="int">3</setting>
> <setting name="subscription"
> type="int">2</setting>
> <setting name="blocked" type="int">5</setting>
> .
> .
> </individual>
> .
> .
> </account>
> .
> .
> </peoplelist>
> <group_contact_list>
> .
> .
> <group name="CoWorkers">
> <setting name="collapsed" type="bool">0</setting>
> <setting name="xyz" type="int">2</setting>
> <contact name="ProjectX">
> <setting name="abcdefgh"
> type="bool">0</setting>
> <setting name="qwerty" type="int">2</setting>
> </contact>
> <contact name="ProjectZ">
> <setting name="abcdefgh" type="bool">1</setting>
> </contact>
> .
> .
> </group>
> .
> .
> </group_contact_list>
> </purple>
>
>
> Eagerly waiting for your comments. Please suggest any improvements that
> you can think of.
> This is just a first draft that I quickly came up with, let me know if I
> missed taking into account some critical information.
>
> Thanks and Regards,
> Sulabh Mahajan
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://pidgin.im/pipermail/devel/attachments/20121003/299b8faa/attachment-0002.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: orignal_design.png
Type: image/png
Size: 24162 bytes
Desc: not available
URL: <http://pidgin.im/pipermail/devel/attachments/20121003/299b8faa/attachment-0004.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: proposed_design.png
Type: image/png
Size: 41122 bytes
Desc: not available
URL: <http://pidgin.im/pipermail/devel/attachments/20121003/299b8faa/attachment-0005.png>
More information about the Devel
mailing list