修改为东南天坐标系

This commit is contained in:
2026-01-20 09:49:52 +08:00
parent 9538757047
commit 333fad40ac
7201 changed files with 1030888 additions and 85410 deletions

View File

@@ -0,0 +1,216 @@
"""Constant definitions, mostly property ids (PIDs) and property types (PTYPs)."""
# -- Property IDs - These names are formed by upper-snake-casing the Microsoft name for each
# -- property-id, dropping the "Tag" segment. E.g. "PidTagAttachSize" -> "PID_ATTACH_SIZE"
PID_ACCESS = 0x0FF4
PID_ACCESS_LEVEL = 0x0FF7
PID_ACKNOWLEDGEMENT_MODE = 0x0001
PID_ADDRESS_BOOK_FOLDER_PATHNAME = 0x8004
PID_ADDRESS_BOOK_HOME_MESSAGE_DATABASE = 0x8006
PID_ADDRESS_BOOK_IS_MEMBER_OF_DISTRIBUTION_LIST = 0x8008
PID_ADDRESS_BOOK_MANAGER_DISTINGUISHED_NAME = 0x8005
PID_ADDRESS_BOOK_MEMBER = 0x8009
PID_ADDRESS_TYPE = 0x3002
PID_ALTERNATE_RECIPIENT_ALLOWED = 0x0002
PID_ATTACHMENT_FLAGS = 0x7FFD
PID_ATTACHMENT_HIDDEN = 0x7FFE
PID_ATTACHMENT_LINK_ID = 0x7FFA
PID_ATTACH_CONTENT_ID = 0x3712
PID_ATTACH_DATA_BINARY = 0x3701
PID_ATTACH_ENCODING = 0x3702
PID_ATTACH_EXTENSION = 0x3703
PID_ATTACH_FILENAME = 0x3704
PID_ATTACH_FLAGS = 0x3714
PID_ATTACH_LONG_FILENAME = 0x3707
PID_ATTACH_METHOD = 0x3705
PID_ATTACH_MIME_SEQUENCE = 0x3710
PID_ATTACH_MIME_TAG = 0x370E
PID_ATTACH_NUMBER = 0x0E21
PID_ATTACH_RENDERING = 0x3709
PID_ATTACH_RENDERING_POSITION = 0x370B
PID_ATTACH_SIZE = 0x0E20
PID_ATTACH_TAG = 0x370A
PID_AUTHORIZING_USERS = 0x0003
PID_AUTO_FORWARDED = 0x0005
PID_AUTO_FORWARD_COMMENT = 0x0004
PID_BODY = 0x1000
PID_BODY_HTML = 0x1013
PID_CHANGE_KEY = 0x65E2
PID_CLIENT_SUBMIT_TIME = 0x0039
PID_CONTENT_CONFIDENTIALITY_ALGORITHM_ID = 0x0006
PID_CONTENT_CORRELATOR = 0x0007
PID_CONTENT_IDENTIFIER = 0x0008
PID_CONTENT_LENGTH = 0x0009
PID_CONTENT_RETURN_REQUESTED = 0x000A
PID_CONVERSATION_INDEX = 0x0071
PID_CONVERSATION_INDEX_TRACKING = 0x3016
PID_CONVERSATION_KEY = 0x000B
PID_CONVERSATION_TOPIC = 0x0070
PID_CONVERSION_EITS = 0x000C
PID_CONVERSION_WITH_LOSS_PROHIBITED = 0x000D
PID_CONVERTED_EITS = 0x000E
PID_CREATION_TIME = 0x3007
PID_CREATOR_ADDRESS_TYPE = 0x4022
PID_CREATOR_EMAIL_ADDRESS = 0x4023
PID_CREATOR_SIMPLE_DISPLAY_NAME = 0x4038
PID_DEFERRED_DELIVERY_TIME = 0x000F
PID_DELEGATION = 0x007E
PID_DELETE_AFTER_SUBMIT = 0x0E01
PID_DELIVER_TIME = 0x0010
PID_DISCARD_REASON = 0x0011
PID_DISCLOSURE_OF_RECIPIENTS = 0x0012
PID_DISPLAY_BCC = 0x0E02
PID_DISPLAY_CC = 0x0E03
PID_DISPLAY_NAME = 0x3001
PID_DISPLAY_TO = 0x0E04
PID_DISTRIBUTION_LIST_EXPANSION_HISTORY = 0x0013
PID_DISTRIBUTION_LIST_EXPANSION_PROHIBITED = 0x0014
PID_EMAIL_ADDRESS = 0x3003
PID_END_DATE = 0x0061
PID_ENTRY_ID = 0x0FFF
PID_EXCEPTION_END_TIME = 0x7FFC
PID_EXCEPTION_START_TIME = 0x7FFB
PID_EXPIRY_TIME = 0x0015
PID_FLAG_STATUS = 0x1090
PID_HAS_ATTACHMENTS = 0x0E1B
PID_HTML = 0x1013
PID_ICON_INDEX = 0x1080
PID_IMPLICIT_CONVERSION_PROHIBITED = 0x0016
PID_IMPORTANCE = 0x0017
PID_INITIAL_DETAILS_PANE = 0x3F08
PID_INSTANCE_KEY = 0x0FF6
PID_INTERNET_CODEPAGE = 0x3FDE
PID_INTERNET_MESSAGE_ID = 0x1035
PID_INTERNET_REFERENCES = 0x1039
PID_IN_REPLY_TO_ID = 0x1042
PID_LAST_MODIFICATION_TIME = 0x3008
PID_LAST_MODIFIER_NAME = 0x3FFA
PID_LATEST_DELIVERY_TIME = 0x0019
PID_LID_CONTACT_ITEM_DATA = 0x8007
PID_MESSAGE_CC_ME = 0x0058
PID_MESSAGE_CLASS = 0x001A
PID_MESSAGE_CODEPAGE = 0x3FFD
PID_MESSAGE_DELIVERY_ID = 0x001B
PID_MESSAGE_DELIVERY_TIME = 0x0E06
PID_MESSAGE_FLAGS = 0x0E07
PID_MESSAGE_LOCALE_ID = 0x3FF1
PID_MESSAGE_RECIPIENT_ME = 0x0059
PID_MESSAGE_SECURITY_LABEL = 0x001E
PID_MESSAGE_SIZE_EXTENDED = 0x0E08
PID_MESSAGE_SUBMISSION_ID = 0x0047
PID_MESSAGE_TO_ME = 0x0057
PID_NATIVE_BODY = 0x1016
PID_NON_RECEIPT_NOTIFICATION_REQUESTED = 0x0C06
PID_NORMALIZED_SUBJECT = 0x0E1D
PID_OBJECT_TYPE = 0x0FFE
PID_OBSOLETED_MESSAGE_IDS = 0x001F
PID_ORIGINALLY_INTENDED_RECIPIENT_NAME = 0x0020
PID_ORIGINALLY_INTENDED_RECIP_ADDRTYPE = 0x007B
PID_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS = 0x007C
PID_ORIGINAL_AUTHOR_ADDRESS_TYPE = 0x0079
PID_ORIGINAL_AUTHOR_EMAIL_ADDRESS = 0x007A
PID_ORIGINAL_AUTHOR_ENTRY_ID = 0x004C
PID_ORIGINAL_AUTHOR_NAME = 0x004D
PID_ORIGINAL_DELIVERY_TIME = 0x0055
PID_ORIGINAL_DISPLAY_BCC = 0x0072
PID_ORIGINAL_DISPLAY_CC = 0x0073
PID_ORIGINAL_DISPLAY_TO = 0x0074
PID_ORIGINAL_EITS = 0x0021
PID_ORIGINAL_MESSAGE_CLASS = 0x004B
PID_ORIGINAL_MESSAGE_ID = 0x1046
PID_ORIGINAL_SENDER_ADDRESS_TYPE = 0x0066
PID_ORIGINAL_SENDER_EMAIL_ADDRESS = 0x0067
PID_ORIGINAL_SENDER_ENTRY_ID = 0x005B
PID_ORIGINAL_SENDER_NAME = 0x005A
PID_ORIGINAL_SENDER_SEARCH_KEY = 0x005C
PID_ORIGINAL_SENSITIVITY = 0x002E
PID_ORIGINAL_SENT_REPRESENTING_ADDRESS_TYPE = 0x0068
PID_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS = 0x0069
PID_ORIGINAL_SENT_REPRESENTING_ENTRY_ID = 0x005E
PID_ORIGINAL_SENT_REPRESENTING_NAME = 0x005D
PID_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY = 0x005F
PID_ORIGINAL_SUBJECT = 0x0049
PID_ORIGINAL_SUBMIT_TIME = 0x004E
PID_ORIGINATOR_CERTIFICATE = 0x0022
PID_ORIGINATOR_DELIVERY_REPORT_REQUESTED = 0x0023
PID_ORIGINATOR_RETURN_ADDRESS = 0x0024
PID_ORIGIN_CHECK = 0x0027
PID_OWNER_APPOINTMENT_ID = 0x0062
PID_PARENT_DISPLAY = 0x0E05
PID_PARENT_KEY = 0x0025
PID_PREDECESSOR_CHANGE_LIST = 0x65E3
PID_PRIORITY = 0x0026
PID_PROOF_OF_SUBMISSION_REQUESTED = 0x0028
PID_READ_RECEIPT_ENTRY_ID = 0x0046
PID_READ_RECEIPT_REQUESTED = 0x0029
PID_READ_RECEIPT_SEARCH_KEY = 0x0053
PID_RECEIPT_TIME = 0x002A
PID_RECEIVED_BY_ADDRESS_TYPE = 0x0075
PID_RECEIVED_BY_EMAIL_ADDRESS = 0x0076
PID_RECEIVED_BY_ENTRY_ID = 0x003F
PID_RECEIVED_BY_NAME = 0x0040
PID_RECEIVED_BY_SEARCH_KEY = 0x0051
PID_RECEIVED_REPRESENTING_ADDRESS_TYPE = 0x0077
PID_RECEIVED_REPRESENTING_EMAIL_ADDRESS = 0x0078
PID_RECEIVED_REPRESENTING_ENTRY_ID = 0x0043
PID_RECEIVED_REPRESENTING_NAME = 0x0044
PID_RECEIVED_REPRESENTING_SEARCH_KEY = 0x0052
PID_RECIPIENT_REASSIGNMENT_PROHIBITED = 0x002B
PID_RECIPIENT_TYPE = 0x0C15
PID_RECORD_KEY = 0x0FF9
PID_REDIRECTION_HISTORY = 0x002C
PID_REPLY_RECIPIENT_ENTRIES = 0x004F
PID_REPLY_RECIPIENT_NAMES = 0x0050
PID_REPLY_TIME = 0x0030
PID_REPORT = 0x0031
PID_REPORT_DISPOSITION = 0x0080
PID_REPORT_DISPOSITION_MODE = 0x0081
PID_REPORT_ENTRY_ID = 0x0045
PID_REPORT_NAME = 0x003A
PID_REPORT_SEARCH_KEY = 0x0054
PID_REPORT_TIME = 0x0032
PID_RESPONSE_REQUESTED = 0x0063
PID_ROW_ID = 0x3000
PID_RTF_COMPRESSED = 0x1009
PID_RTF_IN_SYNC = 0x0E1F
PID_SEARCH_KEY = 0x300B
PID_SECURITY = 0x0034
PID_SENDER_ADDRESS_TYPE = 0x0C1E
PID_SENDER_EMAIL_ADDRESS = 0x0C1F
PID_SENDER_ENTRY_ID = 0x0C19
PID_SENDER_NAME = 0x0C1A
PID_SENDER_SEARCH_KEY = 0x0C1D
PID_SENDER_SMTP_ADDRESS = 0x5D01
PID_SENSITIVITY = 0x0036
PID_SENT_REPRESENTING_ADDRESS_TYPE = 0x0064
PID_SENT_REPRESENTING_EMAIL_ADDRESS = 0x0065
PID_SENT_REPRESENTING_ENTRY_ID = 0x0041
PID_SENT_REPRESENTING_NAME = 0x0042
PID_SENT_REPRESENTING_SEARCH_KEY = 0x003B
PID_SMTP_ADDRESS = 0x39FE
PID_START_DATE = 0x0060
PID_STORE_SUPPORT_MASK = 0x340D
PID_STORE_UNICODE_MASK = 0x340F
PID_SUBJECT = 0x0037
PID_SUBJECT_MESSAGE_ID = 0x0038
PID_SUBJECT_PREFIX = 0x003D
PID_TNEF_CORRELATION_KEY = 0x007F
PID_TRANSPORT_MESSAGE_HEADERS = 0x007D
# -- Property Data Types - These are detailed in the MS-OXCDATA spec --
PTYP_BINARY = 0x0102
PTYP_BOOLEAN = 0x000B
PTYP_FLOATING_32 = 0x0004
PTYP_FLOATING_64 = 0x0005
PTYP_GUID = 0x0048
PTYP_INTEGER_16 = 0x0002
PTYP_INTEGER_32 = 0x0003
PTYP_MULTIPLE_INTEGER_32 = 0x1003
PTYP_MULTIPLE_STRING = 0x101F
PTYP_OBJECT = 0x000D
PTYP_STRING = 0x001F
PTYP_STRING8 = 0x001E
PTYP_TIME = 0x0040

