#! 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/oltocObjectMo +delApplication.asp # Microsoft's MSDN information about the OLE interface with MS Outlo +ok # # - 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/$s +tartyear 00:00\&'"); $calitems = $calitems->Restrict("[Start] <= '\& $endmon/$endday/$endye +ar 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 patte +rn for this appointment my $exceptions = $pattern->{Exceptions}; #get the exceptions to the + recurrence rule my %deleted; #use this when processin t +he 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 thi +s 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"),$olda +ppoint->{Start}->Date("M")-1,$oldappoint->{Start}->Date("yyyy")-1900) +; if ($temp >= timelocal(0,0,0,$startday,$startmon-1,$startyear-19 +00) && $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 patter +ns... #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 binar +y 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 th +ese #functions to increase execution speed. The results/requirements fo +r 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 recurr +ences #are specified. #http://msdn.microsoft.com/library/en-us/vbaol10/html/olobjRecurrenc +ePattern.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"),$p +attern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}- +>Date("yyyy")-1900) < timelocal(0,0,0,$startday,$startmon-1,$startyea +r-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->{Patt +ernStartDate}->Date("yyyy")-1900); } while ($curdate <= $stopdate) { $curdayweek = pow(2,(localtime($curdate))[6]); my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($cu +rdate))[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 Febru +ary March April May June July August September October November Decem +ber)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("H +H:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January Februar +y March April May June July August September October November Decembe +r)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm +")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January Febr +uary March April May June July August September October November Dece +mber)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{En +dTime}->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"),$patte +rn->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Dat +e("yyyy")-1900); while ($curdate <= $stopdate) { $curdayweek = pow(2,(localtime($curdate))[6]); my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($cu +rdate))[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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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-19 +00); $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d +"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartD +ate}->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/$cu +rday/$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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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-19 +00); $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d +"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartD +ate}->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 && !define +d($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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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-19 +00); $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d +"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartD +ate}->Date("yyyy")-1900); while ($curdate <= $stopdate) { $curdayweek = pow(2,(localtime($curdate))[6]); my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($curd +ate))[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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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->{MonthOfYea +r}-1,$endyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-190 +0) && timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea +r}-1,$endyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startye +ar-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 Ma +rch 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) ." ". $en +dyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } elsif (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOf +Year}-1,$startyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyea +r-1900) && timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea +r}-1,$startyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$start +year-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} ." ". $startye +ar ." ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February Ma +rch 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) ." ". $st +artyear ." ". $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-19 +00); $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 && !define +d($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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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"),$patt +ern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Da +te("yyyy")-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-1900) && timelocal(0,0,0,$pattern->{PatternEndDate}->Date("d"),$patter +n->{PatternEndDate}->Date("M")-1,$pattern->{PatternEndDate}->Date("yy +yy")-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($cu +rdate))[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 Febru +ary March April May June July August September October November Decem +ber)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("H +H:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January Februar +y March April May June July August September October November Decembe +r)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm +")); if ($item->{Start} == $item->{End}) { $item->{End} = Variant(VT_DATE, qw(Blank January Febr +uary March April May June July August September October November Dece +mber)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{En +dTime}->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($cu +rdate))[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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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,$en +dday,$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-19 +00); $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/$cu +rday/$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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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,$en +dday,$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-19 +00); $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 && !define +d($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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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,$c +urdayweek); $loopday=$psd; $loopmon=$psm; $loopyear=$psy; if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$en +dday,$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-19 +00); $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($curd +ate))[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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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->{MonthOfYea +r}-1,$endyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-190 +0) && timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea +r}-1,$endyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startye +ar-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 Ma +rch 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) ." ". $en +dyear ." ". $pattern->{EndTime}->Time("HH:mm")); } push(@itemstodisplay,$item); } } elsif (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOf +Year}-1,$startyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyea +r-1900) && timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea +r}-1,$startyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$start +year-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} ." ". $startye +ar ." ". $pattern->{StartTime}->Time("HH:mm")); $item->{End} = Variant(VT_DATE, qw(Blank January February Ma +rch 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) ." ". $st +artyear ." ". $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,$en +dday,$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-19 +00); $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 && !define +d($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 Februar +y March April May June July August September October November Decembe +r)[$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 Februa +ry March April May June July August September October November Decemb +er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT +ime}->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"),$itemst +odisplay[$loop]->{Start}->Time("H"),$itemstodisplay[$loop]->{Start}-> +Date("d"),$itemstodisplay[$loop]->{Start}->Date("M")-1,$itemstodispla +y[$loop]->{Start}->Date("yyyy")-1900) > timelocal(0,$itemstodisplay[$loop+1]->{Start}->Time("m"),$item +stodisplay[$loop+1]->{Start}->Time("H"),$itemstodisplay[$loop+1]->{St +art}->Date("d"),$itemstodisplay[$loop+1]->{Start}->Date("M")-1,$items +todisplay[$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"),$ite +mstodisplay[$loop]->{Start}->Time("H"),$itemstodisplay[$loop]->{Start +}->Date("d"),$itemstodisplay[$loop]->{Start}->Date("M")-1,$itemstodis +play[$loop]->{Start}->Date("yyyy")-1900) == timelocal(0,$itemstodisplay[$loop+1]->{Start}->Time("m"),$ite +mstodisplay[$loop+1]->{Start}->Time("H"),$itemstodisplay[$loop+1]->{S +tart}->Date("d"),$itemstodisplay[$loop+1]->{Start}->Date("M")-1,$item +stodisplay[$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 n +ext 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-19 +00) - 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] ." $da +y $year 23:59"); } print $it->{Start}->Date("ddd MMM d',' yy") ." ". $it->{Start}->Time +("HH:mm") ." - ". $it->{End}->Date("ddd MMM d',' yy") ." ". $it->{En +d}->Time("HH:mm") ."\n $it->{Subject} ($it->{Location})\n\n"; }
In reply to MS Outlook Calendar Parser by RescueDEW
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |