File Coverage

blib/lib/Net/XMPP/Debug.pm
Criterion Covered Total %
statement 53 107 49.5
branch 20 50 40.0
condition 2 3 66.6
subroutine 11 12 91.6
pod 2 6 33.3
total 88 178 49.4


line stmt bran cond sub pod time code
1             ##############################################################################
2             #
3             # This library is free software; you can redistribute it and/or
4             # modify it under the terms of the GNU Library General Public
5             # License as published by the Free Software Foundation; either
6             # version 2 of the License, or (at your option) any later version.
7             #
8             # This library is distributed in the hope that it will be useful,
9             # but WITHOUT ANY WARRANTY; without even the implied warranty of
10             # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11             # Library General Public License for more details.
12             #
13             # You should have received a copy of the GNU Library General Public
14             # License along with this library; if not, write to the
15             # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16             # Boston, MA 02111-1307, USA.
17             #
18             # Copyright (C) 1998-2004 Jabber Software Foundation http://jabber.org/
19             #
20             ##############################################################################
21              
22             package Net::XMPP::Debug;
23              
24             =head1 NAME
25              
26             Net::XMPP::Debug - XMPP Debug Module
27              
28             =head1 SYNOPSIS
29              
30             Net::XMPP::Debug is a module that provides a developer easy access
31             to logging debug information.
32              
33             =head1 DESCRIPTION
34              
35             Debug is a helper module for the Net::XMPP modules. It provides
36             the Net::XMPP modules with an object to control where, how, and
37             what is logged.
38              
39             =head2 Basic Functions
40              
41             $Debug = Net::XMPP::Debug->new();
42              
43             $Debug->Init(
44             level => 2,
45             file => "stdout",
46             header =>"MyScript");
47              
48             $Debug->Log0("Connection established");
49              
50             =head1 METHODS
51              
52             =head2 Basic Functions
53              
54             =over 4
55              
56             =item new
57              
58             new(hash)
59              
60             creates the Debug object. The hash argument is passed
61             to the Init function. See that function description
62             below for the valid settings.
63              
64             =item Init
65              
66             Init(
67             level => integer,
68             file => string,
69             header => string,
70             setdefault => 0|1,
71             usedefault => 0|1,
72             time => 0|1)
73              
74             initializes the debug object.
75              
76             The B determines the maximum level of debug
77             messages to log:
78              
79             0 - Base level Output (default)
80             1 - High level API calls
81             2 - Low level API calls
82             ...
83             N - Whatever you want....
84              
85             The B determines where the debug log
86             goes. You can either specify a path to
87             a file, or "stdout" (the default). "stdout"
88             tells Debug to send all of the debug info
89             sent to this object to go to stdout.
90              
91             B
is a string that will preappended
92             to the beginning of all log entries. This
93             makes it easier to see what generated the
94             log entry (default is "Debug").
95              
96             B saves the current filehandle
97             and makes it available for other Debug
98             objects to use. To use the default set
99             B to 1.
100              
101             The B
102             timestamp to the beginning of each logged line.
103              
104             =item LogN
105              
106             LogN(array)
107              
108             Logs the elements of the array at the corresponding
109             debug level N. If you pass in a reference to an
110             array or hash then they are printed in a readable
111             way. (ie... Log0, Log2, Log100, etc...)
112              
113             =back
114              
115             =head1 EXAMPLE
116              
117             $Debug = Net::XMPP:Debug->new(level=>2,
118             header=>"Example");
119              
120             $Debug->Log0("test");
121              
122             $Debug->Log2("level 2 test");
123              
124             $hash{a} = "atest";
125             $hash{b} = "btest";
126              
127             $Debug->Log1("hashtest", \%hash);
128              
129             You would get the following log:
130              
131             Example: test
132             Example: level 2 test
133             Example: hashtest { a=>"atest" b=>"btest" }
134              
135             If you had set the level to 1 instead of 2 you would get:
136              
137             Example: test
138             Example: hashtest { a=>"atest" b=>"btest" }
139              
140             =head1 AUTHOR
141              
142             Originally authored by Ryan Eatmon.
143              
144             Previously maintained by Eric Hacker.
145              
146             Currently maintained by Darian Anthony Patrick.
147              
148             =head1 COPYRIGHT
149              
150             This module is free software, you can redistribute it and/or modify it
151             under the LGPL 2.1.
152              
153             =cut
154              
155             require 5.008;
156 15     15   81 use strict;
  15         22  
  15         598  