View File

@@ -0,0 +1,192 @@
"""Mapping of Microsoft code-page-identifiers (ints) to Python character-encoding names.
Derived from the table at:
https://learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
Microsoft-supported code pages that do not have a built-in Python codec are indicated by the empty
string. This allows a `.get()` on this mapping to distinguish between a codec that is unknown and
one that is recognized but not supported.
"""
from __future__ import annotations
from oxmsg.domain import model as m
def encoding_from_codepage(codepage: int) -> str:
"""Map `codepage` to Python character encoding like "iso-2022-jp".
- Raises `UnrecognizedCodePageError` when `codepage` is not a known Microsoft character
codepage.
- Raises `UnsupportedEncodingError` when `codepage` is recognized but Python has no builtin
codec for that encoding.
"""
encoding = _CODE_PAGE_ENCODINGS.get(codepage)
if encoding is None:
raise m.UnrecognizedCodePageError( # pragma: no cover
"the code-page specified in this message is not a known Microsoft character encoding"
)
if encoding == "":
raise m.UnsupportedEncodingError( # pragma: no cover
"the character-encoding used in this message is not supported by Python"
)
return encoding
_CODE_PAGE_ENCODINGS = {
37: "IBM037", # -- IBM EBCDIC US-Canada --
437: "IBM437", # -- OEM United States --
500: "IBM500", # -- IBM EBCDIC International --
708: "ASMO-708", # -- Arabic (ASMO 708) --
709: "", # -- Arabic (ASMO-449+, BCON V4) --
710: "", # -- Arabic - Transparent Arabic --
720: "DOS-720", # -- Arabic (Transparent ASMO) --
737: "cp737", # -- OEM Greek (formerly 437G) --
775: "ibm775", # -- OEM Baltic --
850: "ibm850", # -- OEM Multilingual Latin 1 --
852: "ibm852", # -- OEM Latin 2 --
855: "IBM855", # -- OEM Cyrillic (primarily Russian) --
857: "ibm857", # -- OEM Turkish --
858: "cp858", # -- OEM Multilingual Latin 1 + Euro symbol --
860: "IBM860", # -- OEM Portuguese --
861: "ibm861", # -- OEM Icelandic --
862: "cp862", # -- OEM Hebrew --
863: "IBM863", # -- OEM French Canadian --
864: "IBM864", # -- OEM Arabic --
865: "IBM865", # -- OEM Nordic --
866: "cp866", # -- OEM Russian --
869: "ibm869", # -- OEM Modern Greek --
870: "cp870", # -- IBM EBCDIC Multilingual/ROECE (Latin 2) --
874: "windows-874", # -- ANSI/OEM Thai (ISO 8859-11) --
875: "cp875", # -- IBM EBCDIC Greek Modern --
932: "shift_jis", # -- ANSI/OEM Japanese --
936: "gb2312", # -- ANSI/OEM Simplified Chinese (PRC, Singapore) --
949: "ks_c_5601-1987", # -- ANSI/OEM Korean (Unified Hangul Code) --
950: "windows-950", # -- ANSI/OEM Traditional Chinese (Taiwan, Hong Kong SAR, PRC) --
1026: "IBM1026", # -- IBM EBCDIC Turkish (Latin 5) --
1047: "cp1047", # -- IBM EBCDIC Latin 1/Open System --
1140: "cp1140", # -- IBM EBCDIC US-Canada (037 + Euro symbol) --
1141: "cp1141", # -- IBM EBCDIC Germany (20273 + Euro symbol) --
1142: "cp1142", # -- IBM EBCDIC Denmark-Norway (20277 + Euro symbol) --
1143: "cp1143", # -- IBM EBCDIC Finland-Sweden (20278 + Euro symbol) --
1144: "cp1144", # -- IBM EBCDIC Italy (20280 + Euro symbol) --
1145: "cp1145", # -- IBM EBCDIC Latin America-Spain (20284 + Euro symbol) --
1146: "cp1146", # -- IBM EBCDIC United Kingdom (20285 + Euro symbol) --
1147: "cp1147", # -- IBM EBCDIC France (20297 + Euro symbol) --
1148: "cp1148ms", # -- IBM EBCDIC International (500 + Euro symbol) --
1149: "cp1149", # -- IBM EBCDIC Icelandic (20871 + Euro symbol) --
1200: "utf-16-le", # -- Unicode UTF-16, little endian byte order (BMP of ISO 10646); --
1201: "utf-16-be", # -- Unicode UTF-16, big endian byte order; --
1250: "windows-1250", # -- ANSI Central European --
1251: "windows-1251", # -- ANSI Cyrillic --
1252: "windows-1252", # -- ANSI Latin 1 --
1253: "windows-1253", # -- ANSI Greek --
1254: "windows-1254", # -- ANSI Turkish --
1255: "windows-1255", # -- ANSI Hebrew --
1256: "windows-1256", # -- ANSI Arabic --
1257: "windows-1257", # -- ANSI Baltic --
1258: "windows-1258", # -- ANSI/OEM Vietnamese --
1361: "Johab", # -- Korean (Johab) --
10000: "macintosh", # -- MAC Roman; Western European (Mac) --
10001: "x-mac-japanese", # -- Japanese (Mac) --
10002: "", # -- (x-mac-chinesetrad) MAC Traditional Chinese (Big5) --
10003: "x-mac-korean", # -- Korean (Mac) --
10004: "", # -- (x-mac-arabic) Arabic (Mac) --
10005: "", # -- (x-mac-hebrew) Hebrew (Mac) --
10006: "x-mac-greek", # -- Greek (Mac) --
10007: "x-mac-cyrillic", # -- Cyrillic (Mac) --
10008: "", # -- (x-mac-chinesesimp) MAC Simplified Chinese (GB 2312) --
10010: "", # -- (x-mac-romanian) Romanian (Mac) --
10017: "", # -- (x-mac-ukrainian) Ukrainian (Mac) --
10021: "", # -- (x-mac-thai) Thai (Mac) --
10029: "x-mac-ce", # -- MAC Latin 2; Central European (Mac) --
10079: "x-mac-icelandic", # -- Icelandic (Mac) --
10081: "x-mac-turkish", # -- Turkish (Mac) --
10082: "", # -- (x-mac-croatian) Croatian (Mac) --
12000: "utf-32", # -- Unicode UTF-32, little endian byte order --
12001: "utf-32BE", # -- Unicode UTF-32, big endian byte order --
20000: "", # -- (x-Chinese_CNS) CNS Taiwan --
20001: "", # -- (x-cp20001) TCA Taiwan --
20002: "", # -- (x_Chinese-Eten) Eten Taiwan --
20003: "", # -- (x-cp20003) IBM5550 Taiwan --
20004: "", # -- (x-cp20004) TeleText Taiwan --
20005: "", # -- (x-cp20005) Wang Taiwan --
20105: "", # -- (x-IA5) IA5 (IRV International Alphabet No. 5, 7-bit) --
20106: "", # -- (x-IA5-German) IA5 German (7-bit) --
20107: "", # -- (x-IA5-Swedish) IA5 Swedish (7-bit) --
20108: "", # -- (x-IA5-Norwegian) IA5 Norwegian (7-bit) --
20127: "us-ascii", # -- US-ASCII (7-bit) --
20261: "", # -- (x-cp20261) T.61 --
20269: "", # -- (x-cp20269) ISO 6937 Non-Spacing Accent --
20273: "IBM273", # -- IBM EBCDIC Germany --
20277: "cp277", # -- IBM EBCDIC Denmark-Norway --
20278: "cp278", # -- IBM EBCDIC Finland-Sweden --
20280: "cp280", # -- IBM EBCDIC Italy --
20284: "cp284", # -- IBM EBCDIC Latin America-Spain --
20285: "cp285", # -- IBM EBCDIC United Kingdom --
20290: "cp290", # -- IBM EBCDIC Japanese Katakana Extended --
20297: "cp297", # -- IBM EBCDIC France --
20420: "cp420", # -- IBM EBCDIC Arabic --
20423: "", # -- (IBM423) IBM EBCDIC Greek --
20424: "IBM424", # -- IBM EBCDIC Hebrew --
20833: "cp833", # -- IBM EBCDIC Korean Extended --
20838: "cp838", # -- IBM EBCDIC Thai --
20866: "koi8-r", # -- Russian (KOI8-R); Cyrillic (KOI8-R) --
20871: "cp871", # -- IBM EBCDIC Icelandic --
20880: "", # -- (IBM880) IBM EBCDIC Cyrillic Russian --
20905: "IBM905", # -- IBM EBCDIC Turkish --
20924: "", # -- (IBM00924) IBM EBCDIC Latin 1/Open System (1047 + Euro symbol) --
20932: "EUC-JP", # -- Japanese (JIS 0208-1990 and 0212-1990) --
20936: "", # -- (x-cp20936) Simplified Chinese (GB2312) --
20949: "", # -- (x-cp20949) Korean Wansung --
21025: "cp1025", # -- IBM EBCDIC Cyrillic Serbian-Bulgarian --
21027: "", # -- (deprecated) --
21866: "koi8-u", # -- Ukrainian (KOI8-U); Cyrillic (KOI8-U) --
28591: "iso-8859-1", # -- ISO 8859-1 Latin 1; Western European (ISO) --
28592: "iso-8859-2", # -- ISO 8859-2 Central European; Central European (ISO) --
28593: "iso-8859-3", # -- ISO 8859-3 Latin 3 --
28594: "iso-8859-4", # -- ISO 8859-4 Baltic --
28595: "iso-8859-5", # -- ISO 8859-5 Cyrillic --
28596: "iso-8859-6", # -- ISO 8859-6 Arabic --
28597: "iso-8859-7", # -- ISO 8859-7 Greek --
28598: "iso-8859-8", # -- ISO 8859-8 Hebrew --
28599: "iso-8859-9", # -- ISO 8859-9 Turkish --
28603: "iso-8859-13", # -- ISO 8859-13 Estonian --
28605: "iso-8859-15", # -- ISO 8859-15 Latin 9 --
29001: "", # -- (x-Europa) Europa 3 --
38598: "", # -- (iso-8859-8-i) ISO 8859-8 Hebrew --
50220: "iso-2022-jp", # -- ISO 2022 Japanese with no halfwidth Katakana --
50221: "csISO2022JP", # -- ISO 2022 Japanese with halfwidth Katakana --
50222: "iso-2022-jp", # -- ISO 2022 Japanese JIS X 0201-1989 --
50225: "iso-2022-kr", # -- ISO 2022 Korean --
50227: "", # -- (x-cp50227) ISO 2022 Simplified Chinese --
50229: "", # -- ISO 2022 Traditional Chinese --
50930: "", # -- EBCDIC Japanese (Katakana) Extended --
50931: "", # -- EBCDIC US-Canada and Japanese --
50933: "", # -- EBCDIC Korean Extended and Korean --
50935: "", # -- EBCDIC Simplified Chinese Extended and Simplified Chinese --
50936: "", # -- EBCDIC Simplified Chinese --
50937: "", # -- EBCDIC US-Canada and Traditional Chinese --
50939: "", # -- EBCDIC Japanese (Latin) Extended and Japanese --
51932: "euc-jp", # -- EUC Japanese --
51936: "EUC-CN", # -- EUC Simplified Chinese --
51949: "euc-kr", # -- EUC Korean --
51950: "", # -- EUC Traditional Chinese --
52936: "hz-gb-2312", # -- HZ-GB2312 Simplified Chinese --
54936: "GB18030", # -- Windows XP and later: GB18030 Simplified Chinese (4 byte) --
57002: "", # -- (x-iscii-de) ISCII Devanagari --
57003: "", # -- (x-iscii-be) ISCII Bangla --
57004: "", # -- (x-iscii-ta) ISCII Tamil --
57005: "", # -- (x-iscii-te) ISCII Telugu --
57006: "", # -- (x-iscii-as) ISCII Assamese --
57007: "", # -- (x-iscii-or) ISCII Odia --
57008: "", # -- (x-iscii-ka) ISCII Kannada --
57009: "", # -- (x-iscii-ma) ISCII Malayalam --
57010: "", # -- (x-iscii-gu) ISCII Gujarati --
57011: "", # -- (x-iscii-pa) ISCII Punjabi --
65000: "utf-7", # -- Unicode (UTF-7) --
65001: "utf-8", # -- Unicode (UTF-8) --
}

