e50b9232881d8c0769ed7fe7a7f9a2b0ec7e12f2
[perl-cwmp.git] / lib / CWMP / Methods.pm
1 package CWMP::Methods;
2
3 use strict;
4 use warnings;
5
6
7 use base qw/Class::Accessor/;
8 __PACKAGE__->mk_accessors( qw/debug/ );
9
10 use XML::Generator;
11 use Carp qw/confess/;
12 use Data::Dump qw/dump/;
13
14 =head1 NAME
15
16 CWMP::Methods - generate SOAP meesages for CPE
17
18 =head1 METHODS
19
20 =head2 new
21
22   my $method = CWMP::Methods->new({ debug => 1 });
23
24 =cut
25
26 sub new {
27         my $class = shift;
28         my $self = $class->SUPER::new( @_ );
29
30         warn "created XML::Generator object\n" if $self->debug;
31
32         return $self;
33 }
34
35 =head2 xml
36
37 Used to implement methods which modify just body of soap message.
38 For examples, see source of this module.
39
40 =cut
41
42 my $cwmp = [ cwmp => 'urn:dslforum-org:cwmp-1-0' ];
43 my $soap = [ soap => 'http://schemas.xmlsoap.org/soap/envelope/' ];
44 my $xsd  = [ xsd  => 'http://www.w3.org/2001/XMLSchema-instance' ];
45
46 sub xml {
47         my $self = shift;
48
49         my ( $state, $closure ) = @_;
50
51         confess "no state?" unless ($state);
52         confess "no body closure" unless ( $closure );
53
54         confess "no ID in state ", dump( $state ) unless ( $state->{ID} );
55
56         #warn "state used to generate xml = ", dump( $state ) if $self->debug;
57
58         my $X = XML::Generator->new(':pretty');
59
60         return $X->Envelope( $soap, { 'soap:encodingStyle' => "http://schemas.xmlsoap.org/soap/encoding/" },
61                 $X->Header( $soap,
62                         $X->ID( $cwmp, { mustUnderstand => 1 }, $state->{ID} ),
63                         $X->NoMoreRequests( $cwmp, $state->{NoMoreRequests} || 0 ),
64                 ),
65                 $X->Body( $soap, $closure->( $X, $state ) ),
66         );
67 }
68
69 =head1 CPE methods
70
71 =head2 GetRPCMethods
72
73   $method->GetRPCMethods( $state );
74
75 =cut
76
77 sub GetRPCMethods {
78         my ( $self, $state ) = @_;
79         $self->xml( $state, sub {
80                 my ( $X, $state ) = @_;
81                 $X->GetRPCMethods();
82         });
83 };
84
85 =head2 SetParameterValues
86
87 B<not implemented>
88
89 =head2 GetParameterValues
90
91   $method->GetParameterValues( $state, $ParameterNames );
92
93 =cut
94
95 sub GetParameterValues {
96         my $self = shift;
97         my $state = shift;
98         my @ParameterNames = @_;
99         confess "need ParameterNames" unless @ParameterNames;
100         warn "# GetParameterValues", dump( @ParameterNames ), "\n" if $self->debug;
101
102         $self->xml( $state, sub {
103                 my ( $X, $state ) = @_;
104
105                 $X->GetParameterValues( $cwmp,
106                         $X->ParameterNames( $cwmp,
107                                 map {
108                                         $X->string( $xsd, $_ )
109                                 } @ParameterNames
110                         )
111                 );
112         });
113 }
114
115 =head2 GetParameterNames
116
117   $method->GetParameterNames( $state, $ParameterPath, $NextLevel );
118
119 =cut
120
121 sub GetParameterNames {
122         my ( $self, $state, $ParameterPath, $NextLevel ) = @_;
123         $ParameterPath ||= '';  # all
124         $NextLevel ||= 0;               # all
125         warn "# GetParameterNames( '$ParameterPath', $NextLevel )\n" if $self->debug;
126         $self->xml( $state, sub {
127                 my ( $X, $state ) = @_;
128
129                 $X->GetParameterNames( $cwmp,
130                         $X->ParameterPath( $cwmp, $ParameterPath ),
131                         $X->NextLevel( $cwmp, $NextLevel ),
132                 );
133         });
134 }
135
136 =head2 Reboot
137
138   $method->Reboot( $state );
139
140 =cut
141
142 sub Reboot {
143         my ( $self, $state ) = @_;
144         $self->xml( $state, sub {
145                 my ( $X, $state ) = @_;
146                 $X->Reboot();
147         });
148 }
149
150
151 =head1 Server methods
152
153
154 =head2 InformResponse
155
156   $method->InformResponse( $state );
157
158 =cut
159
160 sub InformResponse {
161         my ( $self, $state ) = @_;
162         $self->xml( $state, sub {
163                 my ( $X, $state ) = @_;
164                 $X->InformResponse( $cwmp,
165                         $X->MaxEnvelopes( $cwmp, 1 )
166                 );
167         });
168 }
169
170 =head1 BUGS
171
172 All other methods are unimplemented.
173
174 =cut
175
176 1;