157 15     15   69 use warnings;
  15         24  
  15         486  
158 15     15   65 use FileHandle;
  15         21  
  15         219  
159 15     15   4582 use Carp;
  15         28  
  15         1095  
160 15     15   62 use vars qw( %HANDLES $DEFAULT $DEFAULTLEVEL $DEFAULTTIME $AUTOLOAD );
  15         18  
  15         13839  
161              
162             $DEFAULTLEVEL = -1;
163              
164             sub new
165             {
166 32     32 1 9253 my $proto = shift;
167 32         91 my $self = { };
168 32         88 bless($self, $proto);
169              
170 32         159 $self->Init(@_);
171              
172 32         92 return $self;
173             }
174              
175              
176             ##############################################################################
177             #
178             # Init - opens the fielhandle and initializes the Debug object.
179             #
180             ##############################################################################
181             sub Init
182             {
183 32     32 1 67 my $self = shift;
184              
185 32         52 my %args;
186 32         143 while($#_ >= 0) { $args{ lc pop(@_) } = pop(@_); }
  109         400  
187              
188 32 100 66     280 delete($args{file}) if (defined $args{file} && lc($args{file}) eq "stdout");
189              
190 32 100       137 $args{time} = 0 if !exists($args{time});
191 32 100       108 $args{setdefault} = 0 if !exists($args{setdefault});
192 32 100       109 $args{usedefault} = 0 if !exists($args{usedefault});
193              
194 32         194 $self->{TIME} = $args{time};
195              
196 32 100       135 if ($args{usedefault} == 1)
197             {
198 15         22 $args{setdefault} = 0;
199 15         30 $self->{USEDEFAULT} = 1;
200             }
201             else
202             {
203 17         123 $self->{LEVEL} = 0;
204 17 50       77 $self->{LEVEL} = $args{level} if exists($args{level});
205 17 50       63 if ($self->{LEVEL} >= 0)
206             {
207              
208 0         0 $self->{HANDLE} = FileHandle->new(">&STDERR");
209 0         0 $self->{HANDLE}->autoflush(1);
210 0 0       0 if (exists($args{file}))
211             {
212 0 0       0 if (exists($Net::XMPP::Debug::HANDLES{$args{file}}))
213             {
214 0         0 $self->{HANDLE} = $Net::XMPP::Debug::HANDLES{$args{file}};
215 0         0 $self->{HANDLE}->autoflush(1);
216             }
217             else
218             {
219 0 0       0 if (-e $args{file})
220             {
221 0 0       0 if (-w $args{file})
222             {
223 0         0 $self->{HANDLE} = FileHandle->new(">$args{file}");
224 0 0       0 if (defined($self->{HANDLE}))
225             {
226 0         0 $self->{HANDLE}->autoflush(1);
227 0         0 $Net::XMPP::Debug::HANDLES{$args{file}} = $self->{HANDLE};
228             }
229             else
230             {
231 0         0 print STDERR "ERROR: Debug filehandle could not be opened.\n";
232 0         0 print STDERR" Debugging disabled.\n";
233 0         0 print STDERR " ($!)\n";
234 0         0 $self->{LEVEL} = -1;
235             }
236             }
237             else
238             {
239 0         0 print STDERR "ERROR: You do not have permission to write to $args{file}.\n";
240 0         0 print STDERR" Debugging disabled.\n";
241 0         0 $self->{LEVEL} = -1;
242             }
243             }
244             else
245             {
246 0         0 $self->{HANDLE} = FileHandle->new(">$args{file}");
247 0 0       0 if (defined($self->{HANDLE}))
248             {
249 0         0 $self->{HANDLE}->autoflush(1);
250 0         0 $Net::XMPP::Debug::HANDLES{$args{file}} = $self->{HANDLE};
251             }
252             else
253             {
254 0         0 print STDERR "ERROR: Debug filehandle could not be opened.\n";
255 0         0 print STDERR" Debugging disabled.\n";
256 0         0 print STDERR " ($!)\n";
257 0         0 $self->{LEVEL} = -1;
258             }
259             }
260             }
261             }
262             }
263             }
264 32 100       124 if ($args{setdefault} == 1)
265             {
266 17         40 $Net::XMPP::Debug::DEFAULT = $self->{HANDLE};
267 17         38 $Net::XMPP::Debug::DEFAULTLEVEL = $self->{LEVEL};
268 17         46 $Net::XMPP::Debug::DEFAULTTIME = $self->{TIME};
269             }
270              
271 32         71 $self->{HEADER} = "Debug";
272 32 50       197 $self->{HEADER} = $args{header} if exists($args{header});
273             }
274              
275              
276             ##############################################################################
277             #
278             # Log - takes the limit and the array to log and logs them
279             #
280             ##############################################################################
281             sub Log
282             {
283 0     0 0 0 my $self = shift;
284 0         0 my (@args) = @_;
285              
286 0         0 my $fh = $self->{HANDLE};
287 0 0       0 $fh = $Net::XMPP::Debug::DEFAULT if exists($self->{USEDEFAULT});
288 0 0       0 return if not $fh;
289              
290 0         0 my $string = "";
291              
292 0         0 my $testTime = $self->{TIME};
293 0 0       0 $testTime = $Net::XMPP::Debug::DEFAULTTIME if exists($self->{USEDEFAULT});
294              
295 0 0       0 $string .= "[".&Net::XMPP::GetTimeStamp("local",time,"short")."] "
296             if ($testTime == 1);
297 0         0 $string .= $self->{HEADER}.": ";
298              
299 0         0 my $arg;
300              
301 0         0 foreach $arg (@args)
302             {
303 0 0       0 if (ref($arg) eq "HASH")
304             {
305 0         0 $string .= " {";
306 0         0 my $key;
307 0         0 foreach $key (sort {$a cmp $b} keys(%{$arg}))
  0         0  
  0         0  
308             {
309 0         0 $string .= " ".$key."=>'".$arg->{$key}."'";
310             }
311 0         0 $string .= " }";
312             }
313             else
314             {
315 0 0       0 if (ref($arg) eq "ARRAY")
316             {
317 0         0 $string .= " [ ".join(" ",@{$arg})." ]";
  0         0  
318             } else {
319 0         0 $string .= $arg;
320             }
321             }
322             }
323 0         0 print $fh "$string\n";
324 0         0 return 1;
325             }
326              
327              
328             ##############################################################################
329             #
330             # AUTOLOAD - if a function is called that is not defined then this function
331             # will examine the function name and either give an error or call
332             # the appropriate function.
333             #
334             ##############################################################################
335             sub AUTOLOAD
336             {
337 2185     2185   2057 my $self = shift;
338 2185 50       4927 return if ($AUTOLOAD =~ /::DESTROY$/);
339 2185         7790 my ($function) = ($AUTOLOAD =~ /\:\:(.*)$/);
340 2185 50       5858 croak("$function not defined") if !($function =~ /Log\d+/);
341 2185         4367 my ($level) = ($function =~ /Log(\d+)/);
342 2185 100       8539 return 0 if ($level > (exists($self->{USEDEFAULT}) ? $Net::XMPP::Debug::DEFAULTLEVEL : $self->{LEVEL}));
    50          
343 0         0 $self->Log(@_);
344             }
345              
346              
347             ##############################################################################
348             #
349             # GetHandle - returns the filehandle being used by this object.
350             #
351             ##############################################################################
352             sub GetHandle
353             {
354 11     11 0 21 my $self = shift;
355 11         61 return $self->{HANDLE};
356             }
357              
358              
359             ##############################################################################
360             #
361             # GetLevel - returns the debug level used by this object.
362             #
363             ##############################################################################
364             sub GetLevel
365             {
366 11     11 0 25 my $self = shift;
367 11         56 return $self->{LEVEL};
368             }
369              
370              
371             ##############################################################################
372             #
373             # GetTime - returns the debug time used by this object.
374             #
375             ##############################################################################
376             sub GetTime
377             {
378 11     11 0 22 my $self = shift;
379 11         127 return $self->{TIME};
380             }
381              
382              
383             1;