View File

@@ -0,0 +1,167 @@
"""Domain-model objects.
This module should have no dependencies outside the domain model. In particular, any domain model
object should be importable anywhere in the package without risk of producing an import cycle.
"""
from __future__ import annotations
import datetime as dt
import uuid
from typing import Iterator, Protocol
from oxmsg.util import lazyproperty
# ================================================================================================
# EXCEPTIONS
# ================================================================================================
class UnrecognizedCodePageError(Exception):
"""The specified code-page is not a known Microsoft encoding."""
class UnsupportedEncodingError(Exception):
"""The encoding used for this MSG object has no built-in Python codec."""
# ================================================================================================
# INTERFACES
# ================================================================================================
class PropStorageT(Protocol):
"""The interface required of a storage object to extract the properties of that storage."""
@lazyproperty
def properties_stream_bytes(self) -> bytes:
"""Bytes of stream containing properties for the top-level object this storage represents.
Every storage must have exactly one such stream.
"""
...
def property_stream_bytes(self, pid: int, ptyp: int) -> bytes:
"""The bytes of the stream for variable-length property identified by `pid`."""
...
class PropertyT(Protocol):
"""The interface required of a property object, regardless of its type."""
@property
def name(self) -> str:
"""The Microsft name for this property, like "PidTagMessageClass"."""
...
@property
def pid(self) -> int:
"""The property-id (PID) for this property, like 0x3701 for attachment bytes."""
...
@property
def ptyp(self) -> int:
"""The property-type (PTYP) for this property, like 0x0102 for PtypBinary."""
...
@property
def ptyp_name(self) -> str:
"""The Microsft name for the type of this property, like "PtypString"."""
...
@lazyproperty
def value(self) -> bool | bytes | dt.datetime | float | int | str | uuid.UUID:
"""The value of this property, its type depending on the property."""
...
class StorageT(Protocol):
"""Interface for a storage object."""
def iter_attachment_storages(self) -> Iterator[StorageT]:
"""Generate each storage object specific to an attachment to this message."""
...
def iter_recipient_storages(self) -> Iterator[StorageT]:
"""Generate each storage object specific to a recipient of this message."""
...
@lazyproperty
def name(self) -> str:
"""The last segment of the storage path.
This is the empty string for the root storage. Other storages are named is clearly specified
ways depending on the type of top-level object they contain, e.g. attachment, recipient,
etc.
"""
...
@property
def path(self) -> str:
"""String identifier for this storage; its location within the OXMSG CFB.
- Suitable as a unique storage identifier within the MSG file.
- The path of the root storage is the empty string ("").
"""
...
@lazyproperty
def properties_stream_bytes(self) -> bytes:
"""Bytes of stream containing properties for the top-level object this storage represents.
Every storage must have exactly one such stream.
"""
...
def property_stream_bytes(self, pid: int, ptyp: int) -> bytes:
"""The bytes of the stream for variable-length property identified by `pid`."""
...
class StreamT(Protocol):
"""Interface for a stream object."""
@lazyproperty
def name(self) -> str:
"""The last segment of the stream path.
Each stream contains the bytes for a property. The form of a stream name is clearly
specified in the OXMSG standard and includes both the property-id (PID) and property
data-type (PTYP) for the property data it contains.
"""
...
@property
def path(self) -> str:
"""String identifier for this storage; its location within the OXMSG CFB.
Suitable as a unique storage identifier within the MSG file.
"""
...
@property
def bytes_(self) -> bytes:
"""The bytes contained in this stream."""
...
# ================================================================================================
# MASKS
# ================================================================================================
# -- AF = attachment flag maybe? Means attachment is embedding, i.e. referenced "by value" --
AF_BY_VALUE = 0x00000001
STORE_UNICODE_OK = 0x00040000
# ================================================================================================
# PROPERTY STREAM HEADER OFFSETS
# ================================================================================================
# -- The starting location for the 16-byte property segments within the property stream varies
# -- depending on the storage type.
ATTACH_HDR_OFFSET = 8
MSG_HDR_OFFSET = 32
RECIP_HDR_OFFSET = 8

