#! perl.exe ###################################################################### # This program will open Microsoft Outlook on your computer and # display the next seven days of events from the default calendar # found in the default Outlook file. # # Written by David Weand (dweand@vt.edu) # Friday, January 11th, 2002 # # http://dweand.campus.vt.edu ###################################################################### # Useful developing information found at # - http://msdn.microsoft.com/library/en-us/vbaol10/html/oltocObjectModelApplication.asp # Microsoft's MSDN information about the OLE interface with MS Outlook # # - http://www.xav.com/perl/site/lib/Win32/OLE.html # ActiveState's online documentation for Win32::OLE ###################################################################### use strict; use Win32::OLE; use Win32::OLE::Const 'Microsoft Outlook'; use Win32::OLE::Variant; use Time::Local; use POSIX; #Get today and a week from today my $ONE_DAY = 60*60*24; my @mytime = localtime(time); my $startmon = $mytime[4]+1; my $startday = $mytime[3]; my $startyear= $mytime[5]+1900; @mytime = localtime(time + 7*$ONE_DAY); my $endmon = $mytime[4]+1; my $endday = $mytime[3]; my $endyear= $mytime[5]+1900; print "Start: $startmon/$startday/$startyear\n"; print "End : $endmon/$endday/$endyear\n\n"; #open the Outlook program my $outlook; eval { $outlook = Win32::OLE->GetActiveObject('Outlook.Application') }; if ($@ || !defined($outlook)) { $outlook = Win32::OLE->new('Outlook.Application', sub {$_[0]->Quit;}) or die "oops\n"; } #open the default Calendar and grab the items in the calendar (twice...) my $namespace = $outlook->GetNameSpace("MAPI") or die "can't open MAPI namespace\n"; my $recurringitems = $namespace->GetDefaultFolder(olFolderCalendar)->{Items}; my $calitems = $namespace->GetDefaultFolder(olFolderCalendar)->{Items}; #separate between the recurring and non-recurring items $recurringitems = $recurringitems->Restrict("[IsRecurring] = true"); $calitems = $calitems->Restrict("[IsRecurring] = false"); #can easily and quickly condense the non-recurring calendar items $calitems = $calitems->Restrict("[Start] >= '\& $startmon/$startday/$startyear 00:00\&'"); $calitems = $calitems->Restrict("[Start] <= '\& $endmon/$endday/$endyear 23:59\&'"); my $count=0; #This will hold all the events occuring in our time frame # Array of Hashes my @itemstodisplay; $count = $calitems->{Count}; my $it = $calitems->GetFirst; #get the first Appointment item for (my $i=0;$i<$count;$i++) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = $it->{Start}; $item->{End} = $it->{End}; push(@itemstodisplay,$item); $it = $calitems->GetNext; } $count = $recurringitems->{Count}; $it = $recurringitems->GetFirst; #get the first appointment item for (my $i=0;$i<$count;$i++) { my $pattern = $it->GetRecurrencePattern; #get the recurrnence pattern for this appointment my $exceptions = $pattern->{Exceptions}; #get the exceptions to the recurrence rule my %deleted; #use this when processin the exceptions for (my $looper=1; $looper<=$exceptions->{Count}; $looper++) { #loop through the exceptions using the Item function call my $thisone = $exceptions->Item($looper); my @temp1 = split(/ /,$thisone->{OriginalDate}); $deleted{$temp1[0]} = 1; #won't want to display an appointment this day... my $oldappoint = $thisone->{AppointmentItem}; if (defined $oldappoint) # but if it was moved to a different day, want to display that one { my $item; $item->{Subject} = $oldappoint->{Subject}; $item->{Location} = $oldappoint->{Location}; $item->{AllDayEvent} = $oldappoint->{AllDayEvent}; $item->{Duration} = $oldappoint->{Duration}; $item->{Start} = $oldappoint->{Start}; $item->{End} = $oldappoint->{End}; my $temp = timelocal(0,0,0,$oldappoint->{Start}->Date("d"),$oldappoint->{Start}->Date("M")-1,$oldappoint->{Start}->Date("yyyy")-1900); if ($temp >= timelocal(0,0,0,$startday,$startmon-1,$startyear-1900) && $temp <= timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)) { push(@itemstodisplay,$item); } } } #Now have to do the nasty work of figuring out the recurrence patterns... #I began by dividing the item into either Ending or Non-Ending dates. #Then using the constants provided in OLE, determined what type of #recurrence it was. #Interesting trick (and more than a few of my friends would not have #thought Micro$oft smart enough to do this... ;-} ) was the #DayOfWeekMask- the field is an integer that is obtained using binary values. # Sunday = 1 0000001 # Monday = 2 0000010 # Tuesday = 4 0000100 # Wednesday = 8 0001000 # Thursday = 16 0010000 # Friday = 32 0100000 # Saturday = 64 1000000 #To obtain the DayOfWeekMask, you take the days that the appointment #should occur on, and you bit-wise OR those days together. # MonWedFri = 42 0101010 #To reverse this process, you find which days it belongs on by using #a bit-wise AND statement- if the result is greater than Zero, then #the appointment occurs on that day. #The Date fields can be deciphered using the OLE date() and time() #functions. I incorporate the localtime() and timelocal() functions #a lot in this program. Thankfully, the perl gods have optimized these #functions to increase execution speed. The results/requirements for the #functions are: # (sec,min,hour,mday,mon,year,wday,yday,isdst) = localtime(time) # time = timelocal(sec,min,hour,mday,mon,year,wday,yday,isdst) #NOTE: mon = 0..11; year -= 1900 (ie. 1999 = 99); wday = 0..6 #The Microsoft MSDN site provides an explanation of how these recurrences #are specified. #http://msdn.microsoft.com/library/en-us/vbaol10/html/olobjRecurrencePattern.asp if ($pattern->{NoEndDate}) { if ($pattern->{RecurrenceType} == olRecursDaily) { if ($pattern->{DayOfWeekMask}) { my ($curdate,$stopdate,$curdayweek); $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); if (timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Date("yyyy")-1900) < timelocal(0,0,0,$startday,$startmon-1,$startyear-1900)) { $curdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); } else { $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Date("yyyy")-1900); } while ($curdate <= $stopdate) { $curdayweek = pow(2,(localtime($curdate))[6]); my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($curdate))[3] ."/". ((localtime($curdate))[5]+1900); if (!defined($deleted{$temp})) { if ($pattern->{DayOfWeekMask} & $curdayweek) { my $curmonth = (localtime($curdate))[4] +1; my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } $curdate += $ONE_DAY; } } else { my ($curdate,$startdate,$stopdate,$curdayweek); $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Date("yyyy")-1900); while ($curdate <= $stopdate) { $curdayweek = pow(2,(localtime($curdate))[6]); my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($curdate))[3] ."/". ((localtime($curdate))[5]+1900); if ($curdate >= $startdate && !defined($deleted{$temp})) { my $curmonth = (localtime($curdate))[4] +1; my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } $curdate += $pattern->{Interval} * $ONE_DAY; } } } if ($pattern->{RecurrenceType} == olRecursMonthly) { my ($curdate,$startdate,$stopdate,$curdayweek); $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Date("yyyy")-1900); while ($curdate <= $stopdate) { my $curmonth = (localtime($curdate))[4] +1; my $curday = $it->{DayOfMonth}; my $curyear = (localtime($curdate))[5] +1900; if ($curdate >= $startdate && !defined($deleted{"$curmonth/$curday/$curyear"})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } $curmonth += $pattern->{Interval}; if ($curmonth > 12) { $curyear++; $curmonth-=12; } $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); } } if ($pattern->{RecurrenceType} == olRecursMonthNth) { my ($curdate,$startdate,$stopdate,$curdayweek); $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Date("yyyy")-1900); while ($curdate <= $stopdate) { my $curmonth = (localtime($curdate))[4] +1; my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; $curdayweek = pow(2,(localtime($curdate))[6]); my $countdown = $pattern->{Instance}; if ($countdown == 5) { $curmonth++; if ($curmonth==13) { $curyear++; $curmonth=1; } $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); $curdate -= $ONE_DAY; while ($countdown>0) { $curdayweek = pow(2,(localtime($curdate))[6]); if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown = 0; } else { $curdate -= $ONE_DAY; } } } while ($countdown>0) { $curmonth = (localtime($curdate))[4] +1; $curday = (localtime($curdate))[3]; $curyear = (localtime($curdate))[5] +1900; $curdayweek = pow(2,(localtime($curdate))[6]); if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown--; } else { $curdate+= $ONE_DAY; } } $curmonth = (localtime($curdate))[4] +1; $curday = (localtime($curdate))[3]; $curyear = (localtime($curdate))[5] +1900; if ($curdate >= $startdate && $curdate <= $stopdate && !defined($deleted{"$curmonth/$curday/$curyear"})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } $curmonth += $pattern->{Interval}; $curday = 1; if ($curmonth > 12) { $curyear++; $curmonth-=12; } $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); } } if ($pattern->{RecurrenceType} == olRecursWeekly) { my ($curdate,$startdate,$stopdate,$curdayweek); $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Date("yyyy")-1900); while ($curdate <= $stopdate) { $curdayweek = pow(2,(localtime($curdate))[6]); my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($curdate))[3] ."/". ((localtime($curdate))[5]+1900); if ($curdate >= $startdate && !defined($deleted{$temp})) { if ($pattern->{DayOfWeekMask} & $curdayweek) { my $curmonth = (localtime($curdate))[4] +1; my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } $curdate += $ONE_DAY; if ($curdayweek == 64 && $pattern->{Interval} > 1) { $curdate += ($pattern->{Interval} - 1)*7*$ONE_DAY; } } } if ($pattern->{RecurrenceType} == olRecursYearly) { if (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYear}-1,$endyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-1900) && timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYear}-1,$endyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startyear-1900)) { my $temp = $pattern->{MonthOfYear} ."/". $pattern->{DayOfMonth} ."/". $endyear; if (!defined($deleted{$temp})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $endyear ." ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $endyear ." ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". ($pattern->{DayOfMonth}+1) ." ". $endyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } elsif (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYear}-1,$startyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-1900) && timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYear}-1,$startyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startyear-1900)) { my $temp = $pattern->{MonthOfYear} ."/". $pattern->{DayOfMonth} ."/". $startyear; if (!defined($deleted{$temp})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $startyear ." ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $startyear ." ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". ($pattern->{DayOfMonth}+1) ." ". $startyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } } if ($pattern->{RecurrenceType} == olRecursYearNth) { my ($curdate,$startdate,$stopdate,$curdayweek); $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); $curdate = timelocal(0,0,0,1,$startmon-1,$startyear-1900); while ($curdate <= $stopdate) { my $curmonth = (localtime($curdate))[4] +1; while ($curmonth != $pattern->{MonthOfYear}) { $curdate+= $ONE_DAY; $curmonth = (localtime($curdate))[4] +1; } my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; $curdayweek = pow(2,(localtime($curdate))[6]); my $countdown = $pattern->{Instance}; if ($countdown == 5) { $curmonth++; if ($curmonth==13) { $curyear++; $curmonth=1; } $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); $curdate -= $ONE_DAY; while ($countdown>0) { $curdayweek = pow(2,(localtime($curdate))[6]); if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown = 0; } else { $curdate -= $ONE_DAY; } } } while ($countdown>0) { $curmonth = (localtime($curdate))[4] +1; $curday = (localtime($curdate))[3]; $curyear = (localtime($curdate))[5] +1900; $curdayweek = pow(2,(localtime($curdate))[6]); if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown--; } else { $curdate+= $ONE_DAY; } } $curmonth = (localtime($curdate))[4] +1; $curday = (localtime($curdate))[3]; $curyear = (localtime($curdate))[5] +1900; if ($curdate >= $startdate && $curdate <= $stopdate && !defined($deleted{"$curmonth/$curday/$curyear"})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } $curmonth = $pattern->{MonthOfYear}; $curday = 1; $curyear++; $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); } } } elsif (timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Date("yyyy")-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-1900) && timelocal(0,0,0,$pattern->{PatternEndDate}->Date("d"),$pattern->{PatternEndDate}->Date("M")-1,$pattern->{PatternEndDate}->Date("yyyy")-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startyear-1900)) { my ($psm,$psd,$psy,$pem,$ped,$pey); $psm = $pattern->{PatternStartDate}->Date("M"); $psd = $pattern->{PatternStartDate}->Date("d"); $psy = $pattern->{PatternStartDate}->Date("yyyy"); $pem = $pattern->{PatternEndDate}->Date("M"); $ped = $pattern->{PatternEndDate}->Date("d"); $pey = $pattern->{PatternEndDate}->Date("yyyy"); if ($pattern->{RecurrenceType} == olRecursDaily) { if ($pattern->{DayOfWeekMask}) { my ($curdate,$stopdate,$curdayweek); if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)) { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); } else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); } if (timelocal(0,0,0,$psd,$psm-1,$psy-1900) < timelocal(0,0,0,$startday,$startmon-1,$startyear-1900)) { $curdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); } else { $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900); } while ($curdate <= $stopdate) { $curdayweek = pow(2,(localtime($curdate))[6]); my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($curdate))[3] ."/". ((localtime($curdate))[5]+1900); if (!defined($deleted{$temp})) { if ($pattern->{DayOfWeekMask} & $curdayweek) { my $curmonth = (localtime($curdate))[4] +1; my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } $curdate += $ONE_DAY; } } else { my ($curdate,$startdate,$stopdate,$curdayweek); if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)) { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); } else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); } $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900); while ($curdate <= $stopdate) { $curdayweek = pow(2,(localtime($curdate))[6]); my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($curdate))[3] ."/". ((localtime($curdate))[5]+1900); if ($curdate >= $startdate && !defined($deleted{$temp})) { my $curmonth = (localtime($curdate))[4] +1; my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } $curdate += $pattern->{Interval} * $ONE_DAY; } } } if ($pattern->{RecurrenceType} == olRecursMonthly) { my ($curdate,$startdate,$stopdate,$curdayweek); if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)) { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); } else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); } $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900); while ($curdate <= $stopdate) { my $curmonth = (localtime($curdate))[4] +1; my $curday = $it->{DayOfMonth}; my $curyear = (localtime($curdate))[5] +1900; if ($curdate >= $startdate && !defined($deleted{"$curmonth/$curday/$curyear"})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } $curmonth += $pattern->{Interval}; if ($curmonth > 12) { $curyear++; $curmonth-=12; } $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); } } if ($pattern->{RecurrenceType} == olRecursMonthNth) { my ($curdate,$startdate,$stopdate,$curdayweek); if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)) { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); } else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); } $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900); while ($curdate <= $stopdate) { my $curmonth = (localtime($curdate))[4] +1; my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; $curdayweek = pow(2,(localtime($curdate))[6]); my $countdown = $pattern->{Instance}; if ($countdown == 5) { $curmonth++; if ($curmonth==13) { $curyear++; $curmonth=1; } $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); $curdate -= $ONE_DAY; while ($countdown>0) { $curdayweek = pow(2,(localtime($curdate))[6]); if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown = 0; } else { $curdate -= $ONE_DAY; } } } while ($countdown>0) { $curmonth = (localtime($curdate))[4] +1; $curday = (localtime($curdate))[3]; $curyear = (localtime($curdate))[5] +1900; $curdayweek = pow(2,(localtime($curdate))[6]); if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown--; } else { $curdate+= $ONE_DAY; } } $curmonth = (localtime($curdate))[4] +1; $curday = (localtime($curdate))[3]; $curyear = (localtime($curdate))[5] +1900; if ($curdate >= $startdate && $curdate <= $stopdate && !defined($deleted{"$curmonth/$curday/$curyear"})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } $curmonth += $pattern->{Interval}; $curday = 1; if ($curmonth > 12) { $curyear++; $curmonth-=12; } $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); } } if ($pattern->{RecurrenceType} == olRecursWeekly) { my ($loopmon,$loopday,$loopyear,$curdate,$startdate,$stopdate,$curdayweek); $loopday=$psd; $loopmon=$psm; $loopyear=$psy; if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)) { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); } else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); } $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); $curdate = timelocal(0,0,0,$loopday,$loopmon-1,$loopyear-1900); while ($curdate <= $stopdate) { $curdayweek = pow(2,(localtime($curdate))[6]); my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($curdate))[3] ."/". ((localtime($curdate))[5]+1900); if ($curdate >= $startdate && !defined($deleted{$temp})) { if ($pattern->{DayOfWeekMask} & $curdayweek) { my $curmonth = (localtime($curdate))[4] +1; my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } $curdate += $ONE_DAY; if ($curdayweek == 64 && $pattern->{Interval} > 1) { $curdate += ($pattern->{Interval} - 1)*7*$ONE_DAY; } } } if ($pattern->{RecurrenceType} == olRecursYearly) { if (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYear}-1,$endyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-1900) && timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYear}-1,$endyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startyear-1900)) { my $temp = $pattern->{MonthOfYear} ."/". $pattern->{DayOfMonth} ."/". $endyear; if (!defined($deleted{$temp})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $endyear ." ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $endyear ." ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". ($pattern->{DayOfMonth}+1) ." ". $endyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } elsif (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYear}-1,$startyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-1900) && timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYear}-1,$startyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startyear-1900)) { my $temp = $pattern->{MonthOfYear} ."/". $pattern->{DayOfMonth} ."/". $startyear; if (!defined($deleted{$temp})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $startyear ." ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $startyear ." ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$pattern->{MonthOfYear}] ." ". ($pattern->{DayOfMonth}+1) ." ". $startyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } } if ($pattern->{RecurrenceType} == olRecursYearNth) { my ($curdate,$startdate,$stopdate,$curdayweek); if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)) { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); } else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); } $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-1900); $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900); while ($curdate <= $stopdate) { my $curmonth = (localtime($curdate))[4] +1; while ($curmonth != $pattern->{MonthOfYear}) { $curdate+= $ONE_DAY; $curmonth = (localtime($curdate))[4] +1; } my $curday = (localtime($curdate))[3]; my $curyear = (localtime($curdate))[5] +1900; $curdayweek = pow(2,(localtime($curdate))[6]); my $countdown = $pattern->{Instance}; if ($countdown == 5) { $curmonth++; if ($curmonth==13) { $curyear++; $curmonth=1; } $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); $curdate -= $ONE_DAY; while ($countdown>0) { $curdayweek = pow(2,(localtime($curdate))[6]); if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown = 0; } else { $curdate -= $ONE_DAY; } } } while ($countdown>0) { $curmonth = (localtime($curdate))[4] +1; $curday = (localtime($curdate))[3]; $curyear = (localtime($curdate))[5] +1900; $curdayweek = pow(2,(localtime($curdate))[6]); if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown--; } else { $curdate+= $ONE_DAY; } } $curmonth = (localtime($curdate))[4] +1; $curday = (localtime($curdate))[3]; $curyear = (localtime($curdate))[5] +1900; if ($curdate >= $startdate && $curdate <= $stopdate && !defined($deleted{"$curmonth/$curday/$curyear"})) { my $item; $item->{Subject} = $it->{Subject}; $item->{Location} = $it->{Location}; $item->{AllDayEvent} = $it->{AllDayEvent}; $item->{Duration} = $it->{Duration}; $item->{Start} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January February March April May June July August September October November December)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } $curmonth = $pattern->{MonthOfYear}; $curday = 1; $curyear++; $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900); } } } $it = $recurringitems->GetNext; } print "***********************************************************\n"; #sort the items from earliest to latest (including the starting times) #if two entries have the same starting time, sort by name also #Probably could use a more efficient search, but oh well :) $count = $#itemstodisplay; my $changeflag=1; while ($changeflag) { $changeflag=0; for (my $loop=0;$loop<$count;$loop++) { if (timelocal(0,$itemstodisplay[$loop]->{Start}->Time("m"),$itemstodisplay[$loop]->{Start}->Time("H"),$itemstodisplay[$loop]->{Start}->Date("d"),$itemstodisplay[$loop]->{Start}->Date("M")-1,$itemstodisplay[$loop]->{Start}->Date("yyyy")-1900) > timelocal(0,$itemstodisplay[$loop+1]->{Start}->Time("m"),$itemstodisplay[$loop+1]->{Start}->Time("H"),$itemstodisplay[$loop+1]->{Start}->Date("d"),$itemstodisplay[$loop+1]->{Start}->Date("M")-1,$itemstodisplay[$loop+1]->{Start}->Date("yyyy")-1900)) { $changeflag=1; my $item = $itemstodisplay[$loop]; $itemstodisplay[$loop] = $itemstodisplay[$loop+1]; $itemstodisplay[$loop+1] = $item; } elsif (timelocal(0,$itemstodisplay[$loop]->{Start}->Time("m"),$itemstodisplay[$loop]->{Start}->Time("H"),$itemstodisplay[$loop]->{Start}->Date("d"),$itemstodisplay[$loop]->{Start}->Date("M")-1,$itemstodisplay[$loop]->{Start}->Date("yyyy")-1900) == timelocal(0,$itemstodisplay[$loop+1]->{Start}->Time("m"),$itemstodisplay[$loop+1]->{Start}->Time("H"),$itemstodisplay[$loop+1]->{Start}->Date("d"),$itemstodisplay[$loop+1]->{Start}->Date("M")-1,$itemstodisplay[$loop+1]->{Start}->Date("yyyy")-1900) && $itemstodisplay[$loop]->{Subject} gt $itemstodisplay[$loop+1]->{Subject} ) { $changeflag=1; my $item = $itemstodisplay[$loop]; $itemstodisplay[$loop] = $itemstodisplay[$loop+1]; $itemstodisplay[$loop+1] = $item; } } } #display the items to the screen $count = $#itemstodisplay+1; for (my $i=0;$i<$count;$i++) { $it = $itemstodisplay[$i]; #if it ends on the end of the day, MS Outlook makes it 0000 on the next day #Not very clean if you ask me... so I decrease it by a minute if ($it->{End}->Time("HH:mm") eq "00:00") { my $month = $it->{End}->Date("M"); my $day = $it->{End}->Date("d"); my $year = $it->{End}->Date("yyyy"); my $minutes = $it->{End}->Time("m"); my $hours = $it->{End}->Time("H"); my $temptime = timelocal(0,$minutes,$hours,$day,$month-1,$year-1900) - 60; $month = (localtime($temptime))[4]; $day = (localtime($temptime))[3]; $year = (localtime($temptime))[5]+1900; $it->{End} = Variant(VT_DATE, qw(January February March April May June July August September October November December)[$month] ." $day $year 23:59"); } print $it->{Start}->Date("ddd MMM d',' yy") ." ". $it->{Start}->Time("HH:mm") ." - ". $it->{End}->Date("ddd MMM d',' yy") ." ". $it->{End}->Time("HH:mm") ."\n $it->{Subject} ($it->{Location})\n\n"; }