| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
#!/usr/bin/perl -w |
|
2
|
|
|
|
|
|
|
# vi:sts=4:shiftwidth=4 |
|
3
|
|
|
|
|
|
|
# -*- Mode: perl -*- |
|
4
|
|
|
|
|
|
|
#====================================================================== |
|
5
|
|
|
|
|
|
|
# |
|
6
|
|
|
|
|
|
|
# This package is free software and is provided "as is" without |
|
7
|
|
|
|
|
|
|
# express or implied warranty. It may be used, redistributed and/or |
|
8
|
|
|
|
|
|
|
# modified under the same terms as perl itself. ( Either the Artistic |
|
9
|
|
|
|
|
|
|
# License or the GPL. ) |
|
10
|
|
|
|
|
|
|
# |
|
11
|
|
|
|
|
|
|
# $Id: Alarm.pm,v 1.19 2001/07/19 03:32:32 srl Exp $ |
|
12
|
|
|
|
|
|
|
# |
|
13
|
|
|
|
|
|
|
# (C) COPYRIGHT 2000-2001, Reefknot developers. |
|
14
|
|
|
|
|
|
|
# |
|
15
|
|
|
|
|
|
|
# See the AUTHORS file included in the distribution for a full list. |
|
16
|
|
|
|
|
|
|
#====================================================================== |
|
17
|
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
=head1 NAME |
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
Net::ICal::Alarm -- represents an alarm (a VALARM object). |
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
=cut |
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
package Net::ICal::Alarm; |
|
25
|
1
|
|
|
1
|
|
6
|
use strict; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
40
|
|
|
26
|
|
|
|
|
|
|
|
|
27
|
1
|
|
|
1
|
|
5
|
use base qw(Net::ICal::Component); |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
704
|
|
|
28
|
1
|
|
|
1
|
|
725
|
use Net::ICal::Trigger; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
14
|
|
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
31
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
use Net::ICal; |
|
33
|
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
# simple syntax |
|
35
|
|
|
|
|
|
|
$a = new Net::ICal::Alarm(action => 'DISPLAY', |
|
36
|
|
|
|
|
|
|
trigger => "20000101T073000", |
|
37
|
|
|
|
|
|
|
description => "Wake Up!"); |
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
# elaborate |
|
40
|
|
|
|
|
|
|
$a = new Net::ICal::Alarm (action => 'EMAIL', |
|
41
|
|
|
|
|
|
|
trigger => new Net::ICal::Trigger ( |
|
42
|
|
|
|
|
|
|
type => 'DURATION', |
|
43
|
|
|
|
|
|
|
content => new Net::ICal::Duration ("-PT5M"), |
|
44
|
|
|
|
|
|
|
related => 'END |
|
45
|
|
|
|
|
|
|
), |
|
46
|
|
|
|
|
|
|
attendee => [new Net::ICal::Attendee('mailto:alice@wonderland.com')], |
|
47
|
|
|
|
|
|
|
summary => "mail subject", |
|
48
|
|
|
|
|
|
|
description => "mail contents"); |
|
49
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
51
|
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
This class handles reminders for Net::ICal Events and Todos. You can |
|
53
|
|
|
|
|
|
|
get a reminder in several different ways (a sound played, a message |
|
54
|
|
|
|
|
|
|
displayed on your screen, an email or a script/application run |
|
55
|
|
|
|
|
|
|
for you) at a certain time, either relative to the Event or Todo |
|
56
|
|
|
|
|
|
|
the Alarm is part of, or at a fixed date/time. |
|
57
|
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
=head1 CONSTRUCTOR |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
=head2 new (optionhash) |
|
61
|
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
Create a new Alarm. The minimum options are an action, a trigger and |
|
63
|
|
|
|
|
|
|
either an attach or a description. |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
The action describes what type of Alarm this is going to be. See |
|
66
|
|
|
|
|
|
|
L<"action"> below for possible actions. The trigger describes when |
|
67
|
|
|
|
|
|
|
the alarm will be triggered. See L<"trigger"> below for an explanation. |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=begin testing |
|
70
|
|
|
|
|
|
|
use Net::ICal::Alarm; |
|
71
|
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
my $a = Net::ICal::Alarm->new(); |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
ok(!(defined($a)), 'new Alarm with no events should fail'); |
|
75
|
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
$a = Net::ICal::Alarm->new( action => 'DISPLAY', |
|
78
|
|
|
|
|
|
|
trigger => '-5M', |
|
79
|
|
|
|
|
|
|
description => 'time for meeting'); |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
ok(defined($a), 'new Alarm with DISPLAY, trigger, and desc is created'); |
|
82
|
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
$a = Net::ICal::Alarm->new( action => 'EMAIL', |
|
84
|
|
|
|
|
|
|
trigger => '-5M', |
|
85
|
|
|
|
|
|
|
description => 'time for meeting'); |
|
86
|
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
ok(defined($a), 'new Alarm with EMAIL, trigger, and desc is created'); |
|
88
|
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
# TODO: we need as_ical tests and such. These tests are only |
|
90
|
|
|
|
|
|
|
# barely adequate. |
|
91
|
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
=end testing |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
=cut |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
sub new { |
|
97
|
0
|
|
|
0
|
1
|
|
my ($class, %args) = @_; |
|
98
|
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
# this implements the heart of RFC2445 4.6.6, which says what |
|
100
|
|
|
|
|
|
|
# elements in an Alarm are required to be used. |
|
101
|
|
|
|
|
|
|
# Anything that's "return undef" is requred. |
|
102
|
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
# action and trigger are required. |
|
104
|
0
|
0
|
|
|
|
|
return undef unless defined $args{'action'}; |
|
105
|
0
|
0
|
|
|
|
|
return undef unless defined $args{'trigger'}; |
|
106
|
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
# display and email alarms must have descriptions. |
|
108
|
0
|
0
|
0
|
|
|
|
if ($args{'action'} eq 'DISPLAY' or $args{'action'} eq 'EMAIL') { |
|
109
|
0
|
0
|
|
|
|
|
return undef unless defined $args{'description'}; |
|
110
|
|
|
|
|
|
|
} |
|
111
|
0
|
0
|
0
|
|
|
|
if (($args{'action'} ne 'EMAIL') and (defined $args{'attendee'})) { |
|
112
|
0
|
|
|
|
|
|
return undef; |
|
113
|
|
|
|
|
|
|
} |
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
# procedure alarms must invoke an attachment. |
|
116
|
|
|
|
|
|
|
# TODO: Attachments? This could be (is) implemented very poorly in some |
|
117
|
|
|
|
|
|
|
# of MS's software. eek. |
|
118
|
|
|
|
|
|
|
#BUG: 404132 |
|
119
|
0
|
0
|
|
|
|
|
if ($args{'action'} eq 'PROCEDURE') { |
|
120
|
0
|
0
|
|
|
|
|
return undef unless defined $args{'attach'}; |
|
121
|
|
|
|
|
|
|
} |
|
122
|
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
# duration and repeat must be used together or not at all. |
|
124
|
0
|
0
|
0
|
|
|
|
if (defined $args{'duration'} xor defined $args{'repeat'}) { |
|
125
|
0
|
|
|
|
|
|
return undef; |
|
126
|
|
|
|
|
|
|
} |
|
127
|
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
#FIXME: it sucks we have to do this in every component. better |
|
129
|
|
|
|
|
|
|
# try to get this into Component |
|
130
|
|
|
|
|
|
|
#BUG: 233771 |
|
131
|
0
|
|
|
|
|
|
my $t = $args{'trigger'}; |
|
132
|
0
|
0
|
|
|
|
|
unless (ref ($t)) { |
|
133
|
0
|
|
|
|
|
|
$args{'trigger'} = new Net::ICal::Trigger ($t); |
|
134
|
|
|
|
|
|
|
} |
|
135
|
|
|
|
|
|
|
|
|
136
|
0
|
|
|
|
|
|
return &_create ($class, %args); |
|
137
|
|
|
|
|
|
|
} |
|
138
|
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
#============================================================================ |
|
140
|
|
|
|
|
|
|
# create ($class, %args) |
|
141
|
|
|
|
|
|
|
# |
|
142
|
|
|
|
|
|
|
# sets up a map of the properties that N::I::Alarm objects share. |
|
143
|
|
|
|
|
|
|
# See Net::ICal::Component and Class::MethodMapper if you want to know |
|
144
|
|
|
|
|
|
|
# how this works. Takes a class name and a hash of arguments, returns a new |
|
145
|
|
|
|
|
|
|
# Net::ICal::Alarm object. |
|
146
|
|
|
|
|
|
|
#============================================================================ |
|
147
|
|
|
|
|
|
|
sub _create { |
|
148
|
0
|
|
|
0
|
|
|
my ($class, %args) = @_; |
|
149
|
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
=head1 METHODS |
|
151
|
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
=head2 action |
|
153
|
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
What the Alarm does when fired. The default type is EMAIL. |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
=over 4 |
|
157
|
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
=item * AUDIO - play an audio file. Requires an L<"attach"> property |
|
159
|
|
|
|
|
|
|
(a soundfile). |
|
160
|
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
=item * DISPLAY - pop up a note on the screen. Requires a L<"description"> |
|
162
|
|
|
|
|
|
|
containing the text of the note. |
|
163
|
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
=item * EMAIL - send an email. Requires a L<"description"> containing the |
|
165
|
|
|
|
|
|
|
email body and one or more L<"attendee">s for the email address(es). |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
=item * PROCEDURE - trigger a procedure described by an L<"attach"> |
|
168
|
|
|
|
|
|
|
which is the command to execute (required). |
|
169
|
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
=back |
|
171
|
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
=head2 trigger |
|
173
|
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
The time at which to fire off the reminder. This can either be relative |
|
175
|
|
|
|
|
|
|
to the Event/Todo (a L or at a fixed date/time |
|
176
|
|
|
|
|
|
|
(a L). |
|
177
|
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
=head2 summary |
|
179
|
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
If the Alarm has an EMAIL L<"action">, the text of the summary string |
|
181
|
|
|
|
|
|
|
will be the Subject header of the email. |
|
182
|
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
=head2 description |
|
184
|
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
If the Alarm has an EMAIL L<"action">, the text of the description string |
|
186
|
|
|
|
|
|
|
will be the body of the email. If the Alarm has a PROCEDURE L<"action">, |
|
187
|
|
|
|
|
|
|
this is the argument string to be passed to the program. |
|
188
|
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
=head2 attach |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
If the Alarm has an AUDIO L<"action">, this contains the sound to be played, |
|
192
|
|
|
|
|
|
|
either as an URL or inline. If the Alarm has an EMAIL L<"action">, this |
|
193
|
|
|
|
|
|
|
will be attached to the email. If the Alarm has a PROCEDURE L<"action">, |
|
194
|
|
|
|
|
|
|
it contains the application to be executed. |
|
195
|
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
=head2 attendee |
|
197
|
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
If the Alarm has an EMAIL L<"action">, this contains one or more |
|
199
|
|
|
|
|
|
|
L objects that describe the email addresses of the |
|
200
|
|
|
|
|
|
|
people that need to receive this Alarm. |
|
201
|
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
=head2 repeat |
|
203
|
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
The number of times the Alarm must be repeated. If you specify this, |
|
205
|
|
|
|
|
|
|
you must also specify L<"duration">. |
|
206
|
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
=head2 duration |
|
208
|
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
The time before the Alarm is repeated. This is a L |
|
210
|
|
|
|
|
|
|
object. If you specify this, you must also specify L<"repeat">. |
|
211
|
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
=cut |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
#TODO: validation of the parameters is performed by the new method. |
|
215
|
|
|
|
|
|
|
# actually, validation needs to be consistantly put in |
|
216
|
|
|
|
|
|
|
# a seperate sub |
|
217
|
|
|
|
|
|
|
|
|
218
|
0
|
|
|
|
|
|
my $map = { # RFC2445 4.6.6 |
|
219
|
|
|
|
|
|
|
action => { # 4.8.6.1 |
|
220
|
|
|
|
|
|
|
type => 'parameter', |
|
221
|
|
|
|
|
|
|
doc => 'the action type of this alarm', |
|
222
|
|
|
|
|
|
|
domain => 'enum', |
|
223
|
|
|
|
|
|
|
options => [qw(AUDIO DISPLAY EMAIL PROCEDURE)], |
|
224
|
|
|
|
|
|
|
value => 'EMAIL', # default |
|
225
|
|
|
|
|
|
|
}, |
|
226
|
|
|
|
|
|
|
trigger => { # 4.8.6.3 |
|
227
|
|
|
|
|
|
|
type => 'parameter', |
|
228
|
|
|
|
|
|
|
doc => 'when the alarm will be triggered', |
|
229
|
|
|
|
|
|
|
domain => 'ref', |
|
230
|
|
|
|
|
|
|
options => 'Net::ICal::Trigger', |
|
231
|
|
|
|
|
|
|
value => undef, |
|
232
|
|
|
|
|
|
|
}, |
|
233
|
|
|
|
|
|
|
description => { # 4.8.1.5 |
|
234
|
|
|
|
|
|
|
type => 'parameter', |
|
235
|
|
|
|
|
|
|
doc => 'description of this alarm', |
|
236
|
|
|
|
|
|
|
domain => 'param', |
|
237
|
|
|
|
|
|
|
options => [qw(altrep language)], |
|
238
|
|
|
|
|
|
|
value => undef, |
|
239
|
|
|
|
|
|
|
}, |
|
240
|
|
|
|
|
|
|
# this might be better off as a class |
|
241
|
|
|
|
|
|
|
attach => { #4.8.1.1 |
|
242
|
|
|
|
|
|
|
type => 'parameter', |
|
243
|
|
|
|
|
|
|
doc => 'an attachment', |
|
244
|
|
|
|
|
|
|
domain => 'param', |
|
245
|
|
|
|
|
|
|
options => [qw(encoding value fmttype)], |
|
246
|
|
|
|
|
|
|
value => undef, |
|
247
|
|
|
|
|
|
|
}, |
|
248
|
|
|
|
|
|
|
summary => { # 4.8.1.12 |
|
249
|
|
|
|
|
|
|
type => 'parameter', |
|
250
|
|
|
|
|
|
|
doc => 'the summary (subject) if this is an EMAIL alarm', |
|
251
|
|
|
|
|
|
|
domain => 'param', |
|
252
|
|
|
|
|
|
|
options => [qw(altrep language)], |
|
253
|
|
|
|
|
|
|
value => undef, |
|
254
|
|
|
|
|
|
|
}, |
|
255
|
|
|
|
|
|
|
attendee => { # 4.8.4.1 |
|
256
|
|
|
|
|
|
|
type => 'parameter', |
|
257
|
|
|
|
|
|
|
doc => 'the attendees (receivers of the email) for this EMAIL alarm', |
|
258
|
|
|
|
|
|
|
domain => 'ref', |
|
259
|
|
|
|
|
|
|
options => 'ARRAY', |
|
260
|
|
|
|
|
|
|
value => undef, |
|
261
|
|
|
|
|
|
|
}, |
|
262
|
|
|
|
|
|
|
duration => { # 4.8.2.5 |
|
263
|
|
|
|
|
|
|
type => 'parameter', |
|
264
|
|
|
|
|
|
|
doc => 'the delay period between alarm repetitions', |
|
265
|
|
|
|
|
|
|
value => 0, |
|
266
|
|
|
|
|
|
|
}, |
|
267
|
|
|
|
|
|
|
repeat => { # 4.8.6.2 |
|
268
|
|
|
|
|
|
|
type => 'parameter', |
|
269
|
|
|
|
|
|
|
doc => 'the amount of times the alarm is repeated', |
|
270
|
|
|
|
|
|
|
value => 0, |
|
271
|
|
|
|
|
|
|
}, |
|
272
|
|
|
|
|
|
|
}; |
|
273
|
0
|
|
|
|
|
|
my $self = $class->SUPER::new ('VALARM', $map, %args); |
|
274
|
|
|
|
|
|
|
|
|
275
|
0
|
|
|
|
|
|
return $self; |
|
276
|
|
|
|
|
|
|
} |
|
277
|
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
1; |
|
279
|
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
281
|
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
More documentation pointers can be found in L. |
|
283
|
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
=cut |