View File

@@ -0,0 +1,612 @@
"""Provides a catalog of OXMSG properties and property types.
This module provides mappings from integer PID and PTYP keys to meaningful names that can also be
used to find more detailed information on web-search.
In addition it is a source for property names the user can select from to reference the message
attibutes they are interested in.
Also used for discovery utilities to characterize a MSG file and its properties.
"""
from __future__ import annotations
import dataclasses as dc
import datetime as dt
from oxmsg.domain import constants as c
@dc.dataclass(frozen=True)
class PropertyDescriptor:
"""Describes an OXMSG property.
All attributes of an OXMSG object are properties, even though the body of variable-length
properties like PID_ATTACH_FILENAME are stored in a stream.
"""
pid: int
"""The property-id. This is a 16-bit integer value specified by the MS-OXMSG standard."""
ms_name: str
"""The name like "PidTagLastModificationTime" used by Microsoft for this property.
This is the value to search on for the specification of the property.
"""
ptyp: int
"""The property type, one of the OXMSG property types."""
@dc.dataclass(frozen=True)
class PropertyTypeDescriptor:
"""Describes an OXMSG property data type."""
ptyp: int
"""The property-type id, a 16-bit integer value specified by the MS-OXMSG standard."""
ms_name: str
"""The name like "PtypInteger32" used by Microsoft for this type."""
python_type: type
"""The Python type a property of this OXMSG type is converted to."""
"""Mapping of property-id codes to property descriptor objects."""
property_descriptors: dict[int, PropertyDescriptor] = {
c.PID_ACCESS: PropertyDescriptor(c.PID_ACCESS, "PidTagAccess", c.PTYP_INTEGER_32),
c.PID_ACCESS_LEVEL: PropertyDescriptor(
c.PID_ACCESS_LEVEL, "PidTagAccessLevel", c.PTYP_INTEGER_32
),
c.PID_ACKNOWLEDGEMENT_MODE: PropertyDescriptor(
c.PID_ACKNOWLEDGEMENT_MODE, "PidTagAcknowledgementMode", c.PTYP_INTEGER_32
),
c.PID_ADDRESS_BOOK_FOLDER_PATHNAME: PropertyDescriptor(
c.PID_ADDRESS_BOOK_FOLDER_PATHNAME, "PidTagAddressBookFolderPathname", c.PTYP_STRING
),
c.PID_ADDRESS_BOOK_HOME_MESSAGE_DATABASE: PropertyDescriptor(
c.PID_ADDRESS_BOOK_HOME_MESSAGE_DATABASE,
"PidTagAddressBookHomeMessageDatabase",
c.PTYP_OBJECT,
),
c.PID_ADDRESS_BOOK_IS_MEMBER_OF_DISTRIBUTION_LIST: PropertyDescriptor(
c.PID_ADDRESS_BOOK_IS_MEMBER_OF_DISTRIBUTION_LIST,
"PidTagAddressBookIsMemberOfDistributionList",
c.PTYP_OBJECT,
),
c.PID_ADDRESS_BOOK_MANAGER_DISTINGUISHED_NAME: PropertyDescriptor(
c.PID_ADDRESS_BOOK_MANAGER_DISTINGUISHED_NAME,
"PidTagAddressBookManagerDistinguishedName",
c.PTYP_OBJECT,
),
c.PID_ADDRESS_BOOK_MEMBER: PropertyDescriptor(
c.PID_ADDRESS_BOOK_MEMBER, "PidTagAddressBookMember", c.PTYP_OBJECT
),
c.PID_ADDRESS_TYPE: PropertyDescriptor(c.PID_ADDRESS_TYPE, "PidTagAddressType", c.PTYP_STRING),
c.PID_ALTERNATE_RECIPIENT_ALLOWED: PropertyDescriptor(
c.PID_ALTERNATE_RECIPIENT_ALLOWED, "PidTagAlternateRecipientAllowed", c.PTYP_BOOLEAN
),
c.PID_ATTACHMENT_FLAGS: PropertyDescriptor(
c.PID_ATTACHMENT_FLAGS, "PidTagAttachmentFlags", c.PTYP_INTEGER_32
),
c.PID_ATTACHMENT_HIDDEN: PropertyDescriptor(
c.PID_ATTACHMENT_HIDDEN, "PidTagAttachmentHidden", c.PTYP_BOOLEAN
),
c.PID_ATTACHMENT_LINK_ID: PropertyDescriptor(
c.PID_ATTACHMENT_LINK_ID, "PidTagAttachmentLinkId", c.PTYP_INTEGER_32
),
c.PID_ATTACH_CONTENT_ID: PropertyDescriptor(
c.PID_ATTACH_CONTENT_ID, "PidTagAttachContentId", c.PTYP_STRING
),
c.PID_ATTACH_DATA_BINARY: PropertyDescriptor(
c.PID_ATTACH_DATA_BINARY, "PidTagAttachDataBinary", c.PTYP_BINARY
),
c.PID_ATTACH_ENCODING: PropertyDescriptor(
c.PID_ATTACH_ENCODING, "PidTagAttachEncoding", c.PTYP_BINARY
),
c.PID_ATTACH_EXTENSION: PropertyDescriptor(
c.PID_ATTACH_EXTENSION, "PidTagAttachExtension", c.PTYP_STRING
),
c.PID_ATTACH_FILENAME: PropertyDescriptor(
c.PID_ATTACH_FILENAME, "PidTagAttachFilename", c.PTYP_STRING
),
c.PID_ATTACH_FLAGS: PropertyDescriptor(
c.PID_ATTACH_FLAGS, "PidTagAttachFlags", c.PTYP_INTEGER_32
),
c.PID_ATTACH_LONG_FILENAME: PropertyDescriptor(
c.PID_ATTACH_LONG_FILENAME, "PidTagAttachLongFilename", c.PTYP_STRING
),
c.PID_ATTACH_METHOD: PropertyDescriptor(
c.PID_ATTACH_METHOD, "PidTagAttachMethod", c.PTYP_INTEGER_32
),
c.PID_ATTACH_MIME_SEQUENCE: PropertyDescriptor(
c.PID_ATTACH_MIME_SEQUENCE, "PidTagAttachMimeSequence", c.PTYP_INTEGER_32
),
c.PID_ATTACH_MIME_TAG: PropertyDescriptor(
c.PID_ATTACH_MIME_TAG, "PidTagAttachMimeTag", c.PTYP_STRING
),
c.PID_ATTACH_NUMBER: PropertyDescriptor(
c.PID_ATTACH_NUMBER, "PidTagAttachNumber", c.PTYP_INTEGER_32
),
c.PID_ATTACH_RENDERING: PropertyDescriptor(
c.PID_ATTACH_RENDERING, "PidTagAttachRendering", c.PTYP_BINARY
),
c.PID_ATTACH_RENDERING_POSITION: PropertyDescriptor(
c.PID_ATTACH_RENDERING_POSITION, "PidTagAttachRenderingPosition", c.PTYP_INTEGER_32
),
c.PID_ATTACH_SIZE: PropertyDescriptor(c.PID_ATTACH_SIZE, "PidTagAttachSize", c.PTYP_INTEGER_32),
c.PID_ATTACH_TAG: PropertyDescriptor(c.PID_ATTACH_TAG, "PidTagAttachTag", c.PTYP_BINARY),
c.PID_AUTHORIZING_USERS: PropertyDescriptor(
c.PID_AUTHORIZING_USERS, "PidTagAuthorizingUsers", c.PTYP_BINARY
),
c.PID_AUTO_FORWARDED: PropertyDescriptor(
c.PID_AUTO_FORWARDED, "PidTagAutoForwarded", c.PTYP_BOOLEAN
),
c.PID_AUTO_FORWARD_COMMENT: PropertyDescriptor(
c.PID_AUTO_FORWARD_COMMENT, "PidTagAutoForwardComment", c.PTYP_STRING
),
c.PID_BODY: PropertyDescriptor(c.PID_BODY, "PidTagBody", c.PTYP_STRING),
c.PID_CHANGE_KEY: PropertyDescriptor(c.PID_CHANGE_KEY, "PidTagChangeKey", c.PTYP_BINARY),
c.PID_CLIENT_SUBMIT_TIME: PropertyDescriptor(
c.PID_CLIENT_SUBMIT_TIME, "PidTagClientSubmitTime", c.PTYP_TIME
),
c.PID_CONTENT_CONFIDENTIALITY_ALGORITHM_ID: PropertyDescriptor(
c.PID_CONTENT_CONFIDENTIALITY_ALGORITHM_ID,
"PidTagContentConfidentialityAlgorithmId",
c.PTYP_BINARY,
),
c.PID_CONTENT_CORRELATOR: PropertyDescriptor(
c.PID_CONTENT_CORRELATOR, "PidTagContentCorrelator", c.PTYP_BINARY
),
c.PID_CONTENT_IDENTIFIER: PropertyDescriptor(
c.PID_CONTENT_IDENTIFIER, "PidTagContentIdentifier", c.PTYP_STRING
),
c.PID_CONTENT_LENGTH: PropertyDescriptor(
c.PID_CONTENT_LENGTH, "PidTagContentLength", c.PTYP_INTEGER_32
),
c.PID_CONTENT_RETURN_REQUESTED: PropertyDescriptor(
c.PID_CONTENT_RETURN_REQUESTED, "PidTagContentReturnRequested", c.PTYP_BOOLEAN
),
c.PID_CONVERSATION_INDEX: PropertyDescriptor(
c.PID_CONVERSATION_INDEX, "PidTagConversationIndex", c.PTYP_BINARY
),
c.PID_CONVERSATION_INDEX_TRACKING: PropertyDescriptor(
c.PID_CONVERSATION_INDEX_TRACKING, "PidTagConversationIndexTracking", c.PTYP_BOOLEAN
),
c.PID_CONVERSATION_KEY: PropertyDescriptor(
c.PID_CONVERSATION_KEY, "PidTagConversationKey", c.PTYP_BINARY
),
c.PID_CONVERSATION_TOPIC: PropertyDescriptor(
c.PID_CONVERSATION_TOPIC, "PidTagConversationTopic", c.PTYP_STRING
),
c.PID_CONVERSION_EITS: PropertyDescriptor(
c.PID_CONVERSION_EITS, "PidTagConversionEits", c.PTYP_BINARY
),
c.PID_CONVERSION_WITH_LOSS_PROHIBITED: PropertyDescriptor(
c.PID_CONVERSION_WITH_LOSS_PROHIBITED, "PidTagConversionWithLossProhibited", c.PTYP_BOOLEAN
),
c.PID_CONVERTED_EITS: PropertyDescriptor(
c.PID_CONVERTED_EITS, "PidTagConvertedEits", c.PTYP_BINARY
),
c.PID_CREATION_TIME: PropertyDescriptor(c.PID_CREATION_TIME, "PidTagCreationTime", c.PTYP_TIME),
c.PID_CREATOR_ADDRESS_TYPE: PropertyDescriptor(
c.PID_CREATOR_ADDRESS_TYPE, "PidTagCreatorAddressType", c.PTYP_STRING
),
c.PID_CREATOR_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_CREATOR_EMAIL_ADDRESS, "PidTagCreatorEmailAddress", c.PTYP_STRING
),
c.PID_CREATOR_SIMPLE_DISPLAY_NAME: PropertyDescriptor(
c.PID_CREATOR_SIMPLE_DISPLAY_NAME, "PidTagCreatorSimpleDisplayName", c.PTYP_STRING
),
c.PID_DEFERRED_DELIVERY_TIME: PropertyDescriptor(
c.PID_DEFERRED_DELIVERY_TIME, "PidTagDeferredDeliveryTime", c.PTYP_TIME
),
c.PID_DELEGATION: PropertyDescriptor(c.PID_DELEGATION, "PidTagDelegation", c.PTYP_BINARY),
c.PID_DELETE_AFTER_SUBMIT: PropertyDescriptor(
c.PID_DELETE_AFTER_SUBMIT, "PidTagDeleteAfterSubmit", c.PTYP_BOOLEAN
),
c.PID_DELIVER_TIME: PropertyDescriptor(c.PID_DELIVER_TIME, "PidTagDeliverTime", c.PTYP_TIME),
c.PID_DISCARD_REASON: PropertyDescriptor(
c.PID_DISCARD_REASON, "PidTagDiscardReason", c.PTYP_INTEGER_32
),
c.PID_DISCLOSURE_OF_RECIPIENTS: PropertyDescriptor(
c.PID_DISCLOSURE_OF_RECIPIENTS, "PidTagDisclosureOfRecipients", c.PTYP_BOOLEAN
),
c.PID_DISPLAY_BCC: PropertyDescriptor(c.PID_DISPLAY_BCC, "PidTagDisplayBcc", c.PTYP_STRING),
c.PID_DISPLAY_CC: PropertyDescriptor(c.PID_DISPLAY_CC, "PidTagDisplayCc", c.PTYP_STRING),
c.PID_DISPLAY_NAME: PropertyDescriptor(c.PID_DISPLAY_NAME, "PidTagDisplayName", c.PTYP_STRING),
c.PID_DISPLAY_TO: PropertyDescriptor(c.PID_DISPLAY_TO, "PidTagDisplayTo", c.PTYP_STRING),
c.PID_DISTRIBUTION_LIST_EXPANSION_HISTORY: PropertyDescriptor(
c.PID_DISTRIBUTION_LIST_EXPANSION_HISTORY,
"PidTagDistributionListExpansionHistory",
c.PTYP_BINARY,
),
c.PID_DISTRIBUTION_LIST_EXPANSION_PROHIBITED: PropertyDescriptor(
c.PID_DISTRIBUTION_LIST_EXPANSION_PROHIBITED,
"PidTagDistributionListExpansionProhibited",
c.PTYP_BOOLEAN,
),
c.PID_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_EMAIL_ADDRESS, "PidTagEmailAddress", c.PTYP_STRING
),
c.PID_END_DATE: PropertyDescriptor(c.PID_END_DATE, "PidTagEndDate", c.PTYP_TIME),
c.PID_ENTRY_ID: PropertyDescriptor(c.PID_ENTRY_ID, "PidTagEntryId", c.PTYP_BINARY),
c.PID_EXCEPTION_END_TIME: PropertyDescriptor(
c.PID_EXCEPTION_END_TIME, "PidTagExceptionEndTime", c.PTYP_TIME
),
c.PID_EXCEPTION_START_TIME: PropertyDescriptor(
c.PID_EXCEPTION_START_TIME, "PidTagExceptionStartTime", c.PTYP_TIME
),
c.PID_EXPIRY_TIME: PropertyDescriptor(c.PID_EXPIRY_TIME, "PidTagExpiryTime", c.PTYP_TIME),
c.PID_FLAG_STATUS: PropertyDescriptor(c.PID_FLAG_STATUS, "PidTagFlagStatus", c.PTYP_INTEGER_32),
c.PID_HAS_ATTACHMENTS: PropertyDescriptor(
c.PID_HAS_ATTACHMENTS, "PidTagHasAttachments", c.PTYP_BOOLEAN
),
c.PID_HTML: PropertyDescriptor(c.PID_HTML, "PidTagHtml", c.PTYP_BINARY),
c.PID_ICON_INDEX: PropertyDescriptor(c.PID_ICON_INDEX, "PidTagIconIndex", c.PTYP_INTEGER_32),
c.PID_IMPLICIT_CONVERSION_PROHIBITED: PropertyDescriptor(
c.PID_IMPLICIT_CONVERSION_PROHIBITED, "PidTagImplicitConversionProhibited", c.PTYP_BOOLEAN
),
c.PID_IMPORTANCE: PropertyDescriptor(c.PID_IMPORTANCE, "PidTagImportance", c.PTYP_INTEGER_32),
c.PID_INITIAL_DETAILS_PANE: PropertyDescriptor(
c.PID_INITIAL_DETAILS_PANE, "PidTagInitialDetailsPane", c.PTYP_INTEGER_32
),
c.PID_INSTANCE_KEY: PropertyDescriptor(c.PID_INSTANCE_KEY, "PidTagInstanceKey", c.PTYP_BINARY),
c.PID_INTERNET_CODEPAGE: PropertyDescriptor(
c.PID_INTERNET_CODEPAGE, "PidTagInternetCodepage", c.PTYP_INTEGER_32
),
c.PID_INTERNET_MESSAGE_ID: PropertyDescriptor(
c.PID_INTERNET_MESSAGE_ID, "PidTagInternetMessageId", c.PTYP_STRING
),
c.PID_INTERNET_REFERENCES: PropertyDescriptor(
c.PID_INTERNET_REFERENCES, "PidTagInternetReferences", c.PTYP_STRING
),
c.PID_IN_REPLY_TO_ID: PropertyDescriptor(
c.PID_IN_REPLY_TO_ID, "PidTagInReplyToId", c.PTYP_STRING
),
c.PID_LAST_MODIFICATION_TIME: PropertyDescriptor(
c.PID_LAST_MODIFICATION_TIME, "PidTagLastModificationTime", c.PTYP_TIME
),
c.PID_LAST_MODIFIER_NAME: PropertyDescriptor(
c.PID_LAST_MODIFIER_NAME, "PidTagLastModifierName", c.PTYP_STRING
),
c.PID_LATEST_DELIVERY_TIME: PropertyDescriptor(
c.PID_LATEST_DELIVERY_TIME, "PidTagLatestDeliveryTime", c.PTYP_TIME
),
c.PID_LID_CONTACT_ITEM_DATA: PropertyDescriptor(
c.PID_LID_CONTACT_ITEM_DATA, "PidLidContactItemData", c.PTYP_STRING
),
c.PID_MESSAGE_CC_ME: PropertyDescriptor(
c.PID_MESSAGE_CC_ME, "PidTagMessageCcMe", c.PTYP_BOOLEAN
),
c.PID_MESSAGE_CLASS: PropertyDescriptor(
c.PID_MESSAGE_CLASS, "PidTagMessageClass", c.PTYP_STRING
),
c.PID_MESSAGE_DELIVERY_ID: PropertyDescriptor(
c.PID_MESSAGE_DELIVERY_ID, "PidTagMessageDeliveryId", c.PTYP_BINARY
),
c.PID_MESSAGE_DELIVERY_TIME: PropertyDescriptor(
c.PID_MESSAGE_DELIVERY_TIME, "PidTagMessageDeliveryTime", c.PTYP_TIME
),
c.PID_MESSAGE_FLAGS: PropertyDescriptor(
c.PID_MESSAGE_FLAGS, "PidTagMessageFlags", c.PTYP_INTEGER_32
),
c.PID_MESSAGE_LOCALE_ID: PropertyDescriptor(
c.PID_MESSAGE_LOCALE_ID, "PidTagMessageLocaleId", c.PTYP_INTEGER_32
),
c.PID_MESSAGE_RECIPIENT_ME: PropertyDescriptor(
c.PID_MESSAGE_RECIPIENT_ME, "PidTagMessageRecipientMe", c.PTYP_STRING
),
c.PID_MESSAGE_SECURITY_LABEL: PropertyDescriptor(
c.PID_MESSAGE_SECURITY_LABEL, "PidTagMessageSecurityLabel", c.PTYP_BINARY
),
c.PID_MESSAGE_SIZE_EXTENDED: PropertyDescriptor(
c.PID_MESSAGE_SIZE_EXTENDED, "PidTagMessageSizeExtended", c.PTYP_INTEGER_32
),
c.PID_MESSAGE_SUBMISSION_ID: PropertyDescriptor(
c.PID_MESSAGE_SUBMISSION_ID, "PidTagMessageSubmissionId", c.PTYP_BINARY
),
c.PID_MESSAGE_TO_ME: PropertyDescriptor(
c.PID_MESSAGE_TO_ME, "PidTagMessageToMe", c.PTYP_BOOLEAN
),
c.PID_NATIVE_BODY: PropertyDescriptor(c.PID_NATIVE_BODY, "PidTagNativeBody", c.PTYP_INTEGER_32),
c.PID_NORMALIZED_SUBJECT: PropertyDescriptor(
c.PID_NORMALIZED_SUBJECT, "PidTagNormalizedSubject", c.PTYP_STRING
),
c.PID_NON_RECEIPT_NOTIFICATION_REQUESTED: PropertyDescriptor(
c.PID_NON_RECEIPT_NOTIFICATION_REQUESTED,
"PidTagNonReceiptNotificationRequested",
c.PTYP_BOOLEAN,
),
c.PID_OBJECT_TYPE: PropertyDescriptor(c.PID_OBJECT_TYPE, "PidTagObjectType", c.PTYP_INTEGER_32),
c.PID_OBSOLETED_MESSAGE_IDS: PropertyDescriptor(
c.PID_OBSOLETED_MESSAGE_IDS, "PidTagObsoletedMessageIds", c.PTYP_BINARY
),
c.PID_ORIGINALLY_INTENDED_RECIPIENT_NAME: PropertyDescriptor(
c.PID_ORIGINALLY_INTENDED_RECIPIENT_NAME,
"PidTagOriginallyIntendedRecipientName",
c.PTYP_BINARY,
),
c.PID_ORIGINALLY_INTENDED_RECIP_ADDRTYPE: PropertyDescriptor(
c.PID_ORIGINALLY_INTENDED_RECIP_ADDRTYPE,
"PidTagOriginallyIntendedRecipAddrtype",
c.PTYP_STRING,
),
c.PID_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS,
"PidTagOriginallyIntendedRecipEmailAddress",
c.PTYP_STRING,
),
c.PID_ORIGINAL_AUTHOR_ADDRESS_TYPE: PropertyDescriptor(
c.PID_ORIGINAL_AUTHOR_ADDRESS_TYPE, "PidTagOriginalAuthorAddressType", c.PTYP_STRING
),
c.PID_ORIGINAL_AUTHOR_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_ORIGINAL_AUTHOR_EMAIL_ADDRESS, "PidTagOriginalAuthorEmailAddress", c.PTYP_STRING
),
c.PID_ORIGINAL_AUTHOR_ENTRY_ID: PropertyDescriptor(
c.PID_ORIGINAL_AUTHOR_ENTRY_ID, "PidTagOriginalAuthorEntryId", c.PTYP_BINARY
),
c.PID_ORIGINAL_AUTHOR_NAME: PropertyDescriptor(
c.PID_ORIGINAL_AUTHOR_NAME, "PidTagOriginalAuthorName", c.PTYP_STRING
),
c.PID_ORIGINAL_DELIVERY_TIME: PropertyDescriptor(
c.PID_ORIGINAL_DELIVERY_TIME, "PidTagOriginalDeliveryTime", c.PTYP_TIME
),
c.PID_ORIGINAL_DISPLAY_BCC: PropertyDescriptor(
c.PID_ORIGINAL_DISPLAY_BCC, "PidTagOriginalDisplayBcc", c.PTYP_STRING
),
c.PID_ORIGINAL_DISPLAY_CC: PropertyDescriptor(
c.PID_ORIGINAL_DISPLAY_CC, "PidTagOriginalDisplayCc", c.PTYP_STRING
),
c.PID_ORIGINAL_DISPLAY_TO: PropertyDescriptor(
c.PID_ORIGINAL_DISPLAY_TO, "PidTagOriginalDisplayTo", c.PTYP_STRING
),
c.PID_ORIGINAL_EITS: PropertyDescriptor(
c.PID_ORIGINAL_EITS, "PidTagOriginalEits", c.PTYP_BINARY
),
c.PID_ORIGINAL_MESSAGE_CLASS: PropertyDescriptor(
c.PID_ORIGINAL_MESSAGE_CLASS, "PidTagOriginalMessageClass", c.PTYP_STRING
),
c.PID_ORIGINAL_MESSAGE_ID: PropertyDescriptor(
c.PID_ORIGINAL_MESSAGE_ID, "PidTagOriginalMessageId", c.PTYP_STRING
),
c.PID_ORIGINAL_SENDER_ADDRESS_TYPE: PropertyDescriptor(
c.PID_ORIGINAL_SENDER_ADDRESS_TYPE, "PidTagOriginalSenderAddressType", c.PTYP_STRING
),
c.PID_ORIGINAL_SENDER_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_ORIGINAL_SENDER_EMAIL_ADDRESS, "PidTagOriginalSenderEmailAddress", c.PTYP_STRING
),
c.PID_ORIGINAL_SENDER_ENTRY_ID: PropertyDescriptor(
c.PID_ORIGINAL_SENDER_ENTRY_ID, "PidTagOriginalSenderEntryId", c.PTYP_BINARY
),
c.PID_ORIGINAL_SENDER_NAME: PropertyDescriptor(
c.PID_ORIGINAL_SENDER_NAME, "PidTagOriginalSenderName", c.PTYP_STRING
),
c.PID_ORIGINAL_SENDER_SEARCH_KEY: PropertyDescriptor(
c.PID_ORIGINAL_SENDER_SEARCH_KEY, "PidTagOriginalSenderSearchKey", c.PTYP_BINARY
),
c.PID_ORIGINAL_SENSITIVITY: PropertyDescriptor(
c.PID_ORIGINAL_SENSITIVITY, "PidTagOriginalSensitivity", c.PTYP_INTEGER_32
),
c.PID_ORIGINAL_SENT_REPRESENTING_ADDRESS_TYPE: PropertyDescriptor(
c.PID_ORIGINAL_SENT_REPRESENTING_ADDRESS_TYPE,
"PidTagOriginalSentRepresentingAddressType",
c.PTYP_STRING,
),
c.PID_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS,
"PidTagOriginalSentRepresentingEmailAddress",
c.PTYP_STRING,
),
c.PID_ORIGINAL_SENT_REPRESENTING_ENTRY_ID: PropertyDescriptor(
c.PID_ORIGINAL_SENT_REPRESENTING_ENTRY_ID,
"PidTagOriginalSentRepresentingEntryId",
c.PTYP_BINARY,
),
c.PID_ORIGINAL_SENT_REPRESENTING_NAME: PropertyDescriptor(
c.PID_ORIGINAL_SENT_REPRESENTING_NAME, "PidTagOriginalSentRepresentingName", c.PTYP_STRING
),
c.PID_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY: PropertyDescriptor(
c.PID_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY,
"PidTagOriginalSentRepresentingSearchKey",
c.PTYP_BINARY,
),
c.PID_ORIGINAL_SUBJECT: PropertyDescriptor(
c.PID_ORIGINAL_SUBJECT, "PidTagOriginalSubject", c.PTYP_STRING
),
c.PID_ORIGINAL_SUBMIT_TIME: PropertyDescriptor(
c.PID_ORIGINAL_SUBMIT_TIME, "PidTagOriginalSubmitTime", c.PTYP_TIME
),
c.PID_ORIGINATOR_CERTIFICATE: PropertyDescriptor(
c.PID_ORIGINATOR_CERTIFICATE, "PidTagOriginatorCertificate", c.PTYP_BINARY
),
c.PID_ORIGINATOR_DELIVERY_REPORT_REQUESTED: PropertyDescriptor(
c.PID_ORIGINATOR_DELIVERY_REPORT_REQUESTED,
"PidTagOriginatorDeliveryReportRequested",
c.PTYP_BOOLEAN,
),
c.PID_ORIGINATOR_RETURN_ADDRESS: PropertyDescriptor(
c.PID_ORIGINATOR_RETURN_ADDRESS, "PidTagOriginatorReturnAddress", c.PTYP_BINARY
),
c.PID_ORIGIN_CHECK: PropertyDescriptor(c.PID_ORIGIN_CHECK, "PidTagOriginCheck", c.PTYP_BINARY),
c.PID_OWNER_APPOINTMENT_ID: PropertyDescriptor(
c.PID_OWNER_APPOINTMENT_ID, "PidTagOwnerAppointmentId", c.PTYP_INTEGER_32
),
c.PID_PARENT_DISPLAY: PropertyDescriptor(
c.PID_PARENT_DISPLAY, "PidTagParentDisplay", c.PTYP_STRING
),
c.PID_PARENT_KEY: PropertyDescriptor(c.PID_PARENT_KEY, "PidTagParentKey", c.PTYP_BINARY),
c.PID_PREDECESSOR_CHANGE_LIST: PropertyDescriptor(
c.PID_PREDECESSOR_CHANGE_LIST, "PidTagPredecessorChangeList", c.PTYP_BINARY
),
c.PID_PRIORITY: PropertyDescriptor(c.PID_PRIORITY, "PidTagPriority", c.PTYP_INTEGER_32),
c.PID_PROOF_OF_SUBMISSION_REQUESTED: PropertyDescriptor(
c.PID_PROOF_OF_SUBMISSION_REQUESTED, "PidTagProofOfSubmissionRequested", c.PTYP_BOOLEAN
),
c.PID_READ_RECEIPT_ENTRY_ID: PropertyDescriptor(
c.PID_READ_RECEIPT_ENTRY_ID, "PidTagReadReceiptEntryId", c.PTYP_BINARY
),
c.PID_READ_RECEIPT_REQUESTED: PropertyDescriptor(
c.PID_READ_RECEIPT_REQUESTED, "PidTagReadReceiptRequested", c.PTYP_BOOLEAN
),
c.PID_READ_RECEIPT_SEARCH_KEY: PropertyDescriptor(
c.PID_READ_RECEIPT_SEARCH_KEY, "PidTagReadReceiptSearchKey", c.PTYP_BINARY
),
c.PID_RECEIPT_TIME: PropertyDescriptor(c.PID_RECEIPT_TIME, "PidTagReceiptTime", c.PTYP_TIME),
c.PID_RECEIVED_BY_ADDRESS_TYPE: PropertyDescriptor(
c.PID_RECEIVED_BY_ADDRESS_TYPE, "PidTagReceivedByAddressType", c.PTYP_STRING
),
c.PID_RECEIVED_BY_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_RECEIVED_BY_EMAIL_ADDRESS, "PidTagReceivedByEmailAddress", c.PTYP_STRING
),
c.PID_RECEIVED_BY_ENTRY_ID: PropertyDescriptor(
c.PID_RECEIVED_BY_ENTRY_ID, "PidTagReceivedByEntryId", c.PTYP_BINARY
),
c.PID_RECEIVED_BY_NAME: PropertyDescriptor(
c.PID_RECEIVED_BY_NAME, "PidTagReceivedByName", c.PTYP_STRING
),
c.PID_RECEIVED_BY_SEARCH_KEY: PropertyDescriptor(
c.PID_RECEIVED_BY_SEARCH_KEY, "PidTagReceivedBySearchKey", c.PTYP_BINARY
),
c.PID_RECEIVED_REPRESENTING_ADDRESS_TYPE: PropertyDescriptor(
c.PID_RECEIVED_REPRESENTING_ADDRESS_TYPE,
"PidTagReceivedRepresentingAddressType",
c.PTYP_STRING,
),
c.PID_RECEIVED_REPRESENTING_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_RECEIVED_REPRESENTING_EMAIL_ADDRESS,
"PidTagReceivedRepresentingEmailAddress",
c.PTYP_STRING,
),
c.PID_RECEIVED_REPRESENTING_ENTRY_ID: PropertyDescriptor(
c.PID_RECEIVED_REPRESENTING_ENTRY_ID, "PidTagReceivedRepresentingEntryId", c.PTYP_BINARY
),
c.PID_RECEIVED_REPRESENTING_NAME: PropertyDescriptor(
c.PID_RECEIVED_REPRESENTING_NAME, "PidTagReceivedRepresentingName", c.PTYP_STRING
),
c.PID_RECEIVED_REPRESENTING_SEARCH_KEY: PropertyDescriptor(
c.PID_RECEIVED_REPRESENTING_SEARCH_KEY, "PidTagReceivedRepresentingSearchKey", c.PTYP_BINARY
),
c.PID_RECIPIENT_REASSIGNMENT_PROHIBITED: PropertyDescriptor(
c.PID_RECIPIENT_REASSIGNMENT_PROHIBITED,
"PidTagRecipientReassignmentProhibited",
c.PTYP_BOOLEAN,
),
c.PID_RECIPIENT_TYPE: PropertyDescriptor(
c.PID_RECIPIENT_TYPE,
"PidTagRecipientType",
c.PTYP_INTEGER_32,
),
c.PID_RECORD_KEY: PropertyDescriptor(c.PID_RECORD_KEY, "PidTagRecordKey", c.PTYP_BINARY),
c.PID_REDIRECTION_HISTORY: PropertyDescriptor(
c.PID_REDIRECTION_HISTORY, "PidTagRedirectionHistory", c.PTYP_BINARY
),
c.PID_REPLY_RECIPIENT_ENTRIES: PropertyDescriptor(
c.PID_REPLY_RECIPIENT_ENTRIES, "PidTagReplyRecipientEntries", c.PTYP_BINARY
),
c.PID_REPLY_RECIPIENT_NAMES: PropertyDescriptor(
c.PID_REPLY_RECIPIENT_NAMES, "PidTagReplyRecipientNames", c.PTYP_STRING
),
c.PID_REPLY_TIME: PropertyDescriptor(c.PID_REPLY_TIME, "PidTagReplyTime", c.PTYP_TIME),
c.PID_REPORT: PropertyDescriptor(c.PID_REPORT, "PidTagReportTag", c.PTYP_BINARY),
c.PID_REPORT_DISPOSITION: PropertyDescriptor(
c.PID_REPORT_DISPOSITION, "PidTagReportDisposition", c.PTYP_STRING
),
c.PID_REPORT_DISPOSITION_MODE: PropertyDescriptor(
c.PID_REPORT_DISPOSITION_MODE, "PidTagReportDispositionMode", c.PTYP_STRING
),
c.PID_REPORT_ENTRY_ID: PropertyDescriptor(
c.PID_REPORT_ENTRY_ID, "PidTagReportEntryId", c.PTYP_BINARY
),
c.PID_REPORT_NAME: PropertyDescriptor(c.PID_REPORT_NAME, "PidTagReportName", c.PTYP_STRING),
c.PID_REPORT_SEARCH_KEY: PropertyDescriptor(
c.PID_REPORT_SEARCH_KEY, "PidTagReportSearchKey", c.PTYP_BINARY
),
c.PID_REPORT_TIME: PropertyDescriptor(c.PID_REPORT_TIME, "PidTagReportTime", c.PTYP_TIME),
c.PID_RESPONSE_REQUESTED: PropertyDescriptor(
c.PID_RESPONSE_REQUESTED, "PidTagResponseRequested", c.PTYP_BOOLEAN
),
c.PID_ROW_ID: PropertyDescriptor(c.PID_ROW_ID, "PidTagRowId", c.PTYP_INTEGER_32),
c.PID_RTF_COMPRESSED: PropertyDescriptor(
c.PID_RTF_COMPRESSED, "PidTagRtfCompressed", c.PTYP_BINARY
),
c.PID_RTF_IN_SYNC: PropertyDescriptor(c.PID_RTF_IN_SYNC, "PidTagRtfInSync", c.PTYP_BOOLEAN),
c.PID_SEARCH_KEY: PropertyDescriptor(c.PID_SEARCH_KEY, "PidTagSearchKey", c.PTYP_BINARY),
c.PID_SECURITY: PropertyDescriptor(c.PID_SECURITY, "PidTagSecurity", c.PTYP_INTEGER_32),
c.PID_SENDER_ADDRESS_TYPE: PropertyDescriptor(
c.PID_SENDER_ADDRESS_TYPE, "PidTagSenderAddressType", c.PTYP_STRING
),
c.PID_SENDER_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_SENDER_EMAIL_ADDRESS, "PidTagSenderEmailAddress", c.PTYP_STRING
),
c.PID_SENDER_ENTRY_ID: PropertyDescriptor(
c.PID_SENDER_ENTRY_ID, "PidTagSenderEntryId", c.PTYP_BINARY
),
c.PID_SENDER_NAME: PropertyDescriptor(c.PID_SENDER_NAME, "PidTagSenderName", c.PTYP_STRING),
c.PID_SENDER_SEARCH_KEY: PropertyDescriptor(
c.PID_SENDER_SEARCH_KEY, "PidTagSenderSearchKey", c.PTYP_BINARY
),
c.PID_SENDER_SMTP_ADDRESS: PropertyDescriptor(
c.PID_SENDER_SMTP_ADDRESS, "PidTagSenderSmtpAddress", c.PTYP_STRING
),
c.PID_SENSITIVITY: PropertyDescriptor(
c.PID_SENSITIVITY, "PidTagSensitivity", c.PTYP_INTEGER_32
),
c.PID_SENT_REPRESENTING_ADDRESS_TYPE: PropertyDescriptor(
c.PID_SENT_REPRESENTING_ADDRESS_TYPE, "PidTagSentRepresentingAddressType", c.PTYP_STRING
),
c.PID_SENT_REPRESENTING_EMAIL_ADDRESS: PropertyDescriptor(
c.PID_SENT_REPRESENTING_EMAIL_ADDRESS, "PidTagSentRepresentingEmailAddress", c.PTYP_STRING
),
c.PID_SENT_REPRESENTING_ENTRY_ID: PropertyDescriptor(
c.PID_SENT_REPRESENTING_ENTRY_ID, "PidTagSentRepresentingEntryId", c.PTYP_BINARY
),
c.PID_SENT_REPRESENTING_NAME: PropertyDescriptor(
c.PID_SENT_REPRESENTING_NAME, "PidTagSentRepresentingName", c.PTYP_STRING
),
c.PID_SENT_REPRESENTING_SEARCH_KEY: PropertyDescriptor(
c.PID_SENT_REPRESENTING_SEARCH_KEY, "PidTagSentRepresentingSearchKey", c.PTYP_BINARY
),
c.PID_SMTP_ADDRESS: PropertyDescriptor(c.PID_SMTP_ADDRESS, "PidTagSmtpAddress", c.PTYP_STRING),
c.PID_START_DATE: PropertyDescriptor(c.PID_START_DATE, "PidTagStartDate", c.PTYP_TIME),
c.PID_STORE_SUPPORT_MASK: PropertyDescriptor(
c.PID_STORE_SUPPORT_MASK, "PidTagStoreSupportMask", c.PTYP_INTEGER_32
),
c.PID_STORE_UNICODE_MASK: PropertyDescriptor(
c.PID_STORE_UNICODE_MASK, "PidTagStoreUnicodeMask", c.PTYP_INTEGER_32
),
c.PID_SUBJECT: PropertyDescriptor(c.PID_SUBJECT, "PidTagSubject", c.PTYP_STRING),
c.PID_SUBJECT_MESSAGE_ID: PropertyDescriptor(
c.PID_SUBJECT_MESSAGE_ID, "PidTagSubjectMessageId", c.PTYP_BINARY
),
c.PID_SUBJECT_PREFIX: PropertyDescriptor(
c.PID_SUBJECT_PREFIX, "PidTagSubjectPrefix", c.PTYP_STRING
),
c.PID_TNEF_CORRELATION_KEY: PropertyDescriptor(
c.PID_TNEF_CORRELATION_KEY, "PidTagTnefCorrelationKey", c.PTYP_BINARY
),
c.PID_TRANSPORT_MESSAGE_HEADERS: PropertyDescriptor(
c.PID_TRANSPORT_MESSAGE_HEADERS, "PidTagTransportMessageHeaders", c.PTYP_STRING
),
}
"""Mapping of property-type codes to descriptor objects."""
property_type_descriptors: dict[int, PropertyTypeDescriptor] = {
c.PTYP_BINARY: PropertyTypeDescriptor(c.PTYP_BINARY, "PtypBinary", bytes),
c.PTYP_BOOLEAN: PropertyTypeDescriptor(c.PTYP_BOOLEAN, "PtypBoolean", bool),
c.PTYP_FLOATING_64: PropertyTypeDescriptor(c.PTYP_FLOATING_64, "PtypFloating64", float),
c.PTYP_GUID: PropertyTypeDescriptor(c.PTYP_GUID, "PtypGuid", bytes),
c.PTYP_INTEGER_16: PropertyTypeDescriptor(c.PTYP_INTEGER_16, "PtypInteger16", int),
c.PTYP_INTEGER_32: PropertyTypeDescriptor(c.PTYP_INTEGER_32, "PtypInteger32", int),
c.PTYP_MULTIPLE_INTEGER_32: PropertyTypeDescriptor(
c.PTYP_MULTIPLE_INTEGER_32, "PtypMultipleInteger32", list[int]
),
c.PTYP_MULTIPLE_STRING: PropertyTypeDescriptor(
c.PTYP_MULTIPLE_STRING, "PtypMultipleString", list[str]
),
c.PTYP_OBJECT: PropertyTypeDescriptor(c.PTYP_OBJECT, "PtypObject", bytes),
c.PTYP_STRING: PropertyTypeDescriptor(c.PTYP_STRING, "PtypString", str),
c.PTYP_STRING8: PropertyTypeDescriptor(c.PTYP_STRING8, "PtypString8", str),
c.PTYP_TIME: PropertyTypeDescriptor(c.PTYP_TIME, "PtypTime", dt.datetime),
}