After digging through many codepaths through libfaim, Gaim's Oscar PRPL, and the Gaim core, I came up with what I consider a fairly reasonable solution for using the client IP when the verified IP just isn't enough to get the job done (see previous post for background on this topic). After the user accepts the incoming file transfer request, the core calls oscar_xfer_init_recv. This function is first called with the sender's verified IP. In this init function, I buried a timout that falls back to the client IP if no successful connection is made after a few seconds. The timeout then calls oscar_xfer_init_recv again with this new IP. Another timout is started, and if nothing happens within another few seconds, the whole file transfer is declared a failure. With that done, it's now on to more minor details for a little while (eg. Sending nice pretty status messages to the user via the conversation window).
