Proposal for an extended callbacks field
Andreas Monitzer
pidgin at monitzer.com
Wed Jul 25 21:44:56 EDT 2007
On Jul 26, 2007, at 00:01, Ethan Blanton wrote:
> There is definitely some tension here; Ad-hoc commands, for example,
> are certainly interesting, but are really XMPP-specific. This means
> that they probably don't belong in a global prpl information
> structure, as nothing else is likely to be able to use them.
However, that wouldn't matter in the hashtable. If the key exists,
the application can use it. If it doesn't exist, there's no mention
of them in any header, so there's no pollution with XMPP-specific
stuff happening.
Of course, the type safety is a valid concern. This would have to be
solved by some typedefs and casts.
> Perusing
> the ad-hoc commands XEP briefly, it looks to me like account actions
> and the request API are the Right Way to handle this -- that's a first
> hit, though, and it may not be correct.
That's actually one way it's implemented on my libpurple branch right
now. You can access your server's ad-hoc commands the from contacts
on your buddy list via their respective menu, as demonstrated here:
http://www.monitzer.com/adium/2007/screenshots/Picture%201.png
(Note that the format has changed since I took that screenshot).
However, every xmpp node can theoretically offer such ad-hoc
commands, which might be desired to be accessed. This is implemented
in the service discovery browser in Adium that uses the xml console
API for getting the required information:
http://www.monitzer.com/adium/2007/screenshots/Picture%2017.png
I can't just send the ad-hoc commands directly using jabber_send_raw,
since the ad-hoc API has to register its callback to the IQ packet.
The multi-step user interaction described in the XEP is implemented
using the fields request API.
> Learning about good design is certainly not a waste of your time, and
> nor is solving things in a sane and supportable fashion.
I admit that I'm only used to object-oriented design, which includes
encapsulation and separation of concerns. Having a large procedural
codebase is pretty new to me, so my solutions might not always be
similar to the libpurple's dev's solutions.
In Objective C (the main programming language used by the Adium
project), the issue at hand is actually solved using linked lists
with the method name as the search key right in the runtime. I didn't
invent this idea out of thin air.
> I'm sorry if you are being pressured to perform over learning and
> doing things
> right; I would be surprised if this is truly the case, and perhaps you
> should have a discussion with your mentor and the other Adium
> developers about this.
During the summer, I'm programming. Learning is what I'm doing the
rest of the year. FYI, I do have a Bachelor's degree in Software
Engineering and already wrote some successful commercial
applications, so I'm not a complete noob in that area.
However, I did learn the libpurple design to a certain degree, so I
don't think I'm stepping on your toes every time I'm adding something.
> I get the impression that you believe that the responses to your
> suggestions and implementations coming from the Pidgin/libpurple team
> have been unreasonable. I'm sorry that you feel that way, but it
> really has not been the case. Perhaps more buy-in from your mentor,
> the Adium team, or interaction with the Pidgin developers would help
> ease this apparent friction.
In case you didn't know, Augie Fackler, who started this thread, is
my SoC mentor, so he does help me in this area. I don't have anybody
at the pidgin/libpurple team to talk to, which might be a problem. I
only talk to Sean sometimes on IRC when I can catch him online.
>> Maybe my underlying problem is that I'm supposed to implement major
>> features into the XMPP plugin during a 3 months period without
>> resulting in a major version bump.
>
> So far, I haven't seen any features that would *require* a major
> version bump, other than voice and video. As Etan has requested
> numerous times, if you could tell us what you're *trying* to do, we
> can help you get it done.
It's not a single showstopper I could point my finger at, but the
issue crept up every now and then, and it really gets annoying over
time.
The functions that are already implemented and have to be used from
the application but are not in the prpl struct right now are:
purple_account_set_register_callback
jabber_register_gateway
jabber_adhoc_execute
jabber_ping_jid
jabber_user_search
Note that the first one should probably be replaced by a registration
callback in the _PurpleAccountUiOps struct (so you don't have to
define a callback in addition to defining this struct). Sean
suggested the current solution, since he didn't want to use up one of
those four reserved spots on the struct.
One additional function to be added to the prpl struct would be
unregister (as already mentioned).
> If something *is* a status, it should be handled as a status. It's
> that simple.
I agree on that one, back then I didn't really know how the status
system works. However, the system is still not suited as the ultimate
solution to all of the status problems. It's not the concept, but the
particular implementation, that needs a fix.
> "Easier to implement" isn't the only metric, and "bugs in the initial
> implementation" is a nearly worthless metric. Things like "logical",
> "consistent", "maintainable", and "correct" are very important.
I agree on that in theory. However, the current workaround I had to
implement is _not_ easily maintainable, but still required.
In case you don't know, that's how it's implemented right now:
On every status change function call, the function compares the new
status values to the old ones stored in the JabberStream struct. If
those are different, it sends the appropriate stanza (either
<presence/>, the user tune, the user nick, the user avatar or the
user mood right now). Afterwards, it copies the new values to the
JabberStream-struct.
This means that every time a new status key is added, the
JabberStream struct and the status update function have to be
adapted. I hope that nobody forgets about this, otherwise things can
get really messy.
This is required since there's no way to determine what status entry
has changed.
andy
More information about the Devel
mailing list