On Thu, Aug 21, 2003 at 04:12:34PM -0400, Dan McCormick wrote:
> Howdy,
> 
> If no one's released a PoCo::Net::OSCAR (i.e. the public face of AOL's
> IM), I've got one to offer.
> 
> However, I was hoping for a bit of feedback first, because I'm not sure
> I've gone about it in the best way.  The Net::OSCAR module is very nice
> in that it can use other event loops.  The only hitch is that it thinks
> in terms of filenos and it looks like POE thinks in terms of sockets and
> handles.  I'm not too well-versed in this area, but after a bit of trial
> and error, I came up with this:
> 
> # sign on, and set up POE to monitor all the connections
> $_[HEAP]->{oscar}->signon( %args );

[...]

> This works fine, but it seems a bit heavy on the selects.  Is there a
> better way?

It looks like Net::OSCAR has a findconn() function that will find a
connection based on a socket's file descriptor.  Generating file
descriptors from socket handles is a lot easier than going the other
way: just call fileno() on them.

This code (untested!) simulates Net::OSCAR::process_connections() on one
connection at a time.

The only shame is that Net::OSCAR::findconn() does a grep on all the
connections to find the matching one.  A hash of (fileno => connection)
pairs would be nice there.

  foreach my $conn (@{ $heap->{oscar}->{connections} }) {
    $kernel->select($connection->{socket}, 'rd_ok', 'wr_ok', 'ex_ok');
  }

  sub rd_ok {
    my ($heap, $socket) = @_[HEAP, ARG0];
    my $conn = $heap->{oscar}->findconn(fileno($socket));
    $conn->process_one(1, 0);
  }

  sub wr_ok {
    my ($heap, $socket) = @_[HEAP, ARG0];
    my $conn = $heap->{oscar}->findconn(fileno($socket));
    $conn->process_one(0, 1);
  }

  sub ex_ok {
    my ($heap, $socket) = @_[HEAP, ARG0];
    my $conn = $heap->{oscar}->findconn(fileno($socket));
    $kernel->select($socket);  # stop the socket from POE
    $connection->{sockerr} = 1;
    $connection->disconnect();
  }

Good luck.

-- 
Rocco Caputo - [EMAIL PROTECTED] - http://poe.perl.org/

Reply via email to