The only Open Source OSCAR library is libfaim. Originally, my library was
just going to be a quick hack, so I based a lot of its design on libfaim.
However, as the library grew, I ended up trying to undo some of the
libfaim design in order to implement a design more modular. Eventually, I
ended up with a hybrid of both.

Both AOL and libfaim allow you to register a callback for a specific SNAC
family and subtype, and since our implementation uses Java interfaces, any
client that wishes to listen for a specific SNAC family must implement the
entire SNAC Listener interface for that family, even if only listening for
a single SNAC in that family.

Internally, the BOS core component (BOSTool) will implement several of the
interfaces. It should be the the only component that implements interfaces
other than ServiceListener and its corresponding Listener interface.

There are also quite a few OpenSource ICQ clients, but in these cases,
they were hastily converted to use the OSCAR protocol from the old (v2 -
v5) protocol and no attempt was made (even for clients written in an
Object Oriented language such as C++) to emulate the offical client's
design, and this is one of my main goals. As a side note, ICQ v6 (ICQ 99b)
was an interim release while the old ICQ protocol was being converted to
use the AOL OSCAR protocol after AOL bought ICQ from Mirabilis. ICQ v7
(ICQ 2000) was the first official release of an ICQ client by AOL, and
it used the OSCAR protocol. Currently, we are at ICQ v8 (ICQ 2001 and ICQ
2002a), the second ICQ version to use the OSCAR protocol. During the
development of the library, AOL released ICQ 2003a.

You can see that Oscar.java is doing too much work. Any module that makes
a new connection should be handled in its own Tool, and the rest should be
handled in BOSTool.java:

Groups for BOSTool (10):

0x0001
0x0002
0x0003
0x0004
0x0006
0x0008
0x000a
0x000b
0x000c
0x0013
0x0015 (optional)

Separate Groups and the families each implements (8):

AdTool (0x0001, 0x0005)
AdminTool (0x0001, 0x0007)
ChatNavTool (0x0001, 0x000d)
ChatTool (0x0001, 0x0000e)
ODirTool (0x0001, 0x000f)
IconTool (0x0001, 0x0010)
MailTool (0x0001, 0x0018)
LoginTool (0x00017)

=============================================================================
Added by Ka-Hing Cheung (javabsp)

Here are some UI coding thoughts:

Each component should handle its own UI events, avoid anonymous inner classes
whenever you can.

Use Component.setActionCommand(). Use all lower cases, and underscores instead
of whitespace for the action command. The only occassion where you don't need
to explicitly set the action command is when you have a hold to the object, that
way you can just do evt.getSource() == object. DO NOT rely on the default action
command.

The Gnome HIG (Human Interface Guideline) is a good resource about how to write
a consistent & good UI, follow it if you can. It can be found at:
http://developer.gnome.org/projects/gup/hig/

