internal void ShowConfig() { //refresh the accounts ValidateAccounts(); //do we have any accounts? var count = Accounts.Count; var form = new ConfigurationForm(); //get the launching window var active = Application.ActiveExplorer(); var win = new OutlookWin32Window(active, false); if (form.ShowDialog(win) != DialogResult.OK) return; Logger.Verbose("ShowConfig", string.Format( "active accounts: {0}", ListCurrentAccounts())); //write changes back to storage StoreSettings(); //prompt for invite if we just added the first accounts if (count.Equals(0) && Accounts.Count > 0) { if (MessageBox.Show(Resources.invite_prompt, Resources.product_name, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) CreateInvite(); } }
public static bool PostAttachments(Outlook.MailItem item, Account account, EcsConfiguration configuration, string encryptKey, string recips, ref List<string> pointers, OutlookWin32Window win, bool noPlaceholder) { const string SOURCE = CLASS_NAME + "PostAttachments"; try { //get the bytes for the placeholder text var placeholder = Encoding.UTF8.GetBytes(Resources.placeholder_text); SafeMailItem safMail; try { safMail = RedemptionLoader.new_SafeMailItem(); } catch (Exception ex) { Logger.Error(SOURCE, String.Format( "unable to work with attachments for {0}, failed to instantiate SafeMailItem: {1}", item.Subject, ex.Message)); return false; } //need to save the item first before we can work with the SafeMailItem item.Save(); safMail.Item = item; var colAttach = safMail.Attachments; /* Outlook will move any embedded images to the head of the attachments table * if that's the case then we need to remove and re-add the other attachments * so that the pointer list will match the finished order */ var hidden = false; string contentId; var savedAttach = new Dictionary<int, byte[]>(); //do we have any embedded images? foreach (Redemption.Attachment rdoAttach in colAttach) { GetAttachProps(rdoAttach, out contentId, out hidden); if (hidden) break; } if (hidden) { //walk through in reverse order //delete and reattach each non-hidden attachment for (var i = colAttach.Count; i > 0; i--) { Redemption.Attachment rdoAttach = colAttach[i]; GetAttachProps(rdoAttach, out contentId, out hidden); if (hidden) continue; if (rdoAttach.Type.Equals(5)) //embedded { var msg = rdoAttach.EmbeddedMsg; rdoAttach.Delete(); colAttach.Add(msg, 5); } else { var path = Path.Combine(Path.GetTempPath(), "ChiaraMail", rdoAttach.FileName); var displayName = rdoAttach.DisplayName; if (File.Exists(path)) File.Delete(path); rdoAttach.SaveAsFile(path); rdoAttach.Delete(); rdoAttach = colAttach.Add(path, 1, Type.Missing, displayName); //get the bytes and drop those in the dictionary, linked to the current index savedAttach.Add(rdoAttach.Index, File.ReadAllBytes(path)); File.Delete(path); } } } //now loop through and collect the content (except for embedded messages) var attachList = new List<Attachment>(); bool showForm = false; foreach (Redemption.Attachment rdoAttach in colAttach) { var attach = new Attachment { Type = rdoAttach.Type }; switch (rdoAttach.Type) { case (int)Outlook.OlAttachmentType.olEmbeddeditem: //is this an ECS attachment? var msg = rdoAttach.EmbeddedMsg; if (HasChiaraHeader(msg)) { ForwardEmbeddedECS(msg, recips, account); } //always add attachList.Add(attach); break; case (int)Outlook.OlAttachmentType.olByReference: case (int)Outlook.OlAttachmentType.olOLE: attachList.Add(attach); break; case (int)Outlook.OlAttachmentType.olByValue: showForm = true; //we may have already gotten the bytes if (savedAttach.Count > 0 && savedAttach.ContainsKey(rdoAttach.Index)) { attach.Content = savedAttach[rdoAttach.Index]; } if (attach.Content == null || attach.Content.Length == 0) { //try just read the bytes from the binary property //this could fail if the attachment is too big try { attach.Content = rdoAttach.AsArray != null ? rdoAttach.AsArray as byte[] : null;//.Fields[ThisAddIn.PR_ATTACH_DATA_BIN]); } catch { attach.Content = null; } } if (attach.Content == null) { //save to disk then get the bytes var path = Path.Combine(Path.GetTempPath(), "ChiaraMail", rdoAttach.FileName); if (File.Exists(path)) File.Delete(path); rdoAttach.SaveAsFile(path); attach.Content = File.ReadAllBytes(path); File.Delete(path); } if (attach.Content != null) { attach.Index = rdoAttach.Index; attach.Name = rdoAttach.DisplayName; attachList.Add(attach); } else { Logger.Warning(SOURCE, "aborting: failed to retrieve content for " + rdoAttach.DisplayName); MessageBox.Show(String.Format( "Unable to retrieve original content from {0}", rdoAttach.DisplayName), Resources.product_name, MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } break; } } if (!showForm) { pointers.AddRange(attachList.Select(attach => attach.Pointer)); return true; } //use the WaitForm to upload the attachments var form = new WaitForm { Attachments = attachList, Account = account, Configuration = configuration, Recips = recips, EncryptKey2 = encryptKey }; //use encryptKey2 for new post if (form.ShowDialog(win) == DialogResult.OK) { //post succeeded for all attachments //get the pointers pointers.AddRange(form.Attachments.Select(attach => attach.Pointer)); //don't replace attachment bytes if we are sending content if (noPlaceholder) return true; //loop back through to replace the original content with the placeholder bytes foreach (Redemption.Attachment rdoAttach in colAttach) { if (rdoAttach.Type.Equals(1)) //OlAttachmentType.olByValue) { rdoAttach.Fields[ThisAddIn.PR_ATTACH_DATA_BIN] = placeholder; } } return true; } //get the pointer list anyway so we can delete the items that got posted pointers.AddRange(form.Attachments .TakeWhile(attach => !String.IsNullOrEmpty(attach.Pointer)) .Select(attach => attach.Pointer)); } catch (Exception ex) { Logger.Error(SOURCE, ex.ToString()); } return false; }