public void WriteAlarm(OLCalItem iCalItem) { if (!iCalItem.hasAlarm ()) return; // this writes just the alarm time // duration and repeat count are not implemented yet iCalFile.WriteLine ("BEGIN:VALARM"); iCalFile.WriteLine (iCalItem.TRIGGER); iCalFile.WriteLine (text2iCal(iCalItem.ALARM_DESCRIPTION)); iCalFile.WriteLine ("ACTION:DISPLAY"); iCalFile.WriteLine ("END:VALARM"); }
public void WriteEvent(OLCalItem iCalItem) { iCalFile.WriteLine ("BEGIN:VEVENT"); // basic VEVENT properties iCalFile.WriteLine (text2iCal (iCalItem.SUMMARY)); iCalFile.WriteLine (iCalItem.DTSTART); iCalFile.WriteLine (iCalItem.DTEND); iCalFile.WriteLine (iCalItem.DTSTAMP); // optional VEVENT properties if (iCalItem.LOCATION.Length != 0) iCalFile.WriteLine (text2iCal (iCalItem.LOCATION)); if (iCalItem.DESCRIPTION.Length != 0) iCalFile.WriteLine (text2iCal (iCalItem.DESCRIPTION)); if (iCalItem.TRANSP.Length != 0) iCalFile.WriteLine (text2iCal (iCalItem.TRANSP)); if (iCalItem.CLASS.Length != 0) iCalFile.WriteLine (iCalItem.CLASS); if (iCalItem.PRIORITY.Length != 0) iCalFile.WriteLine (iCalItem.PRIORITY); if (iCalItem.CATEGORIES.Length != 0) iCalFile.WriteLine (text2iCal (iCalItem.CATEGORIES)); // write recurrency rule if (iCalItem.isRecurrent ()) WriteRecurrence (iCalItem); // write alarm if one exists if (iCalItem.hasAlarm ()) WriteAlarm (iCalItem); iCalFile.WriteLine ("END:VEVENT"); }
public void WriteRecurrence(OLCalItem iCalItem) { if (!iCalItem.isRecurrent ()) return; iCalFile.WriteLine (text2iCal (iCalItem.RRULE_FREQ)); }
static void Main(string[] args) { int startIdx = 1; // start index is 1 int endIdx = -1; // imply up to last record String profileName = "Outlook"; // use default profile name #region create default output filename StringBuilder fn = new StringBuilder ("freemical_"); DateTime fnd = DateTime.Now; fn.Append (fnd.Year.ToString ("0000")); fn.Append (fnd.Month.ToString ("00")); fn.Append (fnd.Day.ToString ("00")); fn.Append (".ics"); String fnOutput = fn.ToString (); #endregion #region Check arguments // parse command line arguments for start and end records foreach (String arg in args) { String a = arg.ToLower (); #region --help if (a.Equals ("--help") || a.Equals ("/h") || a.Equals ("-h") || a.Equals ("?")) { showHelp (); return; } #endregion #region --start if (a.StartsWith ("--start") || a.StartsWith ("-s") || a.StartsWith ("/s")) { String[] p = arg.Split (new char[] { '=', ':' }); // assume that no 2nd p means from start if (p.Length > 1) { try { // this is dirty, works for now startIdx = Int32.Parse (p[1]); } catch (Exception ex) { if (p[1].Length > 0) // the value after = was not a number { showHelp (); return; } } } } #endregion #region --end if (a.StartsWith ("--end") || a.StartsWith ("-e") || a.StartsWith ("/e")) { String[] p = arg.Split (new char[] { '=', ':' }); // assume that no 2nd p means to end if (p.Length > 1) { try { // this is dirty, works for now endIdx = Int32.Parse (p[1]); } catch (Exception ex) { if (p[1].Length > 0) // the value after = was not a number { showHelp (); return; } } } } #endregion #region --output if (a.StartsWith ("--output") || a.StartsWith ("-o") || a.StartsWith ("/o")) { String[] p = arg.Split (new char[] { '=', ':' }, 2); if (p.Length > 1) // assume that no length specifier means from start { try { // this is dirty, works for now fnOutput = p[1]; } catch (Exception ex) { showHelp (); return; } } } #endregion #region --profile if (a.StartsWith ("--profile") || a.StartsWith ("-p") || a.StartsWith ("/p")) { String[] p = arg.Split (new char[] { '=', ':' }, 2); if (p.Length > 1) { profileName = p[1]; } } #endregion } // clean up parameter values if (startIdx < 1) // correct index < 1 startIdx = 1; if (endIdx > 0 && endIdx < startIdx) // correct lower and upper boundaries { int t = endIdx; endIdx = startIdx; startIdx = t; } // check for possible output try { FileInfo fi = new FileInfo (fnOutput); if (fi.Directory.Exists == false) { Console.WriteLine ("The directory you specified does not exist"); return; } StreamWriter sw = new StreamWriter (fnOutput, false); sw.Write (""); sw.Flush (); sw.Close (); if (fi.Exists == true) fi.Delete (); } #region specific error handling catch (System.UnauthorizedAccessException ex) { Console.WriteLine ("You are not authorized to access this file or directory."); Console.WriteLine ("Contact you System administrator"); return; } catch (System.Security.SecurityException ex) { Console.WriteLine ("You are do not have sufficient rights to access this file or directory."); Console.WriteLine ("Contact you System administrator"); return; } catch (System.IO.PathTooLongException ex) { Console.WriteLine ("The path to the file is too long."); return; } #endregion // generic error handling catch (Exception ex) { Console.WriteLine ("Some error occured processing the output file name."); return; } #endregion try { OLCalReader olCal = new OLCalReader (profileName); // constructor calls Logon implicitly if (!olCal.LoggedOn) // handle error in profile name { Console.WriteLine ("Could not log on to Outlook. Check the profile name"); writeLock (-1); // signal error to FreeMiCal return; } int maxRecord = olCal.Count; if (maxRecord == 0) { Console.WriteLine ("There are no records in your Outlook calendar!"); return; } // this check cannot be carried out without Outlook connection. This is why it's here if (endIdx < 0 || endIdx > maxRecord) // negative index not allowed, no end record set. endIdx = maxRecord; // export till last event if (endIdx == 0) // if user selected end record 0 then abort { Console.WriteLine ("You chose not to export any items!"); return; } Console.WriteLine ("Start at {0}, end at {1}, output to {2}", startIdx, endIdx, fnOutput); ICalWriter iCal = new ICalWriter (fnOutput, true); for (int record = startIdx; record <= endIdx; record++) { OLCalItem olItem = new OLCalItem ((Outlook.AppointmentItem)olCal[record]); iCal.WriteEvent (olItem); writeLock (record); } iCal.CloseWriter (); olCal.Logoff (); } catch (RuntimeException re) { } }