getResponseLevels() {
- return this.responseLevels;
- }
-
- @Override
- public String toString() {
- return this.guid + "@" + this.deliveryTime + " " + this.responseLevels.size() + " ResponseLevels";
- }
-
- public class ResponseLevel {
- short deltaCode;
- long timeDelta;
- short random;
-
- public ResponseLevel(final short deltaCode, final long timeDelta, final short random) {
- this.deltaCode = deltaCode;
- this.timeDelta = timeDelta;
- this.random = random;
- }
-
- public short getDeltaCode() {
- return this.deltaCode;
- }
-
- public long getTimeDelta() {
- return this.timeDelta;
- }
-
- public short getRandom() {
- return this.random;
- }
-
- public Date withOffset(final Date anchorDate) {
- return new Date(anchorDate.getTime() + this.timeDelta);
- }
- }
-
- protected PSTConversationIndex(final byte[] rawConversationIndex) {
- if (rawConversationIndex != null && rawConversationIndex.length >= MINIMUM_HEADER_SIZE) {
- this.decodeHeader(rawConversationIndex);
- if (rawConversationIndex.length >= MINIMUM_HEADER_SIZE + RESPONSE_LEVEL_SIZE) {
- this.decodeResponseLevel(rawConversationIndex);
- }
- }
- }
-
- private void decodeHeader(final byte[] rawConversationIndex) {
- // According to the Spec the first byte is not included, but I believe
- // the spec is incorrect!
- // int reservedheaderMarker = (int)
- // PSTObject.convertBigEndianBytesToLong(rawConversationIndex, 0, 1);
-
- final long deliveryTimeHigh = PSTObject.convertBigEndianBytesToLong(rawConversationIndex, 0, 4);
- final long deliveryTimeLow = PSTObject.convertBigEndianBytesToLong(rawConversationIndex, 4, 6) << 16;
- this.deliveryTime = PSTObject.filetimeToDate((int) deliveryTimeHigh, (int) deliveryTimeLow);
-
- final long guidHigh = PSTObject.convertBigEndianBytesToLong(rawConversationIndex, 6, 14);
- final long guidLow = PSTObject.convertBigEndianBytesToLong(rawConversationIndex, 14, 22);
-
- this.guid = new UUID(guidHigh, guidLow);
- }
-
- private void decodeResponseLevel(final byte[] rawConversationIndex) {
- final int responseLevelCount = (rawConversationIndex.length - MINIMUM_HEADER_SIZE) / RESPONSE_LEVEL_SIZE;
- this.responseLevels = new ArrayList<>(responseLevelCount);
-
- for (int responseLevelIndex = 0, position = 22; responseLevelIndex < responseLevelCount; responseLevelIndex++, position += RESPONSE_LEVEL_SIZE) {
-
- final long responseLevelValue = PSTObject.convertBigEndianBytesToLong(rawConversationIndex, position,
- position + 5);
- final short deltaCode = (short) (responseLevelValue >> 39);
- final short random = (short) (responseLevelValue & 0xFF);
-
- // shift by 1 byte (remove the random) and mask off the deltaCode
- long deltaTime = (responseLevelValue >> 8) & 0x7FFFFFFF;
-
- if (deltaCode == 0) {
- deltaTime <<= 18;
- } else {
- deltaTime <<= 23;
- }
-
- deltaTime /= HUNDRED_NS_TO_MS;
-
- this.responseLevels.add(responseLevelIndex, new ResponseLevel(deltaCode, deltaTime, random));
- }
- }
-}
diff --git a/src/main/java/com/pff/PSTDescriptorItem.java b/src/main/java/com/pff/PSTDescriptorItem.java
deleted file mode 100644
index 94f2da4..0000000
--- a/src/main/java/com/pff/PSTDescriptorItem.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- */
-package com.pff;
-
-import java.io.IOException;
-
-/**
- * The descriptor items contain information that describes a PST object.
- * This is like extended table entries, usually when the data cannot fit in a
- * traditional table item.
- *
- * This is an entry of type SLENTRY or SIENTRY
- * see [MS-PST]: Outlook Personal Folders (.pst) File Format
- *
- * @author Richard Johnson
- */
-class PSTDescriptorItem {
- PSTDescriptorItem(final byte[] data, final int offset, final PSTFile pstFile, int entryType) {
- this.pstFile = pstFile;
-
- if (pstFile.getPSTFileType() == PSTFile.PST_TYPE_ANSI) {
- this.descriptorIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, offset, offset + 4);
- this.offsetIndexIdentifier = ((int) PSTObject.convertLittleEndianBytesToLong(data, offset + 4, offset + 8))
- & 0xfffffffe;
- if (entryType == PSTFile.SLBLOCK_ENTRY)
- this.subNodeOffsetIndexIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, offset + 8,
- offset + 12) & 0xfffffffe;
- else
- this.subNodeOffsetIndexIdentifier = 0;
- } else {
- this.descriptorIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, offset, offset + 4);
- this.offsetIndexIdentifier = ((int) PSTObject.convertLittleEndianBytesToLong(data, offset + 8, offset + 16))
- & 0xfffffffe;
- if (entryType == PSTFile.SLBLOCK_ENTRY)
- this.subNodeOffsetIndexIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, offset + 16,
- offset + 24) & 0xfffffffe;
- else
- this.subNodeOffsetIndexIdentifier = 0;
- }
- }
-
- public byte[] getData() throws IOException, PSTException {
- if (this.dataBlockData != null) {
- return this.dataBlockData;
- }
-
- final PSTNodeInputStream in = this.pstFile.readLeaf(this.offsetIndexIdentifier);
- final byte[] out = new byte[(int) in.length()];
- in.readCompletely(out);
- this.dataBlockData = out;
- return this.dataBlockData;
- }
-
- public int[] getBlockOffsets() throws IOException, PSTException {
- if (this.dataBlockOffsets != null) {
-
- return this.dataBlockOffsets;
- }
- final Long[] offsets = this.pstFile.readLeaf(this.offsetIndexIdentifier).getBlockOffsets();
- final int[] offsetsOut = new int[offsets.length];
- for (int x = 0; x < offsets.length; x++) {
- offsetsOut[x] = offsets[x].intValue();
- }
- return offsetsOut;
- }
-
- public int getDataSize() throws IOException, PSTException {
- return this.pstFile.getLeafSize(this.offsetIndexIdentifier);
- }
-
- // Public data
- int descriptorIdentifier;
- int offsetIndexIdentifier;
- int subNodeOffsetIndexIdentifier;
-
- // These are private to ensure that getData()/getBlockOffets() are used
- // private PSTFile.PSTFileBlock dataBlock = null;
- byte[] dataBlockData = null;
- int[] dataBlockOffsets = null;
- private final PSTFile pstFile;
-
- @Override
- public String toString() {
- return "PSTDescriptorItem\n" + " descriptorIdentifier: " + this.descriptorIdentifier + "\n"
- + " offsetIndexIdentifier: " + this.offsetIndexIdentifier + "\n" + " subNodeOffsetIndexIdentifier: "
- + this.subNodeOffsetIndexIdentifier + "\n";
-
- }
-
-}
diff --git a/src/main/java/com/pff/PSTDistList.java b/src/main/java/com/pff/PSTDistList.java
deleted file mode 100644
index a858611..0000000
--- a/src/main/java/com/pff/PSTDistList.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-
-/**
- * PST DistList for extracting Addresses from Distribution lists.
- *
- * @author Richard Johnson
- */
-public class PSTDistList extends PSTMessage {
-
- /**
- * constructor.
- *
- * @param theFile
- * pst file
- * @param descriptorIndexNode
- * index of the list
- * @throws PSTException
- * on parsing error
- * @throws IOException
- * on data access error
- */
- PSTDistList(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode) throws PSTException, IOException {
- super(theFile, descriptorIndexNode);
- }
-
- /**
- * Internal constructor for performance.
- *
- * @param theFile
- * pst file
- * @param folderIndexNode
- * index of the list
- * @param table
- * the PSTTableBC this object is represented by
- * @param localDescriptorItems
- * additional external items that represent
- * this object.
- */
- PSTDistList(final PSTFile theFile, final DescriptorIndexNode folderIndexNode, final PSTTableBC table,
- final HashMap localDescriptorItems) {
- super(theFile, folderIndexNode, table, localDescriptorItems);
- }
-
- /**
- * Find the next two null bytes in an array given start.
- *
- * @param data
- * the array to search
- * @param start
- * the starting index
- * @return position of the next null char
- */
- private int findNextNullChar(final byte[] data, int start) {
- for (; start < data.length; start += 2) {
- if (data[start] == 0 && data[start + 1] == 0) {
- break;
- }
- }
- return start;
- }
-
- /**
- * identifier for one-off entries.
- */
- private final byte[] oneOffEntryIdUid = { (byte) 0x81, (byte) 0x2b, (byte) 0x1f, (byte) 0xa4, (byte) 0xbe,
- (byte) 0xa3, (byte) 0x10, (byte) 0x19, (byte) 0x9d, (byte) 0x6e, (byte) 0x00, (byte) 0xdd, (byte) 0x01,
- (byte) 0x0f, (byte) 0x54, (byte) 0x02 };
-
- /**
- * identifier for wrapped entries.
- */
- private final byte[] wrappedEntryIdUid = { (byte) 0xc0, (byte) 0x91, (byte) 0xad, (byte) 0xd3, (byte) 0x51,
- (byte) 0x9d, (byte) 0xcf, (byte) 0x11, (byte) 0xa4, (byte) 0xa9, (byte) 0x00, (byte) 0xaa, (byte) 0x00,
- (byte) 0x47, (byte) 0xfa, (byte) 0xa4 };
-
- /**
- * Inner class to represent distribution list one-off entries.
- */
- public class OneOffEntry {
- /** display name. */
- private String displayName = "";
-
- /**
- * @return display name
- */
- public String getDisplayName() {
- return this.displayName;
- }
-
- /** address type (smtp). */
- private String addressType = "";
-
- /**
- * @return address type
- */
- public String getAddressType() {
- return this.addressType;
- }
-
- /** email address. */
- private String emailAddress = "";
-
- /**
- * @return email address.
- */
- public String getEmailAddress() {
- return this.emailAddress;
- }
-
- /** ending position of this object in the data array. */
- private int pos = 0;
-
- /**
- * @return formatted record
- */
- @Override
- public String toString() {
- return String.format("Display Name: %s\n" + "Address Type: %s\n" + "Email Address: %s\n", this.displayName,
- this.addressType, this.emailAddress);
- }
- }
-
- /**
- * Parse a one-off entry from this Distribution List.
- *
- * @param data
- * the item data
- * @param pos
- * the current position in the data.
- * @throws IOException
- * on string reading fail
- * @return the one-off entry
- */
- private OneOffEntry parseOneOffEntry(final byte[] data, int pos) throws IOException {
- final int version = (int) PSTObject.convertLittleEndianBytesToLong(data, pos, pos + 2);
- pos += 2;
-
- // http://msdn.microsoft.com/en-us/library/ee202811(v=exchg.80).aspx
- final int additionalFlags = (int) PSTObject.convertLittleEndianBytesToLong(data, pos, pos + 2);
- pos += 2;
-
- final int pad = additionalFlags & 0x8000;
- final int mae = additionalFlags & 0x0C00;
- final int format = additionalFlags & 0x1E00;
- final int m = additionalFlags & 0x0100;
- final int u = additionalFlags & 0x0080;
- final int r = additionalFlags & 0x0060;
- final int l = additionalFlags & 0x0010;
- final int pad2 = additionalFlags & 0x000F;
-
- int stringEnd = this.findNextNullChar(data, pos);
- final byte[] displayNameBytes = new byte[stringEnd - pos];
- System.arraycopy(data, pos, displayNameBytes, 0, displayNameBytes.length);
- final String displayName = new String(displayNameBytes, "UTF-16LE");
- pos = stringEnd + 2;
-
- stringEnd = this.findNextNullChar(data, pos);
- final byte[] addressTypeBytes = new byte[stringEnd - pos];
- System.arraycopy(data, pos, addressTypeBytes, 0, addressTypeBytes.length);
- final String addressType = new String(addressTypeBytes, "UTF-16LE");
- pos = stringEnd + 2;
-
- stringEnd = this.findNextNullChar(data, pos);
- final byte[] emailAddressBytes = new byte[stringEnd - pos];
- System.arraycopy(data, pos, emailAddressBytes, 0, emailAddressBytes.length);
- final String emailAddress = new String(emailAddressBytes, "UTF-16LE");
- pos = stringEnd + 2;
-
- final OneOffEntry out = new OneOffEntry();
- out.displayName = displayName;
- out.addressType = addressType;
- out.emailAddress = emailAddress;
- out.pos = pos;
- return out;
- }
-
- /**
- * Get an array of the members in this distribution list.
- *
- * @throws PSTException
- * on corrupted data
- * @throws IOException
- * on bad string reading
- * @return array of entries that can either be PSTDistList.OneOffEntry
- * or a PSTObject, generally PSTContact.
- */
- public Object[] getDistributionListMembers() throws PSTException, IOException {
- final PSTTableBCItem item = this.items.get(this.pstFile.getNameToIdMapItem(0x8055, PSTFile.PSETID_Address));
- Object[] out = {};
- if (item != null) {
- int pos = 0;
- final int count = (int) PSTObject.convertLittleEndianBytesToLong(item.data, pos, pos + 4);
- out = new Object[count];
- pos += 4;
- pos = (int) PSTObject.convertLittleEndianBytesToLong(item.data, pos, pos + 4);
-
- for (int x = 0; x < count; x++) {
- // http://msdn.microsoft.com/en-us/library/ee218661(v=exchg.80).aspx
- // http://msdn.microsoft.com/en-us/library/ee200559(v=exchg.80).aspx
- final int flags = (int) PSTObject.convertLittleEndianBytesToLong(item.data, pos, pos + 4);
- pos += 4;
-
- final byte[] guid = new byte[16];
- System.arraycopy(item.data, pos, guid, 0, guid.length);
- pos += 16;
-
- if (Arrays.equals(guid, this.wrappedEntryIdUid)) {
- /* c3 */
- final int entryType = item.data[pos] & 0x0F;
- final int entryAddressType = item.data[pos] & 0x70 >> 4;
- final boolean isOneOffEntryId = (item.data[pos] & 0x80) > 0;
- pos++;
- final int wrappedflags = (int) PSTObject.convertLittleEndianBytesToLong(item.data, pos, pos + 4);
- pos += 4;
-
- final byte[] guid2 = new byte[16];
- System.arraycopy(item.data, pos, guid, 0, guid.length);
- pos += 16;
-
- final int descriptorIndex = (int) PSTObject.convertLittleEndianBytesToLong(item.data, pos, pos + 3);
- pos += 3;
-
- final byte empty = item.data[pos];
- pos++;
-
- out[x] = PSTObject.detectAndLoadPSTObject(this.pstFile, descriptorIndex);
-
- } else if (Arrays.equals(guid, this.oneOffEntryIdUid)) {
- final OneOffEntry entry = this.parseOneOffEntry(item.data, pos);
- pos = entry.pos;
- out[x] = entry;
- }
- }
- }
- return out;
- }
-}
diff --git a/src/main/java/com/pff/PSTException.java b/src/main/java/com/pff/PSTException.java
deleted file mode 100644
index ce0182a..0000000
--- a/src/main/java/com/pff/PSTException.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-/**
- * Simple exception for PST File related errors
- *
- * @author Richard Johnson
- */
-public class PSTException extends Exception {
- /**
- * eclipse generated serial UID
- */
- private static final long serialVersionUID = 4284698344354718143L;
-
- PSTException(final String error) {
- super(error);
- }
-
- PSTException(final String error, final Exception orig) {
- super(error, orig);
- }
-}
diff --git a/src/main/java/com/pff/PSTFile.java b/src/main/java/com/pff/PSTFile.java
deleted file mode 100644
index fd4a520..0000000
--- a/src/main/java/com/pff/PSTFile.java
+++ /dev/null
@@ -1,1029 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- */
-package com.pff;
-
-import java.io.*;
-import java.nio.charset.Charset;
-import java.util.*;
-
-/**
- * PSTFile is the containing class that allows you to access items within a .pst
- * file.
- * Start here, get the root of the folders and work your way down through your
- * items.
- *
- * @author Richard Johnson
- */
-public class PSTFile {
-
- public static final int ENCRYPTION_TYPE_NONE = 0;
- public static final int ENCRYPTION_TYPE_COMPRESSIBLE = 1;
-
- private static final int MESSAGE_STORE_DESCRIPTOR_IDENTIFIER = 33;
- private static final int ROOT_FOLDER_DESCRIPTOR_IDENTIFIER = 290;
-
- public static final int PST_TYPE_ANSI = 14;
- protected static final int PST_TYPE_ANSI_2 = 15;
- public static final int PST_TYPE_UNICODE = 23;
- public static final int PST_TYPE_2013_UNICODE = 36;
-
- // Known GUIDs
- // Local IDs first
- public static final int PS_PUBLIC_STRINGS = 0;
- public static final int PSETID_Common = 1;
- public static final int PSETID_Address = 2;
- public static final int PS_INTERNET_HEADERS = 3;
- public static final int PSETID_Appointment = 4;
- public static final int PSETID_Meeting = 5;
- public static final int PSETID_Log = 6;
- public static final int PSETID_Messaging = 7;
- public static final int PSETID_Note = 8;
- public static final int PSETID_PostRss = 9;
- public static final int PSETID_Task = 10;
- public static final int PSETID_UnifiedMessaging = 11;
- public static final int PS_MAPI = 12;
- public static final int PSETID_AirSync = 13;
- public static final int PSETID_Sharing = 14;
-
- // Now the string guids
- private static final String guidStrings[] = {
- "00020329-0000-0000-C000-000000000046",
- "00062008-0000-0000-C000-000000000046",
- "00062004-0000-0000-C000-000000000046",
- "00020386-0000-0000-C000-000000000046",
- "00062002-0000-0000-C000-000000000046",
- "6ED8DA90-450B-101B-98DA-00AA003F1305",
- "0006200A-0000-0000-C000-000000000046",
- "41F28F13-83F4-4114-A584-EEDB5A6B0BFF",
- "0006200E-0000-0000-C000-000000000046",
- "00062041-0000-0000-C000-000000000046",
- "00062003-0000-0000-C000-000000000046",
- "4442858E-A9E3-4E80-B900-317A210CC15B",
- "00020328-0000-0000-C000-000000000046",
- "71035549-0739-4DCB-9163-00F0580DBBDF",
- "00062040-0000-0000-C000-000000000046"};
-
- private final HashMap guidMap = new HashMap<>();
-
- // the type of encryption the files uses.
- private int encryptionType = 0;
-
- // our all important tree.
- private LinkedHashMap> childrenDescriptorTree = null;
-
- private final HashMap nameToId = new HashMap<>();
- private final HashMap stringToId = new HashMap<>();
- private static HashMap idToName = new HashMap<>();
- private final HashMap idToString = new HashMap<>();
- private byte[] guids = null;
-
- private int itemCount = 0;
-
- private final PSTFileContent in;
-
- /**
- * constructor
- *
- * @param fileName the file name
- * @throws FileNotFoundException the file not found exception
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTFile(final String fileName) throws FileNotFoundException, PSTException, IOException {
- this(new File(fileName));
- }
-
- /**
- * Instantiates a new Pst file.
- *
- * @param file the file
- * @throws FileNotFoundException the file not found exception
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTFile(final File file) throws FileNotFoundException, PSTException, IOException {
- this(new PSTRAFileContent(file));
- }
-
- /**
- * Instantiates a new Pst file.
- *
- * @param bytes the bytes
- * @throws FileNotFoundException the file not found exception
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTFile(final byte[] bytes) throws FileNotFoundException, PSTException, IOException {
- this(new PSTByteFileContent(bytes));
- }
-
- /**
- * Instantiates a new Pst file.
- *
- * @param content the content
- * @throws FileNotFoundException the file not found exception
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTFile(final PSTFileContent content) throws FileNotFoundException, PSTException, IOException {
- // attempt to open the file.
- this.in = content;
-
- // get the first 4 bytes, should be !BDN
- try {
- final byte[] temp = new byte[4];
- this.in.readCompletely(temp);
- final String strValue = new String(temp);
- if (!strValue.equals("!BDN")) {
- throw new PSTException("Invalid file header: " + strValue + ", expected: !BDN");
- }
-
- // make sure we are using a supported version of a PST...
- final byte[] fileTypeBytes = new byte[2];
- this.in.seek(10);
- this.in.readCompletely(fileTypeBytes);
- // ANSI file types can be 14 or 15:
- if (fileTypeBytes[0] == PSTFile.PST_TYPE_ANSI_2) {
- fileTypeBytes[0] = PSTFile.PST_TYPE_ANSI;
- }
- if (fileTypeBytes[0] != PSTFile.PST_TYPE_ANSI && fileTypeBytes[0] != PSTFile.PST_TYPE_UNICODE
- && fileTypeBytes[0] != PSTFile.PST_TYPE_2013_UNICODE) {
- throw new PSTException("Unrecognised PST File version: " + fileTypeBytes[0]);
- }
- this.pstFileType = fileTypeBytes[0];
-
- // make sure encryption is turned off at this stage...
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- this.in.seek(461);
- } else {
- this.in.seek(513);
- }
- this.encryptionType = this.in.readByte();
- if (this.encryptionType == 0x02) {
- throw new PSTException("Only unencrypted and compressable PST files are supported at this time");
- }
-
- // build out name to id map.
- this.processNameToIdMap(this.in);
-
- // get the default codepage
- globalCodepage = inferGlobalCodepage();
- } catch (final IOException err) {
- throw new PSTException("Unable to read PST Sig", err);
- }
-
- }
-
- private String globalCodepage;
-
- private String inferGlobalCodepage() {
- int codepageIdentifier;
- try {
- codepageIdentifier = this.getMessageStore().getIntItem(0x66C3); // PidTagCodepageId
- } catch (PSTException | IOException e) {
- return null;
- }
- if (codepageIdentifier != 0)
- return getInternetCodePageCharset(codepageIdentifier);
- return Charset.defaultCharset().name();
- }
-
- public void setGlobalCodepage(String codepage) {
- globalCodepage = codepage;
- }
-
- public String getGlobalCodepage() {
- return globalCodepage;
- }
-
- private int pstFileType = 0;
-
- public int getPSTFileType() {
- return this.pstFileType;
- }
-
- /**
- * read the name-to-id map from the file and load it in
- *
- * @param in the pst file content
- * @throws IOException IOException
- * @throws PSTException PSTException
- */
- private void processNameToIdMap(final PSTFileContent in) throws IOException, PSTException {
-
- // Create our guid map
- for (int i = 0; i < guidStrings.length; ++i) {
- final UUID uuid = UUID.fromString(guidStrings[i]);
- this.guidMap.put(uuid, i);
- /*
- * System.out.printf("guidMap[{%s}] = %d\n", uuid.toString(), i);
- * /
- **/
- }
-
- // process the name to id map
- final DescriptorIndexNode nameToIdMapDescriptorNode = (this.getDescriptorIndexNode(97));
- // nameToIdMapDescriptorNode.readData(this);
-
- // get the descriptors if we have them
- HashMap localDescriptorItems = null;
- if (nameToIdMapDescriptorNode.localDescriptorsOffsetIndexIdentifier != 0) {
- // PSTDescriptor descriptor = new PSTDescriptor(this,
- // nameToIdMapDescriptorNode.localDescriptorsOffsetIndexIdentifier);
- // localDescriptorItems = descriptor.getChildren();
- localDescriptorItems = this
- .getPSTDescriptorItems(nameToIdMapDescriptorNode.localDescriptorsOffsetIndexIdentifier);
- }
-
- // process the map
- // PSTTableBC bcTable = new
- // PSTTableBC(nameToIdMapDescriptorNode.dataBlock.data,
- // nameToIdMapDescriptorNode.dataBlock.blockOffsets);
- final OffsetIndexItem off = this.getOffsetIndexNode(nameToIdMapDescriptorNode.dataOffsetIndexIdentifier);
- final PSTNodeInputStream nodein = new PSTNodeInputStream(this, off);
- //final byte[] tmp = new byte[off.size];
- //nodein.readCompletely(tmp);
- final PSTTableBC bcTable = new PSTTableBC(nodein);
-
- final HashMap tableItems = (bcTable.getItems());
- // Get the guids
- final PSTTableBCItem guidEntry = tableItems.get(2); // PidTagNameidStreamGuid
- this.guids = this.getData(guidEntry, localDescriptorItems);
- final int nGuids = this.guids.length / 16;
- final UUID[] uuidArray = new UUID[nGuids];
- final int[] uuidIndexes = new int[nGuids];
- int offset = 0;
- for (int i = 0; i < nGuids; ++i) {
- final long mostSigBits = (PSTObject.convertLittleEndianBytesToLong(this.guids, offset, offset + 4) << 32)
- | (PSTObject.convertLittleEndianBytesToLong(this.guids, offset + 4, offset + 6) << 16)
- | PSTObject.convertLittleEndianBytesToLong(this.guids, offset + 6, offset + 8);
- final long leastSigBits = PSTObject.convertBigEndianBytesToLong(this.guids, offset + 8, offset + 16);
- uuidArray[i] = new UUID(mostSigBits, leastSigBits);
- if (this.guidMap.containsKey(uuidArray[i])) {
- uuidIndexes[i] = this.guidMap.get(uuidArray[i]);
- } else {
- uuidIndexes[i] = -1; // We don't know this guid
- }
- /*
- * System.out.printf("uuidArray[%d] = {%s},%d\n", i,
- * uuidArray[i].toString(), uuidIndexes[i]);
- * /
- **/
- offset += 16;
- }
-
- // if we have a reference to an internal descriptor
- final PSTTableBCItem mapEntries = tableItems.get(3); //
- final byte[] nameToIdByte = this.getData(mapEntries, localDescriptorItems);
-
- final PSTTableBCItem stringMapEntries = tableItems.get(4); //
- final byte[] stringNameToIdByte = this.getData(stringMapEntries, localDescriptorItems);
-
- // process the entries
- for (int x = 0; x + 8 < nameToIdByte.length; x += 8) {
- final int dwPropertyId = (int) PSTObject.convertLittleEndianBytesToLong(nameToIdByte, x, x + 4);
- int wGuid = (int) PSTObject.convertLittleEndianBytesToLong(nameToIdByte, x + 4, x + 6);
- int wPropIdx = ((int) PSTObject.convertLittleEndianBytesToLong(nameToIdByte, x + 6, x + 8));
-
- if ((wGuid & 0x0001) == 0) {
- wPropIdx += 0x8000;
- wGuid >>= 1;
- int guidIndex;
- if (wGuid == 1) {
- guidIndex = PS_MAPI;
- } else if (wGuid == 2) {
- guidIndex = PS_PUBLIC_STRINGS;
- } else {
- guidIndex = uuidIndexes[wGuid - 3];
- }
- this.nameToId.put(dwPropertyId | ((long) guidIndex << 32), wPropIdx);
- idToName.put(wPropIdx, (long) dwPropertyId);
- /*
- * System.out.printf("0x%08X:%04X, 0x%08X\n", dwPropertyId,
- * guidIndex, wPropIdx);
- * /
- **/
- } else {
- // else the identifier is a string
- // dwPropertyId becomes thHke byte offset into the String stream
- // in which the string name of the property is stored.
- final int len = (int) PSTObject.convertLittleEndianBytesToLong(stringNameToIdByte, dwPropertyId,
- dwPropertyId + 4);
- if (len > 0 && len < stringNameToIdByte.length) {
- final byte[] keyByteValue = new byte[len];
- System.arraycopy(stringNameToIdByte, dwPropertyId + 4, keyByteValue, 0, keyByteValue.length);
- wPropIdx += 0x8000;
- final String key = new String(keyByteValue, "UTF-16LE");
- this.stringToId.put(key, wPropIdx);
- this.idToString.put(wPropIdx, key);
- }
- }
- }
- }
-
- private byte[] getData(final PSTTableItem item, final HashMap localDescriptorItems)
- throws IOException, PSTException {
- if (item.data.length != 0) {
- return item.data;
- }
-
- if (localDescriptorItems == null) {
- throw new PSTException("External reference but no localDescriptorItems in PSTFile.getData()");
- }
-
- if (item.entryValueType != 0x0102) {
- throw new PSTException("Attempting to get non-binary data in PSTFile.getData()");
- }
-
- final PSTDescriptorItem mapDescriptorItem = localDescriptorItems.get(item.entryValueReference);
- if (mapDescriptorItem == null) {
- throw new PSTException("not here " + item.entryValueReference + "\n" + localDescriptorItems.keySet());
- }
- return mapDescriptorItem.getData();
- }
-
- int getNameToIdMapItem(final int key, final int propertySetIndex) {
- final long lKey = ((long) propertySetIndex << 32) | key;
- final Integer i = this.nameToId.get(lKey);
- if (i == null) {
- return -1;
- }
- return i;
- }
-
- int getPublicStringToIdMapItem(final String key) {
- final Integer i = this.stringToId.get(key);
- if (i == null) {
- return -1;
- }
- return i;
- }
-
- static long getNameToIdMapKey(final int id)
- // throws PSTException
- {
- final Long i = idToName.get(id);
- if (i == null) {
- // throw new PSTException("Name to Id mapping not found");
- return -1;
- }
- return i;
- }
-
- static private Properties propertyInternetCodePages = null;
- static private boolean bCPFirstTime = true;
-
- static String getInternetCodePageCharset(final int propertyId) {
- if (bCPFirstTime) {
- bCPFirstTime = false;
- propertyInternetCodePages = new Properties();
- try {
- final InputStream propertyStream = PSTFile.class.getResourceAsStream("/InternetCodepages.txt");
- if (propertyStream != null) {
- propertyInternetCodePages.load(propertyStream);
- } else {
- propertyInternetCodePages = null;
- }
- } catch (final FileNotFoundException e) {
- propertyInternetCodePages = null;
- e.printStackTrace();
- } catch (final IOException e) {
- propertyInternetCodePages = null;
- e.printStackTrace();
- }
- }
- if (propertyInternetCodePages != null) {
- return propertyInternetCodePages.getProperty(propertyId + "");
- }
- return null;
- }
-
- static private Properties propertyNames = null;
- static private boolean bFirstTime = true;
-
- static String getPropertyName(final int propertyId, final boolean bNamed) {
- if (bFirstTime) {
- bFirstTime = false;
- propertyNames = new Properties();
- try {
- final InputStream propertyStream = PSTFile.class.getResourceAsStream("/PropertyNames.txt");
- if (propertyStream != null) {
- propertyNames.load(propertyStream);
- } else {
- propertyNames = null;
- }
- } catch (final FileNotFoundException e) {
- propertyNames = null;
- e.printStackTrace();
- } catch (final IOException e) {
- propertyNames = null;
- e.printStackTrace();
- }
- }
-
- if (propertyNames != null) {
- final String key = String.format((bNamed ? "%08X" : "%04X"), propertyId);
- return propertyNames.getProperty(key);
- }
-
- return null;
- }
-
- static String getPropertyDescription(final int entryType, final int entryValueType) {
- String ret = "";
- if (entryType < 0x8000) {
- String name = PSTFile.getPropertyName(entryType, false);
- if (name != null) {
- ret = String.format("%s(code %04X):%04X: ", name, entryType, entryValueType);
- } else {
- ret = String.format("unknown property 0x%04X:%04X: ", entryType, entryValueType);
- }
- } else {
- String name = PSTFile.getPropertyName(entryType, false);
- if (name != null) {
- ret = String.format("%s(code %04X):%04X: ", name, entryType, entryValueType);
- } else {
- final long type = PSTFile.getNameToIdMapKey(entryType);
- if (type == -1) {
- ret = String.format("0xFFFF(%04X):%04X: ", entryType, entryValueType);
- } else {
- name = PSTFile.getPropertyName((int) type, true);
- if (name != null) {
- ret = String.format("%s(mapcode %04X):%04X: ", name, entryType, entryValueType);
- } else {
- ret = String.format("not mapped property 0x%04X(%04X):%04X: ", type, entryType, entryValueType);
- }
- }
- }
- }
-
- return ret;
- }
-
- /**
- * destructor just closes the file handle...
- */
- @Override
- protected void finalize() throws IOException {
- this.in.close();
- }
-
- /**
- * get the type of encryption the file uses
- *
- * @return encryption type used in the PST File
- */
- public int getEncryptionType() {
- return this.encryptionType;
- }
-
- /**
- * get the handle to the RandomAccessFile we are currently accessing (if
- * any)
- *
- * @return the file handle
- */
- public RandomAccessFile getFileHandle() {
- if (this.in instanceof PSTRAFileContent) {
- return ((PSTRAFileContent) this.in).getFile();
- } else {
- return null;
- }
- }
-
- /**
- * get the handle to the file content we are currently accessing
- *
- * @return the content handle
- */
- public PSTFileContent getContentHandle() {
- return this.in;
- }
-
- /**
- * get the message store of the PST file.
- * Note that this doesn't really have much information, better to look under
- * the root folder
- *
- * @return the message store
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTMessageStore getMessageStore() throws PSTException, IOException {
- final DescriptorIndexNode messageStoreDescriptor = this
- .getDescriptorIndexNode(MESSAGE_STORE_DESCRIPTOR_IDENTIFIER);
- return new PSTMessageStore(this, messageStoreDescriptor);
- }
-
- /**
- * get the root folder for the PST file.
- * You should find all of your data under here...
- *
- * @return the root folder
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTFolder getRootFolder() throws PSTException, IOException {
- final DescriptorIndexNode rootFolderDescriptor = this.getDescriptorIndexNode(ROOT_FOLDER_DESCRIPTOR_IDENTIFIER);
- final PSTFolder output = new PSTFolder(this, rootFolderDescriptor);
- return output;
- }
-
- PSTNodeInputStream readLeaf(final long bid) throws IOException, PSTException {
- // PSTFileBlock ret = null;
- final PSTNodeInputStream ret = null;
-
- // get the index node for the descriptor index
- final OffsetIndexItem offsetItem = this.getOffsetIndexNode(bid);
- return new PSTNodeInputStream(this, offsetItem);
-
- }
-
- /**
- * Gets leaf size.
- *
- * @param bid the bid
- * @return the leaf size
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- public int getLeafSize(final long bid) throws IOException, PSTException {
- final OffsetIndexItem offsetItem = this.getOffsetIndexNode(bid);
-
- // Internal block?
- if ((offsetItem.indexIdentifier & 0x02) == 0) {
- // No, return the raw size
- return offsetItem.size;
- }
-
- // we only need the first 8 bytes
- final byte[] data = new byte[8];
- this.in.seek(offsetItem.fileOffset);
- this.in.readCompletely(data);
-
- // we are an array, get the sum of the sizes...
- return (int) PSTObject.convertLittleEndianBytesToLong(data, 4, 8);
- }
-
- /**
- * Read a file offset from the file
- * PST Files have this tendency to store file offsets (pointers) in 8 little
- * endian bytes.
- * Convert this to a long for seeking to.
- *
- * @param startOffset where to read the 8 bytes from
- * @return long representing the read location
- * @throws IOException the io exception
- */
- protected long extractLEFileOffset(final long startOffset) throws IOException {
- long offset = 0;
- if (this.getPSTFileType() == PSTFile.PST_TYPE_ANSI) {
- this.in.seek(startOffset);
- final byte[] temp = new byte[4];
- this.in.readCompletely(temp);
- offset |= temp[3] & 0xff;
- offset <<= 8;
- offset |= temp[2] & 0xff;
- offset <<= 8;
- offset |= temp[1] & 0xff;
- offset <<= 8;
- offset |= temp[0] & 0xff;
- } else {
- this.in.seek(startOffset);
- final byte[] temp = new byte[8];
- this.in.readCompletely(temp);
- offset = temp[7] & 0xff;
- long tmpLongValue;
- for (int x = 6; x >= 0; x--) {
- offset = offset << 8;
- tmpLongValue = (long) temp[x] & 0xff;
- offset |= tmpLongValue;
- }
- }
-
- return offset;
- }
-
- /**
- * Generic function used by getOffsetIndexNode and getDescriptorIndexNode
- * for navigating the PST B-Trees
- *
- * @param in the pst file content
- * @param index the index
- * @param descTree desc flag
- * @return BTree item
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- private byte[] findBtreeItem(final PSTFileContent in, final long index, final boolean descTree)
- throws IOException, PSTException {
-
- long btreeStartOffset;
- int fileTypeAdjustment;
- // first find the starting point for the offset index
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- btreeStartOffset = this.extractLEFileOffset(196);
- if (descTree) {
- btreeStartOffset = this.extractLEFileOffset(188);
- }
- } else {
- btreeStartOffset = this.extractLEFileOffset(240);
- if (descTree) {
- btreeStartOffset = this.extractLEFileOffset(224);
- }
- }
-
- // okay, what we want to do is navigate the tree until you reach the
- // bottom....
- // try and read the index b-tree
- byte[] temp = new byte[2];
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- fileTypeAdjustment = 500;
- } else if (this.getPSTFileType() == PST_TYPE_2013_UNICODE) {
- fileTypeAdjustment = 0x1000 - 24;
- } else {
- fileTypeAdjustment = 496;
- }
- in.seek(btreeStartOffset + fileTypeAdjustment);
- in.readCompletely(temp);
-
- while ((temp[0] == 0xffffff80 && temp[1] == 0xffffff80 && !descTree)
- || (temp[0] == 0xffffff81 && temp[1] == 0xffffff81 && descTree)) {
- // get the rest of the data....
- byte[] branchNodeItems;
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- branchNodeItems = new byte[496];
- } else if (this.getPSTFileType() == PST_TYPE_2013_UNICODE) {
- branchNodeItems = new byte[4056];
- } else {
- branchNodeItems = new byte[488];
- }
- in.seek(btreeStartOffset);
- in.readCompletely(branchNodeItems);
-
- long numberOfItems = 0;
- if (this.getPSTFileType() == PST_TYPE_2013_UNICODE) {
- final byte[] numberOfItemsBytes = new byte[2];
- in.readCompletely(numberOfItemsBytes);
- numberOfItems = PSTObject.convertLittleEndianBytesToLong(numberOfItemsBytes);
- in.readCompletely(numberOfItemsBytes);
- final long maxNumberOfItems = PSTObject.convertLittleEndianBytesToLong(numberOfItemsBytes);
- } else {
- numberOfItems = in.read();
- in.read(); // maxNumberOfItems
- }
- final int itemSize = in.read(); // itemSize
- final int levelsToLeaf = in.read();
-
- if (levelsToLeaf > 0) {
- boolean found = false;
- for (long x = 0; x < numberOfItems; x++) {
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- final long indexIdOfFirstChildNode = this.extractLEFileOffset(btreeStartOffset + (x * 12));
- if (indexIdOfFirstChildNode > index) {
- // get the address for the child first node in this
- // group
- btreeStartOffset = this.extractLEFileOffset(btreeStartOffset + ((x - 1) * 12) + 8);
- in.seek(btreeStartOffset + 500);
- in.readCompletely(temp);
- found = true;
- break;
- }
- } else {
- final long indexIdOfFirstChildNode = this.extractLEFileOffset(btreeStartOffset + (x * 24));
- if (indexIdOfFirstChildNode > index) {
- // get the address for the child first node in this
- // group
- btreeStartOffset = this.extractLEFileOffset(btreeStartOffset + ((x - 1) * 24) + 16);
- in.seek(btreeStartOffset + fileTypeAdjustment);
- in.readCompletely(temp);
- found = true;
- break;
- }
- }
- }
- if (!found) {
- // it must be in the very last branch...
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- btreeStartOffset = this.extractLEFileOffset(btreeStartOffset + ((numberOfItems - 1) * 12) + 8);
- in.seek(btreeStartOffset + 500);
- in.readCompletely(temp);
- } else {
- btreeStartOffset = this.extractLEFileOffset(btreeStartOffset + ((numberOfItems - 1) * 24) + 16);
- in.seek(btreeStartOffset + fileTypeAdjustment);
- in.readCompletely(temp);
- }
- }
- } else {
- // System.out.println(String.format("At bottom, looking through
- // %d items", numberOfItems));
- // we are at the bottom of the tree...
- // we want to get our file offset!
- for (long x = 0; x < numberOfItems; x++) {
-
- if (this.getPSTFileType() == PSTFile.PST_TYPE_ANSI) {
- if (descTree) {
- // The 32-bit descriptor index b-tree leaf node item
- in.seek(btreeStartOffset + (x * 16));
- temp = new byte[4];
- in.readCompletely(temp);
- if (PSTObject.convertLittleEndianBytesToLong(temp) == index) {
- // give me the offset index please!
- in.seek(btreeStartOffset + (x * 16));
- temp = new byte[16];
- in.readCompletely(temp);
- return temp;
- }
- } else {
- // The 32-bit (file) offset index item
- final long indexIdOfFirstChildNode = this.extractLEFileOffset(btreeStartOffset + (x * 12));
-
- if (indexIdOfFirstChildNode == index) {
- // we found it!!!! OMG
- // System.out.println("item found as item #"+x);
- in.seek(btreeStartOffset + (x * 12));
-
- temp = new byte[12];
- in.readCompletely(temp);
- return temp;
- }
- }
- } else {
- if (descTree) {
- // The 64-bit descriptor index b-tree leaf node item
- in.seek(btreeStartOffset + (x * 32));
-
- temp = new byte[4];
- in.readCompletely(temp);
- if (PSTObject.convertLittleEndianBytesToLong(temp) == index) {
- // give me the offset index please!
- in.seek(btreeStartOffset + (x * 32));
- temp = new byte[32];
- in.readCompletely(temp);
- // System.out.println("item found!!!");
- // PSTObject.printHexFormatted(temp, true);
- return temp;
- }
- } else {
- // The 64-bit (file) offset index item
- final long indexIdOfFirstChildNode = this.extractLEFileOffset(btreeStartOffset + (x * 24));
-
- if (indexIdOfFirstChildNode == index) {
- // we found it!!!! OMG
- // System.out.println("item found as item #"+x +
- // " size (should be 24): "+itemSize);
- in.seek(btreeStartOffset + (x * 24));
-
- temp = new byte[24];
- in.readCompletely(temp);
- return temp;
- }
- }
- }
- }
- throw new PSTException("Unable to find " + index + " is desc: " + descTree);
- }
- }
-
- throw new PSTException("Unable to find node: " + index + " is desc: " + descTree);
- }
-
- /**
- * navigate the internal descriptor B-Tree and find a specific item
- *
- * @param identifier the identifier
- * @return the descriptor node for the item
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- DescriptorIndexNode getDescriptorIndexNode(final long identifier) throws IOException, PSTException {
- return new DescriptorIndexNode(this.findBtreeItem(this.in, identifier, true), this.getPSTFileType());
- }
-
- /**
- * navigate the internal index B-Tree and find a specific item
- *
- * @param identifier the identifier
- * @return the offset index item
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- OffsetIndexItem getOffsetIndexNode(final long identifier) throws IOException, PSTException {
- return new OffsetIndexItem(this.findBtreeItem(this.in, identifier, false), this.getPSTFileType());
- }
-
- /**
- * parse a PSTDescriptor and get all of its items
- */
- HashMap getPSTDescriptorItems(final long localDescriptorsOffsetIndexIdentifier)
- throws PSTException, IOException {
- return this.getPSTDescriptorItems(this.readLeaf(localDescriptorsOffsetIndexIdentifier));
- }
-
- static final int SLBLOCK_ENTRY = 0;
- static final int SIBLOCK_ENTRY = 1;
-
- HashMap getPSTDescriptorItems(final PSTNodeInputStream in)
- throws PSTException, IOException {
- // make sure the signature is correct
- in.seek(0);
- final int sig = in.read();
- if (sig != 0x2) {
- throw new PSTException("Unable to process descriptor node, bad signature: " + sig);
- }
- // NID nodes defines in subnode can be either SLBLOCK (0) or SIBLOCK_ENTRY (1)
- int blockType = in.read();
- if ((blockType != SLBLOCK_ENTRY) && (blockType != SIBLOCK_ENTRY)) {
- throw new PSTException("Unable to process descriptor node, unknown BLOCK type: " + blockType);
- }
- final HashMap output = new HashMap<>();
- final int numberOfItems = (int) in.seekAndReadLong(2, 2);
- int offset;
- if (this.getPSTFileType() == PSTFile.PST_TYPE_ANSI) {
- offset = 4;
- } else {
- offset = 8;
- }
-
- final byte[] data = new byte[(int) in.length()];
- in.seek(0);
- in.readCompletely(data);
-
- for (int x = 0; x < numberOfItems; x++) {
- final PSTDescriptorItem item = new PSTDescriptorItem(data, offset, this, blockType);
- if (blockType == SLBLOCK_ENTRY)
- output.put(item.descriptorIdentifier, item);
- else
- output.putAll(getPSTDescriptorItems(item.offsetIndexIdentifier));
- if (this.getPSTFileType() == PSTFile.PST_TYPE_ANSI) {
- if (blockType == SLBLOCK_ENTRY)
- offset += 12;
- else
- offset += 8;
- } else {
- if (blockType == SLBLOCK_ENTRY)
- offset += 24;
- else
- offset += 16;
- }
- }
- return output;
- }
-
- /**
- * Build the children descriptor tree
- * This goes through the entire descriptor B-Tree and adds every item to the
- * childrenDescriptorTree.
- * This is used as fallback when the nodes that list file contents are
- * broken.
- *
- * @return the child descriptor tree
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- LinkedHashMap> getChildDescriptorTree() throws IOException, PSTException {
- if (this.childrenDescriptorTree == null) {
- long btreeStartOffset = 0;
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- btreeStartOffset = this.extractLEFileOffset(188);
- } else {
- btreeStartOffset = this.extractLEFileOffset(224);
- }
- this.childrenDescriptorTree = new LinkedHashMap<>();
- this.processDescriptorBTree(btreeStartOffset);
- }
- return this.childrenDescriptorTree;
- }
-
- /**
- * Recursive function for building the descriptor tree, used by
- * buildDescriptorTree
- *
- * @param btreeStartOffset the BTree start offset
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- private void processDescriptorBTree(final long btreeStartOffset) throws IOException, PSTException {
- int fileTypeAdjustment;
-
- byte[] temp = new byte[2];
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- fileTypeAdjustment = 500;
- } else if (this.getPSTFileType() == PST_TYPE_2013_UNICODE) {
- fileTypeAdjustment = 0x1000 - 24;
- } else {
- fileTypeAdjustment = 496;
- }
- this.in.seek(btreeStartOffset + fileTypeAdjustment);
- this.in.readCompletely(temp);
-
- if ((temp[0] == 0xffffff81 && temp[1] == 0xffffff81)) {
-
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- this.in.seek(btreeStartOffset + 496);
- } else if (this.getPSTFileType() == PST_TYPE_2013_UNICODE) {
- this.in.seek(btreeStartOffset + 4056);
- } else {
- this.in.seek(btreeStartOffset + 488);
- }
-
- long numberOfItems = 0;
- if (this.getPSTFileType() == PST_TYPE_2013_UNICODE) {
- final byte[] numberOfItemsBytes = new byte[2];
- this.in.readCompletely(numberOfItemsBytes);
- numberOfItems = PSTObject.convertLittleEndianBytesToLong(numberOfItemsBytes);
- this.in.readCompletely(numberOfItemsBytes);
- final long maxNumberOfItems = PSTObject.convertLittleEndianBytesToLong(numberOfItemsBytes);
- } else {
- numberOfItems = this.in.read();
- this.in.read(); // maxNumberOfItems
- }
- this.in.read(); // itemSize
- final int levelsToLeaf = this.in.read();
-
- if (levelsToLeaf > 0) {
- for (long x = 0; x < numberOfItems; x++) {
- if (this.getPSTFileType() == PST_TYPE_ANSI) {
- final long branchNodeItemStartIndex = (btreeStartOffset + (12 * x));
- final long nextLevelStartsAt = this.extractLEFileOffset(branchNodeItemStartIndex + 8);
- this.processDescriptorBTree(nextLevelStartsAt);
- } else {
- final long branchNodeItemStartIndex = (btreeStartOffset + (24 * x));
- final long nextLevelStartsAt = this.extractLEFileOffset(branchNodeItemStartIndex + 16);
- this.processDescriptorBTree(nextLevelStartsAt);
- }
- }
- } else {
- for (long x = 0; x < numberOfItems; x++) {
- // The 64-bit descriptor index b-tree leaf node item
- // give me the offset index please!
- if (this.getPSTFileType() == PSTFile.PST_TYPE_ANSI) {
- this.in.seek(btreeStartOffset + (x * 16));
- temp = new byte[16];
- this.in.readCompletely(temp);
- } else {
- this.in.seek(btreeStartOffset + (x * 32));
- temp = new byte[32];
- this.in.readCompletely(temp);
- }
-
- final DescriptorIndexNode tempNode = new DescriptorIndexNode(temp, this.getPSTFileType());
-
- // we don't want to be children of ourselves...
- if (tempNode.parentDescriptorIndexIdentifier == tempNode.descriptorIdentifier) {
- // skip!
- } else if (this.childrenDescriptorTree.containsKey(tempNode.parentDescriptorIndexIdentifier)) {
- // add this entry to the existing list of children
- final LinkedList children = this.childrenDescriptorTree
- .get(tempNode.parentDescriptorIndexIdentifier);
- children.add(tempNode);
- } else {
- // create a new entry and add this one to that
- final LinkedList children = new LinkedList<>();
- children.add(tempNode);
- this.childrenDescriptorTree.put(tempNode.parentDescriptorIndexIdentifier, children);
- }
- this.itemCount++;
- }
- }
- } else {
- PSTObject.printHexFormatted(temp, true);
- throw new PSTException("Unable to read descriptor node, is not a descriptor");
- }
- }
-
- public void close() throws IOException {
- this.in.close();
- }
-
-}
diff --git a/src/main/java/com/pff/PSTFileContent.java b/src/main/java/com/pff/PSTFileContent.java
deleted file mode 100644
index e599d06..0000000
--- a/src/main/java/com/pff/PSTFileContent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.pff;
-
-import java.io.IOException;
-
-public abstract class PSTFileContent {
- public abstract void seek(long index) throws IOException;
-
- public abstract long getFilePointer() throws IOException;
-
- public abstract int read() throws IOException;
-
- public abstract int read(byte[] target) throws IOException;
-
- public final void readCompletely(final byte[] target) throws IOException {
- int read = this.read(target);
- // bail in common case
- if (read <= 0 || read == target.length) {
- return;
- }
-
- byte[] buffer = new byte[8192];
- int offset = read;
- while (offset < target.length) {
- read = this.read(buffer);
- if (read <= 0) {
- break;
- }
- System.arraycopy(buffer, 0, target, offset, read);
- offset += read;
- }
- }
-
- public abstract byte readByte() throws IOException;
-
- public abstract void close() throws IOException;
-}
diff --git a/src/main/java/com/pff/PSTFolder.java b/src/main/java/com/pff/PSTFolder.java
deleted file mode 100644
index 00804a7..0000000
--- a/src/main/java/com/pff/PSTFolder.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Vector;
-
-/**
- * Represents a folder in the PST File
- * Allows you to access child folders or items. Items are accessed through a
- * sort of cursor arrangement.
- * This allows for incremental reading of a folder which may have _lots_ of
- * emails.
- *
- * @author Richard Johnson
- */
-public class PSTFolder extends PSTObject {
-
- /**
- * a constructor for the rest of us...
- *
- * @param theFile the the file
- * @param descriptorIndexNode the descriptor index node
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- PSTFolder(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode) throws PSTException, IOException {
- super(theFile, descriptorIndexNode);
- }
-
- /**
- * For pre-populating a folder object with values.
- * Not recommended for use outside this library
- *
- * @param theFile the the file
- * @param folderIndexNode the folder index node
- * @param table the table
- * @param localDescriptorItems the local descriptor items
- */
- PSTFolder(final PSTFile theFile, final DescriptorIndexNode folderIndexNode, final PSTTableBC table,
- final HashMap localDescriptorItems) {
- super(theFile, folderIndexNode, table, localDescriptorItems);
- }
-
- /**
- * get all of the sub folders...
- * there are not usually thousands, so we just do it in one big operation.
- *
- * @return all of the subfolders
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public Vector getSubFolders() throws PSTException, IOException {
- final Vector output = new Vector<>();
- try {
- this.initSubfoldersTable();
- final List> itemMapSet = this.subfoldersTable.getItems();
- for (final HashMap itemMap : itemMapSet) {
- final PSTTable7CItem item = itemMap.get(26610);
- final PSTFolder folder = (PSTFolder) PSTObject.detectAndLoadPSTObject(this.pstFile,
- item.entryValueReference);
- output.add(folder);
- }
- } catch (final PSTException err) {
- // hierarchy node doesn't exist: This is OK if child count is 0.
- // Seen with special search folders at the top of the hierarchy:
- // "8739 - SPAM Search Folder 2", "8739 - Content.Filter".
- // this.subfoldersTable may remain uninitialized (null) in that case.
- if (this.getContentCount() != 0) {
- if (err.getMessage().startsWith("Can't get child folders")) {
- throw err;
- } else {
- //err.printStackTrace();
- throw new PSTException("Can't get child folders for folder " + this.getDisplayName() + "("
- + this.getDescriptorNodeId() + ") child count: " + this.getContentCount() + " - " + err.toString(), err);
- }
- }
- }
- return output;
- }
-
- private void initSubfoldersTable() throws IOException, PSTException {
- if (this.subfoldersTable != null) {
- return;
- }
-
- final long folderDescriptorIndex = this.descriptorIndexNode.descriptorIdentifier + 11;
- try {
- final DescriptorIndexNode folderDescriptor = this.pstFile.getDescriptorIndexNode(folderDescriptorIndex);
- HashMap tmp = null;
- if (folderDescriptor.localDescriptorsOffsetIndexIdentifier > 0) {
- // tmp = new PSTDescriptor(pstFile,
- // folderDescriptor.localDescriptorsOffsetIndexIdentifier).getChildren();
- tmp = this.pstFile.getPSTDescriptorItems(folderDescriptor.localDescriptorsOffsetIndexIdentifier);
- }
- this.subfoldersTable = new PSTTable7C(new PSTNodeInputStream(this.pstFile,
- this.pstFile.getOffsetIndexNode(folderDescriptor.dataOffsetIndexIdentifier)), tmp);
- } catch (final PSTException err) {
- // hierarchy node doesn't exist
- throw new PSTException("Can't get child folders for folder " + this.getDisplayName() + "("
- + this.getDescriptorNodeId() + ") child count: " + this.getContentCount() + " - " + err.toString(), err);
- }
- }
-
- /**
- * internal vars for the tracking of things..
- */
- private int currentEmailIndex = 0;
- private final LinkedHashSet otherItems = null;
-
- private PSTTable7C emailsTable = null;
- private LinkedList fallbackEmailsTable = null;
- private PSTTable7C subfoldersTable = null;
-
- /**
- * this method goes through all of the children and sorts them into one of
- * the three hash sets.
- *
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- private void initEmailsTable() throws PSTException, IOException {
- if (this.emailsTable != null || this.fallbackEmailsTable != null) {
- return;
- }
-
- // some folder types don't have children:
- if (this.getNodeType() == PSTObject.NID_TYPE_SEARCH_FOLDER) {
- return;
- }
-
- try {
- final long folderDescriptorIndex = this.descriptorIndexNode.descriptorIdentifier + 12; // +12
- // lists
- // emails!
- // :D
- final DescriptorIndexNode folderDescriptor = this.pstFile.getDescriptorIndexNode(folderDescriptorIndex);
- HashMap tmp = null;
- if (folderDescriptor.localDescriptorsOffsetIndexIdentifier > 0) {
- // tmp = new PSTDescriptor(pstFile,
- // folderDescriptor.localDescriptorsOffsetIndexIdentifier).getChildren();
- tmp = this.pstFile.getPSTDescriptorItems(folderDescriptor.localDescriptorsOffsetIndexIdentifier);
- }
- // PSTTable7CForFolder folderDescriptorTable = new
- // PSTTable7CForFolder(folderDescriptor.dataBlock.data,
- // folderDescriptor.dataBlock.blockOffsets,tmp, 0x67F2);
- this.emailsTable = new PSTTable7C(new PSTNodeInputStream(this.pstFile,
- this.pstFile.getOffsetIndexNode(folderDescriptor.dataOffsetIndexIdentifier)), tmp, 0x67F2);
- } catch (final Exception err) {
-
- // here we have to attempt to fallback onto the children as listed
- // by the descriptor b-tree
- final LinkedHashMap> tree = this.pstFile.getChildDescriptorTree();
-
- this.fallbackEmailsTable = new LinkedList<>();
- final LinkedList allChildren = tree.get(this.getDescriptorNode().descriptorIdentifier);
-
- if (allChildren != null) {
- // quickly go through and remove those entries that are not
- // messages!
- for (final DescriptorIndexNode node : allChildren) {
- if (node != null
- && PSTObject.getNodeType(node.descriptorIdentifier) == PSTObject.NID_TYPE_NORMAL_MESSAGE) {
- this.fallbackEmailsTable.add(node);
- }
- }
- }
-
- System.err.println("Can't get children for folder " + this.getDisplayName() + "("
- + this.getDescriptorNodeId() + ") child count: " + this.getContentCount() + " - " + err.toString()
- + ", using alternate child tree with " + this.fallbackEmailsTable.size() + " items");
- }
- }
-
- /**
- * get some children from the folder
- * This is implemented as a cursor of sorts, as there could be thousands
- * and that is just too many to process at once.
- *
- * @param numberToReturn the number to return
- * @return bunch of children in this folder
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public Vector getChildren(final int numberToReturn) throws PSTException, IOException {
- this.initEmailsTable();
-
- final Vector output = new Vector<>();
- if (this.emailsTable != null) {
- final List> rows = this.emailsTable.getItems(this.currentEmailIndex,
- numberToReturn);
-
- for (int x = 0; x < rows.size(); x++) {
- if (this.currentEmailIndex >= this.getContentCount()) {
- // no more!
- break;
- }
- // get the emails from the rows
- final PSTTable7CItem emailRow = rows.get(x).get(0x67F2);
- final DescriptorIndexNode childDescriptor = this.pstFile
- .getDescriptorIndexNode(emailRow.entryValueReference);
- final PSTObject child = PSTObject.detectAndLoadPSTObject(this.pstFile, childDescriptor);
- output.add(child);
- this.currentEmailIndex++;
- }
- } else if (this.fallbackEmailsTable != null) {
- // we use the fallback
- final ListIterator iterator = this.fallbackEmailsTable
- .listIterator(this.currentEmailIndex);
- for (int x = 0; x < numberToReturn; x++) {
- if (this.currentEmailIndex >= this.getContentCount()) {
- // no more!
- break;
- }
- final DescriptorIndexNode childDescriptor = iterator.next();
- final PSTObject child = PSTObject.detectAndLoadPSTObject(this.pstFile, childDescriptor);
- output.add(child);
- this.currentEmailIndex++;
- }
- }
-
- return output;
- }
-
- /**
- * Gets child descriptor nodes.
- *
- * @return the child descriptor nodes
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public LinkedList getChildDescriptorNodes() throws PSTException, IOException {
- this.initEmailsTable();
- if (this.emailsTable == null) {
- return new LinkedList<>();
- }
- final LinkedList output = new LinkedList<>();
- final List> rows = this.emailsTable.getItems();
- for (final HashMap row : rows) {
- // get the emails from the rows
- if (this.currentEmailIndex == this.getContentCount()) {
- // no more!
- break;
- }
- final PSTTable7CItem emailRow = row.get(0x67F2);
- if (emailRow.entryValueReference == 0) {
- break;
- }
- output.add(emailRow.entryValueReference);
- }
- return output;
- }
-
- /**
- * Get the next child of this folder
- * As there could be thousands of emails, we have these kind of cursor
- * operations
- *
- * @return the next email in the folder or null if at the end of the folder
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTObject getNextChild() throws PSTException, IOException {
- this.initEmailsTable();
-
- if (this.emailsTable != null) {
- final List> rows = this.emailsTable.getItems(this.currentEmailIndex, 1);
-
- if (this.currentEmailIndex == this.getContentCount()) {
- // no more!
- return null;
- }
- this.currentEmailIndex++;
- // get the emails from the rows
- final PSTTable7CItem emailRow = rows.get(0).get(0x67F2);
- final DescriptorIndexNode childDescriptor = this.pstFile
- .getDescriptorIndexNode(emailRow.entryValueReference);
- final PSTObject child = PSTObject.detectAndLoadPSTObject(this.pstFile, childDescriptor);
-
- return child;
- } else if (this.fallbackEmailsTable != null) {
- if (this.currentEmailIndex >= this.getContentCount()
- || this.currentEmailIndex >= this.fallbackEmailsTable.size()) {
- // no more!
- return null;
- }
- this.currentEmailIndex++;
- // get the emails from the rows
- final DescriptorIndexNode childDescriptor = this.fallbackEmailsTable.get(this.currentEmailIndex);
- final PSTObject child = PSTObject.detectAndLoadPSTObject(this.pstFile, childDescriptor);
- return child;
- }
- return null;
- }
-
- /**
- * move the internal folder cursor to the desired position
- * position 0 is before the first record.
- *
- * @param newIndex the new index
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- public void moveChildCursorTo(int newIndex) throws IOException, PSTException {
- this.initEmailsTable();
-
- if (newIndex < 1) {
- this.currentEmailIndex = 0;
- return;
- }
- if (newIndex > this.getContentCount()) {
- newIndex = this.getContentCount();
- }
- this.currentEmailIndex = newIndex;
- }
-
- /**
- * the number of child folders in this folder
- *
- * @return number of subfolders as counted
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- public int getSubFolderCount() throws IOException, PSTException {
- this.initSubfoldersTable();
- if (this.subfoldersTable != null) {
- return this.subfoldersTable.getRowCount();
- } else {
- return 0;
- }
- }
-
- /**
- * the number of emails in this folder
- * this is the count of emails made by the library and will therefore should
- * be more accurate than getContentCount
- *
- * @return number of emails in this folder (as counted)
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- public int getEmailCount() throws IOException, PSTException {
- this.initEmailsTable();
- if (this.emailsTable == null) {
- return -1;
- }
- return this.emailsTable.getRowCount();
- }
-
- /**
- * Gets folder type.
- *
- * @return the folder type
- */
- public int getFolderType() {
- return this.getIntItem(0x3601);
- }
-
- /**
- * the number of emails in this folder
- * this is as reported by the PST file, for a number calculated by the
- * library use getEmailCount
- *
- * @return number of items as reported by PST File
- */
- public int getContentCount() {
- return this.getIntItem(0x3602);
- }
-
- /**
- * Amount of unread content items Integer 32-bit signed
- *
- * @return the unread count
- */
- public int getUnreadCount() {
- return this.getIntItem(0x3603);
- }
-
- /**
- * does this folder have subfolders
- * once again, read from the PST, use getSubFolderCount if you want to know
- * what the library makes of it all
- *
- * @return has subfolders as reported by the PST File
- */
- public boolean hasSubfolders() {
- return (this.getIntItem(0x360a) != 0);
- }
-
- /**
- * Gets container class.
- *
- * @return the container class
- */
- public String getContainerClass() {
- return this.getStringItem(0x3613);
- }
-
- /**
- * Gets associate content count.
- *
- * @return the associate content count
- */
- public int getAssociateContentCount() {
- return this.getIntItem(0x3617);
- }
-
- /**
- * Container flags Integer 32-bit signed
- *
- * @return the container flags
- */
- public int getContainerFlags() {
- return this.getIntItem(0x3600);
- }
-
-}
-// vim: set noexpandtab:
diff --git a/src/main/java/com/pff/PSTGlobalObjectId.java b/src/main/java/com/pff/PSTGlobalObjectId.java
deleted file mode 100644
index 0576c0d..0000000
--- a/src/main/java/com/pff/PSTGlobalObjectId.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.pff;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.Date;
-
-/**
- * Class to represent a decoded PidLidGlobalObjectId or
- * PidLidCleanGlobalObjectId (for Meeting Exceptions)
- * See [MS-OXOCAL]
- * "https://interoperability.blob.core.windows.net/files/MS-OXOCAL/%5bMS-OXOCAL%5d.pdf"
- * sections 2.2.1.27(PidLidGlobalObjectId) & 2.2.1.28(PidLidCleanGlobalObjectId)
- *
- * @author Nick Buller
- * NOTE: Following MS Doc for variable names so are exactly the same as
- * in MS-OXOCAL (not following Java conventions)
- */
-public class PSTGlobalObjectId {
- final protected static byte[] ReferenceByteArrayID = { 0x04, 0x00, 0x00, 0x00, (byte) 0x82, 0x00, (byte) 0xe0, 0x00,
- 0x74, (byte) 0xc5, (byte) 0xb7, 0x10, 0x1a, (byte) 0x82, (byte) 0xe0, 0x08 };
- final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
-
- byte[] ByteArrayID = new byte[16];
- byte YH;
- byte YL;
- byte M;
- byte D;
- int CreationTimeH;
- int CreationTimeL;
- Date CreationTime;
- long X = 0x0L;
- int Size;
- byte[] Data;
-
- public PSTGlobalObjectId(final byte[] pidData) {
- if (pidData.length < 32) {
- throw new AssertionError("pidDate is too short");
- }
-
- System.arraycopy(pidData, 0, this.ByteArrayID, 0, ReferenceByteArrayID.length);
-
- if (!Arrays.equals(this.ByteArrayID, ReferenceByteArrayID)) {
- throw new AssertionError("ByteArrayID is incorrect");
- }
-
- final ByteBuffer buffer = ByteBuffer
- .wrap(pidData, ReferenceByteArrayID.length, pidData.length - ReferenceByteArrayID.length)
- .order(ByteOrder.LITTLE_ENDIAN);
-
- this.YH = buffer.get();
- this.YL = buffer.get();
- this.M = buffer.get();
- this.D = buffer.get();
- this.CreationTimeL = buffer.getInt();
- this.CreationTimeH = buffer.getInt();
- this.CreationTime = PSTObject.filetimeToDate(this.CreationTimeH, this.CreationTimeL);
- this.X = buffer.getLong();
- this.Size = buffer.getInt();
-
- if (buffer.remaining() != this.Size) {
- throw new AssertionError("Incorrect remaining date in buffer to extract data");
- }
-
- this.Data = new byte[buffer.remaining()];
- buffer.get(this.Data, 0, buffer.remaining());
- }
-
- public static String bytesToHex(final byte[] bytes) {
- final char[] hexChars = new char[bytes.length * 2];
- for (int j = 0; j < bytes.length; j++) {
- final int v = bytes[j] & 0xFF;
- hexChars[j * 2] = hexArray[v >>> 4];
- hexChars[j * 2 + 1] = hexArray[v & 0x0F];
- }
- return new String(hexChars);
- }
-
- protected int getYearHigh() {
- return this.YH;
- }
-
- protected int getYearLow() {
- return (this.YL & 0xFF);
- }
-
- public int getYear() {
- return (this.YH << 8) | (this.YL & 0xFF);
- }
-
- public int getMonth() {
- return this.M;
- }
-
- public int getDay() {
- return this.D;
- }
-
- public Date getCreationTime() {
- return this.CreationTime;
- }
-
- protected int getCreationTimeLow() {
- return this.CreationTimeL;
- }
-
- protected int getCreationTimeHigh() {
- return this.CreationTimeH;
- }
-
- public int getDataSize() {
- return this.Size;
- }
-
- public byte[] getData() {
- return this.Data;
- }
-
- @Override
- public String toString() {
- return "Byte Array ID[" + bytesToHex(this.ByteArrayID) + "] " + "Year [" + this.getYear() + "] " + "Month["
- + this.M + "] " + "Day[" + this.D + "] CreationTime[" + this.CreationTime + "] " + "X[" + this.X + "] "
- + "Size[" + this.Size + "] " + "Data[" + bytesToHex(this.Data) + "]";
- }
-}
diff --git a/src/main/java/com/pff/PSTMessage.java b/src/main/java/com/pff/PSTMessage.java
deleted file mode 100644
index e3f9740..0000000
--- a/src/main/java/com/pff/PSTMessage.java
+++ /dev/null
@@ -1,1405 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.IOException;
-import java.util.Date;
-import java.util.HashMap;
-
-/**
- * PST Message contains functions that are common across most MAPI objects.
- * Note that many of these functions may not be applicable for the item in
- * question,
- * however there seems to be no hard and fast outline for what properties apply
- * to which
- * objects. For properties where no value is set, a blank value is returned
- * (rather than
- * an exception being raised).
- *
- * @author Richard Johnson
- */
-public class PSTMessage extends PSTObject {
-
- /**
- * The constant IMPORTANCE_LOW.
- */
- public static final int IMPORTANCE_LOW = 0;
- /**
- * The constant IMPORTANCE_NORMAL.
- */
- public static final int IMPORTANCE_NORMAL = 1;
- /**
- * The constant IMPORTANCE_HIGH.
- */
- public static final int IMPORTANCE_HIGH = 2;
-
- /**
- * Instantiates a new Pst message.
- *
- * @param theFile the the file
- * @param descriptorIndexNode the descriptor index node
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- PSTMessage(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode) throws PSTException, IOException {
- super(theFile, descriptorIndexNode);
- }
-
- /**
- * Instantiates a new Pst message.
- *
- * @param theFile the the file
- * @param folderIndexNode the folder index node
- * @param table the table
- * @param localDescriptorItems the local descriptor items
- */
- PSTMessage(final PSTFile theFile, final DescriptorIndexNode folderIndexNode, final PSTTableBC table,
- final HashMap localDescriptorItems) {
- super(theFile, folderIndexNode, table, localDescriptorItems);
- }
-
- /**
- * Gets rtf body.
- *
- * @return the rtf body
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public String getRTFBody() throws PSTException, IOException {
- // do we have an entry for it?
- if (this.items.containsKey(0x1009)) {
- // is it a reference?
- final PSTTableBCItem item = this.items.get(0x1009);
- if (item.data.length > 0) {
- return (LZFu.decode(item.data));
- }
- final int ref = item.entryValueReference;
- final PSTDescriptorItem descItem = this.localDescriptorItems.get(ref);
- if (descItem != null) {
- return LZFu.decode(descItem.getData());
- }
- }
-
- return "";
- }
-
- /**
- * get the importance of the email
- *
- * @return IMPORTANCE_NORMAL if unknown
- */
- public int getImportance() {
- return this.getIntItem(0x0017, IMPORTANCE_NORMAL);
- }
-
- /**
- * Get string item based on hexvalue passed in
- *
- * @return empty string if not found
- */
- public String getStringBasedOnHexValue(int hexValue) {
- return this.getStringItem(hexValue);
- }
-
-
- /**
- * Get int item based on hexvalue passed in
- *
- * @return empty string if not found
- */
- public int getIntBasedOnHexValue(int hexValue) {
- return this.getIntItem(hexValue);
- }
-
- /**
- * get the message class for the email
- *
- * @return empty string if unknown
- */
- @Override
- public String getMessageClass() {
- return this.getStringItem(0x001a);
- }
-
- /**
- * get the subject
- *
- * @return empty string if not found
- */
- public String getSubject() {
- String subject = this.getStringItem(0x0037);
-
- // byte[] controlCodesA = {0x01, 0x01};
- // byte[] controlCodesB = {0x01, 0x05};
- // byte[] controlCodesC = {0x01, 0x10};
- if (subject != null && (subject.length() >= 2) &&
-
- // (subject.startsWith(new String(controlCodesA)) ||
- // subject.startsWith(new String(controlCodesB)) ||
- // subject.startsWith(new String(controlCodesC)))
- subject.charAt(0) == 0x01) {
- if (subject.length() == 2) {
- subject = "";
- } else {
- subject = subject.substring(2, subject.length());
- }
- }
- return subject;
- }
-
- /**
- * get the client submit time
- *
- * @return null if not found
- */
- public Date getClientSubmitTime() {
- return this.getDateItem(0x0039);
- }
-
- /**
- * get received by name
- *
- * @return empty string if not found
- */
- public String getReceivedByName() {
- return this.getStringItem(0x0040);
- }
-
- /**
- * get sent representing name
- *
- * @return empty string if not found
- */
- public String getSentRepresentingName() {
- return this.getStringItem(0x0042);
- }
-
- /**
- * Sent representing address type
- * Known values are SMTP, EX (Exchange) and UNKNOWN
- *
- * @return empty string if not found
- */
- public String getSentRepresentingAddressType() {
- return this.getStringItem(0x0064);
- }
-
- /**
- * Sent representing email address
- *
- * @return empty string if not found
- */
- public String getSentRepresentingEmailAddress() {
- return this.getStringItem(0x0065);
- }
-
- /**
- * Sent representing SMTP address
- *
- * @return empty string if not found
- */
- public String getSentRepresentingSMTPAddress() {
- return this.getStringItem(0x5d02);
- }
-
- /**
- * Conversation topic
- * This is basically the subject from which Fwd:, Re, etc. has been removed
- *
- * @return empty string if not found
- */
- public String getConversationTopic() {
- return this.getStringItem(0x0070);
- }
-
- /**
- * Received by address type
- * Known values are SMTP, EX (Exchange) and UNKNOWN
- *
- * @return empty string if not found
- */
- public String getReceivedByAddressType() {
- return this.getStringItem(0x0075);
- }
-
- /**
- * Received by email address
- *
- * @return empty string if not found
- */
- public String getReceivedByAddress() {
- return this.getStringItem(0x0076);
- }
-
- /**
- * Received representing SMTP address
- *
- * @return empty string if not found
- */
- public String getReceivedRepresentingSMTPAddress() {
- return this.getStringItem(0x5d08);
- }
-
- /**
- * Received By SMTP address
- *
- * @return empty string if not found
- */
- public String getReceivedBySMTPAddress() {
- return this.getStringItem(0x5d07);
- }
-
- /**
- * Transport message headers ASCII or Unicode string These contain the SMTP
- * e-mail headers.
- *
- * @return the transport message headers
- */
- public String getTransportMessageHeaders() {
- return this.getStringItem(0x007d);
- }
-
- /**
- * Is read boolean.
- *
- * @return the boolean
- */
- public boolean isRead() {
- return ((this.getIntItem(0x0e07) & 0x01) != 0);
- }
-
- /**
- * Is unmodified boolean.
- *
- * @return the boolean
- */
- public boolean isUnmodified() {
- return ((this.getIntItem(0x0e07) & 0x02) != 0);
- }
-
- /**
- * Is submitted boolean.
- *
- * @return the boolean
- */
- public boolean isSubmitted() {
- return ((this.getIntItem(0x0e07) & 0x04) != 0);
- }
-
- /**
- * Is unsent boolean.
- *
- * @return the boolean
- */
- public boolean isUnsent() {
- return ((this.getIntItem(0x0e07) & 0x08) != 0);
- }
-
- /**
- * Has attachments boolean.
- *
- * @return the boolean
- */
- public boolean hasAttachments() {
- return ((this.getIntItem(0x0e07) & 0x10) != 0);
- }
-
- /**
- * Is from me boolean.
- *
- * @return the boolean
- */
- public boolean isFromMe() {
- return ((this.getIntItem(0x0e07) & 0x20) != 0);
- }
-
- /**
- * Is associated boolean.
- *
- * @return the boolean
- */
- public boolean isAssociated() {
- return ((this.getIntItem(0x0e07) & 0x40) != 0);
- }
-
- /**
- * Is resent boolean.
- *
- * @return the boolean
- */
- public boolean isResent() {
- return ((this.getIntItem(0x0e07) & 0x80) != 0);
- }
-
- /**
- * Acknowledgment mode Integer 32-bit signed
- *
- * @return the acknowledgement mode
- */
- public int getAcknowledgementMode() {
- return this.getIntItem(0x0001);
- }
-
- /**
- * Originator delivery report requested set if the sender wants a delivery
- * report from all recipients 0 = false 0 != true
- *
- * @return the originator delivery report requested
- */
- public boolean getOriginatorDeliveryReportRequested() {
- return (this.getIntItem(0x0023) != 0);
- }
-
- // 0x0025 0x0102 PR_PARENT_KEY Parent key Binary data Contains a GUID
-
- /**
- * Priority Integer 32-bit signed -1 = NonUrgent 0 = Normal 1 = Urgent
- *
- * @return the priority
- */
- public int getPriority() {
- return this.getIntItem(0x0026);
- }
-
- /**
- * Read Receipt Requested Boolean 0 = false 0 != true
- *
- * @return the read receipt requested
- */
- public boolean getReadReceiptRequested() {
- return (this.getIntItem(0x0029) != 0);
- }
-
- /**
- * Recipient Reassignment Prohibited Boolean 0 = false 0 != true
- *
- * @return the recipient reassignment prohibited
- */
- public boolean getRecipientReassignmentProhibited() {
- return (this.getIntItem(0x002b) != 0);
- }
-
- /**
- * Original sensitivity Integer 32-bit signed the sensitivity of the message
- * before being replied to or forwarded 0 = None 1 = Personal 2 = Private 3
- * = Company Confidential
- *
- * @return the original sensitivity
- */
- public int getOriginalSensitivity() {
- return this.getIntItem(0x002e);
- }
-
- /**
- * Sensitivity Integer 32-bit signed sender's opinion of the sensitivity of
- * an email 0 = None 1 = Personal 2 = Private 3 = Company Confidential
- *
- * @return the sensitivity
- */
- public int getSensitivity() {
- return this.getIntItem(0x0036);
- }
- // 0x003f 0x0102 PR_RECEIVED_BY_ENTRYID (PidTagReceivedByEntr yId) Received
- // by entry identifier Binary data Contains recipient/sender structure
- // 0x0041 0x0102 PR_SENT_REPRESENTING_ENTRYID Sent representing entry
- // identifier Binary data Contains recipient/sender structure
- // 0x0043 0x0102 PR_RCVD_REPRESENTING_ENTRYID Received representing entry
- // identifier Binary data Contains recipient/sender structure
-
- /**
- * Get pid tag sent representing search key byte [ ].
- *
- * @return the byte [ ]
- */
- /*
- * Address book search key
- */
- public byte[] getPidTagSentRepresentingSearchKey() {
- return this.getBinaryItem(0x003b);
- }
-
- /**
- * Received representing name ASCII or Unicode string
- *
- * @return the rcvd representing name
- */
- public String getRcvdRepresentingName() {
- return this.getStringItem(0x0044);
- }
-
- /**
- * Original subject ASCII or Unicode string
- *
- * @return the original subject
- */
- public String getOriginalSubject() {
- return this.getStringItem(0x0049);
- }
-
- // 0x004e 0x0040 PR_ORIGINAL_SUBMIT_TIME Original submit time Filetime
-
- /**
- * Reply recipients names ASCII or Unicode string
- *
- * @return the reply recipient names
- */
- public String getReplyRecipientNames() {
- return this.getStringItem(0x0050);
- }
-
- /**
- * My address in To field Boolean
- *
- * @return the message to me
- */
- public boolean getMessageToMe() {
- return (this.getIntItem(0x0057) != 0);
- }
-
- /**
- * My address in CC field Boolean
- *
- * @return the message cc me
- */
- public boolean getMessageCcMe() {
- return (this.getIntItem(0x0058) != 0);
- }
-
- /**
- * Indicates that the receiving mailbox owner is a primary or a carbon copy
- * (Cc) recipient
- *
- * @return the message recip me
- */
- public boolean getMessageRecipMe() {
- return this.getIntItem(0x0059) != 0;
- }
-
- /**
- * Response requested Boolean
- *
- * @return the response requested
- */
- public boolean getResponseRequested() {
- return this.getBooleanItem(0x0063);
- }
-
- /**
- * Sent representing address type ASCII or Unicode string Known values are
- * SMTP, EX (Exchange) and UNKNOWN
- *
- * @return the sent representing addrtype
- */
- public String getSentRepresentingAddrtype() {
- return this.getStringItem(0x0064);
- }
-
- // 0x0071 0x0102 PR_CONVERSATION_INDEX (PidTagConversationInd ex)
- // Conversation index Binary data
-
- /**
- * Original display BCC ASCII or Unicode string
- *
- * @return the original display bcc
- */
- public String getOriginalDisplayBcc() {
- return this.getStringItem(0x0072);
- }
-
- /**
- * Original display CC ASCII or Unicode string
- *
- * @return the original display cc
- */
- public String getOriginalDisplayCc() {
- return this.getStringItem(0x0073);
- }
-
- /**
- * Original display TO ASCII or Unicode string
- *
- * @return the original display to
- */
- public String getOriginalDisplayTo() {
- return this.getStringItem(0x0074);
- }
-
- /**
- * Received representing address type.
- * Known values are SMTP, EX (Exchange) and UNKNOWN
- *
- * @return the rcvd representing addrtype
- */
- public String getRcvdRepresentingAddrtype() {
- return this.getStringItem(0x0077);
- }
-
- /**
- * Received representing e-mail address
- *
- * @return the rcvd representing email address
- */
- public String getRcvdRepresentingEmailAddress() {
- return this.getStringItem(0x0078);
- }
-
- /**
- * Recipient details
- */
-
- /**
- * Non receipt notification requested
- *
- * @return the boolean
- */
- public boolean isNonReceiptNotificationRequested() {
- return (this.getIntItem(0x0c06) != 0);
- }
-
- /**
- * Originator non delivery report requested
- *
- * @return the boolean
- */
- public boolean isOriginatorNonDeliveryReportRequested() {
- return (this.getIntItem(0x0c08) != 0);
- }
-
- /**
- * The constant RECIPIENT_TYPE_TO.
- */
- public static final int RECIPIENT_TYPE_TO = 1;
- /**
- * The constant RECIPIENT_TYPE_CC.
- */
- public static final int RECIPIENT_TYPE_CC = 2;
-
- /**
- * Recipient type Integer 32-bit signed 0x01 => To 0x02 =>CC
- *
- * @return the recipient type
- */
- public int getRecipientType() {
- return this.getIntItem(0x0c15);
- }
-
- /**
- * Reply requested
- *
- * @return the boolean
- */
- public boolean isReplyRequested() {
- return (this.getIntItem(0x0c17) != 0);
- }
-
- /**
- * Get sender entry id byte [ ].
- *
- * @return the byte [ ]
- */
- /*
- * Sending mailbox owner's address book entry ID
- */
- public byte[] getSenderEntryId() {
- return this.getBinaryItem(0x0c19);
- }
-
- /**
- * Sender name
- *
- * @return the sender name
- */
- public String getSenderName() {
- return this.getStringItem(0x0c1a);
- }
-
- /**
- * Sender address type.
- * Known values are SMTP, EX (Exchange) and UNKNOWN
- *
- * @return the sender addrtype
- */
- public String getSenderAddrtype() {
- return this.getStringItem(0x0c1e);
- }
-
- /**
- * Sender e-mail address
- *
- * @return the sender email address
- */
- public String getSenderEmailAddress() {
- return this.getStringItem(0x0c1f);
- }
-
- /**
- * Non-transmittable message properties
- */
-
- /**
- * Message size
- *
- * @return the message size
- */
- public long getMessageSize() {
- return this.getLongItem(0x0e08);
- }
-
- /**
- * Internet article number
- *
- * @return the internet article number
- */
- public int getInternetArticleNumber() {
- return this.getIntItem(0x0e23);
- }
-
- /**
- * Gets primary send account.
- *
- * @return the primary send account
- */
- /*
- * Server that the client should attempt to send the mail with
- */
- public String getPrimarySendAccount() {
- return this.getStringItem(0x0e28);
- }
-
- /**
- * Gets next send acct.
- *
- * @return the next send acct
- */
- /*
- * Server that the client is currently using to send mail
- */
- public String getNextSendAcct() {
- return this.getStringItem(0x0e29);
- }
-
- /**
- * URL computer name postfix
- *
- * @return the url comp name postfix
- */
- public int getURLCompNamePostfix() {
- return this.getIntItem(0x0e61);
- }
-
- /**
- * Object type
- *
- * @return the object type
- */
- public int getObjectType() {
- return this.getIntItem(0x0ffe);
- }
-
- /**
- * Delete after submit
- *
- * @return the delete after submit
- */
- public boolean getDeleteAfterSubmit() {
- return ((this.getIntItem(0x0e01)) != 0);
- }
-
- /**
- * Responsibility
- *
- * @return the responsibility
- */
- public boolean getResponsibility() {
- return ((this.getIntItem(0x0e0f)) != 0);
- }
-
- /**
- * Compressed RTF in Sync Boolean
- *
- * @return the boolean
- */
- public boolean isRTFInSync() {
- return ((this.getIntItem(0x0e1f)) != 0);
- }
-
- /**
- * URL computer name set
- *
- * @return the boolean
- */
- public boolean isURLCompNameSet() {
- return ((this.getIntItem(0x0e62)) != 0);
- }
-
- /**
- * Display BCC
- *
- * @return the display bcc
- */
- public String getDisplayBCC() {
- return this.getStringItem(0x0e02);
- }
-
- /**
- * Display CC
- *
- * @return the display cc
- */
- public String getDisplayCC() {
- return this.getStringItem(0x0e03);
- }
-
- /**
- * Display To
- *
- * @return the display to
- */
- public String getDisplayTo() {
- return this.getStringItem(0x0e04);
- }
-
- /**
- * Message delivery time
- *
- * @return the message delivery time
- */
- public Date getMessageDeliveryTime() {
- return this.getDateItem(0x0e06);
- }
-
- //
- // public int getFlags() {
- // if (this.items.containsKey(0x0e17)) {
- // System.out.println(this.items.get(0x0e17));
- // }
- // return this.getIntItem(0x0e17);
- // }
- //
- // /**
- // * The message is to be highlighted in recipients' folder displays.
- // */
- // public boolean isHighlighted() {
- // return (this.getIntItem(0x0e17) & 0x1) != 0;
- // }
- //
- // /**
- // * The message has been tagged for a client-defined purpose.
- // */
- // public boolean isTagged() {
- // return (this.getIntItem(0x0e17) & 0x2) != 0;
- // }
- //
- // /**
- // * The message is to be suppressed from recipients' folder displays.
- // */
- // public boolean isHidden() {
- // return (this.getIntItem(0x0e17) & 0x4) != 0;
- // }
- //
- // /**
- // * The message has been marked for subsequent deletion
- // */
- // public boolean isDelMarked() {
- // return (this.getIntItem(0x0e17) & 0x8) != 0;
- // }
- //
- // /**
- // * The message is in draft revision status.
- // */
- // public boolean isDraft() {
- // return (this.getIntItem(0x0e17) & 0x100) != 0;
- // }
- //
- // /**
- // * The message has been replied to.
- // */
- // public boolean isAnswered() {
- // return (this.getIntItem(0x0e17) & 0x200) != 0;
- // }
- //
- // /**
- // * The message has been marked for downloading from the remote message
- // store to the local client
- // */
- // public boolean isMarkedForDownload() {
- // return (this.getIntItem(0x0e17) & 0x1000) != 0;
- // }
- //
- // /**
- // * The message has been marked for deletion at the remote message store
- // without downloading to the local client.
- // */
- // public boolean isRemoteDelMarked() {
- // return (this.getIntItem(0x0e17) & 0x2000) != 0;
- // }
-
- /**
- * Message content properties
- *
- * @return the native body type
- */
- public int getNativeBodyType() {
- return this.getIntItem(0x1016);
- }
-
- /**
- * Plain text e-mail body
- *
- * @return the body
- */
- public String getBody() {
- String cp = null;
- PSTTableBCItem cpItem = this.items.get(0x3FFD); // PidTagMessageCodepage
- if (cpItem == null) {
- cpItem = this.items.get(0x3FDE); // PidTagInternetCodepage
- }
- if (cpItem != null) {
- cp = PSTFile.getInternetCodePageCharset(cpItem.entryValueReference);
- }
- return this.getStringItem(0x1000, 0, cp);
- }
-
- /**
- * Gets body prefix.
- *
- * @return the body prefix
- */
- /*
- * Plain text body prefix
- */
- public String getBodyPrefix() {
- return this.getStringItem(0x6619);
- }
-
- /**
- * RTF Sync Body CRC
- *
- * @return the rtf sync body crc
- */
- public int getRTFSyncBodyCRC() {
- return this.getIntItem(0x1006);
- }
-
- /**
- * RTF Sync Body character count
- *
- * @return the rtf sync body count
- */
- public int getRTFSyncBodyCount() {
- return this.getIntItem(0x1007);
- }
-
- /**
- * RTF Sync body tag
- *
- * @return the rtf sync body tag
- */
- public String getRTFSyncBodyTag() {
- return this.getStringItem(0x1008);
- }
-
- /**
- * RTF whitespace prefix count
- *
- * @return the rtf sync prefix count
- */
- public int getRTFSyncPrefixCount() {
- return this.getIntItem(0x1010);
- }
-
- /**
- * RTF whitespace tailing count
- *
- * @return the rtf sync trailing count
- */
- public int getRTFSyncTrailingCount() {
- return this.getIntItem(0x1011);
- }
-
- /**
- * HTML e-mail body
- *
- * @return the body html
- */
- public String getBodyHTML() {
- String cp = null;
- PSTTableBCItem cpItem = this.items.get(0x3FDE); // PidTagInternetCodepage
- if (cpItem == null) {
- cpItem = this.items.get(0x3FFD); // PidTagMessageCodepage
- }
- if (cpItem != null) {
- cp = PSTFile.getInternetCodePageCharset(cpItem.entryValueReference);
- }
- return this.getStringItem(0x1013, 0, cp);
- }
-
- /**
- * Message ID for this email as allocated per rfc2822
- *
- * @return the internet message id
- */
- public String getInternetMessageId() {
- return this.getStringItem(0x1035);
- }
-
- /**
- * In-Reply-To
- *
- * @return the in reply to id
- */
- public String getInReplyToId() {
- return this.getStringItem(0x1042);
- }
-
- /**
- * Return Path
- *
- * @return the return path
- */
- public String getReturnPath() {
- return this.getStringItem(0x1046);
- }
-
- /**
- * Icon index
- *
- * @return the icon index
- */
- public int getIconIndex() {
- return this.getIntItem(0x1080);
- }
-
- /**
- * Action flag
- * This relates to the replying / forwarding of messages.
- * It is classified as "unknown" atm, so just provided here
- * in case someone works out what all the various flags mean.
- *
- * @return the action flag
- */
- public int getActionFlag() {
- return this.getIntItem(0x1081);
- }
-
- /**
- * is the action flag for this item "forward"?
- *
- * @return the boolean
- */
- public boolean hasForwarded() {
- final int actionFlag = this.getIntItem(0x1081);
- return ((actionFlag & 0x8) > 0);
- }
-
- /**
- * is the action flag for this item "replied"?
- *
- * @return the boolean
- */
- public boolean hasReplied() {
- final int actionFlag = this.getIntItem(0x1081);
- return ((actionFlag & 0x4) > 0);
- }
-
- /**
- * the date that this item had an action performed (eg. replied or
- * forwarded)
- *
- * @return the action date
- */
- public Date getActionDate() {
- return this.getDateItem(0x1082);
- }
-
- /**
- * Disable full fidelity
- *
- * @return the disable full fidelity
- */
- public boolean getDisableFullFidelity() {
- return (this.getIntItem(0x10f2) != 0);
- }
-
- /**
- * URL computer name
- * Contains the .eml file name
- *
- * @return the url comp name
- */
- public String getURLCompName() {
- return this.getStringItem(0x10f3);
- }
-
- /**
- * Attribute hidden
- *
- * @return the attr hidden
- */
- public boolean getAttrHidden() {
- return (this.getIntItem(0x10f4) != 0);
- }
-
- /**
- * Attribute system
- *
- * @return the attr system
- */
- public boolean getAttrSystem() {
- return (this.getIntItem(0x10f5) != 0);
- }
-
- /**
- * Attribute read only
- *
- * @return the attr readonly
- */
- public boolean getAttrReadonly() {
- return (this.getIntItem(0x10f6) != 0);
- }
-
- private PSTTable7C recipientTable = null;
-
- /**
- * find, extract and load up all of the attachments in this email
- * necessary for the other operations.
- */
- private void processRecipients() {
- try {
- final int recipientTableKey = 0x0692;
- if (this.recipientTable == null && this.localDescriptorItems != null
- && this.localDescriptorItems.containsKey(recipientTableKey)) {
- final PSTDescriptorItem item = this.localDescriptorItems.get(recipientTableKey);
- HashMap descriptorItems = null;
- if (item.subNodeOffsetIndexIdentifier > 0) {
- descriptorItems = this.pstFile.getPSTDescriptorItems(item.subNodeOffsetIndexIdentifier);
- }
- this.recipientTable = new PSTTable7C(new PSTNodeInputStream(this.pstFile, item), descriptorItems);
- }
- } catch (final Exception e) {
- e.printStackTrace();
- this.recipientTable = null;
- }
- }
-
- /**
- * get the number of recipients for this message
- *
- * @return the number of recipients
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public int getNumberOfRecipients() throws PSTException, IOException {
- this.processRecipients();
-
- // still nothing? must be no recipients...
- if (this.recipientTable == null) {
- return 0;
- }
- return this.recipientTable.getRowCount();
- }
-
- /**
- * attachment stuff here, not sure if these can just exist in emails or not,
- * but a table key of 0x0671 would suggest that this is a property of the
- * envelope
- * rather than a specific email property
- */
-
- private PSTTable7C attachmentTable = null;
-
- /**
- * find, extract and load up all of the attachments in this email
- * necessary for the other operations.
- *
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- private void processAttachments() throws PSTException, IOException {
- final int attachmentTableKey = 0x0671;
- if (this.attachmentTable == null && this.localDescriptorItems != null
- && this.localDescriptorItems.containsKey(attachmentTableKey)) {
- final PSTDescriptorItem item = this.localDescriptorItems.get(attachmentTableKey);
- HashMap descriptorItems = null;
- if (item.subNodeOffsetIndexIdentifier > 0) {
- descriptorItems = this.pstFile.getPSTDescriptorItems(item.subNodeOffsetIndexIdentifier);
- }
- this.attachmentTable = new PSTTable7C(new PSTNodeInputStream(this.pstFile, item), descriptorItems);
- }
- }
-
- /**
- * Start date Filetime
- *
- * @return the task start date
- */
- public Date getTaskStartDate() {
- return this.getDateItem(this.pstFile.getNameToIdMapItem(0x00008104, PSTFile.PSETID_Task));
- }
-
- /**
- * Due date Filetime
- *
- * @return the task due date
- */
- public Date getTaskDueDate() {
- return this.getDateItem(this.pstFile.getNameToIdMapItem(0x00008105, PSTFile.PSETID_Task));
- }
-
- /**
- * Is a reminder set on this object?
- *
- * @return true if is a reminder set, false if not
- */
- public boolean getReminderSet() {
- return this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008503, PSTFile.PSETID_Common));
- }
-
- /**
- * Gets reminder delta.
- *
- * @return the reminder delta
- */
- public int getReminderDelta() {
- return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008501, PSTFile.PSETID_Common));
- }
-
- /**
- * "flagged" items are actually emails with a due date.
- * This convience method just checks to see if that is true.
- *
- * @return the boolean
- */
- public boolean isFlagged() {
- return this.getTaskDueDate() != null;
- }
-
- /**
- * get the categories defined for this message
- *
- * @return the string [ ]
- * @throws PSTException the pst exception
- */
- public String[] getColorCategories() throws PSTException {
- final int keywordCategory = this.pstFile.getPublicStringToIdMapItem("Keywords");
-
- String[] categories = new String[0];
- if (this.items.containsKey(keywordCategory)) {
- try {
- final PSTTableBCItem item = this.items.get(keywordCategory);
- if (item.data.length == 0) {
- return categories;
- }
- final int categoryCount = item.data[0];
- if (categoryCount > 0) {
- categories = new String[categoryCount];
- final int[] offsets = new int[categoryCount];
- for (int x = 0; x < categoryCount; x++) {
- offsets[x] = (int) PSTObject.convertBigEndianBytesToLong(item.data, (x * 4) + 1,
- (x + 1) * 4 + 1);
- }
- for (int x = 0; x < offsets.length - 1; x++) {
- final int start = offsets[x];
- final int end = offsets[x + 1];
- final int length = (end - start);
- final byte[] string = new byte[length];
- System.arraycopy(item.data, start, string, 0, length);
- final String name = new String(string, "UTF-16LE");
- categories[x] = name;
- }
- final int start = offsets[offsets.length - 1];
- final int end = item.data.length;
- final int length = (end - start);
- final byte[] string = new byte[length];
- System.arraycopy(item.data, start, string, 0, length);
- final String name = new String(string, "UTF-16LE");
- categories[categories.length - 1] = name;
- }
- } catch (final Exception err) {
- throw new PSTException("Unable to decode category data", err);
- }
- }
- return categories;
- }
-
- /**
- * get the number of attachments for this message
- *
- * @return the number of attachments
- */
- public int getNumberOfAttachments() {
- try {
- this.processAttachments();
- } catch (final Exception e) {
- e.printStackTrace();
- return 0;
- }
-
- // still nothing? must be no attachments...
- if (this.attachmentTable == null) {
- return 0;
- }
- return this.attachmentTable.getRowCount();
- }
-
- /**
- * get a specific attachment from this email.
- *
- * @param attachmentNumber the attachment number
- * @return the attachment at the defined index
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTAttachment getAttachment(final int attachmentNumber) throws PSTException, IOException {
- this.processAttachments();
-
- int attachmentCount = 0;
- if (this.attachmentTable != null) {
- attachmentCount = this.attachmentTable.getRowCount();
- }
-
- if (attachmentNumber >= attachmentCount) {
- throw new PSTException("unable to fetch attachment number " + attachmentNumber + ", only " + attachmentCount
- + " in this email");
- }
-
- // we process the C7 table here, basically we just want the attachment
- // local descriptor...
- final HashMap attachmentDetails = this.attachmentTable.getItems()
- .get(attachmentNumber);
- final PSTTable7CItem attachmentTableItem = attachmentDetails.get(0x67f2);
- final int descriptorItemId = attachmentTableItem.entryValueReference;
-
- // get the local descriptor for the attachmentDetails table.
- final PSTDescriptorItem descriptorItem = this.localDescriptorItems.get(descriptorItemId);
-
- // try and decode it
- final byte[] attachmentData = descriptorItem.getData();
- if (attachmentData != null && attachmentData.length > 0) {
- // PSTTableBC attachmentDetailsTable = new
- // PSTTableBC(descriptorItem.getData(),
- // descriptorItem.getBlockOffsets());
- final PSTTableBC attachmentDetailsTable = new PSTTableBC(
- new PSTNodeInputStream(this.pstFile, descriptorItem));
-
- // create our all-precious attachment object.
- // note that all the information that was in the c7 table is
- // repeated in the eb table in attachment data.
- // so no need to pass it...
- HashMap attachmentDescriptorItems = new HashMap<>();
- if (descriptorItem.subNodeOffsetIndexIdentifier > 0) {
- attachmentDescriptorItems = this.pstFile
- .getPSTDescriptorItems(descriptorItem.subNodeOffsetIndexIdentifier);
- }
- return new PSTAttachment(this.pstFile, attachmentDetailsTable, attachmentDescriptorItems);
- }
-
- throw new PSTException(
- "unable to fetch attachment number " + attachmentNumber + ", unable to read attachment details table");
- }
-
- /**
- * get a specific recipient from this email.
- *
- * @param recipientNumber the recipient number
- * @return the recipient at the defined index
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTRecipient getRecipient(final int recipientNumber) throws PSTException, IOException {
- if (recipientNumber >= this.getNumberOfRecipients()
- || recipientNumber >= this.recipientTable.getItems().size()) {
- throw new PSTException("unable to fetch recipient number " + recipientNumber);
- }
-
- final HashMap recipientDetails = this.recipientTable.getItems().get(recipientNumber);
-
- if (recipientDetails != null) {
- return new PSTRecipient(this,recipientDetails);
- }
-
- return null;
- }
-
- /**
- * Gets recipients string.
- *
- * @return the recipients string
- */
- public String getRecipientsString() {
- if (this.recipientTable != null) {
- return this.recipientTable.getItemsString();
- }
-
- return "No recipients table!";
- }
-
- /**
- * Get conversation id byte [ ].
- *
- * @return the byte [ ]
- */
- public byte[] getConversationId() {
- return this.getBinaryItem(0x3013);
- }
-
- /**
- * Gets conversation index.
- *
- * @return the conversation index
- */
- public PSTConversationIndex getConversationIndex() {
- return new PSTConversationIndex(this.getBinaryItem(0x0071));
- }
-
- /**
- * Is conversation index tracking boolean.
- *
- * @return the boolean
- */
- public boolean isConversationIndexTracking() {
- return this.getBooleanItem(0x3016, false);
- }
-
- /**
- * string representation of this email
- */
- @Override
- public String toString() {
- return "PSTEmail: " + this.getSubject() + "\n" + "Importance: " + this.getImportance() + "\n"
- + "Message Class: " + this.getMessageClass() + "\n\n" + this.getTransportMessageHeaders() + "\n\n\n"
- + this.items + this.localDescriptorItems;
- }
-
-}
diff --git a/src/main/java/com/pff/PSTMessageStore.java b/src/main/java/com/pff/PSTMessageStore.java
deleted file mode 100644
index e2e876c..0000000
--- a/src/main/java/com/pff/PSTMessageStore.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.IOException;
-import java.util.UUID;
-
-/**
- * Object that represents the message store.
- * Not much use other than to get the "name" of the PST file.
- *
- * @author Richard Johnson
- */
-public class PSTMessageStore extends PSTObject {
-
- PSTMessageStore(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode)
- throws PSTException, IOException {
- super(theFile, descriptorIndexNode);
- }
-
- /**
- * Get the tag record key, unique to this pst
- *
- * @return the tag record key as uuid
- */
- public UUID getTagRecordKeyAsUUID() {
- // attempt to find in the table.
- final int guidEntryType = 0x0ff9;
- if (this.items.containsKey(guidEntryType)) {
- final PSTTableBCItem item = this.items.get(guidEntryType);
- final int offset = 0;
- final byte[] bytes = item.data;
- final long mostSigBits = (PSTObject.convertLittleEndianBytesToLong(bytes, offset, offset + 4) << 32)
- | (PSTObject.convertLittleEndianBytesToLong(bytes, offset + 4, offset + 6) << 16)
- | PSTObject.convertLittleEndianBytesToLong(bytes, offset + 6, offset + 8);
- final long leastSigBits = PSTObject.convertBigEndianBytesToLong(bytes, offset + 8, offset + 16);
- return new UUID(mostSigBits, leastSigBits);
- }
- return null;
- }
-
- /**
- * get the message store display name
- */
- @Override
- public String getDisplayName() {
- // attempt to find in the table.
- final int displayNameEntryType = 0x3001;
- if (this.items.containsKey(displayNameEntryType)) {
- return this.getStringItem(displayNameEntryType);
- // PSTTableBCItem item =
- // (PSTTableBCItem)this.items.get(displayNameEntryType);
- // return new String(item.getStringValue());
- }
- return "";
- }
-
- public String getDetails() {
- return this.items.toString();
- }
-
- /**
- * Is this pst file is password protected.
- *
- * @throws PSTException
- * on corrupted pst
- * @throws IOException
- * on bad read
- * @return - true if protected,false otherwise
- * pstfile has the password stored against identifier 0x67FF.
- * if there is no password the value stored is 0x00000000.
- */
- public boolean isPasswordProtected() throws PSTException, IOException {
- return (this.getLongItem(0x67FF) != 0);
- }
-
-}
diff --git a/src/main/java/com/pff/PSTNodeInputStream.java b/src/main/java/com/pff/PSTNodeInputStream.java
deleted file mode 100644
index 68eb4de..0000000
--- a/src/main/java/com/pff/PSTNodeInputStream.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-
-package com.pff;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.LinkedList;
-import java.util.zip.Inflater;
-import java.util.zip.InflaterOutputStream;
-
-/**
- * this input stream basically "maps" an input stream on top of the random
- * access file
- *
- * @author richard
- */
-public class PSTNodeInputStream extends InputStream {
-
- private PSTFileContent in;
- private PSTFile pstFile;
- private final LinkedList skipPoints = new LinkedList<>();
- private final LinkedList indexItems = new LinkedList<>();
- private int currentBlock = 0;
- private long currentLocation = 0;
-
- private byte[] allData = null;
-
- private long length = 0;
-
- private boolean encrypted = false;
-
- PSTNodeInputStream(final PSTFile pstFile, final byte[] attachmentData) throws PSTException {
- this.allData = attachmentData;
- this.length = this.allData.length;
- this.encrypted = pstFile.getEncryptionType() == PSTFile.ENCRYPTION_TYPE_COMPRESSIBLE;
- this.currentBlock = 0;
- this.currentLocation = 0;
- this.detectZlib();
- }
-
- PSTNodeInputStream(final PSTFile pstFile, final byte[] attachmentData, final boolean encrypted)
- throws PSTException {
- this.allData = attachmentData;
- this.encrypted = encrypted;
- this.length = this.allData.length;
- this.currentBlock = 0;
- this.currentLocation = 0;
- this.detectZlib();
- }
-
- PSTNodeInputStream(final PSTFile pstFile, final PSTDescriptorItem descriptorItem) throws IOException, PSTException {
- this.in = pstFile.getContentHandle();
- this.pstFile = pstFile;
- this.encrypted = pstFile.getEncryptionType() == PSTFile.ENCRYPTION_TYPE_COMPRESSIBLE;
-
- // we want to get the first block of data and see what we are dealing
- // with
- final OffsetIndexItem offsetItem = pstFile.getOffsetIndexNode(descriptorItem.offsetIndexIdentifier);
- this.loadFromOffsetItem(offsetItem);
- this.currentBlock = 0;
- this.currentLocation = 0;
- this.detectZlib();
- }
-
- PSTNodeInputStream(final PSTFile pstFile, final OffsetIndexItem offsetItem) throws IOException, PSTException {
- this.in = pstFile.getContentHandle();
- this.pstFile = pstFile;
- this.encrypted = pstFile.getEncryptionType() == PSTFile.ENCRYPTION_TYPE_COMPRESSIBLE;
- // this.encrypted = true;
- this.loadFromOffsetItem(offsetItem);
- this.currentBlock = 0;
- this.currentLocation = 0;
- this.detectZlib();
- }
-
- private final boolean isZlib = false;
-
- private void detectZlib() throws PSTException {
- // not really sure how this is meant to work, kind of going by feel
- // here.
- if (this.length < 4) {
- return;
- }
- try {
- if (this.read() == 0x78 && this.read() == 0x9c) {
- boolean multiStreams = false;
- if (this.indexItems.size() > 1) {
- final OffsetIndexItem i = this.indexItems.get(1);
- this.in.seek(i.fileOffset);
- multiStreams = (this.in.read() == 0x78 && this.in.read() == 0x9c);
- }
- // we are a compressed block, decompress the whole thing into a
- // buffer
- // and replace our contents with that.
- // firstly, if we have blocks, use that as the length
- final ByteArrayOutputStream outputStream = new ByteArrayOutputStream((int) this.length);
- if (multiStreams) {
- int y = 0;
- for (final OffsetIndexItem i : this.indexItems) {
- final byte[] inData = new byte[i.size];
- this.in.seek(i.fileOffset);
- this.in.readCompletely(inData);
- final InflaterOutputStream inflaterStream = new InflaterOutputStream(outputStream);
- //try {
- inflaterStream.write(inData);
- inflaterStream.close();
- //} catch (Exception err) {
- // System.out.println("Y: " + y);
- // System.out.println(err);
- // PSTObject.printHexFormatted(inData, true);
- // System.exit(0);
- //}
- y++;
- }
- this.indexItems.clear();
- this.skipPoints.clear();
- } else {
- int compressedLength = (int) this.length;
- if (this.indexItems.size() > 0) {
- compressedLength = 0;
- for (final OffsetIndexItem i : this.indexItems) {
- //System.out.println(i);
- compressedLength += i.size;
- }
- }
- final byte[] inData = new byte[compressedLength];
- this.seek(0);
- this.readCompletely(inData);
-
- final InflaterOutputStream inflaterStream = new InflaterOutputStream(outputStream);
- inflaterStream.write(inData);
- inflaterStream.close();
- }
- outputStream.close();
- final byte[] output = outputStream.toByteArray();
- this.allData = output;
- this.currentLocation = 0;
- this.currentBlock = 0;
- this.length = this.allData.length;
- }
- this.seek(0);
- } catch (final IOException err) {
- throw new PSTException("Unable to decompress reportedly compressed block", err);
- }
- }
-
- private void loadFromOffsetItem(final OffsetIndexItem offsetItem) throws IOException, PSTException {
- boolean bInternal = (offsetItem.indexIdentifier & 0x02) != 0;
-
- this.in.seek(offsetItem.fileOffset);
- final byte[] data = new byte[offsetItem.size];
- this.in.readCompletely(data);
- // PSTObject.printHexFormatted(data, true);
-
- if (bInternal) {
- // All internal blocks are at least 8 bytes long...
- if (offsetItem.size < 8) {
- throw new PSTException("Invalid internal block size");
- }
-
- if (data[0] == 0x1) {
- bInternal = false;
- // we are a xblock, or xxblock
- this.length = PSTObject.convertLittleEndianBytesToLong(data, 4, 8);
- // go through all of the blocks and create skip points.
- this.getBlockSkipPoints(data);
- return;
- }
- }
-
- // (Internal blocks aren't compressed)
- if (bInternal) {
- this.encrypted = false;
- }
- this.allData = data;
- this.length = this.allData.length;
-
- }
-
- public boolean isEncrypted() {
- return this.encrypted;
- }
-
- private void getBlockSkipPoints(final byte[] data) throws IOException, PSTException {
- if (data[0] != 0x1) {
- throw new PSTException("Unable to process XBlock, incorrect identifier");
- }
-
- final int numberOfEntries = (int) PSTObject.convertLittleEndianBytesToLong(data, 2, 4);
-
- int arraySize = 8;
- if (this.pstFile.getPSTFileType() == PSTFile.PST_TYPE_ANSI) {
- arraySize = 4;
- }
- if (data[1] == 0x2) {
- // XXBlock
- int offset = 8;
- for (int x = 0; x < numberOfEntries; x++) {
- long bid = PSTObject.convertLittleEndianBytesToLong(data, offset, offset + arraySize);
- bid &= 0xfffffffe;
- // get the details in this block and
- final OffsetIndexItem offsetItem = this.pstFile.getOffsetIndexNode(bid);
- this.in.seek(offsetItem.fileOffset);
- final byte[] blockData = new byte[offsetItem.size];
- this.in.readCompletely(blockData);
- this.getBlockSkipPoints(blockData);
- offset += arraySize;
- }
- } else if (data[1] == 0x1) {
- // normal XBlock
- int offset = 8;
- for (int x = 0; x < numberOfEntries; x++) {
- long bid = PSTObject.convertLittleEndianBytesToLong(data, offset, offset + arraySize);
- bid &= 0xfffffffe;
- // get the details in this block and add it to the list
- final OffsetIndexItem offsetItem = this.pstFile.getOffsetIndexNode(bid);
- this.indexItems.add(offsetItem);
- this.skipPoints.add(this.currentLocation);
- this.currentLocation += offsetItem.size;
- offset += arraySize;
- }
- }
- }
-
- public long length() {
- return this.length;
- }
-
- @Override
- public int read() throws IOException {
-
- // first deal with items < 8K and we have all the data already
- if (this.allData != null) {
- if (this.currentLocation == this.length) {
- // EOF
- return -1;
- }
- int value = this.allData[(int) this.currentLocation] & 0xFF;
- this.currentLocation++;
- if (this.encrypted) {
- value = PSTObject.compEnc[value];
- }
- return value;
- }
-
- OffsetIndexItem item = this.indexItems.get(this.currentBlock);
- long skipPoint = this.skipPoints.get(this.currentBlock);
- if (this.currentLocation + 1 > skipPoint + item.size) {
- // got to move to the next block
- this.currentBlock++;
-
- if (this.currentBlock >= this.indexItems.size()) {
- return -1;
- }
-
- item = this.indexItems.get(this.currentBlock);
- skipPoint = this.skipPoints.get(this.currentBlock);
- }
-
- // get the next byte.
- final long pos = (item.fileOffset + (this.currentLocation - skipPoint));
- if (this.in.getFilePointer() != pos) {
- this.in.seek(pos);
- }
-
- int output = this.in.read();
- if (output < 0) {
- return -1;
- }
- if (this.encrypted) {
- output = PSTObject.compEnc[output];
- }
-
- this.currentLocation++;
-
- return output;
- }
-
- private int totalLoopCount = 0;
-
- /**
- * Read a block from the input stream, ensuring buffer is completely filled.
- * Recommended block size = 8176 (size used internally by PSTs)
- *
- * @param target buffer to fill
- * @throws IOException the io exception
- */
- public void readCompletely(final byte[] target) throws IOException {
- int offset = 0;
- int numRead = 0;
- while (offset < target.length) {
- numRead = this.read(target, offset, target.length - offset);
- if (numRead == -1) {
- throw new IOException("unexpected EOF encountered attempting to read from PSTInputStream");
- }
- offset += numRead;
- }
- }
-
- /**
- * Read a block from the input stream.
- * Recommended block size = 8176 (size used internally by PSTs)
- *
- * @param output array to get data
- * @return read size, or -1 if end
- * @throws IOException the io exception
- */
- @Override
- public int read(final byte[] output) throws IOException {
- // this method is implemented in an attempt to make things a bit faster
- // than the byte-by-byte read() crap above.
- // it's tricky 'cause we have to copy blocks from a few different areas.
-
- if (this.currentLocation == this.length) {
- // EOF
- return -1;
- }
-
- // first deal with the small stuff
- if (this.allData != null) {
- final int bytesRemaining = (int) (this.length - this.currentLocation);
- if (output.length >= bytesRemaining) {
- System.arraycopy(this.allData, (int) this.currentLocation, output, 0, bytesRemaining);
- if (this.encrypted) {
- PSTObject.decode(output);
- }
- this.currentLocation += bytesRemaining; // should be = to
- // this.length
- return bytesRemaining;
- } else {
- System.arraycopy(this.allData, (int) this.currentLocation, output, 0, output.length);
- if (this.encrypted) {
- PSTObject.decode(output);
- }
- this.currentLocation += output.length;
- return output.length;
- }
- }
-
- boolean filled = false;
- int totalBytesFilled = 0;
- // while we still need to fill the array
- while (!filled) {
-
- // fill up the output from where we are
- // get the current block, either to the end, or until the length of
- // the output
- final OffsetIndexItem offset = this.indexItems.get(this.currentBlock);
- final long skipPoint = this.skipPoints.get(this.currentBlock);
- final int currentPosInBlock = (int) (this.currentLocation - skipPoint);
- this.in.seek(offset.fileOffset + currentPosInBlock);
-
- final long nextSkipPoint = skipPoint + offset.size;
- int bytesRemaining = (output.length - totalBytesFilled);
- // if the total bytes remaining if going to take us past our size
- if (bytesRemaining > ((int) (this.length - this.currentLocation))) {
- // we only have so much to give
- bytesRemaining = (int) (this.length - this.currentLocation);
- }
-
- if (nextSkipPoint >= this.currentLocation + bytesRemaining) {
- // we can fill the output with the rest of our current block!
- final byte[] chunk = new byte[bytesRemaining];
- this.in.readCompletely(chunk);
-
- System.arraycopy(chunk, 0, output, totalBytesFilled, bytesRemaining);
- totalBytesFilled += bytesRemaining;
- // we are done!
- filled = true;
- this.currentLocation += bytesRemaining;
- } else {
- // we need to read out a whole chunk and keep going
- final int bytesToRead = offset.size - currentPosInBlock;
- final byte[] chunk = new byte[bytesToRead];
- this.in.readCompletely(chunk);
- System.arraycopy(chunk, 0, output, totalBytesFilled, bytesToRead);
- totalBytesFilled += bytesToRead;
- this.currentBlock++;
- this.currentLocation += bytesToRead;
- }
- this.totalLoopCount++;
- }
-
- // decode the array if required
- if (this.encrypted) {
- PSTObject.decode(output);
- }
-
- // fill up our chunk
- // move to the next chunk
- return totalBytesFilled;
- }
-
- @Override
- public int read(final byte[] output, final int offset, int length) throws IOException {
- if (this.currentLocation == this.length) {
- // EOF
- return -1;
- }
-
- if (output.length < length) {
- length = output.length;
- }
-
- final byte[] buf = new byte[length];
- final int lengthRead = this.read(buf);
-
- System.arraycopy(buf, 0, output, offset, lengthRead);
-
- return lengthRead;
- }
-
- @Override
- public void reset() {
- this.currentBlock = 0;
- this.currentLocation = 0;
- }
-
- @Override
- public boolean markSupported() {
- return false;
- }
-
- /**
- * Get the offsets (block positions) used in the array
- *
- * @return offsets (block positions)
- */
- public Long[] getBlockOffsets() {
- if (this.skipPoints.size() == 0) {
- final Long[] output = new Long[1];
- output[0] = this.length;
- return output;
- } else {
- final Long[] output = new Long[this.skipPoints.size()];
- for (int x = 0; x < output.length; x++) {
- output[x] = new Long(this.skipPoints.get(x) + this.indexItems.get(x).size);
- }
- return output;
- }
- }
-
- /*
- * public int[] getBlockOffsetsInts() {
- * int[] out = new int[this.skipPoints.size()];
- * for (int x = 0; x < this.skipPoints.size(); x++) {
- * out[x] = this.skipPoints.get(x).intValue();
- * }
- * return out;
- * }
- *
- */
-
- public void seek(final long location) throws IOException, PSTException {
- // not past the end!
- if (location > this.length) {
- throw new PSTException(
- "Unable to seek past end of item! size = " + this.length + ", seeking to:" + location);
- }
-
- // are we already there?
- if (this.currentLocation == location) {
- return;
- }
-
- // get us to the right block
- long skipPoint = 0;
- this.currentBlock = 0;
- if (this.allData == null) {
- skipPoint = this.skipPoints.get(this.currentBlock + 1);
- while (location >= skipPoint) {
- this.currentBlock++;
- // is this the last block?
- if (this.currentBlock == this.skipPoints.size() - 1) {
- // that's all folks
- break;
- } else {
- skipPoint = this.skipPoints.get(this.currentBlock + 1);
- }
- }
- }
-
- // now move us to the right position in there
- this.currentLocation = location;
-
- if (this.allData == null) {
- long blockStart = this.indexItems.get(this.currentBlock).fileOffset;
- final long newFilePos = blockStart + (location - skipPoint);
- this.in.seek(newFilePos);
- }
-
- }
-
- public long seekAndReadLong(final long location, final int bytes) throws IOException, PSTException {
- this.seek(location);
- final byte[] buffer = new byte[bytes];
- this.readCompletely(buffer);
- return PSTObject.convertLittleEndianBytesToLong(buffer);
- }
-
- public PSTFile getPSTFile() {
- return this.pstFile;
- }
-
-}
diff --git a/src/main/java/com/pff/PSTObject.java b/src/main/java/com/pff/PSTObject.java
deleted file mode 100644
index 32f7265..0000000
--- a/src/main/java/com/pff/PSTObject.java
+++ /dev/null
@@ -1,1195 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.IOException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Set;
-import java.util.Locale;
-import java.io.UnsupportedEncodingException;
-
-/**
- * PST Object is the root class of all PST Items.
- * It also provides a number of static utility functions. The most important of
- * which is the
- * detectAndLoadPSTObject call which allows extraction of a PST Item from the
- * file.
- *
- * @author Richard Johnson
- */
-public class PSTObject {
-
- /**
- * The constant NID_TYPE_HID.
- */
- public static final int NID_TYPE_HID = 0x00; // Heap node
- /**
- * The constant NID_TYPE_INTERNAL.
- */
- public static final int NID_TYPE_INTERNAL = 0x01; // Internal node (section
- /**
- * The constant NID_TYPE_NORMAL_FOLDER.
- */
-// 2.4.1)
- public static final int NID_TYPE_NORMAL_FOLDER = 0x02; // Normal Folder
- /**
- * The constant NID_TYPE_SEARCH_FOLDER.
- */
-// object (PC)
- public static final int NID_TYPE_SEARCH_FOLDER = 0x03; // Search Folder
- /**
- * The constant NID_TYPE_NORMAL_MESSAGE.
- */
-// object (PC)
- public static final int NID_TYPE_NORMAL_MESSAGE = 0x04; // Normal Message
- /**
- * The constant NID_TYPE_ATTACHMENT.
- */
-// object (PC)
- public static final int NID_TYPE_ATTACHMENT = 0x05; // Attachment object
- /**
- * The constant NID_TYPE_SEARCH_UPDATE_QUEUE.
- */
-// (PC)
- public static final int NID_TYPE_SEARCH_UPDATE_QUEUE = 0x06; // Queue of
- /**
- * The constant NID_TYPE_SEARCH_CRITERIA_OBJECT.
- */
-// changed
- // objects for
- // search
- // Folder
- // objects
- public static final int NID_TYPE_SEARCH_CRITERIA_OBJECT = 0x07; // Defines
- /**
- * The constant NID_TYPE_ASSOC_MESSAGE.
- */
-// the
- // search
- // criteria
- // for a
- // search
- // Folder
- // object
- public static final int NID_TYPE_ASSOC_MESSAGE = 0x08; // Folder associated
- /**
- * The constant NID_TYPE_CONTENTS_TABLE_INDEX.
- */
-// information (FAI)
- // Message object
- // (PC)
- public static final int NID_TYPE_CONTENTS_TABLE_INDEX = 0x0A; // Internal,
- /**
- * The constant NID_TYPE_RECEIVE_FOLDER_TABLE.
- */
-// persisted
- // view-related
- public static final int NID_TYPE_RECEIVE_FOLDER_TABLE = 0X0B; // Receive
- /**
- * The constant NID_TYPE_OUTGOING_QUEUE_TABLE.
- */
-// Folder
- // object
- // (Inbox)
- public static final int NID_TYPE_OUTGOING_QUEUE_TABLE = 0x0C; // Outbound
- /**
- * The constant NID_TYPE_HIERARCHY_TABLE.
- */
-// queue
- // (Outbox)
- public static final int NID_TYPE_HIERARCHY_TABLE = 0x0D; // Hierarchy table
- /**
- * The constant NID_TYPE_CONTENTS_TABLE.
- */
-// (TC)
- public static final int NID_TYPE_CONTENTS_TABLE = 0x0E; // Contents table
- /**
- * The constant NID_TYPE_ASSOC_CONTENTS_TABLE.
- */
-// (TC)
- public static final int NID_TYPE_ASSOC_CONTENTS_TABLE = 0x0F; // FAI
- /**
- * The constant NID_TYPE_SEARCH_CONTENTS_TABLE.
- */
-// contents
- // table (TC)
- public static final int NID_TYPE_SEARCH_CONTENTS_TABLE = 0x10; // Contents
- /**
- * The constant NID_TYPE_ATTACHMENT_TABLE.
- */
-// table (TC)
- // of a
- // search
- // Folder
- // object
- public static final int NID_TYPE_ATTACHMENT_TABLE = 0x11; // Attachment
- /**
- * The constant NID_TYPE_RECIPIENT_TABLE.
- */
-// table (TC)
- public static final int NID_TYPE_RECIPIENT_TABLE = 0x12; // Recipient table
- /**
- * The constant NID_TYPE_SEARCH_TABLE_INDEX.
- */
-// (TC)
- public static final int NID_TYPE_SEARCH_TABLE_INDEX = 0x13; // Internal,
- /**
- * The constant NID_TYPE_LTP.
- */
-// persisted
- // view-related
- public static final int NID_TYPE_LTP = 0x1F; // LTP
-
- /**
- * Gets items string.
- *
- * @return the items string
- */
- public String getItemsString() {
- return this.items.toString();
- }
-
- /**
- * The Pst file.
- */
- protected PSTFile pstFile;
- /**
- * The Data.
- */
- protected byte[] data;
- /**
- * The Descriptor index node.
- */
- protected DescriptorIndexNode descriptorIndexNode;
- /**
- * The Items.
- */
- protected HashMap items;
- /**
- * The Local descriptor items.
- */
- protected HashMap localDescriptorItems = null;
-
- /**
- * The Children.
- */
- protected LinkedHashMap> children;
-
- /**
- * Instantiates a new Pst object.
- *
- * @param theFile the the file
- * @param descriptorIndexNode the descriptor index node
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- protected PSTObject(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode)
- throws PSTException, IOException {
- this.pstFile = theFile;
- this.descriptorIndexNode = descriptorIndexNode;
-
- // descriptorIndexNode.readData(theFile);
- // PSTTableBC table = new PSTTableBC(descriptorIndexNode.dataBlock.data,
- // descriptorIndexNode.dataBlock.blockOffsets);
- final PSTTableBC table = new PSTTableBC(new PSTNodeInputStream(this.pstFile,
- this.pstFile.getOffsetIndexNode(descriptorIndexNode.dataOffsetIndexIdentifier)));
- // System.out.println(table);
- this.items = table.getItems();
-
- if (descriptorIndexNode.localDescriptorsOffsetIndexIdentifier != 0) {
- // PSTDescriptor descriptor = new PSTDescriptor(theFile,
- // descriptorIndexNode.localDescriptorsOffsetIndexIdentifier);
- // localDescriptorItems = descriptor.getChildren();
- this.localDescriptorItems = theFile
- .getPSTDescriptorItems(descriptorIndexNode.localDescriptorsOffsetIndexIdentifier);
- }
- }
-
- /**
- * for pre-population
- *
- * @param theFile the the file
- * @param folderIndexNode the folder index node
- * @param table the table
- * @param localDescriptorItems the local descriptor items
- */
- protected PSTObject(final PSTFile theFile, final DescriptorIndexNode folderIndexNode, final PSTTableBC table,
- final HashMap localDescriptorItems) {
- this.pstFile = theFile;
- this.descriptorIndexNode = folderIndexNode;
- this.items = table.getItems();
- this.table = table;
- this.localDescriptorItems = localDescriptorItems;
- }
-
- /**
- * The Table.
- */
- protected PSTTableBC table;
-
- /**
- * get the descriptor node for this item
- * this identifies the location of the node in the BTree and associated info
- *
- * @return item 's descriptor node
- */
- public DescriptorIndexNode getDescriptorNode() {
- return this.descriptorIndexNode;
- }
-
- /**
- * get the descriptor identifier for this item
- * can be used for loading objects through detectAndLoadPSTObject(PSTFile
- * theFile, long descriptorIndex)
- *
- * @return item 's descriptor node identifier
- */
- public long getDescriptorNodeId() {
- if (this.descriptorIndexNode != null) { // Prevent null pointer
- // exceptions for embedded
- // messages
- return this.descriptorIndexNode.descriptorIdentifier;
- }
- return 0;
- }
-
- /**
- * Gets node type.
- *
- * @return the node type
- */
- public int getNodeType() {
- return PSTObject.getNodeType(this.descriptorIndexNode.descriptorIdentifier);
- }
-
- /**
- * Gets node type.
- *
- * @param descriptorIdentifier the descriptor identifier
- * @return the node type
- */
- public static int getNodeType(final int descriptorIdentifier) {
- return descriptorIdentifier & 0x1F;
- }
-
- /**
- * Gets int item.
- *
- * @param identifier the identifier
- * @return the int item
- */
- protected int getIntItem(final int identifier) {
- return this.getIntItem(identifier, 0);
- }
-
- /**
- * Gets int item.
- *
- * @param identifier the identifier
- * @param defaultValue the default value
- * @return the int item
- */
- protected int getIntItem(final int identifier, final int defaultValue) {
- if (this.items.containsKey(identifier)) {
- final PSTTableBCItem item = this.items.get(identifier);
- return item.entryValueReference;
- }
- return defaultValue;
- }
-
- /**
- * Gets boolean item.
- *
- * @param identifier the identifier
- * @return the boolean item
- */
- protected boolean getBooleanItem(final int identifier) {
- return this.getBooleanItem(identifier, false);
- }
-
- /**
- * Gets boolean item.
- *
- * @param identifier the identifier
- * @param defaultValue the default value
- * @return the boolean item
- */
- protected boolean getBooleanItem(final int identifier, final boolean defaultValue) {
- if (this.items.containsKey(identifier)) {
- final PSTTableBCItem item = this.items.get(identifier);
- return item.entryValueReference != 0;
- }
- return defaultValue;
- }
-
- /**
- * Gets double item.
- *
- * @param identifier the identifier
- * @return the double item
- */
- protected double getDoubleItem(final int identifier) {
- return this.getDoubleItem(identifier, 0);
- }
-
- /**
- * Gets double item.
- *
- * @param identifier the identifier
- * @param defaultValue the default value
- * @return the double item
- */
- protected double getDoubleItem(final int identifier, final double defaultValue) {
- if (this.items.containsKey(identifier)) {
- final PSTTableBCItem item = this.items.get(identifier);
- final long longVersion = PSTObject.convertLittleEndianBytesToLong(item.data);
- return Double.longBitsToDouble(longVersion);
- }
- return defaultValue;
- }
-
- /**
- * Gets long item.
- *
- * @param identifier the identifier
- * @return the long item
- */
- protected long getLongItem(final int identifier) {
- return this.getLongItem(identifier, 0);
- }
-
- /**
- * Gets long item.
- *
- * @param identifier the identifier
- * @param defaultValue the default value
- * @return the long item
- */
- protected long getLongItem(final int identifier, final long defaultValue) {
- if (this.items.containsKey(identifier)) {
- final PSTTableBCItem item = this.items.get(identifier);
- if (item.entryValueType == 0x0003) {
- // we are really just an int
- return item.entryValueReference;
- } else if (item.entryValueType == 0x0014) {
- // we are a long
- if (item.data != null && item.data.length == 8) {
- return PSTObject.convertLittleEndianBytesToLong(item.data, 0, 8);
- } else {
- System.err.printf("Invalid data length for long id 0x%04X\n", identifier);
- // Return the default value for now...
- }
- }
- }
- return defaultValue;
- }
-
- /**
- * Gets string item.
- *
- * @param identifier the identifier
- * @return the string item
- */
- protected String getStringItem(final int identifier) {
- return this.getStringItem(identifier, 0);
- }
-
- /**
- * Gets string item.
- *
- * @param identifier the identifier
- * @param stringType the string type
- * @return the string item
- */
- protected String getStringItem(final int identifier, final int stringType) {
- return this.getStringItem(identifier, stringType, null);
- }
-
- /**
- * Gets string item.
- *
- * @param identifier the identifier
- * @param stringType the string type
- * @param codepage the codepage
- * @return the string item
- */
- protected String getStringItem(final int identifier, int stringType, String codepage) {
- final PSTTableBCItem item = this.items.get(identifier);
- if (item != null) {
-
- if (codepage == null) {
- codepage = this.getStringCodepage();
- }
-
- // get the string type from the item if not explicitly set
- if (stringType == 0) {
- stringType = item.entryValueType;
- }
-
- // see if there is a descriptor entry
- if (!item.isExternalValueReference) {
- // System.out.println("here: "+new
- // String(item.data)+this.descriptorIndexNode.descriptorIdentifier);
- return PSTObject.createJavaString(item.data, stringType, codepage);
- }
- if (this.localDescriptorItems != null && this.localDescriptorItems.containsKey(item.entryValueReference)) {
- // we have a hit!
- final PSTDescriptorItem descItem = this.localDescriptorItems.get(item.entryValueReference);
-
- try {
- final byte[] data = descItem.getData();
- if (data == null) {
- return "";
- }
-
- return PSTObject.createJavaString(data, stringType, codepage);
- } catch (final Exception e) {
- System.err.printf("Exception %s decoding string %s: %s\n", e.toString(),
- PSTFile.getPropertyDescription(identifier, stringType),
- this.data != null ? this.data.toString() : "null");
- return "";
- }
- // System.out.printf("PSTObject.getStringItem - item isn't a
- // string: 0x%08X\n", identifier);
- // return "";
- }
-
- return PSTObject.createJavaString(this.data, stringType, codepage);
- }
- return "";
- }
-
- /**
- * Create java string string.
- *
- * @param data the data
- * @param stringType the string type
- * @param codepage the codepage
- * @return the string
- */
- static String createJavaString(final byte[] data, final int stringType, String codepage) {
- try {
- if (data==null)
- return "";
-
- if (stringType == 0x1F) {
- return new String(data, "UTF-16LE");
- }
-
- if (codepage == null) {
- return new String(data);
- } else {
- codepage = codepage.toUpperCase(Locale.US);
- if (codepage.contentEquals("ISO-8859-8-I")) { // Outlook hebrew encoding is not supported by Java
- codepage = "ISO-8859-8"; // next best thing is hebrew characters with wrong order
- }
- try {
- return new String(data, codepage);
- } catch (UnsupportedEncodingException e) {
- return new String(data, "UTF-8");
- }
- }
- /*
- * if (codepage == null || codepage.toUpperCase().equals("UTF-8") ||
- * codepage.toUpperCase().equals("UTF-7")) {
- * // PST UTF-8 strings are not... really UTF-8
- * // it seems that they just don't use multibyte chars at all.
- * // indeed, with some crylic chars in there, the difficult chars
- * are just converted to %3F(?)
- * // I suspect that outlook actually uses RTF to store these
- * problematic strings.
- * StringBuffer sbOut = new StringBuffer();
- * for (int x = 0; x < data.length; x++) {
- * sbOut.append((char)(data[x] & 0xFF)); // just blindly accept the
- * byte as a UTF char, seems right half the time
- * }
- * return new String(sbOut);
- * } else {
- * codepage = codepage.toUpperCase();
- * return new String(data, codepage);
- * }
- */
- } catch (final Exception err) {
- System.err.println("Unable to decode string");
- err.printStackTrace();
- return "";
- }
- }
-
- private String codepage=null;
-
- /**
- * Gets string codepage.
- *
- * @return the string codepage
- */
- public String getStringCodepage() {
- if (codepage==null) {
- // try and get the codepage
- PSTTableBCItem cpItem = this.items.get(0x3FFD); // PidTagMessageCodepage
- if (cpItem == null) {
- cpItem = this.items.get(0x66C3); // PidTagCodepage
- if (cpItem == null) {
- cpItem = this.items.get(0x3FDE); // PidTagInternetCodepage
- }
- }
- if (cpItem != null)
- codepage = PSTFile.getInternetCodePageCharset(cpItem.entryValueReference);
- if (codepage==null)
- codepage = pstFile.getGlobalCodepage();
- }
- return codepage;
- }
-
- /**
- * Gets date item.
- *
- * @param identifier the identifier
- * @return the date item
- */
- public Date getDateItem(final int identifier) {
- if (this.items.containsKey(identifier)) {
- final PSTTableBCItem item = this.items.get(identifier);
- if (item.data.length == 0) {
- return new Date(0);
- }
- final int high = (int) PSTObject.convertLittleEndianBytesToLong(item.data, 4, 8);
- final int low = (int) PSTObject.convertLittleEndianBytesToLong(item.data, 0, 4);
-
- return PSTObject.filetimeToDate(high, low);
- }
- return null;
- }
-
- /**
- * Get binary item byte [ ].
- *
- * @param identifier the identifier
- * @return the byte [ ]
- */
- protected byte[] getBinaryItem(final int identifier) {
- if (this.items.containsKey(identifier)) {
- final PSTTableBCItem item = this.items.get(identifier);
- if (item.entryValueType == 0x0102) {
- if (!item.isExternalValueReference) {
- return item.data;
- }
- if (this.localDescriptorItems != null
- && this.localDescriptorItems.containsKey(item.entryValueReference)) {
- // we have a hit!
- final PSTDescriptorItem descItem = this.localDescriptorItems.get(item.entryValueReference);
- try {
- return descItem.getData();
- } catch (final Exception e) {
- System.err.printf("Exception reading binary item: reference 0x%08X\n",
- item.entryValueReference);
-
- return null;
- }
- }
-
- // System.out.println("External reference!!!\n");
- }
- }
- return null;
- }
-
- /**
- * Gets time zone item.
- *
- * @param identifier the identifier
- * @return the time zone item
- */
- protected PSTTimeZone getTimeZoneItem(final int identifier) {
- final byte[] tzData = this.getBinaryItem(identifier);
- if (tzData != null && tzData.length != 0) {
- return new PSTTimeZone(tzData);
- }
- return null;
- }
-
- /**
- * Gets message class.
- *
- * @return the message class
- */
- public String getMessageClass() {
- return this.getStringItem(0x001a);
- }
-
- @Override
- public String toString() {
- return this.localDescriptorItems + "\n" + (this.items);
- }
-
- /**
- * These are the common properties, some don't really appear to be common
- * across folders and emails, but hey
- */
-
- /**
- * get the display name
- *
- * @return the display name
- */
- public String getDisplayName() {
- return this.getStringItem(0x3001);
- }
-
- /**
- * Address type
- * Known values are SMTP, EX (Exchange) and UNKNOWN
- *
- * @return the addr type
- */
- public String getAddrType() {
- return this.getStringItem(0x3002);
- }
-
- /**
- * E-mail address
- *
- * @return the email address
- */
- public String getEmailAddress() {
- return this.getStringItem(0x3003);
- }
-
- /**
- * Comment
- *
- * @return the comment
- */
- public String getComment() {
- return this.getStringItem(0x3004);
- }
-
- /**
- * Creation time
- *
- * @return the creation time
- */
- public Date getCreationTime() {
- return this.getDateItem(0x3007);
- }
-
- /**
- * Modification time
- *
- * @return the last modification time
- */
- public Date getLastModificationTime() {
- return this.getDateItem(0x3008);
- }
-
- /**
- * Static stuff below
- * ------------------
- */
-// substitution table for the compressible encryption type.
- static int[] compEnc = { 0x47, 0xf1, 0xb4, 0xe6, 0x0b, 0x6a, 0x72, 0x48, 0x85, 0x4e, 0x9e, 0xeb, 0xe2, 0xf8, 0x94,
- 0x53, 0xe0, 0xbb, 0xa0, 0x02, 0xe8, 0x5a, 0x09, 0xab, 0xdb, 0xe3, 0xba, 0xc6, 0x7c, 0xc3, 0x10, 0xdd, 0x39,
- 0x05, 0x96, 0x30, 0xf5, 0x37, 0x60, 0x82, 0x8c, 0xc9, 0x13, 0x4a, 0x6b, 0x1d, 0xf3, 0xfb, 0x8f, 0x26, 0x97,
- 0xca, 0x91, 0x17, 0x01, 0xc4, 0x32, 0x2d, 0x6e, 0x31, 0x95, 0xff, 0xd9, 0x23, 0xd1, 0x00, 0x5e, 0x79, 0xdc,
- 0x44, 0x3b, 0x1a, 0x28, 0xc5, 0x61, 0x57, 0x20, 0x90, 0x3d, 0x83, 0xb9, 0x43, 0xbe, 0x67, 0xd2, 0x46, 0x42,
- 0x76, 0xc0, 0x6d, 0x5b, 0x7e, 0xb2, 0x0f, 0x16, 0x29, 0x3c, 0xa9, 0x03, 0x54, 0x0d, 0xda, 0x5d, 0xdf, 0xf6,
- 0xb7, 0xc7, 0x62, 0xcd, 0x8d, 0x06, 0xd3, 0x69, 0x5c, 0x86, 0xd6, 0x14, 0xf7, 0xa5, 0x66, 0x75, 0xac, 0xb1,
- 0xe9, 0x45, 0x21, 0x70, 0x0c, 0x87, 0x9f, 0x74, 0xa4, 0x22, 0x4c, 0x6f, 0xbf, 0x1f, 0x56, 0xaa, 0x2e, 0xb3,
- 0x78, 0x33, 0x50, 0xb0, 0xa3, 0x92, 0xbc, 0xcf, 0x19, 0x1c, 0xa7, 0x63, 0xcb, 0x1e, 0x4d, 0x3e, 0x4b, 0x1b,
- 0x9b, 0x4f, 0xe7, 0xf0, 0xee, 0xad, 0x3a, 0xb5, 0x59, 0x04, 0xea, 0x40, 0x55, 0x25, 0x51, 0xe5, 0x7a, 0x89,
- 0x38, 0x68, 0x52, 0x7b, 0xfc, 0x27, 0xae, 0xd7, 0xbd, 0xfa, 0x07, 0xf4, 0xcc, 0x8e, 0x5f, 0xef, 0x35, 0x9c,
- 0x84, 0x2b, 0x15, 0xd5, 0x77, 0x34, 0x49, 0xb6, 0x12, 0x0a, 0x7f, 0x71, 0x88, 0xfd, 0x9d, 0x18, 0x41, 0x7d,
- 0x93, 0xd8, 0x58, 0x2c, 0xce, 0xfe, 0x24, 0xaf, 0xde, 0xb8, 0x36, 0xc8, 0xa1, 0x80, 0xa6, 0x99, 0x98, 0xa8,
- 0x2f, 0x0e, 0x81, 0x65, 0x73, 0xe4, 0xc2, 0xa2, 0x8a, 0xd4, 0xe1, 0x11, 0xd0, 0x08, 0x8b, 0x2a, 0xf2, 0xed,
- 0x9a, 0x64, 0x3f, 0xc1, 0x6c, 0xf9, 0xec };
-
- /**
- * Output a number in a variety of formats for easier consumption
- *
- * @param pref the prefix string
- * @param number the number
- */
- public static void printFormattedNumber(final String pref, final long number) {
- System.out.print(pref);
- printFormattedNumber(number);
- }
-
- /**
- * Print formatted number.
- *
- * @param number the number
- */
- public static void printFormattedNumber(final long number) {
- System.out.print("dec: ");
- System.out.print(number);
- System.out.print(", hex: ");
- System.out.print(Long.toHexString(number));
- System.out.print(", bin: ");
- System.out.println(Long.toBinaryString(number));
- }
-
- /**
- * Output a dump of data in hex format in the order it was read in
- *
- * @param data the data
- * @param pretty pretty flag
- */
- public static void printHexFormatted(final byte[] data, final boolean pretty) {
- printHexFormatted(data, pretty, new int[0]);
- }
-
- /**
- * Print hex formatted.
- *
- * @param data the data
- * @param pretty the pretty
- * @param indexes the indexes
- */
- protected static void printHexFormatted(final byte[] data, final boolean pretty, final int[] indexes) {
- // groups of two
- if (pretty) {
- System.out.println("---");
- }
- long tmpLongValue;
- String line = "";
- int nextIndex = 0;
- int indexIndex = 0;
- if (indexes.length > 0) {
- nextIndex = indexes[0];
- indexIndex++;
- }
- for (int x = 0; x < data.length; x++) {
- tmpLongValue = (long) data[x] & 0xff;
-
- if (indexes.length > 0 && x == nextIndex && nextIndex < data.length) {
- System.out.print("+");
- line += "+";
- while (indexIndex < indexes.length - 1 && indexes[indexIndex] <= nextIndex) {
- indexIndex++;
- }
- nextIndex = indexes[indexIndex];
- // indexIndex++;
- }
-
- if (Character.isLetterOrDigit((char) tmpLongValue)) {
- line += (char) tmpLongValue;
- } else {
- line += ".";
- }
-
- if (Long.toHexString(tmpLongValue).length() < 2) {
- System.out.print("0");
- }
- System.out.print(Long.toHexString(tmpLongValue));
- if (x % 2 == 1 && pretty) {
- System.out.print(" ");
- }
- if (x % 16 == 15 && pretty) {
- System.out.print(" " + line);
- System.out.println("");
- line = "";
- }
- }
- if (pretty) {
- System.out.println(" " + line);
- System.out.println("---");
- System.out.println(data.length);
- } else {
- }
- }
-
- /**
- * decode a lump of data that has been encrypted with the compressible
- * encryption
- *
- * @param data the data
- * @return decoded data
- */
- protected static byte[] decode(final byte[] data) {
- int temp;
- for (int x = 0; x < data.length; x++) {
- temp = data[x] & 0xff;
- data[x] = (byte) compEnc[temp];
- }
-
- return data;
- }
-
- /**
- * Encode byte [ ].
- *
- * @param data the data
- * @return the byte [ ]
- */
- protected static byte[] encode(final byte[] data) {
- // create the encoding array...
- final int[] enc = new int[compEnc.length];
- for (int x = 0; x < enc.length; x++) {
- enc[compEnc[x]] = x;
- }
-
- // now it's just the same as decode...
- int temp;
- for (int x = 0; x < data.length; x++) {
- temp = data[x] & 0xff;
- data[x] = (byte) enc[temp];
- }
-
- return data;
- }
-
- /**
- * Utility function for converting little endian bytes into a usable java
- * long
- *
- * @param data the data
- * @return long version of the data
- */
- public static long convertLittleEndianBytesToLong(final byte[] data) {
- return convertLittleEndianBytesToLong(data, 0, data.length);
- }
-
- /**
- * Utility function for converting little endian bytes into a usable java
- * long
- *
- * @param data the data
- * @param start the start
- * @param end the end
- * @return long version of the data
- */
- public static long convertLittleEndianBytesToLong(final byte[] data, final int start, final int end) {
-
- long offset = data[end - 1] & 0xff;
- long tmpLongValue;
- for (int x = end - 2; x >= start; x--) {
- offset = offset << 8;
- tmpLongValue = (long) data[x] & 0xff;
- offset |= tmpLongValue;
- }
-
- return offset;
- }
-
- /**
- * Utility function for converting big endian bytes into a usable java long
- *
- * @param data the data
- * @param start the start
- * @param end the end
- * @return long version of the data
- */
- public static long convertBigEndianBytesToLong(final byte[] data, final int start, final int end) {
-
- long offset = 0;
- for (int x = start; x < end; ++x) {
- offset = offset << 8;
- offset |= (data[x] & 0xFFL);
- }
-
- return offset;
- }
- /*
- * protected static boolean isPSTArray(byte[] data) {
- * return (data[0] == 1 && data[1] == 1);
- * }
- * /
- **/
- /*
- * protected static int[] getBlockOffsets(RandomAccessFile in, byte[] data)
- * throws IOException, PSTException
- * {
- * // is the data an array?
- * if (!(data[0] == 1 && data[1] == 1))
- * {
- * throw new
- * PSTException("Unable to process array, does not appear to be one!");
- * }
- *
- * // we are an array!
- * // get the array items and merge them together
- * int numberOfEntries = (int)PSTObject.convertLittleEndianBytesToLong(data,
- * 2, 4);
- * int[] output = new int[numberOfEntries];
- * int tableOffset = 8;
- * int blockOffset = 0;
- * for (int y = 0; y < numberOfEntries; y++) {
- * // get the offset identifier
- * long tableOffsetIdentifierIndex =
- * PSTObject.convertLittleEndianBytesToLong(data, tableOffset,
- * tableOffset+8);
- * // clear the last bit of the identifier. Why so hard?
- * tableOffsetIdentifierIndex = (tableOffsetIdentifierIndex & 0xfffffffe);
- * OffsetIndexItem tableOffsetIdentifier = PSTObject.getOffsetIndexNode(in,
- * tableOffsetIdentifierIndex);
- * blockOffset += tableOffsetIdentifier.size;
- * output[y] = blockOffset;
- * tableOffset += 8;
- * }
- *
- * // replace the item data with the stuff from the array...
- * return output;
- * }
- * /
- **/
-
- /**
- * Detect and load a PST Object from a file with the specified descriptor
- * index
- *
- * @param theFile the the file
- * @param descriptorIndex the descriptor index
- * @return PSTObject with that index
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- public static PSTObject detectAndLoadPSTObject(final PSTFile theFile, final long descriptorIndex)
- throws IOException, PSTException {
- return PSTObject.detectAndLoadPSTObject(theFile, theFile.getDescriptorIndexNode(descriptorIndex));
- }
-
- /**
- * Detect and load a PST Object from a file with the specified descriptor
- * index
- *
- * @param theFile the the file
- * @param folderIndexNode the folder index node
- * @return PSTObject with that index
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- static PSTObject detectAndLoadPSTObject(final PSTFile theFile, final DescriptorIndexNode folderIndexNode)
- throws IOException, PSTException {
- final int nidType = (folderIndexNode.descriptorIdentifier & 0x1F);
- if (nidType == 0x02 || nidType == 0x03 || nidType == 0x04) {
-
- final PSTTableBC table = new PSTTableBC(
- new PSTNodeInputStream(theFile, theFile.getOffsetIndexNode(folderIndexNode.dataOffsetIndexIdentifier)));
-
- HashMap localDescriptorItems = null;
- if (folderIndexNode.localDescriptorsOffsetIndexIdentifier != 0) {
- localDescriptorItems = theFile
- .getPSTDescriptorItems(folderIndexNode.localDescriptorsOffsetIndexIdentifier);
- }
-
- if (nidType == 0x02 || nidType == 0x03) {
- return new PSTFolder(theFile, folderIndexNode, table, localDescriptorItems);
- } else {
- return PSTObject.createAppropriatePSTMessageObject(theFile, folderIndexNode, table,
- localDescriptorItems);
- }
- } else {
- throw new PSTException(
- "Unknown child type with offset id: " + folderIndexNode.localDescriptorsOffsetIndexIdentifier);
- }
- }
-
- /**
- * Create appropriate pst message object pst message.
- *
- * @param theFile the the file
- * @param folderIndexNode the folder index node
- * @param table the table
- * @param localDescriptorItems the local descriptor items
- * @return the pst message
- */
- static PSTMessage createAppropriatePSTMessageObject(final PSTFile theFile,
- final DescriptorIndexNode folderIndexNode, final PSTTableBC table,
- final HashMap localDescriptorItems) {
-
- final PSTTableBCItem item = table.getItems().get(0x001a);
- String messageClass = "";
- if (item != null) {
- messageClass = item.getStringValue("US-ASCII");
- }
-
- if (messageClass.equals("IPM.Note")
- || messageClass.equals("IPM.Note.SMIME.MultipartSigned")) {
- return new PSTMessage(theFile, folderIndexNode, table, localDescriptorItems);
- } else if (messageClass.equals("IPM.Appointment")
- || messageClass.equals("IPM.OLE.CLASS.{00061055-0000-0000-C000-000000000046}")
- || messageClass.startsWith("IPM.Schedule.Meeting")) {
- return new PSTAppointment(theFile, folderIndexNode, table, localDescriptorItems);
- } else if (messageClass.equals("IPM.AbchPerson")) {
- return new PSTContact(theFile, folderIndexNode, table, localDescriptorItems);
- } else if (messageClass.equals("IPM.Contact")) {
- return new PSTContact(theFile, folderIndexNode, table, localDescriptorItems);
- } else if (messageClass.equals("IPM.Task")) {
- return new PSTTask(theFile, folderIndexNode, table, localDescriptorItems);
- } else if (messageClass.equals("IPM.Activity")) {
- return new PSTActivity(theFile, folderIndexNode, table, localDescriptorItems);
- } else if (messageClass.equals("IPM.Post.Rss")) {
- return new PSTRss(theFile, folderIndexNode, table, localDescriptorItems);
- } else if (messageClass.equals("IPM.DistList")) {
- return new PSTDistList(theFile, folderIndexNode, table, localDescriptorItems);
- } else {
- System.err.println("Unknown message type: " + messageClass);
- }
-
- return new PSTMessage(theFile, folderIndexNode, table, localDescriptorItems);
- }
-
- /**
- * Guess pst object type string.
- *
- * @param theFile the the file
- * @param folderIndexNode the folder index node
- * @return the string
- * @throws IOException the io exception
- * @throws PSTException the pst exception
- */
- static String guessPSTObjectType(final PSTFile theFile, final DescriptorIndexNode folderIndexNode)
- throws IOException, PSTException {
-
- final PSTTableBC table = new PSTTableBC(
- new PSTNodeInputStream(theFile, theFile.getOffsetIndexNode(folderIndexNode.dataOffsetIndexIdentifier)));
-
- // get the table items and look at the types we are dealing with
- final Set keySet = table.getItems().keySet();
- final Iterator iterator = keySet.iterator();
-
- while (iterator.hasNext()) {
- final Integer key = iterator.next();
- if (key.intValue() >= 0x0001 && key.intValue() <= 0x0bff) {
- return "Message envelope";
- } else if (key.intValue() >= 0x1000 && key.intValue() <= 0x2fff) {
- return "Message content";
- } else if (key.intValue() >= 0x3400 && key.intValue() <= 0x35ff) {
- return "Message store";
- } else if (key.intValue() >= 0x3600 && key.intValue() <= 0x36ff) {
- return "Folder and address book";
- } else if (key.intValue() >= 0x3700 && key.intValue() <= 0x38ff) {
- return "Attachment";
- } else if (key.intValue() >= 0x3900 && key.intValue() <= 0x39ff) {
- return "Address book";
- } else if (key.intValue() >= 0x3a00 && key.intValue() <= 0x3bff) {
- return "Messaging user";
- } else if (key.intValue() >= 0x3c00 && key.intValue() <= 0x3cff) {
- return "Distribution list";
- }
- }
- return "Unknown";
- }
-
- /**
- * the code below was taken from a random apache project
- * http://www.koders.com/java/fidA9D4930E7443F69F32571905DD4CA01E4D46908C.aspx
- * my bit-shifting isn't that 1337
- */
-
- /**
- *
- * The difference between the Windows epoch (1601-01-01
- * 00:00:00) and the Unix epoch (1970-01-01 00:00:00) in
- * milliseconds: 11644473600000L. (Use your favorite spreadsheet
- * program to verify the correctness of this value. By the way,
- * did you notice that you can tell from the epochs which
- * operating system is the modern one? :-))
- *
- */
- private static final long EPOCH_DIFF = 11644473600000L;
-
- /**
- *
- * Converts a Windows FILETIME into a {@link Date}. The Windows
- * FILETIME structure holds a date and time associated with a
- * file. The structure identifies a 64-bit integer specifying the
- * number of 100-nanosecond intervals which have passed since
- * January 1, 1601. This 64-bit value is split into the two double
- * words stored in the structure.
- *
- *
- * @param high The higher double word of the FILETIME structure.
- * @param low The lower double word of the FILETIME structure.
- * @return The Windows FILETIME as a {@link Date}.
- */
- protected static Date filetimeToDate(final int high, final int low) {
- final long filetime = ((long) high) << 32 | (low & 0xffffffffL);
- // System.out.printf("0x%X\n", filetime);
- final long ms_since_16010101 = filetime / (1000 * 10);
- final long ms_since_19700101 = ms_since_16010101 - EPOCH_DIFF;
- return new Date(ms_since_19700101);
- }
-
- /**
- * Appt time to calendar calendar.
- *
- * @param minutes the minutes
- * @return the calendar
- */
- public static Calendar apptTimeToCalendar(final int minutes) {
- final long ms_since_16010101 = minutes * (60 * 1000L);
- final long ms_since_19700101 = ms_since_16010101 - EPOCH_DIFF;
- final Calendar c = Calendar.getInstance(PSTTimeZone.utcTimeZone);
- c.setTimeInMillis(ms_since_19700101);
- return c;
- }
-
- /**
- * Appt time to utc calendar.
- *
- * @param minutes the minutes
- * @param tz the tz
- * @return the calendar
- */
- public static Calendar apptTimeToUTC(final int minutes, final PSTTimeZone tz) {
- // Must convert minutes since 1/1/1601 in local time to UTC
- // There's got to be a better way of doing this...
- // First get a UTC calendar object that contains _local time_
- final Calendar cUTC = PSTObject.apptTimeToCalendar(minutes);
- if (tz != null) {
- // Create an empty Calendar object with the required time zone
- final Calendar cLocal = Calendar.getInstance(tz.getSimpleTimeZone());
- cLocal.clear();
-
- // Now transfer the local date/time from the UTC calendar object
- // to the object that knows about the time zone...
- cLocal.set(cUTC.get(Calendar.YEAR), cUTC.get(Calendar.MONTH), cUTC.get(Calendar.DATE),
- cUTC.get(Calendar.HOUR_OF_DAY), cUTC.get(Calendar.MINUTE), cUTC.get(Calendar.SECOND));
-
- // Get the true UTC from the local time calendar object.
- // Drop any milliseconds, they won't be printed anyway!
- final long utcs = cLocal.getTimeInMillis() / 1000;
-
- // Finally, set the true UTC in the UTC calendar object
- cUTC.setTimeInMillis(utcs * 1000);
- } // else hope for the best!
-
- return cUTC;
- }
-}
diff --git a/src/main/java/com/pff/PSTRAFileContent.java b/src/main/java/com/pff/PSTRAFileContent.java
deleted file mode 100644
index 1e54dcd..0000000
--- a/src/main/java/com/pff/PSTRAFileContent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.pff;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-public class PSTRAFileContent extends PSTFileContent {
-
- protected RandomAccessFile file;
-
- public PSTRAFileContent(final File file) throws FileNotFoundException {
- this.file = new RandomAccessFile(file, "r");
- }
-
- public RandomAccessFile getFile() {
- return this.file;
- }
-
- public void setFile(final RandomAccessFile file) {
- this.file = file;
- }
-
- @Override
- public void seek(final long index) throws IOException {
- this.file.seek(index);
- }
-
- @Override
- public long getFilePointer() throws IOException {
- return this.file.getFilePointer();
- }
-
- @Override
- public int read() throws IOException {
- return this.file.read();
- }
-
- @Override
- public int read(final byte[] target) throws IOException {
- return this.file.read(target);
- }
-
- @Override
- public byte readByte() throws IOException {
- return this.file.readByte();
- }
-
- @Override
- public void close() throws IOException {
- this.file.close();
- }
-
-}
diff --git a/src/main/java/com/pff/PSTRecipient.java b/src/main/java/com/pff/PSTRecipient.java
deleted file mode 100644
index e44ffcd..0000000
--- a/src/main/java/com/pff/PSTRecipient.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-// import java.util.Date;
-import java.util.HashMap;
-
-/**
- * Class containing recipient information
- *
- * @author Orin Eman
- *
- *
- */
-public class PSTRecipient {
- private final HashMap details;
-
- public static final int MAPI_TO = 1;
- public static final int MAPI_CC = 2;
- public static final int MAPI_BCC = 3;
-
- private PSTMessage message;
-
- PSTRecipient(PSTMessage message,final HashMap recipientDetails) {
- this.message=message;
- this.details = recipientDetails;
- }
-
- public String getDisplayName() {
- return this.getString(0x3001);
- }
-
- public int getRecipientType() {
- return this.getInt(0x0c15);
- }
-
- public String getEmailAddressType() {
- return this.getString(0x3002);
- }
-
- public String getEmailAddress() {
- return this.getString(0x3003);
- }
-
- public int getRecipientFlags() {
- return this.getInt(0x5ffd);
- }
-
- public int getRecipientOrder() {
- return this.getInt(0x5fdf);
- }
-
- public String getSmtpAddress() {
- // If the recipient address type is SMTP,
- // we can simply return the recipient address.
- final String addressType = this.getEmailAddressType();
- if (addressType != null && addressType.equalsIgnoreCase("smtp")) {
- final String addr = this.getEmailAddress();
- if (addr != null && addr.length() != 0) {
- return addr;
- }
- }
- // Otherwise, we have to hope the SMTP address is
- // present as the PidTagPrimarySmtpAddress property.
- return this.getString(0x39FE);
- }
-
- private String getString(final int id) {
- if (this.details.containsKey(id)) {
- final PSTTable7CItem item = this.details.get(id);
- return item.getStringValue(message.getStringCodepage());
- }
-
- return "";
- }
-
- /*
- * private boolean getBoolean(int id) {
- * if ( details.containsKey(id) ) {
- * PSTTable7CItem item = details.get(id);
- * if ( item.entryValueType == 0x000B )
- * {
- * return (item.entryValueReference & 0xFF) == 0 ? false : true;
- * }
- * }
- *
- * return false;
- * }
- */
- private int getInt(final int id) {
- if (this.details.containsKey(id)) {
- final PSTTable7CItem item = this.details.get(id);
- if (item.entryValueType == 0x0003) {
- return item.entryValueReference;
- }
-
- if (item.entryValueType == 0x0002) {
- final short s = (short) item.entryValueReference;
- return s;
- }
- }
-
- return 0;
- }
-
- /*
- * private Date getDate(int id) {
- * long lDate = 0;
- *
- * if ( details.containsKey(id) ) {
- * PSTTable7CItem item = details.get(id);
- * if ( item.entryValueType == 0x0040 ) {
- * int high = (int)PSTObject.convertLittleEndianBytesToLong(item.data, 4,
- * 8);
- * int low = (int)PSTObject.convertLittleEndianBytesToLong(item.data, 0, 4);
- *
- * return PSTObject.filetimeToDate(high, low);
- * }
- * }
- * return new Date(lDate);
- * }
- */
-}
diff --git a/src/main/java/com/pff/PSTRss.java b/src/main/java/com/pff/PSTRss.java
deleted file mode 100644
index cac438d..0000000
--- a/src/main/java/com/pff/PSTRss.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.IOException;
-import java.util.HashMap;
-
-/**
- * Object that represents a RSS item
- *
- * @author Richard Johnson
- */
-public class PSTRss extends PSTMessage {
-
- /**
- * Instantiates a new Pst rss.
- *
- * @param theFile the the file
- * @param descriptorIndexNode the descriptor index node
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTRss(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode)
- throws PSTException, IOException {
- super(theFile, descriptorIndexNode);
- }
-
- /**
- * Instantiates a new Pst rss.
- *
- * @param theFile the the file
- * @param folderIndexNode the folder index node
- * @param table the table
- * @param localDescriptorItems the local descriptor items
- */
- public PSTRss(final PSTFile theFile, final DescriptorIndexNode folderIndexNode, final PSTTableBC table,
- final HashMap localDescriptorItems) {
- super(theFile, folderIndexNode, table, localDescriptorItems);
- }
-
- /**
- * Channel
- *
- * @return the post rss channel link
- */
- public String getPostRssChannelLink() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008900, PSTFile.PSETID_PostRss));
- }
-
- /**
- * Item link
- *
- * @return the post rss item link
- */
- public String getPostRssItemLink() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008901, PSTFile.PSETID_PostRss));
- }
-
- /**
- * Item hash Integer 32-bit signed
- *
- * @return the post rss item hash
- */
- public int getPostRssItemHash() {
- return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008902, PSTFile.PSETID_PostRss));
- }
-
- /**
- * Item GUID
- *
- * @return the post rss item guid
- */
- public String getPostRssItemGuid() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008903, PSTFile.PSETID_PostRss));
- }
-
- /**
- * Channel GUID
- *
- * @return the post rss channel
- */
- public String getPostRssChannel() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008904, PSTFile.PSETID_PostRss));
- }
-
- /**
- * Item XML
- *
- * @return the post rss item xml
- */
- public String getPostRssItemXml() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008905, PSTFile.PSETID_PostRss));
- }
-
- /**
- * Subscription
- *
- * @return the post rss subscription
- */
- public String getPostRssSubscription() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008906, PSTFile.PSETID_PostRss));
- }
-
- @Override
- public String toString() {
- return "Channel ASCII or Unicode string values: " + this.getPostRssChannelLink() + "\n"
- + "Item link ASCII or Unicode string values: " + this.getPostRssItemLink() + "\n"
- + "Item hash Integer 32-bit signed: " + this.getPostRssItemHash() + "\n"
- + "Item GUID ASCII or Unicode string values: " + this.getPostRssItemGuid() + "\n"
- + "Channel GUID ASCII or Unicode string values: " + this.getPostRssChannel() + "\n"
- + "Item XML ASCII or Unicode string values: " + this.getPostRssItemXml() + "\n"
- + "Subscription ASCII or Unicode string values: " + this.getPostRssSubscription();
- }
-}
diff --git a/src/main/java/com/pff/PSTTable.java b/src/main/java/com/pff/PSTTable.java
deleted file mode 100644
index 4369166..0000000
--- a/src/main/java/com/pff/PSTTable.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.IOException;
-import java.util.HashMap;
-
-/**
- * The PST Table is the workhorse of the whole system.
- * It allows for an item to be read and broken down into the individual
- * properties that it consists of.
- * For most PST Objects, it appears that only 7c and bc table types are used.
- *
- * @author Richard Johnson
- */
-class PSTTable {
-
- protected String tableType;
- protected byte tableTypeByte;
- protected int hidUserRoot;
-
- protected Long[] arrayBlocks = null;
-
- // info from the b5 header
- protected int sizeOfItemKey;
- protected int sizeOfItemValue;
- protected int hidRoot;
- protected int numberOfKeys = 0;
- protected int numberOfIndexLevels = 0;
-
- private final PSTNodeInputStream in;
-
- // private int[][] rgbiAlloc = null;
- // private byte[] data = null;
- private HashMap subNodeDescriptorItems = null;
-
- protected String description = "";
-
- protected PSTTable(final PSTNodeInputStream in, final HashMap subNodeDescriptorItems)
- throws PSTException, IOException {
- this.subNodeDescriptorItems = subNodeDescriptorItems;
- this.in = in;
-
- this.arrayBlocks = in.getBlockOffsets();
-
- // the next two bytes should be the table type (bSig)
- // 0xEC is HN (Heap-on-Node)
- in.seek(0);
- final byte[] headdata = new byte[4];
- in.readCompletely(headdata);
- if (headdata[2] != 0xffffffec) {
- // System.out.println(in.isEncrypted());
- PSTObject.decode(headdata);
- PSTObject.printHexFormatted(headdata, true);
- throw new PSTException("Unable to parse table, bad table type...");
- }
-
- this.tableTypeByte = headdata[3];
- switch (this.tableTypeByte) { // bClientSig
- case 0x7c: // Table Context (TC/HN)
- this.tableType = "7c";
- break;
- // case 0x9c:
- // tableType = "9c";
- // valid = true;
- // break;
- // case 0xa5:
- // tableType = "a5";
- // valid = true;
- // break;
- // case 0xac:
- // tableType = "ac";
- // valid = true;
- // break;
- // case 0xFFFFFFb5: // BTree-on-Heap (BTH)
- // tableType = "b5";
- // valid = true;
- // break;
- case 0xffffffbc:
- this.tableType = "bc"; // Property Context (PC/BTH)
- break;
- default:
- throw new PSTException(
- "Unable to parse table, bad table type. Unknown identifier: 0x" + Long.toHexString(headdata[3]));
- }
-
- this.hidUserRoot = (int) in.seekAndReadLong(4, 4); // hidUserRoot
- /*
- * System.out.printf("Table %s: hidUserRoot 0x%08X\n", tableType,
- * hidUserRoot);
- * /
- **/
-
- // all tables should have a BTHHEADER at hnid == 0x20
- final NodeInfo headerNodeInfo = this.getNodeInfo(0x20);
- headerNodeInfo.in.seek(headerNodeInfo.startOffset);
- int headerByte = headerNodeInfo.in.read() & 0xFF;
- if (headerByte != 0xb5) {
- headerNodeInfo.in.seek(headerNodeInfo.startOffset);
- headerByte = headerNodeInfo.in.read() & 0xFF;
- headerNodeInfo.in.seek(headerNodeInfo.startOffset);
- final byte[] tmp = new byte[1024];
- headerNodeInfo.in.readCompletely(tmp);
- PSTObject.printHexFormatted(tmp, true);
- // System.out.println(PSTObject.compEnc[headerByte]);
- throw new PSTException("Unable to parse table, can't find BTHHEADER header information: " + headerByte);
- }
-
- this.sizeOfItemKey = headerNodeInfo.in.read() & 0xFF; // Size of key in
- // key table
- this.sizeOfItemValue = headerNodeInfo.in.read() & 0xFF; // Size of value
- // in key table
-
- this.numberOfIndexLevels = headerNodeInfo.in.read() & 0xFF;
- if (this.numberOfIndexLevels != 0) {
- // System.out.println(this.tableType);
- // System.out.printf("Table with %d index levels\n",
- // numberOfIndexLevels);
- }
- // hidRoot = (int)PSTObject.convertLittleEndianBytesToLong(nodeInfo, 4,
- // 8); // hidRoot
- this.hidRoot = (int) headerNodeInfo.seekAndReadLong(4, 4);
- // System.out.println(hidRoot);
- // System.exit(0);
- /*
- * System.out.printf("Table %s: hidRoot 0x%08X\n", tableType, hidRoot);
- * /
- **/
- this.description += "Table (" + this.tableType + ")\n" + "hidUserRoot: " + this.hidUserRoot + " - 0x"
- + Long.toHexString(this.hidUserRoot) + "\n" + "Size Of Keys: " + this.sizeOfItemKey + " - 0x"
- + Long.toHexString(this.sizeOfItemKey) + "\n" + "Size Of Values: " + this.sizeOfItemValue + " - 0x"
- + Long.toHexString(this.sizeOfItemValue) + "\n" + "hidRoot: " + this.hidRoot + " - 0x"
- + Long.toHexString(this.hidRoot) + "\n";
- }
-
- protected void releaseRawData() {
- this.subNodeDescriptorItems = null;
- }
-
- /**
- * get the number of items stored in this table.
- *
- * @return row count
- */
- public int getRowCount() {
- return this.numberOfKeys;
- }
-
- class NodeInfo {
- int startOffset;
- int endOffset;
- // byte[] data;
- PSTNodeInputStream in;
-
- NodeInfo(final int start, final int end, final PSTNodeInputStream in) throws PSTException {
- if (start > end) {
- throw new PSTException(
- String.format("Invalid NodeInfo parameters: start %1$d is greater than end %2$d", start, end));
- }
- this.startOffset = start;
- this.endOffset = end;
- this.in = in;
- // this.data = data;
- }
-
- int length() {
- return this.endOffset - this.startOffset;
- }
-
- long seekAndReadLong(final long offset, final int length) throws IOException, PSTException {
- return this.in.seekAndReadLong(this.startOffset + offset, length);
- }
- }
-
- protected NodeInfo getNodeInfo(final int hnid) throws PSTException, IOException {
-
- // Zero-length node?
- if (hnid == 0) {
- return new NodeInfo(0, 0, this.in);
- }
-
- // Is it a subnode ID?
- if (this.subNodeDescriptorItems != null && this.subNodeDescriptorItems.containsKey(hnid)) {
- final PSTDescriptorItem item = this.subNodeDescriptorItems.get(hnid);
- // byte[] data;
- NodeInfo subNodeInfo = null;
-
- try {
- // data = item.getData();
- final PSTNodeInputStream subNodeIn = new PSTNodeInputStream(this.in.getPSTFile(), item);
- subNodeInfo = new NodeInfo(0, (int) subNodeIn.length(), subNodeIn);
- } catch (final IOException e) {
- throw new PSTException(String.format("IOException reading subNode: 0x%08X", hnid));
- }
-
- // return new NodeInfo(0, data.length, data);
- return subNodeInfo;
- }
-
- if ((hnid & 0x1F) != 0) {
- // Some kind of external node
- return null;
- }
-
- final int whichBlock = (hnid >>> 16);
- if (whichBlock > this.arrayBlocks.length) {
- // Block doesn't exist!
- String err = String.format("getNodeInfo: block doesn't exist! hnid = 0x%08X\n", hnid);
- err += String.format("getNodeInfo: block doesn't exist! whichBlock = 0x%08X\n", whichBlock);
- err += "\n" + (this.arrayBlocks.length);
- throw new PSTException(err);
- // return null;
- }
-
- // A normal node in a local heap
- final int index = (hnid & 0xFFFF) >> 5;
- int blockOffset = 0;
- if (whichBlock > 0) {
- blockOffset = this.arrayBlocks[whichBlock - 1].intValue();
- }
- // Get offset of HN page map
- int iHeapNodePageMap = (int) this.in.seekAndReadLong(blockOffset, 2) + blockOffset;
- final int cAlloc = (int) this.in.seekAndReadLong(iHeapNodePageMap, 2);
- if (index >= cAlloc + 1) {
- throw new PSTException(String.format("getNodeInfo: node index doesn't exist! nid = 0x%08X\n", hnid));
- // return null;
- }
- iHeapNodePageMap += (2 * index) + 2;
- final int start = (int) this.in.seekAndReadLong(iHeapNodePageMap, 2) + blockOffset;
- final int end = (int) this.in.seekAndReadLong(iHeapNodePageMap + 2, 2) + blockOffset;
-
- final NodeInfo out = new NodeInfo(start, end, this.in);
- return out;
- }
-
-}
diff --git a/src/main/java/com/pff/PSTTable7C.java b/src/main/java/com/pff/PSTTable7C.java
deleted file mode 100644
index f9a24d0..0000000
--- a/src/main/java/com/pff/PSTTable7C.java
+++ /dev/null
@@ -1,465 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.IOException;
-/*
- * import java.io.UnsupportedEncodingException;
- * /
- **/
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import static com.pff.PSTFile.PST_TYPE_ANSI;
-
-/**
- * Specific functions for the 7c table type ("Table Context").
- * This is used for attachments.
- *
- * @author Richard Johnson
- */
-class PSTTable7C extends PSTTable {
-
- private int BLOCK_SIZE = 8176;
-
- private List> items = null;
- private int numberOfDataSets = 0;
- private int cCols = 0;
- private int TCI_bm = 0;
- private NodeInfo rowNodeInfo = null;
- private int TCI_1b = 0;
- private int overrideCol = -1;
-
- protected PSTTable7C(final PSTNodeInputStream in, final HashMap subNodeDescriptorItems)
- throws PSTException, java.io.IOException {
- this(in, subNodeDescriptorItems, -1);
- }
-
- protected PSTTable7C(final PSTNodeInputStream in, final HashMap subNodeDescriptorItems,
- final int entityToExtract) throws PSTException, java.io.IOException {
- super(in, subNodeDescriptorItems);
-
- if (this.tableTypeByte != 0x7c) {
- // System.out.println(Long.toHexString(this.tableTypeByte));
- throw new PSTException("unable to create PSTTable7C, table does not appear to be a 7c!");
- }
-
- // TCINFO header is in the hidUserRoot node
- // byte[] tcHeaderNode = getNodeInfo(hidUserRoot);
- final NodeInfo tcHeaderNode = this.getNodeInfo(this.hidUserRoot);
- int offset = 0;
-
- // get the TCINFO header information
- // int cCols =
- // (int)PSTObject.convertLittleEndianBytesToLong(tcHeaderNode, offset+1,
- // offset+2);
- this.cCols = (int) tcHeaderNode.seekAndReadLong(offset + 1, 1);
- @SuppressWarnings("unused")
- final
- // int TCI_4b =
- // (int)PSTObject.convertLittleEndianBytesToLong(tcHeaderNode, offset+2,
- // offset+4);
- int TCI_4b = (int) tcHeaderNode.seekAndReadLong(offset + 2, 2);
- @SuppressWarnings("unused")
- final
- // int TCI_2b =
- // (int)PSTObject.convertLittleEndianBytesToLong(tcHeaderNode, offset+4,
- // offset+6);
- int TCI_2b = (int) tcHeaderNode.seekAndReadLong(offset + 4, 2);
- // int TCI_1b =
- // (int)PSTObject.convertLittleEndianBytesToLong(tcHeaderNode, offset+6,
- // offset+8);
- this.TCI_1b = (int) tcHeaderNode.seekAndReadLong(offset + 6, 2);
- // int TCI_bm =
- // (int)PSTObject.convertLittleEndianBytesToLong(tcHeaderNode, offset+8,
- // offset+10);
- this.TCI_bm = (int) tcHeaderNode.seekAndReadLong(offset + 8, 2);
- // int hidRowIndex =
- // (int)PSTObject.convertLittleEndianBytesToLong(tcHeaderNode,
- // offset+10, offset+14);
- final int hidRowIndex = (int) tcHeaderNode.seekAndReadLong(offset + 10, 4);
- // int hnidRows =
- // (int)PSTObject.convertLittleEndianBytesToLong(tcHeaderNode,
- // offset+14, offset+18);// was 18
- final int hnidRows = (int) tcHeaderNode.seekAndReadLong(offset + 14, 4);
- // 18..22 hidIndex - deprecated
-
- // 22... column descriptors
- offset += 22;
- if (this.cCols != 0) {
- this.columnDescriptors = new ColumnDescriptor[this.cCols];
-
- for (int col = 0; col < this.cCols; ++col) {
- // columnDescriptors[col] = new ColumnDescriptor(tcHeaderNode,
- // offset);
- this.columnDescriptors[col] = new ColumnDescriptor(tcHeaderNode, offset);
- // System.out.println("iBit: "+col+" "
- // +columnDescriptors[col].iBit);
- if (this.columnDescriptors[col].id == entityToExtract) {
- this.overrideCol = col;
- }
- offset += 8;
- }
- }
-
- // if we are asking for a specific column, only get that!
- if (this.overrideCol > -1) {
- this.cCols = this.overrideCol + 1;
- }
-
- // Read the key table
- /* System.out.printf("Key table:\n"); / **/
- this.keyMap = new HashMap<>();
- // byte[] keyTableInfo = getNodeInfo(hidRoot);
- final NodeInfo keyTableInfo = this.getNodeInfo(this.hidRoot);
- this.numberOfKeys = keyTableInfo.length() / (this.sizeOfItemKey + this.sizeOfItemValue);
- offset = 0;
- for (int x = 0; x < this.numberOfKeys; x++) {
- final int Context = (int) keyTableInfo.seekAndReadLong(offset, this.sizeOfItemKey);
- offset += this.sizeOfItemKey;
- final int RowIndex = (int) keyTableInfo.seekAndReadLong(offset, this.sizeOfItemValue);
- offset += this.sizeOfItemValue;
- this.keyMap.put(Context, RowIndex);
- }
-
- if (in.getPSTFile().getPSTFileType()==PST_TYPE_ANSI)
- BLOCK_SIZE=8180;
- else
- BLOCK_SIZE=8176;
-
- // Read the Row Matrix
- this.rowNodeInfo = this.getNodeInfo(hnidRows);
- // numberOfDataSets = (rowNodeInfo.endOffset - rowNodeInfo.startOffset)
- // / TCI_bm;
-
- this.description += "Number of keys: " + this.numberOfKeys + "\n" + "Number of columns: " + this.cCols + "\n"
- + "Row Size: " + this.TCI_bm + "\n" + "hidRowIndex: " + hidRowIndex + "\n" + "hnidRows: " + hnidRows + "\n";
-
- final int numberOfBlocks = this.rowNodeInfo.length() / this.BLOCK_SIZE;
- final int numberOfRowsPerBlock = this.BLOCK_SIZE / this.TCI_bm;
- @SuppressWarnings("unused")
- final int blockPadding = this.BLOCK_SIZE - (numberOfRowsPerBlock * this.TCI_bm);
- this.numberOfDataSets = (numberOfBlocks * numberOfRowsPerBlock)
- + ((this.rowNodeInfo.length() % this.BLOCK_SIZE) / this.TCI_bm);
- }
-
- /**
- * get all the items parsed out of this table.
- *
- * @return items
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- List> getItems() throws PSTException, IOException {
- if (this.items == null) {
- this.items = this.getItems(-1, -1);
- }
- return this.items;
- }
-
- List> getItems(int startAtRecord, int numberOfRecordsToReturn)
- throws PSTException, IOException {
- final List> itemList = new ArrayList<>();
-
- // okay, work out the number of records we have
- final int numberOfBlocks = this.rowNodeInfo.length() / this.BLOCK_SIZE;
- final int numberOfRowsPerBlock = this.BLOCK_SIZE / this.TCI_bm;
- final int blockPadding = this.BLOCK_SIZE - (numberOfRowsPerBlock * this.TCI_bm);
- this.numberOfDataSets = (numberOfBlocks * numberOfRowsPerBlock)
- + ((this.rowNodeInfo.length() % this.BLOCK_SIZE) / this.TCI_bm);
-
- if (startAtRecord == -1) {
- numberOfRecordsToReturn = this.numberOfDataSets;
- startAtRecord = 0;
- }
-
- // repeat the reading process for every dataset
- int currentValueArrayStart = ((startAtRecord / numberOfRowsPerBlock) * this.BLOCK_SIZE)
- + ((startAtRecord % numberOfRowsPerBlock) * this.TCI_bm);
-
- if (numberOfRecordsToReturn > this.getRowCount() - startAtRecord) {
- numberOfRecordsToReturn = this.getRowCount() - startAtRecord;
- }
-
- int dataSetNumber = 0;
- // while ( currentValueArrayStart + ((cCols+7)/8) + TCI_1b <=
- // rowNodeInfo.length())
- for (int rowCounter = 0; rowCounter < numberOfRecordsToReturn; rowCounter++) {
- final HashMap currentItem = new HashMap<>();
- // to respect block boundaries
- currentValueArrayStart = (((startAtRecord+rowCounter) / numberOfRowsPerBlock) * this.BLOCK_SIZE)
- + (((startAtRecord+rowCounter) % numberOfRowsPerBlock) * this.TCI_bm);
-
- final byte[] bitmap = new byte[(this.cCols + 7) / 8];
-
- this.rowNodeInfo.in.seek(this.rowNodeInfo.startOffset + currentValueArrayStart + this.TCI_1b);
- this.rowNodeInfo.in.readCompletely(bitmap);
-
- final int id = (int) this.rowNodeInfo.seekAndReadLong(currentValueArrayStart, 4);
-
- // Put into the item map as PidTagLtpRowId (0x67F2)
- PSTTable7CItem item = new PSTTable7CItem();
- item.itemIndex = -1;
- item.entryValueType = 3;
- item.entryType = 0x67F2;
- item.entryValueReference = id;
- item.isExternalValueReference = true;
- currentItem.put(item.entryType, item);
-
- int col = 0;
- if (this.overrideCol > -1) {
- col = this.overrideCol;
- }
- for (; col < this.cCols; ++col) {
- // Does this column exist for this row?
- final int bitIndex = this.columnDescriptors[col].iBit / 8;
- final int bit = this.columnDescriptors[col].iBit % 8;
- if (bitIndex >= bitmap.length || (bitmap[bitIndex] & (1 << bit)) == 0) {
- // Column doesn't exist
- // System.out.printf("Col %d (0x%04X) not present\n", col,
- // columnDescriptors[col].id); /**/
-
- continue;
- }
-
- item = new PSTTable7CItem();
- item.itemIndex = col;
-
- item.entryValueType = this.columnDescriptors[col].type;
- item.entryType = this.columnDescriptors[col].id;
- item.entryValueReference = 0;
-
- switch (this.columnDescriptors[col].cbData) {
- case 1: // Single byte data
- // item.entryValueReference =
- // rowNodeInfo[currentValueArrayStart+columnDescriptors[col].ibData]
- // & 0xFF;
- item.entryValueReference = (int) this.rowNodeInfo
- .seekAndReadLong(currentValueArrayStart + this.columnDescriptors[col].ibData, 1) & 0xFF;
- item.isExternalValueReference = true;
- /*
- * System.out.printf("\tboolean: %s %s\n",
- * PSTFile.getPropertyDescription(item.entryType,
- * item.entryValueType),
- * item.entryValueReference == 0 ? "false" : "true");
- * /
- **/
- break;
-
- case 2: // Two byte data
- /*
- * item.entryValueReference =
- * (rowNodeInfo[currentValueArrayStart+columnDescriptors[col
- * ].ibData] & 0xFF) |
- * ((rowNodeInfo[currentValueArrayStart+columnDescriptors[
- * col].ibData+1] & 0xFF) << 8);
- */
- item.entryValueReference = (int) this.rowNodeInfo
- .seekAndReadLong(currentValueArrayStart + this.columnDescriptors[col].ibData, 2) & 0xFFFF;
- item.isExternalValueReference = true;
- /*
- * short i16 = (short)item.entryValueReference;
- * System.out.printf("\tInteger16: %s %d\n",
- * PSTFile.getPropertyDescription(item.entryType,
- * item.entryValueType),
- * i16);
- * /
- **/
- break;
-
- case 8: // 8 byte data
- item.data = new byte[8];
- // System.arraycopy(rowNodeInfo,
- // currentValueArrayStart+columnDescriptors[col].ibData,
- // item.data, 0, 8);
- this.rowNodeInfo.in.seek(
- this.rowNodeInfo.startOffset + currentValueArrayStart + this.columnDescriptors[col].ibData);
- this.rowNodeInfo.in.readCompletely(item.data);
- /*
- * System.out.printf("\tInteger64: %s\n",
- * PSTFile.getPropertyDescription(item.entryType,
- * item.entryValueType)); /
- **/
- break;
-
- default:// Four byte data
-
- /*
- * if (numberOfIndexLevels > 0 ) {
- * System.out.println("here");
- * System.out.println(rowNodeInfo.length());
- * PSTObject.printHexFormatted(rowNodeInfo, true);
- * System.exit(0);
- * }
- */
-
- // item.entryValueReference =
- // (int)PSTObject.convertLittleEndianBytesToLong(rowNodeInfo,
- // currentValueArrayStart+columnDescriptors[col].ibData,
- // currentValueArrayStart+columnDescriptors[col].ibData+4);
- item.entryValueReference = (int) this.rowNodeInfo
- .seekAndReadLong(currentValueArrayStart + this.columnDescriptors[col].ibData, 4);
- if (this.columnDescriptors[col].type == 0x0003 || this.columnDescriptors[col].type == 0x0004
- || this.columnDescriptors[col].type == 0x000A) {
- // True 32bit data
- item.isExternalValueReference = true;
- /*
- * System.out.printf("\tInteger32: %s %d\n",
- * PSTFile.getPropertyDescription(item.entryType,
- * item.entryValueType),
- * item.entryValueReference); /
- **/
- break;
- }
-
- // Variable length data so it's an hnid
- if ((item.entryValueReference & 0x1F) != 0) {
- // Some kind of external reference...
- item.isExternalValueReference = true;
- /*
- * System.out.printf("\tOther: %s 0x%08X\n",
- * PSTFile.getPropertyDescription(item.entryType,
- * item.entryValueType), item.entryValueReference); /
- **/
- break;
- }
-
- if (item.entryValueReference == 0) {
- /*
- * System.out.printf("\tOther: %s 0 bytes\n",
- * PSTFile.getPropertyDescription(item.entryType,
- * item.entryValueType)); /
- **/
- item.data = new byte[0];
- break;
- } else {
- final NodeInfo entryInfo = this.getNodeInfo(item.entryValueReference);
- item.data = new byte[entryInfo.length()];
- // System.arraycopy(entryInfo, 0, item.data, 0,
- // item.data.length);
- entryInfo.in.seek(entryInfo.startOffset);
- entryInfo.in.readCompletely(item.data);
- }
- /*
- * if ( item.entryValueType != 0x001F ) {
- * System.out.printf("\tOther: %s %d bytes\n",
- * PSTFile.getPropertyDescription(item.entryType,
- * item.entryValueType),
- * item.data.length);
- * } else {
- * try {
- * String s = new String(item.data, "UTF-16LE");
- * System.out.printf("\tString: %s \"%s\"\n",
- * PSTFile.getPropertyDescription(item.entryType,
- * item.entryValueType),
- * s);
- * } catch (UnsupportedEncodingException e) {
- * e.printStackTrace();
- * }
- * }
- * /
- **/
- break;
- }
-
- currentItem.put(item.entryType, item);
-
- // description += item.toString()+"\n\n";
- }
- itemList.add(dataSetNumber, currentItem);
- dataSetNumber++;
- }
-
- // System.out.println(description);
-
- return itemList;
- }
-
- class ColumnDescriptor {
- ColumnDescriptor(final NodeInfo nodeInfo, final int offset) throws PSTException, IOException {
- // type = (int)(PSTObject.convertLittleEndianBytesToLong(data,
- // offset, offset+2) & 0xFFFF);
- this.type = ((int) nodeInfo.seekAndReadLong(offset, 2) & 0xFFFF);
- // id = (int)(PSTObject.convertLittleEndianBytesToLong(data,
- // offset+2, offset+4) & 0xFFFF);
- this.id = (int) (nodeInfo.seekAndReadLong(offset + 2, 2) & 0xFFFF);
- // ibData = (int)(PSTObject.convertLittleEndianBytesToLong(data,
- // offset+4, offset+6) & 0xFFFF);
- this.ibData = (int) (nodeInfo.seekAndReadLong(offset + 4, 2) & 0xFFFF);
- // cbData = (int)data[offset+6] & 0xFF;
- this.cbData = nodeInfo.in.read() & 0xFF;
- // iBit = (int)data[offset+7] & 0xFF;
- this.iBit = nodeInfo.in.read() & 0xFF;
- }
-
- int type;
- int id;
- int ibData;
- int cbData;
- int iBit;
- }
-
- @Override
- public int getRowCount() {
- return this.numberOfDataSets;
- }
-
- /*
- * Not used...
- * public HashMap getItem(int itemNumber) {
- * if ( items == null || itemNumber >= items.size() ) {
- * return null;
- * }
- *
- * return items.get(itemNumber);
- * }
- * /
- **/
- @Override
- public String toString() {
- return this.description;
- }
-
- public String getItemsString() {
- if (this.items == null) {
- return "";
- }
-
- return this.items.toString();
- }
-
- ColumnDescriptor[] columnDescriptors = null;
- HashMap keyMap = null;
-}
diff --git a/src/main/java/com/pff/PSTTable7CItem.java b/src/main/java/com/pff/PSTTable7CItem.java
deleted file mode 100644
index b591144..0000000
--- a/src/main/java/com/pff/PSTTable7CItem.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-/**
- * Items found in the 7c tables
- *
- * @author Richard Johnson
- */
-class PSTTable7CItem extends PSTTableItem {
-
- @Override
- public String toString() {
- return "7c Table Item: " + super.toString() + "\n";
- }
-}
diff --git a/src/main/java/com/pff/PSTTableBC.java b/src/main/java/com/pff/PSTTableBC.java
deleted file mode 100644
index da2bbd1..0000000
--- a/src/main/java/com/pff/PSTTableBC.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.util.HashMap;
-
-/**
- * The BC Table type. (Property Context)
- * Used by pretty much everything.
- *
- * @author Richard Johnson
- */
-class PSTTableBC extends PSTTable {
-
- private final HashMap items = new HashMap<>();
-
- private final StringBuilder descBuffer = new StringBuilder();
- private boolean isDescNotYetInitiated = false;
-
- PSTTableBC(final PSTNodeInputStream in) throws PSTException, java.io.IOException {
- super(in, new HashMap());
- // data = null; // No direct access to data!
-
- if (this.tableTypeByte != 0xffffffbc) {
- // System.out.println(Long.toHexString(this.tableTypeByte));
- throw new PSTException("unable to create PSTTableBC, table does not appear to be a bc!");
- }
-
- // go through each of the entries.
- // byte[] keyTableInfo = getNodeInfo(hidRoot);
- final NodeInfo keyTableInfoNodeInfo = this.getNodeInfo(this.hidRoot);
- final byte[] keyTableInfo = new byte[keyTableInfoNodeInfo.length()];
- keyTableInfoNodeInfo.in.seek(keyTableInfoNodeInfo.startOffset);
- keyTableInfoNodeInfo.in.readCompletely(keyTableInfo);
-
- // PSTObject.printHexFormatted(keyTableInfo, true);
- // System.out.println(in.length());
- // System.exit(0);
- this.numberOfKeys = keyTableInfo.length / (this.sizeOfItemKey + this.sizeOfItemValue);
-
- this.descBuffer.append("Number of entries: " + this.numberOfKeys + "\n");
-
- // Read the key table
- int offset = 0;
- for (int x = 0; x < this.numberOfKeys; x++) {
-
- final PSTTableBCItem item = new PSTTableBCItem();
- item.itemIndex = x;
- item.entryType = (int) PSTObject.convertLittleEndianBytesToLong(keyTableInfo, offset + 0, offset + 2);
- // item.entryType =(int)in.seekAndReadLong(offset, 2);
- item.entryValueType = (int) PSTObject.convertLittleEndianBytesToLong(keyTableInfo, offset + 2, offset + 4);
- // item.entryValueType = (int)in.seekAndReadLong(offset+2, 2);
- item.entryValueReference = (int) PSTObject.convertLittleEndianBytesToLong(keyTableInfo, offset + 4,
- offset + 8);
- // item.entryValueReference = (int)in.seekAndReadLong(offset+4, 4);
-
- // Data is in entryValueReference for all types <= 4 bytes long
- switch (item.entryValueType) {
-
- case 0x0002: // 16bit integer
- item.entryValueReference &= 0xFFFF;
- case 0x0003: // 32bit integer
- case 0x000A: // 32bit error code
- /*
- * System.out.printf("Integer%s: 0x%04X:%04X, %d\n",
- * (item.entryValueType == 0x0002) ? "16" : "32",
- * item.entryType, item.entryValueType,
- * item.entryValueReference);
- * /
- **/
- case 0x0001: // Place-holder
- case 0x0004: // 32bit floating
- item.isExternalValueReference = true;
- break;
-
- case 0x000b: // Boolean - a single byte
- item.entryValueReference &= 0xFF;
- /*
- * System.out.printf("boolean: 0x%04X:%04X, %s\n",
- * item.entryType, item.entryValueType,
- * (item.entryValueReference == 0) ? "false" : "true");
- * /
- **/
- item.isExternalValueReference = true;
- break;
-
- case 0x000D:
- default:
- // Is it in the local heap?
- item.isExternalValueReference = true; // Assume not
- // System.out.println(item.entryValueReference);
- // byte[] nodeInfo = getNodeInfo(item.entryValueReference);
- final NodeInfo nodeInfoNodeInfo = this.getNodeInfo(item.entryValueReference);
- if (nodeInfoNodeInfo == null) {
- // It's an external reference that we don't deal with here.
- /*
- * System.out.printf("%s: %shid 0x%08X\n",
- * (item.entryValueType == 0x1f || item.entryValueType ==
- * 0x1e) ? "String" : "Other",
- * PSTFile.getPropertyDescription(item.entryType,
- * item.entryValueType),
- * item.entryValueReference);
- * /
- **/
- } else {
- // Make a copy of the data
- // item.data = new
- // byte[nodeInfo.endOffset-nodeInfo.startOffset];
- final byte[] nodeInfo = new byte[nodeInfoNodeInfo.length()];
- nodeInfoNodeInfo.in.seek(nodeInfoNodeInfo.startOffset);
- nodeInfoNodeInfo.in.readCompletely(nodeInfo);
- item.data = nodeInfo; // should be new array, so just use it
- // System.arraycopy(nodeInfo.data, nodeInfo.startOffset,
- // item.data, 0, item.data.length);
- item.isExternalValueReference = false;
- /*
- * if ( item.entryValueType == 0x1f ||
- * item.entryValueType == 0x1e )
- * {
- * try {
- * // if ( item.entryType == 0x0037 )
- * {
- * String temp = new String(item.data, item.entryValueType
- * == 0x1E ? "UTF8" : "UTF-16LE");
- * System.out.printf("String: 0x%04X:%04X, \"%s\"\n",
- * item.entryType, item.entryValueType, temp);
- * }
- * } catch (UnsupportedEncodingException e) {
- * e.printStackTrace();
- * }
- * }
- * else
- * {
- *
- * System.out.printf("Other: 0x%04X:%04X, %d bytes\n",
- * item.entryType, item.entryValueType, item.data.length);
- *
- * }
- * /
- **/
- }
- break;
- }
-
- offset = offset + 8;
-
- this.items.put(item.entryType, item);
- // description += item.toString()+"\n\n";
-
- }
-
- this.releaseRawData();
- }
-
- /**
- * get the items parsed out of this table.
- *
- * @return items
- */
- public HashMap getItems() {
- return this.items;
- }
-
- @Override
- public String toString() {
-
- if (this.isDescNotYetInitiated) {
- this.isDescNotYetInitiated = false;
-
- for (final Integer curItem : this.items.keySet()) {
- this.descBuffer.append(this.items.get(curItem).toString() + "\n\n");
- }
- // description += item.toString()+"\n\n";
- }
-
- return this.description + this.descBuffer.toString();
- }
-}
diff --git a/src/main/java/com/pff/PSTTableBCItem.java b/src/main/java/com/pff/PSTTableBCItem.java
deleted file mode 100644
index c8601e0..0000000
--- a/src/main/java/com/pff/PSTTableBCItem.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-/**
- * Items within the BC Table
- *
- * @author Richard Johnson
- */
-class PSTTableBCItem extends PSTTableItem {
-
- @Override
- public String toString() {
- return "Table Item: " + super.toString() + "\n";
- }
-}
diff --git a/src/main/java/com/pff/PSTTableItem.java b/src/main/java/com/pff/PSTTableItem.java
deleted file mode 100644
index 908f7f6..0000000
--- a/src/main/java/com/pff/PSTTableItem.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.Charset;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.SimpleTimeZone;
-
-/**
- * Generic table item.
- * Provides some basic string functions
- *
- * @author Richard Johnson
- */
-class PSTTableItem {
-
- public static final int VALUE_TYPE_PT_UNICODE = 0x1f;
- public static final int VALUE_TYPE_PT_STRING8 = 0x1e;
- public static final int VALUE_TYPE_PT_BIN = 0x102;
-
- public int itemIndex = 0;
- public int entryType = 0;
- public int entryValueType = 0;
- public int entryValueReference = 0;
- public byte[] data = new byte[0];
- public boolean isExternalValueReference = false;
-
- public long getLongValue() {
- if (this.data.length > 0) {
- return PSTObject.convertLittleEndianBytesToLong(this.data);
- }
- return -1;
- }
-
- /**
- * Gets a string value of the data for a given codepage (charset name)
- *
- * @param codepage the codepage
- * @return the string value
- */
- public String getStringValue(String codepage) {
- return this.getStringValue(this.entryValueType,codepage);
- }
-
- /**
- * Gets a string value of the data
- *
- * @param stringType the string type
- * @param codepage the codepage
- * @return string value
- */
- public String getStringValue(final int stringType,String codepage) {
-
- if (stringType == VALUE_TYPE_PT_UNICODE) {
- // we are a nice little-endian unicode string.
- try {
- if (this.isExternalValueReference) {
- return "External string reference!";
- }
- return new String(this.data, "UTF-16LE").trim();
- } catch (final UnsupportedEncodingException e) {
-
- System.err.println("Error decoding string: " + this.data.toString());
- return "";
- }
- }
-
- if (stringType == VALUE_TYPE_PT_STRING8) {
- // System.out.println("Warning! decoding string8 without charset:
- // "+this.entryType + " - "+ Integer.toHexString(this.entryType));
- return new String(this.data, Charset.forName(codepage)).trim();
- }
-
- final StringBuffer outputBuffer = new StringBuffer();
- /*
- * if ( stringType == VALUE_TYPE_PT_BIN) {
- * int theChar;
- * for (int x = 0; x < data.length; x++) {
- * theChar = data[x] & 0xFF;
- * outputBuffer.append((char)theChar);
- * }
- * }
- * else
- * /
- **/
- {
- // we are not a normal string, give a hexish sort of output
- final StringBuffer hexOut = new StringBuffer();
- for (final byte element : this.data) {
- final int valueChar = element & 0xff;
- if (Character.isLetterOrDigit((char) valueChar)) {
- outputBuffer.append((char) valueChar);
- outputBuffer.append(" ");
- } else {
- outputBuffer.append(". ");
- }
- final String hexValue = Long.toHexString(valueChar);
- hexOut.append(hexValue);
- hexOut.append(" ");
- if (hexValue.length() > 1) {
- outputBuffer.append(" ");
- }
- }
- outputBuffer.append("\n");
- outputBuffer.append(" ");
- outputBuffer.append(hexOut);
- }
-
- return new String(outputBuffer);
- }
-
- @Override
- public String toString() {
- final String ret = PSTFile.getPropertyDescription(this.entryType, this.entryValueType);
-
- if (this.entryValueType == 0x000B) {
- return ret + (this.entryValueReference == 0 ? "false" : "true");
- }
-
- if (this.isExternalValueReference) {
- // Either a true external reference, or entryValueReference contains
- // the actual data
- return ret + String.format("0x%08X (%d)", this.entryValueReference, this.entryValueReference);
- }
-
- if (this.entryValueType == 0x0005 || this.entryValueType == 0x0014) {
- // 64bit data
- if (this.data == null) {
- return ret + "no data";
- }
- if (this.data.length == 8) {
- final long l = PSTObject.convertLittleEndianBytesToLong(this.data, 0, 8);
- return String.format("%s0x%016X (%d)", ret, l, l);
- } else {
- return String.format("%s invalid data length: %d", ret, this.data.length);
- }
- }
-
- if (this.entryValueType == 0x0040) {
- // It's a date...
- final int high = (int) PSTObject.convertLittleEndianBytesToLong(this.data, 4, 8);
- final int low = (int) PSTObject.convertLittleEndianBytesToLong(this.data, 0, 4);
-
- final Date d = PSTObject.filetimeToDate(high, low);
- this.dateFormatter.setTimeZone(utcTimeZone);
- return ret + this.dateFormatter.format(d);
- }
-
- if (this.entryValueType == 0x001F) {
- // Unicode string
- String s;
- try {
- s = new String(this.data, "UTF-16LE");
- } catch (final UnsupportedEncodingException e) {
- System.err.println("Error decoding string: " + this.data.toString());
- s = "";
- }
-
- if (s.length() >= 2 && s.charAt(0) == 0x0001) {
- return String.format("%s [%04X][%04X]%s", ret, (short) s.charAt(0), (short) s.charAt(1),
- s.substring(2));
- }
-
- return ret + s;
- }
-
- return ret + this.getStringValue("UTF-8");
- }
-
- private final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
- private static SimpleTimeZone utcTimeZone = new SimpleTimeZone(0, "UTC");
-}
diff --git a/src/main/java/com/pff/PSTTask.java b/src/main/java/com/pff/PSTTask.java
deleted file mode 100644
index ef31ce3..0000000
--- a/src/main/java/com/pff/PSTTask.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.io.IOException;
-import java.util.Date;
-import java.util.HashMap;
-
-/**
- * Object that represents Task items
- *
- * @author Richard Johnson
- */
-public class PSTTask extends PSTMessage {
-
- /**
- * Instantiates a new Pst task.
- *
- * @param theFile the the file
- * @param descriptorIndexNode the descriptor index node
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public PSTTask(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode)
- throws PSTException, IOException {
- super(theFile, descriptorIndexNode);
- }
-
- /**
- * Instantiates a new Pst task.
- *
- * @param theFile the the file
- * @param folderIndexNode the folder index node
- * @param table the table
- * @param localDescriptorItems the local descriptor items
- */
- public PSTTask(final PSTFile theFile, final DescriptorIndexNode folderIndexNode, final PSTTableBC table,
- final HashMap localDescriptorItems) {
- super(theFile, folderIndexNode, table, localDescriptorItems);
- }
-
- /**
- * Status Integer 32-bit signed 0x0 => Not started
- *
- * @return the task status
- */
- public int getTaskStatus() {
- return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008101, PSTFile.PSETID_Task));
- }
-
- /**
- * Percent Complete Floating point double precision (64-bit)
- *
- * @return the percent complete
- */
- public double getPercentComplete() {
- return this.getDoubleItem(this.pstFile.getNameToIdMapItem(0x00008102, PSTFile.PSETID_Task));
- }
-
- /**
- * Is team task Boolean
- *
- * @return the boolean
- */
- public boolean isTeamTask() {
- return this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008103, PSTFile.PSETID_Task));
- }
-
- /**
- * Date completed Filetime
- *
- * @return the task date completed
- */
- public Date getTaskDateCompleted() {
- return this.getDateItem(this.pstFile.getNameToIdMapItem(0x0000810f, PSTFile.PSETID_Task));
- }
-
- /**
- * Actual effort in minutes Integer 32-bit signed
- *
- * @return the task actual effort
- */
- public int getTaskActualEffort() {
- return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008110, PSTFile.PSETID_Task));
- }
-
- /**
- * Total effort in minutes Integer 32-bit signed
- *
- * @return the task estimated effort
- */
- public int getTaskEstimatedEffort() {
- return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008111, PSTFile.PSETID_Task));
- }
-
- /**
- * Task version Integer 32-bit signed FTK: Access count
- *
- * @return the task version
- */
- public int getTaskVersion() {
- return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008112, PSTFile.PSETID_Task));
- }
-
- /**
- * Complete Boolean
- *
- * @return the boolean
- */
- public boolean isTaskComplete() {
- return this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x0000811c, PSTFile.PSETID_Task));
- }
-
- /**
- * Owner ASCII or Unicode string
- *
- * @return the task owner
- */
- public String getTaskOwner() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x0000811f, PSTFile.PSETID_Task));
- }
-
- /**
- * Delegator ASCII or Unicode string
- *
- * @return the task assigner
- */
- public String getTaskAssigner() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008121, PSTFile.PSETID_Task));
- }
-
- /**
- * Unknown ASCII or Unicode string
- *
- * @return the task last user
- */
- public String getTaskLastUser() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008122, PSTFile.PSETID_Task));
- }
-
- /**
- * Ordinal Integer 32-bit signed
- *
- * @return the task ordinal
- */
- public int getTaskOrdinal() {
- return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008123, PSTFile.PSETID_Task));
- }
-
- /**
- * Is recurring Boolean
- *
- * @return the boolean
- */
- public boolean isTaskFRecurring() {
- return this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008126, PSTFile.PSETID_Task));
- }
-
- /**
- * Role ASCII or Unicode string
- *
- * @return the task role
- */
- public String getTaskRole() {
- return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008127, PSTFile.PSETID_Task));
- }
-
- /**
- * Ownership Integer 32-bit signed
- *
- * @return the task ownership
- */
- public int getTaskOwnership() {
- return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008129, PSTFile.PSETID_Task));
- }
-
- /**
- * Delegation State
- *
- * @return the acceptance state
- */
- public int getAcceptanceState() {
- return this.getIntItem(this.pstFile.getNameToIdMapItem(0x0000812a, PSTFile.PSETID_Task));
- }
-
- @Override
- public String toString() {
- return "Status Integer 32-bit signed 0x0 => Not started [TODO]: " + this.getTaskStatus() + "\n"
- + "Percent Complete Floating point double precision (64-bit): " + this.getPercentComplete() + "\n"
- + "Is team task Boolean: " + this.isTeamTask() + "\n" + "Start date Filetime: " + this.getTaskStartDate()
- + "\n" + "Due date Filetime: " + this.getTaskDueDate() + "\n" + "Date completed Filetime: "
- + this.getTaskDateCompleted() + "\n" + "Actual effort in minutes Integer 32-bit signed: "
- + this.getTaskActualEffort() + "\n" + "Total effort in minutes Integer 32-bit signed: "
- + this.getTaskEstimatedEffort() + "\n" + "Task version Integer 32-bit signed FTK: Access count: "
- + this.getTaskVersion() + "\n" + "Complete Boolean: " + this.isTaskComplete() + "\n"
- + "Owner ASCII or Unicode string: " + this.getTaskOwner() + "\n" + "Delegator ASCII or Unicode string: "
- + this.getTaskAssigner() + "\n" + "Unknown ASCII or Unicode string: " + this.getTaskLastUser() + "\n"
- + "Ordinal Integer 32-bit signed: " + this.getTaskOrdinal() + "\n" + "Is recurring Boolean: "
- + this.isTaskFRecurring() + "\n" + "Role ASCII or Unicode string: " + this.getTaskRole() + "\n"
- + "Ownership Integer 32-bit signed: " + this.getTaskOwnership() + "\n" + "Delegation State: "
- + this.getAcceptanceState();
-
- }
-}
diff --git a/src/main/java/com/pff/PSTTimeZone.java b/src/main/java/com/pff/PSTTimeZone.java
deleted file mode 100644
index 8206117..0000000
--- a/src/main/java/com/pff/PSTTimeZone.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/**
- * Copyright 2010 Richard Johnson & Orin Eman
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ---
- *
- * This file is part of java-libpst.
- *
- * java-libpst is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * java-libpst 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with java-libpst. If not, see .
- *
- */
-package com.pff;
-
-import java.util.Calendar;
-import java.util.SimpleTimeZone;
-
-/**
- * Class containing time zone information
- *
- * @author Orin Eman
- *
- *
- */
-
-public class PSTTimeZone {
- PSTTimeZone(final byte[] timeZoneData) {
- this.rule = null;
- this.name = "";
-
- try {
- final int headerLen = (int) PSTObject.convertLittleEndianBytesToLong(timeZoneData, 2, 4);
- final int nameLen = 2 * (int) PSTObject.convertLittleEndianBytesToLong(timeZoneData, 6, 8);
- this.name = new String(timeZoneData, 8, nameLen, "UTF-16LE");
- int ruleOffset = 8 + nameLen;
- final int nRules = (int) PSTObject.convertLittleEndianBytesToLong(timeZoneData, ruleOffset, ruleOffset + 2);
-
- ruleOffset = 4 + headerLen;
- for (int rule = 0; rule < nRules; ++rule) {
- // Is this rule the effective rule?
- final int flags = (int) PSTObject.convertLittleEndianBytesToLong(timeZoneData, ruleOffset + 4,
- ruleOffset + 6);
- if ((flags & 0x0002) != 0) {
- this.rule = new TZRule(timeZoneData, ruleOffset + 6);
- break;
- }
- ruleOffset += 66;
- }
- } catch (final Exception e) {
- System.err.printf("Exception reading timezone: %s\n", e.toString());
- e.printStackTrace();
- this.rule = null;
- this.name = "";
- }
- }
-
- PSTTimeZone(String name, final byte[] timeZoneData) {
- this.name = name;
- this.rule = null;
-
- try {
- this.rule = new TZRule(new SYSTEMTIME(), timeZoneData, 0);
- } catch (final Exception e) {
- System.err.printf("Exception reading timezone: %s\n", e.toString());
- e.printStackTrace();
- this.rule = null;
- name = "";
- }
- }
-
- public String getName() {
- return this.name;
- }
-
- public SimpleTimeZone getSimpleTimeZone() {
- if (this.simpleTimeZone != null) {
- return this.simpleTimeZone;
- }
-
- if (this.rule.startStandard.wMonth == 0) {
- // A time zone with no daylight savings time
- this.simpleTimeZone = new SimpleTimeZone((this.rule.lBias + this.rule.lStandardBias) * 60 * 1000,
- this.name);
-
- return this.simpleTimeZone;
- }
-
- final int startMonth = (this.rule.startDaylight.wMonth - 1) + Calendar.JANUARY;
- final int startDayOfMonth = (this.rule.startDaylight.wDay == 5) ? -1
- : ((this.rule.startDaylight.wDay - 1) * 7) + 1;
- final int startDayOfWeek = this.rule.startDaylight.wDayOfWeek + Calendar.SUNDAY;
- final int endMonth = (this.rule.startStandard.wMonth - 1) + Calendar.JANUARY;
- final int endDayOfMonth = (this.rule.startStandard.wDay == 5) ? -1
- : ((this.rule.startStandard.wDay - 1) * 7) + 1;
- final int endDayOfWeek = this.rule.startStandard.wDayOfWeek + Calendar.SUNDAY;
- final int savings = (this.rule.lStandardBias - this.rule.lDaylightBias) * 60 * 1000;
-
- this.simpleTimeZone = new SimpleTimeZone(-((this.rule.lBias + this.rule.lStandardBias) * 60 * 1000), this.name,
- startMonth, startDayOfMonth, -startDayOfWeek,
- (((((this.rule.startDaylight.wHour * 60) + this.rule.startDaylight.wMinute) * 60)
- + this.rule.startDaylight.wSecond) * 1000) + this.rule.startDaylight.wMilliseconds,
- endMonth, endDayOfMonth, -endDayOfWeek,
- (((((this.rule.startStandard.wHour * 60) + this.rule.startStandard.wMinute) * 60)
- + this.rule.startStandard.wSecond) * 1000) + this.rule.startStandard.wMilliseconds,
- savings);
-
- return this.simpleTimeZone;
- }
-
- public boolean isEqual(final PSTTimeZone rhs) {
- if (this.name.equalsIgnoreCase(rhs.name)) {
- if (this.rule.isEqual(rhs.rule)) {
- return true;
- }
-
- System.err.printf("Warning: different timezones with the same name: %s\n", this.name);
- }
- return false;
- }
-
- public SYSTEMTIME getStart() {
- return this.rule.dtStart;
- }
-
- public int getBias() {
- return this.rule.lBias;
- }
-
- public int getStandardBias() {
- return this.rule.lStandardBias;
- }
-
- public int getDaylightBias() {
- return this.rule.lDaylightBias;
- }
-
- public SYSTEMTIME getDaylightStart() {
- return this.rule.startDaylight;
- }
-
- public SYSTEMTIME getStandardStart() {
- return this.rule.startStandard;
- }
-
- public class SYSTEMTIME {
-
- SYSTEMTIME() {
- this.wYear = 0;
- this.wMonth = 0;
- this.wDayOfWeek = 0;
- this.wDay = 0;
- this.wHour = 0;
- this.wMinute = 0;
- this.wSecond = 0;
- this.wMilliseconds = 0;
- }
-
- SYSTEMTIME(final byte[] timeZoneData, final int offset) {
- this.wYear = (short) (PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset, offset + 2) & 0x7FFF);
- this.wMonth = (short) (PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 2, offset + 4)
- & 0x7FFF);
- this.wDayOfWeek = (short) (PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 4, offset + 6)
- & 0x7FFF);
- this.wDay = (short) (PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 6, offset + 8)
- & 0x7FFF);
- this.wHour = (short) (PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 8, offset + 10)
- & 0x7FFF);
- this.wMinute = (short) (PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 10, offset + 12)
- & 0x7FFF);
- this.wSecond = (short) (PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 12, offset + 14)
- & 0x7FFF);
- this.wMilliseconds = (short) (PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 14,
- offset + 16) & 0x7FFF);
- }
-
- boolean isEqual(final SYSTEMTIME rhs) {
- return this.wYear == rhs.wYear && this.wMonth == rhs.wMonth && this.wDayOfWeek == rhs.wDayOfWeek
- && this.wDay == rhs.wDay && this.wHour == rhs.wHour && this.wMinute == rhs.wMinute
- && this.wSecond == rhs.wSecond && this.wMilliseconds == rhs.wMilliseconds;
- }
-
- public short wYear;
- public short wMonth;
- public short wDayOfWeek;
- public short wDay;
- public short wHour;
- public short wMinute;
- public short wSecond;
- public short wMilliseconds;
- }
-
- /**
- * A static copy of the UTC time zone, available for others to use
- */
- public static SimpleTimeZone utcTimeZone = new SimpleTimeZone(0, "UTC");
-
- private class TZRule {
-
- TZRule(final SYSTEMTIME dtStart, final byte[] timeZoneData, final int offset) {
- this.dtStart = dtStart;
- this.InitBiases(timeZoneData, offset);
- @SuppressWarnings("unused")
- final short wStandardYear = (short) PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 12,
- offset + 14);
- this.startStandard = new SYSTEMTIME(timeZoneData, offset + 14);
- @SuppressWarnings("unused")
- final short wDaylightYear = (short) PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 30,
- offset + 32);
- this.startDaylight = new SYSTEMTIME(timeZoneData, offset + 32);
- }
-
- TZRule(final byte[] timeZoneData, final int offset) {
- this.dtStart = new SYSTEMTIME(timeZoneData, offset);
- this.InitBiases(timeZoneData, offset + 16);
- this.startStandard = new SYSTEMTIME(timeZoneData, offset + 28);
- this.startDaylight = new SYSTEMTIME(timeZoneData, offset + 44);
- }
-
- private void InitBiases(final byte[] timeZoneData, final int offset) {
- this.lBias = (int) PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset, offset + 4);
- this.lStandardBias = (int) PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 4, offset + 8);
- this.lDaylightBias = (int) PSTObject.convertLittleEndianBytesToLong(timeZoneData, offset + 8, offset + 12);
- }
-
- boolean isEqual(final TZRule rhs) {
- return this.dtStart.isEqual(rhs.dtStart) && this.lBias == rhs.lBias
- && this.lStandardBias == rhs.lStandardBias && this.lDaylightBias == rhs.lDaylightBias
- && this.startStandard.isEqual(rhs.startStandard) && this.startDaylight.isEqual(rhs.startDaylight);
- }
-
- SYSTEMTIME dtStart;
- int lBias;
- int lStandardBias;
- int lDaylightBias;
- SYSTEMTIME startStandard;
- SYSTEMTIME startDaylight;
- }
-
- private String name;
- private TZRule rule;
- private SimpleTimeZone simpleTimeZone = null;
-}
diff --git a/src/main/java/example/Test.java b/src/main/java/example/Test.java
deleted file mode 100644
index 8ea68bf..0000000
--- a/src/main/java/example/Test.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package example;
-
-import java.util.Vector;
-
-import com.pff.PSTException;
-import com.pff.PSTFile;
-import com.pff.PSTFolder;
-import com.pff.PSTMessage;
-
-public class Test {
- public static void main(final String[] args) {
- new Test(args[0]);
- }
-
- public Test(final String filename) {
- try {
- final PSTFile pstFile = new PSTFile(filename);
- System.out.println(pstFile.getMessageStore().getDisplayName());
- this.processFolder(pstFile.getRootFolder());
- } catch (final Exception err) {
- err.printStackTrace();
- }
- }
-
- int depth = -1;
-
- public void processFolder(final PSTFolder folder) throws PSTException, java.io.IOException {
- this.depth++;
- // the root folder doesn't have a display name
- if (this.depth > 0) {
- this.printDepth();
- System.out.println(folder.getDisplayName());
- }
-
- // go through the folders...
- if (folder.hasSubfolders()) {
- final Vector childFolders = folder.getSubFolders();
- for (final PSTFolder childFolder : childFolders) {
- this.processFolder(childFolder);
- }
- }
-
- // and now the emails for this folder
- if (folder.getContentCount() > 0) {
- this.depth++;
- PSTMessage email = (PSTMessage) folder.getNextChild();
- while (email != null) {
- if (!email.getMessageClass().equals("IPM.Note")) {
- this.printDepth();
- System.out.println("Email: [" + email.getMessageClass() + "]" + email.getDescriptorNodeId() + " - " + email.getSubject());
- }
- email = (PSTMessage) folder.getNextChild();
- }
- this.depth--;
- }
- this.depth--;
- }
-
- public void printDepth() {
- for (int x = 0; x < this.depth - 1; x++) {
- System.out.print(" | ");
- }
- System.out.print(" |- ");
- }
-}
diff --git a/src/main/java/example/TestGui.java b/src/main/java/example/TestGui.java
deleted file mode 100644
index 686e698..0000000
--- a/src/main/java/example/TestGui.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/**
- *
- */
-
-package example;
-
-import java.awt.BorderLayout;
-import java.awt.Font;
-import java.awt.Frame;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Vector;
-
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTable;
-import javax.swing.JTextField;
-import javax.swing.JTextPane;
-import javax.swing.JTree;
-import javax.swing.ListSelectionModel;
-import javax.swing.WindowConstants;
-import javax.swing.table.AbstractTableModel;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import com.pff.*;
-
-/**
- * @author toweruser
- *
- */
-public class TestGui implements ActionListener {
- private PSTFile pstFile;
- private EmailTableModel emailTableModel;
- private JTextPane emailText;
- private JPanel emailPanel;
- private JPanel attachPanel;
- private JLabel attachLabel;
- private JTextField attachText;
- private PSTMessage selectedMessage;
- private JFrame f;
-
- public TestGui(String filename) throws PSTException, IOException {
-
- // setup the basic window
- this.f = new JFrame("PST Browser");
-
- // attempt to open the pst file
- try {
- this.pstFile = new PSTFile(filename);
- pstFile.setGlobalCodepage("windows-1252");
- } catch (final Exception err) {
- err.printStackTrace();
- System.exit(1);
- }
-
- // do the tree thing
- final DefaultMutableTreeNode top = new DefaultMutableTreeNode(this.pstFile.getMessageStore());
- try {
- this.buildTree(top, this.pstFile.getRootFolder());
- } catch (final Exception err) {
- err.printStackTrace();
- System.exit(1);
- }
-
- final JTree folderTree = new JTree(top) {
- @Override
- public String convertValueToText(final Object value, final boolean selected, final boolean expanded,
- final boolean leaf, final int row, final boolean hasFocus) {
- final DefaultMutableTreeNode nodeValue = (DefaultMutableTreeNode) value;
- if (nodeValue.getUserObject() instanceof PSTFolder) {
- final PSTFolder folderValue = (PSTFolder) nodeValue.getUserObject();
-
- return folderValue.getDescriptorNodeId() + " - " + folderValue.getDisplayName() + " "
- + folderValue.getAssociateContentCount() + "";
- } else if (nodeValue.getUserObject() instanceof PSTMessageStore) {
- final PSTMessageStore folderValue = (PSTMessageStore) nodeValue.getUserObject();
- return folderValue.getDisplayName();
- } else {
- return value.toString();
- }
- }
- };
- final DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
- renderer.setLeafIcon(renderer.getDefaultClosedIcon());
- folderTree.setCellRenderer(renderer);
-
- // event handler for changing...
- folderTree.addTreeSelectionListener(e -> {
- final DefaultMutableTreeNode node = (DefaultMutableTreeNode) folderTree.getLastSelectedPathComponent();
- if (node == null) {
- return;
- }
- if (node.getUserObject() instanceof PSTFolder) {
- final PSTFolder folderValue = (PSTFolder) node.getUserObject();
- try {
- TestGui.this.selectFolder(folderValue);
- } catch (final Exception err) {
- System.out.println("unable to change folder");
- err.printStackTrace();
- }
- }
- });
- final JScrollPane treePane = new JScrollPane(folderTree);
-
- // the table
- JScrollPane emailTablePanel = null;
- try {
- this.emailTableModel = new EmailTableModel(this.pstFile.getRootFolder(), this.pstFile);
- final JTable emailTable = new JTable(this.emailTableModel);
- emailTable.setAutoCreateRowSorter(true);
- emailTablePanel = new JScrollPane(emailTable);
- emailTable.setFillsViewportHeight(true);
- final ListSelectionModel selectionModel = emailTable.getSelectionModel();
- selectionModel.addListSelectionListener(e -> {
- final JTable source = emailTable;
- TestGui.this.selectedMessage = TestGui.this.emailTableModel.getMessageAtRow(source.convertRowIndexToModel(source.getSelectedRow()));
- if (TestGui.this.selectedMessage instanceof PSTContact) {
- final PSTContact contact = (PSTContact) TestGui.this.selectedMessage;
- TestGui.this.emailText.setText(contact.toString());
- } else if (TestGui.this.selectedMessage instanceof PSTAppointment) {
- final PSTAppointment task = (PSTAppointment) TestGui.this.selectedMessage;
- TestGui.this.emailText.setText(task.toString());
- } else if (TestGui.this.selectedMessage instanceof PSTTask) {
- final PSTTask task = (PSTTask) TestGui.this.selectedMessage;
- TestGui.this.emailText.setText(task.toString());
- } else if (TestGui.this.selectedMessage instanceof PSTActivity) {
- final PSTActivity journalEntry = (PSTActivity) TestGui.this.selectedMessage;
- TestGui.this.emailText.setText(journalEntry.toString());
- } else if (TestGui.this.selectedMessage instanceof PSTRss) {
- final PSTRss rss = (PSTRss) TestGui.this.selectedMessage;
- TestGui.this.emailText.setText(rss.toString());
- } else if (TestGui.this.selectedMessage != null) {
- // System.out.println(selectedMessage.getMessageClass());
- TestGui.this.emailText.setText(TestGui.this.selectedMessage.getBody());
- // System.out.println(selectedMessage);
- // emailText.setText(selectedMessage.toString());
- // emailText.setText(selectedMessage.toString());
- // PSTTask task = selectedMessage.toTask();
- // emailText.setText(task.toString());
- }
- TestGui.this.setAttachmentText();
-
- // treePane.getViewport().setViewPosition(new Point(0,0));
- TestGui.this.emailText.setCaretPosition(0);
- });
- } catch (final Exception err) {
- err.printStackTrace();
- }
-
- this.f.setJMenuBar(this.createMenu());
-
- // the email
- this.emailText = new JTextPane();
- this.emailText.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
- // emailText.setFont(new Font("Arial Unicode MS", Font.PLAIN, 12));
-
- this.emailPanel = new JPanel(new BorderLayout());
- this.attachPanel = new JPanel(new BorderLayout());
- this.attachLabel = new JLabel("Attachments:");
- this.attachText = new JTextField("");
- this.attachText.setEditable(false);
- this.attachPanel.add(this.attachLabel, BorderLayout.WEST);
- this.attachPanel.add(this.attachText, BorderLayout.CENTER);
- this.emailPanel.add(this.attachPanel, BorderLayout.NORTH);
- this.emailPanel.add(this.emailText, BorderLayout.CENTER);
-
- final JSplitPane emailSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, emailTablePanel,
- new JScrollPane(this.emailPanel));
- emailSplitPane.setOneTouchExpandable(true);
- emailSplitPane.setDividerLocation(0.25);
-
- // add a split pane, 1 for our tree, the other for our emails
- final JSplitPane primaryPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, treePane, emailSplitPane);
- primaryPane.setOneTouchExpandable(true);
- primaryPane.setDividerLocation(0.3);
- this.f.add(primaryPane);
-
- // Set the default close operation for the window,
- // or else the program won't exit when clicking close button
- this.f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
-
- // Set the visibility as true, thereby displaying it
- this.f.setVisible(true);
- // f.setSize(800, 600);
- this.f.setExtendedState(this.f.getExtendedState() | Frame.MAXIMIZED_BOTH);
- }
-
- private void buildTree(final DefaultMutableTreeNode top, final PSTFolder theFolder) {
- // this is recursive, try and keep up.
- try {
- final Vector children = theFolder.getSubFolders();
- final Iterator childrenIterator = children.iterator();
- while (childrenIterator.hasNext()) {
- final PSTFolder folder = (PSTFolder) childrenIterator.next();
-
- final DefaultMutableTreeNode node = new DefaultMutableTreeNode(folder);
-
- if (folder.getSubFolders().size() > 0) {
- this.buildTree(node, folder);
- } else {
- }
- top.add(node);
- }
- } catch (final Exception err) {
- err.printStackTrace();
- System.exit(1);
- }
- }
-
- void setAttachmentText() {
- final StringBuffer s = new StringBuffer();
-
- try {
- if (this.selectedMessage != null) {
- final int numAttach = this.selectedMessage.getNumberOfAttachments();
- for (int x = 0; x < numAttach; x++) {
- final PSTAttachment attach = this.selectedMessage.getAttachment(x);
- String filename = attach.getLongFilename();
- if (filename.isEmpty()) {
- filename = attach.getFilename();
- }
- if (!filename.isEmpty()) {
- if (x != 0) {
- s.append(", ");
- }
- s.append(filename);
- }
- }
- }
- } catch (final Exception e) {
- }
-
- this.attachText.setText(s.toString());
- }
-
- void selectFolder(final PSTFolder folder) throws IOException, PSTException {
- // load up the non-folder children.
-
- this.emailTableModel.setFolder(folder);
-
- }
-
- public JMenuBar createMenu() {
- JMenuBar menuBar;
- JMenu menu;
-
- menuBar = new JMenuBar();
- menu = new JMenu("File");
- menu.setMnemonic(KeyEvent.VK_F);
- menuBar.add(menu);
-
- final JMenuItem menuItem = new JMenuItem("Save Attachments", KeyEvent.VK_S);
- menuItem.addActionListener(this);
- menu.add(menuItem);
-
- return menuBar;
- }
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- final JMenuItem source = (JMenuItem) (e.getSource());
- if (source.getText() == "Save Attachments") {
- this.saveAttachments();
- }
- }
-
- private void saveAttachments() {
- if (this.selectedMessage != null) {
- final int numAttach = this.selectedMessage.getNumberOfAttachments();
- if (numAttach == 0) {
- JOptionPane.showMessageDialog(this.f, "Email has no attachments");
- return;
- }
- try {
- for (int x = 0; x < numAttach; x++) {
- final PSTAttachment attach = this.selectedMessage.getAttachment(x);
- final InputStream attachmentStream = attach.getFileInputStream();
- String filename = attach.getLongFilename();
- if (filename.isEmpty()) {
- filename = attach.getFilename();
- }
- final JFileChooser chooser = new JFileChooser();
- chooser.setSelectedFile(new File(filename));
- final int r = chooser.showSaveDialog(this.f);
- if (r == JFileChooser.APPROVE_OPTION) {
- final FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());
- // 8176 is the block size used internally and should
- // give the best performance
- final int bufferSize = 8176;
- final byte[] buffer = new byte[bufferSize];
- int count;
- do {
- count = attachmentStream.read(buffer);
- out.write(buffer, 0, count);
- } while (count == bufferSize);
- out.close();
- }
- attachmentStream.close();
- }
- } catch (final IOException ioe) {
- JOptionPane.showMessageDialog(this.f, "Failed writing to file");
- } catch (final PSTException pste) {
- JOptionPane.showMessageDialog(this.f, "Error in PST file");
- }
- }
- }
-
- /**
- * Main.
- *
- * @param args the args
- * @throws PSTException the pst exception
- * @throws IOException the io exception
- */
- public static void main(final String[] args) throws PSTException, IOException {
- new TestGui(args[0]);
- }
-
-}
-
-class EmailTableModel extends AbstractTableModel {
-
- PSTFolder theFolder = null;
- ArrayList theFolderMessageList;
- PSTFile theFile = null;
-
- HashMap cache = new HashMap();
-
- public EmailTableModel(final PSTFolder theFolder, final PSTFile theFile) {
- super();
-
- this.theFolder = theFolder;
- this.theFile = theFile;
- }
-
- String[] columnNames = { "Descriptor ID", "MessageClass", "Subject", "From", "To", "Date", "Has Attachments" };
- String[][] rowData = { { "", "", "", "", "" } };
- int rowCount = 0;
-
- @Override
- public String getColumnName(final int col) {
- return this.columnNames[col].toString();
- }
-
- @Override
- public int getColumnCount() {
- return this.columnNames.length;
- }
-
- @Override
- public int getRowCount() {
- try {
- // System.out.println("Email count: "+theFolder.getEmailCount());
- return this.theFolder.getContentCount();
- } catch (final Exception err) {
- err.printStackTrace();
- System.exit(0);
- }
- return 0;
- }
-
- public PSTMessage getMessageAtRow(final int row) {
- PSTMessage next = null;
- try {
- if (this.cache.containsKey(((Object)theFolder)+toString()+" - "+row)) {
- next = (PSTMessage) this.cache.get(((Object)theFolder)+toString()+" - "+row);
- } else {
- this.theFolder.moveChildCursorTo(row);
- next = (PSTMessage) this.theFolder.getNextChild();
- this.cache.put(((Object)theFolder)+toString()+" - "+row, next);
- }
- } catch (final Exception e) {
- e.printStackTrace();
- }
- return next;
- }
-
- @Override
- public Object getValueAt(final int row, final int col) {
- // get the child at...
- try {
- final PSTMessage next = this.getMessageAtRow(row);
-
- if (next == null) {
- return null;
- }
-
- switch (col) {
- case 0:
- return next.getDescriptorNode().descriptorIdentifier + "";
- case 1:
- return next.getMessageClass();
- case 2:
- return next.getSubject();
- case 3:
- return next.getSentRepresentingName() + " <" + next.getSentRepresentingEmailAddress() + ">";
- case 4:
- return next.getReceivedByName() + " <" + next.getReceivedByAddress() + ">" + next.getDisplayTo();
- case 5:
- return next.getClientSubmitTime();
- // return next.isFlagged();
- // return next.isDraft();
- // PSTTask task = next.toTask();
- // return task.toString();
- case 6:
- return (next.hasAttachments() ? "Yes" : "No");
- }
- } catch (final Exception e) {
- e.printStackTrace();
- System.exit(0);
- }
-
- return "";
- }
-
- @Override
- public boolean isCellEditable(final int row, final int col) {
- return false;
- }
-
- @Override
- public Class> getColumnClass(int columnIndex) {
- return String.class;
- }
-
- public void setFolder(final PSTFolder theFolder) throws PSTException, IOException {
- theFolder.moveChildCursorTo(0);
- this.theFolder = theFolder;
- this.fireTableDataChanged();
- }
-
-}
diff --git a/src/main/java/example/TestGui.rs b/src/main/java/example/TestGui.rs
deleted file mode 100644
index 195ebc0..0000000
--- a/src/main/java/example/TestGui.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-EmailTableModel
-TestGui
diff --git a/src/main/resources/InternetCodepages.txt b/src/main/resources/InternetCodepages.txt
deleted file mode 100644
index 74a30b9..0000000
--- a/src/main/resources/InternetCodepages.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2010 Richard Johnson & Orin Eman
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# ---
-#
-# This file is part of java-libpst.
-#
-# java-libpst is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# java-libpst 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 Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with java-libpst. If not, see .
-
-28596=iso-8859-6
-1256=windows-1256
-28594=iso-8859-4
-1257=windows-1257
-28592=iso-8859-2
-1250=windows-1250
-936=gb2312
-52936=hz-gb-2312
-54936=gb18030
-950=big5
-28595=iso-8859-5
-20866=koi8-r
-21866=koi8-u
-1251=windows-1251
-28597=iso-8859-7
-1253=windows-1253
-38598=iso-8859-8-i
-1255=windows-1255
-51932=euc-jp
-50220=iso-2022-jp
-50221=csISO2022JP
-932=iso-2022-jp
-949=ks_c_5601-1987
-51949=euc-kr
-28593=iso-8859-3
-28605=iso-8859-15
-874=windows-874
-28599=iso-8859-9
-1254=windows-1254
-65000=utf-7
-65001=utf-8
-20127=us-ascii
-1258=windows-1258
-28591=iso-8859-1
-1252=Windows-1252
diff --git a/src/main/resources/PIDLongID.csv b/src/main/resources/PIDLongID.csv
deleted file mode 100644
index e2d3510..0000000
--- a/src/main/resources/PIDLongID.csv
+++ /dev/null
@@ -1,366 +0,0 @@
-ID;Property;Description:;Data type;Area;Defining reference;Alternate names
-0x00000001;PidLidAttendeeCriticalChange;Specifies the date and time at which the meeting-related object was sent.;PtypTime, 0x0040;Meetings;[MS-OXOCAL] section 2.2.5.2;LID_ATTENDEE_CRITICAL_CHANGE
-0x00000002;PidLidWhere;Contains the value of the PidLidLocation property (section 2.159) from the associated Meeting object.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.5.3;LID_WHERE
-0x00000003;PidLidGlobalObjectId;Contains an ID for an object that represents an exception to a recurring series.;PtypBinary, 0x0102;Meetings;[MS-OXOCAL] section 2.2.1.27;LID_GLOBAL_OBJID
-0x00000004;PidLidIsSilent;Indicates whether the user did not include any text in the body of the Meeting Response object.;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.7.7;LID_IS_SILENT
-0x00000005;PidLidIsRecurring;Specifies whether the object is associated with a recurring series.;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.1.13;LID_IS_RECURRING
-0x00000006;PidLidRequiredAttendees;Identifies required attendees for the appointment or meeting.;PtypString, 0x001F;Meetings;[MS-XWDCAL] section 2.2.7.63;LID_REQUIRED_ATTENDEES
-0x00000007;PidLidOptionalAttendees;Specifies optional attendees.;PtypString, 0x001F;Meetings;[MS-XWDCAL] section 2.2.7.45;LID_OPTIONAL_ATTENDEES
-0x00000008;PidLidResourceAttendees;Identifies resource attendees for the appointment or meeting.;PtypString, 0x001F;Meetings;[MS-XWDCAL] section 2.2.7.64;LID_RESOURCE_ATTENDEES
-0x00000009;PidLidDelegateMail;Indicates whether a delegate responded to the meeting request.;PtypBoolean, 0x000B;Meetings;[MS-XWDCAL] section 2.2.7.21;LID_DELEGATE_MAIL
-0x0000000A;PidLidIsException;Indicates whether the object represents an exception (including an orphan instance).;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.1.35;LID_IS_EXCEPTION
-0x0000000C;PidLidTimeZone;Specifies information about the time zone of a recurring meeting.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.5.6;LID_TIME_ZONE
-0x0000000D;PidLidStartRecurrenceDate;Identifies the start date of the recurrence pattern.;PtypInteger32, 0x0003;Meetings;[MS-XWDCAL] section 2.2.7.66;LID_START_RECUR_DATE
-0x0000000E;PidLidStartRecurrenceTime;Identifies the start time of the recurrence pattern.;PtypInteger32, 0x0003;Meetings;[MS-XWDCAL] section 2.2.7.67;LID_START_RECUR_TIME
-0x0000000F;PidLidEndRecurrenceDate;Identifies the end date of the recurrence range.;PtypInteger32, 0x0003;Meetings;[MS-XWDCAL] section 2.2.7.22;LID_END_RECUR_DATE
-0x00000010;PidLidEndRecurrenceTime;Identifies the end time of the recurrence range.;PtypInteger32, 0x0003;Meetings;[MS-XWDCAL] section 2.2.7.23;LID_END_RECUR_TIME
-0x00000011;PidLidDayInterval;Identifies the day interval for the recurrence pattern.;PtypInteger16, 0x0002;Meetings;[MS-XWDCAL] section 2.2.7.19;LID_DAY_INTERVAL
-0x00000012;PidLidWeekInterval;Identifies the number of weeks that occur between each meeting.;PtypInteger16, 0x0002;Meetings;[MS-XWDCAL] section 2.2.7.71;LID_WEEK_INTERVAL
-0x00000013;PidLidMonthInterval;Indicates the monthly interval of the appointment or meeting.;PtypInteger16, 0x0002;Meetings;[MS-XWDCAL] section 2.2.7.33;LID_MONTH_INTERVAL
-0x00000014;PidLidYearInterval;Indicates the yearly interval of the appointment or meeting.;PtypInteger16, 0x0002;Meetings;[MS-XWDCAL] section 2.2.7.73;LID_YEAR_INTERVAL
-0x00000015;PidLidClientIntent; Indicates what actions the user has taken on this Meeting object.;PtypInteger32, 0x0003;Calendar;[MS-OXOCAL] section 2.2.2.4;dispidClientIntent
-0x00000017;PidLidMonthOfYearMask;Indicates the calculated month of the year in which the appointment or meeting occurs.;PtypInteger32, 0x0003;Meetings;[MS-XWDCAL] section 2.2.7.35;LID_MOY_MASK
-0x00000018;PidLidOldRecurrenceType;Indicates the recurrence pattern for the appointment or meeting.;PtypInteger16, 0x0002;Meetings;[MS-XWDCAL] section 2.2.7.44;LID_RECUR_TYPE
-0x0000001A;PidLidOwnerCriticalChange;Specifies the date and time at which a Meeting Request object was sent by the organizer.;PtypTime, 0x0040;Meetings;[MS-OXOCAL] section 2.2.1.34;LID_OWNER_CRITICAL_CHANGE
-0x0000001C;PidLidCalendarType;Contains the value of the CalendarType field from the PidLidAppointmentRecur property (section 2.22).;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.6.11;LID_CALENDAR_TYPE
-0x00000023;PidLidCleanGlobalObjectId;Contains the value of the PidLidGlobalObjectId property (section 2.142) for an object that represents an Exception object to a recurring series, where the Year, Month, and Day fields are all zero.;PtypBinary, 0x0102;Meetings;[MS-OXOCAL] section 2.2.1.28;dispidCleanGlobalObjId
-0x00000024;PidLidAppointmentMessageClass;Indicates the message class of the Meeting object to be generated from the Meeting Request object.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.6.6;dispidApptMessageClass
-0x00000026;PidLidMeetingType;Indicates the type of Meeting Request object or Meeting Update object.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.6.5;dispidMeetingType
-0x00000028;PidLidOldLocation;Indicates the original value of the PidLidLocation property (section 2.159) before a meeting update.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.6.7;dispidOldLocation
-0x00000029;PidLidOldWhenStartWhole;Indicates the original value of the PidLidAppointmentStartWhole property (section 2.29) before a meeting update.;PtypTime, 0x0040;Meetings;[MS-OXOCAL] section 2.2.6.8;dispidOldWhenStartWhole
-0x0000002A;PidLidOldWhenEndWhole;Indicates the original value of the PidLidAppointmentEndWhole property (section 2.14) before a meeting update.;PtypTime, 0x0040;Meetings;[MS-OXOCAL] section 2.2.6.9;dispidOldWhenEndWhole
-0x00001000;PidLidDayOfMonth;Identifies the day of the month for the appointment or meeting.;PtypInteger32, 0x0003;Calendar;[MS-XWDCAL] section 2.2.7.20;
-0x00001001;PidLidICalendarDayOfWeekMask;Identifies the day of the week for the appointment or meeting.;PtypInteger32, 0x0003;Calendar;[MS-XWDCAL] section 2.2.7.27;http://schemas.microsoft.com/mapi/dayofweekmask
-0x00001005;PidLidOccurrences;Indicates the number of occurrences in the recurring appointment or meeting.;PtypInteger32, 0x0003;Calendar;[MS-XWDCAL] section 2.2.7.43;
-0x00001006;PidLidMonthOfYear;Indicates the month of the year in which the appointment or meeting occurs.;PtypInteger32, 0x0003;Calendar;[MS-XWDCAL] section 2.2.7.34;
-0x0000100B;PidLidNoEndDateFlag;Indicates whether the recurrence pattern has an end date.;PtypBoolean, 0x000B;Calendar;[MS-XWDCAL] section 2.2.7.36;http://schemas.microsoft.com/mapi/fnoenddate
-0x0000100D;PidLidRecurrenceDuration;Identifies the length, in minutes, of the appointment or meeting.;PtypInteger32, 0x0003;Calendar;[MS-XWDCAL] section 2.2.7.48;
-0x00008005;PidLidFileUnder;Specifies the name under which to file a contact when displaying a list of contacts. ;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.1.11;dispidFileUnder
-0x00008006;PidLidFileUnderId;Specifies how to generate and recompute the value of the PidLidFileUnder property (section 2.132) when other contact name properties change.;PtypInteger32, 0x0003;Contact Properties;[MS-OXOCNTC] section 2.2.1.1.12;dispidFileUnderId
-0x00008007;PidLidContactItemData;Specifies the visible fields in the application's user interface that are used to help display the contact information. ;PtypMultipleInteger32, 0x1003;Contact Properties;[MS-OXOCNTC] section 2.2.1.10.22;dispidContactItemData
-0x00008010;PidLidDepartment;This property is ignored by the server and is set to an empty string by the client.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.6.4;dispidDepartment
-0x00008015;PidLidHasPicture;Specifies whether the attachment has a picture.;PtypBoolean, 0x000B;Contact Properties;[MS-OXOCNTC] section 2.2.1.8.1;dispidHasPicture
-0x0000801A;PidLidHomeAddress;Specifies the complete address of the home address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.8;dispidHomeAddress
-0x0000801B;PidLidWorkAddress;Specifies the complete address of the work address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.8;dispidWorkAddress
-0x0000801C;PidLidOtherAddress;Specifies the complete address of the other address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.8;dispidOtherAddress
-0x00008022;PidLidPostalAddressId;Specifies which physical address is the mailing address for this contact.;PtypInteger32, 0x0003;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.9;dispidPostalAddressId
-0x00008023;PidLidContactCharacterSet;Specifies the character set used for a Contact object.;PtypInteger32, 0x0003;Contact Properties;[MS-OXOCNTC] section 2.2.1.10.18;dispidContactCharSet
-0x00008025;PidLidAutoLog;Specifies to the application whether to create a Journal object for each action associated with this Contact object.;PtypBoolean, 0x000B;Contact Properties;[MS-OXOCNTC] section 2.2.1.10.19;dispidAutoLog
-0x00008026;PidLidFileUnderList;Specifies a list of possible values for the PidLidFileUnderId property (section 2.133).;PtypMultipleInteger32, 0x1003;Contact Properties;[MS-OXOCNTC] section 2.2.1.1.13;dispidFileUnderList
-0x00008028;PidLidAddressBookProviderEmailList;Specifies which electronic address properties are set on the Contact object.;PtypMultipleInteger32, 0x1003;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.11;dispidABPEmailList
-0x00008029;PidLidAddressBookProviderArrayType;Specifies the state of the electronic addresses of the contact and represents a set of bit flags.;PtypInteger32, 0x0003;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.12;dispidABPArrayType
-0x0000802B;PidLidHtml;Specifies the business webpage URL of the contact. ;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.10.12;dispidHTML
-0x0000802C;PidLidYomiFirstName;Specifies the phonetic pronunciation of the given name of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.1.9;dispidYomiFirstName
-0x0000802D;PidLidYomiLastName;Specifies the phonetic pronunciation of the surname of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.1.10;dispidYomiLastName
-0x0000802E;PidLidYomiCompanyName;Specifies the phonetic pronunciation of the company name of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.6.8;dispidYomiCompanyName
-0x00008040;PidLidBusinessCardDisplayDefinition;Contains user customization details for displaying a contact as a business card. ;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.7.1;dispidBCDisplayDefinition
-0x00008041;PidLidBusinessCardCardPicture;Contains the image to be used on a business card.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.7.2;dispidBCCardPicture
-0x00008045;PidLidPromptSendUpdate;Indicates that the Meeting Response object was out-of-date when it was received.;PtypBoolean, 0x000B;Meeting Response;[MS-OXOCAL] section 2.2.7.8;dispidPromptSendUpdate
-0x00008045;PidLidWorkAddressStreet;Specifies the street portion of the work address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.1;dispidWorkAddressStreet
-0x00008046;PidLidWorkAddressCity;Specifies the city or locality portion of the work address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.2;dispidWorkAddressCity
-0x00008047;PidLidWorkAddressState;Specifies the state or province portion of the work address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.3;dispidWorkAddressState
-0x00008048;PidLidWorkAddressPostalCode;Specifies the postal code (ZIP code) portion of the work address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.4;dispidWorkAddressPostalCode
-0x00008049;PidLidWorkAddressCountry;Specifies the country or region portion of the work address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.5;dispidWorkAddressCountry
-0x0000804A;PidLidWorkAddressPostOfficeBox;Specifies the post office box portion of the work address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.7;dispidWorkAddressPostOfficeBox
-0x0000804C;PidLidDistributionListChecksum;Specifies the 32-bit cyclic redundancy check (CRC) polynomial checksum, as specified in [ISO/IEC8802-3], calculated on the value of the PidLidDistributionListMembers property (section 2.96).;PtypInteger32, 0x0003;Contact Properties;[MS-OXOCNTC] section 2.2.2.2.3;dispidDLChecksum
-0x0000804D;PidLidBirthdayEventEntryId;Specifies the EntryID of an optional Appointment object that represents the birthday of the contact.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.5.3;dispidBirthdayEventEID
-0x0000804E;PidLidAnniversaryEventEntryId;Specifies the EntryID of the Appointment object that represents an anniversary of the contact.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.5.6;dispidAnniversaryEventEID
-0x0000804F;PidLidContactUserField1;Contains text used to add custom text to a business card representation of a Contact object.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.7.3;dispidContactUserField1
-0x00008050;PidLidContactUserField2;Contains text used to add custom text to a business card representation of a Contact object.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.7.3;dispidContactUserField2
-0x00008051;PidLidContactUserField3;Contains text used to add custom text to a business card representation of a Contact object.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.7.3;dispidContactUserField3
-0x00008052;PidLidContactUserField4;Contains text used to add custom text to a business card representation of a Contact object.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.7.3;dispidContactUserField4
-0x00008053;PidLidDistributionListName;Specifies the name of the personal distribution list. ;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.2.1.2;dispidDLName
-0x00008054;PidLidDistributionListOneOffMembers;Specifies the list of one-off EntryIDs corresponding to the members of the personal distribution list. ;PtypMultipleBinary, 0x1102;Contact Properties;[MS-OXOCNTC] section 2.2.2.2.2;dispidDLOneOffMembers
-0x00008055;PidLidDistributionListMembers;Specifies the list of EntryIDs of the objects corresponding to the members of the personal distribution list. ;PtypMultipleBinary, 0x1102;Contact Properties;[MS-OXOCNTC] section 2.2.2.2.1;dispidDLMembers
-0x00008062;PidLidInstantMessagingAddress;Specifies the instant messaging address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.10.6;dispidInstMsg
-0x00008064;PidLidDistributionListStream;Specifies the list of EntryIDs and one-off EntryIDs corresponding to the members of the personal distribution list.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.2.2.4;dispidDLStream
-0x00008080;PidLidEmail1DisplayName;Specifies the user-readable display name for the email address.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.1;dispidEmail1DisplayName
-0x00008082;PidLidEmail1AddressType;Specifies the address type of an electronic address.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.2;dispidEmail1AddrType
-0x00008083;PidLidEmail1EmailAddress;Specifies the email address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.3;dispidEmail1EmailAddress
-0x00008084;PidLidEmail1OriginalDisplayName;Specifies the SMTP email address that corresponds to the email address for the Contact object.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.4;dispidEmail1OriginalDisplayName, Email1OriginalDisplayName, EXSCHEMA_MAPI_EMAIL1ORIGINALDISPLAYNAME
-0x00008085;PidLidEmail1OriginalEntryId;Specifies the EntryID of the object corresponding to this electronic address.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.5;dispidEmail1OriginalEntryID
-0x00008090;PidLidEmail2DisplayName;Specifies the user-readable display name for the email address.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.1;dispidEmail2DisplayName
-0x00008092;PidLidEmail2AddressType;Specifies the address type of the electronic address.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.2;dispidEmail2AddrType
-0x00008093;PidLidEmail2EmailAddress;Specifies the email address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.3;dispidEmail2EmailAddress
-0x00008094;PidLidEmail2OriginalDisplayName;Specifies the SMTP email address that corresponds to the email address for the Contact object.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.4;dispidEmail2OriginalDisplayName
-0x00008095;PidLidEmail2OriginalEntryId;Specifies the EntryID of the object that corresponds to this electronic address.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.5;dispidEmail2OriginalEntryID
-0x000080A0;PidLidEmail3DisplayName;Specifies the user-readable display name for the email address.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.1;dispidEmail3DisplayName
-0x000080A2;PidLidEmail3AddressType;Specifies the address type of the electronic address.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.2;dispidEmail3AddrType
-0x000080A3;PidLidEmail3EmailAddress;Specifies the email address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.3;dispidEmail3EmailAddress
-0x000080A4;PidLidEmail3OriginalDisplayName;Specifies the SMTP email address that corresponds to the email address for the Contact object.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.4;dispidEmail3OriginalDisplayName
-0x000080A5;PidLidEmail3OriginalEntryId;Specifies the EntryID of the object that corresponds to this electronic address.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.5;dispidEmail3OriginalEntryID
-0x000080B2;PidLidFax1AddressType;"Contains the string value ""FAX"".";PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.7;dispidFax1AddrType
-0x000080B3;PidLidFax1EmailAddress;"Contains a user-readable display name, followed by the ""@"" character, followed by a fax number.";PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.8;dispidFax1EmailAddress
-0x000080B4;PidLidFax1OriginalDisplayName;Contains the same value as the PidTagNormalizedSubject property (section 2.812).;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.9;dispidFax1OriginalDisplayName
-0x000080B5;PidLidFax1OriginalEntryId;Specifies a one-off EntryID that corresponds to this fax address.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.10;dispidFax1OriginalEntryID
-0x000080C2;PidLidFax2AddressType;"Contains the string value ""FAX"".";PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.7;dispidFax2AddrType
-0x000080C3;PidLidFax2EmailAddress;"Contains a user-readable display name, followed by the ""@"" character, followed by a fax number.";PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.8;dispidFax2EmailAddress
-0x000080C4;PidLidFax2OriginalDisplayName;Contains the same value as the PidTagNormalizedSubject property (section 2.812).;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.9;dispidFax2OriginalDisplayName
-0x000080C5;PidLidFax2OriginalEntryId;Specifies a one-off EntryID corresponding to this fax address.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.10;dispidFax2OriginalEntryID
-0x000080D2;PidLidFax3AddressType;"Contains the string value ""FAX"".";PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.7;dispidFax3AddrType
-0x000080D3;PidLidFax3EmailAddress;"Contains a user-readable display name, followed by the ""@"" character, followed by a fax number.";PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.8;dispidFax3EmailAddress
-0x000080D4;PidLidFax3OriginalDisplayName;Contains the same value as the PidTagNormalizedSubject property (section 2.812).;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.9;dispidFax3OriginalDisplayName
-0x000080D5;PidLidFax3OriginalEntryId;Specifies a one-off EntryID that corresponds to this fax address.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.2.10;dispidFax3OriginalEntryID
-0x000080D8;PidLidFreeBusyLocation;Specifies a URL path from which a client can retrieve free/busy status information for the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.10.10;dispidFreeBusyLocation
-0x000080DA;PidLidHomeAddressCountryCode;Specifies the country code portion of the home address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.6;dispidHomeAddressCountryCode
-0x000080DB;PidLidWorkAddressCountryCode;Specifies the country code portion of the work address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.6;dispidWorkAddressCountryCode
-0x000080DC;PidLidOtherAddressCountryCode;Specifies the country code portion of the other address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.6;dispidOtherAddressCountryCode
-0x000080DD;PidLidAddressCountryCode;Specifies the country code portion of the mailing address of the contact.;PtypString, 0x001F;Contact Properties;[MS-OXOCNTC] section 2.2.1.3.6;dispidAddressCountryCode
-0x000080DE;PidLidBirthdayLocal;Specifies the birthday of a contact.;PtypTime, 0x0040;Contact Properties;[MS-OXOCNTC] section 2.2.1.5.2;dispidApptBirthdayLocal
-0x000080DF;PidLidWeddingAnniversaryLocal;Specifies the wedding anniversary of the contact, at midnight in the client's local time zone, and is saved without any time zone conversions.;PtypTime, 0x0040;Contact Properties;[MS-OXOCNTC] section 2.2.1.5.5;dispidApptAnniversaryLocal
-0x000080E0;PidLidIsContactLinked;Specifies whether the contact is linked to other contacts.; PtypBoolean, 0x000B;Contact Properties;[MS-OXOCNTC] section 2.2.1.9.6;dispidIsContactLinked
-0x000080E2;PidLidContactLinkedGlobalAddressListEntryId;Specifies the EntryID of the GAL contact to which the duplicate contact is linked.; PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.9.1;dispidContactLinkedGALEntryID
-0x000080E3;PidLidContactLinkSMTPAddressCache;Contains a list of the SMTP addresses that are used by the contact.; PtypMultipleString, 0x101F;Contact Properties;[MS-OXOCNTC] section 2.2.1.9.5;dispidContactLinkSMTPAddressCache
-0x000080E5;PidLidContactLinkLinkRejectHistory;Contains a list of GAL contacts that were previously rejected for linking with the duplicate contact.; PtypMultipleBinary, 0x1102;Contact Properties;[MS-OXOCNTC] section 2.2.1.9.4;dispidContactLinkLinkRejectHistory
-0x000080E6;PidLidContactLinkGlobalAddressListLinkState;Specifies the state of the linking between the GAL contact and the duplicate contact.; PtypInteger32, 0x0003;Contact Properties;[MS-OXOCNTC] section 2.2.1.9.3;dispidContactLinkGALLinkState
-0x000080E8;PidLidContactLinkGlobalAddressListLinkId;Specifies the GUID of the GAL contact to which the duplicate contact is linked.; PtypGuid, 0x0048;Contact Properties;[MS-OXOCNTC] section 2.2.1.9.2;dispidContactLinkGALLinkID
-0x00008101;PidLidTaskStatus;Specifies the status of a task.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.2;dispidTaskStatus
-0x00008102;PidLidPercentComplete;Indicates whether a time-flagged Message object is complete.;PtypFloating64, 0x0005;Tasks;[MS-OXOFLAG] section 2.2.2.3;dispidPercentComplete
-0x00008103;PidLidTeamTask;This property is set by the client but is ignored by the server.;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.36;dispidTeamTask
-0x00008104;PidLidTaskStartDate;Specifies the date on which the user expects work on the task to begin.;PtypTime, 0x0040;Tasks;[MS-OXOTASK] section 2.2.2.2.4;dispidTaskStartDate
-0x00008105;PidLidTaskDueDate;Specifies the date by which the user expects work on the task to be complete.;PtypTime, 0x0040;Tasks;[MS-OXOTASK] section 2.2.2.2.5;dispidTaskDueDate
-0x00008107;PidLidTaskResetReminder;Indicates whether future instances of recurring tasks need reminders, even though the value of the PidLidReminderSet property (section 2.222) is 0x00.;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.6;dispidTaskResetReminder
-0x00008108;PidLidTaskAccepted;Indicates whether a task assignee has replied to a task request for this Task object.;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.7;dispidTaskAccepted
-0x00008109;PidLidTaskDeadOccurrence;Indicates whether new occurrences remain to be generated.;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.8;dispidTaskDeadOccur
-0x0000810F;PidLidTaskDateCompleted;Specifies the date when the user completed work on the task.;PtypTime, 0x0040;Tasks;[MS-OXOTASK] section 2.2.2.2.9;dispidTaskDateCompleted
-0x00008110;PidLidTaskActualEffort;Indicates the number of minutes that the user actually spent working on a task.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.11;dispidTaskActualEffort
-0x00008111;PidLidTaskEstimatedEffort;Indicates the number of minutes that the user expects to work on a task.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.12;dispidTaskEstimatedEffort
-0x00008112;PidLidTaskVersion;Indicates which copy is the latest update of a Task object.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.13;dispidTaskVersion
-0x00008113;PidLidTaskState;Indicates the current assignment state of the Task object.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.14;dispidTaskState
-0x00008115;PidLidTaskLastUpdate;Contains the date and time of the most recent change made to the Task object.;PtypTime, 0x0040;Tasks;[MS-OXOTASK] section 2.2.2.2.10;dispidTaskLastUpdate
-0x00008116;PidLidTaskRecurrence;Contains a RecurrencePattern structure that provides information about recurring tasks.;PtypBinary, 0x0102;Tasks;[MS-OXOTASK] section 2.2.2.2.15;dispidTaskRecur
-0x00008117;PidLidTaskAssigners;Contains a stack of entries, each of which represents a task assigner.;PtypBinary, 0x0102;Tasks;[MS-OXOTASK] section 2.2.2.2.16;dispidTaskMyDelegators
-0x00008119;PidLidTaskStatusOnComplete;Indicates whether the task assignee has been requested to send an email message update upon completion of the assigned task.;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.17;dispidTaskSOC
-0x0000811A;PidLidTaskHistory;Indicates the type of change that was last made to the Task object.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.18;dispidTaskHistory
-0x0000811B;PidLidTaskUpdates;Indicates whether the task assignee has been requested to send a task update when the assigned Task object changes.;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.19;dispidTaskUpdates
-0x0000811C;PidLidTaskComplete;Indicates that the task is complete.;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.20;dispidTaskComplete
-0x0000811E;PidLidTaskFCreator;Indicates that the Task object was originally created by the action of the current user or user agent instead of by the processing of a task request. ;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.21;dispidTaskFCreator
-0x0000811F;PidLidTaskOwner;Contains the name of the owner of the task.;PtypString, 0x001F;Tasks;[MS-OXOTASK] section 2.2.2.2.22;dispidTaskOwner
-0x00008120;PidLidTaskMultipleRecipients;Provides optimization hints about the recipients of a Task object.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.23;dispidTaskMultRecips
-0x00008121;PidLidTaskAssigner;Specifies the name of the user that last assigned the task.;PtypString, 0x001F;Tasks;[MS-OXOTASK] section 2.2.2.2.24;dispidTaskDelegator
-0x00008122;PidLidTaskLastUser;Contains the name of the most recent user to have been the owner of the task.;PtypString, 0x001F;Tasks;[MS-OXOTASK] section 2.2.2.2.25;dispidTaskLastUser
-0x00008123;PidLidTaskOrdinal;Provides an aid to custom sorting of Task objects.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.26;dispidTaskOrdinal
-0x00008124;PidLidTaskNoCompute;Not used. The client can set this property, but it has no impact on the Task-Related Objects Protocol and is ignored by the server.;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.35;dispidTaskNoCompute
-0x00008125;PidLidTaskLastDelegate;Contains the name of the user who most recently assigned the task, or the user to whom it was most recently assigned.;PtypString, 0x001F;Tasks;[MS-OXOTASK] section 2.2.2.2.27;dispidTaskLastDelegate
-0x00008126;PidLidTaskFRecurring;Indicates whether the task includes a recurrence pattern.;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.28;dispidTaskFRecur
-0x00008127;PidLidTaskRole;Not used. The client can set this property, but it has no impact on the Task-Related Objects Protocol and is ignored by the server.;PtypString, 0x001F;Tasks;[MS-OXOTASK] section 2.2.2.2.34;dispidTaskRole
-0x00008129;PidLidTaskOwnership;Indicates the role of the current user relative to the Task object.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.29;dispidTaskOwnership
-0x0000812A;PidLidTaskAcceptanceState;Indicates the acceptance state of the task.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.30;dispidTaskDelegValue
-0x0000812C;PidLidTaskFFixOffline;Indicates the accuracy of the PidLidTaskOwner property (section 2.328).;PtypBoolean, 0x000B;Tasks;[MS-OXOTASK] section 2.2.2.2.31;dispidTaskFFixOffline
-0x00008139;PidLidTaskCustomFlags;The client can set this property, but it has no impact on the Task-Related Objects Protocol and is ignored by the server.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.2.2.33;dispidTaskCustomFlags
-0x00008201;PidLidAppointmentSequence;Specifies the sequence number of a Meeting object.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.1.1;dispidApptSequence
-0x00008202;PidLidAppointmentSequenceTime;Indicates the date and time at which the PidLidAppointmentSequence property (section 2.25) was last modified.;PtypTime, 0x0040;Meetings;[MS-OXOCAL] section 2.2.4.1;dispidApptSeqTime
-0x00008203;PidLidAppointmentLastSequence;Indicates to the organizer the last sequence number that was sent to any attendee.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.4.2;dispidApptLastSequence
-0x00008204;PidLidChangeHighlight;Specifies a bit field that indicates how the Meeting object has changed.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.6.2;dispidChangeHighlight
-0x00008205;PidLidBusyStatus;Specifies the availability of a user for the event described by the object.;PtypInteger32, 0x0003;Calendar;[MS-OXOCAL] section 2.2.1.2;dispidBusyStatus
-0x00008206;PidLidFExceptionalBody;Indicates that the Exception Embedded Message object has a body that differs from the Recurring Calendar object. ;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.10.2.6;dispidFExceptionalBody
-0x00008207;PidLidAppointmentAuxiliaryFlags;Specifies a bit field that describes the auxiliary state of the object.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.1.3;dispidApptAuxFlags
-0x00008208;PidLidLocation;Specifies the location of the event.;PtypString, 0x001F;Calendar;[MS-OXOCAL] section 2.2.1.4;dispidLocation
-0x00008209;PidLidMeetingWorkspaceUrl;Specifies the URL of the Meeting Workspace that is associated with a Calendar object.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.1.48;dispidMWSURL
-0x0000820A;PidLidForwardInstance;Indicates whether the Meeting Request object represents an exception to a recurring series, and whether it was forwarded (even when forwarded by the organizer) rather than being an invitation sent by the organizer.;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.6.3;dispidFwrdInstance
-0x0000820C;PidLidLinkedTaskItems;Indicates whether the user did not include any text in the body of the Meeting Response object.;PtypMultipleBinary, 0x1102;Tasks;[MS-OXOCAL] section 2.2.1.47;dispidLinkedTaskItems
-0x0000820D;PidLidAppointmentStartWhole;Specifies the start date and time of the appointment.;PtypTime, 0x0040;Calendar;[MS-OXOCAL] section 2.2.1.5;dispidApptStartWhole
-0x0000820E;PidLidAppointmentEndWhole;Specifies the end date and time for the event.;PtypTime, 0x0040;Calendar;[MS-OXOCAL] section 2.2.1.6;dispidApptEndWhole
-0x0000820F;PidLidAppointmentStartTime;Identifies the time that the appointment starts.;PtypTime, 0x0040;Calendar;[MS-XWDCAL] section 2.2.7.11;dispidApptStartTime
-0x00008210;PidLidAppointmentEndTime;Indicates the time that the appointment ends.;PtypTime, 0x0040;Calendar;[MS-XWDCAL] section 2.2.7.4;dispidApptEndTime
-0x00008211;PidLidAppointmentEndDate;Indicates the date that the appointment ends.;PtypTime, 0x0040;Calendar;[MS-XWDCAL] section 2.2.7.3;dispidApptEndDate
-0x00008212;PidLidAppointmentStartDate;Identifies the date that the appointment starts.;PtypTime, 0x0040;Calendar;[MS-XWDCAL] section 2.2.7.10;dispidApptStartDate
-0x00008213;PidLidAppointmentDuration;Specifies the length of the event, in minutes.;PtypInteger32, 0x0003;Calendar;[MS-OXOCAL] section 2.2.1.7;dispidApptDuration
-0x00008214;PidLidAppointmentColor;Specifies the color to be used when displaying the Calendar object.;PtypInteger32, 0x0003;Calendar;[MS-OXOCAL] section 2.2.1.50;dispidApptColor
-0x00008215;PidLidAppointmentSubType;Specifies whether the event is an all-day event.;PtypBoolean, 0x000B;Calendar;[MS-OXOCAL] section 2.2.1.9;dispidApptSubType
-0x00008216;PidLidAppointmentRecur;Specifies the dates and times when a recurring series occurs.;PtypBinary, 0x0102;Calendar;[MS-OXOCAL] section 2.2.1.44;dispidApptRecur
-0x00008217;PidLidAppointmentStateFlags;Specifies a bit field that describes the state of the object.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.1.10;dispidApptStateFlags
-0x00008218;PidLidResponseStatus;Specifies the response status of an attendee.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.1.11;dispidResponseStatus
-0x00008220;PidLidAppointmentReplyTime;Specifies the date and time at which the attendee responded to a received meeting request or Meeting Update object.;PtypTime, 0x0040;Meetings;[MS-OXOCAL] section 2.2.4.3;dispidApptReplyTime
-0x00008223;PidLidRecurring;Specifies whether the object represents a recurring series.;PtypBoolean, 0x000B;Calendar;[MS-OXOCAL] section 2.2.1.12;dispidRecurring
-0x00008224;PidLidIntendedBusyStatus;Contains the value of the PidLidBusyStatus property (section 2.47) on the Meeting object in the organizer's calendar at the time that the Meeting Request object or Meeting Update object was sent.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.6.4;dispidIntendedBusyStatus
-0x00008226;PidLidAppointmentUpdateTime;Indicates the time at which the appointment was last updated.;PtypTime, 0x0040;Meetings;[MS-XWDCAL] section 2.2.7.15;dispidApptUpdateTime
-0x00008228;PidLidExceptionReplaceTime;Specifies the date and time, in UTC, within a recurrence pattern that an exception will replace.;PtypTime, 0x0040;Calendar;[MS-OXOCAL] section 2.2.10.2.5;dispidExceptionReplaceTime
-0x00008229;PidLidFInvited;Indicates whether invitations have been sent for the meeting that this Meeting object represents.;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.4.4;dispidFInvited
-0x0000822B;PidLidFExceptionalAttendees;Indicates that the object is a Recurring Calendar object with one or more exceptions, and that at least one of the Exception Embedded Message objects has at least one RecipientRow structure, as described in [MS-OXCDATA] section 2.8.3.;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.2.3;dispidFExceptionalAttendees
-0x0000822E;PidLidOwnerName;Indicates the name of the owner of the mailbox.;PtypString, 0x001F;Meetings;[MS-XWDCAL] section 2.2.7.47;dispidOwnerName
-0x0000822F;PidLidFOthersAppointment;Indicates whether the Calendar folder from which the meeting was opened is another user's calendar.;PtypBoolean, 0x000B;Meetings;[MS-XWDCAL] section 2.2.7.26;dispidFOthersAppt, http://schemas.microsoft.com/mapi/fothersappt
-0x00008230;PidLidAppointmentReplyName;Specifies the user who last replied to the meeting request or meeting update.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.4.5;dispidApptReplyName, http://schemas.microsoft.com/mapi/apptreplyname
-0x00008231;PidLidRecurrenceType;Specifies the recurrence type of the recurring series.;PtypInteger32, 0x0003;Calendar;[MS-OXOCAL] section 2.2.1.45;dispidRecurType
-0x00008232;PidLidRecurrencePattern;Specifies a description of the recurrence pattern of the Calendar object.;PtypString, 0x001F;Calendar;[MS-OXOCAL] section 2.2.1.46;dispidRecurPattern
-0x00008233;PidLidTimeZoneStruct;Specifies time zone information for a recurring meeting.;PtypBinary, 0x0102;Calendar;[MS-OXOCAL] section 2.2.1.39;dispidTimeZoneStruct
-0x00008234;PidLidTimeZoneDescription;Specifies a human-readable description of the time zone that is represented by the data in the PidLidTimeZoneStruct property (section 2.342).;PtypString, 0x001F;Calendar;[MS-OXOCAL] section 2.2.1.40;dispidTimeZoneDesc
-0x00008235;PidLidClipStart;Specifies the start date and time of the event in UTC.;PtypTime, 0x0040;Calendar;[MS-OXOCAL] section 2.2.1.14;dispidClipStart
-0x00008236;PidLidClipEnd;Specifies the end date and time of the event in UTC.;PtypTime, 0x0040;Calendar;[MS-OXOCAL] section 2.2.1.15;dispidClipEnd
-0x00008237;PidLidOriginalStoreEntryId;Specifies the EntryID of the delegator’s message store.;PtypBinary, 0x0102;Meetings; [MS-OXOCAL] section 2.2.4.9;dispidOrigStoreEid, http://schemas.microsoft.com/mapi/origstoreeid
-0x00008238;PidLidAllAttendeesString;Specifies a list of all the attendees except for the organizer, including resources and unsendable attendees.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.1.16;dispidAllAttendeesString
-0x0000823A;PidLidAutoFillLocation;Indicates whether the value of the PidLidLocation property (section 2.159) is set to the PidTagDisplayName property (section 2.676).;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.4.8;dispidAutoFillLocation
-0x0000823B;PidLidToAttendeesString;Contains a list of all of the sendable attendees who are also required attendees.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.1.17;dispidToAttendeesString
-0x0000823C;PidLidCcAttendeesString;Contains a list of all the sendable attendees who are also optional attendees.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.1.18;dispidCCAttendeesString
-0x00008240;PidLidConferencingCheck;;PtypBoolean, 0x000B;Conferencing;[MS-OXOCAL] section 2.2.1.56.2;dispidConfCheck
-0x00008241;PidLidConferencingType;Specifies the type of the meeting. ;PtypInteger32, 0x0003;Conferencing;[MS-OXOCAL] section 2.2.1.56.3;dispidConfType
-0x00008242;PidLidDirectory;Specifies the directory server to be used.;PtypString, 0x001F;Conferencing;[MS-OXOCAL] section 2.2.1.56.4;dispidDirectory
-0x00008243;PidLidOrganizerAlias;Specifies the email address of the organizer.;PtypString, 0x001F;Conferencing;[MS-OXOCAL] section 2.2.1.56.6;dispidOrgAlias
-0x00008244;PidLidAutoStartCheck;Specifies whether to automatically start the conferencing application when a reminder for the start of a meeting is executed.;PtypBoolean, 0x000B;Conferencing;[MS-OXOCAL] section 2.2.1.56.1 ;dispidAutoStartCheck
-0x00008246;PidLidAllowExternalCheck;This property is set to TRUE.;PtypBoolean, 0x000B;Conferencing;[MS-OXOCAL] section 2.2.1.56.5;dispidAllowExternCheck
-0x00008247;PidLidCollaborateDoc;Specifies the document to be launched when the user joins the meeting. ;PtypString, 0x001F;Conferencing;[MS-OXOCAL] section 2.2.1.56.7;dispidCollaborateDoc
-0x00008248;PidLidNetShowUrl;Specifies the URL to be launched when the user joins the meeting.;PtypString, 0x001F;Conferencing;[MS-OXOCAL] section 2.2.1.56.8;dispidNetShowURL
-0x00008249;PidLidOnlinePassword;Specifies the password for a meeting on which the PidLidConferencingType property (section 2.66) has the value 0x00000002. ;PtypString, 0x001F;Conferencing;[MS-OXOCAL] section 2.2.1.56.9;dispidOnlinePassword
-0x00008250;PidLidAppointmentProposedStartWhole;Specifies the proposed value for the PidLidAppointmentStartWhole property (section 2.29) for a counter proposal.;PtypTime, 0x0040;Meetings;[MS-OXOCAL] section 2.2.7.3;dispidApptProposedStartWhole
-0x00008251;PidLidAppointmentProposedEndWhole;Specifies the proposed value for the PidLidAppointmentEndWhole property (section 2.14) for a counter proposal.;PtypTime, 0x0040;Meetings;[MS-OXOCAL] section 2.2.7.4;dispidApptProposedEndWhole
-0x00008256;PidLidAppointmentProposedDuration;Indicates the proposed value for the PidLidAppointmentDuration property (section 2.11) for a counter proposal.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.7.5;dispidApptProposedDuration
-0x00008257;PidLidAppointmentCounterProposal;Indicates whether a Meeting Response object is a counter proposal.;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.4.7;dispidApptCounterProposal
-0x00008259;PidLidAppointmentProposalNumber;Specifies the number of attendees who have sent counter proposals that have not been accepted or rejected by the organizer.;PtypInteger32, 0x0003;Meetings;[MS-OXOCAL] section 2.2.4.6;dispidApptProposalNum
-0x0000825A;PidLidAppointmentNotAllowPropose;Indicates whether attendees are not allowed to propose a new date and/or time for the meeting.;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.1.26;dispidApptNotAllowPropose
-0x0000825D;PidLidAppointmentUnsendableRecipients;Contains a list of unsendable attendees.;PtypBinary, 0x0102;Meetings;[MS-OXOCAL] section 2.2.1.25;dispidApptUnsendableRecips
-0x0000825E;PidLidAppointmentTimeZoneDefinitionStartDisplay;Specifies time zone information that indicates the time zone of the PidLidAppointmentStartWhole property (section 2.29).;PtypBinary, 0x0102;Calendar;[MS-OXOCAL] section 2.2.1.42;dispidApptTZDefStartDisplay
-0x0000825F;PidLidAppointmentTimeZoneDefinitionEndDisplay;Specifies time zone information that indicates the time zone of the PidLidAppointmentEndWhole property (section 2.14).;PtypBinary, 0x0102;Calendar;[MS-OXOCAL] section 2.2.1.43;dispidApptTZDefEndDisplay
-0x00008260;PidLidAppointmentTimeZoneDefinitionRecur;Specifies time zone information that describes how to convert the meeting date and time on a recurring series to and from UTC.;PtypBinary, 0x0102;Calendar;[MS-OXOCAL] section 2.2.1.41;dispidApptTZDefRecur
-0x00008261;PidLidForwardNotificationRecipients;Contains a list of RecipientRow structures, as described in [MS-OXCDATA] section 2.8.3, that indicate the recipients of a meeting forward. ;PtypBinary, 0x0102;Meetings;[MS-OXOCAL] section 2.2.9.3;dispidForwardNotificationRecipients
-0x0000827A;PidLidInboundICalStream;Contains the contents of the iCalendar MIME part of the original MIME message.;PtypBinary, 0x0102;Calendar;[MS-OXCICAL] section 2.1.3.4.1;InboundICalStream, dispidInboundICalStream
-0x0000827B;PidLidSingleBodyICal;Indicates that the original MIME message contained a single MIME part.;PtypBoolean, 0x000B;Calendar;[MS-OXCICAL] section 2.1.3.4.2;IsSingleBodyICal, dispidIsSingleBodyICal
-0x00008501;PidLidReminderDelta;Specifies the interval, in minutes, between the time at which the reminder first becomes overdue and the start time of the Calendar object.;PtypInteger32, 0x0003;Reminders;[MS-OXORMDR] section 2.2.1.3;dispidReminderDelta, http://schemas.microsoft.com/mapi/reminderdelta
-0x00008502;PidLidReminderTime;Specifies the initial signal time for objects that are not Calendar objects.;PtypTime, 0x0040;Reminders;[MS-OXORMDR] section 2.2.1.4;dispidReminderTime
-0x00008503;PidLidReminderSet;Specifies whether a reminder is set on the object.;PtypBoolean, 0x000B;Reminders;[MS-OXORMDR] section 2.2.1.1;dispidReminderSet
-0x00008504;PidLidReminderTimeTime;Indicates the time of the reminder for the appointment or meeting.;PtypTime, 0x0040;Reminders;[MS-XWDCAL] section 2.2.7.60;dispidReminderTimeTime
-0x00008505;PidLidReminderTimeDate;Indicates the time and date of the reminder for the appointment or meeting.;PtypTime, 0x0040;Reminders;[MS-XWDCAL] section 2.2.7.59;dispidReminderTimeDate
-0x00008506;PidLidPrivate;Indicates whether the end user wishes for this Message object to be hidden from other users who have access to the Message object.;PtypBoolean, 0x000B;General Message Properties;[MS-OXCMSG] section 2.2.1.15;dispidPrivate
-0x0000850E;PidLidAgingDontAgeMe;Specifies whether to automatically archive the message.;PtypBoolean, 0x000B;Common;[MS-OXCMSG] section 2.2.1.33;dispidAgingDontAgeMe
-0x00008510;PidLidSideEffects;Specifies how a Message object is handled by the client in relation to certain user interface actions by the user, such as deleting a message.;PtypInteger32, 0x0003;Run-time configuration;[MS-OXCMSG] section 2.2.1.16;dispidSideEffects
-0x00008511;PidLidRemoteStatus;Indicates the remote status of the calendar item.;PtypInteger32, 0x0003;Run-time configuration;[MS-XWDCAL] section 2.2.7.62;dispidRemoteStatus
-0x00008514;PidLidSmartNoAttach;Indicates whether the Message object has no end-user visible attachments.;PtypBoolean, 0x000B;Run-time configuration;[MS-OXCMSG] section 2.2.1.14;dispidSmartNoAttach
-0x00008516;PidLidCommonStart;Indicates the start time for the Message object. ;PtypTime, 0x0040;General Message Properties;[MS-OXCMSG] section 2.2.1.18;dispidCommonStart
-0x00008517;PidLidCommonEnd;Indicates the end time for the Message object. ;PtypTime, 0x0040;General Message Properties;[MS-OXCMSG] section 2.2.1.19;dispidCommonEnd
-0x00008518;PidLidTaskMode;Specifies the assignment status of the embedded Task object.;PtypInteger32, 0x0003;Tasks;[MS-OXOTASK] section 2.2.3.2;dispidTaskMode
-0x00008519;PidLidTaskGlobalId;Contains a unique GUID for this task, which is used to locate an existing task upon receipt of a task response or task update.;PtypBinary, 0x0102;Tasks;[MS-OXOTASK] section 2.2.2.2.32;dispidTaskGlobalObjId
-0x0000851A;PidLidAutoProcessState;Specifies the options used in the automatic processing of email messages.;PtypInteger32, 0x0003;General Message Properties;[MS-OXOMSG] section 2.2.1.73;dispidSniffState
-0x0000851C;PidLidReminderOverride;Specifies whether the client is to respect the current values of the PidLidReminderPlaySound property (section 2.221) and the PidLidReminderFileParameter property (section 2.219), or use the default values for those properties.;PtypBoolean, 0x000B;Reminders;[MS-OXORMDR] section 2.2.1.5;dispidReminderOverride
-0x0000851D;PidLidReminderType;This property is not set and, if set, is ignored.;PtypInteger32, 0x0003;Reminders;[MS-OXORMDR] section 2.2.1.9;dispidReminderType, http://schemas.microsoft.com/mapi/remindertype
-0x0000851E;PidLidReminderPlaySound;Specifies whether the client is to play a sound when the reminder becomes overdue.;PtypBoolean, 0x000B;Reminders;[MS-OXORMDR] section 2.2.1.6;dispidReminderPlaySound
-0x0000851F;PidLidReminderFileParameter;Specifies the filename of the sound that a client is to play when the reminder for that object becomes overdue. ;PtypString, 0x001F;Reminders;[MS-OXORMDR] section 2.2.1.7;dispidReminderFileParam
-0x00008520;PidLidVerbStream;Specifies what voting responses the user can make in response to the message.;PtypBinary, 0x0102;Run-time configuration;[MS-OXOMSG] section 2.2.1.74;dispidVerbStream
-0x00008524;PidLidVerbResponse;Specifies the voting option that a respondent has selected.;PtypString, 0x001F;General Message Properties;[MS-OXOMSG] section 2.2.1.75;dispidVerbResponse
-0x00008530;PidLidFlagRequest;Contains user-specifiable text to be associated with the flag.;PtypString, 0x001F;Flagging;[MS-OXOFLAG] section 2.2.1.9;dispidRequest
-0x00008535;PidLidBilling;Specifies billing information for the contact.;PtypString, 0x001F;General Message Properties;[MS-OXOCNTC] section 2.2.1.10.24;dispidBilling
-0x00008536;PidLidNonSendableTo;Contains a list of all of the unsendable attendees who are also required attendees.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.1.19;dispidNonSendableTo
-0x00008537;PidLidNonSendableCc;Contains a list of all of the unsendable attendees who are also optional attendees.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.1.20;dispidNonSendableCC
-0x00008538;PidLidNonSendableBcc;Contains a list of all of the unsendable attendees who are also resources.;PtypString, 0x001F;Meetings;[MS-OXOCAL] section 2.2.1.21;dispidNonSendableBCC
-0x00008539;PidLidCompanies;Contains a list of company names, each of which is associated with a contact that is specified in the PidLidContacts property ([MS-OXCMSG] section 2.2.1.57.2).;PtypMultipleString, 0x101F;General Message Properties;[MS-OXOJRNL] section 2.2.2.4;dispidCompanies, http://schemas.microsoft.com/exchange/companies
-0x0000853A;PidLidContacts;Contains the PidTagDisplayName property (section 2.676) of each Address Book EntryID referenced in the value of the PidLidContactLinkEntry property (section 2.70).;PtypMultipleString, 0x101F;General Message Properties;[MS-OXCMSG] section 2.2.1.57.2;dispidContacts
-0x00008543;PidLidNonSendToTrackStatus;Contains the value from the response table.;PtypMultipleInteger32, 0x1003;General Message Properties;[MS-OXOCAL] section 2.2.1.22;dispidNonSendToTrackStatus
-0x00008544;PidLidNonSendCcTrackStatus;Contains the value from the response table.;PtypMultipleInteger32, 0x1003;General Message Properties;[MS-OXOCAL] section 2.2.1.23;dispidNonSendCcTrackStatus
-0x00008545;PidLidNonSendBccTrackStatus;Contains the value from the response table.;PtypMultipleInteger32, 0x1003;General Message Properties;[MS-OXOCAL] section 2.2.1.24;dispidNonSendBccTrackStatus
-0x00008552;PidLidCurrentVersion;Specifies the build number of the client application that sent the message.;PtypInteger32, 0x0003;General Message Properties;[MS-OXCMSG] section 2.2.1.34;dispidCurrentVersion
-0x00008554;PidLidCurrentVersionName;Specifies the name of the client application that sent the message.;PtypString, 0x001F;General Message Properties;[MS-OXCMSG] section 2.2.1.35;dispidCurrentVersionName
-0x00008560;PidLidReminderSignalTime;Specifies the point in time when a reminder transitions from pending to overdue. ;PtypTime, 0x0040;Reminders;[MS-OXORMDR] section 2.2.1.2;dispidReminderNextTime
-0x00008580;PidLidInternetAccountName;Specifies the user-visible email account name through which the email message is sent.;PtypString, 0x001F;General Message Properties;[MS-OXOMSG] section 2.2.1.62;dispidInetAcctName
-0x00008581;PidLidInternetAccountStamp;Specifies the email account ID through which the email message is sent.;PtypString, 0x001F;General Message Properties;[MS-OXOMSG] section 2.2.1.63;dispidInetAcctStamp
-0x00008582;PidLidUseTnef;Specifies whether Transport Neutral Encapsulation Format (TNEF) is to be included on a message when the message is converted from TNEF to MIME or SMTP format.;PtypBoolean, 0x000B;Run-time configuration;[MS-OXOMSG] section 2.2.1.66;dispidUseTNEF
-0x00008584;PidLidContactLinkSearchKey;Contains the list of SearchKeys for a Contact object linked to by the Message object.;PtypBinary, 0x0102;Contact Properties;[MS-OXCMSG] section 2.2.1.57.4;dispidContactLinkSearchKey
-0x00008585;PidLidContactLinkEntry;Contains the elements of the PidLidContacts property (section 2.77).;PtypBinary, 0x0102;Contact Properties;[MS-OXCMSG] section 2.2.1.57.1;dispidContactLinkEntry
-0x00008586;PidLidContactLinkName;;PtypString, 0x001F;Contact Properties;[MS-OXCMSG] section 2.2.1.57.3;dispidContactLinkName
-0x0000859C;PidLidSpamOriginalFolder;Specifies which folder a message was in before it was filtered into the Junk Email folder.;PtypBinary, 0x0102;Spam;[MS-OXCSPAM] section 2.2.1.1;dispidSpamOriginalFolder
-0x000085A0;PidLidToDoOrdinalDate;Contains the current time, in UTC, which is used to determine the sort order of objects in a consolidated to-do list.;PtypTime, 0x0040;Tasks;[MS-OXOFLAG] section 2.2.1.13;dispidToDoOrdinalDate
-0x000085A1;PidLidToDoSubOrdinal;Contains the numerals 0 through 9 that are used to break a tie when the PidLidToDoOrdinalDate property (section 2.344) is used to perform a sort of objects.;PtypString, 0x001F;Tasks;[MS-OXOFLAG] section 2.2.1.14;dispidToDoSubOrdinal
-0x000085A4;PidLidToDoTitle;Contains user-specifiable text to identify this Message object in a consolidated to-do list.;PtypString, 0x001F;Tasks;[MS-OXOFLAG] section 2.2.1.12;dispidToDoTitle
-0x000085B1;PidLidInfoPathFormName;Contains the name of the form associated with this message.;PtypString, 0x001F;Common;[MS-OXCMSG] section 2.2.1.27;
-0x000085B5;PidLidClassified;Indicates whether the contents of this message are regarded as classified information.;PtypBoolean, 0x000B;General Message Properties;[MS-OXCMSG] section 2.2.1.25;dispidClassified
-0x000085B6;PidLidClassification;Contains a list of the classification categories to which the associated Message object has been assigned.;PtypString, 0x001F;General Message Properties;[MS-OXCMSG] section 2.2.1.23;dispidClassification
-0x000085B7;PidLidClassificationDescription;Contains a human-readable summary of each of the classification categories included in the PidLidClassification property (section 2.53).;PtypString, 0x001F;General Message Properties;[MS-OXCMSG] section 2.2.1.24;dispidClassDesc
-0x000085B8;PidLidClassificationGuid;Contains the GUID that identifies the list of email classification categories used by a Message object.;PtypString, 0x001F;General Message Properties;[MS-OXCMAIL] section 2.5.1;dispidClassGuid
-0x000085BA;PidLidClassificationKeep;Indicates whether the message uses any classification categories.;PtypBoolean, 0x000B;General Message Properties;[MS-OXCMAIL] section 2.5.2;dispidClassKeep
-0x000085BD;PidLidReferenceEntryId;Specifies the value of the EntryID of the Contact object unless the Contact object is a copy of an earlier original.;PtypBinary, 0x0102;Contact Properties;[MS-OXOCNTC] section 2.2.1.10.1;dispidReferenceEID
-0x000085BF;PidLidValidFlagStringProof;Contains the value of the PidTagMessageDeliveryTime property (section 2.789) when modifying the PidLidFlagRequest property (section 2.136).;PtypTime, 0x0040;Tasks;[MS-OXOFLAG] section 2.2.1.11;dispidValidFlagStringProof
-0x000085C0;PidLidFlagString;Contains an index identifying one of a set of pre-defined text strings to be associated with the flag.;PtypInteger32, 0x0003;Tasks;[MS-OXOFLAG] section 2.2.1.10;dispidFlagStringEnum
-0x000085C6;PidLidConversationActionMoveFolderEid;Contains the EntryID for the destination folder.;PtypBinary, 0x0102;Conversation Actions;[MS-OXOCFG] section 2.2.8.3;dispidConvActionMoveFolderEid
-0x000085C7;PidLidConversationActionMoveStoreEid;Contains the EntryID for a move to a folder in a different message store.;PtypBinary, 0x0102;Conversation Actions;[MS-OXOCFG] section 2.2.8.4;dispidConvActionMoveStoreEid
-0x000085C8;PidLidConversationActionMaxDeliveryTime;Contains the maximum value of the PidTagMessageDeliveryTime property (section 2.789) of all of the Email objects modified in response to the last time that the user changed a conversation action on the client.;PtypTime, 0x0040;Conversation Actions;[MS-OXOCFG] section 2.2.8.2;dispidConvActionMaxDeliveryTime
-0x000085C9;PidLidConversationProcessed;Specifies a sequential number to be used in the processing of a conversation action.;PtypInteger32, 0x0003;Conversation Actions;[MS-OXOCFG] section 2.2.8.6;dispidConvExLegacyProcessedRand
-0x000085CA;PidLidConversationActionLastAppliedTime;Contains the time, in UTC, that an Email object was last received in the conversation, or the last time that the user modified the conversation action, whichever occurs later.;PtypTime, 0x0040;Conversation Actions;[MS-OXOCFG] section 2.2.8.1;dispidConvActionLastAppliedTime
-0x000085CB;PidLidConversationActionVersion;Contains the version of the conversation action FAI message.;PtypInteger32, 0x0003;Conversation Actions;[MS-OXOCFG] section 2.2.8.5;dispidConvActionVersion
-0x000085CC;PidLidServerProcessed;Indicates whether the Meeting Request object or Meeting Update object has been processed.;PtypBoolean, 0x000B;Calendar;[MS-OXOCAL] section 2.2.5.4;dispidExchangeProcessed
-0x000085CD;PidLidServerProcessingActions;Indicates what processing actions have been taken on this Meeting Request object or Meeting Update object.;PtypInteger32, 0x0003;Calendar;[MS-OXOCAL] section 2.2.5.5;dispidExchangeProcessingAction
-0x000085E0;PidLidPendingStateForSiteMailboxDocument;Specifies the synchronization state of the Document object that is in the Document Libraries folder of the site mailbox.; PtypInteger32, 0x0003;Site Mailbox ;[MS-OXODOC] section 2.2.1.34;dispidPendingStateforTMDocument
-0x00008700;PidLidLogType;Briefly describes the journal activity that is being recorded.;PtypString, 0x001F;Journal;[MS-OXOJRNL] section 2.2.1.1;dispidLogType
-0x00008706;PidLidLogStart;Contains the time, in UTC, at which the activity began.;PtypTime, 0x0040;Journal;[MS-OXOJRNL] section 2.2.1.3;dispidLogStart
-0x00008707;PidLidLogDuration;Contains the duration, in minutes, of the activity.;PtypInteger32, 0x0003;Journal;[MS-OXOJRNL] section 2.2.1.5;dispidLogDuration
-0x00008708;PidLidLogEnd;Contains the time, in UTC, at which the activity ended.;PtypTime, 0x0040;Journal;[MS-OXOJRNL] section 2.2.1.4;dispidLogEnd
-0x0000870C;PidLidLogFlags;Contains metadata about the Journal object.;PtypInteger32, 0x0003;Journal;[MS-OXOJRNL] section 2.2.1.6;dispidLogFlags
-0x0000870E;PidLidLogDocumentPrinted;Indicates whether the document was printed during journaling.;PtypBoolean, 0x000B;Journal;[MS-OXOJRNL] section 2.2.1.7;dispidLogDocPrinted
-0x0000870F;PidLidLogDocumentSaved;Indicates whether the document was saved during journaling.;PtypBoolean, 0x000B;Journal;[MS-OXOJRNL] section 2.2.1.8;dispidLogDocSaved
-0x00008710;PidLidLogDocumentRouted;Indicates whether the document was sent to a routing recipient during journaling.;PtypBoolean, 0x000B;Journal;[MS-OXOJRNL] section 2.2.1.9;dispidLogDocRouted
-0x00008711;PidLidLogDocumentPosted;Indicates whether the document was sent by email or posted to a server folder during journaling. ;PtypBoolean, 0x000B;Journal;[MS-OXOJRNL] section 2.2.1.10;dispidLogDocPosted
-0x00008712;PidLidLogTypeDesc;Contains an expanded description of the journal activity that is being recorded.;PtypString, 0x001F;Journal;[MS-OXOJRNL] section 2.2.1.2;dispidLogTypeDesc
-0x00008900;PidLidPostRssChannelLink;Contains the URL of the RSS or Atom feed from which the XML file came.;PtypString, 0x001F;RSS;[MS-OXORSS] section 2.2.1.1;dispidPostRssChannelLink
-0x00008901;PidLidPostRssItemLink;Contains the URL of the link from an RSS or Atom item.;PtypString, 0x001F;RSS;[MS-OXORSS] section 2.2.1.2;dispidPostRssItemLink
-0x00008902;PidLidPostRssItemHash;Contains a hash of the feed XML computed by using an implementation-dependent algorithm.;PtypInteger32, 0x0003;RSS;[MS-OXORSS] section 2.2.1.3;dispidPostRssItemHash
-0x00008903;PidLidPostRssItemGuid;Contains a unique identifier for the RSS object.;PtypString, 0x001F;RSS;[MS-OXORSS] section 2.2.1.4;dispidPostRssItemGuid
-0x00008904;PidLidPostRssChannel;Contains the contents of the title field from the XML of the Atom feed or RSS channel.;PtypString, 0x001F;RSS;[MS-OXORSS] section 2.2.1.5;dispidPostRssChannel
-0x00008905;PidLidPostRssItemXml;Contains the item element and all of its sub-elements from an RSS feed, or the entry element and all of its sub-elements from an Atom feed.;PtypString, 0x001F;RSS;[MS-OXORSS] section 2.2.1.6;dispidPostRssItemXml
-0x00008906;PidLidPostRssSubscription;Contains the user's preferred name for the RSS or Atom subscription.;PtypString, 0x001F;RSS;[MS-OXORSS] section 2.2.1.7;dispidPostRssSubscription
-0x00008A00;PidLidSharingStatus;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingStatus
-0x00008A01;PidLidSharingProviderGuid;"Contains the value ""%xAE.F0.06.00.00.00.00.00.C0.00.00.00.00.00.00.46"".";PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.2.12;dispidSharingProviderGuid
-0x00008A02;PidLidSharingProviderName;Contains a user-displayable name of the sharing provider identified by the PidLidSharingProviderGuid property (section 2.266).;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.14;dispidSharingProviderName
-0x00008A03;PidLidSharingProviderUrl;Contains a URL related to the sharing provider identified by the PidLidSharingProviderGuid property (section 2.266).;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.16;dispidSharingProviderUrl
-0x00008A04;PidLidSharingRemotePath;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRemotePath
-0x00008A05;PidLidSharingRemoteName;Contains the value of the PidTagDisplayName property (section 2.676) on the folder being shared.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.3.1;dispidSharingRemoteName
-0x00008A06;PidLidSharingRemoteUid;Contains the EntryID of the folder being shared.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.3.7;dispidSharingRemoteUid
-0x00008A07;PidLidSharingInitiatorName;Contains the value of the PidTagDisplayName property (section 2.676) from the Address Book object identified by the PidLidSharingInitiatorEntryId property (section 2.248).;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.8;dispidSharingInitiatorName
-0x00008A08;PidLidSharingInitiatorSmtp;Contains the value of the PidTagSmtpAddress property (section 2.1020) from the Address Book object identified by the PidLidSharingInitiatorEntryId property (section 2.248).;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.9;dispidSharingInitiatorSmtp
-0x00008A09;PidLidSharingInitiatorEntryId;Contains the value of the PidTagEntryId property (section 2.683) for the Address Book object of the currently logged-on user.;PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.2.7;dispidSharingInitiatorEid
-0x00008A0A;PidLidSharingFlags;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingFlags
-0x00008A0B;PidLidSharingProviderExtension;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingProviderExtension
-0x00008A0C;PidLidSharingRemoteUser;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRemoteUser
-0x00008A0D;PidLidSharingRemotePass;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRemotePass
-0x00008A0E;PidLidSharingLocalPath;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingLocalPath
-0x00008A0F;PidLidSharingLocalName;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingLocalName
-0x00008A10;PidLidSharingLocalUid;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingLocalUid
-0x00008A13;PidLidSharingFilter;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingFilter
-0x00008A14;PidLidSharingLocalType;Contains the value of the PidTagContainerClass property (section 2.642) of the folder being shared.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.10;dispidSharingLocalType
-0x00008A15;PidLidSharingFolderEntryId;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingFolderEid
-0x00008A17;PidLidSharingCapabilities;Indicates that the Message object relates to a special folder.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.2.1;dispidSharingCaps
-0x00008A18;PidLidSharingFlavor;Indicates the type of Sharing Message object.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.2.5;dispidSharingFlavor
-0x00008A19;PidLidSharingAnonymity;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingAnonymity
-0x00008A1A;PidLidSharingReciprocation;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingReciprocation
-0x00008A1B;PidLidSharingPermissions;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingPermissions
-0x00008A1C;PidLidSharingInstanceGuid;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingInstanceGuid
-0x00008A1D;PidLidSharingRemoteType;Contains the same value as the PidLidSharingLocalType property (section 2.259).;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.3.5;dispidSharingRemoteType
-0x00008A1E;PidLidSharingParticipants;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingParticipants
-0x00008A1F;PidLidSharingLastSyncTime;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingLastSync
-0x00008A21;PidLidSharingExtensionXml;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingExtXml
-0x00008A22;PidLidSharingRemoteLastModificationTime;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRemoteLastMod
-0x00008A23;PidLidSharingLocalLastModificationTime;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingLocalLastMod
-0x00008A24;PidLidSharingConfigurationUrl;Contains a zero-length string.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.3;dispidSharingConfigUrl
-0x00008A25;PidLidSharingStart;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingStart
-0x00008A26;PidLidSharingStop;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingStop
-0x00008A27;PidLidSharingResponseType;Contains the type of response with which the recipient of the sharing request responded.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.4.2;dispidSharingResponseType
-0x00008A28;PidLidSharingResponseTime;Contains the time at which the recipient of the sharing request sent a sharing response.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.4.1;dispidSharingResponseTime
-0x00008A29;PidLidSharingOriginalMessageEntryId;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingOriginalMessageEid
-0x00008A2A;PidLidSharingSyncInterval;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingSyncInterval
-0x00008A2B;PidLidSharingDetail;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingDetail
-0x00008A2C;PidLidSharingTimeToLive;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingTimeToLive
-0x00008A2D;PidLidSharingBindingEntryId;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingBindingEid
-0x00008A2E;PidLidSharingIndexEntryId;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingIndexEid
-0x00008A2F;PidLidSharingRemoteComment;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRemoteComment
-0x00008A40;PidLidSharingWorkingHoursStart;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingWorkingHoursStart
-0x00008A41;PidLidSharingWorkingHoursEnd;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingWorkingHoursEnd
-0x00008A42;PidLidSharingWorkingHoursDays;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingWorkingHoursDays
-0x00008A43;PidLidSharingWorkingHoursTimeZone;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingWorkingHoursTZ
-0x00008A44;PidLidSharingDataRangeStart;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingDataRangeStart
-0x00008A45;PidLidSharingDataRangeEnd;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingDataRangeEnd
-0x00008A46;PidLidSharingRangeStart;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRangeStart
-0x00008A47;PidLidSharingRangeEnd;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRangeEnd
-0x00008A48;PidLidSharingRemoteStoreUid;Contains a hexadecimal string representation of the value of the PidTagStoreEntryId property (section 2.1028) on the folder being shared.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.3.3;dispidSharingRemoteStoreUid
-0x00008A49;PidLidSharingLocalStoreUid;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingLocalStoreUid
-0x00008A4B;PidLidSharingRemoteByteSize;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRemoteByteSize
-0x00008A4C;PidLidSharingRemoteCrc;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRemoteCrc
-0x00008A4D;PidLidSharingLocalComment;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingLocalComment
-0x00008A4E;PidLidSharingRoamLog;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRoamLog
-0x00008A4F;PidLidSharingRemoteMessageCount;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRemoteMsgCount
-0x00008A51;PidLidSharingBrowseUrl;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingBrowseUrl
-0x00008A55;PidLidSharingLastAutoSyncTime;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypTime, 0x0040;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingLastAutoSync
-0x00008A56;PidLidSharingTimeToLiveAuto;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingTimeToLiveAuto
-0x00008A5B;PidLidSharingRemoteVersion;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingRemoteVersion
-0x00008A5C;PidLidSharingParentBindingEntryId;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypBinary, 0x0102;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingParentBindingEid
-0x00008A60;PidLidSharingSyncFlags;Contains a value that is ignored by the server no matter what value is generated by the client.;PtypInteger32, 0x0003;Sharing;[MS-OXSHARE] section 2.2.6;dispidSharingSyncFlags
-0x00008B00;PidLidNoteColor;Specifies the suggested background color of the Note object.;PtypInteger32, 0x0003;Sticky Notes;[MS-OXONOTE] section 2.2.1.1;dispidNoteColor
-0x00008B02;PidLidNoteWidth;Specifies the width of the visible message window in pixels.;PtypInteger32, 0x0003;Sticky Notes;[MS-OXONOTE] section 2.2.1.2;dispidNoteWidth
-0x00008B03;PidLidNoteHeight;Specifies the height of the visible message window in pixels.;PtypInteger32, 0x0003;Sticky Notes;[MS-OXONOTE] section 2.2.1.3;dispidNoteHeight
-0x00008B04;PidLidNoteX;Specifies the distance, in pixels, from the left edge of the screen that a user interface displays a Note object.;PtypInteger32, 0x0003;Sticky Notes;[MS-OXONOTE] section 2.2.1.4;dispidNoteX
-0x00008B05;PidLidNoteY;Specifies the distance, in pixels, from the top edge of the screen that a user interface displays a Note object.;PtypInteger32, 0x0003;Sticky Notes;[MS-OXONOTE] section 2.2.1.5;dispidNoteY
-0x00009000;PidLidCategories;Contains the array of text labels assigned to this Message object.;PtypMultipleString, 0x101F;Common;[MS-OXCMSG] section 2.2.1.22;dispidCategories
diff --git a/src/main/resources/PIDName.csv b/src/main/resources/PIDName.csv
deleted file mode 100644
index f7b623f..0000000
--- a/src/main/resources/PIDName.csv
+++ /dev/null
@@ -1,140 +0,0 @@
-Property;Description;Property Name;Property Type;Area;Defining reference;Alternate names
-PidNameAcceptLanguage;Contains the value of the MIME Accept-Language header.;Accept-Language;PtypString, 0x001F;Email;[MS-OXCMSG] section 2.2.1.42;AcceptLanguage
-PidNameApplicationName;Specifies the application used to open the file attached to the Document object.;AppName;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.9;urn:schemas-microsoft-com:office:office#NameOfApplication
-PidNameAttachmentMacContentType;Contains the Content-Type of the Mac attachment.;AttachmentMacContentType;PtypString, 0x001F;Message Attachment Properties;[MS-OXCMSG] section 2.2.2.29;
-PidNameAttachmentMacInfo;Contains the headers and resource fork data associated with the Mac attachment.;AttachmentMacInfo;PtypBinary, 0x0102;Message Attachment Properties;[MS-OXCMSG] section 2.2.2.29;
-PidNameAttachmentOriginalPermissionType;Contains the original permission type data associated with a web reference attachment.;AttachmentOriginalPermissionType;PtypInteger32, 0x0003;Message Attachment Properties;[MS-OXCMSG] section 2.2.2.27;
-PidNameAttachmentPermissionType;Contains the permission type data associated with a web reference attachment.;AttachmentPermissionType;PtypInteger32, 0x0003;Message Attachment Properties;[MS-OXCMSG] section 2.2.2.28;
-PidNameAttachmentProviderType;Contains the provider type data associated with a web reference attachment.;AttachmentProviderType;PtypeString, 0x001F;Message Attachment Properties;[MS-OXCMSG] section 2.2.2.26;
-PidNameAudioNotes;Contains textual annotations to a voice message after it has been delivered to the user's mailbox.;UMAudioNotes;PtypString, 0x001F;Unified Messaging;[MS-OXOUM] section 2.2.5.15;UMAudioNotes
-PidNameAuthor;Specifies the author of the file attached to the Document object.;Author;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.3;urn:schemas-microsoft-com:office:office#Author
-PidNameAutomaticSpeechRecognitionData;Contains an unprotected voice message.;AsrData;PtypBinary, 0x0102;Unified Messaging;[MS-OXOUM] section 2.2.5.13;
-PidNameBirthdayContactAttributionDisplayName;Indicates the name of the contact associated with the birthday event.;BirthdayContactAttributionDisplayName;PtypString, 0x001F;Contact Properties;[MS-OXOCAL] section 2.2.1.52;
-PidNameBirthdayContactEntryId;Indicate the EntryID of the contact associated with the birthday event.;BirthdayContactEntryId;PtypBinary, 0x0102;Contact Properties;[MS-OXOCAL] section 2.2.1.53;
-PidNameBirthdayContactPersonGuid;Indicates the person ID's GUID of the contact associated with the birthday event.;BirthdayContactPersonGuid;PtypBinary, 0x0102;Contact Properties;[MS-OXOCAL] section 2.2.1.54;
-PidNameByteCount;Specifies the size, in bytes, of the file attached to the Document object.;ByteCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.22;urn:schemas-microsoft-com:office:office#Bytes
-PidNameCalendarAttendeeRole;Specifies the role of the attendee.;urn:schemas:calendar:attendeerole;PtypInteger32, 0x0003;Common;[MS-XWDCAL] section 2.2.2.7;urn:schemas:calendar:attendeerole
-PidNameCalendarBusystatus;Specifies whether the attendee is busy at the time of an appointment on their calendar.;urn:schemas:calendar:busystatus;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.8;urn:schemas:calendar:busystatus
-PidNameCalendarContact;Identifies the name of a contact who is an attendee of a meeting.;urn:schemas:calendar:contact;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.9;urn:schemas:calendar:contact
-PidNameCalendarContactUrl;Identifies the URL where you can access contact information in HTML format.;urn:schemas:calendar:contacturl;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.10;urn:schemas:calendar:contacturl
-PidNameCalendarCreated;Identifies the date and time, in UTC, when the organizer created the appointment or meeting.;urn:schemas:calendar:created;PtypTime, 0x0040;Common;[MS-XWDCAL] section 2.2.2.11;urn:schemas:calendar:created
-PidNameCalendarDescriptionUrl;Specifies the URL of a resource that contains a description of an appointment or meeting.;urn:schemas:calendar:descriptionurl;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.12;urn:schemas:calendar:descriptionurl
-PidNameCalendarDuration;Identifies the duration, in seconds, of an appointment or meeting.;urn:schemas:calendar:duration;PtypInteger32, 0x0003;Common;[MS-XWDCAL] section 2.2.2.13;urn:schemas:calendar:duration
-PidNameCalendarExceptionDate;Identifies a list of dates that are exceptions to a recurring appointment.;urn:schemas:calendar:exdate;PtypMultipleTime, 0x1040;Common;[MS-XWDCAL] section 2.2.2.14;urn:schemas:calendar:exdate
-PidNameCalendarExceptionRule;Specifies an exception rule for a recurring appointment.;urn:schemas:calendar:exrule;PtypMultipleString, 0x101F;Common;[MS-XWDCAL] section 2.2.2.15;urn:schemas:calendar:exrule
-PidNameCalendarGeoLatitude;Specifies the geographical latitude of the location of an appointment.;urn:schemas:calendar:geolatitude;PtypFloating64, 0x0005;Common;[MS-XWDCAL] section 2.2.2.16;urn:schemas:calendar:geolatitude
-PidNameCalendarGeoLongitude;Specifies the geographical longitude of the location of an appointment.;urn:schemas:calendar:geolongitude;PtypFloating64, 0x0005;Common;[MS-XWDCAL] section 2.2.2.17;urn:schemas:calendar:geolongitude
-PidNameCalendarInstanceType;Specifies the type of an appointment.;urn:schemas:calendar:instancetype;PtypInteger32, 0x0003;Common;[MS-XWDCAL] section 2.2.2.18;urn:schemas:calendar:instancetype
-PidNameCalendarIsOrganizer;Specifies whether an attendee is the organizer of an appointment or meeting.;urn:schemas:calendar:isorganizer;PtypBoolean, 0x000B;Common;[MS-XWDCAL] section 2.2.2.19;urn:schemas:calendar:isorganizer
-PidNameCalendarLastModified;Specifies the date and time, in UTC, when an appointment was last modified.;urn:schemas:calendar:lastmodified;PtypTime, 0x0040;Common;[MS-XWDCAL] section 2.2.2.20;urn:schemas:calendar:lastmodified
-PidNameCalendarLocationUrl;Specifies a URL with location information in HTML format.;urn:schemas:calendar:locationurl;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.21;urn:schemas:calendar:locationurl
-PidNameCalendarMeetingStatus;Specifies the status of an appointment or meeting.;urn:schemas:calendar:meetingstatus;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.22;urn:schemas:calendar:meetingstatus
-PidNameCalendarMethod;Specifies the iCalendar method that is associated with an Appointment object.;urn:schemas:calendar:method;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.23;urn:schemas:calendar:method
-PidNameCalendarProductId;Identifies the product that created the iCalendar-formatted stream.;urn:schemas:calendar:prodid;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.24;urn:schemas:calendar:prodid
-PidNameCalendarRecurrenceIdRange;Specifies which instances of a recurring appointment are being referred to.;urn:schemas:calendar:recurrenceidrange;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.25;urn:schemas:calendar:recurrenceidrange
-PidNameCalendarReminderOffset;Identifies the number of seconds before an appointment starts that a reminder is to be displayed.;urn:schemas:calendar:reminderoffset;PtypInteger32, 0x0003;Common;[MS-XWDCAL] section 2.2.2.26;urn:schemas:calendar:reminderoffset
-PidNameCalendarResources;Identifies a list of resources, such as rooms and video equipment, that are available for an appointment.;urn:schemas:calendar:resources;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.27;urn:schemas:calendar:resources
-PidNameCalendarRsvp;Specifies whether the organizer of an appointment or meeting requested a response.;urn:schemas:calendar:rsvp;PtypBoolean, 0x000B;Common;[MS-XWDCAL] section 2.2.2.28;urn:schemas:calendar:rsvp
-PidNameCalendarSequence;Specifies the sequence number of a version of an appointment.;urn:schemas:calendar:sequence;PtypInteger32, 0x0003;Common;[MS-XWDCAL] section 2.2.2.29;urn:schemas:calendar:sequence
-PidNameCalendarTimeZone;Specifies the time zone of an appointment or meeting.;urn:schemas:calendar:timezone;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.30;urn:schemas:calendar:timezone
-PidNameCalendarTimeZoneId;Specifies the time zone identifier of an appointment or meeting.;urn:schemas:calendar:timezoneid;PtypInteger32, 0x0003;Common;[MS-XWDCAL] section 2.2.2.31;urn:schemas:calendar:timezoneid
-PidNameCalendarTransparent;Specifies whether an appointment or meeting is visible to busy time searches.;urn:schemas:calendar:transparent;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.32;urn:schemas:calendar:transparent
-PidNameCalendarUid;Specifies the unique identifier of an appointment or meeting.;urn:schemas:calendar:uid;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.33;urn:schemas:calendar:uid
-PidNameCalendarVersion;Identifies the version of the iCalendar specification, as specified in [MS-OXCICAL] section 2.1.3.1.1.3, that is required to correctly interpret an iCalendar object.;urn:schemas:calendar:version;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.2.34;urn:schemas:calendar:version
-PidNameCategory;Specifies the category of the file attached to the Document object.;Category;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.18;urn:schemas-microsoft-com:office:office#Category
-PidNameCharacterCount;Specifies the character count of the file attached to the Document object.;CharCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.16;urn:schemas-microsoft-com:office:office#Characters
-PidNameComments;Specifies the comments of the file attached to the Document object.;Comments;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.5;urn:schemas-microsoft-com:office:office#Comments
-PidNameCompany;Specifies the company for which the file was created.;Company;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.21;urn:schemas-microsoft-com:office:office#Company
-PidNameContentBase;Specifies the value of the MIME Content-Base header, which defines the base URI for resolving relative URLs contained within the message body.;Content-Base;PtypString, 0x001F;Email;[MS-OXCMSG] section 2.2.1.41;BodyContentBase
-PidNameContentClass;Contains a string that identifies the type of content of a Message object.;Content-Class;PtypString, 0x001F;Email;[MS-OXCMSG] section 2.2.1.48;DAV:contentclass, urn:schemas:mailheader:content-class
-PidNameContentType;Specifies the type of the body part content.;Content-Type;PtypString, 0x001F;Email;[MS-OXCMSG] section 2.2.1.50;urn:schemas:mailheader:content-type
-PidNameCreateDateTimeReadOnly;Specifies the time, in UTC, that the file was first created.;CreateDtmRo;PtypTime, 0x0040;Common;[MS-OXODOC] section 2.2.1.12;urn:schemas-microsoft-com:office:office#Created
-PidNameCrossReference;Contains the name of the host (with domains omitted) and a white-space-separated list of colon-separated pairs of newsgroup names and message numbers.;Xref;PtypString, 0x001F;Email;[MS-OXCMAIL] section 2.5.3;urn:schemas:mailheader:xref
-PidNameDavId;Specifies a unique ID for the calendar item.;DAV:id;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.1.2;DAV:id
-PidNameDavIsCollection;Indicates whether a Calendar object is a collection.;DAV:iscollection;PtypBoolean, 0x000B;Common;[MS-XWDCAL] section 2.2.1.3;DAV:iscollection
-PidNameDavIsStructuredDocument;Indicates whether a Calendar object is a structured document.;DAV:isstructureddocument;PtypBoolean, 0x000B;Common;[MS-XWDCAL] section 2.2.1.4;DAV:isstructureddocument
-PidNameDavParentName;Specifies the name of the Folder object that contains the Calendar object.;DAV:parentname;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.1.5;DAV:parentname
-PidNameDavUid;Specifies the unique identifier for an item.;DAV:uid;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.1.6;DAV:uid
-PidNameDocumentParts;Specifies the title of each part of the document.;DocParts;PtypMultipleString, 0x101F;Common;[MS-OXODOC] section 2.2.1.29;urn:schemas-microsoft-com:office:office#PartTitles
-PidNameEditTime;Specifies the time that the file was last edited.;EditTime;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.10;urn:schemas-microsoft-com:office:office#TotalTime
-PidNameExchangeIntendedBusyStatus;Specifies the intended free/busy status of a meeting in a Meeting request.;http://schemas.microsoft.com/exchange/intendedbusystatus;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.8.1;http://schemas.microsoft.com/exchange/intendedbusystatus
-PidNameExchangeJunkEmailMoveStamp;Indicates that the message is not to be processed by a spam filter.;http://schemas.microsoft.com/exchange/junkemailmovestamp;PtypInteger32, 0x0003;Secure Messaging Properties;[MS-OXCSPAM] section 2.2.1.2;http://schemas.microsoft.com/exchange/junkemailmovestamp
-PidNameExchangeModifyExceptionStructure;Specifies a structure that modifies an exception to the recurrence.;http://schemas.microsoft.com/exchange/modifyexceptionstruct;PtypBinary, 0x0102;Common;[MS-XWDCAL] section 2.2.8.2;http://schemas.microsoft.com/exchange/modifyexceptionstruct
-PidNameExchangeNoModifyExceptions;Indicates whether exceptions to a recurring appointment can be modified.;http://schemas.microsoft.com/exchange/nomodifyexceptions;PtypBoolean, 0x000B;Common;[MS-XWDCAL] section 2.2.8.3;http://schemas.microsoft.com/exchange/nomodifyexceptions
-PidNameExchangePatternEnd;Identifies the maximum time when an instance of a recurring appointment ends.;http://schemas.microsoft.com/exchange/patternend;PtypTime, 0x0040;Common;[MS-XWDCAL] section 2.2.8.4;http://schemas.microsoft.com/exchange/patternend
-PidNameExchangePatternStart;Identifies the absolute minimum time when an instance of a recurring appointment starts.;http://schemas.microsoft.com/exchange/patternstart;PtypTime, 0x0040;Common;[MS-XWDCAL] section 2.2.8.5;http://schemas.microsoft.com/exchange/patternstart
-PidNameExchangeReminderInterval;Identifies the time, in seconds, between reminders.;http://schemas.microsoft.com/exchange/reminderinterval;PtypInteger32, 0x0003;Common;[MS-XWDCAL] section 2.2.8.6;http://schemas.microsoft.com/exchange/reminderinterval
-PidNameExchDatabaseSchema;Specifies an array of URLs that identifies other folders within the same message store that contain schema definition items.;urn:schemas-microsoft-com:exch-data:baseschema;PtypMultipleString, 0x101F;Common;[MS-XWDCAL] section 2.2.5.1;urn:schemas-microsoft-com:exch-data:baseschema
-PidNameExchDataExpectedContentClass;Specifies an array of names that indicates the expected content classes of items within a folder.;urn:schemas-microsoft-com:exch-data:expected-content-class;PtypMultipleString, 0x101F;Common;[MS-XWDCAL] section 2.2.5.2;urn:schemas-microsoft-com:exch-data:expected-content-class
-PidNameExchDataSchemaCollectionReference;Specifies an array of names that indicates the expected content classes of items within a folder.;urn:schemas-microsoft-com:exch-data:schema-collection-ref;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.5.3;urn:schemas-microsoft-com:exch-data:schema-collection-ref
-PidNameExtractedAddresses;Contains an XML document with a single AddressSet element.;XmlExtractedAddresses;PtypString, 0x001F;Extracted Entities;[MS-OXCEXT] section 2.2.2.1;dispidXmlExtractedAddresses
-PidNameExtractedContacts;Contains an XML document with a single ContactSet element.;XmlExtractedContacts;PtypString, 0x001F;Extracted Entities;[MS-OXCEXT] section 2.2.2.2;dispidXmlExtractedContacts
-PidNameExtractedEmails;Contains an XML document with a single EmailSet element.;XmlExtractedEmails;PtypString, 0x001F;Extracted Entities;[MS-OXCEXT] section 2.2.2.3;dispidXmlExtractedEmails
-PidNameExtractedMeetings;Contains an XML document with a single MeetingSet element.;XmlExtractedMeetings;PtypString, 0x001F;Extracted Entities;[MS-OXCEXT] section 2.2.2.4;dispidXmlExtractedMeetings
-PidNameExtractedPhones;Contains an XML document with a single PhoneSet element.;XmlExtractedPhones;PtypString, 0x001F;Extracted Entities;[MS-OXCEXT] section 2.2.2.5;dispidXmlExtractedPhones
-PidNameExtractedTasks;Contains an XML document with a single TaskSet element.;XmlExtractedTasks;PtypString, 0x001F;Extracted Entities;[MS-OXCEXT] section 2.2.2.6;dispidXmlExtractedTasks
-PidNameExtractedUrls;Contains an XML document with a single UrlSet element.;XmlExtractedUrls;PtypString, 0x001F;Extracted Entities;[MS-OXCEXT] section 2.2.2.7;dispidXmlExtractedUrls
-PidNameFrom;Specifies the SMTP email alias of the organizer of an appointment or meeting.;From;PtypString, 0x001F;Email;[MS-XWDCAL] section 2.2.2.35;urn:schemas:calendar:organizer
-PidNameHeadingPairs;Specifies which group of headings are indented in the document.;HeadingPairs;PtypBinary, 0x0102;Common;[MS-OXODOC] section 2.2.1.30;urn:schemas-microsoft-com:office:office#HeadingPairs
-PidNameHiddenCount;Specifies the hidden value of the file attached to the Document object.;HiddenCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.27;urn:schemas-microsoft-com:office:office#HiddenSlides
-PidNameHttpmailCalendar;Specifies the URL for the Calendar folder for a particular user.;urn:schemas:httpmail:calendar;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.3.1;urn:schemas:httpmail:calendar
-PidNameHttpmailHtmlDescription;Specifies the HTML content of the message.;urn:schemas:httpmail:htmldescription;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.3.2;urn:schemas:httpmail:htmldescription
-PidNameHttpmailSendMessage;Specifies the email submission URI to which outgoing email is submitted.;urn:schemas:httpmail:sendmsg;PtypString, 0x001F;Common;[MS-XWDCAL] section 2.2.3.3;urn:schemas:httpmail:sendmsg
-PidNameICalendarRecurrenceDate;Identifies an array of instances of a recurring appointment.;urn:schemas:calendar:rdate;PtypMultipleTime, 0x1040;Common;[MS-XWDCAL] section 2.2.2.36;urn:schemas:calendar:rdate
-PidNameICalendarRecurrenceRule;Specifies the rule for the pattern that defines a recurring appointment.;urn:schemas:calendar:rrule;PtypMultipleString, 0x101F;Common;[MS-XWDCAL] section 2.2.2.37;urn:schemas:calendar:rrule
-PidNameInternetSubject;Specifies the subject of the message.;Subject;PtypString, 0x001F;Email;[MS-XWDCAL] section 2.2.4.1;urn:schemas:mailheader:subject
-PidNameIsBirthdayContactWritable;Indicates whether the contact associated with the birthday event is writable.;IsBirthdayContactWritable;PtypBoolean, 0x000B;Contact Properties;[MS-OXOCAL] section 2.2.1.55;
-PidNameKeywords;Contains keywords or categories for the Message object.;Keywords;PtypMultipleString, 0x101F;General Message Properties;[MS-OXCMSG] section 2.2.1.17;urn:schemas-microsoft-com:office:office#Keywords, http://schemas.microsoft.com/exchange/keywords-utf8
-PidNameLastAuthor;Specifies the most recent author of the file attached to the Document object.;LastAuthor;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.7;urn:schemas-microsoft-com:office:office#LastAuthor
-PidNameLastPrinted;Specifies the time, in UTC, that the file was last printed.;LastPrinted;PtypTime, 0x0040;Common;[MS-OXODOC] section 2.2.1.11;urn:schemas-microsoft-com:office:office#LastPrinted
-PidNameLastSaveDateTime;Specifies the time, in UTC, that the file was last saved.;LastSaveDtm;PtypTime, 0x0040;Common;[MS-OXODOC] section 2.2.1.13;urn:schemas-microsoft-com:office:office#LastSaved
-PidNameLineCount;Specifies the number of lines in the file attached to the Document object.;LineCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.23;urn:schemas-microsoft-com:office:office#Lines
-PidNameLinksDirty;Indicates whether the links in the document are up-to-date.;LinksDirty;PtypBoolean, 0x000B;Common;[MS-OXODOC] section 2.2.1.31;urn:schemas-microsoft-com:office:office#LinksUpToDate
-PidNameLocationUrl;;urn:schemas:calendar:locationurl;PtypString, 0x001F;Calendar;;urn:schemas:calendar:locationurl, LocationUrl
-PidNameManager;Specifies the manager of the file attached to the Document object.;Manager;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.20;urn:schemas-microsoft-com:office:office#Manager
-PidNameMeetingDoNotForward;Specifies whether to allow the meeting to be forwarded.;DoNotForward;PtypBoolean, 0x000B;Meetings;[MS-OXOCAL] section 2.2.1.51;
-PidNameMSIPLabels;Contains the string that specifies the CLP label information.;msip_labels;PtypString, 0x001F;Email;[MS-OXCMSG] section 2.2.1.59 ;
-PidNameMultimediaClipCount;Specifies the number of multimedia clips in the file attached to the Document object.;MMClipCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.28;urn:schemas-microsoft-com:office:office#MultimediaClips
-PidNameNoteCount;Specifies the number of notes in the file attached to the Document object.;NoteCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.26;urn:schemas-microsoft-com:office:office#Notes
-PidNameOMSAccountGuid;Contains the GUID of the SMS account used to deliver the message.;OMSAccountGuid;PtypString, 0x001F;SMS;[MS-OXOSMMS] section 2.2.1.1 ;
-PidNameOMSMobileModel;Indicates the model of the mobile device used to send the SMS or MMS message.;OMSMobileModel;PtypString, 0x001F;SMS;[MS-OXOSMMS] section 2.2.1.6;
-PidNameOMSScheduleTime;Contains the time, in UTC, at which the client requested that the service provider send the SMS or MMS message.;OMSScheduleTime;PtypTime, 0x0040;SMS;[MS-OXOSMMS] section 2.2.1.2;
-PidNameOMSServiceType;Contains the type of service used to send an SMS or MMS message.;OMSServiceType;PtypInteger32, 0x0003;SMS;[MS-OXOSMMS] section 2.2.1.3;
-PidNameOMSSourceType;Contains the source of an SMS or MMS message.;OMSSourceType;PtypInteger32, 0x0003;SMS;[MS-OXOSMMS] section 2.2.1.4;
-PidNamePageCount;Specifies the page count of the file attached to the Document object.;PageCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.14;urn:schemas-microsoft-com:office:office#Pages
-PidNameParagraphCount;Specifies the number of paragraphs in the file attached to the Document object.;ParCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.24;urn:schemas-microsoft-com:office:office#Paragraphs
-PidNamePhishingStamp;Indicates whether a message is likely to be phishing.;http://schemas.microsoft.com/outlook/phishingstamp;PtypInteger32, 0x0003;Secure Messaging Properties;[MS-OXPHISH] section 2.2.1.1;
-PidNamePresentationFormat;Specifies the presentation format of the file attached to the Document object.;PresFormat;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.19;urn:schemas-microsoft-com:office:office#PresentationFormat
-PidNameQuarantineOriginalSender;Specifies the original sender of a message.;quarantine-original-sender;PtypString, 0x001F;Common;[MS-OXCMAIL] section 2.5.4;
-PidNameRevisionNumber;Specifies the revision number of the file attached to the Document object.;RevNumber;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.8;urn:schemas-microsoft-com:office:office#Revision
-PidNameRightsManagementLicense;Specifies the value used to cache the Use License for the rights-managed email message.;DRMLicense;PtypMultipleBinary, 0x1102;Secure Messaging Properties;[MS-OXORMMS] section 2.2.1.1;
-PidNameScale;Indicates whether the image is to be scaled or cropped.;Scale;PtypBoolean, 0x000B;Common;[MS-OXODOC] section 2.2.1.32;urn:schemas-microsoft-com:office:office#ScaleCrop
-PidNameSecurity;Specifies the security level of the file attached to the Document object.;Security;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.17;urn:schemas-microsoft-com:office:office#Security
-PidNameSlideCount;Specifies the number of slides in the file attached to the Document object.;SlideCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.25;urn:schemas-microsoft-com:office:office#Slides
-PidNameSubject;Specifies the subject of the file attached to the Document object.;Subject;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.2;urn:schemas-microsoft-com:office:office#Subject
-PidNameTemplate;Specifies the template of the file attached to the Document object.;Template;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.6;urn:schemas-microsoft-com:office:office#Template
-PidNameThumbnail;Specifies the data representing the thumbnail image of the document.;Thumbnail;PtypBinary, 0x0102;Common;[MS-OXODOC] section 2.2.1.33;urn:schemas-microsoft-com:office:office#ThumbNail
-PidNameTitle;Specifies the title of the file attached to the Document object.;Title;PtypString, 0x001F;Common;[MS-OXODOC] section 2.2.1.1;urn:schemas-microsoft-com:office:office#Title
-PidNameWordCount;Specifies the word count of the file attached to the Document object.;WordCount;PtypInteger32, 0x0003;Common;[MS-OXODOC] section 2.2.1.15;urn:schemas-microsoft-com:office:office#Words
-PidNameXCallId;Contains a unique identifier associated with the phone call.;X-CallID;PtypString, 0x001F;Unified Messaging;[MS-OXOUM] section 2.2.5.12;
-PidNameXFaxNumberOfPages;Specifies how many discrete pages are contained within an attachment representing a facsimile message.;X-FaxNumberOfPages;PtypInteger16, 0x0002;Unified Messaging;[MS-OXOUM] section 2.2.5.8;
-PidNameXRequireProtectedPlayOnPhone;Indicates that the client only renders the message on a phone.;X-RequireProtectedPlayOnPhone;PtypBoolean, 0x000B;Unified Messaging;[MS-OXOUM] section 2.2.5.14;
-PidNameXSenderTelephoneNumber;Contains the telephone number of the caller associated with a voice mail message.;X-CallingTelephoneNumber;PtypString, 0x001F;Unified Messaging;[MS-OXOUM] section 2.2.5.2;
-PidNameXSharingBrowseUrl;Contains a value that is ignored by the server no matter what value is generated by the client.;X-Sharing-Browse-Url;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;
-PidNameXSharingCapabilities;Contains a string representation of the value of the PidLidSharingCapabilities property (section 2.237).;X-Sharing-Capabilities;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.2;
-PidNameXSharingConfigUrl;Contains the same value as the PidLidSharingConfigurationUrl property (section 2.238).;X-Sharing-Config-Url;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.4;
-PidNameXSharingExendedCaps;Contains a value that is ignored by the server no matter what value is generated by the client.;X-Sharing-Exended-Caps;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;
-PidNameXSharingFlavor;Contains a hexadecimal string representation of the value of the PidLidSharingFlavor property (section 2.245).;X-Sharing-Flavor;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.6;
-PidNameXSharingInstanceGuid;Contains a value that is ignored by the server no matter what value is generated by the client.;X-Sharing-Instance-Guid;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;
-PidNameXSharingLocalType;Contains the same value as the PidLidSharingLocalType property (section 2.259).;X-Sharing-Local-Type;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.11;
-PidNameXSharingProviderGuid;Contains the hexadecimal string representation of the value of the PidLidSharingProviderGuid property (section 2.266).;X-Sharing-Provider-Guid;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.13;
-PidNameXSharingProviderName;Contains the same value as the PidLidSharingProviderName property (section 2.267).;X-Sharing-Provider-Name;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.15;
-PidNameXSharingProviderUrl;Contains the same value as the PidLidSharingProviderUrl property (section 2.268).;X-Sharing-Provider-Url;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.2.17;
-PidNameXSharingRemoteName;Contains the same value as the PidLidSharingRemoteName property (section 2.277).;X-Sharing-Remote-Name;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.3.2;
-PidNameXSharingRemotePath;Contains a value that is ignored by the server no matter what value is generated by the client.;X-Sharing-Remote-Path;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.6;
-PidNameXSharingRemoteStoreUid;Contains the same value as the PidLidSharingRemoteStoreUid property (section 2.282).;X-Sharing-Remote-Store-Uid;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.3.4;
-PidNameXSharingRemoteType;Contains the same value as the PidLidSharingRemoteType property (section 2.281).;X-Sharing-Remote-Type;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.3.6;
-PidNameXSharingRemoteUid;Contains the same value as the PidLidSharingRemoteUid property (section 2.282).;X-Sharing-Remote-Uid;PtypString, 0x001F;Sharing;[MS-OXSHARE] section 2.2.3.8;
-PidNameXVoiceMessageAttachmentOrder;Contains the list of names for the audio file attachments that are to be played as part of a message, in reverse order.;X-AttachmentOrder;PtypString, 0x001F;Unified Messaging;[MS-OXOUM] section 2.2.5.10;
-PidNameXVoiceMessageDuration;Specifies the length of the attached audio message, in seconds.;X-VoiceMessageDuration;PtypInteger16, 0x0002;Unified Messaging;[MS-OXOUM] section 2.2.5.4;
-PidNameXVoiceMessageSenderName;Contains the name of the caller who left the attached voice message, as provided by the voice network's caller ID system.;X-VoiceMessageSenderName;PtypString, 0x001F;Unified Messaging;[MS-OXOUM] section 2.2.5.6;
diff --git a/src/main/resources/PIDShortID.csv b/src/main/resources/PIDShortID.csv
deleted file mode 100644
index 680c104..0000000
--- a/src/main/resources/PIDShortID.csv
+++ /dev/null
@@ -1,576 +0,0 @@
-"ID";"Property";"Description:";"Data type";"Area";"Defining reference";"Alternate names"
-"0x0001";"PidTagTemplateData";"Describes the controls used in the template that is used to retrieve address book information.";"PtypBinary, 0x0102";"Address Book";"[MS-OXOABKT] section 2.2.2";"PR_EMS_TEMPLATE_BLOB"
-"0x0002";"PidTagAlternateRecipientAllowed";"Specifies whether the sender permits the message to be auto-forwarded.";"PtypBoolean, 0x000B";"Address Properties";"[MS-OXCMSG] section 2.2.1.36";"PR_ALTERNATE_RECIPIENT_ALLOWED, ptagAlternateRecipientAllowed"
-"0x0004";"PidTagAutoForwardComment";"Contains text included in an automatically-generated message.";"PtypString, 0x001F";"General Report Properties";"[MS-OXCMSG] section 2.2.1.21";"PR_AUTO_FORWARD_COMMENT, PR_AUTO_FORWARD_COMMENT_A, PR_AUTO_FORWARD_COMMENT_W"
-"0x0004";"PidTagScriptData";"Contains a series of instructions that can be executed to format an address and the data that is needed to execute those instructions.";"PtypBinary, 0x0102";"Address Book";"[MS-OXOABKT] section 2.2.2";"PR_EMS_SCRIPT_BLOB"
-"0x0005";"PidTagAutoForwarded";"Indicates that a Message object has been automatically generated or automatically forwarded.";"PtypBoolean, 0x000B";"General Report Properties";"[MS-OXCMSG] section 2.2.1.20";"PR_AUTO_FORWARDED, ptagAutoForwarded"
-"0x000F";"PidTagDeferredDeliveryTime";"Contains the date and time, in UTC, at which the sender prefers that the message be delivered.";"PtypTime, 0x0040";"MapiEnvelope ";"[MS-OXOMSG] section 2.2.1.6";"PR_DEFERRED_DELIVERY_TIME, ptagDeferredDeliveryTime, http://schemas.microsoft.com/exchange/deferred-delivery-iso"
-"0x0010";"PidTagDeliverTime";"Contains the delivery time for a delivery status notification, as specified [RFC3464], or a message disposition notification, as specified in [RFC3798].";"PtypTime, 0x0040";"Email";"[MS-OXOMSG] section 2.2.2.29";"PR_DELIVER_TIME, ptagDeliverTime"
-"0x0015";"PidTagExpiryTime";"Contains the time, in UTC, after which a client wants to receive an expiry event if the message arrives late.";"PtypTime, 0x0040";"MapiEnvelope ";"[MS-OXOMSG] section 2.2.3.7";"PR_EXPIRY_TIME, ptagExpiryTime, urn:schemas:httpmail:expiry-date, http://schemas.microsoft.com/exchange/expiry-date-iso"
-"0x0017";"PidTagImportance";"Indicates the level of importance assigned by the end user to the Message object.";"PtypInteger32, 0x0003";"General Message Properties ";"[MS-OXCMSG] section 2.2.1.11";"PR_IMPORTANCE, ptagImportance, urn:schemas:httpmail:importance, http://schemas.microsoft.com/exchange/importance-long, http://schemas.microsoft.com/exchange/x-priority-long"
-"0x001A";"PidTagMessageClass";"Denotes the specific type of the Message object.";"PtypString, 0x001F";"Common Property set";"[MS-OXCMSG] section 2.2.1.3 ";"PR_MESSAGE_CLASS, PR_MESSAGE_CLASS_A, ptagMessageClass, PR_MESSAGE_CLASS_W, http://schemas.microsoft.com/exchange/outlookmessageclasshttp://schemas.microsoft.com/exchange/outlookmessageclass"
-"0x0023";"PidTagOriginatorDeliveryReportRequested";"Indicates whether an email sender requests an email delivery receipt from the messaging system.";"PtypBoolean, 0x000B";"MIME Properties ";"[MS-OXOMSG] section 2.2.1.20";"PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED, http://schemas.microsoft.com/exchange/deliveryreportrequested"
-"0x0025";"PidTagParentKey";"Contains the search key that is used to correlate the original message and the reports about the original message.";"PtypBinary, 0x0102";"MapiEnvelope";"[MS-OXOMSG] section 2.2.2.18";"PR_PARENT_KEY, ptagParentKey"
-"0x0026";"PidTagPriority";"Indicates the client's request for the priority with which the message is to be sent by the messaging system.";"PtypInteger32, 0x0003";"Email ";"[MS-OXCMSG] section 2.2.1.12";"PR_PRIORITY, ptagPriority, urn:schemas:httpmail:priority, urn:schemas:httpmail:priority"
-"0x0029";"PidTagReadReceiptRequested";"Specifies whether the email sender requests a read receipt from all recipients when this email message is read or opened.";"PtypBoolean, 0x000B";"Email ";"[MS-OXOMSG] section 2.2.1.29";"PR_READ_RECEIPT_REQUESTED, ptagReadReceiptRequested, http://schemas.microsoft.com/exchange/readreceiptrequested"
-"0x002A";"PidTagReceiptTime";"Contains the sent time for a message disposition notification, as specified in [RFC3798].";"PtypTime, 0x0040";"Email";"[MS-OXOMSG] section 2.2.2.33";"PR_RECEIPT_TIME, ptagReceiptTime"
-"0x002B";"PidTagRecipientReassignmentProhibited";"Specifies whether adding additional or different recipients is prohibited for the email message when forwarding the email message.";"PtypBoolean, 0x000B";"MapiEnvelope";"[MS-OXOMSG] section 2.2.1.42";"PR_RECIPIENT_REASSIGNMENT_PROHIBITED, ptagRecipientReassignmentProhibited"
-"0x002E";"PidTagOriginalSensitivity";"Contains the sensitivity value of the original email message.";"PtypInteger32, 0x0003";"General Message Properties";"[MS-OXOMSG] section 2.2.1.22";"PR_ORIGINAL_SENSITIVITY, ptagOriginalSensitivity"
-"0x0030";"PidTagReplyTime";"Specifies the time, in UTC, that the sender has designated for an associated work item to be due.";"PtypTime, 0x0040";"MapiEnvelope ";"[MS-OXOFLAG] section 2.2.3.1";"PR_REPLY_TIME, urn:schemas:httpmail:reply-by, http://schemas.microsoft.com/exchange/reply-by-iso"
-"0x0031";"PidTagReportTag";"Contains the data that is used to correlate the report and the original message.";"PtypBinary, 0x0102";"MapiEnvelope";"[MS-OXOMSG] section 2.2.2.22";"PR_REPORT_TAG, ptagReportTag"
-"0x0032";"PidTagReportTime";"Indicates the last time that the contact list that is controlled by the PidTagJunkIncludeContacts property (section 2.758) was updated.";"PtypTime, 0x0040";"MapiEnvelope Property set";"[MS-OXCSPAM] section 2.2.2.6";"PR_REPORT_TIME, ptagReportTime, http://schemas.microsoft.com/exchange/reporttime"
-"0x0036";"PidTagSensitivity";"Indicates the sender's assessment of the sensitivity of the Message object.";"PtypInteger32, 0x0003";"General Message Properties ";"[MS-OXCMSG] section 2.2.1.13";"PR_SENSITIVITY, ptagSensitivity, http://schemas.microsoft.com/exchange/sensitivity-long, http://schemas.microsoft.com/exchange/sensitivity"
-"0x0037";"PidTagSubject";"Contains the subject of the email message.";"PtypString, 0x001F";"General Message Properties ";"[MS-OXCMSG] section 2.2.1.46";"PR_SUBJECT, PR_SUBJECT_A, ptagSubject, PR_SUBJECT_W, urn:schemas:httpmail:subject, http://schemas.microsoft.com/exchange/subject-utf8"
-"0x0039";"PidTagClientSubmitTime";"Contains the current time, in UTC, when the email message is submitted.";"PtypTime, 0x0040";"Message Time Properties ";"[MS-OXOMSG] section 2.2.3.11";"PR_CLIENT_SUBMIT_TIME, urn:schemas:httpmail:date, http://schemas.microsoft.com/exchange/date-iso"
-"0x003A";"PidTagReportName";"Contains the display name for the entity (usually a server agent) that generated the report message.";"PtypString, 0x001F";"MapiEnvelope";"[MS-OXOMSG] section 2.2.2.20";"PR_REPORT_NAME, PR_REPORT_NAME_A, PR_REPORT_NAME_W"
-"0x003B";"PidTagSentRepresentingSearchKey";"Contains a binary-comparable key that represents the end user who is represented by the sending mailbox owner.";"PtypBinary, 0x0102";"Address Properties";"[MS-OXOMSG] section 2.2.1.58";"PR_SENT_REPRESENTING_SEARCH_KEY, ptagSentRepresentingSearchKey"
-"0x003D";"PidTagSubjectPrefix";"Contains the prefix for the subject of the message.";"PtypString, 0x001F";"General Message Properties";"[MS-OXCMSG] section 2.2.1.9";"PR_SUBJECT_PREFIX, PR_SUBJECT_PREFIX_A, ptagSubjectPrefix, PR_SUBJECT_PREFIX_W"
-"0x003F";"PidTagReceivedByEntryId";"Contains the address book EntryID of the mailbox receiving the Email object.";"PtypBinary, 0x0102";"Address Properties";"[MS-OXOMSG] section 2.2.1.38";"PR_RECEIVED_BY_ENTRYID"
-"0x0040";"PidTagReceivedByName";"Contains the email message receiver's display name.";"PtypString, 0x001F";"Address Properties";"[MS-OXOMSG] section 2.2.1.39";"PR_RECEIVED_BY_NAME, PR_RECEIVED_BY_NAME_A, PR_RECEIVED_BY_NAME_W"
-"0x0041";"PidTagSentRepresentingEntryId";"Contains the identifier of the end user who is represented by the sending mailbox owner.";"PtypBinary, 0x0102";"Address Properties";"[MS-OXOMSG] section 2.2.1.56";"PR_SENT_REPRESENTING_ENTRYID, ptagSentRepresentingEntryId"
-"0x0042";"PidTagSentRepresentingName";"Contains the display name for the end user who is represented by the sending mailbox owner.";"PtypString, 0x001F";"Address Properties ";"[MS-OXOMSG] section 2.2.1.57";"PR_SENT_REPRESENTING_NAME, PR_SENT_REPRESENTING_NAME_A, ptagSentRepresentingName, PR_SENT_REPRESENTING_NAME_W, urn:schemas:httpmail:fromname, http://schemas.microsoft.com/exchange/from-name-utf8"
-"0x0043";"PidTagReceivedRepresentingEntryId";"Contains an address book EntryID that identifies the end user represented by the receiving mailbox owner.";"PtypBinary, 0x0102";"Address Properties";"[MS-OXOMSG] section 2.2.1.25";"PR_RCVD_REPRESENTING_ENTRYID, ptagRcvdRepresentingEntryId"
-"0x0044";"PidTagReceivedRepresentingName";"Contains the display name for the end user represented by the receiving mailbox owner.";"PtypString, 0x001F";"Address Properties";"[MS-OXOMSG] section 2.2.1.26";"PR_RCVD_REPRESENTING_NAME, PR_RCVD_REPRESENTING_NAME_A, ptagRcvdRepresentingName, PR_RCVD_REPRESENTING_NAME_W"
-"0x0045";"PidTagReportEntryId";"Specifies an entry ID that identifies the application that generated a report message.";"PtypBinary, 0x0102";"MapiEnvelope";"[MS-OXOMSG] section 2.2.1.45";"PR_REPORT_ENTRYID, ptagReportEntryId"
-"0x0046";"PidTagReadReceiptEntryId";"Contains an address book EntryID.";"PtypBinary, 0x0102";"MapiEnvelope";"[MS-OXOMSG] section 2.2.2.26";"PR_READ_RECEIPT_ENTRYID, ptagReadReceiptEntryId"
-"0x0047";"PidTagMessageSubmissionId";"Contains a message identifier assigned by a message transfer agent.";"PtypBinary, 0x0102";"Email";"[MS-OXOMSG] section 2.2.1.79";"PR_MESSAGE_SUBMISSION_ID, ptagMessageSubmissionId"
-"0x0049";"PidTagOriginalSubject";"Specifies the subject of the original message.";"PtypString, 0x001F";"General Message Properties ";"[MS-OXOMSG] section 2.2.2.16";"PR_ORIGINAL_SUBJECT, PR_ORIGINAL_SUBJECT_A, ptagOriginalSubject, PR_ORIGINAL_SUBJECT_W, http://schemas.microsoft.com/exchange/originalsubject, http://schemas.microsoft.com/mapi/original_subject"
-"0x004B";"PidTagOriginalMessageClass";"Designates the PidTagMessageClass property ([MS-OXCMSG] section 2.2.1.3) from the original message.";"PtypString, 0x001F";"Secure Messaging Properties";"[MS-OXOMSG] section 2.2.1.86";"PR_ORIG_MESSAGE_CLASS, PR_ORIG_MESSAGE_CLASS_A, PR_ORIG_MESSAGE_CLASS_W"
-"0x004C";"PidTagOriginalAuthorEntryId";"Contains an address book EntryID structure ([MS-OXCDATA] section 2.2.5.2) and is defined in report messages to identify the user who sent the original message.";"PtypBinary, 0x0102";"Email";"[MS-OXOMSG] section 2.2.1.32";"PR_ORIGINAL_AUTHOR_ENTRYID "
-"0x004D";"PidTagOriginalAuthorName";"Contains the display name of the sender of the original message referenced by a report message.";"PtypString, 0x001F";"Email";"[MS-OXOMSG] section 2.2.1.33";"PR_ORIGINAL_AUTHOR_NAME_W"
-"0x004E";"PidTagOriginalSubmitTime";"Specifies the original email message's submission date and time, in UTC.";"PtypTime, 0x0040";"General Message Properties ";"[MS-OXOMSG] section 2.2.2.17";"PR_ORIGINAL_SUBMIT_TIME, ptagOriginalSubmitTime, http://schemas.microsoft.com/exchange/originaldate, http://schemas.microsoft.com/mapi/original_submit_time"
-"0x004F";"PidTagReplyRecipientEntries";"Identifies a FlatEntryList structure ([MS-OXCDATA] section 2.3.3) of address book EntryIDs for recipients that are to receive a reply.";"PtypBinary, 0x0102";"MapiEnvelope ";"[MS-OXOMSG] section 2.2.1.43";"PR_REPLY_RECIPIENT_ENTRIES, ptagReplyRecipientEntries, http://schemas.microsoft.com/exchange/reply-to-base64"
-"0x0050";"PidTagReplyRecipientNames";"Contains a list of display names for recipients that are to receive a reply.";"PtypString, 0x001F";"MapiEnvelope";"[MS-OXOMSG] section 2.2.1.44";"PR_REPLY_RECIPIENT_NAMES, PR_REPLY_RECIPIENT_NAMES_A, ptagReplyRecipientNames, PR_REPLY_RECIPIENT_NAMES_W"
-"0x0051";"PidTagReceivedBySearchKey";"Identifies an address book search key that contains a binary-comparable key that is used to identify correlated objects for a search.";"PtypBinary, 0x0102";"Address Properties";"[MS-OXOMSG] section 2.2.1.40";"PR_RECEIVED_BY_SEARCH_KEY"
-"0x0052";"PidTagReceivedRepresentingSearchKey";"Identifies an address book search key that contains a binary-comparable key of the end user represented by the receiving mailbox owner.";"PtypBinary, 0x0102";"Address Properties";"[MS-OXOMSG] section 2.2.1.27";"PR_RCVD_REPRESENTING_SEARCH_KEY, ptagRcvdRepresentingSearchKey"
-"0x0053";"PidTagReadReceiptSearchKey";"Contains an address book search key.";"PtypBinary, 0x0102";"MapiEnvelope";"[MS-OXOMSG] section 2.2.2.28";"PR_READ_RECEIPT_SEARCH_KEY, ptagReadReceiptSearchKey"
-"0x0054";"PidTagReportSearchKey";"Contains an address book search key representing the entity (usually a server agent) that generated the report message.";"PtypBinary, 0x0102";"MapiEnvelope";"[MS-OXOMSG] section 2.2.2.21";"PR_REPORT_SEARCH_KEY, ptagReportSearchKey"
-"0x0055";"PidTagOriginalDeliveryTime";"Contains the delivery time, in UTC, from the original message.";"PtypTime, 0x0040";"General Message Properties";"[MS-OXOMSG] section 2.2.2.2";"PR_ORIGINAL_DELIVERY_TIME, ptagOriginalDeliveryTime"
-"0x0057";"PidTagMessageToMe";"Indicates that the receiving mailbox owner is one of the primary recipients of this email message.";"PtypBoolean, 0x000B";"General Message Properties";"[MS-OXOMSG] section 2.2.1.17";"PR_MESSAGE_TO_ME, ptagMessageToMe"
-"0x0058";"PidTagMessageCcMe";"Descripton: Indicates that the receiving mailbox owner is a carbon copy (Cc) recipient of this email message.";"PtypBoolean, 0x000B";"General Message Properties";"[MS-OXOMSG] section 2.2.1.18";"PR_MESSAGE_CC_ME, ptagMessageCcMe"
-"0x0059";"PidTagMessageRecipientMe";"Indicates that the receiving mailbox owner is a primary or a carbon copy (Cc) recipient of this email message.";"PtypBoolean, 0x000B";"General Message Properties";"[MS-OXOMSG] section 2.2.1.19";"PR_MESSAGE_RECIP_ME, ptagMessageRecipMe"
-"0x005A";"PidTagOriginalSenderName";"Contains the value of the original message sender's PidTagSenderName property (section 2.1004), and is set on delivery report messages.";"PtypString, 0x001F";"General Message Properties ";"[MS-OXOMSG] section 2.2.2.9";"PR_ORIGINAL_SENDER_NAME, PR_ORIGINAL_SENDER_NAME_A, ptagOriginalSenderName, PR_ORIGINAL_SENDER_NAME_W, http://schemas.microsoft.com/exchange/originalsendername"
-"0x005B";"PidTagOriginalSenderEntryId";"Contains an address book EntryID that is set on delivery report messages.";"PtypBinary, 0x0102";"General Message Properties";"[MS-OXOMSG] section 2.2.2.8";"PR_ORIGINAL_SENDER_ENTRYID, ptagOriginalSenderEntryId"
-"0x005C";"PidTagOriginalSenderSearchKey";"Contains an address book search key set on the original email message.";"PtypBinary, 0x0102";"General Message Properties";"[MS-OXOMSG] section 2.2.2.10";"PR_ORIGINAL_SENDER_SEARCH_KEY, ptagOriginalSenderSearchKey"
-"0x005D";"PidTagOriginalSentRepresentingName";"Contains the display name of the end user who is represented by the original email message sender.";"PtypString, 0x001F";"General Message Properties";"[MS-OXOMSG] section 2.2.2.14";"PR_ORIGINAL_SENT_REPRESENTING_NAME, PR_ORIGINAL_SENT_REPRESENTING_NAME_A, ptagOriginalSentRepresentingName, PR_ORIGINAL_SENT_REPRESENTING_NAME_W"
-"0x005E";"PidTagOriginalSentRepresentingEntryId";"Identifies an address book EntryID that contains the entry identifier of the end user who is represented by the original message sender.";"PtypBinary, 0x0102";"General Message Properties";"[MS-OXOMSG] section 2.2.2.13";"PR_ORIGINAL_SENT_REPRESENTING_ENTRYID, ptagOriginalSentRepresentingEntryId"
-"0x005F";"PidTagOriginalSentRepresentingSearchKey";"Identifies an address book search key that contains the SearchKey of the end user who is represented by the original message sender.";"PtypBinary, 0x0102";"General Message Properties";"[MS-OXOMSG] section 2.2.2.15";"PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY, ptagOriginalSentRepresentingSearchKey"
-"0x0060";"PidTagStartDate";"Contains the value of the PidLidAppointmentStartWhole property (section 2.29).";"PtypTime, 0x0040";"MapiEnvelope ";"[MS-OXOCAL] section 2.2.1.30";"PR_START_DATE, http://schemas.microsoft.com/mapi/start_date"
-"0x0061";"PidTagEndDate";"Contains the value of the PidLidAppointmentEndWhole property (section 2.14).";"PtypTime, 0x0040";"MapiEnvelope Property set";"[MS-OXOCAL] section 2.2.1.31";"PR_END_DATE, http://schemas.microsoft.com/mapi/end_date"
-"0x0062";"PidTagOwnerAppointmentId";"Specifies a quasi-unique value among all of the Calendar objects in a user's mailbox.";"PtypInteger32, 0x0003";"Appointment ";"[MS-OXOCAL] section 2.2.1.29";"PR_OWNER_APPT_ID, http://schemas.microsoft.com/mapi/owner_appt_id"
-"0x0063";"PidTagResponseRequested";"Indicates whether a response is requested to a Message object.";"PtypBoolean, 0x000B";"MapiEnvelope Property set";"[MS-OXOMSG] section 2.2.1.46";"PR_RESPONSE_REQUESTED, urn:schemas:calendar:responserequested, http://schemas.microsoft.com/mapi/response_requested"
-"0x0064";"PidTagSentRepresentingAddressType";"Contains an email address type.";"PtypString, 0x001F";"Address Properties";"[MS-OXOMSG] section 2.2.1.54";"PR_SENT_REPRESENTING_ADDRTYPE, PR_SENT_REPRESENTING_ADDRTYPE_A, ptagSentRepresentingAddrType, PR_SENT_REPRESENTING_ADDRTYPE_W"
-"0x0065";"PidTagSentRepresentingEmailAddress";"Contains an email address for the end user who is represented by the sending mailbox owner.";"PtypString, 0x001F";"Address Properties";"[MS-OXOMSG] section 2.2.1.55";"PR_SENT_REPRESENTING_EMAIL_ADDRESS, PR_SENT_REPRESENTING_EMAIL_ADDRESS_A, PR_SENT_REPRESENTING_EMAIL_ADDRESS_W"
-"0x0066";"PidTagOriginalSenderAddressType";"Contains the value of the original message sender's PidTagSenderAddressType property (section 2.1000).";"PtypString, 0x001F";"General Message Properties";"[MS-OXOMSG] section 2.2.2.6";"PR_ORIGINAL_SENDER_ADDRTYPE, PR_ORIGINAL_SENDER_ADDRTYPE_A, ptagOriginalSenderAddrType, PR_ORIGINAL_SENDER_ADDRTYPE_W"
-"0x0067";"PidTagOriginalSenderEmailAddress";"Contains the value of the original message sender's PidTagSenderEmailAddress property (section 2.1001).";"PtypString, 0x001F";"General Message Properties";"[MS-OXOMSG] section 2.2.2.7";"PR_ORIGINAL_SENDER_EMAIL_ADDRESS, PR_ORIGINAL_SENDER_EMAIL_ADDRESS_A, PR_ORIGINAL_SENDER_EMAIL_ADDRESS_W"
-"0x0068";"PidTagOriginalSentRepresentingAddressType";"Contains the address type of the end user who is represented by the original email message sender.";"PtypString, 0x001F";"General Message Properties";"[MS-OXOMSG] section 2.2.2.11";"PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE, PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_A, ptagOriginalSentRepresentingAddrType, PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_W"
-"0x0069";"PidTagOriginalSentRepresentingEmailAddress";"Contains the email address of the end user who is represented by the original email message sender.";"PtypString, 0x001F";"General Message Properties";"[MS-OXOMSG] section 2.2.2.12";"PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS, PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_A, PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_W"
-"0x0070";"PidTagConversationTopic";"Contains an unchanging copy of the original subject.";"PtypString, 0x001F";"General Message Properties ";"[MS-OXOMSG] section 2.2.1.5";"PR_CONVERSATION_TOPIC, PR_CONVERSATION_TOPIC_A, ptagConversationTopic, PR_CONVERSATION_TOPIC_W, urn:schemas:httpmail:thread-topic"
-"0x0071";"PidTagConversationIndex";"Indicates the relative position of this message within a conversation thread.";"PtypBinary, 0x0102";"General Message Properties";"[MS-OXOMSG] section 2.2.1.3 ";"PR_CONVERSATION_INDEX, ptagConversationIndex"
-"0x0072";"PidTagOriginalDisplayBcc";"Contains the value of the PidTagDisplayBcc property (section 2.674) from the original message.";"PtypString, 0x001F";"General Message Properties ";"[MS-OXOMSG] section 2.2.2.5";"PR_ORIGINAL_DISPLAY_BCC, PR_ORIGINAL_DISPLAY_BCC_A, ptagOriginalDisplayBcc, PR_ORIGINAL_DISPLAY_BCC_W, http://schemas.microsoft.com/exchange/originaldisplaybcc"
-"0x0073";"PidTagOriginalDisplayCc";"Contains the value of the PidTagDisplayCc property(section 2.675) from the original message.";"PtypString, 0x001F";"General Message Properties ";"[MS-OXOMSG] section 2.2.2.4";"PR_ORIGINAL_DISPLAY_CC, PR_ORIGINAL_DISPLAY_CC_A, ptagOriginalDisplayCc, PR_ORIGINAL_DISPLAY_CC_W, http://schemas.microsoft.com/exchange/originaldisplaycc, http://schemas.microsoft.com/mapi/original_display_cc"
-"0x0074";"PidTagOriginalDisplayTo";"Contains the value of the PidTagDisplayTo property (section 2.678) from the original message.";"PtypString, 0x001F";"General Message Properties ";"[MS-OXOMSG] section 2.2.2.3";"PR_ORIGINAL_DISPLAY_TO, PR_ORIGINAL_DISPLAY_TO_A, ptagOriginalDisplayTo, PR_ORIGINAL_DISPLAY_TO_W, http://schemas.microsoft.com/exchange/originaldisplayto, http://schemas.microsoft.com/mapi/original_display_to"
-"0x0075";"PidTagReceivedByAddressType";"Contains the email message receiver's email address type.";"PtypString, 0x001F";"MapiEnvelope";"[MS-OXOMSG] section 2.2.1.36";"PR_RECEIVED_BY_ADDRTYPE, PR_RECEIVED_BY_ADDRTYPE_A, ptagReceivedByAddrType, PR_RECEIVED_BY_ADDRTYPE_W"
-"0x0076";"PidTagReceivedByEmailAddress";"Contains the email message receiver's email address.";"PtypString, 0x001F";"Address Properties";"[MS-OXOMSG] section 2.2.1.37";"PR_RECEIVED_BY_EMAIL_ADDRESS, PR_RECEIVED_BY_EMAIL_ADDRESS_A, PR_RECEIVED_BY_EMAIL_ADDRESS_W"
-"0x0077";"PidTagReceivedRepresentingAddressType";"Contains the email address type for the end user represented by the receiving mailbox owner.";"PtypString, 0x001F";"Address Properties";"[MS-OXOMSG] section 2.2.1.23";"PR_RCVD_REPRESENTING_ADDRTYPE, PR_RCVD_REPRESENTING_ADDRTYPE_A, ptagRcvdRepresentingAddrType, PR_RCVD_REPRESENTING_ADDRTYPE_W"
-"0x0078";"PidTagReceivedRepresentingEmailAddress";"Contains the email address for the end user represented by the receiving mailbox owner.";"PtypString, 0x001F";"Address Properties";"[MS-OXOMSG] section 2.2.1.24";"PR_RCVD_REPRESENTING_EMAIL_ADDRESS, PR_RCVD_REPRESENTING_EMAIL_ADDRESS_A, PR_RCVD_REPRESENTING_EMAIL_ADDRESS_W"
-"0x007D";"PidTagTransportMessageHeaders";"Contains transport-specific message envelope information for email.";"PtypString, 0x001F";"Email";"[MS-OXOMSG] section 2.2.1.61";"PR_TRANSPORT_MESSAGE_HEADERS, PR_TRANSPORT_MESSAGE_HEADERS_A, PR_TRANSPORT_MESSAGE_HEADERS_W"
-"0x007F";"PidTagTnefCorrelationKey";"Contains a value that correlates a Transport Neutral Encapsulation Format (TNEF) attachment with a message.";"PtypBinary, 0x0102";"MapiEnvelope";"[MS-OXCMSG] section 2.2.1.29";"PR_TNEF_CORRELATION_KEY"
-"0x0080";"PidTagReportDisposition";"Contains a string indicating whether the original message was displayed to the user or deleted (report messages only).";"PtypString, 0x001F";"Email";"[MS-OXOMSG] section 2.2.1.34";"PR_REPORT_DISPOSITION_W "
-"0x0081";"PidTagReportDispositionMode";"Contains a description of the action that a client has performed on behalf of a user (report messages only). ";"PtypString, 0x001F";"Email";"[MS-OXOMSG] section 2.2.1.35";"PR_REPORT_DISPOSITION_MODE_W "
-"0x0807";"PidTagAddressBookRoomCapacity";"Contains the maximum occupancy of the room.";"PtypInteger32, 0x0003";"Address Book";"[MS-OXOABK] section 2.2.9.1";"PR_EMS_AB_ROOM_CAPACITY"
-"0x0809";"PidTagAddressBookRoomDescription";"Contains a description of the Resource object.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.9.2";"PR_EMS_AB_ROOM_DESCRIPTION, PR_EMS_AB_ROOM_DESCRIPTION_A, PR_EMS_AB_ROOM_DESCRIPTION_W"
-"0x0C04";"PidTagNonDeliveryReportReasonCode";"Contains an integer value that indicates a reason for delivery failure.";"PtypInteger32, 0x0003";"Email";"[MS-OXOMSG] section 2.2.2.31";"PR_NDR_REASON_CODE, ptagNDRReasonCode"
-"0x0C05";"PidTagNonDeliveryReportDiagCode";"Contains the diagnostic code for a delivery status notification, as specified in [RFC3464].";"PtypInteger32, 0x0003";"Email";"[MS-OXOMSG] section 2.2.2.30";"PR_NDR_DIAG_CODE, ptagNonDeliveryDiagCode"
-"0x0C06";"PidTagNonReceiptNotificationRequested";"Specifies whether the client sends a non-read receipt.";"PtypBoolean, 0x000B";"Email";"[MS-OXOMSG] section 2.2.1.31";"PR_NON_RECEIPT_NOTIFICATION_REQUESTED"
-"0x0C08";"PidTagOriginatorNonDeliveryReportRequested";"Specifies whether an email sender requests suppression of nondelivery receipts.";"PtypBoolean, 0x000B";"MIME Properties";"[MS-OXOMSG] section 2.2.1.21";"PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED"
-"0x0C15";"PidTagRecipientType";"Represents the recipient type of a recipient on the message.";"PtypInteger32, 0x0003";"MapiRecipient";"[MS-OXOMSG] section 2.2.3.1";"PR_RECIPIENT_TYPE, ptagRecipientType"
-"0x0C17";"PidTagReplyRequested";"Indicates whether a reply is requested to a Message object.";"PtypBoolean, 0x000B";"MapiRecipient";"[MS-OXOMSG] section 2.2.1.45";"PR_REPLY_REQUESTED, ptagReplyRequested"
-"0x0C19";"PidTagSenderEntryId";"Identifies an address book EntryID that contains the address book EntryID of the sending mailbox owner.";"PtypBinary, 0x0102";"Address Properties";"[MS-OXOMSG] section 2.2.1.50";"PR_SENDER_ENTRYID, ptagSenderEntryId"
-"0x0C1A";"PidTagSenderName";"Contains the display name of the sending mailbox owner.";"PtypString, 0x001F";"Address Properties ";"[MS-OXOMSG] section 2.2.1.51";"PR_SENDER_NAME, PR_SENDER_NAME_A, ptagSenderName, PR_SENDER_NAME_W, urn:schemas:httpmail:sendername, http://schemas.microsoft.com/exchange/sender-name-utf8"
-"0x0C1B";"PidTagSupplementaryInfo";"Contains supplementary information about a delivery status notification, as specified in [RFC3464].";"PtypString, 0x001F";"Email";"[MS-OXOMSG] section 2.2.2.36";"PR_SUPPLEMENTARY_INFO, ptagSupplementaryInfo"
-"0x0C1D";"PidTagSenderSearchKey";"Identifies an address book search key.";"PtypBinary, 0x0102";"Address Properties";"[MS-OXOMSG] section 2.2.1.52";"PR_SENDER_SEARCH_KEY, ptagSenderSearchKey"
-"0x0C1E";"PidTagSenderAddressType";"Contains the email address type of the sending mailbox owner.";"PtypString, 0x001F";"Address Properties";"[MS-OXOMSG] section 2.2.1.48";"PR_SENDER_ADDRTYPE, PR_SENDER_ADDRTYPE_A, ptagSenderAddrType, PR_SENDER_ADDRTYPE_W"
-"0x0C1F";"PidTagSenderEmailAddress";"Contains the email address of the sending mailbox owner.";"PtypString, 0x001F";"Address Properties";"[MS-OXOMSG] section 2.2.1.49";"PR_SENDER_EMAIL_ADDRESS, PR_SENDER_EMAIL_ADDRESS_A, PR_SENDER_EMAIL_ADDRESS_W"
-"0x0C20";"PidTagNonDeliveryReportStatusCode";"Contains the value of the Status field for a delivery status notification, as specified in [RFC3464].";"PtypInteger32, 0x0003";"Email";"[MS-OXOMSG] section 2.2.2.32";"PR_NDR_STATUS_CODE, ptagNDRStatusCode"
-"0x0C21";"PidTagRemoteMessageTransferAgent";"Contains the value of the Remote-MTA field for a delivery status notification, as specified in [RFC3464].";"PtypString, 0x001F";"Email";"[MS-OXOMSG] section 2.2.2.34";"PR_DSN_REMOTE_MTA, ptagDsnRemoteMta"
-"0x0E01";"PidTagDeleteAfterSubmit";"Indicates that the original message is to be deleted after it is sent.";"PtypBoolean, 0x000B";"MapiNonTransmittable";"[MS-OXOMSG] section 2.2.3.8";"PR_DELETE_AFTER_SUBMIT, ptagDeleteAfterSubmit"
-"0x0E02";"PidTagDisplayBcc";"Contains a list of blind carbon copy (Bcc) recipient display names.";"PtypString, 0x001F";"Message Properties ";"[MS-OXOMSG] section 2.2.1.7";"PR_DISPLAY_BCC, PR_DISPLAY_BCC_A, ptagDisplayBcc, PR_DISPLAY_BCC_W, urn:schemas:httpmail:displaybcc"
-"0x0E03";"PidTagDisplayCc";"Contains a list of carbon copy (Cc) recipient display names.";"PtypString, 0x001F";"Message Properties ";"[MS-OXOMSG] section 2.2.1.8";"PR_DISPLAY_CC, PR_DISPLAY_CC_A, ptagDisplayCc, PR_DISPLAY_CC_W, urn:schemas:httpmail:displaycc"
-"0x0E04";"PidTagDisplayTo";"Contains a list of the primary recipient display names, separated by semicolons, when an email message has primary recipients .";"PtypString, 0x001F";"Message Properties";"[MS-OXOMSG] section 2.2.1.9";"PR_DISPLAY_TO, PR_DISPLAY_TO_A, ptagDisplayTo, PR_DISPLAY_TO_W"
-"0x0E06";"PidTagMessageDeliveryTime";"Specifies the time (in UTC) when the server received the message.";"PtypTime, 0x0040";"Message Time Properties ";"[MS-OXOMSG] section 2.2.3.9";"PR_MESSAGE_DELIVERY_TIME, urn:schemas:httpmail:datereceived"
-"0x0E07";"PidTagMessageFlags";"Specifies the status of the Message object.";"PtypInteger32, 0x0003";"General Message Properties";"[MS-OXCMSG] section 2.2.1.6";"PR_MESSAGE_FLAGS, ptagMessageFlags"
-"0x0E08";"PidTagMessageSize";"Contains the size, in bytes, consumed by the Message object on the server.";"PtypInteger32, 0x0003";"General Message Properties";"[MS-OXCFOLD] section 2.2.2.2.1.10";"PR_MESSAGE_SIZE, ptagMessageSize"
-"0x0E08";"PidTagMessageSizeExtended";"Specifies the 64-bit version of the PidTagMessageSize property (section 2.796).";"PtypInteger64, 0x0014";"General Message Properties";"[MS-OXCFOLD] section 2.2.2.2.1.11";"PR_MESSAGE_SIZE_EXTENDED, ptagMessageSizeExtended"
-"0x0E09";"PidTagParentEntryId";"Contains the EntryID of the folder where messages or subfolders reside.";"PtypBinary, 0x0102";"ID Properties";"[MS-OXCFOLD] section 2.2.2.2.1.7";"PR_PARENT_ENTRYID, ptagParentEntryId"
-"0x0E0F";"PidTagResponsibility";"Specifies whether another mail agent has ensured that the message will be delivered.";"PtypBoolean, 0x000B";"MapiNonTransmittable";"[MS-OXCMSG] section 2.2.1.37";"PR_RESPONSIBILITY, ptagResponsibility"
-"0x0E12";"PidTagMessageRecipients";"Identifies all of the recipients of the current message.";"PtypObject, 0x000D";"Address Properties";"[MS-OXCMSG] section 2.2.1.47";"PR_MESSAGE_RECIPIENTS, ptagMessageRecipients"
-"0x0E13";"PidTagMessageAttachments";"Identifies all attachments to the current message.";"PtypObject, 0x000D";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.1.52";"PR_MESSAGE_ATTACHMENTS, ptagMessageAttachments"
-"0x0E17";"PidTagMessageStatus";"Specifies the status of a message in a contents table.";"PtypInteger32, 0x0003";"General Message Properties";"[MS-OXCMSG] section 2.2.1.8";"PR_MSG_STATUS, ptagMsgStatus"
-"0x0E1B";"PidTagHasAttachments";"Indicates whether the Message object contains at least one attachment.";"PtypBoolean, 0x000B";"Message Attachment Properties Property set";"[MS-OXCMSG] section 2.2.1.2";"PR_HASATTACH, ptagHasAttach, urn:schemas:httpmail:hasattachment"
-"0x0E1D";"PidTagNormalizedSubject";"Contains the normalized subject of the message.";"PtypString, 0x001F";"Email ";"[MS-OXCMSG] section 2.2.1.10";"PR_NORMALIZED_SUBJECT, PR_NORMALIZED_SUBJECT_A, ptagNormalizedSubject, PR_NORMALIZED_SUBJECT_W, urn:schemas:httpmail:normalizedsubject"
-"0x0E1F";"PidTagRtfInSync";"Indicates whether the PidTagBody property (section 2.618) and the PidTagRtfCompressed property (section 2.941) contain the same text (ignoring formatting).";"PtypBoolean, 0x000B";"Email";"[MS-OXCMSG] section 2.2.1.56.5";"PR_RTF_IN_SYNC, ptagRTFInSync"
-"0x0E20";"PidTagAttachSize";"Contains the size, in bytes, consumed by the Attachment object on the server.";"PtypInteger32, 0x0003";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.5";"PR_ATTACH_SIZE, ptagAttachSize"
-"0x0E21";"PidTagAttachNumber";"Identifies the Attachment object within its Message object.";"PtypInteger32, 0x0003";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.6";"PR_ATTACH_NUM, ptagAttachNum"
-"0x0E28";"PidTagPrimarySendAccount";"Specifies the first server that a client is to use to send the email with.";"PtypString, 0x001F";"MapiNonTransmittable";"[MS-OXOMSG] section 2.2.1.64";"PR_PRIMARY_SEND_ACCT"
-"0x0E29";"PidTagNextSendAcct";"Specifies the server that a client is currently attempting to use to send email.";"PtypString, 0x001F";"Outlook Application";"[MS-OXOMSG] section 2.2.1.65";"PR_NEXT_SEND_ACCT"
-"0x0E2B";"PidTagToDoItemFlags";"Contains flags associated with objects.";"PtypInteger32, 0x0003";"MapiNonTransmittable";"[MS-OXOFLAG] section 2.2.1.6";"PR_TODO_ITEM_FLAGS, ptagToDoItemFlags"
-"0x0E2C";"PidTagSwappedToDoStore";"Contains the value of the PidTagStoreEntryId property (section 2.1028) of the message when the value of the PidTagSwappedToDoData property (section 2.1037) is set.";"PtypBinary, 0x0102";"MapiNonTransmittable";"[MS-OXOFLAG] section 2.2.1.8";"PR_SWAPPED_TODO_STORE, ptagSwappedTodoStore"
-"0x0E2D";"PidTagSwappedToDoData";"Contains a secondary storage location for flags when sender flags or sender reminders are supported.";"PtypBinary, 0x0102";"MapiNonTransmittable";"[MS-OXOFLAG] section 2.2.1.7";"PR_SWAPPED_TODO_DATA, ptagSwappedTodoData"
-"0x0E69";"PidTagRead";"Indicates whether a message has been read.";"PtypBoolean, 0x000B";"MapiNonTransmittable Property set";"[MS-OXCMSG] section 2.2.1.53";"PR_READ, ptagRead, urn:schemas:httpmail:read"
-"0x0E6A";"PidTagSecurityDescriptorAsXml";"Contains security attributes in XML.";"PtypString, 0x001F";"Access Control Properties ";"[MS-XWDVSEC] section 2.2.2";"PR_NT_SECURITY_DESCRIPTOR_AS_XML, PR_NT_SECURITY_DESCRIPTOR_AS_XML_A, PR_NT_SECURITY_DESCRIPTOR_AS_XML_W, http://schemas.microsoft.com/exchange/security/descriptor"
-"0x0E79";"PidTagTrustSender";"Specifies whether the associated message was delivered through a trusted transport channel.";"PtypInteger32, 0x0003";"MapiNonTransmittable";"[MS-OXCMSG] section 2.2.1.45";"PR_TRUST_SENDER, ptagTrustSender"
-"0x0E84";"PidTagExchangeNTSecurityDescriptor";"Contains the calculated security descriptor for the item.";"PtypBinary, 0x0102";"Calendar Document ";"[MS-XWDCAL] section 2.2.8.8";"http://schemas.microsoft.com/exchange/ntsecuritydescriptor, http://schemas.microsoft.com/exchange/ntsecuritydescriptor"
-"0x0E99";"PidTagExtendedRuleMessageActions";"Contains action information about named properties used in the rule.";"PtypBinary, 0x0102";"Rules";"[MS-OXORULE] section 2.2.4.1.9";"PR_EXTENDED_RULE_MSG_ACTIONS"
-"0x0E9A";"PidTagExtendedRuleMessageCondition";"Contains condition information about named properties used in the rule.";"PtypBinary, 0x0102";"Rules";"[MS-OXORULE] section 2.2.4.1.10";"PR_EXTENDED_RULE_MSG_CONDITION"
-"0x0E9B";"PidTagExtendedRuleSizeLimit";"Contains the maximum size, in bytes, that the user is allowed to accumulate for a single extended rule.";"PtypInteger32, 0x0003";"Rules";"[MS-OXCSTOR] section 2.2.2.1.1.1";"PR_EXTENDED_RULE_SIZE_LIMIT"
-"0x0FF4";"PidTagAccess";"Indicates the operations available to the client for the object.";"PtypInteger32, 0x0003";"Access Control Properties";"[MS-OXCPRPT] section 2.2.1.1";"PR_ACCESS, ptagAccess"
-"0x0FF5";"PidTagRowType";"Identifies the type of the row.";"PtypInteger32, 0x0003";"MapiNonTransmittable";"[MS-OXCTABL] section 2.2.1.3";"PR_ROW_TYPE, ptagRowType"
-"0x0FF6";"PidTagInstanceKey";"Contains an object on an NSPI server.";"PtypBinary, 0x0102";"Table Properties";"[MS-OXOABK] section 2.2.3.6";"PR_INSTANCE_KEY, ptagInstanceKey"
-"0x0FF7";"PidTagAccessLevel";"Indicates the client's access level to the object.";"PtypInteger32, 0x0003";"Access Control Properties";"[MS-OXCPRPT] section 2.2.1.2";"PR_ACCESS_LEVEL, ptagAccessLevel"
-"0x0FF8";"PidTagMappingSignature";"A 16-byte constant that is present on all Address Book objects, but is not present on objects in an offline address book.";"PtypBinary, 0x0102";"Miscellaneous Properties";"[MS-OXOABK] section 2.2.3.32";"PR_MAPPING_SIGNATURE, ptagMappingSignature"
-"0x0FF9";"PidTagRecordKey";"Contains a unique binary-comparable identifier for a specific object.";"PtypBinary, 0x0102";"ID Properties";"[MS-OXCPRPT] section 2.2.1.8";"PR_RECORD_KEY, ptagRecordKey"
-"0x0FFB";"PidTagStoreEntryId";"Contains the unique EntryID of the message store where an object resides.";"PtypBinary, 0x0102";"ID Properties";"[MS-OXCMSG] section 2.2.1.44";"PR_STORE_ENTRYID, ptagStoreEntryId"
-"0x0FFE";"PidTagObjectType";"Indicates the type of Server object.";"PtypInteger32, 0x0003";"Common ";"[MS-OXCPRPT] section 2.2.1.7";"PR_OBJECT_TYPE, ptagObjectType"
-"0x0FFF";"PidTagEntryId";"Contains the information to identify many different types of messaging objects.";"PtypBinary, 0x0102";"ID Properties";"[MS-OXCPERM] section 2.2.4";"PR_ENTRYID, ptagEntryId"
-"0x1000";"PidTagBody";"Contains message body text in plain text format.";"PtypString, 0x001F";"General Message Properties ";"[MS-OXCMSG] section 2.2.1.56.1";"PR_BODY, PR_BODY_A, ptagBody, PR_BODY_W, urn:schemas:httpmail:textdescription"
-"0x1001";"PidTagReportText";"Contains the optional text for a report message.";"PtypString, 0x001F";"MapiMessage";"[MS-OXOMSG] section 2.2.2.23";"PR_REPORT_TEXT, PR_REPORT_TEXT_A, ptagReportText, PR_REPORT_TEXT_W"
-"0x1009";"PidTagRtfCompressed";"Contains message body text in compressed RTF format.";"PtypBinary, 0x0102";"Email";"[MS-OXCMSG] section 2.2.1.56.4";"PR_RTF_COMPRESSED, ptagRTFCompressed"
-"0x1013";"PidTagBodyHtml";"Contains the HTML body of the Message object.";"PtypString, 0x001F";"General Message Properties";"[MS-OXCMSG] section 2.2.1.56.3";"PR_BODY_HTML, PR_BODY_HTML_A, ptagBodyHtml, PR_BODY_HTML_W"
-"0x1013";"PidTagHtml";"Contains message body text in HTML format.";"PtypBinary, 0x0102";"General Message Properties";"[MS-OXCMSG] section 2.2.1.56.9";"PR_HTML, ptagHtml"
-"0x1014";"PidTagBodyContentLocation";"Contains a globally unique Uniform Resource Identifier (URI) that serves as a label for the current message body.";"PtypString, 0x001F";"MIME Properties";"[MS-OXCMSG] section 2.2.1.56.8";"PR_BODY_CONTENT_LOCATION, PR_BODY_CONTENT_LOCATION_A, PR_BODY_CONTENT_LOCATION_W"
-"0x1015";"PidTagBodyContentId";"Contains a GUID that corresponds to the current message body.";"PtypString, 0x001F";"Exchange";"[MS-OXCMSG] section 2.2.1.56.7";"PR_BODY_CONTENT_ID, PR_BODY_CONTENT_ID_A, PR_BODY_CONTENT_ID_W"
-"0x1016";"PidTagNativeBody";"Indicates the best available format for storing the message body.";"PtypInteger32, 0x0003";"BestBody";"[MS-OXCMSG] section 2.2.1.56.2";"PR_NATIVE_BODY_INFO, ptagNativeBodyInfo"
-"0x1035";"PidTagInternetMessageId";"Corresponds to the message-id field.";"PtypString, 0x001F";"MIME Properties";"[MS-OXOMSG] section 2.2.1.12";"PR_INTERNET_MESSAGE_ID, PR_INTERNET_MESSAGE_ID_A, PR_INTERNET_MESSAGE_ID_W"
-"0x1039";"PidTagInternetReferences";"Contains a list of message IDs that specify the messages to which this reply is related.";"PtypString, 0x001F";"MIME Properties";"[MS-OXCMSG] section 2.2.1.26";"PR_INTERNET_REFERENCES, PR_INTERNET_REFERENCES_A, PR_INTERNET_REFERENCES_W"
-"0x1042";"PidTagInReplyToId";"Contains the value of the original message's PidTagInternetMessageId property (section 2.748) value.";"PtypString, 0x001F";"General Message Properties";"[MS-OXOMSG] section 2.2.1.13";"PR_IN_REPLY_TO_ID, PR_IN_REPLY_TO_ID_A, PR_IN_REPLY_TO_ID_W"
-"0x1043";"PidTagListHelp";"Contains a URI that provides detailed help information for the mailing list from which an email message was sent.";"PtypString, 0x001F";"Miscellaneous Properties";"[MS-OXOMSG] section 2.2.1.81";"PR_LIST_HELP, PR_LIST_HELP_A, PR_LIST_HELP_W"
-"0x1044";"PidTagListSubscribe";"Contains the URI that subscribes a recipient to a messageƒ??s associated mailing list.";"PtypString, 0x001F";"Miscellaneous Properties";"[MS-OXOMSG] section 2.2.1.82";"PR_LIST_SUBSCRIBE, PR_LIST_SUBSCRIBE_A, PR_LIST_SUBSCRIBE_W"
-"0x1045";"PidTagListUnsubscribe";"Contains the URI that unsubscribes a recipient from a messageƒ??s associated mailing list.";"PtypString, 0x001F";"Miscellaneous Properties";"[MS-OXOMSG] section 2.2.1.83";"PR_LIST_UNSUBSCRIBE, PR_LIST_UNSUBSCRIBE_A, PR_LIST_UNSUBSCRIBE_W"
-"0x1046";"PidTagOriginalMessageId";"Contains the message ID of the original message included in replies or resent messages.";"PtypString, 0x001F";"Mail";"[MS-OXOMSG] section 2.2.1.85";"ptagOriginalInternetMessageID, OriginalMessageId"
-"0x1080";"PidTagIconIndex";"Specifies which icon is to be used by a user interface when displaying a group of Message objects.";"PtypInteger32, 0x0003";"General Message Properties";"[MS-OXOMSG] section 2.2.1.10";"PR_ICON_INDEX, ptagIconIndex"
-"0x1081";"PidTagLastVerbExecuted";"Specifies the last verb executed for the message item to which it is related.";"PtypInteger32, 0x0003";"History Properties";"[MS-OXOMSG] section 2.2.1.14";"PR_LAST_VERB_EXECUTED, ptagLastVerbExecuted"
-"0x1082";"PidTagLastVerbExecutionTime";"Contains the date and time, in UTC, during which the operation represented in the PidTagLastVerbExecuted property (section 2.767) took place.";"PtypTime, 0x0040";"History Properties";"[MS-OXOMSG] section 2.2.1.15";"PR_LAST_VERB_EXECUTION_TIME, ptagLastVerbExecutionTime"
-"0x1090";"PidTagFlagStatus";"Specifies the flag state of the Message object.";"PtypInteger32, 0x0003";"Miscellaneous Properties";"[MS-OXOFLAG] section 2.2.1.1";"PR_FLAG_STATUS, ptagFlagStatus"
-"0x1091";"PidTagFlagCompleteTime";"Specifies the date and time, in UTC, that the Message object was flagged as complete.";"PtypTime, 0x0040";"Miscellaneous Properties ";"[MS-OXOFLAG] section 2.2.1.3";"PR_FLAG_COMPLETE_TIME, ptagFlagCompleteTime, urn:schemas:httpmail:flagcompleted"
-"0x1095";"PidTagFollowupIcon";"Specifies the flag color of the Message object.";"PtypInteger32, 0x0003";"RenMessageFolder";"[MS-OXOFLAG] section 2.2.1.2";"PR_FOLLOWUP_ICON, ptagFollowupIcon"
-"0x1096";"PidTagBlockStatus";"Indicates the user's preference for viewing external content (such as links to images on an HTTP server) in the message body.";"PtypInteger32, 0x0003";"Secure Messaging Properties";"[MS-OXOMSG] section 2.2.1.1";"PR_BLOCK_STATUS, ptagBlockStatus"
-"0x10C3";"PidTagICalendarStartTime";"Contains the date and time, in UTC, when the appointment or meeting starts.";"PtypTime, 0x0040";"Calendar Property set";"[MS-XWDCAL] section 2.2.2.41";"urn:schemas:calendar:dtstart"
-"0x10C4";"PidTagICalendarEndTime";"Contains the date and time, in UTC, when an appointment or meeting ends.";"PtypTime, 0x0040";"Calendar ";"[MS-XWDCAL] section 2.2.2.39";"urn:schemas:calendar:dtend"
-"0x10C5";"PidTagCdoRecurrenceid";"Identifies a specific instance of a recurring appointment.";"PtypTime, 0x0040";"Exchange ";"[MS-XWDCAL] section 2.2.2.38";"PR_CDO_RECURRENCEID, urn:schemas:calendar:recurrenceid"
-"0x10CA";"PidTagICalendarReminderNextTime";"Contains the date and time, in UTC, for the activation of the next reminder.";"PtypTime, 0x0040";"Calendar ";"[MS-XWDCAL] section 2.2.2.40";"urn:schemas:calendar:remindernexttime"
-"0x10F4";"PidTagAttributeHidden";"Specifies the hide or show status of a folder.";"PtypBoolean, 0x000B";"Access Control Properties ";"[MS-OXCFOLD] section 2.2.2.2.2.1";"PR_ATTR_HIDDEN, ptagAttrHidden, DAV:ishidden"
-"0x10F6";"PidTagAttributeReadOnly";"Indicates whether an item can be modified or deleted.";"PtypBoolean, 0x000B";"Access Control Properties ";"[MS-XWDCAL] section 2.2.1.8";"PR_ATTR_READONLY, ptagAttrReadonly, DAV:isreadonly"
-"0x3000";"PidTagRowid";"Contains a unique identifier for a recipient in a message's recipient table.";"PtypInteger32, 0x0003";"MapiCommon";"[MS-OXCMSG] section 2.2.1.38";"PR_ROWID, ptagRowId"
-"0x3001";"PidTagDisplayName";"Contains the display name of the folder.";"PtypString, 0x001F";"MapiCommon";"[MS-OXCFOLD] section 2.2.2.2.2.5";"PR_DISPLAY_NAME, PR_DISPLAY_NAME_A, ptagDisplayName, PR_DISPLAY_NAME_W, urn:schemas:contacts:cn"
-"0x3002";"PidTagAddressType";"Contains the email address type of a Message object.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.3.13";"PR_ADDRTYPE, PR_ADDRTYPE_A, ptagAddrType, PR_ADDRTYPE_W"
-"0x3003";"PidTagEmailAddress";"Contains the email address of a Message object.";"PtypString, 0x001F";"MapiCommon";"[MS-OXOABK] section 2.2.3.14";"PR_EMAIL_ADDRESS, PR_EMAIL_ADDRESS_A, PR_EMAIL_ADDRESS_W"
-"0x3004";"PidTagComment";"Contains a comment about the purpose or content of the Address Book object.";"PtypString, 0x001F";"Common ";"[MS-OXCFOLD] section 2.2.2.2.2.2";"PR_COMMENT, PR_COMMENT_A, ptagComment, PR_COMMENT_W, DAV:comment, http://schemas.microsoft.com/exchange/summary-utf8"
-"0x3005";"PidTagDepth";"Specifies the number of nested categories in which a given row is contained.";"PtypInteger32, 0x0003";"MapiCommon";"[MS-OXCTABL] section 2.2.1.4";"PR_DEPTH, ptagDepth"
-"0x3007";"PidTagCreationTime";"Contains the time, in UTC, that the object was created.";"PtypTime, 0x0040";"Message Time Properties";"[MS-OXCMSG] section 2.2.2.3";"PR_CREATION_TIME, ptagCreationTime, DAV:creationdate"
-"0x3008";"PidTagLastModificationTime";"Contains the time, in UTC, of the last modification to the object.";"PtypTime, 0x0040";"Message Time Properties ";"[MS-OXCMSG] section 2.2.2.2";"PR_LAST_MODIFICATION_TIME, ptagLastModificationTime, urn:schemas:calendar:lastmodifiedtime, DAV:getlastmodified"
-"0x300B";"PidTagSearchKey";"Contains a unique binary-comparable key that identifies an object for a search.";"PtypBinary, 0x0102";"ID Properties";"[MS-OXCPRPT] section 2.2.1.9";"PR_SEARCH_KEY, ptagSearchKey"
-"0x3010";"PidTagTargetEntryId";"Contains the message ID of a Message object being submitted for optimization ([MS-OXOMSG] section 3.2.4.4).";"PtypBinary, 0x0102";"ID Properties";"[MS-OXOMSG] section 2.2.1.76";"PR_TARGET_ENTRYID, ptagTargetEntryId"
-"0x3013";"PidTagConversationId";"Contains a computed value derived from other conversation-related properties. ";"PtypBinary, 0x0102";"Conversations";"[MS-OXOMSG] section 2.2.1.2";"PR_CONVERSATION_ID"
-"0x3016";"PidTagConversationIndexTracking";"Indicates whether the GUID portion of the PidTagConversationIndex property (section 2.650) is to be used to compute the PidTagConversationId property (section 2.649).";"PtypBoolean, 0x000B";"Conversations";"[MS-OXOMSG] section 2.2.1.4";"PR_CONVERSATION_INDEX_TRACKING"
-"0x3018";"PidTagArchiveTag";"Specifies the GUID of an archive tag.";"PtypBinary, 0x0102";"Archive";"[MS-OXCMSG] section 2.2.1.58.1 ";"PR_ARCHIVE_TAG, ptagArchiveTag"
-"0x3019";"PidTagPolicyTag";"Specifies the GUID of a retention tag.";"PtypBinary, 0x0102";"Archive";"[MS-OXCMSG] section 2.2.1.58.2";"PR_POLICY_TAG, ptagPolicyTag"
-"0x301A";"PidTagRetentionPeriod";"Specifies the number of days that a Message object can remain unarchived.";"PtypInteger32, 0x0003";"Archive";"[MS-OXCMSG] section 2.2.1.58.3";"PR_RETENTION_PERIOD, ptagRetentionPeriod"
-"0x301B";"PidTagStartDateEtc";"Contains the default retention period, and the start date from which the age of a Message object is calculated.";"PtypBinary, 0x0102";"Archive";"[MS-OXCMSG] section 2.2.1.58.4";"PR_START_DATE_ETC, ptagStartDateEtc"
-"0x301C";"PidTagRetentionDate";"Specifies the date, in UTC, after which a Message object is expired by the server.";"PtypTime, 0x0040";"Archive";"[MS-OXCMSG] section 2.2.1.58.5 ";"PR_RETENTION_DATE, ptagRetentionDate"
-"0x301D";"PidTagRetentionFlags";"Contains flags that specify the status or nature of an item's retention tag or archive tag.";"PtypInteger32, 0x0003";"Archive";"[MS-OXCMSG] section 2.2.1.58.6 ";"PR_RETENTION_FLAGS, ptagRetentionFlags"
-"0x301E";"PidTagArchivePeriod";"Specifies the number of days that a Message object can remain unarchived.";"PtypInteger32, 0x0003";"Archive";"[MS-OXCMSG] section 2.2.1.58.7 ";"PR_ARCHIVE_PERIOD, ptagArchivePeriod"
-"0x301F";"PidTagArchiveDate";"Specifies the date, in UTC, after which a Message object is archived by the server.";"PtypTime, 0x0040";"Archive";"[MS-OXCMSG] section 2.2.1.58.8";"PR_ARCHIVE_DATE, ptagArchiveDate"
-"0x340D";"PidTagStoreSupportMask";"Indicates whether string properties within the .msg file are Unicode-encoded.";"PtypInteger32, 0x0003";"Miscellaneous Properties";"[MS-OXMSG] section 2.1.1.1";"PR_STORE_SUPPORT_MASK, ptagStoreSupportMask"
-"0x340E";"PidTagStoreState";"Indicates whether a mailbox has any active Search folders.";"PtypInteger32, 0x0003";"MapiMessageStore";"[MS-OXCSTOR] section 2.2.2.1";"PR_STORE_STATE"
-"0x3600";"PidTagContainerFlags";"Contains a bitmask of flags that describe capabilities of an address book container.";"PtypInteger32, 0x0003";"Address Book";"[MS-OXOABK] section 2.2.2.1";"PR_CONTAINER_FLAGS"
-"0x3601";"PidTagFolderType";"Specifies the type of a folder that includes the Root folder, Generic folder, and Search folder.";"PtypInteger32, 0x0003";"MapiContainer";"[MS-OXCFOLD] section 2.2.2.2.2.7";"PR_FOLDER_TYPE, ptagFolderType"
-"0x3602";"PidTagContentCount";"Specifies the number of rows under the header row.";"PtypInteger32, 0x0003";"Folder Properties";"[MS-OXCFOLD] section 2.2.2.2.1.1";"PR_CONTENT_COUNT, ptagContentCount, DAV:visiblecount"
-"0x3603";"PidTagContentUnreadCount";"Specifies the number of rows under the header row that have the PidTagRead property (section 2.878) set to FALSE.";"PtypInteger32, 0x0003";"Folder Properties";"[MS-OXCFOLD] section 2.2.2.2.1.2";"PR_CONTENT_UNREAD, ptagContentUnread, urn:schemas:httpmail:unreadcount"
-"0x3609";"PidTagSelectable";"This property is not set and, if set, is ignored.";"PtypBoolean, 0x000B";"AB Container";"[MS-OXOABKT] section 2.2.1";"PR_SELECTABLE"
-"0x360A";"PidTagSubfolders";"Specifies whether a folder has subfolders.";"PtypBoolean, 0x000B";"MapiContainer";"[MS-OXCFOLD] section 2.2.2.2.1.12";"PR_SUBFOLDERS, ptagSubFolders, DAV:hassubs"
-"0x360C";"PidTagAnr";"Contains a filter value used in ambiguous name resolution.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.10.1";"PR_ANR, PR_ANR_A, PR_ANR_W"
-"0x360E";"PidTagContainerHierarchy";"Identifies all of the subfolders of the current folder.";"PtypObject, 0x000D";"Container Properties";"[MS-OXCFOLD] section 2.2.2.2.2.4";"PR_CONTAINER_HIERARCHY, ptagContainerHierarchy"
-"0x360F";"PidTagContainerContents";"Empty. An NSPI server defines this value for distribution lists and it is not present for other objects.";"PtypEmbeddedTable, 0x000D";"Container Properties";"[MS-OXOABK] section 2.2.6.3";"PR_CONTAINER_CONTENTS, ptagContainerContents"
-"0x3610";"PidTagFolderAssociatedContents";"Identifies all FAI messages in the current folder.";"PtypObject, 0x000D";"MapiContainer";"[MS-OXCFOLD] section 2.2.2.2.2.6";"PR_FOLDER_ASSOCIATED_CONTENTS"
-"0x3613";"PidTagContainerClass";"Contains a string value that describes the type of Message object that a folder contains.";"PtypString, 0x001F";"Container Properties ";"[MS-OXCFOLD] section 2.2.2.2.2.3";"PR_CONTAINER_CLASS, PR_CONTAINER_CLASS_A, ptagContainerClass, PR_CONTAINER_CLASS_W, http://schemas.microsoft.com/exchange/outlookfolderclasshttp://schemas.microsoft.com/exchange/outlookfolderclass"
-"0x36D0";"PidTagIpmAppointmentEntryId";"Contains the EntryID of the Calendar folder.";"PtypBinary, 0x0102";"Folder Properties";"[MS-OXOSFLD] section 2.2.3";"PR_IPM_APPOINTMENT_ENTRYID"
-"0x36D1";"PidTagIpmContactEntryId";"Contains the EntryID of the Contacts folder.";"PtypBinary, 0x0102";"Folder Properties";"[MS-OXOSFLD] section 2.2.3";"PR_IPM_CONTACT_ENTRYID"
-"0x36D2";"PidTagIpmJournalEntryId";"Contains the EntryID of the Journal folder.";"PtypBinary, 0x0102";"Folder Properties";"[MS-OXOSFLD] section 2.2.3";"PR_IPM_JOURNAL_ENTRYID"
-"0x36D3";"PidTagIpmNoteEntryId";"Contains the EntryID of the Notes folder.";"PtypBinary, 0x0102";"Folder Properties";"[MS-OXOSFLD] section 2.2.3";"PR_IPM_NOTE_ENTRYID"
-"0x36D4";"PidTagIpmTaskEntryId";"Contains the EntryID of the Tasks folder.";"PtypBinary, 0x0102";"Folder Properties";"[MS-OXOSFLD] section 2.2.3";"PR_IPM_TASK_ENTRYID"
-"0x36D5";"PidTagRemindersOnlineEntryId";"Contains an EntryID for the Reminders folder.";"PtypBinary, 0x0102";"MapiContainer";"[MS-OXOSFLD] section 2.2.3";"PR_REM_ONLINE_ENTRYID, ptagRemOnlineEntryId"
-"0x36D7";"PidTagIpmDraftsEntryId";"Contains the EntryID of the Drafts folder.";"PtypBinary, 0x0102";"Folder Properties";"[MS-OXOSFLD] section 2.2.3";"PR_IPM_DRAFTS_ENTRYID"
-"0x36D8";"PidTagAdditionalRenEntryIds";"Contains the indexed entry IDs for several special folders related to conflicts, sync issues, local failures, server failures, junk email and spam.";"PtypMultipleBinary, 0x1102";"Outlook Application";"[MS-OXOSFLD] section 2.2.4";"PR_ADDITIONAL_REN_ENTRYIDS, ptagAdditionalRenEntryIds"
-"0x36D9";"PidTagAdditionalRenEntryIdsEx";"Contains an array of blocks that specify the EntryIDs of several special folders.";"PtypBinary, 0x0102";"Outlook Application";"[MS-OXOSFLD] section 2.2.5";"PR_ADDITIONAL_REN_ENTRYIDS_EX, ptagAdditionalRenEntryIdsEx"
-"0x36DA";"PidTagExtendedFolderFlags";"Contains encoded sub-properties for a folder.";"PtypBinary, 0x0102";"MapiContainer";"[MS-OXOSRCH] section 2.2.2.1.2";"PR_EXTENDED_FOLDER_FLAGS, ptagExtendedFolderFlags"
-"0x36E2";"PidTagOrdinalMost";"Contains a positive number whose negative is less than or equal to the value of the PidLidTaskOrdinal property (section 2.327) of all of the Task objects in the folder.";"PtypInteger32, 0x0003";"Tasks";"[MS-OXOTASK] section 2.2.1.1";"PR_ORDINAL_MOST"
-"0x36E4";"PidTagFreeBusyEntryIds";"Contains EntryIDs of the Delegate Information object, the free/busy message of the logged on user, and the folder with the PidTagDisplayName property (section 2.676) value of ""Freebusy Data"".";"PtypMultipleBinary, 0x1102";"MapiContainer";"[MS-OXOSFLD] section 2.2.6";"PR_FREEBUSY_ENTRYIDS, ptagFreeBusyEntryIds"
-"0x36E5";"PidTagDefaultPostMessageClass";"Contains the message class of the object.";"PtypString, 0x001F";"MapiContainer";"[MS-OXOCAL] section 2.2.11.2";"PR_DEF_POST_MSGCLASS"
-"0x3701";"PidTagAttachDataBinary";"Contains the contents of the file to be attached.";"PtypBinary, 0x0102";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.7";"PR_ATTACH_DATA_BIN, ptagAttachDataBin"
-"0x3701";"PidTagAttachDataObject";"Contains the binary representation of the Attachment object in an application-specific format.";"PtypObject, 0x000D";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.8";"PR_ATTACH_DATA_OBJ, ptagAttachDataObj"
-"0x3702";"PidTagAttachEncoding";"Contains encoding information about the Attachment object.";"PtypBinary, 0x0102";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.20";"PR_ATTACH_ENCODING"
-"0x3703";"PidTagAttachExtension";"Contains a file name extension that indicates the document type of an attachment.";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.12";"PR_ATTACH_EXTENSION, PR_ATTACH_EXTENSION_A, PR_ATTACH_EXTENSION_W"
-"0x3704";"PidTagAttachFilename";"Contains the 8.3 name of the PidTagAttachLongFilename property (section 2.595).";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.11";"PR_ATTACH_FILENAME, PR_ATTACH_FILENAME_A, ptagAttachFilename, PR_ATTACH_FILENAME_W"
-"0x3705";"PidTagAttachMethod";"Represents the way the contents of an attachment are accessed.";"PtypInteger32, 0x0003";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.9";"PR_ATTACH_METHOD, ptagAttachMethod"
-"0x3707";"PidTagAttachLongFilename";"Contains the full filename and extension of the Attachment object.";"PtypString, 0x001F";"Message Attachment Properties ";"[MS-OXCMSG] section 2.2.2.10";"PR_ATTACH_LONG_FILENAME, PR_ATTACH_LONG_FILENAME_A, PR_ATTACH_LONG_FILENAME_W, urn:schemas:httpmail:attachmentfilename"
-"0x3708";"PidTagAttachPathname";"Contains the 8.3 name of the PidTagAttachLongPathname property (section 2.596).";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.14";"PR_ATTACH_PATHNAME, PR_ATTACH_PATHNAME_A, ptagAttachPathname, PR_ATTACH_PATHNAME_W"
-"0x3709";"PidTagAttachRendering";"Contains a Windows Metafile, as specified in [MS-WMF], for the Attachment object.";"PtypBinary, 0x0102";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.17";"PR_ATTACH_RENDERING, ptagAttachRendering"
-"0x370A";"PidTagAttachTag";"Contains the identifier information for the application that supplied the Attachment object data.";"PtypBinary, 0x0102";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.15";"PR_ATTACH_TAG"
-"0x370B";"PidTagRenderingPosition";"Represents an offset, in rendered characters, to use when rendering an attachment within the main message text.";"PtypInteger32, 0x0003";"MapiAttachment";"[MS-OXCMSG] section 2.2.2.16";"PR_RENDERING_POSITION, ptagRenderingPosition"
-"0x370C";"PidTagAttachTransportName";"Contains the name of an attachment file, modified so that it can be correlated with TNEF messages.";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.19";"PR_ATTACH_TRANSPORT_NAME, PR_ATTACH_TRANSPORT_NAME_A, PR_ATTACH_TRANSPORT_NAME_W"
-"0x370D";"PidTagAttachLongPathname";"Contains the fully-qualified path and file name with extension.";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.13";"PR_ATTACH_LONG_PATHNAME, PR_ATTACH_LONG_PATHNAME_A, ptagAttachLongPathname, PR_ATTACH_LONG_PATHNAME_W"
-"0x370E";"PidTagAttachMimeTag";"Contains a content-type MIME header.";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.29";"PR_ATTACH_MIME_TAG, PR_ATTACH_MIME_TAG_A, PR_ATTACH_MIME_TAG_W"
-"0x370F";"PidTagAttachAdditionalInformation";"Contains attachment encoding information.";"PtypBinary, 0x0102";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.21";"PR_ATTACH_ADDITIONAL_INFO"
-"0x3711";"PidTagAttachContentBase";"Contains the base of a relative URI.";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.29";
-"0x3712";"PidTagAttachContentId";"Contains a content identifier unique to the Message object that matches a corresponding ""cid:"" URI schema reference in the HTML body of the Message object.";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.29";"PR_ATTACH_CONTENT_ID, PR_ATTACH_CONTENT_ID_A, PR_ATTACH_CONTENT_ID_W"
-"0x3713";"PidTagAttachContentLocation";"Contains a relative or full URI that matches a corresponding reference in the HTML body of a Message object.";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.29";"PR_ATTACH_CONTENT_LOCATION, PR_ATTACH_CONTENT_LOCATION_A, PR_ATTACH_CONTENT_LOCATION_W"
-"0x3714";"PidTagAttachFlags";"Indicates which body formats might reference this attachment when rendering data.";"PtypInteger32, 0x0003";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.18";"PR_ATTACH_FLAGS"
-"0x3719";"PidTagAttachPayloadProviderGuidString";"Contains the GUID of the software component that can display the contents of the message.";"PtypString, 0x001F";"Outlook Application";"[MS-OXCMSG] section 2.2.2.29";"PR_ATTACH_PAYLOAD_PROV_GUID_STR, PR_ATTACH_PAYLOAD_PROV_GUID_STR_A, PR_ATTACH_PAYLOAD_PROV_GUID_STR_W"
-"0x371A";"PidTagAttachPayloadClass";"Contains the class name of an object that can display the contents of the message.";"PtypString, 0x001F";"Outlook Application";"[MS-OXCMSG] section 2.2.2.29";"PR_ATTACH_PAYLOAD_CLASS, PR_ATTACH_PAYLOAD_CLASS_A, PR_ATTACH_PAYLOAD_CLASS_W, ptagAttachPayloadClass"
-"0x371B";"PidTagTextAttachmentCharset";"Specifies the character set of an attachment received via MIME with the content-type of text. ";"PtypString, 0x001F";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.25";"ptagTextAttachmentCharset"
-"0x3900";"PidTagDisplayType";"Contains an integer value that indicates how to display an Address Book object in a table or as an addressee on a message.";"PtypInteger32, 0x0003";"MapiAddressBook";"[MS-OXOABK] section 2.2.3.11";"PR_DISPLAY_TYPE, ptagDisplayType"
-"0x3902";"PidTagTemplateid";"Contains the value of the PidTagEntryId property (section 2.683), expressed as a Permanent Entry ID format.";"PtypBinary, 0x0102";"MapiAddressBook";"[MS-OXOABK] section 2.2.3.3";"PR_TEMPLATEID"
-"0x3905";"PidTagDisplayTypeEx";"Contains an integer value that indicates how to display an Address Book object in a table or as a recipient on a message.";"PtypInteger32, 0x0003";"MapiAddressBook";"[MS-OXOABK] section 2.2.3.12";"PR_DISPLAY_TYPE_EX"
-"0x39FE";"PidTagSmtpAddress";"Contains the SMTP address of the Message object.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.3.21";"PR_SMTP_ADDRESS, PR_SMTP_ADDRESS_A, PR_SMTP_ADDRESS_W"
-"0x39FF";"PidTagAddressBookDisplayNamePrintable";"Contains the printable string version of the display name.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.7";"PR_EMS_AB_DISPLAY_NAME_PRINTABLE, PR_EMS_AB_DISPLAY_NAME_PRINTABLE_A, PR_EMS_AB_DISPLAY_NAME_PRINTABLE_W, PR_7BIT_DISPLAY_NAME, PR_7BIT_DISPLAY_NAME_A, PR_7BIT_DISPLAY_NAME_W, ptagSimpleDisplayName"
-"0x3A00";"PidTagAccount";"Contains the alias of an Address Book object, which is an alternative name by which the object can be identified.";"PtypString, 0x001F";"Address Book";"[MS-OXOCNTC] section 2.2.1.10.11";"PR_ACCOUNT, PR_ACCOUNT_A, PR_ACCOUNT_W, urn:schemas:contacts:account"
-"0x3A02";"PidTagCallbackTelephoneNumber";"Contains a telephone number to reach the mail user.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.4.2";"PR_CALLBACK_TELEPHONE_NUMBER, PR_CALLBACK_TELEPHONE_NUMBER_A, PR_CALLBACK_TELEPHONE_NUMBER_W, urn:schemas:contacts:callbackphone"
-"0x3A05";"PidTagGeneration";"Contains a generational abbreviation that follows the full name of the mail user.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.1.2";"PR_GENERATION, PR_GENERATION_A, PR_GENERATION_W, urn:schemas:contacts:namesuffix"
-"0x3A06";"PidTagGivenName";"Contains the mail user's given name.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.2";"PR_GIVEN_NAME, PR_GIVEN_NAME_A, PR_GIVEN_NAME_W, urn:schemas:contacts:givenName"
-"0x3A07";"PidTagGovernmentIdNumber";"Contains a government identifier for the mail user.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.10.9";"PR_GOVERNMENT_ID_NUMBER, PR_GOVERNMENT_ID_NUMBER_A, PR_GOVERNMENT_ID_NUMBER_W, urn:schemas:contacts:governmentid"
-"0x3A08";"PidTagBusinessTelephoneNumber";"Contains the primary telephone number of the mail user's place of business.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOABK] section 2.2.4.21";"PR_BUSINESS_TELEPHONE_NUMBER, PR_BUSINESS_TELEPHONE_NUMBER_A, PR_BUSINESS_TELEPHONE_NUMBER_W, PR_OFFICE_TELEPHONE_NUMBER, urn:schemas:contacts:telephoneNumber"
-"0x3A09";"PidTagHomeTelephoneNumber";"Contains the primary telephone number of the mail user's home.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.22";"PR_HOME_TELEPHONE_NUMBER, PR_HOME_TELEPHONE_NUMBER_A, PR_HOME_TELEPHONE_NUMBER_W, urn:schemas:contacts:homePhone"
-"0x3A0A";"PidTagInitials";"Contains the initials for parts of the full name of the mail user.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.4.3";"PR_INITIALS, PR_INITIALS_A, PR_INITIALS_W, urn:schemas:contacts:initials"
-"0x3A0B";"PidTagKeyword";"Contains a keyword that identifies the mail user to the mail user's system administrator.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.4.32";"PR_KEYWORD, PR_KEYWORD_A, PR_KEYWORD_W"
-"0x3A0C";"PidTagLanguage";"Contains a value that indicates the language in which the messaging user is writing messages.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.10.4";"PR_LANGUAGE, PR_LANGUAGE_A, PR_LANGUAGE_W, urn:schemas:contacts:language"
-"0x3A0D";"PidTagLocation";"Contains the location of the mail user.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.10.5";"PR_LOCATION, PR_LOCATION_A, PR_LOCATION_W, urn:schemas:contacts:location"
-"0x3A0F";"PidTagMessageHandlingSystemCommonName";"Contains the common name of a messaging user for use in a message header.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.4.33";"PR_MHS_COMMON_NAME, PR_MHS_COMMON_NAME_A, PR_MHS_COMMON_NAME_W, urn:schemas:contacts:dn"
-"0x3A10";"PidTagOrganizationalIdNumber";"Contains an identifier for the mail user used within the mail user's organization.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.10.7";"PR_ORGANIZATIONAL_ID_NUMBER, PR_ORGANIZATIONAL_ID_NUMBER_A, PR_ORGANIZATIONAL_ID_NUMBER_W, urn:schemas:contacts:employeenumber"
-"0x3A11";"PidTagSurname";"Contains the mail user's family name.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.1";"PR_SURNAME, PR_SURNAME_A, PR_SURNAME_W, urn:schemas:contacts:sn"
-"0x3A12";"PidTagOriginalEntryId";"Contains the original EntryID of an object.";"PtypBinary, 0x0102";"General Message Properties";"[MS-OXCFXICS] section 2.2.1.2.9";"PR_ORIGINAL_ENTRYID, ptagOriginalEntryId"
-"0x3A15";"PidTagPostalAddress";"Contains the mail user's postal address.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.3.8";"PR_POSTAL_ADDRESS, PR_POSTAL_ADDRESS_A, PR_POSTAL_ADDRESS_W, urn:schemas:contacts:mailingpostaladdress"
-"0x3A16";"PidTagCompanyName";"Contains the mail user's company name.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOABK] section 2.2.4.7";"PR_COMPANY_NAME, PR_COMPANY_NAME_A, PR_COMPANY_NAME_W, urn:schemas:contacts:o"
-"0x3A17";"PidTagTitle";"Contains the mail user's job title.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.4";"PR_TITLE, PR_TITLE_A, PR_TITLE_W, urn:schemas:contacts:title"
-"0x3A18";"PidTagDepartmentName";"Contains a name for the department in which the mail user works.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.6";"PR_DEPARTMENT_NAME, PR_DEPARTMENT_NAME_A, PR_DEPARTMENT_NAME_W, urn:schemas:contacts:department"
-"0x3A19";"PidTagOfficeLocation";"Contains the mail user's office location.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.4.5";"PR_OFFICE_LOCATION, PR_OFFICE_LOCATION_A, PR_OFFICE_LOCATION_W, urn:schemas:contacts:roomnumber"
-"0x3A1A";"PidTagPrimaryTelephoneNumber";"Contains the mail user's primary telephone number.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.4.5";"PR_PRIMARY_TELEPHONE_NUMBER, PR_PRIMARY_TELEPHONE_NUMBER_A, PR_PRIMARY_TELEPHONE_NUMBER_W"
-"0x3A1B";"PidTagBusiness2TelephoneNumber";"Contains a secondary telephone number at the mail user's place of business.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOABK] section 2.2.4.23";"""PR_BUSINESS2_TELEPHONE_NUMBER, PR_BUSINESS2_TELEPHONE_NUMBER_A, PR_BUSINESS2_TELEPHONE_NUMBER_W, PR_OFFICE2_TELEPHONE_NUMBER, urn:schemas:contacts:telephonenumber2"
-"0x3A1B";"PidTagBusiness2TelephoneNumbers";"Contains secondary telephone numbers at the mail user's place of business.";"PtypMultipleString, 0x101F";"Contact Properties";"[MS-OXOABK] section 2.2.4.24";"PR_BUSINESS2_TELEPHONE_NUMBER_A_MV"
-"0x3A1C";"PidTagMobileTelephoneNumber";"Contains the mail user's cellular telephone number.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.4.27";"PR_MOBILE_TELEPHONE_NUMBER, PR_MOBILE_TELEPHONE_NUMBER_A, PR_MOBILE_TELEPHONE_NUMBER_W, urn:schemas:contacts:mobile"
-"0x3A1D";"PidTagRadioTelephoneNumber";"Contains the mail user's radio telephone number.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.4.8";"PR_RADIO_TELEPHONE_NUMBER, PR_RADIO_TELEPHONE_NUMBER_A, PR_RADIO_TELEPHONE_NUMBER_W"
-"0x3A1E";"PidTagCarTelephoneNumber";"Contains the mail user's car telephone number.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.4.9";"PR_CAR_TELEPHONE_NUMBER, PR_CAR_TELEPHONE_NUMBER_A, PR_CAR_TELEPHONE_NUMBER_W, urn:schemas:contacts:othermobile"
-"0x3A1F";"PidTagOtherTelephoneNumber";"Contains an alternate telephone number for the mail user.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.4.10";"PR_OTHER_TELEPHONE_NUMBER, PR_OTHER_TELEPHONE_NUMBER_A, PR_OTHER_TELEPHONE_NUMBER_W, urn:schemas:contacts:otherTelephone"
-"0x3A20";"PidTagTransmittableDisplayName";"Contains an Address Book object's display name that is transmitted with the message.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.3.8";"PR_TRANSMITABLE_DISPLAY_NAME, PR_TRANSMITABLE_DISPLAY_NAME_A, ptagTransmitableDisplayName, PR_TRANSMITABLE_DISPLAY_NAME_W"
-"0x3A21";"PidTagPagerTelephoneNumber";"Contains the mail user's pager telephone number.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.4.28";"PR_PAGER_TELEPHONE_NUMBER, PR_PAGER_TELEPHONE_NUMBER_A, PR_PAGER_TELEPHONE_NUMBER_W, urn:schemas:contacts:pager"
-"0x3A22";"PidTagUserCertificate";"Contains an ASN.1 authentication certificate for a messaging user.";"PtypBinary, 0x0102";"MapiMailUser";"[MS-OXOABK] section 2.2.4.34";"PR_USER_CERTIFICATE, ptagUserCertificate, urn:schemas:contacts:usercertificate"
-"0x3A23";"PidTagPrimaryFaxNumber";"Contains the telephone number of the mail user's primary fax machine.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.29";"PR_PRIMARY_FAX_NUMBER, PR_PRIMARY_FAX_NUMBER_A, PR_PRIMARY_FAX_NUMBER_W, urn:schemas:contacts:otherfax"
-"0x3A24";"PidTagBusinessFaxNumber";"Contains the telephone number of the mail user's business fax machine.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.2.6";"PR_BUSINESS_FAX_NUMBER, PR_BUSINESS_FAX_NUMBER_A, PR_BUSINESS_FAX_NUMBER_W, urn:schemas:contacts:facsimiletelephonenumber"
-"0x3A25";"PidTagHomeFaxNumber";"Contains the telephone number of the mail user's home fax machine.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.2.6";"PR_HOME_FAX_NUMBER, PR_HOME_FAX_NUMBER_A, PR_HOME_FAX_NUMBER_W, urn:schemas:contacts:homefax"
-"0x3A26";"PidTagCountry";"Contains the name of the mail user's country/region.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOABK] section 2.2.4.19";"PR_COUNTRY, PR_COUNTRY_A, PR_COUNTRY_W, PR_BUSINESS_ADDRESS_COUNTRY, PR_BUSINESS_ADDRESS_COUNTRY_A, PR_BUSINESS_ADDRESS_COUNTRY_W, urn:schemas:contacts:mailingcountry"
-"0x3A27";"PidTagLocality";"Contains the name of the mail user's locality, such as the town or city.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.4.16";"PR_LOCALITY, PR_LOCALITY_A, PR_LOCALITY_W, PR_BUSINESS_ADDRESS_LOCALITY, PR_BUSINESS_ADDRESS_LOCALITY_A, PR_BUSINESS_ADDRESS_LOCALITY_W, urn:schemas:contacts:mailingcity"
-"0x3A28";"PidTagStateOrProvince";"Contains the name of the mail user's state or province.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.17";"PR_STATE_OR_PROVINCE, PR_STATE_OR_PROVINCE_A, PR_STATE_OR_PROVINCE_W, PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE, PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_A, PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_W, urn:schemas:contacts:mailingstate"
-"0x3A29";"PidTagStreetAddress";"Contains the mail user's street address.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.14";"PR_STREET_ADDRESS, PR_STREET_ADDRESS_A, PR_STREET_ADDRESS_W, PR_BUSINESS_ADDRESS_STREET, PR_BUSINESS_ADDRESS_STREET_A, PR_BUSINESS_ADDRESS_STREET_W, urn:schemas:contacts:mailingstreet"
-"0x3A2A";"PidTagPostalCode";"Contains the postal code for the mail user's postal address.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.18";"PR_POSTAL_CODE, PR_POSTAL_CODE_A, PR_POSTAL_CODE_W, PR_BUSINESS_ADDRESS_POSTAL_CODE, PR_BUSINESS_ADDRESS_POSTAL_CODE_A, PR_BUSINESS_ADDRESS_POSTAL_CODE_W, urn:schemas:contacts:mailingpostalcode"
-"0x3A2B";"PidTagPostOfficeBox";"Contains the number or identifier of the mail user's post office box.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.15";"PR_POST_OFFICE_BOX, PR_POST_OFFICE_BOX_A, PR_POST_OFFICE_BOX_W, PR_BUSINESS_ADDRESS_POST_OFFICE_BOX, PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_A, PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_W, urn:schemas:contacts:mailingpostofficebox"
-"0x3A2C";"PidTagTelexNumber";"Contains the mail user's telex number. This property is returned from an NSPI server as a PtypMultipleBinary. Otherwise, the data type is PtypString.";"PtypString, 0x001F; PtypMultipleBinary, 0x1102";"MapiMailUser";"[MS-OXOABK] section 2.2.4.30";"PR_TELEX_NUMBER, PR_TELEX_NUMBER_A, PR_TELEX_NUMBER_W, urn:schemas:contacts:telexnumber"
-"0x3A2D";"PidTagIsdnNumber";"Contains the Integrated Services Digital Network (ISDN) telephone number of the mail user.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.4.16";"PR_ISDN_NUMBER, PR_ISDN_NUMBER_A, PR_ISDN_NUMBER_W, urn:schemas:contacts:internationalisdnnumber"
-"0x3A2E";"PidTagAssistantTelephoneNumber";"Contains the telephone number of the mail user's administrative assistant.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.4.31";"PR_ASSISTANT_TELEPHONE_NUMBER, PR_ASSISTANT_TELEPHONE_NUMBER_A, PR_ASSISTANT_TELEPHONE_NUMBER_W, urn:schemas:contacts:secretaryphone"
-"0x3A2F";"PidTagHome2TelephoneNumber";"Contains a secondary telephone number at the mail user's home.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.25";"PR_HOME2_TELEPHONE_NUMBER, PR_HOME2_TELEPHONE_NUMBER_A, PR_HOME2_TELEPHONE_NUMBER_W, urn:schemas:contacts:homephone2"
-"0x3A2F";"PidTagHome2TelephoneNumbers";"Contains secondary telephone numbers at the mail user's home.";"PtypMultipleString, 0x101F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.26";"PR_HOME2_TELEPHONE_NUMBER_A_MV"
-"0x3A30";"PidTagAssistant";"Contains the name of the mail user's administrative assistant.";"PtypString, 0x001F";"Address Properties";"[MS-OXOABK] section 2.2.4.8";"PR_ASSISTANT, PR_ASSISTANT_A, PR_ASSISTANT_W, urn:schemas:contacts:secretarycn"
-"0x3A40";"PidTagSendRichInfo";"Indicates whether the email-enabled entity represented by the Address Book object can receive all message content, including Rich Text Format (RTF) and other embedded objects.";"PtypBoolean, 0x000B";"Address Properties";"[MS-OXOABK] section 2.2.3.18";"PR_SEND_RICH_INFO, ptagSendRichInfo"
-"0x3A41";"PidTagWeddingAnniversary";"Contains the date of the mail user's wedding anniversary. ";"PtypTime, 0x0040";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.5.4";"PR_WEDDING_ANNIVERSARY, urn:schemas:contacts:weddinganniversary"
-"0x3A42";"PidTagBirthday";"Contains the date of the mail user's birthday at midnight.";"PtypTime, 0x0040";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.5.1";"PR_BIRTHDAY, urn:schemas:contacts:bday"
-"0x3A43";"PidTagHobbies";"Contains the names of the mail user's hobbies.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.10.2";"PR_HOBBIES, PR_HOBBIES_A, PR_HOBBIES_W, urn:schemas:contacts:hobbies"
-"0x3A44";"PidTagMiddleName";"Specifies the middle name(s) of the contact.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.1.5";"PR_MIDDLE_NAME, PR_MIDDLE_NAME_A, PR_MIDDLE_NAME_W, urn:schemas:contacts:middlename"
-"0x3A45";"PidTagDisplayNamePrefix";"Contains the mail user's honorific title.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.1.3";"PR_DISPLAY_NAME_PREFIX, PR_DISPLAY_NAME_PREFIX_A, PR_DISPLAY_NAME_PREFIX_W, urn:schemas:contacts:personaltitle"
-"0x3A46";"PidTagProfession";"Contains the name of the mail user's line of business.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.6.9";"PR_PROFESSION, PR_PROFESSION_A, PR_PROFESSION_W, urn:schemas:contacts:profession"
-"0x3A47";"PidTagReferredByName";"Contains the name of the mail user's referral.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.10.21";"PR_REFERRED_BY_NAME, PR_REFERRED_BY_NAME_A, PR_REFERRED_BY_NAME_W"
-"0x3A48";"PidTagSpouseName";"Contains the name of the mail user's spouse/partner.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.10.3";"PR_SPOUSE_NAME, PR_SPOUSE_NAME_A, PR_SPOUSE_NAME_W, urn:schemas:contacts:spousecn"
-"0x3A49";"PidTagComputerNetworkName";"Contains the name of the mail user's computer network.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.10.16";"PR_COMPUTER_NETWORK_NAME, PR_COMPUTER_NETWORK_NAME_A, PR_COMPUTER_NETWORK_NAME_W, urn:schemas:contacts:computernetworkname"
-"0x3A4A";"PidTagCustomerId";"Contains the mail user's customer identification number.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.10.8";"PR_CUSTOMER_ID, PR_CUSTOMER_ID_A, PR_CUSTOMER_ID_W, urn:schemas:contacts:customerid"
-"0x3A4B";"PidTagTelecommunicationsDeviceForDeafTelephoneNumber";"Contains the mail user's telecommunication device for the deaf (TTY/TDD) telephone number.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.4.13 ";"PR_TTYTDD_PHONE_NUMBER, PR_TTYTDD_PHONE_NUMBER_A, PR_TTYTDD_PHONE_NUMBER_W, urn:schemas:contacts:ttytddphone"
-"0x3A4C";"PidTagFtpSite";"Contains the File Transfer Protocol (FTP) site address of the mail user.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.10.15";"PR_FTP_SITE, PR_FTP_SITE_A, PR_FTP_SITE_W, urn:schemas:contacts:ftpsite"
-"0x3A4D";"PidTagGender";"Contains a value that represents the mail user's gender.";"PtypInteger16, 0x0002";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.10.20";"PR_GENDER, urn:schemas:contacts:gender"
-"0x3A4E";"PidTagManagerName";"Contains the name of the mail user's manager.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.6.6";"PR_MANAGER_NAME, PR_MANAGER_NAME_A, PR_MANAGER_NAME_W, urn:schemas:contacts:manager"
-"0x3A4F";"PidTagNickname";"Contains the mail user's nickname.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.1.1";"PR_NICKNAME, PR_NICKNAME_A, PR_NICKNAME_W, urn:schemas:contacts:nickname"
-"0x3A50";"PidTagPersonalHomePage";"Contains the URL of the mail user's personal home page.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.10.13";"PR_PERSONAL_HOME_PAGE, PR_PERSONAL_HOME_PAGE_A, PR_PERSONAL_HOME_PAGE_W, urn:schemas:contacts:personalHomePage"
-"0x3A51";"PidTagBusinessHomePage";"Contains the URL of the mail user's business home page.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.10.14";"PR_BUSINESS_HOME_PAGE, PR_BUSINESS_HOME_PAGE_A, PR_BUSINESS_HOME_PAGE_W, urn:schemas:contacts:businesshomepageurn:schemas:contacts:businesshomepage"
-"0x3A57";"PidTagCompanyMainTelephoneNumber";"Contains the main telephone number of the mail user's company.";"PtypString, 0x001F";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.4.14";"PR_COMPANY_MAIN_PHONE_NUMBER, PR_COMPANY_MAIN_PHONE_NUMBER_A, PR_COMPANY_MAIN_PHONE_NUMBER_W, urn:schemas:contacts:organizationmainphone"
-"0x3A58";"PidTagChildrensNames";"Specifies the names of the children of the contact.";"PtypMultipleString, 0x101F";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.10.17";"PR_CHILDRENS_NAMES, PR_CHILDRENS_NAMES_A, PR_CHILDRENS_NAMES_W, urn:schemas:contacts:childrensnames"
-"0x3A59";"PidTagHomeAddressCity";"Contains the name of the mail user's home locality, such as the town or city.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.3.2";"PR_HOME_ADDRESS_CITY, PR_HOME_ADDRESS_CITY_A, PR_HOME_ADDRESS_CITY_W, urn:schemas:contacts:homeCity"
-"0x3A5A";"PidTagHomeAddressCountry";"Contains the name of the mail user's home country/region.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.3.5";"PR_HOME_ADDRESS_COUNTRY, PR_HOME_ADDRESS_COUNTRY_A, PR_HOME_ADDRESS_COUNTRY_W, urn:schemas:contacts:homeCountry"
-"0x3A5B";"PidTagHomeAddressPostalCode";"Contains the postal code for the mail user's home postal address.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.3.4";"PR_HOME_ADDRESS_POSTAL_CODE, PR_HOME_ADDRESS_POSTAL_CODE_A, PR_HOME_ADDRESS_POSTAL_CODE_W, urn:schemas:contacts:homePostalCode"
-"0x3A5C";"PidTagHomeAddressStateOrProvince";"Contains the name of the mail user's home state or province.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.3.3";"PR_HOME_ADDRESS_STATE_OR_PROVINCE, PR_HOME_ADDRESS_STATE_OR_PROVINCE_A, PR_HOME_ADDRESS_STATE_OR_PROVINCE_W, urn:schemas:contacts:homeState"
-"0x3A5D";"PidTagHomeAddressStreet";"Contains the mail user's home street address.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOABK] section 2.2.4.20";"PR_HOME_ADDRESS_STREET, PR_HOME_ADDRESS_STREET_A, PR_HOME_ADDRESS_STREET_W, urn:schemas:contacts:homeStreet"
-"0x3A5E";"PidTagHomeAddressPostOfficeBox";"Contains the number or identifier of the mail user's home post office box.";"PtypString, 0x001F";"MapiMailUser";"[MS-OXOCNTC] section 2.2.1.3.7";"PR_HOME_ADDRESS_POST_OFFICE_BOX, PR_HOME_ADDRESS_POST_OFFICE_BOX_A, PR_HOME_ADDRESS_POST_OFFICE_BOX_W, urn:schemas:contacts:homepostofficebox"
-"0x3A5F";"PidTagOtherAddressCity";"Contains the name of the mail user's other locality, such as the town or city.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.3.2";"PR_OTHER_ADDRESS_CITY, PR_OTHER_ADDRESS_CITY_A, PR_OTHER_ADDRESS_CITY_W, urn:schemas:contacts:othercity"
-"0x3A60";"PidTagOtherAddressCountry";"Contains the name of the mail user's other country/region.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.3.5";"PR_OTHER_ADDRESS_COUNTRY, PR_OTHER_ADDRESS_COUNTRY_A, PR_OTHER_ADDRESS_COUNTRY_W, urn:schemas:contacts:othercountry"
-"0x3A61";"PidTagOtherAddressPostalCode";"Contains the postal code for the mail user's other postal address.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.3.4";"PR_OTHER_ADDRESS_POSTAL_CODE, PR_OTHER_ADDRESS_POSTAL_CODE_A, PR_OTHER_ADDRESS_POSTAL_CODE_W, urn:schemas:contacts:otherpostalcode"
-"0x3A62";"PidTagOtherAddressStateOrProvince";"Contains the name of the mail user's other state or province.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.3.3";"PR_OTHER_ADDRESS_STATE_OR_PROVINCE, PR_OTHER_ADDRESS_STATE_OR_PROVINCE_A, PR_OTHER_ADDRESS_STATE_OR_PROVINCE_W, urn:schemas:contacts:otherstate"
-"0x3A63";"PidTagOtherAddressStreet";"Contains the mail user's other street address.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.3.1";"PR_OTHER_ADDRESS_STREET, PR_OTHER_ADDRESS_STREET_A, PR_OTHER_ADDRESS_STREET_W, urn:schemas:contacts:otherstreet"
-"0x3A64";"PidTagOtherAddressPostOfficeBox";"Contains the number or identifier of the mail user's other post office box.";"PtypString, 0x001F";"Address Properties";"[MS-OXOCNTC] section 2.2.1.3.7";"PR_OTHER_ADDRESS_POST_OFFICE_BOX, PR_OTHER_ADDRESS_POST_OFFICE_BOX_A, PR_OTHER_ADDRESS_POST_OFFICE_BOX_W, urn:schemas:contacts:otherpostofficebox"
-"0x3A70";"PidTagUserX509Certificate";"Contains a list of certificates for the mail user.";"PtypMultipleBinary, 0x1102";"MapiMailUser";"[MS-OXOABK] section 2.2.4.36";"PR_USER_X509_CERTIFICATE"
-"0x3A71";"PidTagSendInternetEncoding";"Contains a bitmask of message encoding preferences for email sent to an email-enabled entity that is represented by this Address Book object.";"PtypInteger32, 0x0003";"Address Properties";"[MS-OXOABK] section 2.2.3.19";"PR_SEND_INTERNET_ENCODING, ptagSendInternetEncoding"
-"0x3F08";"PidTagInitialDetailsPane";"Indicates which page of a display template to display first.";"PtypInteger32, 0x0003";"MAPI Display Tables";"[MS-OXOABK] section 2.2.3.33";"PR_INITIAL_DETAILS_PANE"
-"0x3FDE";"PidTagInternetCodepage";"Indicates the code page used for the PidTagBody property (section 2.618) or the PidTagBodyHtml property (section 2.621).";"PtypInteger32, 0x0003";"Miscellaneous Properties";"[MS-OXCMSG] section 2.2.1.56.6";"PR_INTERNET_CPID, ptagInternetCpid"
-"0x3FDF";"PidTagAutoResponseSuppress";"Specifies whether a client or server application will forego sending automated replies in response to this message.";"PtypInteger32, 0x0003";"Email";"[MS-OXOMSG] section 2.2.1.77";"PR_AUTO_RESPONSE_SUPPRESS, ptagAutoResponseSuppress"
-"0x3FE0";"PidTagAccessControlListData";"Contains a permissions list for a folder.";"PtypBinary, 0x0102";"Access Control Properties";"[MS-OXCPERM] section 2.2.3";"PR_ACL_DATA, ptagACLData"
-"0x3FE3";"PidTagDelegatedByRule";"Specifies whether the message was forwarded due to the triggering of a delegate forward rule.";"PtypBoolean, 0x000B";"MapiStatus";"[MS-OXOMSG] section 2.2.1.84";"PR_DELEGATED_BY_RULE"
-"0x3FE7";"PidTagResolveMethod";"Specifies how to resolve any conflicts with the message.";"PtypInteger32, 0x0003";"MapiStatus";"[MS-OXCFXICS] section 2.2.1.4.1";"PR_RESOLVE_METHOD, ptagResolveMethod"
-"0x3FEA";"PidTagHasDeferredActionMessages";"Indicates whether a Message object has a deferred action message associated with it.";"PtypBoolean, 0x000B";"Rules";"[MS-OXORULE] section 2.2.9.1";"PR_HAS_DAMS, ptagHasDAMs"
-"0x3FEB";"PidTagDeferredSendNumber";"Contains a number used in the calculation of how long to defer sending a message.";"PtypInteger32, 0x0003";"MapiStatus";"[MS-OXOMSG] section 2.2.3.2";"PR_DEFERRED_SEND_NUMBER"
-"0x3FEC";"PidTagDeferredSendUnits";"Specifies the unit of time used as a multiplier with the PidTagDeferredSendNumber property (section 2.663) value.";"PtypInteger32, 0x0003";"MapiStatus";"[MS-OXOMSG] section 2.2.3.3";"PR_DEFERRED_SEND_UNITS"
-"0x3FED";"PidTagExpiryNumber";"Contains an integer value that is used along with the PidTagExpiryUnits property (section 2.690) to define the expiry send time.";"PtypInteger32, 0x0003";"MapiStatus";"[MS-OXOMSG] section 2.2.3.5";"PR_EXPIRY_NUMBER"
-"0x3FEE";"PidTagExpiryUnits";"Contains the unit of time that the value of the PidTagExpiryNumber property (section 2.688) multiplies.";"PtypInteger32, 0x0003";"MapiStatus";"[MS-OXOMSG] section 2.2.3.6";"PR_EXPIRY_UNITS"
-"0x3FEF";"PidTagDeferredSendTime";"Contains the amount of time after which a client would like to defer sending the message.";"PtypTime, 0x0040";"MapiStatus";"[MS-OXOMSG] section 2.2.3.4";"PR_DEFERRED_SEND_TIME, ptagDeferredSendTime"
-"0x3FF0";"PidTagConflictEntryId";"Contains the EntryID of the conflict resolve message.";"PtypBinary, 0x0102";"ICS";"[MS-OXCFXICS] section 2.2.1.4.2";"PR_CONFLICT_ENTRYID, ptagConflictEntryId"
-"0x3FF1";"PidTagMessageLocaleId";"Contains the Windows Locale ID of the end-user who created this message. ";"PtypInteger32, 0x0003";"Miscellaneous Properties";"[MS-OXCMSG] section 2.2.1.5";"PR_MESSAGE_LOCALE_ID"
-"0x3FF8";"PidTagCreatorName";"Contains the name of the creator of a Message object.";"PtypString, 0x001F";"General Message Properties";"[MS-OXCMSG] section 2.2.1.51";"PR_CREATOR_NAME, PR_CREATOR_NAME_A, ptagCreatorName, PR_CREATOR_NAME_W"
-"0x3FF9";"PidTagCreatorEntryId";"Specifies the original author of the message according to their Address Book EntryID.";"PtypBinary, 0x0102";"ID Properties";"[MS-OXCMSG] section 2.2.1.31";"PR_CREATOR_ENTRYID, ptagCreatorEntryId"
-"0x3FFA";"PidTagLastModifierName";"Contains the name of the last mail user to change the Message object.";"PtypString, 0x001F";"History Properties";"[MS-OXCPRPT] section 2.2.1.5";"PR_LAST_MODIFIER_NAME, PR_LAST_MODIFIER_NAME_A, ptagLastModifierName, PR_LAST_MODIFIER_NAME_W"
-"0x3FFB";"PidTagLastModifierEntryId";"Specifies the Address Book EntryID of the last user to modify the contents of the message.";"PtypBinary, 0x0102";"History Properties";"[MS-OXCMSG] section 2.2.1.32";"PR_LAST_MODIFIER_ENTRYID, ptagLastModifierEntryId"
-"0x3FFD";"PidTagMessageCodepage";"Specifies the code page used to encode the non-Unicode string properties on this Message object.";"PtypInteger32, 0x0003";"Common";"[MS-OXCMSG] section 2.2.1.4";"PR_MESSAGE_CODEPAGE"
-"0x401A";"PidTagSentRepresentingFlags";"Description:";"PtypInteger32, 0x0003";"Miscellaneous Properties";;"ptagSentRepresentingFlags"
-"0x4029";"PidTagReadReceiptAddressType";"Contains the address type of the end user to whom a read receipt is directed.";"PtypString, 0x001F";"Transport Envelope";"[MS-OXOMSG] section 2.2.2.24";"ptagReadReceiptAddrType, ReadReceiptAddrType"
-"0x402A";"PidTagReadReceiptEmailAddress";"Contains the email address of the end user to whom a read receipt is directed.";"PtypString, 0x001F";"Transport Envelope";"[MS-OXOMSG] section 2.2.2.25";"ptagReadReceiptEmailAddr, ReadReceiptEmailAddress"
-"0x402B";"PidTagReadReceiptName";"Contains the display name for the end user to whom a read receipt is directed.";"PtypString, 0x001F";"Transport Envelope";"[MS-OXOMSG] section 2.2.2.27";"ptagReadReceiptDisplayName, ReadReceiptDisplayName"
-"0x4076";"PidTagContentFilterSpamConfidenceLevel";"Indicates a confidence level that the message is spam.";"PtypInteger32, 0x0003";"Secure Messaging Properties";"[MS-OXCSPAM] section 2.2.1.3";"PR_CONTENT_FILTER_SCL, ptagContentFilterSCL"
-"0x4079";"PidTagSenderIdStatus";"Reports the results of a Sender-ID check.";"PtypInteger32, 0x0003";"Secure Messaging Properties";"[MS-OXOMSG] section 2.2.1.80";"PR_SENDER_ID_STATUS"
-"0x4082";"PidTagHierRev";"Specifies the time, in UTC, to trigger the client in cached mode to synchronize the folder hierarchy.";"PtypTime, 0x0040";"TransportEnvelope";"[MS-OXCFOLD] section 2.2.2.2.1.9";"PR_HIER_REV, ptagHierRev"
-"0x4083";"PidTagPurportedSenderDomain";"Contains the domain responsible for transmitting the current message.";"PtypString, 0x001F";"TransportEnvelope";"[MS-OXCMSG] section 2.2.1.43";"PR_PURPORTED_SENDER_DOMAIN"
-"0x5902";"PidTagInternetMailOverrideFormat";"Indicates the encoding method and HTML inclusion for attachments.";"PtypInteger32, 0x0003";"MIME Properties";"[MS-OXOMSG] section 2.2.1.11";"PR_INETMAIL_OVERRIDE_FORMAT, ptagInetMailOverrideFormat"
-"0x5909";"PidTagMessageEditorFormat";"Specifies the format that an email editor can use for editing the message body.";"PtypInteger32, 0x0003";"Miscellaneous Properties";"[MS-OXOMSG] section 2.2.1.78";"PR_MSG_EDITOR_FORMAT, ptagMsgEditorFormat"
-"0x5D01";"PidTagSenderSmtpAddress";"Contains the SMTP email address format of the eƒ??mail address of the sending mailbox owner.";"PtypString, 0x001F";"Mail";"[MS-OXOMSG] section 2.2.1.55 ";"SenderSmtpAddress, ptagSenderSmtpAddress"
-"0x5D02";"PidTagSentRepresentingSmtpAddress";"Contains the SMTP email address of the end user who is represented by the sending mailbox owner.";"PtypString, 0x001F";"Mail";"[MS-OXOMSG] section 2.2.1.59";"ptagRecipientSentRepresentingSMTPAddress, SentRepresentingSMTPAddressXSO, PR_SENT_REPRESENTING_SMTP_ADDRESS"
-"0x5D05";"PidTagReadReceiptSmtpAddress";"Contains the SMTP email address of the user to whom a read receipt is directed.";"PtypString, 0x001F";"Mail";"[MS-OXOMSG] section 2.2.1.30";"ptagRecipientReadReceiptSmtpAddress"
-"0x5D07";"PidTagReceivedBySmtpAddress";"Contains the email message receiver's SMTP email address.";"PtypString, 0x001F";"Mail";"[MS-OXOMSG] section 2.2.1.41";"ptagRecipientRcvdBySmtpAddress"
-"0x5D08";"PidTagReceivedRepresentingSmtpAddress";"Contains the SMTP email address of the user represented by the receiving mailbox owner.";"PtypString, 0x001F";"Mail";"[MS-OXOMSG] section 2.2.1.28";"ptagRecipientRcvdRepresentingSmtpAddress"
-"0x5FDF";"PidTagRecipientOrder";"Specifies the location of the current recipient in the recipient table.";"PtypInteger32, 0x0003";"TransportRecipient";"[MS-OXCMSG] section 2.2.1.40";"PR_RECIPIENT_ORDER, ptagRecipientOrder"
-"0x5FE1";"PidTagRecipientProposed";"Indicates that the attendee proposed a new date and/or time.";"PtypBoolean, 0x000B";"TransportRecipient";"[MS-OXOCAL] section 2.2.4.10.4";"PR_RECIPIENT_PROPOSED, ptagRecipientProposed"
-"0x5FE3";"PidTagRecipientProposedStartTime";"Indicates the meeting start time requested by the attendee in a counter proposal.";"PtypTime, 0x0040";"TransportRecipient";"[MS-OXOCAL] section 2.2.4.10.5";"PR_RECIPIENT_PROPOSEDSTARTTIME, ptagRecipientProposedStartTime"
-"0x5FE4";"PidTagRecipientProposedEndTime";"Indicates the meeting end time requested by the attendee in a counter proposal.";"PtypTime, 0x0040";"TransportRecipient";"[MS-OXOCAL] section 2.2.4.10.6";"PR_RECIPIENT_PROPOSEDENDTIME, ptagRecipientProposedEndTime"
-"0x5FF6";"PidTagRecipientDisplayName";"Specifies the display name of the recipient.";"PtypString, 0x001F";"TransportRecipient";"[MS-OXCMSG] section 2.2.1.54";"PR_RECIPIENT_DISPLAY_NAME, PR_RECIPIENT_DISPLAY_NAME_W"
-"0x5FF7";"PidTagRecipientEntryId";"Identifies an Address Book object that specifies the recipient.";"PtypBinary, 0x0102";"ID Properties";"[MS-OXCMSG] section 2.2.1.55";"PR_RECIPIENT_ENTRYID, ptagRecipientEntryId"
-"0x5FFB";"PidTagRecipientTrackStatusTime";"Indicates the date and time at which the attendee responded.";"PtypTime, 0x0040";"TransportRecipient";"[MS-OXOCAL] section 2.2.4.10.3";"PR_RECIPIENT_TRACKSTATUS_TIME, ptagRecipientTrackStatusTime"
-"0x5FFD";"PidTagRecipientFlags";"Specifies a bit field that describes the recipient status.";"PtypInteger32, 0x0003";"TransportRecipient";"[MS-OXOCAL] section 2.2.4.10.1";"PR_RECIPIENT_FLAGS"
-"0x5FFF";"PidTagRecipientTrackStatus";"Indicates the response status that is returned by the attendee.";"PtypInteger32, 0x0003";"TransportRecipient";"[MS-OXOCAL] section 2.2.4.10.2";"PR_RECIPIENT_TRACKSTATUS, ptagRecipientTrackStatus"
-"0x6100";"PidTagJunkIncludeContacts";"Indicates whether email addresses of the contacts in the Contacts folder are treated in a special way with respect to the spam filter.";"PtypInteger32, 0x0003";"Spam";"[MS-OXCSPAM] section 2.2.2.2";"PR_JUNK_INCLUDE_CONTACTS"
-"0x6101";"PidTagJunkThreshold";"Indicates how aggressively incoming email is to be sent to the Junk Email folder.";"PtypInteger32, 0x0003";"Spam";"[MS-OXCSPAM] section 2.2.2.5";"PR_JUNK_THRESHOLD"
-"0x6102";"PidTagJunkPermanentlyDelete";"Indicates whether messages identified as spam can be permanently deleted.";"PtypInteger32, 0x0003";"Spam";"[MS-OXCSPAM] section 2.2.2.3";"PR_JUNK_PERMANENTLY_DELETE"
-"0x6103";"PidTagJunkAddRecipientsToSafeSendersList";"Indicates whether email recipients are to be added to the safe senders list.";"PtypInteger32, 0x0003";"Spam";"[MS-OXCSPAM] section 2.2.2.1";"PR_JUNK_ADD_RECIPS_TO_SSL"
-"0x6107";"PidTagJunkPhishingEnableLinks";"Indicated whether the phishing stamp on a message is to be ignored.";"PtypBoolean, 0x000B";"Spam";"[MS-OXCSPAM] section 2.2.2.4";"PR_JUNK_PHISHING_ENABLE_LINKS"
-"0x64F0";"PidTagMimeSkeleton";"Contains the top-level MIME message headers, all MIME message body part headers, and body part content that is not already converted to Message object properties, including attachments. ";"PtypBinary, 0x0102";"MIME properties";"[MS-OXCMSG] section 2.2.1.28";"ptagMimeSkeleton"
-"0x65C2";"PidTagReplyTemplateId";"Contains the value of the GUID that points to a Reply template.";"PtypBinary, 0x0102";"Rules";"[MS-OXORULE] section 2.2.9.2";"PR_REPLY_TEMPLATE_ID, ptagReplyTemplateId"
-"0x65E0";"PidTagSourceKey";"Contains a value that contains an internal global identifier (GID) for this folder or message.";"PtypBinary, 0x0102";"Sync";"[MS-OXCFXICS] section 2.2.1.2.5";"PR_SOURCE_KEY"
-"0x65E1";"PidTagParentSourceKey";"Contains a value on a folder that contains the PidTagSourceKey property (section 2.1022) of the parent folder.";"PtypBinary, 0x0102";"ExchangeNonTransmittableReserved";"[MS-OXCFXICS] section 2.2.1.2.6";"PR_PARENT_SOURCE_KEY"
-"0x65E2";"PidTagChangeKey";"Contains a structure that identifies the last change to the object.";"PtypBinary, 0x0102";"History Properties";"[MS-OXCFXICS] section 2.2.1.2.7";"PR_CHANGE_KEY"
-"0x65E3";"PidTagPredecessorChangeList";"Contains a value that contains a serialized representation of a PredecessorChangeList structure.";"PtypBinary, 0x0102";"Sync";"[MS-OXCFXICS] section 2.2.1.2.8";"PR_PREDECESSOR_CHANGE_LIST"
-"0x65E9";"PidTagRuleMessageState";"Contains flags that specify the state of the rule. Set on the FAI message.";"PtypInteger32, 0x0003";"ExchangeNonTransmittableReserved";"[MS-OXORULE] section 2.2.4.1.4";"PR_RULE_MSG_STATE, ptagRuleMsgState"
-"0x65EA";"PidTagRuleMessageUserFlags";"Contains an opaque property that the client sets for the exclusive use of the client. Set on the FAI message.";"PtypInteger32, 0x0003";"ExchangeNonTransmittableReserved";"[MS-OXORULE] section 2.2.4.1.5";"PR_RULE_MSG_USER_FLAGS, ptagRuleMsgUserFlags"
-"0x65EB";"PidTagRuleMessageProvider";"Identifies the client application that owns the rule. Set on the FAI message.";"PtypString, 0x001F";"ExchangeNonTransmittableReserved";"[MS-OXORULE] section 2.2.4.1.7";"ptagRuleMsgProvider"
-"0x65EC";"PidTagRuleMessageName";"Specifies the name of the rule. Set on the FAI message.";"PtypString, 0x001F";"ExchangeNonTransmittableReserved";"[MS-OXORULE] section 2.2.4.1.1";"ptagRuleMsgName"
-"0x65ED";"PidTagRuleMessageLevel";"Contains 0x00000000. Set on the FAI message.";"PtypInteger32, 0x0003";"ExchangeNonTransmittableReserved";"[MS-OXORULE] section 2.2.4.1.6";"PR_RULE_MSG_LEVEL, ptagRuleMsgLevel"
-"0x65EE";"PidTagRuleMessageProviderData";"Contains opaque data set by the client for the exclusive use of the client. Set on the FAI message.";"PtypBinary, 0x0102";"ExchangeNonTransmittableReserved";"[MS-OXORULE] section 2.2.4.1.8";"PR_RULE_MSG_PROVIDER_DATA, ptagRuleMsgProviderData"
-"0x65F3";"PidTagRuleMessageSequence";"Contains a value used to determine the order in which rules are evaluated and executed. Set on the FAI message.";"PtypInteger32, 0x0003";"ExchangeNonTransmittableReserved";"[MS-OXORULE] section 2.2.4.1.3";"PR_RULE_MSG_SEQUENCE, ptagRuleMsgSequence"
-"0x6619";"PidTagUserEntryId";"Address book EntryID of the user logged on to the public folders.";"PtypBinary, 0x0102";"ExchangeMessageStore";"[MS-OXCSTOR] section 2.2.2.1";"PR_USER_ENTRYID, ptagUserEntryId"
-"0x661B";"PidTagMailboxOwnerEntryId";"Contains the EntryID in the Global Address List (GAL) of the owner of the mailbox.";"PtypBinary, 0x0102";"Message Store Properties";"[MS-OXCSTOR] section 2.2.2.1.1.7";"PR_MAILBOX_OWNER_ENTRYID, ptagMailboxOwnerEntryId"
-"0x661C";"PidTagMailboxOwnerName";"Contains the display name of the owner of the mailbox.";"PtypString, 0x001F";"Message Store Properties";"[MS-OXCSTOR] section 2.2.2.1.1.8";"PR_MAILBOX_OWNER_NAME, PR_MAILBOX_OWNER_NAME_A, ptagMailboxOwnerName, PR_MAILBOX_OWNER_NAME_W"
-"0x661D";"PidTagOutOfOfficeState";"Indicates whether the user is OOF.";"PtypBoolean, 0x000B";"Message Store Properties";"[MS-OXCSTOR] section 2.2.2.1.2.4";"PR_OOF_STATE, ptagOOFState"
-"0x6622";"PidTagSchedulePlusFreeBusyEntryId";"Contains the EntryID of the folder named ""SCHEDULE+ FREE BUSY"" under the non-IPM subtree of the public folder message store. ";"PtypBinary, 0x0102";"ExchangeMessageStore";"[MS-OXOPFFB] section 2.2.2.2";"PR_SPLUS_FREE_BUSY_ENTRYID"
-"0x6638";"PidTagSerializedReplidGuidMap";"Contains a serialized list of REPLID and REPLGUID pairs which represent all or part of the REPLID / REPLGUID mapping of the associated Logon object.";"PtypBinary, 0x0102";"Logon Properties";"[MS-OXCSTOR] section 2.2.2.1.1.13";"ptagSerializedReplidGuidMap"
-"0x6639";"PidTagRights";"Specifies a user's folder permissions.";"PtypInteger32, 0x0003";"ExchangeFolder";"[MS-OXCFOLD] section 2.2.2.2.2.8";"PR_RIGHTS, ptagRights"
-"0x663A";"PidTagHasRules";"Indicates whether a Folder object has rules.";"PtypBoolean, 0x000B";"ExchangeFolder";"[MS-OXORULE] section 2.2.8.1";"PR_HAS_RULES, ptagHasRules"
-"0x663B";"PidTagAddressBookEntryId";"Contains the name-service EntryID of a directory object that refers to a public folder.";"PtypBinary, 0x0102";"Address Book";"[MS-OXCFOLD] section 2.2.2.2.1.4";"PR_ADDRESS_BOOK_ENTRYID, ptagAddressBookEntryId"
-"0x663E";"PidTagHierarchyChangeNumber";"Contains a number that monotonically increases every time a subfolder is added to, or deleted from, this folder.";"PtypInteger32, 0x0003";"ExchangeFolder";"[MS-OXCFOLD] section 2.2.2.2.1.8";"PR_HIERARCHY_CHANGE_NUM"
-"0x6645";"PidTagClientActions";"Specifies the actions the client is required to take on the message.";"PtypBinary, 0x0102";"Server-side Rules Properties";"[MS-OXORULE] section 2.2.6.6";"PR_CLIENT_ACTIONS, ptagClientActions"
-"0x6646";"PidTagDamOriginalEntryId";"Contains the EntryID of the delivered message that the client has to process.";"PtypBinary, 0x0102";"Server-side Rules Properties";"[MS-OXORULE] section 2.2.6.3";"PR_DAM_ORIGINAL_ENTRYID"
-"0x6647";"PidTagDamBackPatched";"Indicates whether the Deferred Action Message (DAM) was updated by the server.";"PtypBoolean, 0x000B";"Server-side Rules Properties";"[MS-OXORULE] section 2.2.6.2";"PR_DAM_BACK_PATCHED, ptagDamBackPatched"
-"0x6648";"PidTagRuleError";"Contains the error code that indicates the cause of an error encountered during the execution of the rule.";"PtypInteger32, 0x0003";"ExchangeMessageReadOnly";"[MS-OXORULE] section 2.2.7.2";"PR_RULE_ERROR, ptagRuleError"
-"0x6649";"PidTagRuleActionType";"Contains the ActionType field ([MS-OXORULE] section 2.2.5.1) of a rule that failed.";"PtypInteger32, 0x0003";"ExchangeMessageReadOnly";"[MS-OXORULE] section 2.2.7.3";"PR_RULE_ACTION_TYPE, ptagRuleActionType"
-"0x664A";"PidTagHasNamedProperties";"Indicates whether the Message object has a named property.";"PtypBoolean, 0x000B";"ExchangeMessageReadOnly";"[MS-OXCMSG] section 2.2.1.39";"PR_HAS_NAMED_PROPERTIES, ptagHasNamedProperties"
-"0x6650";"PidTagRuleActionNumber";"Contains the index of a rule action that failed.";"PtypInteger32, 0x0003";"ExchangeMessageReadOnly";"[MS-OXORULE] section 2.2.7.4";"PR_RULE_ACTION_NUMBER, ptagRuleActionNumber"
-"0x6651";"PidTagRuleFolderEntryId";"Contains the EntryID of the folder where the rule that triggered the generation of a DAM is stored.";"PtypBinary, 0x0102";"ExchangeMessageReadOnly";"[MS-OXORULE] section 2.2.6.5";"PR_RULE_FOLDER_ENTRYID, ptagRuleFolderEntryId"
-"0x666A";"PidTagProhibitReceiveQuota";"Maximum size, in kilobytes, that a user is allowed to accumulate in their mailbox before no further email will be delivered to their mailbox.";"PtypInteger32, 0x0003";"Exchange Administrative";"[MS-OXCSTOR] section 2.2.2.1.1.3";"PR_PROHIBIT_RECEIVE_QUOTA, ptagProhibitReceiveQuota"
-"0x666C";"PidTagInConflict";"Specifies whether the attachment represents an alternate replica.";"PtypBoolean, 0x000B";"Conflict Note";"[MS-OXCFXICS] section 2.2.1.4.3";"PR_IN_CONFLICT, ptagInConflict"
-"0x666D";"PidTagMaximumSubmitMessageSize";"Maximum size, in kilobytes, of a message that a user is allowed to submit for transmission to another user.";"PtypInteger32, 0x0003";"Message Store Properties";"[MS-OXCSTOR] section 2.2.2.1.1.2";"PR_MAX_SUBMIT_MESSAGE_SIZE"
-"0x666E";"PidTagProhibitSendQuota";"Maximum size, in kilobytes, that a user is allowed to accumulate in their mailbox before the user can no longer send any more email.";"PtypInteger32, 0x0003";"ExchangeAdministrative";"[MS-OXCSTOR] section 2.2.2.1.1.4";"PR_PROHIBIT_SEND_QUOTA, ptagProhibitSendQuota"
-"0x6671";"PidTagMemberId";"Contains a unique identifier that the messaging server generates for each user.";"PtypInteger64, 0x0014";"Access Control Properties";"[MS-OXCPERM] section 2.2.5";"PR_MEMBER_ID, ptagMemberId"
-"0x6672";"PidTagMemberName";"Contains the user-readable name of the user.";"PtypString, 0x001F";"Access Control Properties";"[MS-OXCPERM] section 2.2.6";"PR_MEMBER_NAME, PR_MEMBER_NAME_A, ptagMemberName, PR_MEMBER_NAME_W"
-"0x6673";"PidTagMemberRights";"Contains the permissions for the specified user.";"PtypInteger32, 0x0003";"Access Control Properties";"[MS-OXCPERM] section 2.2.7";"PR_MEMBER_RIGHTS, ptagMemberRights"
-"0x6674";"PidTagRuleId";"Specifies a unique identifier that is generated by the messaging server for each rule when the rule is first created. ";"PtypInteger64, 0x0014";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.1";"PR_RULE_ID, ptagRuleId"
-"0x6675";"PidTagRuleIds";"Contains a buffer that is obtained by concatenating the PidTagRuleId property (section 2.949) values from all of the rules contributing actions that are contained in the PidTagClientActions property (section 2.634). ";"PtypBinary, 0x0102";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.6.7";"PR_RULE_IDS, ptagRuleIds"
-"0x6676 ";"PidTagRuleSequence";"Contains a value used to determine the order in which rules are evaluated and executed. ";"PtypInteger32, 0x0003";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.2";"PR_RULE_SEQUENCE, ptagRuleSequence"
-"0x6677";"PidTagRuleState";"Contains flags that specify the state of the rule. ";"PtypInteger32, 0x0003";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.3";"PR_RULE_STATE, ptagRuleState"
-"0x6678";"PidTagRuleUserFlags";"Contains an opaque property that the client sets for the exclusive use of the client. ";"PtypInteger32, 0x0003";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.7";"PR_RULE_USER_FLAGS, ptagRuleUserFlags"
-"0x6679";"PidTagRuleCondition";"Defines the conditions under which a rule action is to be executed.";"PtypRestriction, 0x00FD";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.9";"PR_RULE_CONDITION, ptagRuleCondition"
-"0x6680";"PidTagRuleActions";"Contains the set of actions associated with the rule.";"PtypRuleAction, 0x00FE";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.10";"PR_RULE_ACTIONS, ptagRuleActions"
-"0x6681";"PidTagRuleProvider";"A string identifying the client application that owns a rule. ";"PtypString, 0x001F";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.5";"PR_RULE_PROVIDER, ptagRuleProvider, PR_RULE_PROVIDER_W"
-"0x6682";"PidTagRuleName";"Specifies the name of the rule.";"PtypString, 0x001F";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.4";"PR_RULE_NAME, PR_RULE_NAME_A, ptagRuleName, PR_RULE_NAME_W"
-"0x6683";"PidTagRuleLevel";"Contains 0x00000000. This property is not used.";"PtypInteger32, 0x0003";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.6";"PR_RULE_LEVEL, ptagRuleLevel"
-"0x6684";"PidTagRuleProviderData";"Contains opaque data set by the client for the exclusive use of the client. ";"PtypBinary, 0x0102";"Server-Side Rules Properties";"[MS-OXORULE] section 2.2.1.3.1.8";"PR_RULE_PROVIDER_DATA, ptagRuleProviderData"
-"0x668F";"PidTagDeletedOn";"Specifies the time, in UTC, when the item or folder was soft deleted.";"PtypTime, 0x0040";"ExchangeFolder ";"[MS-OXCFOLD] section 2.2.2.2.1.3";"PR_DELETED_ON, ptagDeletedOn, urn:schemas:httpmail:deletedon"
-"0x66A1";"PidTagLocaleId";"Contains the Logon object LocaleID.";"PtypInteger32, 0x0003";"Miscellaneous Properties";"[MS-OXCSTOR] section 2.2.2.1.1.12";"PR_LOCALE_ID, ptagLocaleId"
-"0x66A8";"PidTagFolderFlags";"Contains a computed value to specify the type or state of a folder.";"PtypInteger32, 0x0003";"ExchangeAdministrative";"[MS-OXCFOLD] section 2.2.2.2.1.5";"PR_FOLDER_FLAGS"
-"0x66C3";"PidTagCodePageId";"Contains the identifier for the client code page used for Unicode to double-byte character set (DBCS) string conversion.";"PtypInteger32, 0x0003";"Exchange Profile Configuration";"[MS-OXCSTOR] section 2.2.2.1.1.15";"PR_CODE_PAGE_ID, ptagCodePageId"
-"0x6704";"PidTagAddressBookManageDistributionList";"Contains information for use in display templates for distribution lists.";"PtypObject, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.10.2";"PR_EMS_AB_MANAGE_DL"
-"0x6705";"PidTagSortLocaleId";"Contains the locale identifier.";"PtypInteger32, 0x0003";"ExchangeAdministrative";"[MS-OXCSTOR] section 2.2.2.1.1.14";"PR_SORT_LOCALE_ID, ptagSortLocaleId"
-"0x6709";"PidTagLocalCommitTime";"Specifies the time, in UTC, that a Message object or Folder object was last changed.";"PtypTime, 0x0040";"Server";"[MS-OXCMSG] section 2.2.1.49, [MS-OXCFOLD] section 2.2.2.2.1.13";"PR_LOCAL_COMMIT_TIME, ptagLocalCommitTime"
-"0x670A";"PidTagLocalCommitTimeMax";"Contains the time of the most recent message change within the folder container, excluding messages changed within subfolders.";"PtypTime, 0x0040";"Server";"[MS-OXCFOLD] section 2.2.2.2.1.14";"PR_LOCAL_COMMIT_TIME_MAX, ptagLocalCommitTimeMax "
-"0x670B";"PidTagDeletedCountTotal";"Contains the total count of messages that have been deleted from a folder, excluding messages deleted within subfolders.";"PtypInteger32, 0x0003";"Server ";"[MS-OXCFOLD] section 2.2.2.2.1.15";"PR_DELETED_COUNT_TOTAL, ptagDeleteCountTotal"
-"0x670E";"PidTagFlatUrlName";"Contains a unique identifier for an item across the message store.";"PtypString, 0x001F";"ExchangeAdministrative ";"[MS-XWDCAL] section 2.2.8.9";"PR_FLAT_URL_NAME, PR_FLAT_URL_NAME_A, PR_FLAT_URL_NAME_W, ptagFlatURLName, http://schemas.microsoft.com/exchange/permanenturl"
-"0x6740";"PidTagSentMailSvrEID";"Contains an EntryID that represents the Sent Items folder for the message.";"PtypServerId, 0x00FB";"ProviderDefinedNonTransmittable";"[MS-OXOMSG] section 2.2.3.10";"ptagSentMailSvrEID"
-"0x6741";"PidTagDeferredActionMessageOriginalEntryId";"Contains the server EntryID for the DAM.";"PtypServerId, 0x00FB";"Server-side Rules Properties";"[MS-OXORULE] section 2.2.6.8";"PR_DAM_ORIG_MSG_SVREID, ptagDamOrgMsgSvrEID"
-"0x6748";"PidTagFolderId";"Contains the Folder ID (FID) ([MS-OXCDATA] section 2.2.1.1) of the folder.";"PtypInteger64, 0x0014";"ID Properties";"[MS-OXCFOLD] section 2.2.2.2.1.6";"ptagFID"
-"0x6749";"PidTagParentFolderId";"Contains a value that contains the Folder ID (FID), as specified in [MS-OXCDATA] section 2.2.1.1, that identifies the parent folder of the messaging object being synchronized.";"PtypInteger64, 0x0014";"ID Properties";"[MS-OXCFXICS] section 2.2.1.2.4";"ptagParentFID"
-"0x674A";"PidTagMid";"Contains a value that contains the MID of the message currently being synchronized.";"PtypInteger64, 0x0014";"ID Properties ";"[MS-OXCFXICS] section 2.2.1.2.1";"ptagMID, http://schemas.microsoft.com/exchange/mid"
-"0x674D";"PidTagInstID";"Contains an identifier for all instances of a row in the table.";"PtypInteger64, 0x0014";"ProviderDefinedNonTransmittable";"[MS-OXCTABL] section 2.2.1.1";"ptagInstID"
-"0x674E";"PidTagInstanceNum";"Contains an identifier for a single instance of a row in the table.";"PtypInteger32, 0x0003";"ProviderDefinedNonTransmittable";"[MS-OXCTABL] section 2.2.1.2";"ptagInstanceNum"
-"0x674F";"PidTagAddressBookMessageId";"Contains the Short-term Message ID (MID) ([MS-OXCDATA] section 2.2.1.2) of the first message in the local site's offline address book public folder.";"PtypInteger64, 0x0014";"ProviderDefinedNonTransmittable";"[MS-OXCSTOR] section 2.2.2.2.2";"ptagAddrbookMID"
-"0x67A4";"PidTagChangeNumber";"Contains a structure that identifies the last change to the message or folder that is currently being synchronized.";"PtypInteger64, 0x0014";"Sync";"[MS-OXCFXICS] section 2.2.1.2.3";"ptagCn"
-"0x67AA";"PidTagAssociated";"Specifies whether the message being synchronized is an FAI message.";"PtypBoolean, 0x000B";"Sync";"[MS-OXCFXICS] section 2.2.1.5";"ptagAssociated"
-"0x6800";"PidTagOfflineAddressBookName";"Contains the display name of the address list.";"PtypString, 0x001F";"Offline Address Book Properties";"[MS-OXOAB] section 2.12.3";"PR_OAB_NAME, PR_OAB_NAME_W"
-"0x6801";"PidTagOfflineAddressBookSequence";"Contains the sequence number of the OAB. ";"PtypInteger32, 0x0003";"Offline Address Book Properties";"[MS-OXOAB] section 2.12.4";"PR_OAB_SEQUENCE"
-"0x6801";"PidTagVoiceMessageDuration";"Specifies the length of the attached audio message, in seconds.";"PtypInteger32, 0x0003";"Unified Messaging ";"[MS-OXOUM] section 2.2.5.3";"InternalSchemaVoiceMessageDuration"
-"0x6802";"PidTagOfflineAddressBookContainerGuid";"A string-formatted GUID that represents the address list container object. ";"PtypString8, 0x001E";"Offline Address Book Properties";"[MS-OXOAB] section 2.12.1";"PR_OAB_CONTAINER_GUID, PR_OAB_CONTAINER_GUID_W"
-"0x6802";"PidTagRwRulesStream";"Contains additional rule data about the Rule FAI message.";"PtypBinary, 0x0102";"Message Class Defined Transmittable";"[MS-OXORULE] section 2.2.9.3";"PR_RW_RULES_STREAM"
-"0x6802";"PidTagSenderTelephoneNumber";"Contains the telephone number of the caller associated with a voice mail message.";"PtypString, 0x001F";"Unified Messaging";"[MS-OXOUM] section 2.2.5.1";"InternalSchemaSenderTelephoneNumber"
-"0x6803";"PidTagOfflineAddressBookMessageClass";"Contains the message class for full OAB messages.";"PtypInteger32, 0x0003";"Offline Address Book Properties";"[MS-OXPFOAB] section 2.2.2.1.1";"PR_OAB_MESSAGE_CLASS"
-"0x6803";"PidTagVoiceMessageSenderName";"Specifies the name of the caller who left the attached voice message, as provided by the voice network's caller ID system.";"PtypString, 0x001F";"Unified Messaging ";"[MS-OXOUM] section 2.2.5.5";"InternalSchemaVoiceMessageSenderName"
-"0x6804";"PidTagFaxNumberOfPages";"Contains the number of pages in a Fax object.";"PtypInteger32, 0x0003";"Unified Messaging";"[MS-OXOUM] section 2.2.5.7";"InternalSchemaFaxNumberOfPages"
-"0x6804";"PidTagOfflineAddressBookDistinguishedName";"Contains the DN of the address list that is contained in the OAB message. ";"PtypString8, 0x001E";"Offline Address Book Properties";"[MS-OXOAB] section 2.12.2";"PR_OAB_DN, PR_OAB_DN_W"
-"0x6805";"PidTagOfflineAddressBookTruncatedProperties";"Contains a list of the property tags that have been truncated or limited by the server.";"PtypMultipleInteger32, 0x1003";"Offline Address Book Properties";"[MS-OXOAB] section 2.9.2.2";"PR_OAB_TRUNCATED_PROPS"
-"0x6805";"PidTagVoiceMessageAttachmentOrder";"Contains a list of file names for the audio file attachments that are to be played as part of a message.";"PtypString, 0x001F";"Unified Messaging ";"[MS-OXOUM] section 2.2.5.9";"InternalSchemaVoiceMessageAttachmentOrder"
-"0x6806";"PidTagCallId";"Contains a unique identifier associated with the phone call.";"PtypString, 0x001F";"Unified Messaging";"[MS-OXOUM] section 2.2.5.11";"InternalSchemaCallID"
-"0x6820";"PidTagReportingMessageTransferAgent";"Contains the value of the Reporting-MTA field for a delivery status notification, as specified in [RFC3464].";"PtypString, 0x001F";"Email";"[MS-OXOMSG] section 2.2.2.35";"ptagDsnReportingMta"
-"0x6834";"PidTagSearchFolderLastUsed";"Contains the last time, in UTC, that the folder was accessed.";"PtypInteger32, 0x0003";"Search";"[MS-OXOSRCH] section 2.2.1.2.4";"PR_WB_SF_LAST_USED"
-"0x683A";"PidTagSearchFolderExpiration";"Contains the time, in UTC, at which the search folder container will be stale and has to be updated or recreated.";"PtypInteger32, 0x0003";"Search";"[MS-OXOSRCH] section 2.2.1.2.5";"PR_WB_SF_EXPIRATION"
-"0x6841";"PidTagScheduleInfoResourceType";"Set to 0x00000000 when sending and is ignored on receipt.";"PtypInteger32, 0x0003";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.4.2";"PR_SCHDINFO_RESOURCE_TYPE"
-"0x6841";"PidTagSearchFolderTemplateId";"Contains the ID of the template that is being used for the search. ";"PtypInteger32, 0x0003";"Search";"[MS-OXOSRCH] section 2.2.1.2.2";"PR_WB_SF_TEMPLATE_ID"
-"0x6842";"PidTagScheduleInfoDelegatorWantsCopy";"Indicates whether the delegator wants to receive copies of the meeting-related objects that are sent to the delegate.";"PtypBoolean, 0x000B";"Free/Busy Properties";"[MS-OXODLGT] section 2.2.2.2.1";"PR_SCHDINFO_BOSS_WANTS_COPY"
-"0x6842";"PidTagSearchFolderId";"Contains a GUID that identifies the search folder. ";"PtypBinary, 0x0102";"Search";"[MS-OXOSRCH] section 2.2.1.2.1";"PR_WB_SF_ID"
-"0x6842";"PidTagWlinkGroupHeaderID";"Specifies the ID of the navigation shortcut that groups other navigation shortcuts.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.3";
-"0x6843";"PidTagScheduleInfoDontMailDelegates";"Contains a value set to TRUE by the client, regardless of user input.";"PtypBoolean, 0x000B";"Free/Busy Properties";"[MS-OXODLGT] section 2.2.2.2.7";"PR_SCHDINFO_DONT_MAIL_DELEGATES"
-"0x6844";"PidTagScheduleInfoDelegateNames";"Specifies the names of the delegates.";"PtypMultipleString, 0x101F";"Free/Busy Properties";"[MS-OXODLGT] section 2.2.2.2.3";"PR_SCHDINFO_DELEGATE_NAMES"
-"0x6844";"PidTagSearchFolderRecreateInfo";"This property is not to be used.";"PtypBinary, 0x0102";"Search";"[MS-OXOSRCH] section 2.2.1.2.9";"PR_WB_SF_RECREATE_INFO"
-"0x6845";"PidTagScheduleInfoDelegateEntryIds";"Specifies the EntryIDs of the delegates. ";"PtypMultipleBinary, 0x1102";"Free/Busy Properties";"[MS-OXODLGT] section 2.2.2.2.5";"PR_SCHDINFO_DELEGATE_ENTRYIDS"
-"0x6845";"PidTagSearchFolderDefinition";"Specifies the search criteria and search options. ";"PtypBinary, 0x0102";"Search";"[MS-OXOSRCH] section 2.2.1.2.8";"PR_WB_SF_DEFINITION"
-"0x6846";"PidTagGatewayNeedsToRefresh";"This property is deprecated and SHOULD NOT be used.";"PtypBoolean, 0x000B";"MessageClassDefinedTransmittable";"[MS-OXOPFFB] section 2.2.1.4.1";"PR_GATEWAY_NEEDS_TO_REFRESH"
-"0x6846";"PidTagSearchFolderStorageType";"Contains flags that specify the binary large object (BLOB) data that appears in the PidTagSearchFolderDefinition (section 2.988) property.";"PtypInteger32, 0x0003";"Search";"[MS-OXOSRCH] section 2.2.1.2.6";"PR_WB_SF_STORAGE_TYPE"
-"0x6847";"PidTagFreeBusyPublishStart";"Specifies the start time, in UTC, of the publishing range.";"PtypInteger32, 0x0003";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.9";"PR_FREEBUSY_PUBLISH_START"
-"0x6847";"PidTagSearchFolderTag";"Contains the value of the SearchFolderTag sub-property of the PidTagExtendedFolderFlags (section 2.691) property of the search folder container. ";"PtypInteger32, 0x0003";"Search";"[MS-OXOSRCH] section 2.2.1.2.3";"PR_WB_SF_TAG"
-"0x6847";"PidTagWlinkSaveStamp";"Specifies an integer that allows a client to identify with a high probability whether the navigation shortcut was saved by the current client session.";"PtypInteger32, 0x0003";"Configuration";"[MS-OXOCFG] section 2.2.9.4";
-"0x6848";"PidTagFreeBusyPublishEnd";"Specifies the end time, in UTC, of the publishing range.";"PtypInteger32, 0x0003";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.10";"PR_FREEBUSY_PUBLISH_END"
-"0x6848";"PidTagSearchFolderEfpFlags";"Specifies flags that control how a folder is displayed.";"PtypInteger32, 0x0003";"Search";"[MS-OXOSRCH] section 2.2.1.2.7";"PR_WB_SF_EFP_FLAGS"
-"0x6849";"PidTagFreeBusyMessageEmailAddress";"Specifies the email address of the user or resource to whom this free/busy message applies.";"PtypString, 0x001F";"MessageClassDefinedTransmittable";"[MS-OXOPFFB] section 2.2.1.2.12";"PR_FREEBUSY_EMA"
-"0x6849";"PidTagWlinkType";"Specifies the type of navigation shortcut.";"PtypInteger32, 0x0003";"Configuration";"[MS-OXOCFG] section 2.2.9.5";"PR_WLINK_TYPE "
-"0x684A";"PidTagScheduleInfoDelegateNamesW";"Specifies the names of the delegates in Unicode.";"PtypMultipleString, 0x101F";"Free/Busy Properties";"[MS-OXODLGT] section 2.2.2.2.4";"PR_SCHDINFO_DELEGATE_NAMES_W, ptagDelegateNames"
-"0x684A";"PidTagWlinkFlags";"Specifies conditions associated with the shortcut.";"PtypInteger32, 0x0003";"Configuration";"[MS-OXOCFG] section 2.2.9.6";"PR_WLINK_FLAGS "
-"0x684B";"PidTagScheduleInfoDelegatorWantsInfo";"Indicates whether the delegator wants to receive informational updates.";"PtypBoolean, 0x000B";"Free/Busy Properties";"[MS-OXODLGT] section 2.2.2.2.2";"PR_SCHDINFO_BOSS_WANTS_INFO"
-"0x684B";"PidTagWlinkOrdinal";"Specifies a variable-length binary property to be used to sort shortcuts lexicographically.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.7";"PR_WLINK_ORDINAL "
-"0x684C";"PidTagWlinkEntryId";"Specifies the EntryID of the folder pointed to by the shortcut.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.8";"PR_WLINK_ENTRYID "
-"0x684D";"PidTagWlinkRecordKey";"Specifies the value of PidTagRecordKey property (section 2.910) of the folder pointed to by the shortcut.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.9";"PR_WLINK_RECKEY "
-"0x684E";"PidTagWlinkStoreEntryId";"Specifies the value of the PidTagStoreEntryId property (section 2.1028) of the folder pointed to by the shortcut.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.10";"PR_WLINK_STORE_ENTRYID "
-"0x684F";"PidTagScheduleInfoMonthsMerged";"Specifies the months for which free/busy data of type busy or OOF is present in the free/busy message. ";"PtypMultipleInteger32, 0x1003";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.7";"PR_SCHDINFO_MONTHS_MERGED"
-"0x684F";"PidTagWlinkFolderType";"Specifies the type of folder pointed to by the shortcut.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.11";"PR_WLINK_FOLDER_TYPE"
-"0x6850";"PidTagScheduleInfoFreeBusyMerged";"Specifies the blocks for which free/busy data of type busy or OOF is present in the free/busy message. ";"PtypMultipleBinary, 0x1102";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.8";"PR_SCHDINFO_FREEBUSY_MERGED"
-"0x6850";"PidTagWlinkGroupClsid";"Specifies the value of the PidTagWlinkGroupHeaderID property (section 2.1070) of the group header associated with the shortcut.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.12";"PR_WLINK_GROUP_CLSID "
-"0x6851";"PidTagScheduleInfoMonthsTentative";"Specifies the months for which free/busy data of type tentative is present in the free/busy message. ";"PtypMultipleInteger32, 0x1003";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.1";"PR_SCHDINFO_MONTHS_TENTATIVE"
-"0x6851";"PidTagWlinkGroupName";"Specifies the value of the PidTagNormalizedSubject (section 2.812) of the group header associated with the shortcut.";"PtypString, 0x001F";"Configuration";"[MS-OXOCFG] section 2.2.9.13";"PR_WLINK_GROUP_NAME "
-"0x6852";"PidTagScheduleInfoFreeBusyTentative";"Specifies the blocks of times for which the free/busy status is set to a value of tentative.";"PtypMultipleBinary, 0x1102";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.2";"PR_SCHDINFO_FREEBUSY_TENTATIVE"
-"0x6852";"PidTagWlinkSection";"Specifies the section where the shortcut will be grouped. ";"PtypInteger32, 0x0003";"Configuration";"[MS-OXOCFG] section 2.2.9.14";"PR_WLINK_SECTION "
-"0x6853";"PidTagScheduleInfoMonthsBusy";"Specifies the months for which free/busy data of type busy is present in the free/busy message.";"PtypMultipleInteger32, 0x1003";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.3";"PR_SCHDINFO_MONTHS_BUSY"
-"0x6853";"PidTagWlinkCalendarColor";"Specifies the background color of the calendar.";"PtypInteger32, 0x0003";"Configuration";"[MS-OXOCFG] section 2.2.9.15";"PR_WLINK_CALENDAR_COLOR "
-"0x6854";"PidTagScheduleInfoFreeBusyBusy";"Specifies the blocks of time for which the free/busy status is set to a value of busy.";"PtypMultipleBinary, 0x1102";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.4";"PR_SCHDINFO_FREEBUSY_BUSY"
-"0x6854";"PidTagWlinkAddressBookEID";"Specifies the value of the PidTagEntryId property (section 2.683) of the user to whom the folder belongs.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.16";"PR_WLINK_ABEID"
-"0x6855";"PidTagScheduleInfoMonthsAway";"Specifies the months for which free/busy data of type OOF is present in the free/busy message.";"PtypMultipleInteger32, 0x1003";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.5";"PR_SCHDINFO_MONTHS_OOF"
-"0x6856";"PidTagScheduleInfoFreeBusyAway";"Specifies the times for which the free/busy status is set a value of OOF.";"PtypMultipleBinary, 0x1102";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.6";"PR_SCHDINFO_FREEBUSY_OOF"
-"0x6868";"PidTagFreeBusyRangeTimestamp";"Specifies the time, in UTC, that the data was published.";"PtypTime, 0x0040";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.2.11";"PR_FREEBUSY_RANGE_TIMESTAMP"
-"0x6869";"PidTagFreeBusyCountMonths";"Contains an integer value used to calculate the start and end dates of the range of free/busy data to be published to the public folders.";"PtypInteger32, 0x0003";"MessageClassDefinedTransmittable";"[MS-OXOCAL] section 2.2.12.1";"PR_FREEBUSY_COUNT_MONTHS"
-"0x686A";"PidTagScheduleInfoAppointmentTombstone";"Contains a list of tombstones, where each tombstone represents a Meeting object that has been declined.";"PtypBinary, 0x0102";"Free/Busy Properties";"[MS-OXOCAL] section 2.2.12.5";"PR_SCHDINFO_APPT_TOMBSTONE"
-"0x686B";"PidTagDelegateFlags";"Indicates whether delegates can view Message objects that are marked as private.";"PtypMultipleInteger32, 0x1003";"MessageClassDefinedTransmittable";"[MS-OXODLGT] section 2.2.2.2.6";"PR_DELEGATE_FLAGS, ptagDelegateFlags"
-"0x686C";"PidTagScheduleInfoFreeBusy";"This property is deprecated and is not to be used.";"PtypBinary, 0x0102";"Free/Busy Properties";"[MS-OXOPFFB] section 2.2.1.4.3";"PR_SCHDINFO_FREEBUSY"
-"0x686D";"PidTagScheduleInfoAutoAcceptAppointments";"Indicates whether a client or server is to automatically respond to all meeting requests for the attendee or resource.";"PtypBoolean, 0x000B";"Free/Busy Properties";"[MS-OXOCAL] section 2.2.12.2";"PR_SCHDINFO_AUTO_ACCEPT_APPTS"
-"0x686E";"PidTagScheduleInfoDisallowRecurringAppts";"Indicates whether a client or server, when automatically responding to meeting requests, is to decline Meeting Request objects that represent a recurring series.";"PtypBoolean, 0x000B";"Free/Busy Properties";"[MS-OXOCAL] section 2.2.12.3";"PR_SCHDINFO_DISALLOW_RECURRING_APPTS"
-"0x686F";"PidTagScheduleInfoDisallowOverlappingAppts";"Indicates whether a client or server, when automatically responding to meeting requests, is to decline Meeting Request objects that overlap with previously scheduled events.";"PtypBoolean, 0x000B";"Free/Busy Properties";"[MS-OXOCAL] section 2.2.12.4";"PR_SCHDINFO_DISALLOW_OVERLAPPING_APPTS"
-"0x6890";"PidTagWlinkClientID";"Specifies the Client ID that allows the client to determine whether the shortcut was created on the current machine/user via an equality test.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.18";"PR_WLINK_CLIENTID "
-"0x6891";"PidTagWlinkAddressBookStoreEID";"Specifies the value of the PidTagStoreEntryId property (section 2.1028) of the current user (not the owner of the folder).";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.9.17";"PR_WLINK_AB_EXSTOREEID "
-"0x6892";"PidTagWlinkROGroupType";"Specifies the type of group header.";"PtypInteger32, 0x0003";"Configuration";"[MS-OXOCFG] section 2.2.9.19";"PR_WLINK_RO_GROUP_TYPE "
-"0x7001";"PidTagViewDescriptorBinary";"Contains view definitions.";"PtypBinary, 0x0102";"MessageClassDefinedTransmittable";"[MS-OXOCFG] section 2.2.6.1";"PR_VD_BINARY"
-"0x7002";"PidTagViewDescriptorStrings";"Contains view definitions in string format.";"PtypString, 0x001F";"MessageClassDefinedTransmittable";"[MS-OXOCFG] section 2.2.6.3";"PR_VD_STRINGS, PR_VD_STRINGS_W"
-"0x7006";"PidTagViewDescriptorName";"Contains the view descriptor name.";"PtypString, 0x001F";"MessageClassDefinedTransmittable";"[MS-OXOCFG] section 2.2.6.2";"PR_VD_NAME, PR_VD_NAME_W"
-"0x7007";"PidTagViewDescriptorVersion";"Contains the View Descriptor version.";"PtypInteger32, 0x0003";"Miscellaneous Properties";"[MS-OXOCFG] section 2.2.6.4";"PR_VD_VERSION"
-"0x7C06";"PidTagRoamingDatatypes";"Contains a bitmask that indicates which stream properties exist on the message.";"PtypInteger32, 0x0003";"Configuration";"[MS-OXOCFG] section 2.2.2.1";"PR_ROAMING_DATATYPES"
-"0x7C07";"PidTagRoamingDictionary";"Contains a dictionary stream, as specified in [MS-OXOCFG] section 2.2.5.1.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.2.2";"PR_ROAMING_DICTIONARY"
-"0x7C08";"PidTagRoamingXmlStream";"Contains an XML stream, as specified in [MS-OXOCFG] section 2.2.5.2.";"PtypBinary, 0x0102";"Configuration";"[MS-OXOCFG] section 2.2.2.3";"PR_ROAMING_XMLSTREAM"
-"0x7C24";"PidTagOscSyncEnabled";"Specifies whether contact synchronization with an external source is handled by the server.";" PtypBoolean, 0x000B";"Contact Properties";"[MS-OXOCNTC] section 2.2.1.9.7";"PR_OSC_SYNC_ENABLEDONSERVER "
-"0x7D01";"PidTagProcessed";"Indicates whether a client has already processed a received task communication.";"PtypBoolean, 0x000B";"Calendar";"[MS-OXOCAL] section 2.2.5.7";"PR_PROCESSED"
-"0x7FF9";"PidTagExceptionReplaceTime";"Indicates the original date and time, in UTC, at which the instance in the recurrence pattern would have occurred if it were not an exception.";"PtypTime, 0x0040";"MessageClassDefinedNonTransmittable";"[MS-OXOCAL] section 2.2.10.1.6";"PR_EXCEPTION_REPLACETIME"
-"0x7FFA";"PidTagAttachmentLinkId";"Contains the type of Message object to which an attachment is linked.";"PtypInteger32, 0x0003";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.22";"PR_ATTACHMENT_LINKID, ptagAttachmentLinkId"
-"0x7FFB";"PidTagExceptionStartTime";"Contains the start date and time of the exception in the local time zone of the computer when the exception is created.";"PtypTime, 0x0040";"MessageClassDefinedNonTransmittable";"[MS-OXOCAL] section 2.2.10.1.4";"PR_EXCEPTION_STARTTIME, ptagExceptionStartTime"
-"0x7FFC";"PidTagExceptionEndTime";"Contains the end date and time of the exception in the local time zone of the computer when the exception is created.";"PtypTime, 0x0040";"MessageClassDefinedNonTransmittable";"[MS-OXOCAL] section 2.2.10.1.5";"PR_EXCEPTION_ENDTIME, ptagExceptionEndTime"
-"0x7FFD";"PidTagAttachmentFlags";"Indicates special handling for an Attachment object.";"PtypInteger32, 0x0003";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.23";"PR_ATTACHMENT_FLAGS, ptagAttachmentFlags"
-"0x7FFE";"PidTagAttachmentHidden";"Indicates whether an Attachment object is hidden from the end user.";"PtypBoolean, 0x000B";"Message Attachment Properties";"[MS-OXCMSG] section 2.2.2.24";"PR_ATTACHMENT_HIDDEN"
-"0x7FFF";"PidTagAttachmentContactPhoto";"Indicates that a contact photo attachment is attached to a Contact object.";"PtypBoolean, 0x000B";"Message Attachment Properties";"[MS-OXOCNTC] section 2.2.1.8.2";"PR_ATTACHMENT_CONTACTPHOTO"
-"0x8004";"PidTagAddressBookFolderPathname";"This property is deprecated and is to be ignored.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.6.4";"PR_EMS_AB_FOLDER_PATHNAME, PR_EMS_AB_FOLDER_PATHNAME_A, PR_EMS_AB_FOLDER_PATHNAME_W"
-"0x8005";"PidTagAddressBookManager";"Contains one row that references the mail user's manager.";"PtypObject, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.5.1";" Alternate names: PR_EMS_AB_MANAGER, PR_EMS_AB_MANAGER_A, PR_EMS_AB_MANAGER_W"
-"0x8005";"PidTagAddressBookManagerDistinguishedName";"Contains the DN of the mail user's manager.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.4.9";"PR_EMS_AB_MANAGER_T"
-"0x8006";"PidTagAddressBookHomeMessageDatabase";"Contains the DN expressed in the X500 DN format. This property is returned from a name service provider interface (NSPI) server as a PtypEmbeddedTable. Otherwise, the data type is PtypString8.";"PtypString8, 0x001EPtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.4.37";"PR_EMS_AB_HOME_MDB, PR_EMS_AB_HOME_MDB_A, PR_EMS_AB_HOME_MDB_W"
-"0x8008";"PidTagAddressBookIsMemberOfDistributionList";"Lists all of the distribution lists for which the object is a member. This property is returned from an NSPI server as a PtypEmbeddedTable. Otherwise, the data type is PtypString8.";"PtypString8, 0x001E; PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.5.3";"PR_EMS_AB_IS_MEMBER_OF_DL, PR_EMS_AB_IS_MEMBER_OF_DL_A, PR_EMS_AB_IS_MEMBER_OF_DL_W"
-"0x8009";"PidTagAddressBookMember";"Contains the members of the distribution list.";"PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.6.1";"PR_EMS_AB_MEMBER, PR_EMS_AB_MEMBER_A, PR_EMS_AB_MEMBER_W"
-"0x800C";"PidTagAddressBookOwner";"Contains one row that references the distribution list's owner.";"PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.6.2";"PR_EMS_AB_OWNER_O"
-"0x800E";"PidTagAddressBookReports";"Lists all of the mail userƒ??s direct reports.";"PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.5.2";"PR_EMS_AB_REPORTS, PR_EMS_AB_REPORTS_A, PR_EMS_AB_REPORTS_W"
-"0x800F";"PidTagAddressBookProxyAddresses";"Contains alternate email addresses for the Address Book object.";"PtypMultipleString, 0x101F";"Address Book";"[MS-OXOABK] section 2.2.3.23";"PR_EMS_AB_PROXY_ADDRESSES, PR_EMS_AB_PROXY_ADDRESSES_A, PR_EMS_AB_PROXY_ADDRESSES_W"
-"0x8011";"PidTagAddressBookTargetAddress";"Contains the foreign system email address of an Address Book object.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.22";"PR_EMS_AB_TARGET_ADDRESS, PR_EMS_AB_TARGET_ADDRESS_A, PR_EMS_AB_TARGET_ADDRESS_W"
-"0x8015";"PidTagAddressBookPublicDelegates";"Contains a list of mail users who are allowed to send email on behalf of the mailbox owner.";"PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.5.5";"PR_EMS_AB_PUBLIC_DELEGATES, PR_EMS_AB_PUBLIC_DELEGATES_A, PR_EMS_AB_PUBLIC_DELEGATES_W"
-"0x8024";"PidTagAddressBookOwnerBackLink";"Contains a list of the distribution lists owned by a mail user.";"PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.5.4";"PR_EMS_AB_OWNER_BL_O"
-"0x802D";"PidTagAddressBookExtensionAttribute1";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_1, PR_EMS_AB_EXTENSION_ATTRIBUTE_1_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_1_W"
-"0x802E";"PidTagAddressBookExtensionAttribute2";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_2, PR_EMS_AB_EXTENSION_ATTRIBUTE_2_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_2_W"
-"0x802F";"PidTagAddressBookExtensionAttribute3";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_3, PR_EMS_AB_EXTENSION_ATTRIBUTE_3_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_3_W"
-"0x8030";"PidTagAddressBookExtensionAttribute4";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_4, PR_EMS_AB_EXTENSION_ATTRIBUTE_4_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_4_W"
-"0x8031";"PidTagAddressBookExtensionAttribute5";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_5, PR_EMS_AB_EXTENSION_ATTRIBUTE_5_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_5_W"
-"0x8032";"PidTagAddressBookExtensionAttribute6";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_6, PR_EMS_AB_EXTENSION_ATTRIBUTE_6_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_6_W"
-"0x8033";"PidTagAddressBookExtensionAttribute7";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_7, PR_EMS_AB_EXTENSION_ATTRIBUTE_7_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_7_W"
-"0x8034";"PidTagAddressBookExtensionAttribute8";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_8, PR_EMS_AB_EXTENSION_ATTRIBUTE_8_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_8_W"
-"0x8035";"PidTagAddressBookExtensionAttribute9";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_9, PR_EMS_AB_EXTENSION_ATTRIBUTE_9_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_9_W"
-"0x8036";"PidTagAddressBookExtensionAttribute10";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_10, PR_EMS_AB_EXTENSION_ATTRIBUTE_10_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_10_W"
-"0x803C";"PidTagAddressBookObjectDistinguishedName";"Contains the DN of the Address Book object.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.15";"PR_EMS_AB_OBJ_DIST_NAME, PR_EMS_AB_OBJ_DIST_NAME_A, PR_EMS_AB_OBJ_DIST_NAME_W"
-"0x806A";"PidTagAddressBookDeliveryContentLength";"Specifies the maximum size, in bytes, of a message that a recipient can receive.";"PtypInteger32, 0x0003";"Address Book";"[MS-OXOABK] section 2.2.3.27";"PR_EMS_AB_DELIV_CONT_LENGTH"
-"0x8073";"PidTagAddressBookDistributionListMemberSubmitAccepted";"Indicates that delivery restrictions exist for a recipient.";"PtypObject, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.4.44";"PR_EMS_AB_DL_MEM_SUBMIT_PERMS_BL_O"
-"0x8170";"PidTagAddressBookNetworkAddress";"Contains a list of names by which a server is known to the various transports in use by the network.";"PtypMultipleString, 0x101F";"Address Book";"[MS-OXOABK] section 2.2.4.38";"PR_EMS_AB_NETWORK_ADDRESS, PR_EMS_AB_NETWORK_ADDRESS_A, PR_EMS_AB_NETWORK_ADDRESS_W"
-"0x8C57";"PidTagAddressBookExtensionAttribute11";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_11, PR_EMS_AB_EXTENSION_ATTRIBUTE_11_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_11_W"
-"0x8C58";"PidTagAddressBookExtensionAttribute12";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_12, PR_EMS_AB_EXTENSION_ATTRIBUTE_12_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_12_W"
-"0x8C59";"PidTagAddressBookExtensionAttribute13";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_13, PR_EMS_AB_EXTENSION_ATTRIBUTE_13_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_13_W"
-"0x8C60";"PidTagAddressBookExtensionAttribute14";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_14, PR_EMS_AB_EXTENSION_ATTRIBUTE_14_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_14_W"
-"0x8C61";"PidTagAddressBookExtensionAttribute15";"Contains custom values defined and populated by the organization that modified the display templates.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.34";"PR_EMS_AB_EXTENSION_ATTRIBUTE_15, PR_EMS_AB_EXTENSION_ATTRIBUTE_15_A, PR_EMS_AB_EXTENSION_ATTRIBUTE_15_W"
-"0x8C6A";"PidTagAddressBookX509Certificate";"Contains the ASN_1 DER encoded X.509 certificates for the mail user.";"PtypMultipleBinary, 0x1102";"Address Book";"[MS-OXOABK] section 2.2.4.35";"PR_EMS_AB_X509_CERT"
-"0x8C6D";"PidTagAddressBookObjectGuid";"Contains a GUID that identifies an Address Book object.";"PtypBinary, 0x0102";"Address Book";"[MS-OXOABK] section 2.2.3.25";"PR_EMS_AB_OBJECT_GUID"
-"0x8C8E";"PidTagAddressBookPhoneticGivenName";"Contains the phonetic representation of the PidTagGivenName property (section 2.714).";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.4.10";"PR_EMS_AB_PHONETIC_GIVEN_NAME, PR_EMS_AB_PHONETIC_GIVEN_NAME_A, PR_EMS_AB_PHONETIC_GIVEN_NAME_W"
-"0x8C8F";"PidTagAddressBookPhoneticSurname";"Contains the phonetic representation of the PidTagSurname property (section 2.1036).";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.4.11";"PR_EMS_AB_PHONETIC_SURNAME, PR_EMS_AB_PHONETIC_SURNAME_A, PR_EMS_AB_PHONETIC_SURNAME_W"
-"0x8C90";"PidTagAddressBookPhoneticDepartmentName";"Contains the phonetic representation of the PidTagDepartmentName property (section 2.672).";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.4.13";"PR_EMS_AB_PHONETIC_DEPARTMENT_NAME, PR_EMS_AB_PHONETIC_DEPARTMENT_NAME_A, PR_EMS_AB_PHONETIC_DEPARTMENT_NAME_W"
-"0x8C91";"PidTagAddressBookPhoneticCompanyName";"Contains the phonetic representation of the PidTagCompanyName property (section 2.639).";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.4.12";"PR_EMS_AB_PHONETIC_COMPANY_NAME, PR_EMS_AB_PHONETIC_COMPANY_NAME_A, PR_EMS_AB_PHONETIC_COMPANY_NAME_W"
-"0x8C92";"PidTagAddressBookPhoneticDisplayName";"Contains the phonetic representation of the PidTagDisplayName property (section 2.676).";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.3.9";"PR_EMS_AB_PHONETIC_DISPLAY_NAME, PR_EMS_AB_PHONETIC_DISPLAY_NAME_A, PR_EMS_AB_PHONETIC_DISPLAY_NAME_W"
-"0x8C93";"PidTagAddressBookDisplayTypeExtended";"Contains a value that indicates how to display an Address Book object in a table or as a recipient on a message.";"PtypInteger32, 0x0003";"Address Book";"[MS-OXOABK] section 2.2.3.35";"PR_EMS_AB_DISPLAY_TYPE_EX"
-"0x8C94";"PidTagAddressBookHierarchicalShowInDepartments";"Lists all Department objects of which the mail user is a member.";"PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.5.6";"PR_EMS_AB_HAB_SHOW_IN_DEPARTMENTS"
-"0x8C96";"PidTagAddressBookRoomContainers";"Contains a list of DNs that represent the address book containers that hold Resource objects, such as conference rooms and equipment.";"PtypMultipleString, 0x101F";"Address Book";"[MS-OXOABK] section 2.2.7.1";"PR_EMS_AB_ROOM_CONTAINERS, PR_EMS_AB_ROOM_CONTAINERS_A, PR_EMS_AB_ROOM_CONTAINERS_W"
-"0x8C97";"PidTagAddressBookHierarchicalDepartmentMembers";"Contains all of the mail users that belong to this department.";"PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.8.3";"PR_EMS_AB_HAB_DEPARTMENT_MEMBERS"
-"0x8C98";"PidTagAddressBookHierarchicalRootDepartment";"Contains the distinguished name (DN) of either the root Department object or the root departmental group in the department hierarchy for the organization.";"PtypString8, 0x001E";"Address Book";"[MS-OXOABK] section 2.2.7.2";"PR_EMS_AB_HAB_ROOT_DEPARTMENT"
-"0x8C99";"PidTagAddressBookHierarchicalParentDepartment";"Contains all of the departments to which this department is a child.";"PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.8.2";"PR_EMS_AB_HAB_PARENT_DEPARTMENT"
-"0x8C9A";"PidTagAddressBookHierarchicalChildDepartments";"Contains the child departments in a hierarchy of departments.";"PtypEmbeddedTable, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.8.1";"PR_EMS_AB_HAB_CHILD_DEPARTMENTS"
-"0x8C9E";"PidTagThumbnailPhoto";"Contains the mail user's photo in .jpg format.";"PtypBinary, 0x0102";"Address Book";"[MS-OXOABK] section 2.2.4.40";"PR_EMS_AB_THUMBNAIL_PHOTO"
-"0x8CA0";"PidTagAddressBookSeniorityIndex";"Contains a signed integer that specifies the seniority order of Address Book objects that represent members of a department and are referenced by a Department object or departmental group, with larger values specifying members that are more senior.";"PtypInteger32, 0x0003";"Address Book";"[MS-OXOABK] section 2.2.3.24";
-"0x8CA8";"PidTagAddressBookOrganizationalUnitRootDistinguishedName";"Contains the DN of the Organization object of the mail user's organization.";"PtypString, 0x001F";"Address Book";"[MS-OXOABK] section 2.2.4.39";"PR_EMS_AB_ORG_UNIT_ROOT_DN, msExchOURoot"
-"0x8CAC";"PidTagAddressBookSenderHintTranslations";"Contains the locale ID and translations of the default mail tip.";"PtypMultipleString, 0x101F";"Address Book";"[MS-OXOABK] section 2.2.3.26";"PR_EMS_AB_DL_SENDER_HINT_TRANSLATIONS_W"
-"0x8CB5";"PidTagAddressBookModerationEnabled";"Indicates whether moderation is enabled for the mail user or distribution list.";"PtypBoolean, 0x000B";"Address Book";"[MS-OXOABK] section 2.2.3.28";" Alternate names: PR_EMS_AB_ENABLE_MODERATION"
-"0x8CC2";"PidTagSpokenName";"Contains a recording of the mail user's name pronunciation.";"PtypBinary, 0x0102";"Address Book";"[MS-OXOABK] section 2.2.4.41";"PR_EMS_AB_UM_SPOKEN_NAME"
-"0x8CD8";"PidTagAddressBookAuthorizedSenders";"Indicates whether delivery restrictions exist for a recipient.";"PtypObject, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.4.42";"PR_EMS_AB_AUTH_ORIG"
-"0x8CD9";"PidTagAddressBookUnauthorizedSenders";"Indicates whether delivery restrictions exist for a recipient.";"PtypObject, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.4.43";"PR_EMS_AB_UNAUTH_ORIG"
-"0x8CDA";"PidTagAddressBookDistributionListMemberSubmitRejected";"Indicates that delivery restrictions exist for a recipient.";"PtypObject, 0x000D";"Address Book";"[MS-OXOABK] section 2.2.4.45";"PR_EMS_AB_DL_MEM_SUBMIT_PERMS"
-"0x8CDB";"PidTagAddressBookDistributionListRejectMessagesFromDLMembers";"Indicates that delivery restrictions exist for a recipient.";"PtypObject, 0x000D";"Address book";"[MS-OXOAB] section 2.9.2.2";"PR_EMS_AB_DL_MEM_REJECT_PERMS"
-"0x8CDD";"PidTagAddressBookHierarchicalIsHierarchicalGroup";"Indicates whether the distribution list represents a departmental group.";"PtypBoolean, 0x000B";"Address Book";"[MS-OXOABK] section 2.2.6.5";"PR_EMS_AB_HAB_IS_HIERARCHICAL_GROUP, PR_EMS_AB_IS_ORGANIZATIONAL"
-"0x8CE2";"PidTagAddressBookDistributionListMemberCount";"Contains the total number of recipients in the distribution list.";"PtypInteger32, 0x0003";"Address Book";"[MS-OXOABK] section 2.2.3.29";"PR_EMS_AB_DL_TOTAL_MEMBER_COUNT"
-"0x8CE3";"PidTagAddressBookDistributionListExternalMemberCount";"Contains the number of external recipients in the distribution list.";"PtypInteger32, 0x0003";"Address Book";"[MS-OXOABK] section 2.2.3.30";"PR_EMS_AB_DL_EXTERNAL_MEMBER_COUNT"
-"0xFFFB";"PidTagAddressBookIsMaster";"Contains a Boolean value of TRUE if it is possible to create Address Book objects in that container, and FALSE otherwise.";"PtypBoolean, 0x000B";"Address Book";"[MS-OXOABK] section 2.2.2.4";"PR_EMS_AB_IS_MASTER"
-"0xFFFC";"PidTagAddressBookParentEntryId";"Contains the EntryID of the parent container in a hierarchy of address book containers.";"PtypBinary, 0x0102";"Address Book";"[MS-OXOABK] section 2.2.2.5";"PR_EMS_AB_PARENT_ENTRYID"
-"0xFFFD";"PidTagAddressBookContainerId";"Contains the ID of a container on an NSPI server.";"PtypInteger32, 0x0003";"Address Book";"[MS-OXOABK] section 2.2.2.3";"PR_EMS_AB_CONTAINERID"
diff --git a/src/main/resources/PropertyNames.txt b/src/main/resources/PropertyNames.txt
deleted file mode 100644
index f9355e5..0000000
--- a/src/main/resources/PropertyNames.txt
+++ /dev/null
@@ -1,1004 +0,0 @@
-# Copyright 2010 Richard Johnson & Orin Eman
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# ---
-#
-# This file is part of java-libpst.
-#
-# java-libpst is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# java-libpst 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 Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with java-libpst. If not, see .
-
-
-#All theese ID have been defined from the [MS-OXPROPS]: Exchange Server Protocols Master Property List
-#document Version 24.0 (6/18/2019)
-#completed by values already described by Richard Johnson
-
-#From the Microsoft documentation
-#ShortID from PIDShortID.csv
-
-0001=PidTagTemplateData
-0002=PidTagAlternateRecipientAllowed
-0004=PidTagAutoForwardComment
-0004=PidTagScriptData
-0005=PidTagAutoForwarded
-000F=PidTagDeferredDeliveryTime
-0010=PidTagDeliverTime
-0015=PidTagExpiryTime
-0017=PidTagImportance
-001A=PidTagMessageClass
-0023=PidTagOriginatorDeliveryReportRequested
-0025=PidTagParentKey
-0026=PidTagPriority
-0029=PidTagReadReceiptRequested
-002A=PidTagReceiptTime
-002B=PidTagRecipientReassignmentProhibited
-002E=PidTagOriginalSensitivity
-0030=PidTagReplyTime
-0031=PidTagReportTag
-0032=PidTagReportTime
-0036=PidTagSensitivity
-0037=PidTagSubject
-0039=PidTagClientSubmitTime
-003A=PidTagReportName
-003B=PidTagSentRepresentingSearchKey
-003D=PidTagSubjectPrefix
-003F=PidTagReceivedByEntryId
-0040=PidTagReceivedByName
-0041=PidTagSentRepresentingEntryId
-0042=PidTagSentRepresentingName
-0043=PidTagReceivedRepresentingEntryId
-0044=PidTagReceivedRepresentingName
-0045=PidTagReportEntryId
-0046=PidTagReadReceiptEntryId
-0047=PidTagMessageSubmissionId
-0049=PidTagOriginalSubject
-004B=PidTagOriginalMessageClass
-004C=PidTagOriginalAuthorEntryId
-004D=PidTagOriginalAuthorName
-004E=PidTagOriginalSubmitTime
-004F=PidTagReplyRecipientEntries
-0050=PidTagReplyRecipientNames
-0051=PidTagReceivedBySearchKey
-0052=PidTagReceivedRepresentingSearchKey
-0053=PidTagReadReceiptSearchKey
-0054=PidTagReportSearchKey
-0055=PidTagOriginalDeliveryTime
-0057=PidTagMessageToMe
-0058=PidTagMessageCcMe
-0059=PidTagMessageRecipientMe
-005A=PidTagOriginalSenderName
-005B=PidTagOriginalSenderEntryId
-005C=PidTagOriginalSenderSearchKey
-005D=PidTagOriginalSentRepresentingName
-005E=PidTagOriginalSentRepresentingEntryId
-005F=PidTagOriginalSentRepresentingSearchKey
-0060=PidTagStartDate
-0061=PidTagEndDate
-0062=PidTagOwnerAppointmentId
-0063=PidTagResponseRequested
-0064=PidTagSentRepresentingAddressType
-0065=PidTagSentRepresentingEmailAddress
-0066=PidTagOriginalSenderAddressType
-0067=PidTagOriginalSenderEmailAddress
-0068=PidTagOriginalSentRepresentingAddressType
-0069=PidTagOriginalSentRepresentingEmailAddress
-0070=PidTagConversationTopic
-0071=PidTagConversationIndex
-0072=PidTagOriginalDisplayBcc
-0073=PidTagOriginalDisplayCc
-0074=PidTagOriginalDisplayTo
-0075=PidTagReceivedByAddressType
-0076=PidTagReceivedByEmailAddress
-0077=PidTagReceivedRepresentingAddressType
-0078=PidTagReceivedRepresentingEmailAddress
-007D=PidTagTransportMessageHeaders
-007F=PidTagTnefCorrelationKey
-0080=PidTagReportDisposition
-0081=PidTagReportDispositionMode
-0807=PidTagAddressBookRoomCapacity
-0809=PidTagAddressBookRoomDescription
-0C04=PidTagNonDeliveryReportReasonCode
-0C05=PidTagNonDeliveryReportDiagCode
-0C06=PidTagNonReceiptNotificationRequested
-0C08=PidTagOriginatorNonDeliveryReportRequested
-0C15=PidTagRecipientType
-0C17=PidTagReplyRequested
-0C19=PidTagSenderEntryId
-0C1A=PidTagSenderName
-0C1B=PidTagSupplementaryInfo
-0C1D=PidTagSenderSearchKey
-0C1E=PidTagSenderAddressType
-0C1F=PidTagSenderEmailAddress
-0C20=PidTagNonDeliveryReportStatusCode
-0C21=PidTagRemoteMessageTransferAgent
-0E01=PidTagDeleteAfterSubmit
-0E02=PidTagDisplayBcc
-0E03=PidTagDisplayCc
-0E04=PidTagDisplayTo
-0E06=PidTagMessageDeliveryTime
-0E07=PidTagMessageFlags
-0E08=PidTagMessageSize
-0E09=PidTagParentEntryId
-0E0F=PidTagResponsibility
-0E12=PidTagMessageRecipients
-0E13=PidTagMessageAttachments
-0E17=PidTagMessageStatus
-0E1B=PidTagHasAttachments
-0E1D=PidTagNormalizedSubject
-0E1F=PidTagRtfInSync
-0E20=PidTagAttachSize
-0E21=PidTagAttachNumber
-0E28=PidTagPrimarySendAccount
-0E29=PidTagNextSendAcct
-0E2B=PidTagToDoItemFlags
-0E2C=PidTagSwappedToDoStore
-0E2D=PidTagSwappedToDoData
-0E69=PidTagRead
-0E6A=PidTagSecurityDescriptorAsXml
-0E79=PidTagTrustSender
-0E84=PidTagExchangeNTSecurityDescriptor
-0E99=PidTagExtendedRuleMessageActions
-0E9A=PidTagExtendedRuleMessageCondition
-0E9B=PidTagExtendedRuleSizeLimit
-0FF4=PidTagAccess
-0FF5=PidTagRowType
-0FF6=PidTagInstanceKey
-0FF7=PidTagAccessLevel
-0FF8=PidTagMappingSignature
-0FF9=PidTagRecordKey
-0FFB=PidTagStoreEntryId
-0FFE=PidTagObjectType
-0FFF=PidTagEntryId
-1000=PidTagBody
-1001=PidTagReportText
-1009=PidTagRtfCompressed
-1013=PidTagBodyHtml
-1014=PidTagBodyContentLocation
-1015=PidTagBodyContentId
-1016=PidTagNativeBody
-1035=PidTagInternetMessageId
-1039=PidTagInternetReferences
-1042=PidTagInReplyToId
-1043=PidTagListHelp
-1044=PidTagListSubscribe
-1045=PidTagListUnsubscribe
-1046=PidTagOriginalMessageId
-1080=PidTagIconIndex
-1081=PidTagLastVerbExecuted
-1082=PidTagLastVerbExecutionTime
-1090=PidTagFlagStatus
-1091=PidTagFlagCompleteTime
-1095=PidTagFollowupIcon
-1096=PidTagBlockStatus
-10C3=PidTagICalendarStartTime
-10C4=PidTagICalendarEndTime
-10C5=PidTagCdoRecurrenceid
-10CA=PidTagICalendarReminderNextTime
-10F4=PidTagAttributeHidden
-10F6=PidTagAttributeReadOnly
-3000=PidTagRowid
-3001=PidTagDisplayName
-3002=PidTagAddressType
-3003=PidTagEmailAddress
-3004=PidTagComment
-3005=PidTagDepth
-3007=PidTagCreationTime
-3008=PidTagLastModificationTime
-300B=PidTagSearchKey
-3010=PidTagTargetEntryId
-3013=PidTagConversationId
-3016=PidTagConversationIndexTracking
-3018=PidTagArchiveTag
-3019=PidTagPolicyTag
-301A=PidTagRetentionPeriod
-301B=PidTagStartDateEtc
-301C=PidTagRetentionDate
-301D=PidTagRetentionFlags
-301E=PidTagArchivePeriod
-301F=PidTagArchiveDate
-340D=PidTagStoreSupportMask
-340E=PidTagStoreState
-3600=PidTagContainerFlags
-3601=PidTagFolderType
-3602=PidTagContentCount
-3603=PidTagContentUnreadCount
-3609=PidTagSelectable
-360A=PidTagSubfolders
-360C=PidTagAnr
-360E=PidTagContainerHierarchy
-360F=PidTagContainerContents
-3610=PidTagFolderAssociatedContents
-3613=PidTagContainerClass
-36D0=PidTagIpmAppointmentEntryId
-36D1=PidTagIpmContactEntryId
-36D2=PidTagIpmJournalEntryId
-36D3=PidTagIpmNoteEntryId
-36D4=PidTagIpmTaskEntryId
-36D5=PidTagRemindersOnlineEntryId
-36D7=PidTagIpmDraftsEntryId
-36D8=PidTagAdditionalRenEntryIds
-36D9=PidTagAdditionalRenEntryIdsEx
-36DA=PidTagExtendedFolderFlags
-36E2=PidTagOrdinalMost
-36E4=PidTagFreeBusyEntryIds
-36E5=PidTagDefaultPostMessageClass
-3701=PidTagAttachDataObject
-3702=PidTagAttachEncoding
-3703=PidTagAttachExtension
-3704=PidTagAttachFilename
-3705=PidTagAttachMethod
-3707=PidTagAttachLongFilename
-3708=PidTagAttachPathname
-3709=PidTagAttachRendering
-370A=PidTagAttachTag
-370B=PidTagRenderingPosition
-370C=PidTagAttachTransportName
-370D=PidTagAttachLongPathname
-370E=PidTagAttachMimeTag
-370F=PidTagAttachAdditionalInformation
-3711=PidTagAttachContentBase
-3712=PidTagAttachContentId
-3713=PidTagAttachContentLocation
-3714=PidTagAttachFlags
-3719=PidTagAttachPayloadProviderGuidString
-371A=PidTagAttachPayloadClass
-371B=PidTagTextAttachmentCharset
-3900=PidTagDisplayType
-3902=PidTagTemplateid
-3905=PidTagDisplayTypeEx
-39FE=PidTagSmtpAddress
-39FF=PidTagAddressBookDisplayNamePrintable
-3A00=PidTagAccount
-3A02=PidTagCallbackTelephoneNumber
-3A05=PidTagGeneration
-3A06=PidTagGivenName
-3A07=PidTagGovernmentIdNumber
-3A08=PidTagBusinessTelephoneNumber
-3A09=PidTagHomeTelephoneNumber
-3A0A=PidTagInitials
-3A0B=PidTagKeyword
-3A0C=PidTagLanguage
-3A0D=PidTagLocation
-3A0F=PidTagMessageHandlingSystemCommonName
-3A10=PidTagOrganizationalIdNumber
-3A11=PidTagSurname
-3A12=PidTagOriginalEntryId
-3A15=PidTagPostalAddress
-3A16=PidTagCompanyName
-3A17=PidTagTitle
-3A18=PidTagDepartmentName
-3A19=PidTagOfficeLocation
-3A1A=PidTagPrimaryTelephoneNumber
-3A1B=PidTagBusiness2TelephoneNumber
-3A1B=PidTagBusiness2TelephoneNumbers
-3A1C=PidTagMobileTelephoneNumber
-3A1D=PidTagRadioTelephoneNumber
-3A1E=PidTagCarTelephoneNumber
-3A1F=PidTagOtherTelephoneNumber
-3A20=PidTagTransmittableDisplayName
-3A21=PidTagPagerTelephoneNumber
-3A22=PidTagUserCertificate
-3A23=PidTagPrimaryFaxNumber
-3A24=PidTagBusinessFaxNumber
-3A25=PidTagHomeFaxNumber
-3A26=PidTagCountry
-3A27=PidTagLocality
-3A28=PidTagStateOrProvince
-3A29=PidTagStreetAddress
-3A2A=PidTagPostalCode
-3A2B=PidTagPostOfficeBox
-3A2C=PidTagTelexNumber
-3A2D=PidTagIsdnNumber
-3A2E=PidTagAssistantTelephoneNumber
-3A2F=PidTagHome2TelephoneNumber
-3A2F=PidTagHome2TelephoneNumbers
-3A30=PidTagAssistant
-3A40=PidTagSendRichInfo
-3A41=PidTagWeddingAnniversary
-3A42=PidTagBirthday
-3A43=PidTagHobbies
-3A44=PidTagMiddleName
-3A45=PidTagDisplayNamePrefix
-3A46=PidTagProfession
-3A47=PidTagReferredByName
-3A48=PidTagSpouseName
-3A49=PidTagComputerNetworkName
-3A4A=PidTagCustomerId
-3A4B=PidTagTelecommunicationsDeviceForDeafTelephoneNumber
-3A4C=PidTagFtpSite
-3A4D=PidTagGender
-3A4E=PidTagManagerName
-3A4F=PidTagNickname
-3A50=PidTagPersonalHomePage
-3A51=PidTagBusinessHomePage
-3A57=PidTagCompanyMainTelephoneNumber
-3A58=PidTagChildrensNames
-3A59=PidTagHomeAddressCity
-3A5A=PidTagHomeAddressCountry
-3A5B=PidTagHomeAddressPostalCode
-3A5C=PidTagHomeAddressStateOrProvince
-3A5D=PidTagHomeAddressStreet
-3A5E=PidTagHomeAddressPostOfficeBox
-3A5F=PidTagOtherAddressCity
-3A60=PidTagOtherAddressCountry
-3A61=PidTagOtherAddressPostalCode
-3A62=PidTagOtherAddressStateOrProvince
-3A63=PidTagOtherAddressStreet
-3A64=PidTagOtherAddressPostOfficeBox
-3A70=PidTagUserX509Certificate
-3A71=PidTagSendInternetEncoding
-3F08=PidTagInitialDetailsPane
-3FDE=PidTagInternetCodepage
-3FDF=PidTagAutoResponseSuppress
-3FE0=PidTagAccessControlListData
-3FE3=PidTagDelegatedByRule
-3FE7=PidTagResolveMethod
-3FEA=PidTagHasDeferredActionMessages
-3FEB=PidTagDeferredSendNumber
-3FEC=PidTagDeferredSendUnits
-3FED=PidTagExpiryNumber
-3FEE=PidTagExpiryUnits
-3FEF=PidTagDeferredSendTime
-3FF0=PidTagConflictEntryId
-3FF1=PidTagMessageLocaleId
-3FF8=PidTagCreatorName
-3FF9=PidTagCreatorEntryId
-3FFA=PidTagLastModifierName
-3FFB=PidTagLastModifierEntryId
-3FFD=PidTagMessageCodepage
-401A=PidTagSentRepresentingFlags
-4029=PidTagReadReceiptAddressType
-402A=PidTagReadReceiptEmailAddress
-402B=PidTagReadReceiptName
-4076=PidTagContentFilterSpamConfidenceLevel
-4079=PidTagSenderIdStatus
-4082=PidTagHierRev
-4083=PidTagPurportedSenderDomain
-5902=PidTagInternetMailOverrideFormat
-5909=PidTagMessageEditorFormat
-5D01=PidTagSenderSmtpAddress
-5D02=PidTagSentRepresentingSmtpAddress
-5D05=PidTagReadReceiptSmtpAddress
-5D07=PidTagReceivedBySmtpAddress
-5D08=PidTagReceivedRepresentingSmtpAddress
-5FDF=PidTagRecipientOrder
-5FE1=PidTagRecipientProposed
-5FE3=PidTagRecipientProposedStartTime
-5FE4=PidTagRecipientProposedEndTime
-5FF6=PidTagRecipientDisplayName
-5FF7=PidTagRecipientEntryId
-5FFB=PidTagRecipientTrackStatusTime
-5FFD=PidTagRecipientFlags
-5FFF=PidTagRecipientTrackStatus
-6100=PidTagJunkIncludeContacts
-6101=PidTagJunkThreshold
-6102=PidTagJunkPermanentlyDelete
-6103=PidTagJunkAddRecipientsToSafeSendersList
-6107=PidTagJunkPhishingEnableLinks
-64F0=PidTagMimeSkeleton
-65C2=PidTagReplyTemplateId
-65E0=PidTagSourceKey
-65E1=PidTagParentSourceKey
-65E2=PidTagChangeKey
-65E3=PidTagPredecessorChangeList
-65E9=PidTagRuleMessageState
-65EA=PidTagRuleMessageUserFlags
-65EB=PidTagRuleMessageProvider
-65EC=PidTagRuleMessageName
-65ED=PidTagRuleMessageLevel
-65EE=PidTagRuleMessageProviderData
-65F3=PidTagRuleMessageSequence
-6619=PidTagUserEntryId
-661B=PidTagMailboxOwnerEntryId
-661C=PidTagMailboxOwnerName
-661D=PidTagOutOfOfficeState
-6622=PidTagSchedulePlusFreeBusyEntryId
-6638=PidTagSerializedReplidGuidMap
-6639=PidTagRights
-663A=PidTagHasRules
-663B=PidTagAddressBookEntryId
-663E=PidTagHierarchyChangeNumber
-6645=PidTagClientActions
-6646=PidTagDamOriginalEntryId
-6647=PidTagDamBackPatched
-6648=PidTagRuleError
-6649=PidTagRuleActionType
-664A=PidTagHasNamedProperties
-6650=PidTagRuleActionNumber
-6651=PidTagRuleFolderEntryId
-666A=PidTagProhibitReceiveQuota
-666C=PidTagInConflict
-666D=PidTagMaximumSubmitMessageSize
-666E=PidTagProhibitSendQuota
-6671=PidTagMemberId
-6672=PidTagMemberName
-6673=PidTagMemberRights
-6674=PidTagRuleId
-6675=PidTagRuleIds
-6676 =PidTagRuleSequence
-6677=PidTagRuleState
-6678=PidTagRuleUserFlags
-6679=PidTagRuleCondition
-6680=PidTagRuleActions
-6681=PidTagRuleProvider
-6682=PidTagRuleName
-6683=PidTagRuleLevel
-6684=PidTagRuleProviderData
-668F=PidTagDeletedOn
-66A1=PidTagLocaleId
-66A8=PidTagFolderFlags
-66C3=PidTagCodePageId
-6704=PidTagAddressBookManageDistributionList
-6705=PidTagSortLocaleId
-6709=PidTagLocalCommitTime
-670A=PidTagLocalCommitTimeMax
-670B=PidTagDeletedCountTotal
-670E=PidTagFlatUrlName
-6740=PidTagSentMailSvrEID
-6741=PidTagDeferredActionMessageOriginalEntryId
-6748=PidTagFolderId
-6749=PidTagParentFolderId
-674A=PidTagMid
-674D=PidTagInstID
-674E=PidTagInstanceNum
-674F=PidTagAddressBookMessageId
-67A4=PidTagChangeNumber
-67AA=PidTagAssociated
-6800=PidTagOfflineAddressBookName
-6801=PidTagOfflineAddressBookSequence
-6801=PidTagVoiceMessageDuration
-6802=PidTagOfflineAddressBookContainerGuid
-6802=PidTagRwRulesStream
-6802=PidTagSenderTelephoneNumber
-6803=PidTagOfflineAddressBookMessageClass
-6803=PidTagVoiceMessageSenderName
-6804=PidTagFaxNumberOfPages
-6804=PidTagOfflineAddressBookDistinguishedName
-6805=PidTagOfflineAddressBookTruncatedProperties
-6805=PidTagVoiceMessageAttachmentOrder
-6806=PidTagCallId
-6820=PidTagReportingMessageTransferAgent
-6834=PidTagSearchFolderLastUsed
-683A=PidTagSearchFolderExpiration
-6841=PidTagScheduleInfoResourceType
-6841=PidTagSearchFolderTemplateId
-6842=PidTagScheduleInfoDelegatorWantsCopy
-6842=PidTagSearchFolderId
-6842=PidTagWlinkGroupHeaderID
-6843=PidTagScheduleInfoDontMailDelegates
-6844=PidTagScheduleInfoDelegateNames
-6844=PidTagSearchFolderRecreateInfo
-6845=PidTagScheduleInfoDelegateEntryIds
-6845=PidTagSearchFolderDefinition
-6846=PidTagGatewayNeedsToRefresh
-6846=PidTagSearchFolderStorageType
-6847=PidTagFreeBusyPublishStart
-6847=PidTagSearchFolderTag
-6847=PidTagWlinkSaveStamp
-6848=PidTagFreeBusyPublishEnd
-6848=PidTagSearchFolderEfpFlags
-6849=PidTagFreeBusyMessageEmailAddress
-6849=PidTagWlinkType
-684A=PidTagScheduleInfoDelegateNamesW
-684A=PidTagWlinkFlags
-684B=PidTagScheduleInfoDelegatorWantsInfo
-684B=PidTagWlinkOrdinal
-684C=PidTagWlinkEntryId
-684D=PidTagWlinkRecordKey
-684E=PidTagWlinkStoreEntryId
-684F=PidTagScheduleInfoMonthsMerged
-684F=PidTagWlinkFolderType
-6850=PidTagScheduleInfoFreeBusyMerged
-6850=PidTagWlinkGroupClsid
-6851=PidTagScheduleInfoMonthsTentative
-6851=PidTagWlinkGroupName
-6852=PidTagScheduleInfoFreeBusyTentative
-6852=PidTagWlinkSection
-6853=PidTagScheduleInfoMonthsBusy
-6853=PidTagWlinkCalendarColor
-6854=PidTagScheduleInfoFreeBusyBusy
-6854=PidTagWlinkAddressBookEID
-6855=PidTagScheduleInfoMonthsAway
-6856=PidTagScheduleInfoFreeBusyAway
-6868=PidTagFreeBusyRangeTimestamp
-6869=PidTagFreeBusyCountMonths
-686A=PidTagScheduleInfoAppointmentTombstone
-686B=PidTagDelegateFlags
-686C=PidTagScheduleInfoFreeBusy
-686D=PidTagScheduleInfoAutoAcceptAppointments
-686E=PidTagScheduleInfoDisallowRecurringAppts
-686F=PidTagScheduleInfoDisallowOverlappingAppts
-6890=PidTagWlinkClientID
-6891=PidTagWlinkAddressBookStoreEID
-6892=PidTagWlinkROGroupType
-7001=PidTagViewDescriptorBinary
-7002=PidTagViewDescriptorStrings
-7006=PidTagViewDescriptorName
-7007=PidTagViewDescriptorVersion
-7C06=PidTagRoamingDatatypes
-7C07=PidTagRoamingDictionary
-7C08=PidTagRoamingXmlStream
-7C24=PidTagOscSyncEnabled
-7D01=PidTagProcessed
-7FF9=PidTagExceptionReplaceTime
-7FFA=PidTagAttachmentLinkId
-7FFB=PidTagExceptionStartTime
-7FFC=PidTagExceptionEndTime
-7FFD=PidTagAttachmentFlags
-7FFE=PidTagAttachmentHidden
-7FFF=PidTagAttachmentContactPhoto
-8004=PidTagAddressBookFolderPathname
-8005=PidTagAddressBookManager
-8005=PidTagAddressBookManagerDistinguishedName
-8006=PidTagAddressBookHomeMessageDatabase
-8008=PidTagAddressBookIsMemberOfDistributionList
-8009=PidTagAddressBookMember
-800C=PidTagAddressBookOwner
-800E=PidTagAddressBookReports
-800F=PidTagAddressBookProxyAddresses
-8011=PidTagAddressBookTargetAddress
-8015=PidTagAddressBookPublicDelegates
-8024=PidTagAddressBookOwnerBackLink
-802D=PidTagAddressBookExtensionAttribute1
-802E=PidTagAddressBookExtensionAttribute2
-802F=PidTagAddressBookExtensionAttribute3
-8030=PidTagAddressBookExtensionAttribute4
-8031=PidTagAddressBookExtensionAttribute5
-8032=PidTagAddressBookExtensionAttribute6
-8033=PidTagAddressBookExtensionAttribute7
-8034=PidTagAddressBookExtensionAttribute8
-8035=PidTagAddressBookExtensionAttribute9
-8036=PidTagAddressBookExtensionAttribute10
-803C=PidTagAddressBookObjectDistinguishedName
-806A=PidTagAddressBookDeliveryContentLength
-8073=PidTagAddressBookDistributionListMemberSubmitAccepted
-8170=PidTagAddressBookNetworkAddress
-8C57=PidTagAddressBookExtensionAttribute11
-8C58=PidTagAddressBookExtensionAttribute12
-8C59=PidTagAddressBookExtensionAttribute13
-8C60=PidTagAddressBookExtensionAttribute14
-8C61=PidTagAddressBookExtensionAttribute15
-8C6A=PidTagAddressBookX509Certificate
-8C6D=PidTagAddressBookObjectGuid
-8C8E=PidTagAddressBookPhoneticGivenName
-8C8F=PidTagAddressBookPhoneticSurname
-8C90=PidTagAddressBookPhoneticDepartmentName
-8C91=PidTagAddressBookPhoneticCompanyName
-8C92=PidTagAddressBookPhoneticDisplayName
-8C93=PidTagAddressBookDisplayTypeExtended
-8C94=PidTagAddressBookHierarchicalShowInDepartments
-8C96=PidTagAddressBookRoomContainers
-8C97=PidTagAddressBookHierarchicalDepartmentMembers
-8C98=PidTagAddressBookHierarchicalRootDepartment
-8C99=PidTagAddressBookHierarchicalParentDepartment
-8C9A=PidTagAddressBookHierarchicalChildDepartments
-8C9E=PidTagThumbnailPhoto
-8CA0=PidTagAddressBookSeniorityIndex
-8CA8=PidTagAddressBookOrganizationalUnitRootDistinguishedName
-8CAC=PidTagAddressBookSenderHintTranslations
-8CB5=PidTagAddressBookModerationEnabled
-8CC2=PidTagSpokenName
-8CD8=PidTagAddressBookAuthorizedSenders
-8CD9=PidTagAddressBookUnauthorizedSenders
-8CDA=PidTagAddressBookDistributionListMemberSubmitRejected
-8CDB=PidTagAddressBookDistributionListRejectMessagesFromDLMembers
-8CDD=PidTagAddressBookHierarchicalIsHierarchicalGroup
-8CE2=PidTagAddressBookDistributionListMemberCount
-8CE3=PidTagAddressBookDistributionListExternalMemberCount
-FFFB=PidTagAddressBookIsMaster
-FFFC=PidTagAddressBookParentEntryId
-FFFD=PidTagAddressBookContainerId
-
-
-#LongID from PIDLongID.csv
-
-00000001=PidLidAttendeeCriticalChange
-00000002=PidLidWhere
-00000003=PidLidGlobalObjectId
-00000004=PidLidIsSilent
-00000005=PidLidIsRecurring
-00000006=PidLidRequiredAttendees
-00000007=PidLidOptionalAttendees
-00000008=PidLidResourceAttendees
-00000009=PidLidDelegateMail
-0000000A=PidLidIsException
-0000000C=PidLidTimeZone
-0000000D=PidLidStartRecurrenceDate
-0000000E=PidLidStartRecurrenceTime
-0000000F=PidLidEndRecurrenceDate
-00000010=PidLidEndRecurrenceTime
-00000011=PidLidDayInterval
-00000012=PidLidWeekInterval
-00000013=PidLidMonthInterval
-00000014=PidLidYearInterval
-00000015=PidLidClientIntent
-00000017=PidLidMonthOfYearMask
-00000018=PidLidOldRecurrenceType
-0000001A=PidLidOwnerCriticalChange
-0000001C=PidLidCalendarType
-00000023=PidLidCleanGlobalObjectId
-00000024=PidLidAppointmentMessageClass
-00000026=PidLidMeetingType
-00000028=PidLidOldLocation
-00000029=PidLidOldWhenStartWhole
-0000002A=PidLidOldWhenEndWhole
-00001000=PidLidDayOfMonth
-00001001=PidLidICalendarDayOfWeekMask
-00001005=PidLidOccurrences
-00001006=PidLidMonthOfYear
-0000100B=PidLidNoEndDateFlag
-0000100D=PidLidRecurrenceDuration
-00008005=PidLidFileUnder
-00008006=PidLidFileUnderId
-00008007=PidLidContactItemData
-00008010=PidLidDepartment
-00008015=PidLidHasPicture
-0000801A=PidLidHomeAddress
-0000801B=PidLidWorkAddress
-0000801C=PidLidOtherAddress
-00008022=PidLidPostalAddressId
-00008023=PidLidContactCharacterSet
-00008025=PidLidAutoLog
-00008026=PidLidFileUnderList
-00008028=PidLidAddressBookProviderEmailList
-00008029=PidLidAddressBookProviderArrayType
-0000802B=PidLidHtml
-0000802C=PidLidYomiFirstName
-0000802D=PidLidYomiLastName
-0000802E=PidLidYomiCompanyName
-00008040=PidLidBusinessCardDisplayDefinition
-00008041=PidLidBusinessCardCardPicture
-00008045=PidLidPromptSendUpdate
-00008045=PidLidWorkAddressStreet
-00008046=PidLidWorkAddressCity
-00008047=PidLidWorkAddressState
-00008048=PidLidWorkAddressPostalCode
-00008049=PidLidWorkAddressCountry
-0000804A=PidLidWorkAddressPostOfficeBox
-0000804C=PidLidDistributionListChecksum
-0000804D=PidLidBirthdayEventEntryId
-0000804E=PidLidAnniversaryEventEntryId
-0000804F=PidLidContactUserField1
-00008050=PidLidContactUserField2
-00008051=PidLidContactUserField3
-00008052=PidLidContactUserField4
-00008053=PidLidDistributionListName
-00008054=PidLidDistributionListOneOffMembers
-00008055=PidLidDistributionListMembers
-00008062=PidLidInstantMessagingAddress
-00008064=PidLidDistributionListStream
-00008080=PidLidEmail1DisplayName
-00008082=PidLidEmail1AddressType
-00008083=PidLidEmail1EmailAddress
-00008084=PidLidEmail1OriginalDisplayName
-00008085=PidLidEmail1OriginalEntryId
-00008090=PidLidEmail2DisplayName
-00008092=PidLidEmail2AddressType
-00008093=PidLidEmail2EmailAddress
-00008094=PidLidEmail2OriginalDisplayName
-00008095=PidLidEmail2OriginalEntryId
-000080A0=PidLidEmail3DisplayName
-000080A2=PidLidEmail3AddressType
-000080A3=PidLidEmail3EmailAddress
-000080A4=PidLidEmail3OriginalDisplayName
-000080A5=PidLidEmail3OriginalEntryId
-000080B2=PidLidFax1AddressType
-000080B3=PidLidFax1EmailAddress
-000080B4=PidLidFax1OriginalDisplayName
-000080B5=PidLidFax1OriginalEntryId
-000080C2=PidLidFax2AddressType
-000080C3=PidLidFax2EmailAddress
-000080C4=PidLidFax2OriginalDisplayName
-000080C5=PidLidFax2OriginalEntryId
-000080D2=PidLidFax3AddressType
-000080D3=PidLidFax3EmailAddress
-000080D4=PidLidFax3OriginalDisplayName
-000080D5=PidLidFax3OriginalEntryId
-000080D8=PidLidFreeBusyLocation
-000080DA=PidLidHomeAddressCountryCode
-000080DB=PidLidWorkAddressCountryCode
-000080DC=PidLidOtherAddressCountryCode
-000080DD=PidLidAddressCountryCode
-000080DE=PidLidBirthdayLocal
-000080DF=PidLidWeddingAnniversaryLocal
-000080E0=PidLidIsContactLinked
-000080E2=PidLidContactLinkedGlobalAddressListEntryId
-000080E3=PidLidContactLinkSMTPAddressCache
-000080E5=PidLidContactLinkLinkRejectHistory
-000080E6=PidLidContactLinkGlobalAddressListLinkState
-000080E8=PidLidContactLinkGlobalAddressListLinkId
-00008101=PidLidTaskStatus
-00008102=PidLidPercentComplete
-00008103=PidLidTeamTask
-00008104=PidLidTaskStartDate
-00008105=PidLidTaskDueDate
-00008107=PidLidTaskResetReminder
-00008108=PidLidTaskAccepted
-00008109=PidLidTaskDeadOccurrence
-0000810F=PidLidTaskDateCompleted
-00008110=PidLidTaskActualEffort
-00008111=PidLidTaskEstimatedEffort
-00008112=PidLidTaskVersion
-00008113=PidLidTaskState
-00008115=PidLidTaskLastUpdate
-00008116=PidLidTaskRecurrence
-00008117=PidLidTaskAssigners
-00008119=PidLidTaskStatusOnComplete
-0000811A=PidLidTaskHistory
-0000811B=PidLidTaskUpdates
-0000811C=PidLidTaskComplete
-0000811E=PidLidTaskFCreator
-0000811F=PidLidTaskOwner
-00008120=PidLidTaskMultipleRecipients
-00008121=PidLidTaskAssigner
-00008122=PidLidTaskLastUser
-00008123=PidLidTaskOrdinal
-00008124=PidLidTaskNoCompute
-00008125=PidLidTaskLastDelegate
-00008126=PidLidTaskFRecurring
-00008127=PidLidTaskRole
-00008129=PidLidTaskOwnership
-0000812A=PidLidTaskAcceptanceState
-0000812C=PidLidTaskFFixOffline
-00008139=PidLidTaskCustomFlags
-00008201=PidLidAppointmentSequence
-00008202=PidLidAppointmentSequenceTime
-00008203=PidLidAppointmentLastSequence
-00008204=PidLidChangeHighlight
-00008205=PidLidBusyStatus
-00008206=PidLidFExceptionalBody
-00008207=PidLidAppointmentAuxiliaryFlags
-00008208=PidLidLocation
-00008209=PidLidMeetingWorkspaceUrl
-0000820A=PidLidForwardInstance
-0000820C=PidLidLinkedTaskItems
-0000820D=PidLidAppointmentStartWhole
-0000820E=PidLidAppointmentEndWhole
-0000820F=PidLidAppointmentStartTime
-00008210=PidLidAppointmentEndTime
-00008211=PidLidAppointmentEndDate
-00008212=PidLidAppointmentStartDate
-00008213=PidLidAppointmentDuration
-00008214=PidLidAppointmentColor
-00008215=PidLidAppointmentSubType
-00008216=PidLidAppointmentRecur
-00008217=PidLidAppointmentStateFlags
-00008218=PidLidResponseStatus
-00008220=PidLidAppointmentReplyTime
-00008223=PidLidRecurring
-00008224=PidLidIntendedBusyStatus
-00008226=PidLidAppointmentUpdateTime
-00008228=PidLidExceptionReplaceTime
-00008229=PidLidFInvited
-0000822B=PidLidFExceptionalAttendees
-0000822E=PidLidOwnerName
-0000822F=PidLidFOthersAppointment
-00008230=PidLidAppointmentReplyName
-00008231=PidLidRecurrenceType
-00008232=PidLidRecurrencePattern
-00008233=PidLidTimeZoneStruct
-00008234=PidLidTimeZoneDescription
-00008235=PidLidClipStart
-00008236=PidLidClipEnd
-00008237=PidLidOriginalStoreEntryId
-00008238=PidLidAllAttendeesString
-0000823A=PidLidAutoFillLocation
-0000823B=PidLidToAttendeesString
-0000823C=PidLidCcAttendeesString
-00008240=PidLidConferencingCheck
-00008241=PidLidConferencingType
-00008242=PidLidDirectory
-00008243=PidLidOrganizerAlias
-00008244=PidLidAutoStartCheck
-00008246=PidLidAllowExternalCheck
-00008247=PidLidCollaborateDoc
-00008248=PidLidNetShowUrl
-00008249=PidLidOnlinePassword
-00008250=PidLidAppointmentProposedStartWhole
-00008251=PidLidAppointmentProposedEndWhole
-00008256=PidLidAppointmentProposedDuration
-00008257=PidLidAppointmentCounterProposal
-00008259=PidLidAppointmentProposalNumber
-0000825A=PidLidAppointmentNotAllowPropose
-0000825D=PidLidAppointmentUnsendableRecipients
-0000825E=PidLidAppointmentTimeZoneDefinitionStartDisplay
-0000825F=PidLidAppointmentTimeZoneDefinitionEndDisplay
-00008260=PidLidAppointmentTimeZoneDefinitionRecur
-00008261=PidLidForwardNotificationRecipients
-0000827A=PidLidInboundICalStream
-0000827B=PidLidSingleBodyICal
-00008501=PidLidReminderDelta
-00008502=PidLidReminderTime
-00008503=PidLidReminderSet
-00008504=PidLidReminderTimeTime
-00008505=PidLidReminderTimeDate
-00008506=PidLidPrivate
-0000850E=PidLidAgingDontAgeMe
-00008510=PidLidSideEffects
-00008511=PidLidRemoteStatus
-00008514=PidLidSmartNoAttach
-00008516=PidLidCommonStart
-00008517=PidLidCommonEnd
-00008518=PidLidTaskMode
-00008519=PidLidTaskGlobalId
-0000851A=PidLidAutoProcessState
-0000851C=PidLidReminderOverride
-0000851D=PidLidReminderType
-0000851E=PidLidReminderPlaySound
-0000851F=PidLidReminderFileParameter
-00008520=PidLidVerbStream
-00008524=PidLidVerbResponse
-00008530=PidLidFlagRequest
-00008535=PidLidBilling
-00008536=PidLidNonSendableTo
-00008537=PidLidNonSendableCc
-00008538=PidLidNonSendableBcc
-00008539=PidLidCompanies
-0000853A=PidLidContacts
-00008543=PidLidNonSendToTrackStatus
-00008544=PidLidNonSendCcTrackStatus
-00008545=PidLidNonSendBccTrackStatus
-00008552=PidLidCurrentVersion
-00008554=PidLidCurrentVersionName
-00008560=PidLidReminderSignalTime
-00008580=PidLidInternetAccountName
-00008581=PidLidInternetAccountStamp
-00008582=PidLidUseTnef
-00008584=PidLidContactLinkSearchKey
-00008585=PidLidContactLinkEntry
-00008586=PidLidContactLinkName
-0000859C=PidLidSpamOriginalFolder
-000085A0=PidLidToDoOrdinalDate
-000085A1=PidLidToDoSubOrdinal
-000085A4=PidLidToDoTitle
-000085B1=PidLidInfoPathFormName
-000085B5=PidLidClassified
-000085B6=PidLidClassification
-000085B7=PidLidClassificationDescription
-000085B8=PidLidClassificationGuid
-000085BA=PidLidClassificationKeep
-000085BD=PidLidReferenceEntryId
-000085BF=PidLidValidFlagStringProof
-000085C0=PidLidFlagString
-000085C6=PidLidConversationActionMoveFolderEid
-000085C7=PidLidConversationActionMoveStoreEid
-000085C8=PidLidConversationActionMaxDeliveryTime
-000085C9=PidLidConversationProcessed
-000085CA=PidLidConversationActionLastAppliedTime
-000085CB=PidLidConversationActionVersion
-000085CC=PidLidServerProcessed
-000085CD=PidLidServerProcessingActions
-000085E0=PidLidPendingStateForSiteMailboxDocument
-00008700=PidLidLogType
-00008706=PidLidLogStart
-00008707=PidLidLogDuration
-00008708=PidLidLogEnd
-0000870C=PidLidLogFlags
-0000870E=PidLidLogDocumentPrinted
-0000870F=PidLidLogDocumentSaved
-00008710=PidLidLogDocumentRouted
-00008711=PidLidLogDocumentPosted
-00008712=PidLidLogTypeDesc
-00008900=PidLidPostRssChannelLink
-00008901=PidLidPostRssItemLink
-00008902=PidLidPostRssItemHash
-00008903=PidLidPostRssItemGuid
-00008904=PidLidPostRssChannel
-00008905=PidLidPostRssItemXml
-00008906=PidLidPostRssSubscription
-00008A00=PidLidSharingStatus
-00008A01=PidLidSharingProviderGuid
-00008A02=PidLidSharingProviderName
-00008A03=PidLidSharingProviderUrl
-00008A04=PidLidSharingRemotePath
-00008A05=PidLidSharingRemoteName
-00008A06=PidLidSharingRemoteUid
-00008A07=PidLidSharingInitiatorName
-00008A08=PidLidSharingInitiatorSmtp
-00008A09=PidLidSharingInitiatorEntryId
-00008A0A=PidLidSharingFlags
-00008A0B=PidLidSharingProviderExtension
-00008A0C=PidLidSharingRemoteUser
-00008A0D=PidLidSharingRemotePass
-00008A0E=PidLidSharingLocalPath
-00008A0F=PidLidSharingLocalName
-00008A10=PidLidSharingLocalUid
-00008A13=PidLidSharingFilter
-00008A14=PidLidSharingLocalType
-00008A15=PidLidSharingFolderEntryId
-00008A17=PidLidSharingCapabilities
-00008A18=PidLidSharingFlavor
-00008A19=PidLidSharingAnonymity
-00008A1A=PidLidSharingReciprocation
-00008A1B=PidLidSharingPermissions
-00008A1C=PidLidSharingInstanceGuid
-00008A1D=PidLidSharingRemoteType
-00008A1E=PidLidSharingParticipants
-00008A1F=PidLidSharingLastSyncTime
-00008A21=PidLidSharingExtensionXml
-00008A22=PidLidSharingRemoteLastModificationTime
-00008A23=PidLidSharingLocalLastModificationTime
-00008A24=PidLidSharingConfigurationUrl
-00008A25=PidLidSharingStart
-00008A26=PidLidSharingStop
-00008A27=PidLidSharingResponseType
-00008A28=PidLidSharingResponseTime
-00008A29=PidLidSharingOriginalMessageEntryId
-00008A2A=PidLidSharingSyncInterval
-00008A2B=PidLidSharingDetail
-00008A2C=PidLidSharingTimeToLive
-00008A2D=PidLidSharingBindingEntryId
-00008A2E=PidLidSharingIndexEntryId
-00008A2F=PidLidSharingRemoteComment
-00008A40=PidLidSharingWorkingHoursStart
-00008A41=PidLidSharingWorkingHoursEnd
-00008A42=PidLidSharingWorkingHoursDays
-00008A43=PidLidSharingWorkingHoursTimeZone
-00008A44=PidLidSharingDataRangeStart
-00008A45=PidLidSharingDataRangeEnd
-00008A46=PidLidSharingRangeStart
-00008A47=PidLidSharingRangeEnd
-00008A48=PidLidSharingRemoteStoreUid
-00008A49=PidLidSharingLocalStoreUid
-00008A4B=PidLidSharingRemoteByteSize
-00008A4C=PidLidSharingRemoteCrc
-00008A4D=PidLidSharingLocalComment
-00008A4E=PidLidSharingRoamLog
-00008A4F=PidLidSharingRemoteMessageCount
-00008A51=PidLidSharingBrowseUrl
-00008A55=PidLidSharingLastAutoSyncTime
-00008A56=PidLidSharingTimeToLiveAuto
-00008A5B=PidLidSharingRemoteVersion
-00008A5C=PidLidSharingParentBindingEntryId
-00008A60=PidLidSharingSyncFlags
-00008B00=PidLidNoteColor
-00008B02=PidLidNoteWidth
-00008B03=PidLidNoteHeight
-00008B04=PidLidNoteX
-00008B05=PidLidNoteY
-00009000=PidLidCategories
-
-
-#########################################################################
-
-
-#Old PID not defined in the Microsoft documentation
-0003=PidTagNameidStreamEntry
-0E23=PidTagInternetArticleNumber
-0E38=PidTagReplFlags
-0E62=PidTagUrlCompNameSet
-10F3=PidTagUrlCompName
-10F5=PidTagAttributeSystem
-4019=PidTagSenderFlags
-401B=PidTagReceivedByFlags
-401C=PidTagReceivedRepresentingFlags
-5FDE=PidTagRecipientResourceState
-6001=PidTagNickname
-67F2=PidTagLtpRowId
-67F3=PidTagLtpRowVer
-
-0000001D=PidLidAllAttendeesList
-00008200=PidLidSendMeetingAsIcal
-0000823E=PidLidTrustRecipientHighlights
-00008245=PidLidAutoStartWhen
diff --git a/src/test/java/com/pff/AppointmentTest.java b/src/test/java/com/pff/AppointmentTest.java
deleted file mode 100644
index d920289..0000000
--- a/src/test/java/com/pff/AppointmentTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.pff;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.Calendar;
-import java.util.Arrays;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for {@link PSTAppointment}.
- *
- * @author Richard Johnson
- */
-@RunWith(JUnit4.class)
-public class AppointmentTest {
-
- /**
- * Test we can access appointments from the PST.
- */
- @Test
- public final void testGetDistList()
- throws PSTException, IOException, URISyntaxException {
- URL dirUrl = ClassLoader.getSystemResource("dist-list.pst");
- PSTFile pstFile = new PSTFile(new File(dirUrl.toURI()));
- PSTAppointment appt = (PSTAppointment) PSTObject.detectAndLoadPSTObject(pstFile, 2097348);
- PSTAppointmentRecurrence r = new PSTAppointmentRecurrence(
- appt.getRecurrenceStructure(), appt, appt.getRecurrenceTimeZone());
-
-
- Assert.assertEquals(
- "Has 3 deleted items (1 removed, 2 changed)",
- 3,
- r.getDeletedInstanceDates().length);
-
- Assert.assertEquals(
- "Number of Exceptions",
- 2,
- r.getExceptionCount());
-
- String d = r.getException(0).getDescription().trim();
- Assert.assertEquals("correct app desc", "This is the appointment at 9", d);
-
- Calendar c = PSTObject.apptTimeToCalendar(
- r.getException(0).getStartDateTime());
- Assert.assertEquals(
- "First exception correct hour",
- 9,
- c.get(Calendar.HOUR));
-
- d = r.getException(1).getDescription().trim();
- Assert.assertEquals("correct app desc", "This is the one at 10", d);
-
- c = PSTObject.apptTimeToCalendar(
- r.getException(1).getStartDateTime());
- Assert.assertEquals(
- "Second exception correct hour",
- 10,
- c.get(Calendar.HOUR));
-
- //System.out.println(r.getExceptionCount());
- //System.out.println(r.getException(0).getDTStamp());
-
- //for (int x = 0; x < r.getDeletedInstanceDates().length; x++) {
- // System.out.println(r.getDeletedInstanceDates()[x]);
- //}
- }
-}
-
diff --git a/src/test/java/com/pff/DistListTest.java b/src/test/java/com/pff/DistListTest.java
deleted file mode 100644
index 6ddb936..0000000
--- a/src/test/java/com/pff/DistListTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.pff;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.HashSet;
-import java.util.Arrays;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for {@link PSTDistList}.
- *
- * @author Richard Johnson
- */
-@RunWith(JUnit4.class)
-public class DistListTest {
-
- /**
- * Test we can retrieve distribution lists from the PST.
- */
- @Test
- public final void testGetDistList()
- throws PSTException, IOException, URISyntaxException {
- URL dirUrl = ClassLoader.getSystemResource("dist-list.pst");
- PSTFile pstFile = new PSTFile(new File(dirUrl.toURI()));
- PSTDistList obj = (PSTDistList)PSTObject.detectAndLoadPSTObject(pstFile, 2097188);
- Object[] members = obj.getDistributionListMembers();
- Assert.assertEquals("Correct number of members", members.length, 3);
- int numberOfContacts = 0;
- int numberOfOneOffRecords = 0;
- HashSet emailAddresses = new HashSet();
- HashSet displayNames = new HashSet();
- for (Object member : members) {
- if (member instanceof PSTContact) {
- PSTContact contact = (PSTContact)member;
- Assert.assertEquals("Contact email address",
- contact.getEmail1EmailAddress(),
- "contact1@rjohnson.id.au");
- numberOfContacts++;
- } else {
- PSTDistList.OneOffEntry entry = (PSTDistList.OneOffEntry)member;
- emailAddresses.add(entry.getEmailAddress());
- displayNames.add(entry.getDisplayName());
- numberOfOneOffRecords++;
- }
- }
- Assert.assertEquals("Correct number of members", members.length, 3);
- Assert.assertEquals("Contains all display names",
- displayNames,
- new HashSet(Arrays.asList(
- new String[] {"dist name 2",
- "dist name 1"})));
- Assert.assertEquals("Contains all email addresses",
- emailAddresses,
- new HashSet(Arrays.asList(
- new String[] {"dist1@rjohnson.id.au",
- "dist2@rjohnson.id.au"})));
- }
-}
diff --git a/src/test/java/com/pff/PSTGlobalObjectIdTest.java b/src/test/java/com/pff/PSTGlobalObjectIdTest.java
deleted file mode 100644
index fdf0389..0000000
--- a/src/test/java/com/pff/PSTGlobalObjectIdTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.pff;
-
-import java.util.Date;
-
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.Assert.assertThat;
-
-/**
- * Author: Nick Buller
- */
-public class PSTGlobalObjectIdTest {
-
- @Test
- public void unpackValid() {
-// Global Object ID:
-// Byte Array ID = cb: 16 lpb: 040000008200E00074C5B7101A82E008
-// Year: 0x0000 = 0
-// Month: 0x00 = 0 = 0x0
-// Day: 0x00 = 0
-// Creation Time = 0x01D04F6F:0xA226A470 = 01:50:07.415 PM 23/02/2015
-// X: 0x00000000:0x00000000
-// Size: 0x10 = 16
-// Data = cb: 16 lpb: 086DFAD3919FD44089199898CDCF4DC2
- byte[] objectId = {
- 0x04, 0x00, 0x00, 0x00, (byte) 0x82, 0x00, (byte) 0xE0, 0x00, 0x74, (byte) 0xC5, (byte) 0xB7, 0x10, 0x1A, (byte) 0x82, (byte) 0xE0, 0x08, // Byte Array ID
- 0x07, // Year Hi
- (byte) 0xde, // Year Low
- 0x0b, // Month
- 0x14, // Day
- 0x70, (byte) 0xA4, 0x26, (byte) 0xA2, 0x6F, 0x4F, (byte) 0xD0, 0x01, // Creation Time
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // X
- 0x10, 0x00, 0x00, 0x00, // Size
- 0x08, 0x6D, (byte) 0xFA, (byte) 0xD3, (byte) 0x91, (byte) 0x9F, (byte) 0xD4, 0x40, (byte) 0x89, 0x19, (byte) 0x98, (byte) 0x98, (byte) 0xCD, (byte) 0xCF, 0x4D, (byte) 0xC2 // Data
- };
-
- PSTGlobalObjectId object = new PSTGlobalObjectId(objectId);
-
- assertThat("Validate YearHi is correct", object.getYearLow(), equalTo(0x00DE));
- assertThat("Validate YearLow is correct", object.getYearHigh(), equalTo(0x7));
- assertThat("Validate Year is correct", object.getYear(), equalTo(2014));
- assertThat("Validate Day is correct", object.getDay(), equalTo(20));
- assertThat("Validate Month is correct", object.getMonth(), equalTo(11));
- assertThat("Validate CreationTimeLow is correct", object.getCreationTimeLow(), equalTo(0xA226A470));
- assertThat("Validate CreationTimeHigh is correct", object.getCreationTimeHigh(), equalTo(0x01D04F6F));
- assertThat("Validate CreationTime is correct", object.getCreationTime().getTime(), equalTo(new Date(1424699407415L).getTime()));
- assertThat("Validate Size is correct", object.getDataSize(), equalTo(16));
- assertThat("Validate Size of date matches actual data size", object.getData().length, equalTo(object.getDataSize()));
- assertThat("Validate Date is correct", PSTGlobalObjectId.bytesToHex(object.getData()), equalTo("086DFAD3919FD44089199898CDCF4DC2"));
- }
-
- @Test(expected = AssertionError.class)
- public void unpackWithInvalidIdSignature() {
- byte[] objectId = {
- 0x04, 0x00, 0x00, 0x00, (byte) 0x82, 0x00, (byte) 0xE0, 0x00, 0x74, (byte) 0xC5, (byte) 0xB7, 0x10, 0x1A, (byte) 0x82, (byte) 0xE0, 0x00, // Byte Array ID (last byte 00 rather then 08
- 0x07, // Year Hi
- (byte) 0xde, // Year Low
- 0x0b, // Month
- 0x14, // Day
- 0x70, (byte) 0xA4, 0x26, (byte) 0xA2, 0x6F, 0x4F, (byte) 0xD0, 0x01, // Creation Time
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // X
- 0x10, 0x00, 0x00, 0x00, // Size
- 0x08, 0x6D, (byte) 0xFA, (byte) 0xD3, (byte) 0x91, (byte) 0x9F, (byte) 0xD4, 0x40, (byte) 0x89, 0x19, (byte) 0x98, (byte) 0x98, (byte) 0xCD, (byte) 0xCF, 0x4D, (byte) 0xC2 // Data
- };
-
- PSTGlobalObjectId object = new PSTGlobalObjectId(objectId);
- }
-
- @Test(expected = AssertionError.class)
- public void unpackWithInvalidIdData() {
- byte[] objectId = {
- 0x04, 0x00, 0x00, 0x00, (byte) 0x82, 0x00, (byte) 0xE0, 0x00, 0x74, (byte) 0xC5, (byte) 0xB7, 0x10, 0x1A, (byte) 0x82, (byte) 0xE0, 0x08, // Byte Array ID
- 0x07, // Year Hi
- (byte) 0xde, // Year Low
- 0x0b, // Month
- 0x14, // Day
- 0x70, (byte) 0xA4, 0x26, (byte) 0xA2, 0x6F, 0x4F, (byte) 0xD0, 0x01, // Creation Time
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // X
- 0x10, 0x00, 0x00, 0x00, // Size
- 0x08, 0x6D, (byte) 0xFA, (byte) 0xD3, (byte) 0x91, (byte) 0x9F, (byte) 0xD4, 0x40, (byte) 0x89, 0x19, (byte) 0x98, (byte) 0x98, (byte) 0xCD, (byte) 0xCF, 0x4D // Data (missing last byte)
- };
-
- PSTGlobalObjectId object = new PSTGlobalObjectId(objectId);
- }
-
- @Test(expected = AssertionError.class)
- public void unpackWithInvalidIdDataLength() {
- byte[] objectId = {
- 0x04, 0x00, 0x00, 0x00, (byte) 0x82, 0x00, (byte) 0xE0, 0x00, 0x74, (byte) 0xC5, (byte) 0xB7, 0x10, 0x1A, (byte) 0x82, (byte) 0xE0, 0x08, // Byte Array ID
- 0x07, // Year Hi
- (byte) 0xde, // Year Low
- 0x0b, // Month
- 0x14, // Day
- 0x70, (byte) 0xA4, 0x26, (byte) 0xA2, 0x6F, 0x4F, (byte) 0xD0, 0x01, // Creation Time
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // X
- 0x10, 0x10, 0x00, 0x00, // Size
- 0x08, 0x6D, (byte) 0xFA, (byte) 0xD3, (byte) 0x91, (byte) 0x9F, (byte) 0xD4, 0x40, (byte) 0x89, 0x19, (byte) 0x98, (byte) 0x98, (byte) 0xCD, (byte) 0xCF, 0x4D, (byte) 0xC2 // Data
- };
-
- PSTGlobalObjectId object = new PSTGlobalObjectId(objectId);
- }
-}
diff --git a/src/test/java/com/pff/PasswordTest.java b/src/test/java/com/pff/PasswordTest.java
deleted file mode 100644
index bfcdfb0..0000000
--- a/src/test/java/com/pff/PasswordTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.pff;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.HashSet;
-import java.util.Arrays;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for {@link PSTDistList}.
- *
- * @author Richard Johnson
- */
-@RunWith(JUnit4.class)
-public class PasswordTest {
-
- /**
- * Test for password protectedness.
- */
- @Test
- public final void testPasswordProtected()
- throws PSTException, IOException, URISyntaxException {
- URL dirUrl = ClassLoader.getSystemResource("passworded.pst");
- PSTFile pstFile = new PSTFile(new File(dirUrl.toURI()));
- Assert.assertEquals("Is password protected",
- pstFile.getMessageStore().isPasswordProtected(),
- true);
- }
-
- /**
- * Test for non-password protectedness.
- */
- @Test
- public final void testNotPasswordProtected()
- throws PSTException, IOException, URISyntaxException {
- URL dirUrl = ClassLoader.getSystemResource("dist-list.pst");
- PSTFile pstFile = new PSTFile(new File(dirUrl.toURI()));
- Assert.assertEquals("Is password protected",
- pstFile.getMessageStore().isPasswordProtected(),
- false);
- }
-}
diff --git a/src/test/java/com/pff/Version36Test.java b/src/test/java/com/pff/Version36Test.java
deleted file mode 100644
index 4e0484e..0000000
--- a/src/test/java/com/pff/Version36Test.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.pff;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.*;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class Version36Test {
-
- @Test
- public final void testVersion36()
- throws PSTException, IOException, URISyntaxException {
- URL dirUrl = ClassLoader.getSystemResource("example-2013.ost");
- PSTFile pstFile2 = new PSTFile(new File(dirUrl.toURI()));
- PSTFolder inbox = (PSTFolder)PSTObject.detectAndLoadPSTObject(pstFile2, 8578);
- Assert.assertEquals(
- "Number of emails in folder",
- inbox.getContentCount(),
- 2);
- PSTMessage msg = (PSTMessage)PSTObject.detectAndLoadPSTObject(pstFile2, 2097284);
- Assert.assertEquals(
- "correct email text.",
- "This is an e-mail message sent automatically by Microsoft "
- + "Outlook while testing the settings for your account.",
- msg.getBodyHTML().trim());
- //processFolder(pstFile2.getRootFolder());
- }
-
- int depth = -1;
- public void processFolder(PSTFolder folder)
- throws PSTException, java.io.IOException {
- depth++;
- // the root folder doesn't have a display name
- if (depth > 0) {
- printDepth();
- System.out.println("Folder: " + folder.getDescriptorNodeId() + " - " + folder.getDisplayName());
- }
-
- // go through the folders...
- if (folder.hasSubfolders()) {
- Vector childFolders = folder.getSubFolders();
- for (PSTFolder childFolder : childFolders) {
- processFolder(childFolder);
- }
- }
-
- // and now the emails for this folder
- if (folder.getContentCount() > 0) {
- depth++;
- PSTMessage email = (PSTMessage)folder.getNextChild();
- while (email != null) {
- printDepth();
- System.out.println("Email: "+ email.getDescriptorNodeId() + " - " + email.getSubject());
- email = (PSTMessage)folder.getNextChild();
- }
- depth--;
- }
- depth--;
- }
-
- public void printDepth() {
- for (int x = 0; x < depth-1; x++) {
- System.out.print(" | ");
- }
- System.out.print(" |- ");
- }
-}
diff --git a/src/test/resources/dist-list.pst b/src/test/resources/dist-list.pst
deleted file mode 100644
index 9afadc5..0000000
Binary files a/src/test/resources/dist-list.pst and /dev/null differ
diff --git a/src/test/resources/example-2013.ost b/src/test/resources/example-2013.ost
deleted file mode 100644
index 8b1e9c1..0000000
Binary files a/src/test/resources/example-2013.ost and /dev/null differ
diff --git a/src/test/resources/passworded.pst b/src/test/resources/passworded.pst
deleted file mode 100644
index 39fee6b..0000000
Binary files a/src/test/resources/passworded.pst and /dev/null differ
diff --git a/stylesheet.css b/stylesheet.css
new file mode 100644
index 0000000..98055b2
--- /dev/null
+++ b/stylesheet.css
@@ -0,0 +1,574 @@
+/* Javadoc style sheet */
+/*
+Overall document style
+*/
+
+@import url('resources/fonts/dejavu.css');
+
+body {
+ background-color:#ffffff;
+ color:#353833;
+ font-family:'DejaVu Sans', Arial, Helvetica, sans-serif;
+ font-size:14px;
+ margin:0;
+}
+a:link, a:visited {
+ text-decoration:none;
+ color:#4A6782;
+}
+a:hover, a:focus {
+ text-decoration:none;
+ color:#bb7a2a;
+}
+a:active {
+ text-decoration:none;
+ color:#4A6782;
+}
+a[name] {
+ color:#353833;
+}
+a[name]:hover {
+ text-decoration:none;
+ color:#353833;
+}
+pre {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+}
+h1 {
+ font-size:20px;
+}
+h2 {
+ font-size:18px;
+}
+h3 {
+ font-size:16px;
+ font-style:italic;
+}
+h4 {
+ font-size:13px;
+}
+h5 {
+ font-size:12px;
+}
+h6 {
+ font-size:11px;
+}
+ul {
+ list-style-type:disc;
+}
+code, tt {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ padding-top:4px;
+ margin-top:8px;
+ line-height:1.4em;
+}
+dt code {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ padding-top:4px;
+}
+table tr td dt code {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ vertical-align:top;
+ padding-top:4px;
+}
+sup {
+ font-size:8px;
+}
+/*
+Document title and Copyright styles
+*/
+.clear {
+ clear:both;
+ height:0px;
+ overflow:hidden;
+}
+.aboutLanguage {
+ float:right;
+ padding:0px 21px;
+ font-size:11px;
+ z-index:200;
+ margin-top:-9px;
+}
+.legalCopy {
+ margin-left:.5em;
+}
+.bar a, .bar a:link, .bar a:visited, .bar a:active {
+ color:#FFFFFF;
+ text-decoration:none;
+}
+.bar a:hover, .bar a:focus {
+ color:#bb7a2a;
+}
+.tab {
+ background-color:#0066FF;
+ color:#ffffff;
+ padding:8px;
+ width:5em;
+ font-weight:bold;
+}
+/*
+Navigation bar styles
+*/
+.bar {
+ background-color:#4D7A97;
+ color:#FFFFFF;
+ padding:.8em .5em .4em .8em;
+ height:auto;/*height:1.8em;*/
+ font-size:11px;
+ margin:0;
+}
+.topNav {
+ background-color:#4D7A97;
+ color:#FFFFFF;
+ float:left;
+ padding:0;
+ width:100%;
+ clear:right;
+ height:2.8em;
+ padding-top:10px;
+ overflow:hidden;
+ font-size:12px;
+}
+.bottomNav {
+ margin-top:10px;
+ background-color:#4D7A97;
+ color:#FFFFFF;
+ float:left;
+ padding:0;
+ width:100%;
+ clear:right;
+ height:2.8em;
+ padding-top:10px;
+ overflow:hidden;
+ font-size:12px;
+}
+.subNav {
+ background-color:#dee3e9;
+ float:left;
+ width:100%;
+ overflow:hidden;
+ font-size:12px;
+}
+.subNav div {
+ clear:left;
+ float:left;
+ padding:0 0 5px 6px;
+ text-transform:uppercase;
+}
+ul.navList, ul.subNavList {
+ float:left;
+ margin:0 25px 0 0;
+ padding:0;
+}
+ul.navList li{
+ list-style:none;
+ float:left;
+ padding: 5px 6px;
+ text-transform:uppercase;
+}
+ul.subNavList li{
+ list-style:none;
+ float:left;
+}
+.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited {
+ color:#FFFFFF;
+ text-decoration:none;
+ text-transform:uppercase;
+}
+.topNav a:hover, .bottomNav a:hover {
+ text-decoration:none;
+ color:#bb7a2a;
+ text-transform:uppercase;
+}
+.navBarCell1Rev {
+ background-color:#F8981D;
+ color:#253441;
+ margin: auto 5px;
+}
+.skipNav {
+ position:absolute;
+ top:auto;
+ left:-9999px;
+ overflow:hidden;
+}
+/*
+Page header and footer styles
+*/
+.header, .footer {
+ clear:both;
+ margin:0 20px;
+ padding:5px 0 0 0;
+}
+.indexHeader {
+ margin:10px;
+ position:relative;
+}
+.indexHeader span{
+ margin-right:15px;
+}
+.indexHeader h1 {
+ font-size:13px;
+}
+.title {
+ color:#2c4557;
+ margin:10px 0;
+}
+.subTitle {
+ margin:5px 0 0 0;
+}
+.header ul {
+ margin:0 0 15px 0;
+ padding:0;
+}
+.footer ul {
+ margin:20px 0 5px 0;
+}
+.header ul li, .footer ul li {
+ list-style:none;
+ font-size:13px;
+}
+/*
+Heading styles
+*/
+div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
+ background-color:#dee3e9;
+ border:1px solid #d0d9e0;
+ margin:0 0 6px -8px;
+ padding:7px 5px;
+}
+ul.blockList ul.blockList ul.blockList li.blockList h3 {
+ background-color:#dee3e9;
+ border:1px solid #d0d9e0;
+ margin:0 0 6px -8px;
+ padding:7px 5px;
+}
+ul.blockList ul.blockList li.blockList h3 {
+ padding:0;
+ margin:15px 0;
+}
+ul.blockList li.blockList h2 {
+ padding:0px 0 20px 0;
+}
+/*
+Page layout container styles
+*/
+.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer {
+ clear:both;
+ padding:10px 20px;
+ position:relative;
+}
+.indexContainer {
+ margin:10px;
+ position:relative;
+ font-size:12px;
+}
+.indexContainer h2 {
+ font-size:13px;
+ padding:0 0 3px 0;
+}
+.indexContainer ul {
+ margin:0;
+ padding:0;
+}
+.indexContainer ul li {
+ list-style:none;
+ padding-top:2px;
+}
+.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt {
+ font-size:12px;
+ font-weight:bold;
+ margin:10px 0 0 0;
+ color:#4E4E4E;
+}
+.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd {
+ margin:5px 0 10px 0px;
+ font-size:14px;
+ font-family:'DejaVu Sans Mono',monospace;
+}
+.serializedFormContainer dl.nameValue dt {
+ margin-left:1px;
+ font-size:1.1em;
+ display:inline;
+ font-weight:bold;
+}
+.serializedFormContainer dl.nameValue dd {
+ margin:0 0 0 1px;
+ font-size:1.1em;
+ display:inline;
+}
+/*
+List styles
+*/
+ul.horizontal li {
+ display:inline;
+ font-size:0.9em;
+}
+ul.inheritance {
+ margin:0;
+ padding:0;
+}
+ul.inheritance li {
+ display:inline;
+ list-style:none;
+}
+ul.inheritance li ul.inheritance {
+ margin-left:15px;
+ padding-left:15px;
+ padding-top:1px;
+}
+ul.blockList, ul.blockListLast {
+ margin:10px 0 10px 0;
+ padding:0;
+}
+ul.blockList li.blockList, ul.blockListLast li.blockList {
+ list-style:none;
+ margin-bottom:15px;
+ line-height:1.4;
+}
+ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList {
+ padding:0px 20px 5px 10px;
+ border:1px solid #ededed;
+ background-color:#f8f8f8;
+}
+ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList {
+ padding:0 0 5px 8px;
+ background-color:#ffffff;
+ border:none;
+}
+ul.blockList ul.blockList ul.blockList ul.blockList li.blockList {
+ margin-left:0;
+ padding-left:0;
+ padding-bottom:15px;
+ border:none;
+}
+ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast {
+ list-style:none;
+ border-bottom:none;
+ padding-bottom:0;
+}
+table tr td dl, table tr td dl dt, table tr td dl dd {
+ margin-top:0;
+ margin-bottom:1px;
+}
+/*
+Table styles
+*/
+.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary {
+ width:100%;
+ border-left:1px solid #EEE;
+ border-right:1px solid #EEE;
+ border-bottom:1px solid #EEE;
+}
+.overviewSummary, .memberSummary {
+ padding:0px;
+}
+.overviewSummary caption, .memberSummary caption, .typeSummary caption,
+.useSummary caption, .constantsSummary caption, .deprecatedSummary caption {
+ position:relative;
+ text-align:left;
+ background-repeat:no-repeat;
+ color:#253441;
+ font-weight:bold;
+ clear:none;
+ overflow:hidden;
+ padding:0px;
+ padding-top:10px;
+ padding-left:1px;
+ margin:0px;
+ white-space:pre;
+}
+.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link,
+.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link,
+.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover,
+.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover,
+.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active,
+.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active,
+.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited,
+.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited {
+ color:#FFFFFF;
+}
+.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span,
+.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span {
+ white-space:nowrap;
+ padding-top:5px;
+ padding-left:12px;
+ padding-right:12px;
+ padding-bottom:7px;
+ display:inline-block;
+ float:left;
+ background-color:#F8981D;
+ border: none;
+ height:16px;
+}
+.memberSummary caption span.activeTableTab span {
+ white-space:nowrap;
+ padding-top:5px;
+ padding-left:12px;
+ padding-right:12px;
+ margin-right:3px;
+ display:inline-block;
+ float:left;
+ background-color:#F8981D;
+ height:16px;
+}
+.memberSummary caption span.tableTab span {
+ white-space:nowrap;
+ padding-top:5px;
+ padding-left:12px;
+ padding-right:12px;
+ margin-right:3px;
+ display:inline-block;
+ float:left;
+ background-color:#4D7A97;
+ height:16px;
+}
+.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab {
+ padding-top:0px;
+ padding-left:0px;
+ padding-right:0px;
+ background-image:none;
+ float:none;
+ display:inline;
+}
+.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd,
+.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd {
+ display:none;
+ width:5px;
+ position:relative;
+ float:left;
+ background-color:#F8981D;
+}
+.memberSummary .activeTableTab .tabEnd {
+ display:none;
+ width:5px;
+ margin-right:3px;
+ position:relative;
+ float:left;
+ background-color:#F8981D;
+}
+.memberSummary .tableTab .tabEnd {
+ display:none;
+ width:5px;
+ margin-right:3px;
+ position:relative;
+ background-color:#4D7A97;
+ float:left;
+
+}
+.overviewSummary td, .memberSummary td, .typeSummary td,
+.useSummary td, .constantsSummary td, .deprecatedSummary td {
+ text-align:left;
+ padding:0px 0px 12px 10px;
+}
+th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th,
+td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{
+ vertical-align:top;
+ padding-right:0px;
+ padding-top:8px;
+ padding-bottom:3px;
+}
+th.colFirst, th.colLast, th.colOne, .constantsSummary th {
+ background:#dee3e9;
+ text-align:left;
+ padding:8px 3px 3px 7px;
+}
+td.colFirst, th.colFirst {
+ white-space:nowrap;
+ font-size:13px;
+}
+td.colLast, th.colLast {
+ font-size:13px;
+}
+td.colOne, th.colOne {
+ font-size:13px;
+}
+.overviewSummary td.colFirst, .overviewSummary th.colFirst,
+.useSummary td.colFirst, .useSummary th.colFirst,
+.overviewSummary td.colOne, .overviewSummary th.colOne,
+.memberSummary td.colFirst, .memberSummary th.colFirst,
+.memberSummary td.colOne, .memberSummary th.colOne,
+.typeSummary td.colFirst{
+ width:25%;
+ vertical-align:top;
+}
+td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover {
+ font-weight:bold;
+}
+.tableSubHeadingColor {
+ background-color:#EEEEFF;
+}
+.altColor {
+ background-color:#FFFFFF;
+}
+.rowColor {
+ background-color:#EEEEEF;
+}
+/*
+Content styles
+*/
+.description pre {
+ margin-top:0;
+}
+.deprecatedContent {
+ margin:0;
+ padding:10px 0;
+}
+.docSummary {
+ padding:0;
+}
+
+ul.blockList ul.blockList ul.blockList li.blockList h3 {
+ font-style:normal;
+}
+
+div.block {
+ font-size:14px;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+}
+
+td.colLast div {
+ padding-top:0px;
+}
+
+
+td.colLast a {
+ padding-bottom:3px;
+}
+/*
+Formatting effect styles
+*/
+.sourceLineNo {
+ color:green;
+ padding:0 30px 0 0;
+}
+h1.hidden {
+ visibility:hidden;
+ overflow:hidden;
+ font-size:10px;
+}
+.block {
+ display:block;
+ margin:3px 10px 2px 0px;
+ color:#474747;
+}
+.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink,
+.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel,
+.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink {
+ font-weight:bold;
+}
+.deprecationComment, .emphasizedPhrase, .interfaceName {
+ font-style:italic;
+}
+
+div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase,
+div.block div.block span.interfaceName {
+ font-style:normal;
+}
+
+div.contentContainer ul.blockList li.blockList h2{
+ padding-bottom:0px;
+}