Show
Ignore:
Timestamp:
04/09/06 02:26:57 (4 years ago)
Author:
bradfitz
Message:

start of processing roster adds/updates/deletes. this add hook chain call, but not pretty half, the easy implementation in RosterStorage.pm

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/lib/DJabberd/IQ.pm

    r64 r65  
    1616    my $handler = { 
    1717        'get-{jabber:iq:roster}query' => \&process_iq_getroster, 
     18        'set-{jabber:iq:roster}query' => \&process_iq_setroster, 
    1819        'get-{jabber:iq:auth}query' => \&process_iq_getauth, 
    1920        'set-{jabber:iq:auth}query' => \&process_iq_setauth, 
     
    4041} 
    4142 
    42 sub send_result_nodes { 
     43sub send_result { 
     44    my DJabberd::IQ $self = shift; 
     45    $self->send_reply("result"); 
     46} 
     47 
     48sub send_error { 
     49    my DJabberd::IQ $self = shift; 
     50    # TODO: take more parameters 
     51    $self->send_reply("error"); 
    4352} 
    4453 
     
    4756    my DJabberd::IQ $self = shift; 
    4857    my $raw = shift; 
     58    return $self->send_reply("result", $raw); 
     59} 
     60 
     61sub send_reply { 
     62    my DJabberd::IQ $self = shift; 
     63    my ($type, $raw) = @_; 
    4964 
    5065    my $conn = $self->{connection} 
    5166        or return; 
    5267 
     68    $raw ||= ""; 
    5369    my $id = $self->id; 
    5470    my $to = $conn->bound_jid->as_string; 
    55     my $xml = qq{<iq to='$to' type='result' id='$id'>$raw</iq>}; 
     71    my $xml = qq{<iq to='$to' type='$type' id='$id'>$raw</iq>}; 
    5672    warn "About to send IQ reply: $xml\n"; 
    5773    $conn->write(\$xml); 
     
    8197} 
    8298 
     99sub process_iq_setroster { 
     100    my ($conn, $iq) = @_; 
     101 
     102    $DB::single = 1; 
     103 
     104    my $item = $iq->query->first_element; 
     105    unless ($item && $item->element eq "{jabber:iq:roster}item") { 
     106        $iq->send_error; 
     107        return; 
     108    } 
     109 
     110    # {=xmpp-ip-7.6-must-ignore-subscription-values} 
     111    my $subattr  = $item->attr('subscription') || ""; 
     112    my $removing = $subattr eq "remove" ? 1 : 0; 
     113 
     114    my $jid = $item->attr("{jabber:iq:roster}jid") 
     115        or return $iq->send_error; 
     116 
     117    my $name = $item->attr("{jabber:iq:roster}name"); 
     118 
     119    # find list of group names to add/update.  can ignore 
     120    # if we're just removing. 
     121    my @groups;  # scalars of names 
     122    unless ($removing) { 
     123        foreach my $ele ($item->children_elements) { 
     124            next unless $ele->element eq "{jabber:iq:roster}group"; 
     125            push @groups, $ele->first_child; 
     126        } 
     127    } 
     128 
     129    my $ritem = DJabberd::RosterItem->new(jid    => $jid, 
     130                                          name   => $name, 
     131                                          groups => \@groups); 
     132 
     133    my $phase = $removing ? "RosterRemoveItem" : "RosterSetItem"; 
     134    $conn->run_hook_chain(phase   => $phase, 
     135                          args    => [ $ritem ], 
     136                          methods => { 
     137                              done => sub { 
     138                                  my ($self) = @_; 
     139                                  $iq->send_result; 
     140                                  # TODO: roster push 
     141                              }, 
     142                          }, 
     143                          fallback => sub { 
     144                              $iq->send_error; 
     145                              # TODO: roster push 
     146                          }); 
     147 
     148    return 1; 
     149} 
     150 
    83151sub process_iq_getauth { 
    84152    my ($conn, $iq) = @_;