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