| Category: | Utilities |
| Author/Contact Info | David Weand (dweand@vt.edu) http://dweand.campus.vt.edu< |
| Description: | This program opens MS Outlook on your computer and then parses the default calendar folder for appointments that will occur in the next seven days and displays these to the screen. I had searched Perl Monks for help on this problem, and I didn't find many items. It was hard to find things on other pages also, so I thought I would help out by posting what I came up with. Some of the functions are probably not as clean as they could be (in fact, there are no functions which is one improvement that could probably be made.) |
#! 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"; } |
|
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: MS Outlook Calendar Parser
by grep (Monsignor) on Jan 12, 2002 at 08:04 UTC |