1package DJabberd::RosterItem; 2use strict; 3use Carp qw(croak); 4use DJabberd::Util qw(exml); 5use DJabberd::Subscription; 6 7use fields ( 8 'jid', 9 'name', 10 'groups', # arrayref of group names 11 'subscription', # DJabberd::Subscription object 12 'remove', # bool: if client requested rosteritem be removed 13 ); 14 15sub new { 16 my $self = shift; 17 $self = fields::new($self) unless ref $self; 18 if (@_ == 1) { 19 $self->{jid} = $_[0]; 20 } else { 21 my %opts = @_; 22 $self->{jid} = delete $opts{'jid'} or croak "No JID"; 23 $self->{name} = delete $opts{'name'}; 24 $self->{groups} = delete $opts{'groups'}; 25 $self->{remove} = delete $opts{'remove'}; 26 $self->{subscription} = delete $opts{'subscription'}; 27 croak("unknown ctor fields: " . join(', ', keys %opts)) if %opts; 28 } 29 30 unless (ref $self->{jid}) { 31 $self->{jid} = DJabberd::JID->new($self->{jid}) 32 or croak("Invalid JID"); 33 } 34 35 $self->{groups} ||= []; 36 37 # convert subscription name to an object 38 if ($self->{subscription} && ! ref $self->{subscription}) { 39 $self->{subscription} = DJabberd::Subscription->new_from_name($self->{subscription}); 40 } 41 42 $self->{subscription} ||= DJabberd::Subscription->none; 43 return $self; 44} 45 46sub jid { 47 my $self = shift; 48 return $self->{jid}; 49} 50 51sub name { 52 my $self = shift; 53 return $self->{name}; 54} 55 56sub groups { 57 my $self = shift; 58 return @{ $self->{groups} }; 59} 60 61sub subscription { 62 my $self = shift; 63 return $self->{subscription}; 64} 65 66sub set_subscription { 67 my ($self, $sb) = @_; 68 $self->{subscription} = $sb; 69} 70 71sub add_group { 72 my ($self, $group) = @_; 73 push @{ $self->{groups} }, $group; 74} 75 76sub as_xml { 77 my $self = shift; 78 my $xml = "<item jid='" . exml($self->{jid}->as_bare_string) . "' " . ($self->{remove} ? 79 "subscription='remove' " : 80 $self->{subscription}->as_attributes); 81 if (defined $self->{name}) { 82 $xml .= " name='" . exml($self->{name}) . "'"; 83 } 84 $xml .= ">"; 85 foreach my $g (@{ $self->{groups} }) { 86 $xml .= "<group>" . exml($g) . "</group>"; 87 } 88 $xml .= "</item>"; 89 return $xml; 90} 91 92 931; 94