diff --git a/Greenshot/Helpers/IEInterop/IHTMLCurrentStyle.cs b/Greenshot/Helpers/IEInterop/IHTMLCurrentStyle.cs new file mode 100644 index 000000000..0ca2a324c --- /dev/null +++ b/Greenshot/Helpers/IEInterop/IHTMLCurrentStyle.cs @@ -0,0 +1,67 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2011 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.Runtime.InteropServices; + +namespace Greenshot.Helpers.IEInterop { + [ComImport, Guid("3050f3db-98b5-11cf-bb82-00aa00bdce0b"), + TypeLibType(TypeLibTypeFlags.FDual), + InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] + public interface IHTMLCurrentStyle { + /// styleFloat property of IHTMLStyle interface. + string styleFloat { + [DispId(-2147413042)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + string left { + [DispId(-2147418112 + 3)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + string top { + [DispId(-2147418112 + 4)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + string width { + [DispId(-2147418112 + 5)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + string height { + [DispId(-2147418112 + 6)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + string right { + [DispId(-2147418112 + 0x4d)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + string bottom { + [DispId(-2147418112 + 0x4e)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + } +} diff --git a/Greenshot/Helpers/OfficeInterop/OutlookUtils.cs b/Greenshot/Helpers/OfficeInterop/OutlookUtils.cs new file mode 100644 index 000000000..93cce51a4 --- /dev/null +++ b/Greenshot/Helpers/OfficeInterop/OutlookUtils.cs @@ -0,0 +1,854 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2011 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.Runtime.InteropServices; + +namespace Greenshot.Helpers.OfficeInterop { + enum PT : uint { + PT_UNSPECIFIED = 0, /* (Reserved for interface use) type doesn't matter to caller */ + PT_NULL = 1, /* NULL property value */ + PT_I2 = 2, /* Signed 16-bit value */ + PT_LONG = 3, /* Signed 32-bit value */ + PT_R4 = 4, /* 4-byte floating point */ + PT_DOUBLE = 5, /* Floating point double */ + PT_CURRENCY = 6, /* Signed 64-bit int (decimal w/ 4 digits right of decimal pt) */ + PT_APPTIME = 7, /* Application time */ + PT_ERROR = 10, /* 32-bit error value */ + PT_BOOLEAN = 11, /* 16-bit boolean (non-zero true, */ + // Use PT_BOOLEAN_DESKTOP to be specific instead of using PT_BOOLEAN which is mapped to 2 in addrmapi.h + PT_BOOLEAN_DESKTOP = 11, /* 16-bit boolean (non-zero true) */ + PT_OBJECT = 13, /* Embedded object in a property */ + PT_I8 = 20, /* 8-byte signed integer */ + PT_STRING8 = 30, /* Null terminated 8-bit character string */ + PT_UNICODE = 31, /* Null terminated Unicode string */ + PT_SYSTIME = 64, /* FILETIME 64-bit int w/ number of 100ns periods since Jan 1,1601 */ + PT_CLSID = 72, /* OLE GUID */ + PT_BINARY = 258, /* Uninterpreted (counted byte array) */ + + PT_TSTRING = PT_UNICODE + }; + + public enum PropTags : uint { + PR_ERROR = 10, + + // Common non-transmittable + PR_ENTRYID = PT.PT_BINARY | 0x0FFF << 16, + PR_OBJECT_TYPE = PT.PT_LONG | 0x0FFE << 16, + PR_ICON = PT.PT_BINARY | 0x0FFD << 16, + PR_MINI_ICON = PT.PT_BINARY | 0x0FFC << 16, + PR_STORE_ENTRYID = PT.PT_BINARY | 0x0FFB << 16, + PR_STORE_RECORD_KEY = PT.PT_BINARY | 0x0FFA << 16, + PR_RECORD_KEY = PT.PT_BINARY | 0x0FF9 << 16, + PR_MAPPING_SIGNATURE = PT.PT_BINARY | 0x0FF8 << 16, + PR_ACCESS_LEVEL = PT.PT_LONG | 0x0FF7 << 16, + PR_INSTANCE_KEY = PT.PT_BINARY | 0x0FF6 << 16, + PR_ROW_TYPE = PT.PT_LONG | 0x0FF5 << 16, + PR_ACCESS = PT.PT_LONG | 0x0FF4 << 16, + + // Common transmittable + PR_ROWID = PT.PT_LONG | 0x3000 << 16, + PR_DISPLAY_NAME = PT.PT_TSTRING | 0x3001 << 16, + PR_DISPLAY_NAME_W = PT.PT_UNICODE | 0x3001 << 16, + PR_DISPLAY_NAME_A = PT.PT_STRING8 | 0x3001 << 16, + PR_ADDRTYPE = PT.PT_TSTRING | 0x3002 << 16, + PR_ADDRTYPE_W = PT.PT_UNICODE | 0x3002 << 16, + PR_ADDRTYPE_A = PT.PT_STRING8 | 0x3002 << 16, + PR_EMAIL_ADDRESS = PT.PT_TSTRING | 0x3003 << 16, + PR_EMAIL_ADDRESS_W = PT.PT_UNICODE | 0x3003 << 16, + PR_EMAIL_ADDRESS_A = PT.PT_STRING8 | 0x3003 << 16, + PR_COMMENT = PT.PT_TSTRING | 0x3004 << 16, + PR_COMMENT_W = PT.PT_UNICODE | 0x3004 << 16, + PR_COMMENT_A = PT.PT_STRING8 | 0x3004 << 16, + PR_DEPTH = PT.PT_LONG | 0x3005 << 16, + PR_PROVIDER_DISPLAY = PT.PT_TSTRING | 0x3006 << 16, + PR_PROVIDER_DISPLAY_W = PT.PT_UNICODE | 0x3006 << 16, + PR_PROVIDER_DISPLAY_A = PT.PT_STRING8 | 0x3006 << 16, + PR_CREATION_TIME = PT.PT_SYSTIME | 0x3007 << 16, + PR_LAST_MODIFICATION_TIME = PT.PT_SYSTIME | 0x3008 << 16, + PR_RESOURCE_FLAGS = PT.PT_LONG | 0x3009 << 16, + PR_PROVIDER_DLL_NAME = PT.PT_TSTRING | 0x300A << 16, + PR_PROVIDER_DLL_NAME_W = PT.PT_UNICODE | 0x300A << 16, + PR_PROVIDER_DLL_NAME_A = PT.PT_STRING8 | 0x300A << 16, + PR_SEARCH_KEY = PT.PT_BINARY | 0x300B << 16, + PR_PROVIDER_UID = PT.PT_BINARY | 0x300C << 16, + PR_PROVIDER_ORDINAL = PT.PT_LONG | 0x300D << 16, + + // Message store specific + PR_DEFAULT_STORE = PT.PT_BOOLEAN | 0x3400 << 16, + PR_STORE_SUPPORT_MASK = PT.PT_LONG | 0x340D << 16, + PR_STORE_STATE = PT.PT_LONG | 0x340E << 16, + + PR_IPM_SUBTREE_SEARCH_KEY = PT.PT_BINARY | 0x3410 << 16, + PR_IPM_OUTBOX_SEARCH_KEY = PT.PT_BINARY | 0x3411 << 16, + PR_IPM_WASTEBASKET_SEARCH_KEY = PT.PT_BINARY | 0x3412 << 16, + PR_IPM_SENTMAIL_SEARCH_KEY = PT.PT_BINARY | 0x3413 << 16, + PR_MDB_PROVIDER = PT.PT_BINARY | 0x3414 << 16, + PR_RECEIVE_FOLDER_SETTINGS = PT.PT_OBJECT | 0x3415 << 16, + + PR_VALID_FOLDER_MASK = PT.PT_LONG | 0x35DF << 16, + PR_IPM_SUBTREE_ENTRYID = PT.PT_BINARY | 0x35E0 << 16, + + PR_IPM_OUTBOX_ENTRYID = PT.PT_BINARY | 0x35E2 << 16, + PR_IPM_WASTEBASKET_ENTRYID = PT.PT_BINARY | 0x35E3 << 16, + PR_IPM_SENTMAIL_ENTRYID = PT.PT_BINARY | 0x35E4 << 16, + PR_VIEWS_ENTRYID = PT.PT_BINARY | 0x35E5 << 16, + PR_COMMON_VIEWS_ENTRYID = PT.PT_BINARY | 0x35E6 << 16, + PR_FINDER_ENTRYID = PT.PT_BINARY | 0x35E7 << 16, + PR_ATTACH_CONTENT_ID = PT.PT_TSTRING | (0x3712 << 16), + PR_ATTACH_CONTENT_ID_A = PT.PT_STRING8 | (0x3712 << 16), + PR_ATTACH_CONTENT_ID_W = PT.PT_TSTRING | (0x3712 << 16), + PR_ATTACH_CONTENT_LOCATION = PT.PT_TSTRING | (0x3713 << 16), + PR_ATTACH_CONTENT_LOCATION_A = PT.PT_STRING8 | (0x3713 << 16), + PR_ATTACH_CONTENT_LOCATION_W = PT.PT_TSTRING | (0x3713 << 16), + + // Message non-transmittable properties + PR_CURRENT_VERSION = PT.PT_I8 | 0x0E00 << 16, + PR_DELETE_AFTER_SUBMIT = PT.PT_BOOLEAN | 0x0E01 << 16, + PR_DISPLAY_BCC = PT.PT_TSTRING | 0x0E02 << 16, + PR_DISPLAY_BCC_W = PT.PT_UNICODE | 0x0E02 << 16, + PR_DISPLAY_BCC_A = PT.PT_STRING8 | 0x0E02 << 16, + PR_DISPLAY_CC = PT.PT_TSTRING | 0x0E03 << 16, + PR_DISPLAY_CC_W = PT.PT_UNICODE | 0x0E03 << 16, + PR_DISPLAY_CC_A = PT.PT_STRING8 | 0x0E03 << 16, + PR_DISPLAY_TO = PT.PT_TSTRING | 0x0E04 << 16, + PR_DISPLAY_TO_W = PT.PT_UNICODE | 0x0E04 << 16, + PR_DISPLAY_TO_A = PT.PT_STRING8 | 0x0E04 << 16, + PR_PARENT_DISPLAY = PT.PT_TSTRING | 0x0E05 << 16, + PR_PARENT_DISPLAY_W = PT.PT_UNICODE | 0x0E05 << 16, + PR_PARENT_DISPLAY_A = PT.PT_STRING8 | 0x0E05 << 16, + PR_MESSAGE_DELIVERY_TIME = PT.PT_SYSTIME | 0x0E06 << 16, + PR_MESSAGE_FLAGS = PT.PT_LONG | 0x0E07 << 16, + PR_MESSAGE_SIZE = PT.PT_LONG | 0x0E08 << 16, + PR_PARENT_ENTRYID = PT.PT_BINARY | 0x0E09 << 16, + PR_SENTMAIL_ENTRYID = PT.PT_BINARY | 0x0E0A << 16, + PR_CORRELATE = PT.PT_BOOLEAN | 0x0E0C << 16, + PR_CORRELATE_MTSID = PT.PT_BINARY | 0x0E0D << 16, + PR_DISCRETE_VALUES = PT.PT_BOOLEAN | 0x0E0E << 16, + PR_RESPONSIBILITY = PT.PT_BOOLEAN | 0x0E0F << 16, + PR_SPOOLER_STATUS = PT.PT_LONG | 0x0E10 << 16, + PR_TRANSPORT_STATUS = PT.PT_LONG | 0x0E11 << 16, + PR_MESSAGE_RECIPIENTS = PT.PT_OBJECT | 0x0E12 << 16, + PR_MESSAGE_ATTACHMENTS = PT.PT_OBJECT | 0x0E13 << 16, + PR_SUBMIT_FLAGS = PT.PT_LONG | 0x0E14 << 16, + PR_RECIPIENT_STATUS = PT.PT_LONG | 0x0E15 << 16, + PR_TRANSPORT_KEY = PT.PT_LONG | 0x0E16 << 16, + PR_MSG_STATUS = PT.PT_LONG | 0x0E17 << 16, + PR_MESSAGE_DOWNLOAD_TIME = PT.PT_LONG | 0x0E18 << 16, + PR_CREATION_VERSION = PT.PT_I8 | 0x0E19 << 16, + PR_MODIFY_VERSION = PT.PT_I8 | 0x0E1A << 16, + PR_HASATTACH = PT.PT_BOOLEAN | 0x0E1B << 16, + PR_BODY_CRC = PT.PT_LONG | 0x0E1C << 16, + PR_NORMALIZED_SUBJECT = PT.PT_TSTRING | 0x0E1D << 16, + PR_NORMALIZED_SUBJECT_W = PT.PT_UNICODE | 0x0E1D << 16, + PR_NORMALIZED_SUBJECT_A = PT.PT_STRING8 | 0x0E1D << 16, + PR_RTF_IN_SYNC = PT.PT_BOOLEAN | 0x0E1F << 16, + PR_ATTACH_SIZE = PT.PT_LONG | 0x0E20 << 16, + PR_ATTACH_NUM = PT.PT_LONG | 0x0E21 << 16, + PR_PREPROCESS = PT.PT_BOOLEAN | 0x0E22 << 16, + + // Message recipient properties + PR_CONTENT_INTEGRITY_CHECK = PT.PT_BINARY | 0x0C00 << 16, + PR_EXPLICIT_CONVERSION = PT.PT_LONG | 0x0C01 << 16, + PR_IPM_RETURN_REQUESTED = PT.PT_BOOLEAN | 0x0C02 << 16, + PR_MESSAGE_TOKEN = PT.PT_BINARY | 0x0C03 << 16, + PR_NDR_REASON_CODE = PT.PT_LONG | 0x0C04 << 16, + PR_NDR_DIAG_CODE = PT.PT_LONG | 0x0C05 << 16, + PR_NON_RECEIPT_NOTIFICATION_REQUESTED = PT.PT_BOOLEAN | 0x0C06 << 16, + PR_DELIVERY_POINT = PT.PT_LONG | 0x0C07 << 16, + + PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED = PT.PT_BOOLEAN | 0x0C08 << 16, + PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT = PT.PT_BINARY | 0x0C09 << 16, + PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY = PT.PT_BOOLEAN | 0x0C0A << 16, + PR_PHYSICAL_DELIVERY_MODE = PT.PT_LONG | 0x0C0B << 16, + PR_PHYSICAL_DELIVERY_REPORT_REQUEST = PT.PT_LONG | 0x0C0C << 16, + PR_PHYSICAL_FORWARDING_ADDRESS = PT.PT_BINARY | 0x0C0D << 16, + PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED = PT.PT_BOOLEAN | 0x0C0E << 16, + PR_PHYSICAL_FORWARDING_PROHIBITED = PT.PT_BOOLEAN | 0x0C0F << 16, + PR_PHYSICAL_RENDITION_ATTRIBUTES = PT.PT_BINARY | 0x0C10 << 16, + PR_PROOF_OF_DELIVERY = PT.PT_BINARY | 0x0C11 << 16, + PR_PROOF_OF_DELIVERY_REQUESTED = PT.PT_BOOLEAN | 0x0C12 << 16, + PR_RECIPIENT_CERTIFICATE = PT.PT_BINARY | 0x0C13 << 16, + PR_RECIPIENT_NUMBER_FOR_ADVICE = PT.PT_TSTRING | 0x0C14 << 16, + PR_RECIPIENT_NUMBER_FOR_ADVICE_W = PT.PT_UNICODE | 0x0C14 << 16, + PR_RECIPIENT_NUMBER_FOR_ADVICE_A = PT.PT_STRING8 | 0x0C14 << 16, + PR_RECIPIENT_TYPE = PT.PT_LONG | 0x0C15 << 16, + PR_REGISTERED_MAIL_TYPE = PT.PT_LONG | 0x0C16 << 16, + PR_REPLY_REQUESTED = PT.PT_BOOLEAN | 0x0C17 << 16, + //PR_REQUESTED_DELIVERY_METHOD = PT.PT_LONG | 0x0C18 << 16, + PR_SENDER_ENTRYID = PT.PT_BINARY | 0x0C19 << 16, + PR_SENDER_NAME = PT.PT_TSTRING | 0x0C1A << 16, + PR_SENDER_NAME_W = PT.PT_UNICODE | 0x0C1A << 16, + PR_SENDER_NAME_A = PT.PT_STRING8 | 0x0C1A << 16, + PR_SUPPLEMENTARY_INFO = PT.PT_TSTRING | 0x0C1B << 16, + PR_SUPPLEMENTARY_INFO_W = PT.PT_UNICODE | 0x0C1B << 16, + PR_SUPPLEMENTARY_INFO_A = PT.PT_STRING8 | 0x0C1B << 16, + PR_TYPE_OF_MTS_USER = PT.PT_LONG | 0x0C1C << 16, + PR_SENDER_SEARCH_KEY = PT.PT_BINARY | 0x0C1D << 16, + PR_SENDER_ADDRTYPE = PT.PT_TSTRING | 0x0C1E << 16, + PR_SENDER_ADDRTYPE_W = PT.PT_UNICODE | 0x0C1E << 16, + PR_SENDER_ADDRTYPE_A = PT.PT_STRING8 | 0x0C1E << 16, + PR_SENDER_EMAIL_ADDRESS = PT.PT_TSTRING | 0x0C1F << 16, + PR_SENDER_EMAIL_ADDRESS_W = PT.PT_UNICODE | 0x0C1F << 16, + PR_SENDER_EMAIL_ADDRESS_A = PT.PT_STRING8 | 0x0C1F << 16, + + // Message envelope properties + PR_ACKNOWLEDGEMENT_MODE = PT.PT_LONG | 0x0001 << 16, + PR_ALTERNATE_RECIPIENT_ALLOWED = PT.PT_BOOLEAN | 0x0002 << 16, + PR_AUTHORIZING_USERS = PT.PT_BINARY | 0x0003 << 16, + PR_AUTO_FORWARD_COMMENT = PT.PT_TSTRING | 0x0004 << 16, + PR_AUTO_FORWARD_COMMENT_W = PT.PT_UNICODE | 0x0004 << 16, + PR_AUTO_FORWARD_COMMENT_A = PT.PT_STRING8 | 0x0004 << 16, + PR_AUTO_FORWARDED = PT.PT_BOOLEAN | 0x0005 << 16, + PR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID = PT.PT_BINARY | 0x0006 << 16, + PR_CONTENT_CORRELATOR = PT.PT_BINARY | 0x0007 << 16, + PR_CONTENT_IDENTIFIER = PT.PT_TSTRING | 0x0008 << 16, + PR_CONTENT_IDENTIFIER_W = PT.PT_UNICODE | 0x0008 << 16, + PR_CONTENT_IDENTIFIER_A = PT.PT_STRING8 | 0x0008 << 16, + PR_CONTENT_LENGTH = PT.PT_LONG | 0x0009 << 16, + PR_CONTENT_RETURN_REQUESTED = PT.PT_BOOLEAN | 0x000A << 16, + + // Message envelope properties + PR_CONVERSATION_KEY = PT.PT_BINARY | 0x000B << 16, + + PR_CONVERSION_EITS = PT.PT_BINARY | 0x000C << 16, + PR_CONVERSION_WITH_LOSS_PROHIBITED = PT.PT_BOOLEAN | 0x000D << 16, + PR_CONVERTED_EITS = PT.PT_BINARY | 0x000E << 16, + PR_DEFERRED_DELIVERY_TIME = PT.PT_SYSTIME | 0x000F << 16, + PR_DELIVER_TIME = PT.PT_SYSTIME | 0x0010 << 16, + PR_DISCARD_REASON = PT.PT_LONG | 0x0011 << 16, + PR_DISCLOSURE_OF_RECIPIENTS = PT.PT_BOOLEAN | 0x0012 << 16, + PR_DL_EXPANSION_HISTORY = PT.PT_BINARY | 0x0013 << 16, + PR_DL_EXPANSION_PROHIBITED = PT.PT_BOOLEAN | 0x0014 << 16, + PR_EXPIRY_TIME = PT.PT_SYSTIME | 0x0015 << 16, + PR_IMPLICIT_CONVERSION_PROHIBITED = PT.PT_BOOLEAN | 0x0016 << 16, + PR_IMPORTANCE = PT.PT_LONG | 0x0017 << 16, + PR_IPM_ID = PT.PT_BINARY | 0x0018 << 16, + PR_LATEST_DELIVERY_TIME = PT.PT_SYSTIME | 0x0019 << 16, + PR_MESSAGE_CLASS = PT.PT_TSTRING | 0x001A << 16, + PR_MESSAGE_CLASS_W = PT.PT_UNICODE | 0x001A << 16, + PR_MESSAGE_CLASS_A = PT.PT_STRING8 | 0x001A << 16, + PR_MESSAGE_DELIVERY_ID = PT.PT_BINARY | 0x001B << 16, + + PR_MESSAGE_SECURITY_LABEL = PT.PT_BINARY | 0x001E << 16, + PR_OBSOLETED_IPMS = PT.PT_BINARY | 0x001F << 16, + PR_ORIGINALLY_INTENDED_RECIPIENT_NAME = PT.PT_BINARY | 0x0020 << 16, + PR_ORIGINAL_EITS = PT.PT_BINARY | 0x0021 << 16, + PR_ORIGINATOR_CERTIFICATE = PT.PT_BINARY | 0x0022 << 16, + PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED = PT.PT_BOOLEAN | 0x0023 << 16, + PR_ORIGINATOR_RETURN_ADDRESS = PT.PT_BINARY | 0x0024 << 16, + + PR_PARENT_KEY = PT.PT_BINARY | 0x0025 << 16, + PR_PRIORITY = PT.PT_LONG | 0x0026 << 16, + + PR_ORIGIN_CHECK = PT.PT_BINARY | 0x0027 << 16, + PR_PROOF_OF_SUBMISSION_REQUESTED = PT.PT_BOOLEAN | 0x0028 << 16, + PR_READ_RECEIPT_REQUESTED = PT.PT_BOOLEAN | 0x0029 << 16, + PR_RECEIPT_TIME = PT.PT_SYSTIME | 0x002A << 16, + PR_RECIPIENT_REASSIGNMENT_PROHIBITED = PT.PT_BOOLEAN | 0x002B << 16, + PR_REDIRECTION_HISTORY = PT.PT_BINARY | 0x002C << 16, + PR_RELATED_IPMS = PT.PT_BINARY | 0x002D << 16, + PR_ORIGINAL_SENSITIVITY = PT.PT_LONG | 0x002E << 16, + PR_LANGUAGES = PT.PT_TSTRING | 0x002F << 16, + PR_LANGUAGES_W = PT.PT_UNICODE | 0x002F << 16, + PR_LANGUAGES_A = PT.PT_STRING8 | 0x002F << 16, + PR_REPLY_TIME = PT.PT_SYSTIME | 0x0030 << 16, + PR_REPORT_TAG = PT.PT_BINARY | 0x0031 << 16, + PR_REPORT_TIME = PT.PT_SYSTIME | 0x0032 << 16, + PR_RETURNED_IPM = PT.PT_BOOLEAN | 0x0033 << 16, + PR_SECURITY = PT.PT_LONG | 0x0034 << 16, + PR_INCOMPLETE_COPY = PT.PT_BOOLEAN | 0x0035 << 16, + PR_SENSITIVITY = PT.PT_LONG | 0x0036 << 16, + PR_SUBJECT = PT.PT_TSTRING | 0x0037 << 16, + PR_SUBJECT_W = PT.PT_UNICODE | 0x0037 << 16, + PR_SUBJECT_A = PT.PT_STRING8 | 0x0037 << 16, + PR_SUBJECT_IPM = PT.PT_BINARY | 0x0038 << 16, + PR_CLIENT_SUBMIT_TIME = PT.PT_SYSTIME | 0x0039 << 16, + PR_REPORT_NAME = PT.PT_TSTRING | 0x003A << 16, + PR_REPORT_NAME_W = PT.PT_UNICODE | 0x003A << 16, + PR_REPORT_NAME_A = PT.PT_STRING8 | 0x003A << 16, + PR_SENT_REPRESENTING_SEARCH_KEY = PT.PT_BINARY | 0x003B << 16, + PR_X400_CONTENT_TYPE = PT.PT_BINARY | 0x003C << 16, + PR_SUBJECT_PREFIX = PT.PT_TSTRING | 0x003D << 16, + PR_SUBJECT_PREFIX_W = PT.PT_UNICODE | 0x003D << 16, + PR_SUBJECT_PREFIX_A = PT.PT_STRING8 | 0x003D << 16, + PR_NON_RECEIPT_REASON = PT.PT_LONG | 0x003E << 16, + PR_RECEIVED_BY_ENTRYID = PT.PT_BINARY | 0x003F << 16, + PR_RECEIVED_BY_NAME = PT.PT_TSTRING | 0x0040 << 16, + PR_RECEIVED_BY_NAME_W = PT.PT_UNICODE | 0x0040 << 16, + PR_RECEIVED_BY_NAME_A = PT.PT_STRING8 | 0x0040 << 16, + PR_SENT_REPRESENTING_ENTRYID = PT.PT_BINARY | 0x0041 << 16, + PR_SENT_REPRESENTING_NAME = PT.PT_TSTRING | 0x0042 << 16, + PR_SENT_REPRESENTING_NAME_W = PT.PT_UNICODE | 0x0042 << 16, + PR_SENT_REPRESENTING_NAME_A = PT.PT_STRING8 | 0x0042 << 16, + PR_RCVD_REPRESENTING_ENTRYID = PT.PT_BINARY | 0x0043 << 16, + PR_RCVD_REPRESENTING_NAME = PT.PT_TSTRING | 0x0044 << 16, + PR_RCVD_REPRESENTING_NAME_W = PT.PT_UNICODE | 0x0044 << 16, + PR_RCVD_REPRESENTING_NAME_A = PT.PT_STRING8 | 0x0044 << 16, + PR_REPORT_ENTRYID = PT.PT_BINARY | 0x0045 << 16, + PR_READ_RECEIPT_ENTRYID = PT.PT_BINARY | 0x0046 << 16, + PR_MESSAGE_SUBMISSION_ID = PT.PT_BINARY | 0x0047 << 16, + PR_PROVIDER_SUBMIT_TIME = PT.PT_SYSTIME | 0x0048 << 16, + PR_ORIGINAL_SUBJECT = PT.PT_TSTRING | 0x0049 << 16, + PR_ORIGINAL_SUBJECT_W = PT.PT_UNICODE | 0x0049 << 16, + PR_ORIGINAL_SUBJECT_A = PT.PT_STRING8 | 0x0049 << 16, + PR_DISC_VAL = PT.PT_BOOLEAN | 0x004A << 16, + PR_ORIG_MESSAGE_CLASS = PT.PT_TSTRING | 0x004B << 16, + PR_ORIG_MESSAGE_CLASS_W = PT.PT_UNICODE | 0x004B << 16, + PR_ORIG_MESSAGE_CLASS_A = PT.PT_STRING8 | 0x004B << 16, + PR_ORIGINAL_AUTHOR_ENTRYID = PT.PT_BINARY | 0x004C << 16, + PR_ORIGINAL_AUTHOR_NAME = PT.PT_TSTRING | 0x004D << 16, + PR_ORIGINAL_AUTHOR_NAME_W = PT.PT_UNICODE | 0x004D << 16, + PR_ORIGINAL_AUTHOR_NAME_A = PT.PT_STRING8 | 0x004D << 16, + PR_ORIGINAL_SUBMIT_TIME = PT.PT_SYSTIME | 0x004E << 16, + PR_REPLY_RECIPIENT_ENTRIES = PT.PT_BINARY | 0x004F << 16, + PR_REPLY_RECIPIENT_NAMES = PT.PT_TSTRING | 0x0050 << 16, + PR_REPLY_RECIPIENT_NAMES_W = PT.PT_UNICODE | 0x0050 << 16, + PR_REPLY_RECIPIENT_NAMES_A = PT.PT_STRING8 | 0x0050 << 16, + + PR_RECEIVED_BY_SEARCH_KEY = PT.PT_BINARY | 0x0051 << 16, + PR_RCVD_REPRESENTING_SEARCH_KEY = PT.PT_BINARY | 0x0052 << 16, + PR_READ_RECEIPT_SEARCH_KEY = PT.PT_BINARY | 0x0053 << 16, + PR_REPORT_SEARCH_KEY = PT.PT_BINARY | 0x0054 << 16, + PR_ORIGINAL_DELIVERY_TIME = PT.PT_SYSTIME | 0x0055 << 16, + PR_ORIGINAL_AUTHOR_SEARCH_KEY = PT.PT_BINARY | 0x0056 << 16, + + PR_MESSAGE_TO_ME = PT.PT_BOOLEAN | 0x0057 << 16, + PR_MESSAGE_CC_ME = PT.PT_BOOLEAN | 0x0058 << 16, + PR_MESSAGE_RECIP_ME = PT.PT_BOOLEAN | 0x0059 << 16, + + PR_ORIGINAL_SENDER_NAME = PT.PT_TSTRING | 0x005A << 16, + PR_ORIGINAL_SENDER_NAME_W = PT.PT_UNICODE | 0x005A << 16, + PR_ORIGINAL_SENDER_NAME_A = PT.PT_STRING8 | 0x005A << 16, + PR_ORIGINAL_SENDER_ENTRYID = PT.PT_BINARY | 0x005B << 16, + PR_ORIGINAL_SENDER_SEARCH_KEY = PT.PT_BINARY | 0x005C << 16, + PR_ORIGINAL_SENT_REPRESENTING_NAME = PT.PT_TSTRING | 0x005D << 16, + PR_ORIGINAL_SENT_REPRESENTING_NAME_W = PT.PT_UNICODE | 0x005D << 16, + PR_ORIGINAL_SENT_REPRESENTING_NAME_A = PT.PT_STRING8 | 0x005D << 16, + PR_ORIGINAL_SENT_REPRESENTING_ENTRYID = PT.PT_BINARY | 0x005E << 16, + PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY = PT.PT_BINARY | 0x005F << 16, + + PR_START_DATE = PT.PT_SYSTIME | 0x0060 << 16, + PR_END_DATE = PT.PT_SYSTIME | 0x0061 << 16, + PR_OWNER_APPT_ID = PT.PT_LONG | 0x0062 << 16, + //PR_RESPONSE_REQUESTED = PT.PT_BOOLEAN | 0x0063 << 16, + + PR_SENT_REPRESENTING_ADDRTYPE = PT.PT_TSTRING | 0x0064 << 16, + PR_SENT_REPRESENTING_ADDRTYPE_W = PT.PT_UNICODE | 0x0064 << 16, + PR_SENT_REPRESENTING_ADDRTYPE_A = PT.PT_STRING8 | 0x0064 << 16, + PR_SENT_REPRESENTING_EMAIL_ADDRESS = PT.PT_TSTRING | 0x0065 << 16, + PR_SENT_REPRESENTING_EMAIL_ADDRESS_W = PT.PT_UNICODE | 0x0065 << 16, + PR_SENT_REPRESENTING_EMAIL_ADDRESS_A = PT.PT_STRING8 | 0x0065 << 16, + + PR_ORIGINAL_SENDER_ADDRTYPE = PT.PT_TSTRING | 0x0066 << 16, + PR_ORIGINAL_SENDER_ADDRTYPE_W = PT.PT_UNICODE | 0x0066 << 16, + PR_ORIGINAL_SENDER_ADDRTYPE_A = PT.PT_STRING8 | 0x0066 << 16, + PR_ORIGINAL_SENDER_EMAIL_ADDRESS = PT.PT_TSTRING | 0x0067 << 16, + PR_ORIGINAL_SENDER_EMAIL_ADDRESS_W = PT.PT_UNICODE | 0x0067 << 16, + PR_ORIGINAL_SENDER_EMAIL_ADDRESS_A = PT.PT_STRING8 | 0x0067 << 16, + + PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE = PT.PT_TSTRING | 0x0068 << 16, + PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_W = PT.PT_UNICODE | 0x0068 << 16, + PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_A = PT.PT_STRING8 | 0x0068 << 16, + PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS = PT.PT_TSTRING | 0x0069 << 16, + PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_W = PT.PT_UNICODE | 0x0069 << 16, + PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_A = PT.PT_STRING8 | 0x0069 << 16, + + PR_CONVERSATION_TOPIC = PT.PT_TSTRING | 0x0070 << 16, + PR_CONVERSATION_TOPIC_W = PT.PT_UNICODE | 0x0070 << 16, + PR_CONVERSATION_TOPIC_A = PT.PT_STRING8 | 0x0070 << 16, + PR_CONVERSATION_INDEX = PT.PT_BINARY | 0x0071 << 16, + + PR_ORIGINAL_DISPLAY_BCC = PT.PT_TSTRING | 0x0072 << 16, + PR_ORIGINAL_DISPLAY_BCC_W = PT.PT_UNICODE | 0x0072 << 16, + PR_ORIGINAL_DISPLAY_BCC_A = PT.PT_STRING8 | 0x0072 << 16, + PR_ORIGINAL_DISPLAY_CC = PT.PT_TSTRING | 0x0073 << 16, + PR_ORIGINAL_DISPLAY_CC_W = PT.PT_UNICODE | 0x0073 << 16, + PR_ORIGINAL_DISPLAY_CC_A = PT.PT_STRING8 | 0x0073 << 16, + PR_ORIGINAL_DISPLAY_TO = PT.PT_TSTRING | 0x0074 << 16, + PR_ORIGINAL_DISPLAY_TO_W = PT.PT_UNICODE | 0x0074 << 16, + PR_ORIGINAL_DISPLAY_TO_A = PT.PT_STRING8 | 0x0074 << 16, + + PR_RECEIVED_BY_ADDRTYPE = PT.PT_TSTRING | 0x0075 << 16, + PR_RECEIVED_BY_ADDRTYPE_W = PT.PT_UNICODE | 0x0075 << 16, + PR_RECEIVED_BY_ADDRTYPE_A = PT.PT_STRING8 | 0x0075 << 16, + PR_RECEIVED_BY_EMAIL_ADDRESS = PT.PT_TSTRING | 0x0076 << 16, + PR_RECEIVED_BY_EMAIL_ADDRESS_W = PT.PT_UNICODE | 0x0076 << 16, + PR_RECEIVED_BY_EMAIL_ADDRESS_A = PT.PT_STRING8 | 0x0076 << 16, + + PR_RCVD_REPRESENTING_ADDRTYPE = PT.PT_TSTRING | 0x0077 << 16, + PR_RCVD_REPRESENTING_ADDRTYPE_W = PT.PT_UNICODE | 0x0077 << 16, + PR_RCVD_REPRESENTING_ADDRTYPE_A = PT.PT_STRING8 | 0x0077 << 16, + PR_RCVD_REPRESENTING_EMAIL_ADDRESS = PT.PT_TSTRING | 0x0078 << 16, + PR_RCVD_REPRESENTING_EMAIL_ADDRESS_W = PT.PT_UNICODE | 0x0078 << 16, + PR_RCVD_REPRESENTING_EMAIL_ADDRESS_A = PT.PT_STRING8 | 0x0078 << 16, + + PR_ORIGINAL_AUTHOR_ADDRTYPE = PT.PT_TSTRING | 0x0079 << 16, + PR_ORIGINAL_AUTHOR_ADDRTYPE_W = PT.PT_UNICODE | 0x0079 << 16, + PR_ORIGINAL_AUTHOR_ADDRTYPE_A = PT.PT_STRING8 | 0x0079 << 16, + PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS = PT.PT_TSTRING | 0x007A << 16, + PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_W = PT.PT_UNICODE | 0x007A << 16, + PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_A = PT.PT_STRING8 | 0x007A << 16, + + PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE = PT.PT_TSTRING | 0x007B << 16, + PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_W = PT.PT_UNICODE | 0x007B << 16, + PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_A = PT.PT_STRING8 | 0x007B << 16, + PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS = PT.PT_TSTRING | 0x007C << 16, + PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_W = PT.PT_UNICODE | 0x007C << 16, + PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_A = PT.PT_STRING8 | 0x007C << 16, + + PR_TRANSPORT_MESSAGE_HEADERS = PT.PT_TSTRING | 0x007D << 16, + PR_TRANSPORT_MESSAGE_HEADERS_W = PT.PT_UNICODE | 0x007D << 16, + PR_TRANSPORT_MESSAGE_HEADERS_A = PT.PT_STRING8 | 0x007D << 16, + + PR_DELEGATION = PT.PT_BINARY | 0x007E << 16, + + PR_TNEF_CORRELATION_KEY = PT.PT_BINARY | 0x007F << 16, + + // Message content properties + PR_BODY = PT.PT_TSTRING | 0x1000 << 16, + PR_BODY_W = PT.PT_UNICODE | 0x1000 << 16, + PR_BODY_A = PT.PT_STRING8 | 0x1000 << 16, + PR_REPORT_TEXT = PT.PT_TSTRING | 0x1001 << 16, + PR_REPORT_TEXT_W = PT.PT_UNICODE | 0x1001 << 16, + PR_REPORT_TEXT_A = PT.PT_STRING8 | 0x1001 << 16, + PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY = PT.PT_BINARY | 0x1002 << 16, + PR_REPORTING_DL_NAME = PT.PT_BINARY | 0x1003 << 16, + PR_REPORTING_MTA_CERTIFICATE = PT.PT_BINARY | 0x1004 << 16, + }; + + public class OutlookUtils { + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OutlookUtils)); + private const uint KEEP_OPEN_READONLY = 0x00000001; + private const uint KEEP_OPEN_READWRITE = 0x00000002; + private const uint FORCE_SAVE = 0x00000004; + + #region MAPI Interface ID'S + // The Interface ID's are used to retrieve the specific MAPI Interfaces from the IUnknown Object + public const string IID_IMAPISession = "00020300-0000-0000-C000-000000000046"; + public const string IID_IMAPIProp = "00020303-0000-0000-C000-000000000046"; + public const string IID_IMAPITable = "00020301-0000-0000-C000-000000000046"; + public const string IID_IMAPIMsgStore = "00020306-0000-0000-C000-000000000046"; + public const string IID_IMAPIFolder = "0002030C-0000-0000-C000-000000000046"; + public const string IID_IMAPISpoolerService = "0002031E-0000-0000-C000-000000000046"; + public const string IID_IMAPIStatus = "0002031E-0000-0000-C000-000000000046"; + public const string IID_IMessage = "00020307-0000-0000-C000-000000000046"; + public const string IID_IAddrBook = "00020309-0000-0000-C000-000000000046"; + public const string IID_IProfSect = "00020304-0000-0000-C000-000000000046"; + public const string IID_IMAPIContainer = "0002030B-0000-0000-C000-000000000046"; + public const string IID_IABContainer = "0002030D-0000-0000-C000-000000000046"; + public const string IID_IMsgServiceAdmin = "0002031D-0000-0000-C000-000000000046"; + public const string IID_IProfAdmin = "0002031C-0000-0000-C000-000000000046"; + public const string IID_IMailUser = "0002030A-0000-0000-C000-000000000046"; + public const string IID_IDistList = "0002030E-0000-0000-C000-000000000046"; + public const string IID_IAttachment = "00020308-0000-0000-C000-000000000046"; + public const string IID_IMAPIControl = "0002031B-0000-0000-C000-000000000046"; + public const string IID_IMAPILogonRemote = "00020346-0000-0000-C000-000000000046"; + public const string IID_IMAPIForm = "00020327-0000-0000-C000-000000000046"; + #endregion + + [ComVisible(false)] + [ComImport()] + [Guid(IID_IMAPIProp)] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + interface IMessage : IMAPIProp { + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetAttachmentTable(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int OpenAttach(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int CreateAttach(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int DeleteAttach(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetRecipientTable(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int ModifyRecipients(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SubmitMessage(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetReadFlag(); + } +// [ComVisible(false)] +// [ComImport()] +// [Guid(IID_IMAPIFolder)] +// [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] +// interface IMAPIFolder : IMAPIContainer { +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int CreateMessage(IntPtr interf, uint uFlags, [MarshalAs(UnmanagedType.Interface)] ref IMessage pMsg); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int CopyMessages(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int CreateFolder(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int CopyFolder(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int DeleteFolder(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int SetReadFlags(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int GetMessageStatus(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int SetMessageStatus(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int SaveContentsSort(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int EmptyFolder(); +// } +// [ComVisible(false)] +// [ComImport()] +// [Guid(IID_IMAPIContainer)] +// [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] +// interface IMAPIContainer : IMAPIProp { +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int GetContentsTable(uint uFlags, [MarshalAs(UnmanagedType.Interface), Out] out outlook.Table tbl); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int GetHierarchyTable(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int OpenEntry(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int SetSearchCriteria(); +// [return: MarshalAs(UnmanagedType.I4)] +// [PreserveSig] +// int GetSearchCriteria(); +// } + + [ComVisible(false)] + [ComImport()] + [Guid(IID_IMAPIProp)] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + interface IMAPIProp { + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetLastError(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SaveChanges( + uint uFlags + ); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetProps(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetPropList(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int OpenProperty(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetProps(uint values, IntPtr propArray, IntPtr problems); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int DeleteProps(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int CopyTo(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int CopyProps(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetNamesFromIDs(); + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetIDsFromNames(); + } + + [StructLayout(LayoutKind.Explicit)] + private struct SPropValue { + [FieldOffset(0)] + public uint propTag; + [FieldOffset(4)] + public uint alignPad; + [FieldOffset(8)] + public IntPtr Value; + [FieldOffset(8)] + public long filler; + } + + /// + /// Use MAPI32.DLL "HrGetOneProp" from managed code + /// + /// + /// + /// + public static string GetMAPIProperty(Attachment attachment, PropTags proptag) { + object mapiObject = attachment.MAPIOBJECT; + if (mapiObject == null) { + return ""; + } + + string sProperty = ""; + IntPtr pPropValue = IntPtr.Zero; + + IntPtr IUnknown = IntPtr.Zero; + IntPtr IMAPIProperty = IntPtr.Zero; + + try { + MAPIInitialize(IntPtr.Zero); + IUnknown = Marshal.GetIUnknownForObject(mapiObject); + Guid guidMAPIProp = new Guid(IID_IMAPIProp); + if (Marshal.QueryInterface(IUnknown, ref guidMAPIProp, out IMAPIProperty) != 0) { + return ""; + } + try { + HrGetOneProp(IMAPIProperty, (uint)proptag, out pPropValue); + if (pPropValue == IntPtr.Zero) { + return ""; + } + SPropValue propValue = (SPropValue)Marshal.PtrToStructure(pPropValue, typeof(SPropValue)); + sProperty = Marshal.PtrToStringUni(propValue.Value); + } catch (System.Exception ex) { + throw ex; + } + } finally { + if (pPropValue != IntPtr.Zero) { + MAPIFreeBuffer(pPropValue); + } + if (IMAPIProperty != IntPtr.Zero) { + Marshal.Release(IMAPIProperty); + } + if (IUnknown != IntPtr.Zero) { + Marshal.Release(IUnknown); + } + MAPIUninitialize(); + } + return sProperty; + } + + /// + /// Tries to save the changes we just made + /// + /// + /// + public static bool SaveChanges(Item mailItem) { + // Pointer to IUnknown Interface + IntPtr IUnknown = IntPtr.Zero; + // Pointer to IMAPIProp Interface + IntPtr IMAPIProp = IntPtr.Zero; + // if we have no MAPIObject everything is senseless... + if (mailItem == null) { + return false; + } + + try { + // We can pass NULL here as parameter, so we do it. + MAPIInitialize(IntPtr.Zero); + + // retrive the IUnknon Interface from our MAPIObject comming from Outlook. + IUnknown = Marshal.GetIUnknownForObject(mailItem.MAPIOBJECT); + + // create a Guid that we pass to retreive the IMAPIProp Interface. + Guid guidIMAPIProp = new Guid(IID_IMAPIProp); + + // try to retrieve the IMAPIProp interface from IMessage Interface, everything else is sensless. + if ( Marshal.QueryInterface(IUnknown, ref guidIMAPIProp, out IMAPIProp) != 0) { + return false; + } + IMAPIProp mapiProp = (IMAPIProp)Marshal.GetTypedObjectForIUnknown(IUnknown, typeof(IMAPIProp)); + return (mapiProp.SaveChanges(KEEP_OPEN_READWRITE) == 0); + } catch (Exception ex) { + LOG.Error(ex); + return false; + } finally { + // cleanup all references to COM Objects + if (IMAPIProp != IntPtr.Zero) Marshal.Release(IMAPIProp); + //if (IMessage != IntPtr.Zero) Marshal.Release(IMessage); + if (IUnknown != IntPtr.Zero) Marshal.Release(IUnknown); + } + } + + /// + /// Uses the IMAPIPROP.SetProps to set the content ID + /// + /// + /// + public static void SetContentID(Attachment attachment, string contentId) { + // Pointer to IUnknown Interface + IntPtr IUnknown = IntPtr.Zero; + // Pointer to IMAPIProp Interface + IntPtr IMAPIProp = IntPtr.Zero; + // A pointer that points to the SPropValue structure + IntPtr ptrPropValue = IntPtr.Zero; + // Structure that will hold the Property Value + SPropValue propValue; + // if we have no MAPIObject everything is senseless... + if (attachment == null) { + return; + } + + try { + // We can pass NULL here as parameter, so we do it. + MAPIInitialize(IntPtr.Zero); + + // retrive the IUnknon Interface from our MAPIObject comming from Outlook. + IUnknown = Marshal.GetIUnknownForObject(attachment.MAPIOBJECT); + IMAPIProp mapiProp = (IMAPIProp)Marshal.GetTypedObjectForIUnknown(IUnknown, typeof(IMAPIProp)); + + // Create structure + propValue = new SPropValue(); + propValue.propTag = (uint)PropTags.PR_ATTACH_CONTENT_ID; + //propValue.propTag = 0x3712001E; + // Create Ansi string + propValue.Value = Marshal.StringToHGlobalUni(contentId); + + // Create unmanaged memory for structure + ptrPropValue = Marshal.AllocHGlobal(Marshal.SizeOf(propValue)); + // Copy structure to unmanged memory + Marshal.StructureToPtr(propValue, ptrPropValue, false); + mapiProp.SetProps(1, ptrPropValue, IntPtr.Zero); + + propValue.propTag = (uint)PropTags.PR_ATTACH_CONTENT_LOCATION; + // Copy structure to unmanged memory + Marshal.StructureToPtr(propValue, ptrPropValue, false); + mapiProp.SetProps(1, ptrPropValue, IntPtr.Zero); + + + // Free string + Marshal.FreeHGlobal(propValue.Value); + mapiProp.SaveChanges(KEEP_OPEN_READWRITE); + } catch (Exception ex) { + LOG.Error(ex); + } finally { + // Free used Memory structures + if (ptrPropValue != IntPtr.Zero) Marshal.FreeHGlobal(ptrPropValue); + // cleanup all references to COM Objects + if (IMAPIProp != IntPtr.Zero) Marshal.Release(IMAPIProp); + //if (IMessage != IntPtr.Zero) Marshal.Release(IMessage); + if (IUnknown != IntPtr.Zero) Marshal.Release(IUnknown); + } + } + + /// + /// Use MAPI32.DLL "HrSetOneProp" from managed code + /// + /// + /// + /// + /// + public static bool SetMAPIProperty(Attachment attachment, PropTags proptag, string propertyValue) { + // Pointer to IUnknown Interface + IntPtr IUnknown = IntPtr.Zero; + // Pointer to IMAPIProp Interface + IntPtr IMAPIProp = IntPtr.Zero; + // Structure that will hold the Property Value + SPropValue propValue; + // A pointer that points to the SPropValue structure + IntPtr ptrPropValue = IntPtr.Zero; + object mapiObject = attachment.MAPIOBJECT; + // if we have no MAPIObject everything is senseless... + if (mapiObject == null) { + return false; + } + + try { + // We can pass NULL here as parameter, so we do it. + MAPIInitialize(IntPtr.Zero); + + // retrive the IUnknon Interface from our MAPIObject comming from Outlook. + IUnknown = Marshal.GetIUnknownForObject(mapiObject); + + // create a Guid that we pass to retreive the IMAPIProp Interface. + Guid guidIMAPIProp = new Guid(IID_IMAPIProp); + + // try to retrieve the IMAPIProp interface from IMessage Interface, everything else is sensless. + if ( Marshal.QueryInterface(IUnknown, ref guidIMAPIProp, out IMAPIProp) != 0) { + return false; + } + + // double check, if we wave no pointer, exit... + if (IMAPIProp == IntPtr.Zero) { + return false; + } + + // Create structure + propValue = new SPropValue(); + propValue.propTag = (uint)proptag; + // Create Ansi string + propValue.Value = Marshal.StringToHGlobalUni(propertyValue); + + // Create unmanaged memory for structure + ptrPropValue = Marshal.AllocHGlobal(Marshal.SizeOf(propValue)); + // Copy structure to unmanged memory + Marshal.StructureToPtr(propValue, ptrPropValue, false); + + // Set the property + HrSetOneProp(IMAPIProp, ptrPropValue); + + // Free string + Marshal.FreeHGlobal(propValue.Value); + IMAPIProp mapiProp = (IMAPIProp)Marshal.GetTypedObjectForIUnknown(IUnknown, typeof(IMAPIProp)); + return mapiProp.SaveChanges(4) == 0; + } catch (System.Exception ex) { + LOG.Error(ex); + return false; + } finally { + // Free used Memory structures + if (ptrPropValue != IntPtr.Zero) Marshal.FreeHGlobal(ptrPropValue); + // cleanup all references to COM Objects + if (IMAPIProp != IntPtr.Zero) Marshal.Release(IMAPIProp); + //if (IMessage != IntPtr.Zero) Marshal.Release(IMessage); + if (IUnknown != IntPtr.Zero) Marshal.Release(IUnknown); + MAPIUninitialize(); + } + } + + #region MAPI DLL Imports + + [DllImport("MAPI32.DLL", CharSet = CharSet.Ansi, EntryPoint = "HrGetOneProp@12")] + private static extern void HrGetOneProp(IntPtr pmp, uint ulPropTag, out IntPtr ppProp); + + [DllImport("MAPI32.DLL", CharSet = CharSet.Ansi, EntryPoint = "HrSetOneProp@8")] + private static extern void HrSetOneProp(IntPtr pmp, IntPtr pprop); + + [DllImport("MAPI32.DLL", CharSet = CharSet.Ansi, EntryPoint = "MAPIFreeBuffer@4")] + private static extern void MAPIFreeBuffer(IntPtr lpBuffer); + + [DllImport("MAPI32.DLL", CharSet = CharSet.Ansi)] + private static extern int MAPIInitialize(IntPtr lpMapiInit); + + [DllImport("MAPI32.DLL", CharSet = CharSet.Ansi)] + private static extern void MAPIUninitialize(); + #endregion + } +} diff --git a/GreenshotTest/Test/Helpers/ScaleHelperTest.cs b/GreenshotTest/Test/Helpers/ScaleHelperTest.cs new file mode 100644 index 000000000..cd433bc14 --- /dev/null +++ b/GreenshotTest/Test/Helpers/ScaleHelperTest.cs @@ -0,0 +1,207 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2011 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.Drawing; +using System.Windows.Forms; +using Greenshot.Configuration; +using Greenshot.Drawing; +using Greenshot.Forms; +using Greenshot.Helpers; +using GreenshotPlugin.Core; +using IniFile; +using NUnit.Framework; + +namespace Greenshot.Test +{ + [TestFixture] + public class ScaleHelperTest { + + [Test] + public void FreeScaleTest() { + RectangleF r = new RectangleF(0,0,10,20); + ScaleHelper.Scale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(10,20)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(10, r.Width); + Assert.AreEqual(20, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.Scale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(30,40)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(30, r.Width); + Assert.AreEqual(40, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.Scale(ref r, Gripper.POSITION_BOTTOM_CENTER, new PointF(9999,40)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(10, r.Width); + Assert.AreEqual(40, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.Scale(ref r, Gripper.POSITION_BOTTOM_LEFT, new PointF(3,40)); + Assert.AreEqual(3, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(7, r.Width); + Assert.AreEqual(40, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.Scale(ref r, Gripper.POSITION_MIDDLE_RIGHT, new PointF(48,9999)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(48, r.Width); + Assert.AreEqual(20, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.Scale(ref r, Gripper.POSITION_MIDDLE_RIGHT, new PointF(8,9999)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(8, r.Width); + Assert.AreEqual(20, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.Scale(ref r, Gripper.POSITION_TOP_RIGHT, new PointF(17,-37)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(-37, r.Top); + Assert.AreEqual(17, r.Width); + Assert.AreEqual(57, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.Scale(ref r, Gripper.POSITION_TOP_CENTER, new PointF(9998,-77)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(-77, r.Top); + Assert.AreEqual(10, r.Width); + Assert.AreEqual(97, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.Scale(ref r, Gripper.POSITION_TOP_LEFT, new PointF(-23,-54)); + Assert.AreEqual(-23, r.Left); + Assert.AreEqual(-54, r.Top); + Assert.AreEqual(33, r.Width); + Assert.AreEqual(74, r.Height); + } + + [Test] + public void RationalScaleTest() { + RectangleF r = new RectangleF(0,0,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(10,20)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(10, r.Width); + Assert.AreEqual(20, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(30,60)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(30, r.Width); + Assert.AreEqual(60, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(30,96768)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(30, r.Width); + Assert.AreEqual(60, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_CENTER, new PointF(9999,40)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(10, r.Width); + Assert.AreEqual(40, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_LEFT, new PointF(-90, 9234)); + Assert.AreEqual(-90, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(100, r.Width); + Assert.AreEqual(200, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_MIDDLE_RIGHT, new PointF(48,9999)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(48, r.Width); + Assert.AreEqual(20, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_MIDDLE_RIGHT, new PointF(8,9999)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(8, r.Width); + Assert.AreEqual(20, r.Height); + + r = new RectangleF(0,20,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_TOP_RIGHT, new PointF(20,829634235)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(20, r.Width); + Assert.AreEqual(40, r.Height); + + r = new RectangleF(0,0,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_TOP_CENTER, new PointF(9998,-77)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(-77, r.Top); + Assert.AreEqual(10, r.Width); + Assert.AreEqual(97, r.Height); + + r = new RectangleF(10,20,10,20); + ScaleHelper.RationalScale(ref r, Gripper.POSITION_TOP_LEFT, new PointF(0,0)); + Assert.AreEqual(0, r.Left); + Assert.AreEqual(0, r.Top); + Assert.AreEqual(20, r.Width); + Assert.AreEqual(40, r.Height); + } + + /*[Test] + public void GetFileNameWithExtensionTest() { + SaveImageFileDialog sifd = new SaveImageFileDialog(); + + sifd.InitialDirectory = @"C:\some\path"; + sifd.FileName = "myimage.jpg"; + sifd.Extension = "jpg"; + Assert.AreEqual("myimage.jpg",sifd.FileNameWithExtension); + + sifd.Extension = "gif"; + Assert.AreEqual("myimage.jpg.gif",sifd.FileNameWithExtension); + + sifd.FileName = "myimage"; + Assert.AreEqual("myimage.gif",sifd.FileNameWithExtension); + + } + + [Test] + public void SuggestBasicFileNameTest() { + //conf.Output_FileAs_Fullpath = @"c:\path\to\greenshot_testdir\gstest_28.jpg"; + conf.OutputFilePath = @"c:\path\to\greenshot_testdir\"; + conf.OutputFileFilenamePattern = "gstest_${NUM}"; + conf.OutputFileFormat = OutputFormat.png; + conf.OutputFileIncrementingNumber = 28; + SaveImageFileDialog sifd = new SaveImageFileDialog(); + + Assert.AreEqual(sifd.InitialDirectory, @"c:\path\to\greenshot_testdir"); + Assert.AreEqual(sifd.FileNameWithExtension, "gstest_000028.jpg"); + + }*/ + } +}