From c037b99d6e709ab57fd2535fe97a5aad900d90f2 Mon Sep 17 00:00:00 2001 From: RKrom Date: Fri, 14 Sep 2012 16:40:44 +0000 Subject: [PATCH] Added a plugin for the office communicator, this allows you to export an image to open conversations. The plugin will use other destinations for the storage, and use the result "URI" to send a text message. Can be used for a quicker (less overhead) image sharing as using mail. git-svn-id: http://svn.code.sf.net/p/greenshot/code/trunk@2036 7dccd23d-a4a3-4e1f-8c07-b4c1b4018ab4 --- .../Communicator.cs | 187 ++++++++++++++++++ .../CommunicatorConversation.cs | 84 ++++++++ .../DLL/CommunicatorAPI.dll | Bin 0 -> 75112 bytes .../DLL/CommunicatorPrivate.dll | Bin 0 -> 54640 bytes .../Forms/OfficeCommunicatorForm.cs | 31 +++ .../Forms/SettingsForm.Designer.cs | 96 +++++++++ .../Forms/SettingsForm.cs | 47 +++++ .../GreenshotOfficeCommunicatorPlugin.csproj | 118 +++++++++++ .../LanguageKeys.cs | 42 ++++ ...anguage_officecommunicatorplugin-en-US.xml | 32 +++ .../OfficeCommunicatorConfiguration.cs | 57 ++++++ .../OfficeCommunicatorDestination.cs | 125 ++++++++++++ .../OfficeCommunicatorPlugin.cs | 109 ++++++++++ .../Properties/AssemblyInfo.cs.template | 54 +++++ 14 files changed, 982 insertions(+) create mode 100644 GreenshotOfficeCommunicatorPlugin/Communicator.cs create mode 100644 GreenshotOfficeCommunicatorPlugin/CommunicatorConversation.cs create mode 100644 GreenshotOfficeCommunicatorPlugin/DLL/CommunicatorAPI.dll create mode 100644 GreenshotOfficeCommunicatorPlugin/DLL/CommunicatorPrivate.dll create mode 100644 GreenshotOfficeCommunicatorPlugin/Forms/OfficeCommunicatorForm.cs create mode 100644 GreenshotOfficeCommunicatorPlugin/Forms/SettingsForm.Designer.cs create mode 100644 GreenshotOfficeCommunicatorPlugin/Forms/SettingsForm.cs create mode 100644 GreenshotOfficeCommunicatorPlugin/GreenshotOfficeCommunicatorPlugin.csproj create mode 100644 GreenshotOfficeCommunicatorPlugin/LanguageKeys.cs create mode 100644 GreenshotOfficeCommunicatorPlugin/Languages/language_officecommunicatorplugin-en-US.xml create mode 100644 GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorConfiguration.cs create mode 100644 GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorDestination.cs create mode 100644 GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorPlugin.cs create mode 100644 GreenshotOfficeCommunicatorPlugin/Properties/AssemblyInfo.cs.template diff --git a/GreenshotOfficeCommunicatorPlugin/Communicator.cs b/GreenshotOfficeCommunicatorPlugin/Communicator.cs new file mode 100644 index 000000000..811742315 --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/Communicator.cs @@ -0,0 +1,187 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using CommunicatorAPI; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using GreenshotPlugin.Core; + +namespace GreenshotOfficeCommunicatorPlugin { + + public class Communicator { + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(Communicator)); + private bool connected = false; + + private CommunicatorAPI.Messenger communicator = null; + private Dictionary communicatorConversations = new Dictionary(); + public Communicator() { + } + public bool isConnected { + get { + return connected; + } + } + + public bool hasConversations { + get { + return communicatorConversations.Count > 0; + } + } + + public IEnumerable Conversations { + get { + foreach (CommunicatorConversation conversation in communicatorConversations.Values) { + yield return conversation; + } + } + } + + // A simple implementation of signing in. + public void Signin(string account, string passwd) { + if (connected) + return; + + if (communicator == null) { + // Create a Messenger object, if necessary + communicator = new CommunicatorAPI.Messenger(); + + // Register event handlers for OnSignin and Signout events + communicator.OnSignin += new DMessengerEvents_OnSigninEventHandler(communicator_OnSignin); + communicator.OnSignout += new DMessengerEvents_OnSignoutEventHandler(communicator_OnSignout); + communicator.OnIMWindowCreated += new DMessengerEvents_OnIMWindowCreatedEventHandler(communicator_OnIMWindowCreated); + communicator.OnIMWindowDestroyed += new DMessengerEvents_OnIMWindowDestroyedEventHandler(communicator_OnIMWindowDestroyed); + } + + if (account == null) { + communicator.AutoSignin(); + } else { + communicator.Signin(0, account, passwd); + } + } + + // Event handler for OnSignin event. + void communicator_OnSignin(int hr) { + if (hr != 0) { + Console.WriteLine("Signin failed."); + return; + } + connected = true; + } + + void communicator_OnSignout() { + connected = false; + + // Release the unmanaged resource. + Marshal.ReleaseComObject(communicator); + communicator = null; + } + + // Register for IMWindowCreated event to receive the + // conversation window object. Other window objects can + // received via this event handling as well. + void communicator_OnIMWindowCreated(object pIMWindow) { + try { + IMessengerConversationWndAdvanced imWindow = (IMessengerConversationWndAdvanced)pIMWindow; + CommunicatorConversation conversation = null; + if (communicatorConversations.ContainsKey(imWindow.HWND)) { + conversation = communicatorConversations[imWindow.HWND]; + } else { + conversation = new CommunicatorConversation(imWindow.HWND); + communicatorConversations.Add(imWindow.HWND, conversation); + } + conversation.ImWindow = imWindow; + } catch (Exception exception) { + LOG.Error(exception); + } + } + + void communicator_OnIMWindowDestroyed(object pIMWindow) { + try { + IMessengerConversationWndAdvanced imWindow = (IMessengerConversationWndAdvanced)pIMWindow; + CommunicatorConversation foundConversation = null; + long foundHwnd = 0; + foreach (long hwndKey in communicatorConversations.Keys) { + if (imWindow.Equals(communicatorConversations[hwndKey].ImWindow)) { + foundConversation = communicatorConversations[hwndKey]; + foundConversation.ImWindow = null; + foundHwnd = hwndKey; + break; + } + } + if (foundConversation != null) { + communicatorConversations.Remove(foundHwnd); + } + Marshal.ReleaseComObject(pIMWindow); + } catch (Exception exception) { + LOG.Error(exception); + } + } + + public CommunicatorConversation StartConversation(string account) { + object[] sipUris = { account }; + CommunicatorAPI.IMessengerAdvanced msgrAdv = communicator as CommunicatorAPI.IMessengerAdvanced; + CommunicatorConversation communicatorConversation = null; + if (msgrAdv != null) { + try { + object obj = msgrAdv.StartConversation( + CONVERSATION_TYPE.CONVERSATION_TYPE_IM, // Type of conversation + sipUris, // object array of signin names for having multiple conversations + null, + "Testing", + "1", + null); + long hwnd = long.Parse(obj.ToString()); + if (!communicatorConversations.ContainsKey(hwnd)) { + communicatorConversations.Add(hwnd, new CommunicatorConversation(hwnd)); + } + communicatorConversation = communicatorConversations[hwnd]; + } catch (Exception ex) { + LOG.Error(ex); + } + } + + return communicatorConversation; + } + + + public void ShowContacts() { + // Display contacts to a console window(for illustration only). + foreach (IMessengerContact contact in communicator.MyContacts as IMessengerContacts) { + if (!contact.IsSelf) { + Console.WriteLine("{0} ({1})", contact.SigninName, contact.Status); + } + } + } + + // A simple implementation of signing out. + public void Signout() { + if (!connected) { + return; + } + + if (communicator == null) { + return; + } + + communicator.Signout(); + } + } +} diff --git a/GreenshotOfficeCommunicatorPlugin/CommunicatorConversation.cs b/GreenshotOfficeCommunicatorPlugin/CommunicatorConversation.cs new file mode 100644 index 000000000..7c7c24e97 --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/CommunicatorConversation.cs @@ -0,0 +1,84 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Text; +using CommunicatorAPI; +using System.Runtime.InteropServices; +using GreenshotPlugin.Core; + +namespace GreenshotOfficeCommunicatorPlugin { + public class CommunicatorConversation { + private IMessengerConversationWndAdvanced imWindow = null; + private long hwnd = 0; + private Queue queuedText = new Queue(); + + public CommunicatorConversation(long hwnd) { + this.hwnd = hwnd; + } + + public bool isActive { + get { + return imWindow != null; + } + } + + public IMessengerConversationWndAdvanced ImWindow { + get { + return imWindow; + } + set { + imWindow = value; + if (imWindow != null) { + while (queuedText.Count > 0 && imWindow != null) { + SendTextMessage(queuedText.Dequeue()); + } + } else { + hwnd = 0; + } + } + } + + // Send text only if the window object matches the desired window handle + public void SendTextMessage(string msg) { + if (imWindow != null) { + imWindow.SendText(msg); + } else { + queuedText.Enqueue(msg); + } + } + + public string History { + get { + return imWindow.History; + } + } + + public string Title { + get { + if (imWindow != null) { + return new WindowDetails(new IntPtr(hwnd)).Text; + } + return null; + } + } + } +} diff --git a/GreenshotOfficeCommunicatorPlugin/DLL/CommunicatorAPI.dll b/GreenshotOfficeCommunicatorPlugin/DLL/CommunicatorAPI.dll new file mode 100644 index 0000000000000000000000000000000000000000..f7e4f84ce25104c4e23f8f7fa79f942151d12919 GIT binary patch literal 75112 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 literal 0 HcmV?d00001 diff --git a/GreenshotOfficeCommunicatorPlugin/DLL/CommunicatorPrivate.dll b/GreenshotOfficeCommunicatorPlugin/DLL/CommunicatorPrivate.dll new file mode 100644 index 0000000000000000000000000000000000000000..0f128dbdfc845a965a72878dfa3267826f063831 GIT binary patch literal 54640 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. + */ +using System; + +namespace GreenshotOfficeCommunicatorPlugin { + /// + /// This class is needed for design-time resolving of the language files + /// + public class OfficeCommunicatorForm : GreenshotPlugin.Controls.GreenshotForm { + public OfficeCommunicatorForm() : base() { + } + } +} diff --git a/GreenshotOfficeCommunicatorPlugin/Forms/SettingsForm.Designer.cs b/GreenshotOfficeCommunicatorPlugin/Forms/SettingsForm.Designer.cs new file mode 100644 index 000000000..64721429f --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/Forms/SettingsForm.Designer.cs @@ -0,0 +1,96 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +namespace GreenshotOfficeCommunicatorPlugin { + partial class SettingsForm { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.buttonOK = new GreenshotPlugin.Controls.GreenshotButton(); + this.buttonCancel = new GreenshotPlugin.Controls.GreenshotButton(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.LanguageKey = "officecommunicator.OK"; + this.buttonOK.Location = new System.Drawing.Point(222, 11); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 2; + this.buttonOK.Text = "OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOKClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.LanguageKey = "officecommunicator.CANCEL"; + this.buttonCancel.Location = new System.Drawing.Point(303, 11); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 3; + this.buttonCancel.Text = "Cancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // SettingsForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(387, 46); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.LanguageKey = "officecommunicator.settings_title"; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SettingsForm"; + this.Text = "Office Communicator settings"; + this.ResumeLayout(false); + + } + private GreenshotPlugin.Controls.GreenshotButton buttonCancel; + private GreenshotPlugin.Controls.GreenshotButton buttonOK; + } +} diff --git a/GreenshotOfficeCommunicatorPlugin/Forms/SettingsForm.cs b/GreenshotOfficeCommunicatorPlugin/Forms/SettingsForm.cs new file mode 100644 index 000000000..5cf2826b1 --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/Forms/SettingsForm.cs @@ -0,0 +1,47 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Windows.Forms; +using GreenshotPlugin.Core; +using GreenshotPlugin.Controls; + +namespace GreenshotOfficeCommunicatorPlugin { + /// + /// Description of PasswordRequestForm. + /// + public partial class SettingsForm : OfficeCommunicatorForm { + public SettingsForm(OfficeCommunicatorConfiguration config) : base() { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + this.Icon = GreenshotPlugin.Core.GreenshotResources.getGreenshotIcon(); + } + + void ButtonOKClick(object sender, EventArgs e) { + this.DialogResult = DialogResult.OK; + } + + void ButtonCancelClick(object sender, System.EventArgs e) { + this.DialogResult = DialogResult.Cancel; + } + } +} diff --git a/GreenshotOfficeCommunicatorPlugin/GreenshotOfficeCommunicatorPlugin.csproj b/GreenshotOfficeCommunicatorPlugin/GreenshotOfficeCommunicatorPlugin.csproj new file mode 100644 index 000000000..3c059d9ba --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/GreenshotOfficeCommunicatorPlugin.csproj @@ -0,0 +1,118 @@ + + + + {C1050323-F237-43E2-90F9-1D620F29252F} + Debug + x86 + Library + GreenshotOfficeCommunicatorPlugin + GreenshotOfficeCommunicatorPlugin + v2.0 + Properties + False + False + 4 + false + OnBuildSuccess + + + + 3.5 + + + + bin\Debug\ + true + Full + False + True + False + Off + 4194304 + x86 + 4096 + DEBUG;TRACE + + + bin\Release\ + false + None + True + False + False + Off + 4194304 + AnyCPU + 4096 + + + + + False + True + DLL\CommunicatorAPI.dll + + + False + True + DLL\CommunicatorPrivate.dll + + + ..\Greenshot\Lib\log4net.dll + + + + + + + + + + + Form + + + Form + + + SettingsForm.cs + + + + + + + + Never + + + + + + {5B924697-4DCD-4F98-85F1-105CB84B7341} + GreenshotPlugin + + + + + SettingsForm.cs + + + + + Always + + + Always + + + + "$(SolutionDir)\tools\TortoiseSVN\SubWCRev.exe" "$(ProjectDir)\" "$(ProjectDir)\Properties\AssemblyInfo.cs.template" "$(ProjectDir)\Properties\AssemblyInfo.cs" + mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)\DLL\*.dll" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName) + +mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" + + \ No newline at end of file diff --git a/GreenshotOfficeCommunicatorPlugin/LanguageKeys.cs b/GreenshotOfficeCommunicatorPlugin/LanguageKeys.cs new file mode 100644 index 000000000..8dc67c329 --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/LanguageKeys.cs @@ -0,0 +1,42 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; + +namespace GreenshotOfficeCommunicatorPlugin { + public enum LangKey { + upload_menu_item, + settings_title, + label_url, + label_upload_format, + label_clear, + OK, + CANCEL, + upload_success, + upload_failure, + communication_wait, + delete_question, + clear_question, + delete_title, + use_page_link, + history, + configure + } +} diff --git a/GreenshotOfficeCommunicatorPlugin/Languages/language_officecommunicatorplugin-en-US.xml b/GreenshotOfficeCommunicatorPlugin/Languages/language_officecommunicatorplugin-en-US.xml new file mode 100644 index 000000000..ca11504c1 --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/Languages/language_officecommunicatorplugin-en-US.xml @@ -0,0 +1,32 @@ + + + + + Upload to Office Communicator + + + Office Communicator settings + + + OK + + + Cancel + + + Successfully uploaded image to Office Communicator! + + + An error occured while uploading to Office Communicator: + + + Image format + + + Communicating with Office Communicator. Please wait... + + + Configure + + + \ No newline at end of file diff --git a/GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorConfiguration.cs b/GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorConfiguration.cs new file mode 100644 index 000000000..d5b33907e --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorConfiguration.cs @@ -0,0 +1,57 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +using GreenshotPlugin.Controls; +using GreenshotPlugin.Core; +using Greenshot.IniFile; + +namespace GreenshotOfficeCommunicatorPlugin { + /// + /// Description of OfficeCommunicatorConfiguration. + /// + [IniSection("OfficeCommunicator", Description="Greenshot OfficeCommunicator Plugin configuration")] + public class OfficeCommunicatorConfiguration : IniSection { + [IniProperty("Destination", Description = "The designation of the destination which is used to export via, the returned URL is used in the message.", DefaultValue = "FileDialog")] + public string DestinationDesignation; + + /// + /// A form for username/password + /// + /// bool true if OK was pressed, false if cancel + public bool ShowConfigDialog() { + SettingsForm settingsForm = null; + + new PleaseWaitForm().ShowAndWait(OfficeCommunicatorPlugin.Attributes.Name, Language.GetString("officecommunicator", LangKey.communication_wait), + delegate() { + settingsForm = new SettingsForm(this); + } + ); + DialogResult result = settingsForm.ShowDialog(); + if (result == DialogResult.OK) { + return true; + } + return false; + } + } +} diff --git a/GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorDestination.cs b/GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorDestination.cs new file mode 100644 index 000000000..8c9ee8589 --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorDestination.cs @@ -0,0 +1,125 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Windows; + +using Greenshot.Plugin; +using GreenshotPlugin.Core; +using Greenshot.IniFile; + +namespace GreenshotOfficeCommunicatorPlugin { + /// + /// Description of OfficeCommunicatorDestination. + /// + public class OfficeCommunicatorDestination : AbstractDestination { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OfficeCommunicatorDestination)); + private static OfficeCommunicatorConfiguration config = IniConfig.GetIniSection(); + private OfficeCommunicatorPlugin plugin = null; + private static string exePath = null; + private static Image applicationIcon = null; + private CommunicatorConversation conversation = null; + + static OfficeCommunicatorDestination() { + exePath = GetExePath("communicator.exe"); + if (exePath != null && File.Exists(exePath)) { + applicationIcon = GetExeIcon(exePath, 0); + } else { + exePath = null; + } + } + public OfficeCommunicatorDestination(OfficeCommunicatorPlugin plugin) { + this.plugin = plugin; + } + + public OfficeCommunicatorDestination(OfficeCommunicatorPlugin plugin, CommunicatorConversation conversation) : this(plugin) { + this.conversation = conversation; + } + + public override string Designation { + get { + return "OfficeCommunicator"; + } + } + + public override string Description { + get { + if (conversation == null) { + return Language.GetString("officecommunicator", LangKey.upload_menu_item); + } else { + return Language.GetString("officecommunicator", LangKey.upload_menu_item) + " - " + conversation.Title; + } + } + } + + public override Image DisplayIcon { + get { + return applicationIcon; + } + } + + public override bool isActive { + get { + return base.isActive && exePath != null && ((conversation == null && plugin.Communicator.hasConversations) || (conversation != null && conversation.isActive)); + } + } + + public override IEnumerable DynamicDestinations() { + foreach (CommunicatorConversation conversation in plugin.Communicator.Conversations) { + if (conversation.isActive) { + yield return new OfficeCommunicatorDestination(plugin, conversation); + } + } + } + + public override bool isDynamic { + get { + return true; + } + } + + public override bool useDynamicsOnly { + get { + return true; + } + } + + public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { + ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + if (conversation != null) { + ExportInformation internalExportInformation = plugin.Host.ExportCapture(false, config.DestinationDesignation, surface, captureDetails); + if (internalExportInformation != null && internalExportInformation.ExportMade) { + exportInformation.ExportMade = true; + if (!string.IsNullOrEmpty(internalExportInformation.Uri)) { + conversation.SendTextMessage("Greenshot sends you: " + internalExportInformation.Uri); + } else if (!string.IsNullOrEmpty(internalExportInformation.Filepath)) { + conversation.SendTextMessage(@"Greenshot sends you: file://" + internalExportInformation.Filepath); + } + } + } + return exportInformation; + } + } +} diff --git a/GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorPlugin.cs b/GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorPlugin.cs new file mode 100644 index 000000000..54747e3da --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/OfficeCommunicatorPlugin.cs @@ -0,0 +1,109 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using System.Threading; + +using Greenshot.Plugin; +using GreenshotPlugin.Controls; +using GreenshotPlugin.Core; +using Greenshot.IniFile; +using CommunicatorAPI; +using System.Runtime.InteropServices; + +namespace GreenshotOfficeCommunicatorPlugin { + /// + /// This is the OfficeCommunicatorPlugin + /// + public class OfficeCommunicatorPlugin : IGreenshotPlugin { + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OfficeCommunicatorPlugin)); + public static PluginAttribute Attributes; + private OfficeCommunicatorConfiguration config = IniConfig.GetIniSection(); + private IGreenshotHost host; + private Communicator communicator; + public IGreenshotHost Host { + get { + return host; + } + } + + public Communicator Communicator { + get { + return communicator; + } + set { + communicator = value; + } + } + + public OfficeCommunicatorPlugin() { + } + + public IEnumerable Destinations() { + yield return new OfficeCommunicatorDestination(this); + } + + public IEnumerable Processors() { + yield break; + } + + /// + /// Implementation of the IGreenshotPlugin.Initialize + /// + /// Use the IGreenshotPluginHost interface to register events + /// Use the ICaptureHost interface to register in the MainContextMenu + /// My own attributes + /// true if plugin is initialized, false if not (doesn't show) + public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { + this.host = (IGreenshotHost)pluginHost; + Attributes = myAttributes; + + communicator = new Communicator(); + communicator.Signin(null, null); + return true; + } + + public virtual void Shutdown() { + LOG.Debug("OfficeCommunicator Plugin shutdown."); + } + + /// + /// Implementation of the IPlugin.Configure + /// + public virtual void Configure() { + config.ShowConfigDialog(); + } + + /// + /// This will be called when Greenshot is shutting down + /// + /// + /// + public void Closing(object sender, FormClosingEventArgs e) { + LOG.Debug("Application closing, de-registering OfficeCommunicator Plugin!"); + Shutdown(); + } + } +} diff --git a/GreenshotOfficeCommunicatorPlugin/Properties/AssemblyInfo.cs.template b/GreenshotOfficeCommunicatorPlugin/Properties/AssemblyInfo.cs.template new file mode 100644 index 000000000..46558d817 --- /dev/null +++ b/GreenshotOfficeCommunicatorPlugin/Properties/AssemblyInfo.cs.template @@ -0,0 +1,54 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#region Using directives + +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using Greenshot.Plugin; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Greenshot-OfficeCommunicator-Plugin")] +[assembly: AssemblyDescription("A plugin to upload images to office communicator")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Greenshot")] +[assembly: AssemblyProduct("OfficeCommunicator Plugin")] +[assembly: AssemblyCopyright("Copyright (C) 2007-2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// The PluginAttribute describes the "entryType" and if the plugin is configurable +[assembly: PluginAttribute("GreenshotOfficeCommunicatorPlugin.OfficeCommunicatorPlugin", true)] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all the values or you can use the default the Revision and +// Build Numbers by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.2.$WCREV$")]