package DJabberd::RosterItem; use strict; use Carp qw(croak); use DJabberd::Util qw(exml); use DJabberd::Subscription; use fields ( 'jid', 'name', 'groups', # arrayref of group names 'subscription', # DJabberd::Subscription object 'remove', # bool: if client requested rosteritem be removed ); sub new { my $self = shift; $self = fields::new($self) unless ref $self; if (@_ == 1) { $self->{jid} = $_[0]; } else { my %opts = @_; $self->{jid} = delete $opts{'jid'} or croak "No JID"; $self->{name} = delete $opts{'name'}; $self->{groups} = delete $opts{'groups'}; $self->{remove} = delete $opts{'remove'}; $self->{subscription} = delete $opts{'subscription'}; croak("unknown ctor fields: " . join(', ', keys %opts)) if %opts; } unless (ref $self->{jid}) { $self->{jid} = DJabberd::JID->new($self->{jid}) or croak("Invalid JID"); } $self->{groups} ||= []; # convert subscription name to an object if ($self->{subscription} && ! ref $self->{subscription}) { $self->{subscription} = DJabberd::Subscription->new_from_name($self->{subscription}); } $self->{subscription} ||= DJabberd::Subscription->none; return $self; } sub jid { my $self = shift; return $self->{jid}; } sub name { my $self = shift; return $self->{name}; } sub groups { my $self = shift; return @{ $self->{groups} }; } sub subscription { my $self = shift; return $self->{subscription}; } sub set_subscription { my ($self, $sb) = @_; $self->{subscription} = $sb; } sub add_group { my ($self, $group) = @_; push @{ $self->{groups} }, $group; } sub as_xml { my $self = shift; my $xml = "{remove} ? "subscription='remove' " : $self->{subscription}->as_attributes); if (defined $self->{name}) { $xml .= " name='" . exml($self->{name}) . "'"; } $xml .= ">"; foreach my $g (@{ $self->{groups} }) { $xml .= "" . exml($g) . ""; } $xml .= ""; return $xml; } 1;