📄 xmlrpc.pm
字号:
} } else { $xmlrpc_transaction->error("Session does not exist"); }}sub jabber_start_roster{ my ($kernel,$heap,$session,$xmlrpc_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0]; my $id = luniqid; &debug("HERE"); if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); &debug("We have a session!"); $kernel->post('Manager'.$sid,'start_roster', 'return_roster', $xmlrpc_transaction,$id,$sid,'JABBER'.$sid); } else { $xmlrpc_transaction->error("Session does not exist"); }}sub jabber_get_roster{ my ($kernel,$heap,$session,$xmlrpc_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0]; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); $poe_kernel->post('Manager'.$sid,'get_managed_roster','send_xmlrpc',$xmlrpc_transaction); } else { $xmlrpc_transaction->error("Session does not exist"); }}sub jabber_get_message{ my $xmlrpc_transaction = $_[ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0] if defined $params->[0]; my $to = $params->[1] if defined $params->[1]; my $type = $params->[2] if defined $params->[2]; my $id = $params->[3] if defined $params->[3]; my $from = $params->[4] if defined $params->[4]; if ($punjab_session->check_session($sid)) { # grab the message $punjab_session->activity($sid,time()); $poe_kernel->post('Manager'.$sid,'get_managed_message',$to,$from,$id,$type,'send_xmlrpc',$xmlrpc_transaction); return; } $xmlrpc_transaction->error("Session does not exist");}sub jabber_get_presence{ my ($kernel,$heap,$session,$xmlrpc_transaction) = @_[KERNEL, HEAP, SESSION, ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0]; my $to = $params->[1]; my $from = $params->[2]; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); # grab the presence $kernel->post('Manager'.$sid,'get_managed_presence',$to,$from,'send_xmlrpc',$xmlrpc_transaction); return; } else { $xmlrpc_transaction->error("Session does not exist"); }}sub jabber_get_iq{ my $xmlrpc_transaction = $_[ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0]; my $iq_id = $params->[1]; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); # grab the presence $poe_kernel->post('Manager'.$sid,'get_managed_iq',$iq_id,'send_xmlrpc',$xmlrpc_transaction); } else { $xmlrpc_transaction->error("Session does not exist"); }}sub jabber_check_message{ my $xmlrpc_transaction = $_[ARG0]; my $params = $xmlrpc_transaction->params(); my $sid = $params->[0] if defined $params->[0]; my $to = $params->[1] if defined $params->[1]; my $from = $params->[1] if defined $params->[2]; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); # grab the message $poe_kernel->post('Manager'.$sid,'check_managed_message',$to,$from,'send_xmlrpc',$xmlrpc_transaction); } else { $xmlrpc_transaction->error("Session does not exist"); }}sub vcard(){ my $xmlrpc_transaction = $_[ARG0]; my $params = $xmlrpc_transaction->params(); my $id = luniqid; my $sid = $params->[0] if defined $params->[0]; my $jid = $params->[1] if defined $params->[1]; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); $_[KERNEL]->post($sid,'start_vcard', 'return_vcard', $xmlrpc_transaction,$jid,$id); #$xmlrpc_transaction->return("vcard"); } else { $xmlrpc_transaction->error("Session does not exist"); }}sub browse(){ my $xmlrpc_transaction = $_[ARG0]; my $params = $xmlrpc_transaction->params(); my $id = luniqid; my $sid = $params->[0] if defined $params->[0]; my $jid = $params->[1] if defined $params->[1]; my $auto = $params->[2] if defined $params->[2]; # auto browse into objects my $items = $params->[3] if defined $params->[3]; # auto get item information if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); # this needs alot of cleaning up. $_[KERNEL]->post($sid,'start_browse', 'return_browse', $xmlrpc_transaction,$id,$jid,$auto,$items); } else { $xmlrpc_transaction->error("Session does not exist"); } }sub return_browse() { my ($kernel,$session,$heap,$ret_val, $xmlrpc_transaction,$id,$jid,$sid) = @_[KERNEL, SESSION, HEAP, ARG0, ARG1 .. ARG6]; my $ret; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); # this is really ugly for now. if (not defined $heap->{'browse'}->{$sid}) { $heap->{'browse'}->{$sid} = []; } my $query = $ret_val->get_tag('query'); my $service = $ret_val->get_tag('service'); if ($ret_val->attr('type') ne 'error') { if (defined($query)) { $ret = $query->get_attrs(); if (defined($ret->{'xmlns'}) and $ret->{'xmlns'} eq "http://jabber.org/protocol/disco#items") { $ret->{'items'} = []; my $ic = $query->get_children(); foreach my $i (@$ic) { # if auto or items are set then we send other messages? push(@{$ret->{'items'}},$i->get_attrs()); } } elsif (defined($ret->{'xmlns'}) and $ret->{'xmlns'} eq "http://jabber.org/protocol/disco#info") { my $ident = $query->get_tag('identity'); $ret->{'identity'} = $ident->get_attrs(); $ret->{'features'} = []; my @fs = $query->get_tag('feature'); foreach my $f (@fs) { if (ref($f) eq "POE::Filter::XML::Node") { push(@{$ret->{'features'}},$f->get_attrs()); } } } } elsif (defined($service)) { $ret = $service->get_attrs(); $ret->{'services'} = []; my $sc = $service->get_children(); foreach my $c (@$sc) { my $rc = $c->get_attrs(); $rc->{'supports'} = []; my $rsc = $c->get_children(); foreach my $tc (@$rsc) { push(@{$rc->{'supports'}},$tc->data()); } push(@{$ret->{'services'}},$rc); } } push(@{$heap->{'browse'}->{$sid}},$ret); } else { push(@{$heap->{'browse'}->{$sid}},undef); } if ($#{$heap->{'browse'}->{$sid}}>=2) { # parse through the ret vals? $kernel->yield('send_xmlrpc',$heap->{'browse'}->{$sid},$xmlrpc_transaction); delete $heap->{'browse'}->{$sid}; } } else { $xmlrpc_transaction->error("Session does not exist"); }}sub return_vcard() { my ($kernel,$session,$heap,$ret_val, $xmlrpc_transaction,$node,$sid) = @_[KERNEL, SESSION, HEAP, ARG0 .. ARG3]; my $ret; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); my $v = $ret_val->get_tag('vCard'); my $c = $v->get_children() if defined $v; foreach my $c (@$c) { $ret->{$c->name()} = $c->data(); } if (defined $ret) { $kernel->yield('send_xmlrpc',$ret,$xmlrpc_transaction); } else { $xmlrpc_transaction->error("VCARD for ".$ret_val->attr('from')." does not exist"); } } else { $xmlrpc_transaction->error("Session does not exist"); }}sub return_iq() { my ($kernel,$session,$heap,$new_node, $xmlrpc_transaction,$node,$sid) = @_[KERNEL, SESSION, HEAP, ARG0 .. ARG3]; if ($punjab_session->check_session($sid)) { $punjab_session->activity($sid,time()); $kernel->post('Manager'.$sid,'get_managed_iq',$node->attr('id'),'send_xmlrpc',$xmlrpc_transaction); } else { $xmlrpc_transaction->error("Session does not exist"); }}sub return_contact() { my ($kernel,$session,$heap,$new_node, $xmlrpc_transaction,$node,$sid) = @_[KERNEL, SESSION, HEAP, ARG0 .. ARG3]; my $attrs; if ((!(defined($new_node)))||($new_node eq "")) { $xmlrpc_transaction->return(FALSE); return FALSE; } $attrs = $new_node->get_attrs(); my $error = ""; if (defined $attrs->{'type'} and $attrs->{'type'} eq +IQ_ERROR) { $error = $new_node->get_tag('error')->data(); $xmlrpc_transaction->error($error); return FALSE; } if (defined($attrs->{'type'}) and $attrs->{'type'} eq +IQ_RESULT) { $xmlrpc_transaction->return(+TRUE); } $xmlrpc_transaction->error("error in contact"); }sub return_roster() { my ($kernel,$session,$heap,$new_node, $xmlrpc_transaction,$node,$sid) = @_[KERNEL, SESSION, HEAP, ARG0 .. ARG3]; if ($punjab_session->check_session($sid)) { $kernel->post('Manager'.$sid,'get_managed_roster','send_xmlrpc',$xmlrpc_transaction); } else { $xmlrpc_transaction->error("Session does not exist"); }}# private functionssub send_xmlrpc { my ($kernel,$session,$heap,$ret_val,$xmlrpc_trans) = @_[KERNEL, SESSION, HEAP, ARG0, ARG1]; $xmlrpc_trans->return($ret_val);}sub check_timeout(){ my ($kernel,$session,$heap) = @_[KERNEL, SESSION, HEAP]; my @keys = keys %{$punjab_session->registry()}; $heap->{'session_keys'} = \@keys; $kernel->yield('check_timeout_continue'); }sub check_timeout_continue(){ my ($kernel,$session,$heap) = @_[KERNEL, SESSION, HEAP]; my $ctime = time(); my $s = pop(@{$heap->{'session_keys'}}); if (not defined $s) { my $count = keys %{$punjab_session->registry()}; if ($count > 0) { $kernel->delay('check_timeout', $heap->{'CONFIG'}->{'idle_check'}); } return; } if (($ctime - $punjab_session->activity($s))>=$heap->{'CONFIG'}->{'timeout'}) { $kernel->post($s,'disconnect',$s); $punjab_session->unregister($s); } $kernel->yield('check_timeout_continue'); }1;__END__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -