public void Disconnect(Boolean onlyWhenNoGUI = false) { if (!onlyWhenNoGUI || (onlyWhenNoGUI && oApp.Explorers.Count == 0)) { log.Debug("De-referencing all Outlook application objects."); try { folders = (Folders)OutlookOgcs.Calendar.ReleaseObject(folders); useOutlookCalendar = (MAPIFolder)OutlookOgcs.Calendar.ReleaseObject(useOutlookCalendar); for (int fld = calendarFolders.Count - 1; fld >= 0; fld--) { MAPIFolder mFld = calendarFolders.ElementAt(fld).Value; mFld = (MAPIFolder)OutlookOgcs.Calendar.ReleaseObject(mFld); calendarFolders.Remove(calendarFolders.ElementAt(fld).Key); } calendarFolders = new Dictionary <string, MAPIFolder>(); Calendar.Categories.Dispose(); explorerWatcher = (ExplorerWatcher)Calendar.ReleaseObject(explorerWatcher); } catch (System.Exception ex) { log.Debug(ex.Message); } log.Info("Disconnecting from Outlook application."); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oApp); oApp = null; GC.Collect(); } }
public void Connect() { if (!OutlookOgcs.Calendar.InstanceConnect) { return; } OutlookOgcs.Calendar.AttachToOutlook(ref oApp, openOutlookOnFail: true, withSystemCall: false); log.Debug("Setting up Outlook connection."); // Get the NameSpace and Logon information. NameSpace oNS = null; try { oNS = oApp.GetNamespace("mapi"); //Log on by using a dialog box to choose the profile. //oNS.Logon("", Type.Missing, true, true); //Implicit logon to default profile, with no dialog box //If 1< profile, a dialogue is forced unless implicit login used exchangeConnectionMode = oNS.ExchangeConnectionMode; if (exchangeConnectionMode != OlExchangeConnectionMode.olNoExchange) { log.Info("Exchange server version: " + oNS.ExchangeMailboxServerVersion.ToString()); } //Logon using a specific profile. Can't see a use case for this when using OGsync //If using this logon method, change the profile name to an appropriate value: //HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles //oNS.Logon("YourValidProfile", Type.Missing, false, true); log.Info("Exchange connection mode: " + exchangeConnectionMode.ToString()); oNS = GetCurrentUser(oNS); if (!Settings.Instance.OutlookGalBlocked && currentUserName == "Unknown") { log.Info("Current username is \"Unknown\""); if (Settings.Instance.AddAttendees) { System.Windows.Forms.MessageBox.Show("It appears you do not have an Email Account configured in Outlook.\r\n" + "You should set one up now (Tools > Email Accounts) to avoid problems syncing meeting attendees.", "No Email Account Found", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning); } } log.Debug("Get the folders configured in Outlook"); folders = oNS.Folders; // Get the Calendar folders useOutlookCalendar = getCalendarStore(oNS); if (Forms.Main.Instance.IsHandleCreated) { log.Fine("Resetting connection, so re-selecting calendar from GUI dropdown"); Forms.Main.Instance.cbOutlookCalendars.SelectedIndexChanged -= Forms.Main.Instance.cbOutlookCalendar_SelectedIndexChanged; Forms.Main.Instance.cbOutlookCalendars.DataSource = new BindingSource(calendarFolders, null); //Select the right calendar int c = 0; foreach (KeyValuePair <String, MAPIFolder> calendarFolder in calendarFolders) { if (calendarFolder.Value.EntryID == Settings.Instance.UseOutlookCalendar.Id) { Forms.Main.Instance.SetControlPropertyThreadSafe(Forms.Main.Instance.cbOutlookCalendars, "SelectedIndex", c); } c++; } if ((int)Forms.Main.Instance.GetControlPropertyThreadSafe(Forms.Main.Instance.cbOutlookCalendars, "SelectedIndex") == -1) { Forms.Main.Instance.SetControlPropertyThreadSafe(Forms.Main.Instance.cbOutlookCalendars, "SelectedIndex", 0); } KeyValuePair <String, MAPIFolder> calendar = (KeyValuePair <String, MAPIFolder>)Forms.Main.Instance.GetControlPropertyThreadSafe(Forms.Main.Instance.cbOutlookCalendars, "SelectedItem"); useOutlookCalendar = calendar.Value; Forms.Main.Instance.cbOutlookCalendars.SelectedIndexChanged += Forms.Main.Instance.cbOutlookCalendar_SelectedIndexChanged; } OutlookOgcs.Calendar.Categories = new OutlookOgcs.Categories(); Calendar.Categories.Get(oApp, useOutlookCalendar); //Set up event handlers explorerWatcher = new ExplorerWatcher(oApp); } catch (System.Runtime.InteropServices.COMException ex) { if (OGCSexception.GetErrorCode(ex) == "0x84120009") //Cannot complete the operation. You are not connected. [Issue #514, occurs on GetNamespace("mapi")] { log.Warn(ex.Message); throw new ApplicationException("A problem was encountered with your Office install.\r\n" + "Please perform an Office Repair or reinstall Outlook and then try running OGCS again."); } else { throw ex; } } finally { // Done. Log off. if (oNS != null) { oNS.Logoff(); } oNS = (NameSpace)OutlookOgcs.Calendar.ReleaseObject(oNS); } }