diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 07827cc..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target/ -.idea/ \ No newline at end of file diff --git a/LICENSE.APACHE-2.0.txt b/LICENSE.APACHE-2.0.txt deleted file mode 100644 index ade750b..0000000 --- a/LICENSE.APACHE-2.0.txt +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/LICENSE.LGPL.txt b/LICENSE.LGPL.txt deleted file mode 100644 index 65c5ca8..0000000 --- a/LICENSE.LGPL.txt +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/README.md b/README.md deleted file mode 100644 index bfcb508..0000000 --- a/README.md +++ /dev/null @@ -1,120 +0,0 @@ -The PST File format is used by Outlook for the storage of emails. Over the years many people have accumulated a large amount of important email and other information into these files, this project aims to allow people to access and extract this information so that it may be migrated to other messaging systems. - -This project was originally based off the documentation created through the fantastic reverse engineering effort made by the [libpff](https://sourceforge.net/projects/libpff) project. The library has been improved with information provided by the release of the official PST specs by Microsoft. - -The functional goals are: - - * Efficiency; should be able to work with very large PST files with reasonable speed - * Support for compressible encryption (on by default with newer versions of Outlook) - * Intuitive API - * Support for ANSI (32bit), Unicode (64bit) Outlook PST and Exchange OST Files. - -Things that the library will most likely not do: - - * Fix or work with broken PST files - * Provide write access to PST files - * Recover deleted email items - -For example usage of the library please see the TestGui application stored in the examples folder. Javadocs are available here: http://rjohnsondev.github.io/java-libpst - -Accessing the contents of a PSTFile is a matter of following the folder structure down to the desired email. This example reads a PST and prints the tree structure to the console: - -```java -package example; -import com.pff.*; -import java.util.*; - -public class Test { - public static void main(String[] args) - { - new Test(args[0]); - } - - public Test(String filename) { - try { - PSTFile pstFile = new PSTFile(filename); - System.out.println(pstFile.getMessageStore().getDisplayName()); - processFolder(pstFile.getRootFolder()); - } catch (Exception err) { - err.printStackTrace(); - } - } - - 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.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.getSubject()); - email = (PSTMessage)folder.getNextChild(); - } - depth--; - } - depth--; - } - - public void printDepth() { - for (int x = 0; x < depth-1; x++) { - System.out.print(" | "); - } - System.out.print(" |- "); - } -} -``` - -Attachments can be read through PSTAttachment.getFileInputStream like so: - -```java -int numberOfAttachments = email.getNumberOfAttachments(); -for (int x = 0; x < numberOfAttachments; x++) { - PSTAttachment attach = email.getAttachment(x); - InputStream attachmentStream = attach.getFileInputStream(); - // both long and short filenames can be used for attachments - String filename = attach.getLongFilename(); - if (filename.isEmpty()) { - filename = attach.getFilename(); - } - FileOutputStream out = new FileOutputStream(filename); - // 8176 is the block size used internally and should give the best performance - int bufferSize = 8176; - byte[] buffer = new byte[bufferSize]; - int count = attachmentStream.read(buffer); - while (count == bufferSize) { - out.write(buffer); - count = attachmentStream.read(buffer); - } - byte[] endBuffer = new byte[count]; - System.arraycopy(buffer, 0, endBuffer, 0, count); - out.write(endBuffer); - out.close(); - attachmentStream.close(); -} -``` - -Each object in the PST has a unique identifier called a descriptor node id. This can be useful for retrieving known objects quickly from the PST: - -```java -long id = email.getDescriptorNodeId(); -pstObject = PSTObject.detectAndLoadPSTObject(pstFile, id); -``` - diff --git a/README.txt b/README.txt deleted file mode 100644 index eec6594..0000000 --- a/README.txt +++ /dev/null @@ -1,5 +0,0 @@ -java-libpst is a pure java library for the reading of Outlook PST and OST files. - -For usage example, please see the javadocs and the example program located in the example package. - -java-libpst is licensed under both the LGPL and Apache License v2.0 \ No newline at end of file diff --git a/allclasses-frame.html b/allclasses-frame.html new file mode 100644 index 0000000..7336407 --- /dev/null +++ b/allclasses-frame.html @@ -0,0 +1,46 @@ + + + + + + +All Classes (java-libpst 0.9.3-SNAPSHOT API) + + + + + +

All Classes

+ + + diff --git a/allclasses-noframe.html b/allclasses-noframe.html new file mode 100644 index 0000000..71ce6aa --- /dev/null +++ b/allclasses-noframe.html @@ -0,0 +1,46 @@ + + + + + + +All Classes (java-libpst 0.9.3-SNAPSHOT API) + + + + + +

All Classes

+ + + diff --git a/com/pff/DescriptorIndexNode.html b/com/pff/DescriptorIndexNode.html new file mode 100644 index 0000000..6dcbd0a --- /dev/null +++ b/com/pff/DescriptorIndexNode.html @@ -0,0 +1,337 @@ + + + + + + +DescriptorIndexNode (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class DescriptorIndexNode

+
+
+ +
+
    +
  • +
    +
    +
    public class DescriptorIndexNode
    +extends Object
    +
    DescriptorIndexNode is a leaf item from the Descriptor index b-tree + It is like a pointer to an element in the PST file, everything has one...
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        descriptorIdentifier

        +
        public int descriptorIdentifier
        +
      • +
      + + + +
        +
      • +

        dataOffsetIndexIdentifier

        +
        public long dataOffsetIndexIdentifier
        +
      • +
      + + + +
        +
      • +

        localDescriptorsOffsetIndexIdentifier

        +
        public long localDescriptorsOffsetIndexIdentifier
        +
      • +
      + + + +
        +
      • +

        parentDescriptorIndexIdentifier

        +
        public int parentDescriptorIndexIdentifier
        +
      • +
      + + + +
        +
      • +

        itemType

        +
        public int itemType
        +
      • +
      +
    • +
    + + +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/LZFu.html b/com/pff/LZFu.html new file mode 100644 index 0000000..2361fe1 --- /dev/null +++ b/com/pff/LZFu.html @@ -0,0 +1,323 @@ + + + + + + +LZFu (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class LZFu

+
+
+ +
+
    +
  • +
    +
    +
    public class LZFu
    +extends Object
    +
    An implementation of the LZFu algorithm to decompress RTF content
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+ +
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTActivity.html b/com/pff/PSTActivity.html new file mode 100644 index 0000000..1f57678 --- /dev/null +++ b/com/pff/PSTActivity.html @@ -0,0 +1,529 @@ + + + + + + +PSTActivity (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTActivity

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTActivity
    +extends PSTMessage
    +
    PSTActivity represents Journal entries
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+
    +
  • + + + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getLogType

        +
        public String getLogType()
        +
        Type
        +
      • +
      + + + +
        +
      • +

        getLogStart

        +
        public Date getLogStart()
        +
        Start
        +
      • +
      + + + +
        +
      • +

        getLogDuration

        +
        public int getLogDuration()
        +
        Duration
        +
      • +
      + + + +
        +
      • +

        getLogEnd

        +
        public Date getLogEnd()
        +
        End
        +
      • +
      + + + +
        +
      • +

        getLogFlags

        +
        public int getLogFlags()
        +
        LogFlags
        +
      • +
      + + + +
        +
      • +

        isDocumentPrinted

        +
        public boolean isDocumentPrinted()
        +
        DocPrinted
        +
      • +
      + + + +
        +
      • +

        isDocumentSaved

        +
        public boolean isDocumentSaved()
        +
        DocSaved
        +
      • +
      + + + +
        +
      • +

        isDocumentRouted

        +
        public boolean isDocumentRouted()
        +
        DocRouted
        +
      • +
      + + + +
        +
      • +

        isDocumentPosted

        +
        public boolean isDocumentPosted()
        +
        DocPosted
        +
      • +
      + + + +
        +
      • +

        getLogTypeDesc

        +
        public String getLogTypeDesc()
        +
        Type Description
        +
      • +
      + + + +
        +
      • +

        toString

        +
        public String toString()
        +
        Description copied from class: PSTMessage
        +
        string representation of this email
        +
        +
        Overrides:
        +
        toString in class PSTMessage
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTAppointment.html b/com/pff/PSTAppointment.html new file mode 100644 index 0000000..806b4aa --- /dev/null +++ b/com/pff/PSTAppointment.html @@ -0,0 +1,810 @@ + + + + + + +PSTAppointment (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTAppointment

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTAppointment
    +extends PSTMessage
    +
    PSTAppointment is for Calendar items
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getSendAsICAL

        +
        public boolean getSendAsICAL()
        +
      • +
      + + + +
        +
      • +

        getBusyStatus

        +
        public int getBusyStatus()
        +
      • +
      + + + +
        +
      • +

        getShowAsBusy

        +
        public boolean getShowAsBusy()
        +
      • +
      + + + +
        +
      • +

        getLocation

        +
        public String getLocation()
        +
      • +
      + + + +
        +
      • +

        getStartTime

        +
        public Date getStartTime()
        +
      • +
      + + + +
        +
      • +

        getStartTimeZone

        +
        public PSTTimeZone getStartTimeZone()
        +
      • +
      + + + +
        +
      • +

        getEndTime

        +
        public Date getEndTime()
        +
      • +
      + + + +
        +
      • +

        getEndTimeZone

        +
        public PSTTimeZone getEndTimeZone()
        +
      • +
      + + + +
        +
      • +

        getRecurrenceTimeZone

        +
        public PSTTimeZone getRecurrenceTimeZone()
        +
      • +
      + + + +
        +
      • +

        getDuration

        +
        public int getDuration()
        +
      • +
      + + + +
        +
      • +

        getColor

        +
        public int getColor()
        +
      • +
      + + + +
        +
      • +

        getSubType

        +
        public boolean getSubType()
        +
      • +
      + + + +
        +
      • +

        getMeetingStatus

        +
        public int getMeetingStatus()
        +
      • +
      + + + +
        +
      • +

        getResponseStatus

        +
        public int getResponseStatus()
        +
      • +
      + + + +
        +
      • +

        isRecurring

        +
        public boolean isRecurring()
        +
      • +
      + + + +
        +
      • +

        getRecurrenceBase

        +
        public Date getRecurrenceBase()
        +
      • +
      + + + +
        +
      • +

        getRecurrenceType

        +
        public int getRecurrenceType()
        +
      • +
      + + + +
        +
      • +

        getRecurrencePattern

        +
        public String getRecurrencePattern()
        +
      • +
      + + + +
        +
      • +

        getRecurrenceStructure

        +
        public byte[] getRecurrenceStructure()
        +
      • +
      + + + +
        +
      • +

        getTimezone

        +
        public byte[] getTimezone()
        +
      • +
      + + + +
        +
      • +

        getAllAttendees

        +
        public String getAllAttendees()
        +
      • +
      + + + +
        +
      • +

        getToAttendees

        +
        public String getToAttendees()
        +
      • +
      + + + +
        +
      • +

        getCCAttendees

        +
        public String getCCAttendees()
        +
      • +
      + + + +
        +
      • +

        getAppointmentSequence

        +
        public int getAppointmentSequence()
        +
      • +
      + + + +
        +
      • +

        isOnlineMeeting

        +
        public boolean isOnlineMeeting()
        +
      • +
      + + + +
        +
      • +

        getNetMeetingType

        +
        public int getNetMeetingType()
        +
      • +
      + + + +
        +
      • +

        getNetMeetingServer

        +
        public String getNetMeetingServer()
        +
      • +
      + + + +
        +
      • +

        getNetMeetingOrganizerAlias

        +
        public String getNetMeetingOrganizerAlias()
        +
      • +
      + + + +
        +
      • +

        getNetMeetingAutostart

        +
        public boolean getNetMeetingAutostart()
        +
      • +
      + + + +
        +
      • +

        getConferenceServerAllowExternal

        +
        public boolean getConferenceServerAllowExternal()
        +
      • +
      + + + +
        +
      • +

        getNetMeetingDocumentPathName

        +
        public String getNetMeetingDocumentPathName()
        +
      • +
      + + + +
        +
      • +

        getNetShowURL

        +
        public String getNetShowURL()
        +
      • +
      + + + +
        +
      • +

        getAttendeeCriticalChange

        +
        public Date getAttendeeCriticalChange()
        +
      • +
      + + + +
        +
      • +

        getOwnerCriticalChange

        +
        public Date getOwnerCriticalChange()
        +
      • +
      + + + +
        +
      • +

        getConferenceServerPassword

        +
        public String getConferenceServerPassword()
        +
      • +
      + + + +
        +
      • +

        getAppointmentCounterProposal

        +
        public boolean getAppointmentCounterProposal()
        +
      • +
      + + + +
        +
      • +

        isSilent

        +
        public boolean isSilent()
        +
      • +
      + + + +
        +
      • +

        getRequiredAttendees

        +
        public String getRequiredAttendees()
        +
      • +
      + + + +
        +
      • +

        getLocaleId

        +
        public int getLocaleId()
        +
      • +
      + + + + + + + + +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTAppointmentException.html b/com/pff/PSTAppointmentException.html new file mode 100644 index 0000000..2000264 --- /dev/null +++ b/com/pff/PSTAppointmentException.html @@ -0,0 +1,478 @@ + + + + + + +PSTAppointmentException (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTAppointmentException

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTAppointmentException
    +extends Object
    +
    Class containing information on exceptions to a recurring appointment
    +
    +
    Author:
    +
    Orin Eman
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getSubject

        +
        public String getSubject()
        +
      • +
      + + + +
        +
      • +

        getMeetingType

        +
        public int getMeetingType()
        +
      • +
      + + + +
        +
      • +

        getReminderDelta

        +
        public int getReminderDelta()
        +
      • +
      + + + +
        +
      • +

        getReminderSet

        +
        public boolean getReminderSet()
        +
      • +
      + + + +
        +
      • +

        getLocation

        +
        public String getLocation()
        +
      • +
      + + + +
        +
      • +

        getBusyStatus

        +
        public int getBusyStatus()
        +
      • +
      + + + +
        +
      • +

        getSubType

        +
        public boolean getSubType()
        +
      • +
      + + + +
        +
      • +

        getDescription

        +
        public String getDescription()
        +
      • +
      + + + +
        +
      • +

        getDTStamp

        +
        public Date getDTStamp()
        +
      • +
      + + + +
        +
      • +

        getStartDateTime

        +
        public int getStartDateTime()
        +
      • +
      + + + +
        +
      • +

        getEndDateTime

        +
        public int getEndDateTime()
        +
      • +
      + + + +
        +
      • +

        getOriginalStartDate

        +
        public int getOriginalStartDate()
        +
      • +
      + + + +
        +
      • +

        getAppointmentSequence

        +
        public int getAppointmentSequence(int def)
        +
      • +
      + + + +
        +
      • +

        getImportance

        +
        public int getImportance(int def)
        +
      • +
      + + + +
        +
      • +

        getSubjectBytes

        +
        public byte[] getSubjectBytes()
        +
      • +
      + + + +
        +
      • +

        getLocationBytes

        +
        public byte[] getLocationBytes()
        +
      • +
      + + + +
        +
      • +

        attachmentsPresent

        +
        public boolean attachmentsPresent()
        +
      • +
      + + + +
        +
      • +

        embeddedMessagePresent

        +
        public boolean embeddedMessagePresent()
        +
      • +
      + + + +
        +
      • +

        getEmbeddedMessage

        +
        public PSTAppointment getEmbeddedMessage()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTAppointmentRecurrence.html b/com/pff/PSTAppointmentRecurrence.html new file mode 100644 index 0000000..72a54d2 --- /dev/null +++ b/com/pff/PSTAppointmentRecurrence.html @@ -0,0 +1,529 @@ + + + + + + +PSTAppointmentRecurrence (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTAppointmentRecurrence

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTAppointmentRecurrence
    +extends Object
    +
    Class containing recurrence information for a recurring appointment
    +
    +
    Author:
    +
    Orin Eman
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        PSTAppointmentRecurrence

        +
        public PSTAppointmentRecurrence(byte[] recurrencePattern,
        +                                PSTAppointment appt,
        +                                PSTTimeZone tz)
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getExceptionCount

        +
        public short getExceptionCount()
        +
      • +
      + + + + + + + +
        +
      • +

        getDeletedInstanceDates

        +
        public Calendar[] getDeletedInstanceDates()
        +
      • +
      + + + +
        +
      • +

        getModifiedInstanceDates

        +
        public Calendar[] getModifiedInstanceDates()
        +
      • +
      + + + +
        +
      • +

        getCalendarType

        +
        public short getCalendarType()
        +
      • +
      + + + +
        +
      • +

        getPatternType

        +
        public short getPatternType()
        +
      • +
      + + + +
        +
      • +

        getPeriod

        +
        public int getPeriod()
        +
      • +
      + + + +
        +
      • +

        getPatternSpecific

        +
        public int getPatternSpecific()
        +
      • +
      + + + +
        +
      • +

        getFirstDOW

        +
        public int getFirstDOW()
        +
      • +
      + + + +
        +
      • +

        getPatternSpecificNth

        +
        public int getPatternSpecificNth()
        +
      • +
      + + + +
        +
      • +

        getFirstDateTime

        +
        public int getFirstDateTime()
        +
      • +
      + + + +
        +
      • +

        getEndType

        +
        public int getEndType()
        +
      • +
      + + + +
        +
      • +

        getOccurrenceCount

        +
        public int getOccurrenceCount()
        +
      • +
      + + + +
        +
      • +

        getEndDate

        +
        public int getEndDate()
        +
      • +
      + + + +
        +
      • +

        getStartTimeOffset

        +
        public int getStartTimeOffset()
        +
      • +
      + + + +
        +
      • +

        getTimeZone

        +
        public PSTTimeZone getTimeZone()
        +
      • +
      + + + +
        +
      • +

        getRecurFrequency

        +
        public int getRecurFrequency()
        +
      • +
      + + + +
        +
      • +

        getSlidingFlag

        +
        public int getSlidingFlag()
        +
      • +
      + + + +
        +
      • +

        getStartDate

        +
        public int getStartDate()
        +
      • +
      + + + +
        +
      • +

        getEndTimeOffset

        +
        public int getEndTimeOffset()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTAttachment.html b/com/pff/PSTAttachment.html new file mode 100644 index 0000000..e01c881 --- /dev/null +++ b/com/pff/PSTAttachment.html @@ -0,0 +1,743 @@ + + + + + + +PSTAttachment (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTAttachment

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTAttachment
    +extends PSTObject
    +
    Class containing attachment information.
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        ATTACHMENT_METHOD_NONE

        +
        public static final int ATTACHMENT_METHOD_NONE
        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
      + + + +
        +
      • +

        ATTACHMENT_METHOD_BY_VALUE

        +
        public static final int ATTACHMENT_METHOD_BY_VALUE
        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
      + + + +
        +
      • +

        ATTACHMENT_METHOD_BY_REFERENCE

        +
        public static final int ATTACHMENT_METHOD_BY_REFERENCE
        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
      + + + +
        +
      • +

        ATTACHMENT_METHOD_BY_REFERENCE_RESOLVE

        +
        public static final int ATTACHMENT_METHOD_BY_REFERENCE_RESOLVE
        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
      + + + +
        +
      • +

        ATTACHMENT_METHOD_BY_REFERENCE_ONLY

        +
        public static final int ATTACHMENT_METHOD_BY_REFERENCE_ONLY
        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
      + + + +
        +
      • +

        ATTACHMENT_METHOD_EMBEDDED

        +
        public static final int ATTACHMENT_METHOD_EMBEDDED
        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
      + + + +
        +
      • +

        ATTACHMENT_METHOD_OLE

        +
        public static final int ATTACHMENT_METHOD_OLE
        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getSize

        +
        public int getSize()
        +
      • +
      + + + + + + + +
        +
      • +

        getModificationTime

        +
        public Date getModificationTime()
        +
      • +
      + + + + + + + + + + + + + + + +
        +
      • +

        getFilename

        +
        public String getFilename()
        +
        Attachment (short) filename ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getAttachMethod

        +
        public int getAttachMethod()
        +
        Attachment method Integer 32-bit signed 0 => None (No attachment) 1 => By + value 2 => By reference 3 => By reference resolve 4 => By reference only + 5 => Embedded message 6 => OLE
        +
      • +
      + + + +
        +
      • +

        getAttachSize

        +
        public int getAttachSize()
        +
        Attachment size
        +
      • +
      + + + +
        +
      • +

        getAttachNum

        +
        public int getAttachNum()
        +
        Attachment number
        +
      • +
      + + + +
        +
      • +

        getLongFilename

        +
        public String getLongFilename()
        +
        Attachment long filename ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getPathname

        +
        public String getPathname()
        +
        Attachment (short) pathname ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getRenderingPosition

        +
        public int getRenderingPosition()
        +
        Attachment Position Integer 32-bit signed
        +
      • +
      + + + +
        +
      • +

        getLongPathname

        +
        public String getLongPathname()
        +
        Attachment long pathname ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getMimeTag

        +
        public String getMimeTag()
        +
        Attachment mime type ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getMimeSequence

        +
        public int getMimeSequence()
        +
        Attachment mime sequence
        +
      • +
      + + + +
        +
      • +

        getContentId

        +
        public String getContentId()
        +
        Attachment Content ID
        +
      • +
      + + + +
        +
      • +

        isAttachmentInvisibleInHtml

        +
        public boolean isAttachmentInvisibleInHtml()
        +
        Attachment not available in HTML
        +
      • +
      + + + +
        +
      • +

        isAttachmentInvisibleInRTF

        +
        public boolean isAttachmentInvisibleInRTF()
        +
        Attachment not available in RTF
        +
      • +
      + + + +
        +
      • +

        isAttachmentMhtmlRef

        +
        public boolean isAttachmentMhtmlRef()
        +
        Attachment is MHTML REF
        +
      • +
      + + + +
        +
      • +

        getAttachmentContentDisposition

        +
        public String getAttachmentContentDisposition()
        +
        Attachment content disposition
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTByteFileContent.html b/com/pff/PSTByteFileContent.html new file mode 100644 index 0000000..27139e5 --- /dev/null +++ b/com/pff/PSTByteFileContent.html @@ -0,0 +1,449 @@ + + + + + + +PSTByteFileContent (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTByteFileContent

+
+
+ +
+ +
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        content

        +
        protected byte[] content
        +
      • +
      + + + +
        +
      • +

        index

        +
        protected int index
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        PSTByteFileContent

        +
        public PSTByteFileContent(byte[] content)
        +
      • +
      +
    • +
    + + +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTContact.html b/com/pff/PSTContact.html new file mode 100644 index 0000000..15c3d45 --- /dev/null +++ b/com/pff/PSTContact.html @@ -0,0 +1,2126 @@ + + + + + + +PSTContact (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTContact

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTContact
    +extends PSTMessage
    +
    Class for Contacts
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+
    +
  • + + + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getAccount

        +
        public String getAccount()
        +
        Contact's Account name
        +
      • +
      + + + +
        +
      • +

        getCallbackTelephoneNumber

        +
        public String getCallbackTelephoneNumber()
        +
        Callback telephone number
        +
      • +
      + + + +
        +
      • +

        getGeneration

        +
        public String getGeneration()
        +
        Contact's generational abbreviation FTK: Name suffix
        +
      • +
      + + + +
        +
      • +

        getGivenName

        +
        public String getGivenName()
        +
        Contacts given name
        +
      • +
      + + + +
        +
      • +

        getGovernmentIdNumber

        +
        public String getGovernmentIdNumber()
        +
        Contacts Government ID Number
        +
      • +
      + + + +
        +
      • +

        getBusinessTelephoneNumber

        +
        public String getBusinessTelephoneNumber()
        +
        Business/Office Telephone Number
        +
      • +
      + + + +
        +
      • +

        getHomeTelephoneNumber

        +
        public String getHomeTelephoneNumber()
        +
        Home Telephone Number
        +
      • +
      + + + +
        +
      • +

        getInitials

        +
        public String getInitials()
        +
        Contacts initials
        +
      • +
      + + + +
        +
      • +

        getKeyword

        +
        public String getKeyword()
        +
        Keyword
        +
      • +
      + + + +
        +
      • +

        getLanguage

        +
        public String getLanguage()
        +
        Contact's language
        +
      • +
      + + + +
        +
      • +

        getLocation

        +
        public String getLocation()
        +
        Contact's location
        +
      • +
      + + + +
        +
      • +

        getMhsCommonName

        +
        public String getMhsCommonName()
        +
        MHS Common Name
        +
      • +
      + + + +
        +
      • +

        getOrganizationalIdNumber

        +
        public String getOrganizationalIdNumber()
        +
        Organizational identification number
        +
      • +
      + + + +
        +
      • +

        getSurname

        +
        public String getSurname()
        +
        Contact's surname FTK: Last name
        +
      • +
      + + + +
        +
      • +

        getOriginalDisplayName

        +
        public String getOriginalDisplayName()
        +
        Original display name
        +
      • +
      + + + +
        +
      • +

        getPostalAddress

        +
        public String getPostalAddress()
        +
        Default Postal Address
        +
      • +
      + + + +
        +
      • +

        getCompanyName

        +
        public String getCompanyName()
        +
        Contact's company name
        +
      • +
      + + + +
        +
      • +

        getTitle

        +
        public String getTitle()
        +
        Contact's job title FTK: Profession
        +
      • +
      + + + +
        +
      • +

        getDepartmentName

        +
        public String getDepartmentName()
        +
        Contact's department name Used in contact item
        +
      • +
      + + + +
        +
      • +

        getOfficeLocation

        +
        public String getOfficeLocation()
        +
        Contact's office location
        +
      • +
      + + + +
        +
      • +

        getPrimaryTelephoneNumber

        +
        public String getPrimaryTelephoneNumber()
        +
        Primary Telephone
        +
      • +
      + + + +
        +
      • +

        getBusiness2TelephoneNumber

        +
        public String getBusiness2TelephoneNumber()
        +
        Contact's secondary office (business) phone number
        +
      • +
      + + + +
        +
      • +

        getMobileTelephoneNumber

        +
        public String getMobileTelephoneNumber()
        +
        Mobile Phone Number
        +
      • +
      + + + +
        +
      • +

        getRadioTelephoneNumber

        +
        public String getRadioTelephoneNumber()
        +
        Radio Phone Number
        +
      • +
      + + + +
        +
      • +

        getCarTelephoneNumber

        +
        public String getCarTelephoneNumber()
        +
        Car Phone Number
        +
      • +
      + + + +
        +
      • +

        getOtherTelephoneNumber

        +
        public String getOtherTelephoneNumber()
        +
        Other Phone Number
        +
      • +
      + + + +
        +
      • +

        getTransmittableDisplayName

        +
        public String getTransmittableDisplayName()
        +
        Transmittable display name
        +
      • +
      + + + +
        +
      • +

        getPagerTelephoneNumber

        +
        public String getPagerTelephoneNumber()
        +
        Pager Phone Number
        +
      • +
      + + + +
        +
      • +

        getPrimaryFaxNumber

        +
        public String getPrimaryFaxNumber()
        +
        Primary Fax Number
        +
      • +
      + + + +
        +
      • +

        getBusinessFaxNumber

        +
        public String getBusinessFaxNumber()
        +
        Contact's office (business) fax number
        +
      • +
      + + + +
        +
      • +

        getHomeFaxNumber

        +
        public String getHomeFaxNumber()
        +
        Contact's home fax number
        +
      • +
      + + + +
        +
      • +

        getBusinessAddressCountry

        +
        public String getBusinessAddressCountry()
        +
        Business Address Country
        +
      • +
      + + + +
        +
      • +

        getBusinessAddressCity

        +
        public String getBusinessAddressCity()
        +
        Business Address City
        +
      • +
      + + + +
        +
      • +

        getBusinessAddressStateOrProvince

        +
        public String getBusinessAddressStateOrProvince()
        +
        Business Address State
        +
      • +
      + + + +
        +
      • +

        getBusinessAddressStreet

        +
        public String getBusinessAddressStreet()
        +
        Business Address Street
        +
      • +
      + + + +
        +
      • +

        getBusinessPostalCode

        +
        public String getBusinessPostalCode()
        +
        Business Postal Code
        +
      • +
      + + + +
        +
      • +

        getBusinessPoBox

        +
        public String getBusinessPoBox()
        +
        Business PO Box
        +
      • +
      + + + +
        +
      • +

        getTelexNumber

        +
        public String getTelexNumber()
        +
        Telex Number
        +
      • +
      + + + +
        +
      • +

        getIsdnNumber

        +
        public String getIsdnNumber()
        +
        ISDN Number
        +
      • +
      + + + +
        +
      • +

        getAssistantTelephoneNumber

        +
        public String getAssistantTelephoneNumber()
        +
        Assistant Phone Number
        +
      • +
      + + + +
        +
      • +

        getHome2TelephoneNumber

        +
        public String getHome2TelephoneNumber()
        +
        Home Phone 2
        +
      • +
      + + + +
        +
      • +

        getAssistant

        +
        public String getAssistant()
        +
        Assistant�s Name
        +
      • +
      + + + +
        +
      • +

        getHobbies

        +
        public String getHobbies()
        +
        Hobbies
        +
      • +
      + + + +
        +
      • +

        getMiddleName

        +
        public String getMiddleName()
        +
        Middle Name
        +
      • +
      + + + +
        +
      • +

        getDisplayNamePrefix

        +
        public String getDisplayNamePrefix()
        +
        Display Name Prefix (Contact Title)
        +
      • +
      + + + +
        +
      • +

        getProfession

        +
        public String getProfession()
        +
        Profession
        +
      • +
      + + + +
        +
      • +

        getPreferredByName

        +
        public String getPreferredByName()
        +
        Preferred By Name
        +
      • +
      + + + +
        +
      • +

        getSpouseName

        +
        public String getSpouseName()
        +
        Spouse�s Name
        +
      • +
      + + + +
        +
      • +

        getComputerNetworkName

        +
        public String getComputerNetworkName()
        +
        Computer Network Name
        +
      • +
      + + + +
        +
      • +

        getCustomerId

        +
        public String getCustomerId()
        +
        Customer ID
        +
      • +
      + + + +
        +
      • +

        getTtytddPhoneNumber

        +
        public String getTtytddPhoneNumber()
        +
        TTY/TDD Phone
        +
      • +
      + + + +
        +
      • +

        getFtpSite

        +
        public String getFtpSite()
        +
        Ftp Site
        +
      • +
      + + + +
        +
      • +

        getManagerName

        +
        public String getManagerName()
        +
        Manager�s Name
        +
      • +
      + + + +
        +
      • +

        getNickname

        +
        public String getNickname()
        +
        Nickname
        +
      • +
      + + + +
        +
      • +

        getPersonalHomePage

        +
        public String getPersonalHomePage()
        +
        Personal Home Page
        +
      • +
      + + + +
        +
      • +

        getBusinessHomePage

        +
        public String getBusinessHomePage()
        +
        Business Home Page
        +
      • +
      + + + +
        +
      • +

        getNote

        +
        public String getNote()
        +
        Note
        +
      • +
      + + + +
        +
      • +

        getSMTPAddress

        +
        public String getSMTPAddress()
        +
      • +
      + + + +
        +
      • +

        getCompanyMainPhoneNumber

        +
        public String getCompanyMainPhoneNumber()
        +
        Company Main Phone
        +
      • +
      + + + +
        +
      • +

        getChildrensNames

        +
        public String getChildrensNames()
        +
        Children's names
        +
      • +
      + + + +
        +
      • +

        getHomeAddressCity

        +
        public String getHomeAddressCity()
        +
        Home Address City
        +
      • +
      + + + +
        +
      • +

        getHomeAddressCountry

        +
        public String getHomeAddressCountry()
        +
        Home Address Country
        +
      • +
      + + + +
        +
      • +

        getHomeAddressPostalCode

        +
        public String getHomeAddressPostalCode()
        +
        Home Address Postal Code
        +
      • +
      + + + +
        +
      • +

        getHomeAddressStateOrProvince

        +
        public String getHomeAddressStateOrProvince()
        +
        Home Address State or Province
        +
      • +
      + + + +
        +
      • +

        getHomeAddressStreet

        +
        public String getHomeAddressStreet()
        +
        Home Address Street
        +
      • +
      + + + +
        +
      • +

        getHomeAddressPostOfficeBox

        +
        public String getHomeAddressPostOfficeBox()
        +
        Home Address Post Office Box
        +
      • +
      + + + +
        +
      • +

        getOtherAddressCity

        +
        public String getOtherAddressCity()
        +
        Other Address City
        +
      • +
      + + + +
        +
      • +

        getOtherAddressCountry

        +
        public String getOtherAddressCountry()
        +
        Other Address Country
        +
      • +
      + + + +
        +
      • +

        getOtherAddressPostalCode

        +
        public String getOtherAddressPostalCode()
        +
        Other Address Postal Code
        +
      • +
      + + + +
        +
      • +

        getOtherAddressStateOrProvince

        +
        public String getOtherAddressStateOrProvince()
        +
        Other Address State
        +
      • +
      + + + +
        +
      • +

        getOtherAddressStreet

        +
        public String getOtherAddressStreet()
        +
        Other Address Street
        +
      • +
      + + + +
        +
      • +

        getOtherAddressPostOfficeBox

        +
        public String getOtherAddressPostOfficeBox()
        +
        Other Address Post Office box
        +
      • +
      + + + +
        +
      • +

        getFileUnder

        +
        public String getFileUnder()
        +
        File under FTK: File as
        +
      • +
      + + + +
        +
      • +

        getHomeAddress

        +
        public String getHomeAddress()
        +
        Home Address
        +
      • +
      + + + +
        +
      • +

        getWorkAddress

        +
        public String getWorkAddress()
        +
        Business Address
        +
      • +
      + + + +
        +
      • +

        getOtherAddress

        +
        public String getOtherAddress()
        +
        Other Address
        +
      • +
      + + + +
        +
      • +

        getPostalAddressId

        +
        public int getPostalAddressId()
        +
        Selected Mailing Address
        +
      • +
      + + + +
        +
      • +

        getHtml

        +
        public String getHtml()
        +
        Webpage
        +
      • +
      + + + +
        +
      • +

        getWorkAddressStreet

        +
        public String getWorkAddressStreet()
        +
        Business Address City
        +
      • +
      + + + +
        +
      • +

        getWorkAddressCity

        +
        public String getWorkAddressCity()
        +
        Business Address Street
        +
      • +
      + + + +
        +
      • +

        getWorkAddressState

        +
        public String getWorkAddressState()
        +
        Business Address State
        +
      • +
      + + + +
        +
      • +

        getWorkAddressPostalCode

        +
        public String getWorkAddressPostalCode()
        +
        Business Address Postal Code
        +
      • +
      + + + +
        +
      • +

        getWorkAddressCountry

        +
        public String getWorkAddressCountry()
        +
        Business Address Country
        +
      • +
      + + + +
        +
      • +

        getWorkAddressPostOfficeBox

        +
        public String getWorkAddressPostOfficeBox()
        +
        Business Address Country
        +
      • +
      + + + +
        +
      • +

        getInstantMessagingAddress

        +
        public String getInstantMessagingAddress()
        +
        IM Address
        +
      • +
      + + + +
        +
      • +

        getEmail1DisplayName

        +
        public String getEmail1DisplayName()
        +
        E-mail1 Display Name
        +
      • +
      + + + +
        +
      • +

        getEmail1AddressType

        +
        public String getEmail1AddressType()
        +
        E-mail1 Address Type
        +
      • +
      + + + +
        +
      • +

        getEmail1EmailAddress

        +
        public String getEmail1EmailAddress()
        +
        E-mail1 Address
        +
      • +
      + + + +
        +
      • +

        getEmail1OriginalDisplayName

        +
        public String getEmail1OriginalDisplayName()
        +
        E-mail1 Display Name
        +
      • +
      + + + +
        +
      • +

        getEmail1EmailType

        +
        public String getEmail1EmailType()
        +
        E-mail1 type
        +
      • +
      + + + +
        +
      • +

        getEmail2DisplayName

        +
        public String getEmail2DisplayName()
        +
        E-mail2 display name
        +
      • +
      + + + +
        +
      • +

        getEmail2AddressType

        +
        public String getEmail2AddressType()
        +
        E-mail2 address type
        +
      • +
      + + + +
        +
      • +

        getEmail2EmailAddress

        +
        public String getEmail2EmailAddress()
        +
        E-mail2 e-mail address
        +
      • +
      + + + +
        +
      • +

        getEmail2OriginalDisplayName

        +
        public String getEmail2OriginalDisplayName()
        +
        E-mail2 original display name
        +
      • +
      + + + +
        +
      • +

        getEmail3DisplayName

        +
        public String getEmail3DisplayName()
        +
        E-mail3 display name
        +
      • +
      + + + +
        +
      • +

        getEmail3AddressType

        +
        public String getEmail3AddressType()
        +
        E-mail3 address type
        +
      • +
      + + + +
        +
      • +

        getEmail3EmailAddress

        +
        public String getEmail3EmailAddress()
        +
        E-mail3 e-mail address
        +
      • +
      + + + +
        +
      • +

        getEmail3OriginalDisplayName

        +
        public String getEmail3OriginalDisplayName()
        +
        E-mail3 original display name
        +
      • +
      + + + +
        +
      • +

        getFax1AddressType

        +
        public String getFax1AddressType()
        +
        Fax1 Address Type
        +
      • +
      + + + +
        +
      • +

        getFax1EmailAddress

        +
        public String getFax1EmailAddress()
        +
        Fax1 Email Address
        +
      • +
      + + + +
        +
      • +

        getFax1OriginalDisplayName

        +
        public String getFax1OriginalDisplayName()
        +
        Fax1 Original Display Name
        +
      • +
      + + + +
        +
      • +

        getFax2AddressType

        +
        public String getFax2AddressType()
        +
        Fax2 Address Type
        +
      • +
      + + + +
        +
      • +

        getFax2EmailAddress

        +
        public String getFax2EmailAddress()
        +
        Fax2 Email Address
        +
      • +
      + + + +
        +
      • +

        getFax2OriginalDisplayName

        +
        public String getFax2OriginalDisplayName()
        +
        Fax2 Original Display Name
        +
      • +
      + + + +
        +
      • +

        getFax3AddressType

        +
        public String getFax3AddressType()
        +
        Fax3 Address Type
        +
      • +
      + + + +
        +
      • +

        getFax3EmailAddress

        +
        public String getFax3EmailAddress()
        +
        Fax3 Email Address
        +
      • +
      + + + +
        +
      • +

        getFax3OriginalDisplayName

        +
        public String getFax3OriginalDisplayName()
        +
        Fax3 Original Display Name
        +
      • +
      + + + +
        +
      • +

        getFreeBusyLocation

        +
        public String getFreeBusyLocation()
        +
        Free/Busy Location (URL)
        +
      • +
      + + + +
        +
      • +

        getBirthday

        +
        public Date getBirthday()
        +
        Birthday
        +
      • +
      + + + +
        +
      • +

        getAnniversary

        +
        public Date getAnniversary()
        +
        (Wedding) Anniversary
        +
      • +
      + + + +
        +
      • +

        toString

        +
        public String toString()
        +
        Description copied from class: PSTMessage
        +
        string representation of this email
        +
        +
        Overrides:
        +
        toString in class PSTMessage
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTConversationIndex.ResponseLevel.html b/com/pff/PSTConversationIndex.ResponseLevel.html new file mode 100644 index 0000000..505f8d6 --- /dev/null +++ b/com/pff/PSTConversationIndex.ResponseLevel.html @@ -0,0 +1,320 @@ + + + + + + +PSTConversationIndex.ResponseLevel (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTConversationIndex.ResponseLevel

+
+
+ +
+ +
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        ResponseLevel

        +
        public ResponseLevel(short deltaCode,
        +                     long timeDelta,
        +                     short random)
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getDeltaCode

        +
        public short getDeltaCode()
        +
      • +
      + + + +
        +
      • +

        getTimeDelta

        +
        public long getTimeDelta()
        +
      • +
      + + + +
        +
      • +

        getRandom

        +
        public short getRandom()
        +
      • +
      + + + +
        +
      • +

        withOffset

        +
        public Date withOffset(Date anchorDate)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTConversationIndex.html b/com/pff/PSTConversationIndex.html new file mode 100644 index 0000000..861a3fa --- /dev/null +++ b/com/pff/PSTConversationIndex.html @@ -0,0 +1,342 @@ + + + + + + +PSTConversationIndex (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTConversationIndex

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTConversationIndex
    +extends Object
    +
    Class to hold decoded PidTagConversationIndex
    +
    +
    Author:
    +
    Nick Buller
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        PSTConversationIndex

        +
        protected PSTConversationIndex(byte[] rawConversationIndex)
        +
      • +
      +
    • +
    + + +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTDistList.OneOffEntry.html b/com/pff/PSTDistList.OneOffEntry.html new file mode 100644 index 0000000..b89a7a6 --- /dev/null +++ b/com/pff/PSTDistList.OneOffEntry.html @@ -0,0 +1,335 @@ + + + + + + +PSTDistList.OneOffEntry (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTDistList.OneOffEntry

+
+
+ +
+
    +
  • +
    +
    Enclosing class:
    +
    PSTDistList
    +
    +
    +
    +
    public class PSTDistList.OneOffEntry
    +extends Object
    +
    Inner class to represent distribution list one-off entries.
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        OneOffEntry

        +
        public OneOffEntry()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getDisplayName

        +
        public String getDisplayName()
        +
        +
        Returns:
        +
        display name
        +
        +
      • +
      + + + +
        +
      • +

        getAddressType

        +
        public String getAddressType()
        +
        +
        Returns:
        +
        address type
        +
        +
      • +
      + + + +
        +
      • +

        getEmailAddress

        +
        public String getEmailAddress()
        +
        +
        Returns:
        +
        email address.
        +
        +
      • +
      + + + +
        +
      • +

        toString

        +
        public String toString()
        +
        +
        Overrides:
        +
        toString in class Object
        +
        Returns:
        +
        formatted record
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTDistList.html b/com/pff/PSTDistList.html new file mode 100644 index 0000000..b21fd04 --- /dev/null +++ b/com/pff/PSTDistList.html @@ -0,0 +1,324 @@ + + + + + + +PSTDistList (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTDistList

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTDistList
    +extends PSTMessage
    +
    PST DistList for extracting Addresses from Distribution lists.
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getDistributionListMembers

        +
        public Object[] getDistributionListMembers()
        +                                    throws PSTException,
        +                                           IOException
        +
        Get an array of the members in this distribution list.
        +
        +
        Returns:
        +
        array of entries that can either be PSTDistList.OneOffEntry + or a PSTObject, generally PSTContact.
        +
        Throws:
        +
        PSTException - on corrupted data
        +
        IOException - on bad string reading
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTException.html b/com/pff/PSTException.html new file mode 100644 index 0000000..a0d21fe --- /dev/null +++ b/com/pff/PSTException.html @@ -0,0 +1,227 @@ + + + + + + +PSTException (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTException

+
+
+ +
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    Serializable
    +
    +
    +
    +
    public class PSTException
    +extends Exception
    +
    Simple exception for PST File related errors
    +
    +
    Author:
    +
    Richard Johnson
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+ +
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTFile.html b/com/pff/PSTFile.html new file mode 100644 index 0000000..37aa3a9 --- /dev/null +++ b/com/pff/PSTFile.html @@ -0,0 +1,933 @@ + + + + + + +PSTFile (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTFile

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTFile
    +extends Object
    +
    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
    +
    +
  • +
+
+
+ +
+
+ +
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTFileContent.html b/com/pff/PSTFileContent.html new file mode 100644 index 0000000..43b11e0 --- /dev/null +++ b/com/pff/PSTFileContent.html @@ -0,0 +1,390 @@ + + + + + + +PSTFileContent (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTFileContent

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTFolder.html b/com/pff/PSTFolder.html new file mode 100644 index 0000000..4967f51 --- /dev/null +++ b/com/pff/PSTFolder.html @@ -0,0 +1,568 @@ + + + + + + +PSTFolder (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTFolder

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTFolder
    +extends PSTObject
    +
    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
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + + + + + +
        +
      • +

        getChildren

        +
        public Vector<PSTObject> getChildren(int numberToReturn)
        +                              throws PSTException,
        +                                     IOException
        +
        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.
        +
        +
        Parameters:
        +
        numberToReturn -
        +
        Returns:
        +
        bunch of children in this folder
        +
        Throws:
        +
        PSTException
        +
        IOException
        +
        +
      • +
      + + + + + + + +
        +
      • +

        getNextChild

        +
        public PSTObject getNextChild()
        +                       throws PSTException,
        +                              IOException
        +
        Get the next child of this folder + As there could be thousands of emails, we have these kind of cursor + operations
        +
        +
        Returns:
        +
        the next email in the folder or null if at the end of the folder
        +
        Throws:
        +
        PSTException
        +
        IOException
        +
        +
      • +
      + + + +
        +
      • +

        moveChildCursorTo

        +
        public void moveChildCursorTo(int newIndex)
        +                       throws IOException,
        +                              PSTException
        +
        move the internal folder cursor to the desired position + position 0 is before the first record.
        +
        +
        Parameters:
        +
        newIndex -
        +
        Throws:
        +
        IOException
        +
        PSTException
        +
        +
      • +
      + + + + + + + +
        +
      • +

        getEmailCount

        +
        public int getEmailCount()
        +                  throws IOException,
        +                         PSTException
        +
        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
        +
        +
        Returns:
        +
        number of emails in this folder (as counted)
        +
        Throws:
        +
        IOException
        +
        PSTException
        +
        +
      • +
      + + + +
        +
      • +

        getFolderType

        +
        public int getFolderType()
        +
      • +
      + + + +
        +
      • +

        getContentCount

        +
        public int getContentCount()
        +
        the number of emails in this folder + this is as reported by the PST file, for a number calculated by the + library use getEmailCount
        +
        +
        Returns:
        +
        number of items as reported by PST File
        +
        +
      • +
      + + + +
        +
      • +

        getUnreadCount

        +
        public int getUnreadCount()
        +
        Amount of unread content items Integer 32-bit signed
        +
      • +
      + + + +
        +
      • +

        hasSubfolders

        +
        public boolean hasSubfolders()
        +
        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
        +
        +
        Returns:
        +
        has subfolders as reported by the PST File
        +
        +
      • +
      + + + +
        +
      • +

        getContainerClass

        +
        public String getContainerClass()
        +
      • +
      + + + +
        +
      • +

        getAssociateContentCount

        +
        public int getAssociateContentCount()
        +
      • +
      + + + +
        +
      • +

        getContainerFlags

        +
        public int getContainerFlags()
        +
        Container flags Integer 32-bit signed
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTGlobalObjectId.html b/com/pff/PSTGlobalObjectId.html new file mode 100644 index 0000000..31c1e09 --- /dev/null +++ b/com/pff/PSTGlobalObjectId.html @@ -0,0 +1,480 @@ + + + + + + +PSTGlobalObjectId (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTGlobalObjectId

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTGlobalObjectId
    +extends Object
    +
    Class to represent a decoded PidLidGlobalObjectId or + PidLidCleanGlobalObjectId (for Meeting Exceptions) + See [MS-OXOCAL] + https://msdn.microsoft.com/en-us/library/cc425490(v=exchg.80).aspx, 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)
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        ReferenceByteArrayID

        +
        protected static final byte[] ReferenceByteArrayID
        +
      • +
      + + + +
        +
      • +

        hexArray

        +
        protected static final char[] hexArray
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        PSTGlobalObjectId

        +
        public PSTGlobalObjectId(byte[] pidData)
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        bytesToHex

        +
        public static String bytesToHex(byte[] bytes)
        +
      • +
      + + + +
        +
      • +

        getYearHigh

        +
        protected int getYearHigh()
        +
      • +
      + + + +
        +
      • +

        getYearLow

        +
        protected int getYearLow()
        +
      • +
      + + + +
        +
      • +

        getYear

        +
        public int getYear()
        +
      • +
      + + + +
        +
      • +

        getMonth

        +
        public int getMonth()
        +
      • +
      + + + +
        +
      • +

        getDay

        +
        public int getDay()
        +
      • +
      + + + +
        +
      • +

        getCreationTime

        +
        public Date getCreationTime()
        +
      • +
      + + + +
        +
      • +

        getCreationTimeLow

        +
        protected int getCreationTimeLow()
        +
      • +
      + + + +
        +
      • +

        getCreationTimeHigh

        +
        protected int getCreationTimeHigh()
        +
      • +
      + + + +
        +
      • +

        getDataSize

        +
        public int getDataSize()
        +
      • +
      + + + +
        +
      • +

        getData

        +
        public byte[] getData()
        +
      • +
      + + + + +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTMessage.html b/com/pff/PSTMessage.html new file mode 100644 index 0000000..33ac6a1 --- /dev/null +++ b/com/pff/PSTMessage.html @@ -0,0 +1,2057 @@ + + + + + + +PSTMessage (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTMessage

+
+
+ +
+
    +
  • +
    +
    Direct Known Subclasses:
    +
    PSTActivity, PSTAppointment, PSTContact, PSTDistList, PSTRss, PSTTask
    +
    +
    +
    +
    public class PSTMessage
    +extends PSTObject
    +
    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
    +
    +
  • +
+
+
+ +
+
+
    +
  • + + + +
      +
    • + + +

      Method Detail

      + + + + + + + +
        +
      • +

        getImportance

        +
        public int getImportance()
        +
        get the importance of the email
        +
        +
        Returns:
        +
        IMPORTANCE_NORMAL if unknown
        +
        +
      • +
      + + + +
        +
      • +

        getMessageClass

        +
        public String getMessageClass()
        +
        get the message class for the email
        +
        +
        Overrides:
        +
        getMessageClass in class PSTObject
        +
        Returns:
        +
        empty string if unknown
        +
        +
      • +
      + + + +
        +
      • +

        getSubject

        +
        public String getSubject()
        +
        get the subject
        +
        +
        Returns:
        +
        empty string if not found
        +
        +
      • +
      + + + +
        +
      • +

        getClientSubmitTime

        +
        public Date getClientSubmitTime()
        +
        get the client submit time
        +
        +
        Returns:
        +
        null if not found
        +
        +
      • +
      + + + +
        +
      • +

        getReceivedByName

        +
        public String getReceivedByName()
        +
        get received by name
        +
        +
        Returns:
        +
        empty string if not found
        +
        +
      • +
      + + + +
        +
      • +

        getSentRepresentingName

        +
        public String getSentRepresentingName()
        +
        get sent representing name
        +
        +
        Returns:
        +
        empty string if not found
        +
        +
      • +
      + + + +
        +
      • +

        getSentRepresentingAddressType

        +
        public String getSentRepresentingAddressType()
        +
        Sent representing address type + Known values are SMTP, EX (Exchange) and UNKNOWN
        +
        +
        Returns:
        +
        empty string if not found
        +
        +
      • +
      + + + +
        +
      • +

        getSentRepresentingEmailAddress

        +
        public String getSentRepresentingEmailAddress()
        +
        Sent representing email address
        +
        +
        Returns:
        +
        empty string if not found
        +
        +
      • +
      + + + +
        +
      • +

        getConversationTopic

        +
        public String getConversationTopic()
        +
        Conversation topic + This is basically the subject from which Fwd:, Re, etc. has been removed
        +
        +
        Returns:
        +
        empty string if not found
        +
        +
      • +
      + + + +
        +
      • +

        getReceivedByAddressType

        +
        public String getReceivedByAddressType()
        +
        Received by address type + Known values are SMTP, EX (Exchange) and UNKNOWN
        +
        +
        Returns:
        +
        empty string if not found
        +
        +
      • +
      + + + +
        +
      • +

        getReceivedByAddress

        +
        public String getReceivedByAddress()
        +
        Received by email address
        +
        +
        Returns:
        +
        empty string if not found
        +
        +
      • +
      + + + +
        +
      • +

        getTransportMessageHeaders

        +
        public String getTransportMessageHeaders()
        +
        Transport message headers ASCII or Unicode string These contain the SMTP + e-mail headers.
        +
      • +
      + + + +
        +
      • +

        isRead

        +
        public boolean isRead()
        +
      • +
      + + + +
        +
      • +

        isUnmodified

        +
        public boolean isUnmodified()
        +
      • +
      + + + +
        +
      • +

        isSubmitted

        +
        public boolean isSubmitted()
        +
      • +
      + + + +
        +
      • +

        isUnsent

        +
        public boolean isUnsent()
        +
      • +
      + + + +
        +
      • +

        hasAttachments

        +
        public boolean hasAttachments()
        +
      • +
      + + + +
        +
      • +

        isFromMe

        +
        public boolean isFromMe()
        +
      • +
      + + + +
        +
      • +

        isAssociated

        +
        public boolean isAssociated()
        +
      • +
      + + + +
        +
      • +

        isResent

        +
        public boolean isResent()
        +
      • +
      + + + +
        +
      • +

        getAcknowledgementMode

        +
        public int getAcknowledgementMode()
        +
        Acknowledgment mode Integer 32-bit signed
        +
      • +
      + + + +
        +
      • +

        getOriginatorDeliveryReportRequested

        +
        public boolean getOriginatorDeliveryReportRequested()
        +
        Originator delivery report requested set if the sender wants a delivery + report from all recipients 0 = false 0 != true
        +
      • +
      + + + +
        +
      • +

        getPriority

        +
        public int getPriority()
        +
        Priority Integer 32-bit signed -1 = NonUrgent 0 = Normal 1 = Urgent
        +
      • +
      + + + +
        +
      • +

        getReadReceiptRequested

        +
        public boolean getReadReceiptRequested()
        +
        Read Receipt Requested Boolean 0 = false 0 != true
        +
      • +
      + + + +
        +
      • +

        getRecipientReassignmentProhibited

        +
        public boolean getRecipientReassignmentProhibited()
        +
        Recipient Reassignment Prohibited Boolean 0 = false 0 != true
        +
      • +
      + + + +
        +
      • +

        getOriginalSensitivity

        +
        public int getOriginalSensitivity()
        +
        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
        +
      • +
      + + + +
        +
      • +

        getSensitivity

        +
        public int getSensitivity()
        +
        Sensitivity Integer 32-bit signed sender's opinion of the sensitivity of + an email 0 = None 1 = Personal 2 = Private 3 = Company Confidential
        +
      • +
      + + + +
        +
      • +

        getPidTagSentRepresentingSearchKey

        +
        public byte[] getPidTagSentRepresentingSearchKey()
        +
      • +
      + + + +
        +
      • +

        getRcvdRepresentingName

        +
        public String getRcvdRepresentingName()
        +
        Received representing name ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getOriginalSubject

        +
        public String getOriginalSubject()
        +
        Original subject ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getReplyRecipientNames

        +
        public String getReplyRecipientNames()
        +
        Reply recipients names ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getMessageToMe

        +
        public boolean getMessageToMe()
        +
        My address in To field Boolean
        +
      • +
      + + + +
        +
      • +

        getMessageCcMe

        +
        public boolean getMessageCcMe()
        +
        My address in CC field Boolean
        +
      • +
      + + + +
        +
      • +

        getMessageRecipMe

        +
        public boolean getMessageRecipMe()
        +
        Indicates that the receiving mailbox owner is a primary or a carbon copy + (Cc) recipient
        +
      • +
      + + + +
        +
      • +

        getResponseRequested

        +
        public boolean getResponseRequested()
        +
        Response requested Boolean
        +
      • +
      + + + +
        +
      • +

        getSentRepresentingAddrtype

        +
        public String getSentRepresentingAddrtype()
        +
        Sent representing address type ASCII or Unicode string Known values are + SMTP, EX (Exchange) and UNKNOWN
        +
      • +
      + + + +
        +
      • +

        getOriginalDisplayBcc

        +
        public String getOriginalDisplayBcc()
        +
        Original display BCC ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getOriginalDisplayCc

        +
        public String getOriginalDisplayCc()
        +
        Original display CC ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getOriginalDisplayTo

        +
        public String getOriginalDisplayTo()
        +
        Original display TO ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getRcvdRepresentingAddrtype

        +
        public String getRcvdRepresentingAddrtype()
        +
        Received representing address type. + Known values are SMTP, EX (Exchange) and UNKNOWN
        +
      • +
      + + + +
        +
      • +

        getRcvdRepresentingEmailAddress

        +
        public String getRcvdRepresentingEmailAddress()
        +
        Received representing e-mail address
        +
      • +
      + + + +
        +
      • +

        isNonReceiptNotificationRequested

        +
        public boolean isNonReceiptNotificationRequested()
        +
        Non receipt notification requested
        +
      • +
      + + + +
        +
      • +

        isOriginatorNonDeliveryReportRequested

        +
        public boolean isOriginatorNonDeliveryReportRequested()
        +
        Originator non delivery report requested
        +
      • +
      + + + +
        +
      • +

        getRecipientType

        +
        public int getRecipientType()
        +
        Recipient type Integer 32-bit signed 0x01 => To 0x02 =>CC
        +
      • +
      + + + +
        +
      • +

        isReplyRequested

        +
        public boolean isReplyRequested()
        +
        Reply requested
        +
      • +
      + + + +
        +
      • +

        getSenderEntryId

        +
        public byte[] getSenderEntryId()
        +
      • +
      + + + +
        +
      • +

        getSenderName

        +
        public String getSenderName()
        +
        Sender name
        +
      • +
      + + + +
        +
      • +

        getSenderAddrtype

        +
        public String getSenderAddrtype()
        +
        Sender address type. + Known values are SMTP, EX (Exchange) and UNKNOWN
        +
      • +
      + + + +
        +
      • +

        getSenderEmailAddress

        +
        public String getSenderEmailAddress()
        +
        Sender e-mail address
        +
      • +
      + + + +
        +
      • +

        getMessageSize

        +
        public long getMessageSize()
        +
        Message size
        +
      • +
      + + + +
        +
      • +

        getInternetArticleNumber

        +
        public int getInternetArticleNumber()
        +
        Internet article number
        +
      • +
      + + + +
        +
      • +

        getPrimarySendAccount

        +
        public String getPrimarySendAccount()
        +
      • +
      + + + +
        +
      • +

        getNextSendAcct

        +
        public String getNextSendAcct()
        +
      • +
      + + + +
        +
      • +

        getURLCompNamePostfix

        +
        public int getURLCompNamePostfix()
        +
        URL computer name postfix
        +
      • +
      + + + +
        +
      • +

        getObjectType

        +
        public int getObjectType()
        +
        Object type
        +
      • +
      + + + +
        +
      • +

        getDeleteAfterSubmit

        +
        public boolean getDeleteAfterSubmit()
        +
        Delete after submit
        +
      • +
      + + + +
        +
      • +

        getResponsibility

        +
        public boolean getResponsibility()
        +
        Responsibility
        +
      • +
      + + + +
        +
      • +

        isRTFInSync

        +
        public boolean isRTFInSync()
        +
        Compressed RTF in Sync Boolean
        +
      • +
      + + + +
        +
      • +

        isURLCompNameSet

        +
        public boolean isURLCompNameSet()
        +
        URL computer name set
        +
      • +
      + + + +
        +
      • +

        getDisplayBCC

        +
        public String getDisplayBCC()
        +
        Display BCC
        +
      • +
      + + + +
        +
      • +

        getDisplayCC

        +
        public String getDisplayCC()
        +
        Display CC
        +
      • +
      + + + +
        +
      • +

        getDisplayTo

        +
        public String getDisplayTo()
        +
        Display To
        +
      • +
      + + + +
        +
      • +

        getMessageDeliveryTime

        +
        public Date getMessageDeliveryTime()
        +
        Message delivery time
        +
      • +
      + + + +
        +
      • +

        getNativeBodyType

        +
        public int getNativeBodyType()
        +
        Message content properties
        +
      • +
      + + + +
        +
      • +

        getBody

        +
        public String getBody()
        +
        Plain text e-mail body
        +
      • +
      + + + +
        +
      • +

        getBodyPrefix

        +
        public String getBodyPrefix()
        +
      • +
      + + + +
        +
      • +

        getRTFSyncBodyCRC

        +
        public int getRTFSyncBodyCRC()
        +
        RTF Sync Body CRC
        +
      • +
      + + + +
        +
      • +

        getRTFSyncBodyCount

        +
        public int getRTFSyncBodyCount()
        +
        RTF Sync Body character count
        +
      • +
      + + + +
        +
      • +

        getRTFSyncBodyTag

        +
        public String getRTFSyncBodyTag()
        +
        RTF Sync body tag
        +
      • +
      + + + +
        +
      • +

        getRTFSyncPrefixCount

        +
        public int getRTFSyncPrefixCount()
        +
        RTF whitespace prefix count
        +
      • +
      + + + +
        +
      • +

        getRTFSyncTrailingCount

        +
        public int getRTFSyncTrailingCount()
        +
        RTF whitespace tailing count
        +
      • +
      + + + +
        +
      • +

        getBodyHTML

        +
        public String getBodyHTML()
        +
        HTML e-mail body
        +
      • +
      + + + +
        +
      • +

        getInternetMessageId

        +
        public String getInternetMessageId()
        +
        Message ID for this email as allocated per rfc2822
        +
      • +
      + + + +
        +
      • +

        getInReplyToId

        +
        public String getInReplyToId()
        +
        In-Reply-To
        +
      • +
      + + + +
        +
      • +

        getReturnPath

        +
        public String getReturnPath()
        +
        Return Path
        +
      • +
      + + + +
        +
      • +

        getIconIndex

        +
        public int getIconIndex()
        +
        Icon index
        +
      • +
      + + + +
        +
      • +

        getActionFlag

        +
        public int getActionFlag()
        +
        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.
        +
      • +
      + + + +
        +
      • +

        hasForwarded

        +
        public boolean hasForwarded()
        +
        is the action flag for this item "forward"?
        +
      • +
      + + + +
        +
      • +

        hasReplied

        +
        public boolean hasReplied()
        +
        is the action flag for this item "replied"?
        +
      • +
      + + + +
        +
      • +

        getActionDate

        +
        public Date getActionDate()
        +
        the date that this item had an action performed (eg. replied or + forwarded)
        +
      • +
      + + + +
        +
      • +

        getDisableFullFidelity

        +
        public boolean getDisableFullFidelity()
        +
        Disable full fidelity
        +
      • +
      + + + +
        +
      • +

        getURLCompName

        +
        public String getURLCompName()
        +
        URL computer name + Contains the .eml file name
        +
      • +
      + + + +
        +
      • +

        getAttrHidden

        +
        public boolean getAttrHidden()
        +
        Attribute hidden
        +
      • +
      + + + +
        +
      • +

        getAttrSystem

        +
        public boolean getAttrSystem()
        +
        Attribute system
        +
      • +
      + + + +
        +
      • +

        getAttrReadonly

        +
        public boolean getAttrReadonly()
        +
        Attribute read only
        +
      • +
      + + + + + + + +
        +
      • +

        getTaskStartDate

        +
        public Date getTaskStartDate()
        +
        Start date Filetime
        +
      • +
      + + + +
        +
      • +

        getTaskDueDate

        +
        public Date getTaskDueDate()
        +
        Due date Filetime
        +
      • +
      + + + +
        +
      • +

        getReminderSet

        +
        public boolean getReminderSet()
        +
        Is a reminder set on this object?
        +
        +
        Returns:
        +
        +
      • +
      + + + +
        +
      • +

        getReminderDelta

        +
        public int getReminderDelta()
        +
      • +
      + + + +
        +
      • +

        isFlagged

        +
        public boolean isFlagged()
        +
        "flagged" items are actually emails with a due date. + This convience method just checks to see if that is true.
        +
      • +
      + + + +
        +
      • +

        getColorCategories

        +
        public String[] getColorCategories()
        +                            throws PSTException
        +
        get the categories defined for this message
        +
        +
        Throws:
        +
        PSTException
        +
        +
      • +
      + + + +
        +
      • +

        getNumberOfAttachments

        +
        public int getNumberOfAttachments()
        +
        get the number of attachments for this message
        +
        +
        Throws:
        +
        PSTException
        +
        IOException
        +
        +
      • +
      + + + + + + + + + + + +
        +
      • +

        getRecipientsString

        +
        public String getRecipientsString()
        +
      • +
      + + + +
        +
      • +

        getConversationId

        +
        public byte[] getConversationId()
        +
      • +
      + + + + + + + +
        +
      • +

        isConversationIndexTracking

        +
        public boolean isConversationIndexTracking()
        +
      • +
      + + + +
        +
      • +

        toString

        +
        public String toString()
        +
        string representation of this email
        +
        +
        Overrides:
        +
        toString in class PSTObject
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTMessageStore.html b/com/pff/PSTMessageStore.html new file mode 100644 index 0000000..618791f --- /dev/null +++ b/com/pff/PSTMessageStore.html @@ -0,0 +1,335 @@ + + + + + + +PSTMessageStore (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTMessageStore

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTMessageStore
    +extends PSTObject
    +
    Object that represents the message store. + Not much use other than to get the "name" of the PST file.
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getTagRecordKeyAsUUID

        +
        public UUID getTagRecordKeyAsUUID()
        +
        Get the tag record key, unique to this pst
        +
      • +
      + + + +
        +
      • +

        getDisplayName

        +
        public String getDisplayName()
        +
        get the message store display name
        +
        +
        Overrides:
        +
        getDisplayName in class PSTObject
        +
        +
      • +
      + + + +
        +
      • +

        getDetails

        +
        public String getDetails()
        +
      • +
      + + + +
        +
      • +

        isPasswordProtected

        +
        public boolean isPasswordProtected()
        +                            throws PSTException,
        +                                   IOException
        +
        Is this pst file is password protected.
        +
        +
        Returns:
        +
        - true if protected,false otherwise + pstfile has the password stored against identifier 0x67FF. + if there is no password the value stored is 0x00000000.
        +
        Throws:
        +
        PSTException - on corrupted pst
        +
        IOException - on bad read
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTNodeInputStream.html b/com/pff/PSTNodeInputStream.html new file mode 100644 index 0000000..e73cf98 --- /dev/null +++ b/com/pff/PSTNodeInputStream.html @@ -0,0 +1,477 @@ + + + + + + +PSTNodeInputStream (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTNodeInputStream

+
+
+ +
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    Closeable, AutoCloseable
    +
    +
    +
    +
    public class PSTNodeInputStream
    +extends InputStream
    +
    this input stream basically "maps" an input stream on top of the random + access file
    +
    +
    Author:
    +
    richard
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        isEncrypted

        +
        public boolean isEncrypted()
        +
      • +
      + + + +
        +
      • +

        length

        +
        public long length()
        +
      • +
      + + + + + + + +
        +
      • +

        readCompletely

        +
        public void readCompletely(byte[] target)
        +                    throws IOException
        +
        Read a block from the input stream, ensuring buffer is completely filled. + Recommended block size = 8176 (size used internally by PSTs)
        +
        +
        Parameters:
        +
        target - buffer to fill
        +
        Throws:
        +
        IOException
        +
        +
      • +
      + + + +
        +
      • +

        read

        +
        public int read(byte[] output)
        +         throws IOException
        +
        Read a block from the input stream. + Recommended block size = 8176 (size used internally by PSTs)
        +
        +
        Overrides:
        +
        read in class InputStream
        +
        Parameters:
        +
        output -
        +
        Returns:
        +
        Throws:
        +
        IOException
        +
        +
      • +
      + + + + + + + +
        +
      • +

        reset

        +
        public void reset()
        +
        +
        Overrides:
        +
        reset in class InputStream
        +
        +
      • +
      + + + + + + + +
        +
      • +

        getBlockOffsets

        +
        public Long[] getBlockOffsets()
        +
        Get the offsets (block positions) used in the array
        +
        +
        Returns:
        +
        +
      • +
      + + + + + + + + + + + +
        +
      • +

        getPSTFile

        +
        public PSTFile getPSTFile()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTObject.html b/com/pff/PSTObject.html new file mode 100644 index 0000000..1535447 --- /dev/null +++ b/com/pff/PSTObject.html @@ -0,0 +1,1462 @@ + + + + + + +PSTObject (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTObject

+
+
+ +
+
    +
  • +
    +
    Direct Known Subclasses:
    +
    PSTAttachment, PSTFolder, PSTMessage, PSTMessageStore
    +
    +
    +
    +
    public class PSTObject
    +extends Object
    +
    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
    +
    +
  • +
+
+
+ +
+
+
    +
  • + + + + + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getItemsString

        +
        public String getItemsString()
        +
      • +
      + + + +
        +
      • +

        getDescriptorNode

        +
        public DescriptorIndexNode getDescriptorNode()
        +
        get the descriptor node for this item + this identifies the location of the node in the BTree and associated info
        +
        +
        Returns:
        +
        item's descriptor node
        +
        +
      • +
      + + + +
        +
      • +

        getDescriptorNodeId

        +
        public long getDescriptorNodeId()
        +
        get the descriptor identifier for this item + can be used for loading objects through detectAndLoadPSTObject(PSTFile + theFile, long descriptorIndex)
        +
        +
        Returns:
        +
        item's descriptor node identifier
        +
        +
      • +
      + + + +
        +
      • +

        getNodeType

        +
        public int getNodeType()
        +
      • +
      + + + +
        +
      • +

        getNodeType

        +
        public static int getNodeType(int descriptorIdentifier)
        +
      • +
      + + + +
        +
      • +

        getIntItem

        +
        protected int getIntItem(int identifier)
        +
      • +
      + + + +
        +
      • +

        getIntItem

        +
        protected int getIntItem(int identifier,
        +                         int defaultValue)
        +
      • +
      + + + +
        +
      • +

        getBooleanItem

        +
        protected boolean getBooleanItem(int identifier)
        +
      • +
      + + + +
        +
      • +

        getBooleanItem

        +
        protected boolean getBooleanItem(int identifier,
        +                                 boolean defaultValue)
        +
      • +
      + + + +
        +
      • +

        getDoubleItem

        +
        protected double getDoubleItem(int identifier)
        +
      • +
      + + + +
        +
      • +

        getDoubleItem

        +
        protected double getDoubleItem(int identifier,
        +                               double defaultValue)
        +
      • +
      + + + +
        +
      • +

        getLongItem

        +
        protected long getLongItem(int identifier)
        +
      • +
      + + + +
        +
      • +

        getLongItem

        +
        protected long getLongItem(int identifier,
        +                           long defaultValue)
        +
      • +
      + + + +
        +
      • +

        getStringItem

        +
        protected String getStringItem(int identifier)
        +
      • +
      + + + +
        +
      • +

        getStringItem

        +
        protected String getStringItem(int identifier,
        +                               int stringType)
        +
      • +
      + + + +
        +
      • +

        getStringItem

        +
        protected String getStringItem(int identifier,
        +                               int stringType,
        +                               String codepage)
        +
      • +
      + + + +
        +
      • +

        getDateItem

        +
        public Date getDateItem(int identifier)
        +
      • +
      + + + +
        +
      • +

        getBinaryItem

        +
        protected byte[] getBinaryItem(int identifier)
        +
      • +
      + + + +
        +
      • +

        getTimeZoneItem

        +
        protected PSTTimeZone getTimeZoneItem(int identifier)
        +
      • +
      + + + +
        +
      • +

        getMessageClass

        +
        public String getMessageClass()
        +
      • +
      + + + + + + + +
        +
      • +

        getDisplayName

        +
        public String getDisplayName()
        +
        get the display name
        +
      • +
      + + + +
        +
      • +

        getAddrType

        +
        public String getAddrType()
        +
        Address type + Known values are SMTP, EX (Exchange) and UNKNOWN
        +
      • +
      + + + +
        +
      • +

        getEmailAddress

        +
        public String getEmailAddress()
        +
        E-mail address
        +
      • +
      + + + +
        +
      • +

        getComment

        +
        public String getComment()
        +
        Comment
        +
      • +
      + + + +
        +
      • +

        getCreationTime

        +
        public Date getCreationTime()
        +
        Creation time
        +
      • +
      + + + +
        +
      • +

        getLastModificationTime

        +
        public Date getLastModificationTime()
        +
        Modification time
        +
      • +
      + + + +
        +
      • +

        printFormattedNumber

        +
        public static void printFormattedNumber(String pref,
        +                                        long number)
        +
        Output a number in a variety of formats for easier consumption
        +
        +
        Parameters:
        +
        data -
        +
        +
      • +
      + + + +
        +
      • +

        printFormattedNumber

        +
        public static void printFormattedNumber(long number)
        +
      • +
      + + + +
        +
      • +

        printHexFormatted

        +
        public static void printHexFormatted(byte[] data,
        +                                     boolean pretty)
        +
        Output a dump of data in hex format in the order it was read in
        +
        +
        Parameters:
        +
        data -
        +
        pretty -
        +
        +
      • +
      + + + +
        +
      • +

        printHexFormatted

        +
        protected static void printHexFormatted(byte[] data,
        +                                        boolean pretty,
        +                                        int[] indexes)
        +
      • +
      + + + +
        +
      • +

        decode

        +
        protected static byte[] decode(byte[] data)
        +
        decode a lump of data that has been encrypted with the compressible + encryption
        +
        +
        Parameters:
        +
        data -
        +
        Returns:
        +
        decoded data
        +
        +
      • +
      + + + +
        +
      • +

        encode

        +
        protected static byte[] encode(byte[] data)
        +
      • +
      + + + +
        +
      • +

        convertLittleEndianBytesToLong

        +
        public static long convertLittleEndianBytesToLong(byte[] data)
        +
        Utility function for converting little endian bytes into a usable java + long
        +
        +
        Parameters:
        +
        data -
        +
        Returns:
        +
        long version of the data
        +
        +
      • +
      + + + +
        +
      • +

        convertLittleEndianBytesToLong

        +
        public static long convertLittleEndianBytesToLong(byte[] data,
        +                                                  int start,
        +                                                  int end)
        +
        Utility function for converting little endian bytes into a usable java + long
        +
        +
        Parameters:
        +
        data -
        +
        start -
        +
        end -
        +
        Returns:
        +
        long version of the data
        +
        +
      • +
      + + + +
        +
      • +

        convertBigEndianBytesToLong

        +
        public static long convertBigEndianBytesToLong(byte[] data,
        +                                               int start,
        +                                               int end)
        +
        Utility function for converting big endian bytes into a usable java long
        +
        +
        Parameters:
        +
        data -
        +
        start -
        +
        end -
        +
        Returns:
        +
        long version of the data
        +
        +
      • +
      + + + +
        +
      • +

        detectAndLoadPSTObject

        +
        public static PSTObject detectAndLoadPSTObject(PSTFile theFile,
        +                                               long descriptorIndex)
        +                                        throws IOException,
        +                                               PSTException
        +
        Detect and load a PST Object from a file with the specified descriptor + index
        +
        +
        Parameters:
        +
        theFile -
        +
        descriptorIndex -
        +
        Returns:
        +
        PSTObject with that index
        +
        Throws:
        +
        IOException
        +
        PSTException
        +
        +
      • +
      + + + +
        +
      • +

        filetimeToDate

        +
        protected static Date filetimeToDate(int high,
        +                                     int low)
        +

        + Converts a Windows FILETIME into a 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. +

        +
        +
        Parameters:
        +
        high - The higher double word of the FILETIME structure.
        +
        low - The lower double word of the FILETIME structure.
        +
        Returns:
        +
        The Windows FILETIME as a Date.
        +
        +
      • +
      + + + +
        +
      • +

        apptTimeToCalendar

        +
        public static Calendar apptTimeToCalendar(int minutes)
        +
      • +
      + + + + +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTRAFileContent.html b/com/pff/PSTRAFileContent.html new file mode 100644 index 0000000..84409f2 --- /dev/null +++ b/com/pff/PSTRAFileContent.html @@ -0,0 +1,459 @@ + + + + + + +PSTRAFileContent (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTRAFileContent

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTRecipient.html b/com/pff/PSTRecipient.html new file mode 100644 index 0000000..86fc4d3 --- /dev/null +++ b/com/pff/PSTRecipient.html @@ -0,0 +1,396 @@ + + + + + + +PSTRecipient (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTRecipient

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTRecipient
    +extends Object
    +
    Class containing recipient information
    +
    +
    Author:
    +
    Orin Eman
    +
    +
  • +
+
+
+ +
+
+
    +
  • + + + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getDisplayName

        +
        public String getDisplayName()
        +
      • +
      + + + +
        +
      • +

        getRecipientType

        +
        public int getRecipientType()
        +
      • +
      + + + +
        +
      • +

        getEmailAddressType

        +
        public String getEmailAddressType()
        +
      • +
      + + + +
        +
      • +

        getEmailAddress

        +
        public String getEmailAddress()
        +
      • +
      + + + +
        +
      • +

        getRecipientFlags

        +
        public int getRecipientFlags()
        +
      • +
      + + + +
        +
      • +

        getRecipientOrder

        +
        public int getRecipientOrder()
        +
      • +
      + + + +
        +
      • +

        getSmtpAddress

        +
        public String getSmtpAddress()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTRss.html b/com/pff/PSTRss.html new file mode 100644 index 0000000..44676fa --- /dev/null +++ b/com/pff/PSTRss.html @@ -0,0 +1,481 @@ + + + + + + +PSTRss (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTRss

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTRss
    +extends PSTMessage
    +
    Object that represents a RSS item
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+
    +
  • + + + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getPostRssChannelLink

        +
        public String getPostRssChannelLink()
        +
        Channel
        +
      • +
      + + + +
        +
      • +

        getPostRssItemLink

        +
        public String getPostRssItemLink()
        +
        Item link
        +
      • +
      + + + +
        +
      • +

        getPostRssItemHash

        +
        public int getPostRssItemHash()
        +
        Item hash Integer 32-bit signed
        +
      • +
      + + + +
        +
      • +

        getPostRssItemGuid

        +
        public String getPostRssItemGuid()
        +
        Item GUID
        +
      • +
      + + + +
        +
      • +

        getPostRssChannel

        +
        public String getPostRssChannel()
        +
        Channel GUID
        +
      • +
      + + + +
        +
      • +

        getPostRssItemXml

        +
        public String getPostRssItemXml()
        +
        Item XML
        +
      • +
      + + + +
        +
      • +

        getPostRssSubscription

        +
        public String getPostRssSubscription()
        +
        Subscription
        +
      • +
      + + + +
        +
      • +

        toString

        +
        public String toString()
        +
        Description copied from class: PSTMessage
        +
        string representation of this email
        +
        +
        Overrides:
        +
        toString in class PSTMessage
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTTask.html b/com/pff/PSTTask.html new file mode 100644 index 0000000..35de1d9 --- /dev/null +++ b/com/pff/PSTTask.html @@ -0,0 +1,625 @@ + + + + + + +PSTTask (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTTask

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTTask
    +extends PSTMessage
    +
    Object that represents Task items
    +
    +
    Author:
    +
    Richard Johnson
    +
    +
  • +
+
+
+ +
+
+
    +
  • + + + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getTaskStatus

        +
        public int getTaskStatus()
        +
        Status Integer 32-bit signed 0x0 => Not started
        +
      • +
      + + + +
        +
      • +

        getPercentComplete

        +
        public double getPercentComplete()
        +
        Percent Complete Floating point double precision (64-bit)
        +
      • +
      + + + +
        +
      • +

        isTeamTask

        +
        public boolean isTeamTask()
        +
        Is team task Boolean
        +
      • +
      + + + +
        +
      • +

        getTaskDateCompleted

        +
        public Date getTaskDateCompleted()
        +
        Date completed Filetime
        +
      • +
      + + + +
        +
      • +

        getTaskActualEffort

        +
        public int getTaskActualEffort()
        +
        Actual effort in minutes Integer 32-bit signed
        +
      • +
      + + + +
        +
      • +

        getTaskEstimatedEffort

        +
        public int getTaskEstimatedEffort()
        +
        Total effort in minutes Integer 32-bit signed
        +
      • +
      + + + +
        +
      • +

        getTaskVersion

        +
        public int getTaskVersion()
        +
        Task version Integer 32-bit signed FTK: Access count
        +
      • +
      + + + +
        +
      • +

        isTaskComplete

        +
        public boolean isTaskComplete()
        +
        Complete Boolean
        +
      • +
      + + + +
        +
      • +

        getTaskOwner

        +
        public String getTaskOwner()
        +
        Owner ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getTaskAssigner

        +
        public String getTaskAssigner()
        +
        Delegator ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getTaskLastUser

        +
        public String getTaskLastUser()
        +
        Unknown ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getTaskOrdinal

        +
        public int getTaskOrdinal()
        +
        Ordinal Integer 32-bit signed
        +
      • +
      + + + +
        +
      • +

        isTaskFRecurring

        +
        public boolean isTaskFRecurring()
        +
        Is recurring Boolean
        +
      • +
      + + + +
        +
      • +

        getTaskRole

        +
        public String getTaskRole()
        +
        Role ASCII or Unicode string
        +
      • +
      + + + +
        +
      • +

        getTaskOwnership

        +
        public int getTaskOwnership()
        +
        Ownership Integer 32-bit signed
        +
      • +
      + + + +
        +
      • +

        getAcceptanceState

        +
        public int getAcceptanceState()
        +
        Delegation State
        +
      • +
      + + + +
        +
      • +

        toString

        +
        public String toString()
        +
        Description copied from class: PSTMessage
        +
        string representation of this email
        +
        +
        Overrides:
        +
        toString in class PSTMessage
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTTimeZone.SYSTEMTIME.html b/com/pff/PSTTimeZone.SYSTEMTIME.html new file mode 100644 index 0000000..1bac4f3 --- /dev/null +++ b/com/pff/PSTTimeZone.SYSTEMTIME.html @@ -0,0 +1,336 @@ + + + + + + +PSTTimeZone.SYSTEMTIME (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTTimeZone.SYSTEMTIME

+
+
+ +
+
    +
  • +
    +
    Enclosing class:
    +
    PSTTimeZone
    +
    +
    +
    +
    public class PSTTimeZone.SYSTEMTIME
    +extends Object
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        wYear

        +
        public short wYear
        +
      • +
      + + + +
        +
      • +

        wMonth

        +
        public short wMonth
        +
      • +
      + + + +
        +
      • +

        wDayOfWeek

        +
        public short wDayOfWeek
        +
      • +
      + + + +
        +
      • +

        wDay

        +
        public short wDay
        +
      • +
      + + + +
        +
      • +

        wHour

        +
        public short wHour
        +
      • +
      + + + +
        +
      • +

        wMinute

        +
        public short wMinute
        +
      • +
      + + + +
        +
      • +

        wSecond

        +
        public short wSecond
        +
      • +
      + + + +
        +
      • +

        wMilliseconds

        +
        public short wMilliseconds
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/PSTTimeZone.html b/com/pff/PSTTimeZone.html new file mode 100644 index 0000000..7cbebe9 --- /dev/null +++ b/com/pff/PSTTimeZone.html @@ -0,0 +1,406 @@ + + + + + + +PSTTimeZone (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
com.pff
+

Class PSTTimeZone

+
+
+ +
+
    +
  • +
    +
    +
    public class PSTTimeZone
    +extends Object
    +
    Class containing time zone information
    +
    +
    Author:
    +
    Orin Eman
    +
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        utcTimeZone

        +
        public static SimpleTimeZone utcTimeZone
        +
        A static copy of the UTC time zone, available for others to use
        +
      • +
      +
    • +
    + + +
  • +
+
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/DescriptorIndexNode.html b/com/pff/class-use/DescriptorIndexNode.html new file mode 100644 index 0000000..5186023 --- /dev/null +++ b/com/pff/class-use/DescriptorIndexNode.html @@ -0,0 +1,255 @@ + + + + + + +Uses of Class com.pff.DescriptorIndexNode (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.DescriptorIndexNode

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/LZFu.html b/com/pff/class-use/LZFu.html new file mode 100644 index 0000000..3d16f3d --- /dev/null +++ b/com/pff/class-use/LZFu.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.LZFu (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.LZFu

+
+
No usage of com.pff.LZFu
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTActivity.html b/com/pff/class-use/PSTActivity.html new file mode 100644 index 0000000..659d42f --- /dev/null +++ b/com/pff/class-use/PSTActivity.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTActivity (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTActivity

+
+
No usage of com.pff.PSTActivity
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTAppointment.html b/com/pff/class-use/PSTAppointment.html new file mode 100644 index 0000000..1b96b54 --- /dev/null +++ b/com/pff/class-use/PSTAppointment.html @@ -0,0 +1,179 @@ + + + + + + +Uses of Class com.pff.PSTAppointment (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTAppointment

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTAppointmentException.html b/com/pff/class-use/PSTAppointmentException.html new file mode 100644 index 0000000..6b0b8a8 --- /dev/null +++ b/com/pff/class-use/PSTAppointmentException.html @@ -0,0 +1,166 @@ + + + + + + +Uses of Class com.pff.PSTAppointmentException (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTAppointmentException

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTAppointmentRecurrence.html b/com/pff/class-use/PSTAppointmentRecurrence.html new file mode 100644 index 0000000..c0a378f --- /dev/null +++ b/com/pff/class-use/PSTAppointmentRecurrence.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTAppointmentRecurrence (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTAppointmentRecurrence

+
+
No usage of com.pff.PSTAppointmentRecurrence
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTAttachment.html b/com/pff/class-use/PSTAttachment.html new file mode 100644 index 0000000..dfd0c89 --- /dev/null +++ b/com/pff/class-use/PSTAttachment.html @@ -0,0 +1,168 @@ + + + + + + +Uses of Class com.pff.PSTAttachment (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTAttachment

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTByteFileContent.html b/com/pff/class-use/PSTByteFileContent.html new file mode 100644 index 0000000..2e8384d --- /dev/null +++ b/com/pff/class-use/PSTByteFileContent.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTByteFileContent (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTByteFileContent

+
+
No usage of com.pff.PSTByteFileContent
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTContact.html b/com/pff/class-use/PSTContact.html new file mode 100644 index 0000000..9506d7e --- /dev/null +++ b/com/pff/class-use/PSTContact.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTContact (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTContact

+
+
No usage of com.pff.PSTContact
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTConversationIndex.ResponseLevel.html b/com/pff/class-use/PSTConversationIndex.ResponseLevel.html new file mode 100644 index 0000000..0d895a5 --- /dev/null +++ b/com/pff/class-use/PSTConversationIndex.ResponseLevel.html @@ -0,0 +1,166 @@ + + + + + + +Uses of Class com.pff.PSTConversationIndex.ResponseLevel (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTConversationIndex.ResponseLevel

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTConversationIndex.html b/com/pff/class-use/PSTConversationIndex.html new file mode 100644 index 0000000..8d6c713 --- /dev/null +++ b/com/pff/class-use/PSTConversationIndex.html @@ -0,0 +1,166 @@ + + + + + + +Uses of Class com.pff.PSTConversationIndex (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTConversationIndex

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTDistList.OneOffEntry.html b/com/pff/class-use/PSTDistList.OneOffEntry.html new file mode 100644 index 0000000..dc43db7 --- /dev/null +++ b/com/pff/class-use/PSTDistList.OneOffEntry.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTDistList.OneOffEntry (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTDistList.OneOffEntry

+
+
No usage of com.pff.PSTDistList.OneOffEntry
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTDistList.html b/com/pff/class-use/PSTDistList.html new file mode 100644 index 0000000..8053e46 --- /dev/null +++ b/com/pff/class-use/PSTDistList.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTDistList (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTDistList

+
+
No usage of com.pff.PSTDistList
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTException.html b/com/pff/class-use/PSTException.html new file mode 100644 index 0000000..ac3e70b --- /dev/null +++ b/com/pff/class-use/PSTException.html @@ -0,0 +1,377 @@ + + + + + + +Uses of Class com.pff.PSTException (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTException

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTFile.html b/com/pff/class-use/PSTFile.html new file mode 100644 index 0000000..1c5507f --- /dev/null +++ b/com/pff/class-use/PSTFile.html @@ -0,0 +1,256 @@ + + + + + + +Uses of Class com.pff.PSTFile (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTFile

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTFileContent.html b/com/pff/class-use/PSTFileContent.html new file mode 100644 index 0000000..c604c1f --- /dev/null +++ b/com/pff/class-use/PSTFileContent.html @@ -0,0 +1,196 @@ + + + + + + +Uses of Class com.pff.PSTFileContent (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTFileContent

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTFolder.html b/com/pff/class-use/PSTFolder.html new file mode 100644 index 0000000..b960e0b --- /dev/null +++ b/com/pff/class-use/PSTFolder.html @@ -0,0 +1,205 @@ + + + + + + +Uses of Class com.pff.PSTFolder (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTFolder

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTGlobalObjectId.html b/com/pff/class-use/PSTGlobalObjectId.html new file mode 100644 index 0000000..734ac12 --- /dev/null +++ b/com/pff/class-use/PSTGlobalObjectId.html @@ -0,0 +1,170 @@ + + + + + + +Uses of Class com.pff.PSTGlobalObjectId (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTGlobalObjectId

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTMessage.html b/com/pff/class-use/PSTMessage.html new file mode 100644 index 0000000..ddbccdc --- /dev/null +++ b/com/pff/class-use/PSTMessage.html @@ -0,0 +1,211 @@ + + + + + + +Uses of Class com.pff.PSTMessage (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTMessage

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTMessageStore.html b/com/pff/class-use/PSTMessageStore.html new file mode 100644 index 0000000..1a3d521 --- /dev/null +++ b/com/pff/class-use/PSTMessageStore.html @@ -0,0 +1,168 @@ + + + + + + +Uses of Class com.pff.PSTMessageStore (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTMessageStore

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTNodeInputStream.html b/com/pff/class-use/PSTNodeInputStream.html new file mode 100644 index 0000000..6af8ea2 --- /dev/null +++ b/com/pff/class-use/PSTNodeInputStream.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTNodeInputStream (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTNodeInputStream

+
+
No usage of com.pff.PSTNodeInputStream
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTObject.html b/com/pff/class-use/PSTObject.html new file mode 100644 index 0000000..583321b --- /dev/null +++ b/com/pff/class-use/PSTObject.html @@ -0,0 +1,278 @@ + + + + + + +Uses of Class com.pff.PSTObject (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTObject

+
+
+
    +
  • + + + + + + + + + + + + +
    Packages that use PSTObject 
    PackageDescription
    com.pff 
    +
  • +
  • +
      +
    • + + +

      Uses of PSTObject in com.pff

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Subclasses of PSTObject in com.pff 
      Modifier and TypeClass and Description
      class PSTActivity +
      PSTActivity represents Journal entries
      +
      class PSTAppointment +
      PSTAppointment is for Calendar items
      +
      class PSTAttachment +
      Class containing attachment information.
      +
      class PSTContact +
      Class for Contacts
      +
      class PSTDistList +
      PST DistList for extracting Addresses from Distribution lists.
      +
      class PSTFolder +
      Represents a folder in the PST File + Allows you to access child folders or items.
      +
      class PSTMessage +
      PST Message contains functions that are common across most MAPI objects.
      +
      class PSTMessageStore +
      Object that represents the message store.
      +
      class PSTRss +
      Object that represents a RSS item
      +
      class PSTTask +
      Object that represents Task items
      +
      + + + + + + + + + + + + +
      Fields in com.pff with type parameters of type PSTObject 
      Modifier and TypeField and Description
      protected LinkedHashMap<String,HashMap<DescriptorIndexNode,PSTObject>>PSTObject.children 
      + + + + + + + + + + + + + + + + +
      Methods in com.pff that return PSTObject 
      Modifier and TypeMethod and Description
      static PSTObjectPSTObject.detectAndLoadPSTObject(PSTFile theFile, + long descriptorIndex) +
      Detect and load a PST Object from a file with the specified descriptor + index
      +
      PSTObjectPSTFolder.getNextChild() +
      Get the next child of this folder + As there could be thousands of emails, we have these kind of cursor + operations
      +
      + + + + + + + + + + + + +
      Methods in com.pff that return types with arguments of type PSTObject 
      Modifier and TypeMethod and Description
      Vector<PSTObject>PSTFolder.getChildren(int numberToReturn) +
      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.
      +
      +
    • +
    +
  • +
+
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTRAFileContent.html b/com/pff/class-use/PSTRAFileContent.html new file mode 100644 index 0000000..35851e8 --- /dev/null +++ b/com/pff/class-use/PSTRAFileContent.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTRAFileContent (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTRAFileContent

+
+
No usage of com.pff.PSTRAFileContent
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTRecipient.html b/com/pff/class-use/PSTRecipient.html new file mode 100644 index 0000000..08e9c76 --- /dev/null +++ b/com/pff/class-use/PSTRecipient.html @@ -0,0 +1,168 @@ + + + + + + +Uses of Class com.pff.PSTRecipient (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTRecipient

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTRss.html b/com/pff/class-use/PSTRss.html new file mode 100644 index 0000000..5be39d8 --- /dev/null +++ b/com/pff/class-use/PSTRss.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTRss (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTRss

+
+
No usage of com.pff.PSTRss
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTTask.html b/com/pff/class-use/PSTTask.html new file mode 100644 index 0000000..7906ead --- /dev/null +++ b/com/pff/class-use/PSTTask.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class com.pff.PSTTask (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTTask

+
+
No usage of com.pff.PSTTask
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTTimeZone.SYSTEMTIME.html b/com/pff/class-use/PSTTimeZone.SYSTEMTIME.html new file mode 100644 index 0000000..36e54c6 --- /dev/null +++ b/com/pff/class-use/PSTTimeZone.SYSTEMTIME.html @@ -0,0 +1,174 @@ + + + + + + +Uses of Class com.pff.PSTTimeZone.SYSTEMTIME (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTTimeZone.SYSTEMTIME

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/class-use/PSTTimeZone.html b/com/pff/class-use/PSTTimeZone.html new file mode 100644 index 0000000..386f3d6 --- /dev/null +++ b/com/pff/class-use/PSTTimeZone.html @@ -0,0 +1,213 @@ + + + + + + +Uses of Class com.pff.PSTTimeZone (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
com.pff.PSTTimeZone

+
+
+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/package-frame.html b/com/pff/package-frame.html new file mode 100644 index 0000000..03c919f --- /dev/null +++ b/com/pff/package-frame.html @@ -0,0 +1,48 @@ + + + + + + +com.pff (java-libpst 0.9.3-SNAPSHOT API) + + + + + +

com.pff

+ + + diff --git a/com/pff/package-summary.html b/com/pff/package-summary.html new file mode 100644 index 0000000..89a0723 --- /dev/null +++ b/com/pff/package-summary.html @@ -0,0 +1,303 @@ + + + + + + +com.pff (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Package com.pff

+
+
+
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    DescriptorIndexNode +
    DescriptorIndexNode is a leaf item from the Descriptor index b-tree + It is like a pointer to an element in the PST file, everything has one...
    +
    LZFu +
    An implementation of the LZFu algorithm to decompress RTF content
    +
    PSTActivity +
    PSTActivity represents Journal entries
    +
    PSTAppointment +
    PSTAppointment is for Calendar items
    +
    PSTAppointmentException +
    Class containing information on exceptions to a recurring appointment
    +
    PSTAppointmentRecurrence +
    Class containing recurrence information for a recurring appointment
    +
    PSTAttachment +
    Class containing attachment information.
    +
    PSTByteFileContent 
    PSTContact +
    Class for Contacts
    +
    PSTConversationIndex +
    Class to hold decoded PidTagConversationIndex
    +
    PSTDistList +
    PST DistList for extracting Addresses from Distribution lists.
    +
    PSTFile +
    PSTFile is the containing class that allows you to access items within a .pst + file.
    +
    PSTFileContent 
    PSTFolder +
    Represents a folder in the PST File + Allows you to access child folders or items.
    +
    PSTGlobalObjectId +
    Class to represent a decoded PidLidGlobalObjectId or + PidLidCleanGlobalObjectId (for Meeting Exceptions) + See [MS-OXOCAL] + https://msdn.microsoft.com/en-us/library/cc425490(v=exchg.80).aspx, sections + 2.2.1.27(PidLidGlobalObjectId) & 2.2.1.28(PidLidCleanGlobalObjectId)
    +
    PSTMessage +
    PST Message contains functions that are common across most MAPI objects.
    +
    PSTMessageStore +
    Object that represents the message store.
    +
    PSTNodeInputStream +
    this input stream basically "maps" an input stream on top of the random + access file
    +
    PSTObject +
    PST Object is the root class of all PST Items.
    +
    PSTRAFileContent 
    PSTRecipient +
    Class containing recipient information
    +
    PSTRss +
    Object that represents a RSS item
    +
    PSTTask +
    Object that represents Task items
    +
    PSTTimeZone +
    Class containing time zone information
    +
    +
  • +
  • + + + + + + + + + + + + +
    Exception Summary 
    ExceptionDescription
    PSTException +
    Simple exception for PST File related errors
    +
    +
  • +
+
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/package-tree.html b/com/pff/package-tree.html new file mode 100644 index 0000000..4cb4f41 --- /dev/null +++ b/com/pff/package-tree.html @@ -0,0 +1,187 @@ + + + + + + +com.pff Class Hierarchy (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Hierarchy For Package com.pff

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/com/pff/package-use.html b/com/pff/package-use.html new file mode 100644 index 0000000..74b245d --- /dev/null +++ b/com/pff/package-use.html @@ -0,0 +1,269 @@ + + + + + + +Uses of Package com.pff (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Package
com.pff

+
+
+
    +
  • + + + + + + + + + + + + + + + + +
    Packages that use com.pff 
    PackageDescription
    com.pff 
    example 
    +
  • +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Classes in com.pff used by com.pff 
    Class and Description
    DescriptorIndexNode +
    DescriptorIndexNode is a leaf item from the Descriptor index b-tree + It is like a pointer to an element in the PST file, everything has one...
    +
    PSTAppointment +
    PSTAppointment is for Calendar items
    +
    PSTAppointmentException +
    Class containing information on exceptions to a recurring appointment
    +
    PSTAttachment +
    Class containing attachment information.
    +
    PSTConversationIndex +
    Class to hold decoded PidTagConversationIndex
    +
    PSTConversationIndex.ResponseLevel 
    PSTException +
    Simple exception for PST File related errors
    +
    PSTFile +
    PSTFile is the containing class that allows you to access items within a .pst + file.
    +
    PSTFileContent 
    PSTFolder +
    Represents a folder in the PST File + Allows you to access child folders or items.
    +
    PSTGlobalObjectId +
    Class to represent a decoded PidLidGlobalObjectId or + PidLidCleanGlobalObjectId (for Meeting Exceptions) + See [MS-OXOCAL] + https://msdn.microsoft.com/en-us/library/cc425490(v=exchg.80).aspx, sections + 2.2.1.27(PidLidGlobalObjectId) & 2.2.1.28(PidLidCleanGlobalObjectId)
    +
    PSTMessage +
    PST Message contains functions that are common across most MAPI objects.
    +
    PSTMessageStore +
    Object that represents the message store.
    +
    PSTObject +
    PST Object is the root class of all PST Items.
    +
    PSTRecipient +
    Class containing recipient information
    +
    PSTTimeZone +
    Class containing time zone information
    +
    PSTTimeZone.SYSTEMTIME 
    +
  • +
  • + + + + + + + + + + + + + + + +
    Classes in com.pff used by example 
    Class and Description
    PSTException +
    Simple exception for PST File related errors
    +
    PSTFolder +
    Represents a folder in the PST File + Allows you to access child folders or items.
    +
    +
  • +
+
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/constant-values.html b/constant-values.html new file mode 100644 index 0000000..bee0205 --- /dev/null +++ b/constant-values.html @@ -0,0 +1,607 @@ + + + + + + +Constant Field Values (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

Constant Field Values

+

Contents

+ +
+
+ + +

com.pff.*

+ +
+ +
+ + + + + + + +
+ + +

Copyright © 2016. All rights reserved.

+ + diff --git a/deprecated-list.html b/deprecated-list.html new file mode 100644 index 0000000..63479d1 --- /dev/null +++ b/deprecated-list.html @@ -0,0 +1,126 @@ + + + + + + +Deprecated List (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

Deprecated API

+

Contents

+
+ +
+ + + + + + + +
+ + +

Copyright © 2016. All rights reserved.

+ + diff --git a/example/Test.html b/example/Test.html new file mode 100644 index 0000000..89bba01 --- /dev/null +++ b/example/Test.html @@ -0,0 +1,306 @@ + + + + + + +Test (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
example
+

Class Test

+
+
+ +
+
    +
  • +
    +
    +
    public class Test
    +extends Object
    +
  • +
+
+
+ +
+
+ +
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/example/TestGui.html b/example/TestGui.html new file mode 100644 index 0000000..3a0406f --- /dev/null +++ b/example/TestGui.html @@ -0,0 +1,328 @@ + + + + + + +TestGui (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + + +
+
example
+

Class TestGui

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/example/class-use/Test.html b/example/class-use/Test.html new file mode 100644 index 0000000..0a26240 --- /dev/null +++ b/example/class-use/Test.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class example.Test (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
example.Test

+
+
No usage of example.Test
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/example/class-use/TestGui.html b/example/class-use/TestGui.html new file mode 100644 index 0000000..648e6ac --- /dev/null +++ b/example/class-use/TestGui.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Class example.TestGui (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Class
example.TestGui

+
+
No usage of example.TestGui
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/example/package-frame.html b/example/package-frame.html new file mode 100644 index 0000000..c4e5bf7 --- /dev/null +++ b/example/package-frame.html @@ -0,0 +1,22 @@ + + + + + + +example (java-libpst 0.9.3-SNAPSHOT API) + + + + + +

example

+
+

Classes

+ +
+ + diff --git a/example/package-summary.html b/example/package-summary.html new file mode 100644 index 0000000..2de2a3c --- /dev/null +++ b/example/package-summary.html @@ -0,0 +1,148 @@ + + + + + + +example (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Package example

+
+
+
    +
  • + + + + + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    Test 
    TestGui 
    +
  • +
+
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/example/package-tree.html b/example/package-tree.html new file mode 100644 index 0000000..f645727 --- /dev/null +++ b/example/package-tree.html @@ -0,0 +1,140 @@ + + + + + + +example Class Hierarchy (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Hierarchy For Package example

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/example/package-use.html b/example/package-use.html new file mode 100644 index 0000000..0af8046 --- /dev/null +++ b/example/package-use.html @@ -0,0 +1,126 @@ + + + + + + +Uses of Package example (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + + + + +
+

Uses of Package
example

+
+
No usage of example
+ + + + +

Copyright © 2016. All rights reserved.

+ + diff --git a/help-doc.html b/help-doc.html new file mode 100644 index 0000000..c4f7a12 --- /dev/null +++ b/help-doc.html @@ -0,0 +1,231 @@ + + + + + + +API Help (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

How This API Document Is Organized

+
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
+
+
+
    +
  • +

    Overview

    +

    The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

    +
  • +
  • +

    Package

    +

    Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

    +
      +
    • Interfaces (italic)
    • +
    • Classes
    • +
    • Enums
    • +
    • Exceptions
    • +
    • Errors
    • +
    • Annotation Types
    • +
    +
  • +
  • +

    Class/Interface

    +

    Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
      +
    • Class inheritance diagram
    • +
    • Direct Subclasses
    • +
    • All Known Subinterfaces
    • +
    • All Known Implementing Classes
    • +
    • Class/interface declaration
    • +
    • Class/interface description
    • +
    +
      +
    • Nested Class Summary
    • +
    • Field Summary
    • +
    • Constructor Summary
    • +
    • Method Summary
    • +
    +
      +
    • Field Detail
    • +
    • Constructor Detail
    • +
    • Method Detail
    • +
    +

    Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

    +
  • +
  • +

    Annotation Type

    +

    Each annotation type has its own separate page with the following sections:

    +
      +
    • Annotation Type declaration
    • +
    • Annotation Type description
    • +
    • Required Element Summary
    • +
    • Optional Element Summary
    • +
    • Element Detail
    • +
    +
  • +
  • +

    Enum

    +

    Each enum has its own separate page with the following sections:

    +
      +
    • Enum declaration
    • +
    • Enum description
    • +
    • Enum Constant Summary
    • +
    • Enum Constant Detail
    • +
    +
  • +
  • +

    Use

    +

    Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.

    +
  • +
  • +

    Tree (Class Hierarchy)

    +

    There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

    +
      +
    • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
    • +
    • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
    • +
    +
  • +
  • +

    Deprecated API

    +

    The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

    +
  • +
  • +

    Index

    +

    The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

    +
  • +
  • +

    Prev/Next

    +

    These links take you to the next or previous class, interface, package, or related page.

    +
  • +
  • +

    Frames/No Frames

    +

    These links show and hide the HTML frames. All pages are available with or without frames.

    +
  • +
  • +

    All Classes

    +

    The All Classes link shows all classes and interfaces except non-static nested types.

    +
  • +
  • +

    Serialized Form

    +

    Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

    +
  • +
  • +

    Constant Field Values

    +

    The Constant Field Values page lists the static final fields and their values.

    +
  • +
+This help file applies to API documentation generated using the standard doclet.
+ +
+ + + + + + + +
+ + +

Copyright © 2016. All rights reserved.

+ + diff --git a/index-all.html b/index-all.html new file mode 100644 index 0000000..9306783 --- /dev/null +++ b/index-all.html @@ -0,0 +1,2174 @@ + + + + + + +Index (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I L M N O P R S T U W  + + +

A

+
+
actionPerformed(ActionEvent) - Method in class example.TestGui
+
 
+
apptTimeToCalendar(int) - Static method in class com.pff.PSTObject
+
 
+
apptTimeToUTC(int, PSTTimeZone) - Static method in class com.pff.PSTObject
+
 
+
ATTACHMENT_METHOD_BY_REFERENCE - Static variable in class com.pff.PSTAttachment
+
 
+
ATTACHMENT_METHOD_BY_REFERENCE_ONLY - Static variable in class com.pff.PSTAttachment
+
 
+
ATTACHMENT_METHOD_BY_REFERENCE_RESOLVE - Static variable in class com.pff.PSTAttachment
+
 
+
ATTACHMENT_METHOD_BY_VALUE - Static variable in class com.pff.PSTAttachment
+
 
+
ATTACHMENT_METHOD_EMBEDDED - Static variable in class com.pff.PSTAttachment
+
 
+
ATTACHMENT_METHOD_NONE - Static variable in class com.pff.PSTAttachment
+
 
+
ATTACHMENT_METHOD_OLE - Static variable in class com.pff.PSTAttachment
+
 
+
attachmentsPresent() - Method in class com.pff.PSTAppointmentException
+
 
+
+ + + +

B

+
+
bytesToHex(byte[]) - Static method in class com.pff.PSTGlobalObjectId
+
 
+
+ + + +

C

+
+
children - Variable in class com.pff.PSTObject
+
 
+
close() - Method in class com.pff.PSTByteFileContent
+
 
+
close() - Method in class com.pff.PSTFile
+
 
+
close() - Method in class com.pff.PSTFileContent
+
 
+
close() - Method in class com.pff.PSTRAFileContent
+
 
+
com.pff - package com.pff
+
 
+
content - Variable in class com.pff.PSTByteFileContent
+
 
+
convertBigEndianBytesToLong(byte[], int, int) - Static method in class com.pff.PSTObject
+
+
Utility function for converting big endian bytes into a usable java long
+
+
convertLittleEndianBytesToLong(byte[]) - Static method in class com.pff.PSTObject
+
+
Utility function for converting little endian bytes into a usable java + long
+
+
convertLittleEndianBytesToLong(byte[], int, int) - Static method in class com.pff.PSTObject
+
+
Utility function for converting little endian bytes into a usable java + long
+
+
createMenu() - Method in class example.TestGui
+
 
+
+ + + +

D

+
+
data - Variable in class com.pff.PSTObject
+
 
+
dataOffsetIndexIdentifier - Variable in class com.pff.DescriptorIndexNode
+
 
+
decode(byte[]) - Static method in class com.pff.LZFu
+
 
+
decode(byte[]) - Static method in class com.pff.PSTObject
+
+
decode a lump of data that has been encrypted with the compressible + encryption
+
+
descriptorIdentifier - Variable in class com.pff.DescriptorIndexNode
+
 
+
DescriptorIndexNode - Class in com.pff
+
+
DescriptorIndexNode is a leaf item from the Descriptor index b-tree + It is like a pointer to an element in the PST file, everything has one...
+
+
descriptorIndexNode - Variable in class com.pff.PSTObject
+
 
+
detectAndLoadPSTObject(PSTFile, long) - Static method in class com.pff.PSTObject
+
+
Detect and load a PST Object from a file with the specified descriptor + index
+
+
+ + + +

E

+
+
embeddedMessagePresent() - Method in class com.pff.PSTAppointmentException
+
 
+
encode(byte[]) - Static method in class com.pff.PSTObject
+
 
+
ENCRYPTION_TYPE_COMPRESSIBLE - Static variable in class com.pff.PSTFile
+
 
+
ENCRYPTION_TYPE_NONE - Static variable in class com.pff.PSTFile
+
 
+
example - package example
+
 
+
extractLEFileOffset(long) - Method in class com.pff.PSTFile
+
+
Read a file offset from the file + PST Files have this tendency to store file offsets (pointers) in 8 little + endian bytes.
+
+
+ + + +

F

+
+
file - Variable in class com.pff.PSTRAFileContent
+
 
+
filetimeToDate(int, int) - Static method in class com.pff.PSTObject
+
+
+ Converts a Windows FILETIME into a Date.
+
+
finalize() - Method in class com.pff.PSTFile
+
+
destructor just closes the file handle...
+
+
+ + + +

G

+
+
getAcceptanceState() - Method in class com.pff.PSTTask
+
+
Delegation State
+
+
getAccount() - Method in class com.pff.PSTContact
+
+
Contact's Account name
+
+
getAcknowledgementMode() - Method in class com.pff.PSTMessage
+
+
Acknowledgment mode Integer 32-bit signed
+
+
getActionDate() - Method in class com.pff.PSTMessage
+
+
the date that this item had an action performed (eg.
+
+
getActionFlag() - Method in class com.pff.PSTMessage
+
+
Action flag + This relates to the replying / forwarding of messages.
+
+
getAddressType() - Method in class com.pff.PSTDistList.OneOffEntry
+
 
+
getAddrType() - Method in class com.pff.PSTObject
+
+
Address type + Known values are SMTP, EX (Exchange) and UNKNOWN
+
+
getAllAttendees() - Method in class com.pff.PSTAppointment
+
 
+
getAnniversary() - Method in class com.pff.PSTContact
+
+
(Wedding) Anniversary
+
+
getAppointmentCounterProposal() - Method in class com.pff.PSTAppointment
+
 
+
getAppointmentSequence() - Method in class com.pff.PSTAppointment
+
 
+
getAppointmentSequence(int) - Method in class com.pff.PSTAppointmentException
+
 
+
getAssistant() - Method in class com.pff.PSTContact
+
+
Assistant�s Name
+
+
getAssistantTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Assistant Phone Number
+
+
getAssociateContentCount() - Method in class com.pff.PSTFolder
+
 
+
getAttachment(int) - Method in class com.pff.PSTMessage
+
+
get a specific attachment from this email.
+
+
getAttachmentContentDisposition() - Method in class com.pff.PSTAttachment
+
+
Attachment content disposition
+
+
getAttachMethod() - Method in class com.pff.PSTAttachment
+
+
Attachment method Integer 32-bit signed 0 => None (No attachment) 1 => By + value 2 => By reference 3 => By reference resolve 4 => By reference only + 5 => Embedded message 6 => OLE
+
+
getAttachNum() - Method in class com.pff.PSTAttachment
+
+
Attachment number
+
+
getAttachSize() - Method in class com.pff.PSTAttachment
+
+
Attachment size
+
+
getAttendeeCriticalChange() - Method in class com.pff.PSTAppointment
+
 
+
getAttrHidden() - Method in class com.pff.PSTMessage
+
+
Attribute hidden
+
+
getAttrReadonly() - Method in class com.pff.PSTMessage
+
+
Attribute read only
+
+
getAttrSystem() - Method in class com.pff.PSTMessage
+
+
Attribute system
+
+
getBias() - Method in class com.pff.PSTTimeZone
+
 
+
getBinaryItem(int) - Method in class com.pff.PSTObject
+
 
+
getBirthday() - Method in class com.pff.PSTContact
+
+
Birthday
+
+
getBlockOffsets() - Method in class com.pff.PSTNodeInputStream
+
+
Get the offsets (block positions) used in the array
+
+
getBody() - Method in class com.pff.PSTMessage
+
+
Plain text e-mail body
+
+
getBodyHTML() - Method in class com.pff.PSTMessage
+
+
HTML e-mail body
+
+
getBodyPrefix() - Method in class com.pff.PSTMessage
+
 
+
getBooleanItem(int) - Method in class com.pff.PSTObject
+
 
+
getBooleanItem(int, boolean) - Method in class com.pff.PSTObject
+
 
+
getBusiness2TelephoneNumber() - Method in class com.pff.PSTContact
+
+
Contact's secondary office (business) phone number
+
+
getBusinessAddressCity() - Method in class com.pff.PSTContact
+
+
Business Address City
+
+
getBusinessAddressCountry() - Method in class com.pff.PSTContact
+
+
Business Address Country
+
+
getBusinessAddressStateOrProvince() - Method in class com.pff.PSTContact
+
+
Business Address State
+
+
getBusinessAddressStreet() - Method in class com.pff.PSTContact
+
+
Business Address Street
+
+
getBusinessFaxNumber() - Method in class com.pff.PSTContact
+
+
Contact's office (business) fax number
+
+
getBusinessHomePage() - Method in class com.pff.PSTContact
+
+
Business Home Page
+
+
getBusinessPoBox() - Method in class com.pff.PSTContact
+
+
Business PO Box
+
+
getBusinessPostalCode() - Method in class com.pff.PSTContact
+
+
Business Postal Code
+
+
getBusinessTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Business/Office Telephone Number
+
+
getBusyStatus() - Method in class com.pff.PSTAppointment
+
 
+
getBusyStatus() - Method in class com.pff.PSTAppointmentException
+
 
+
getBytes() - Method in class com.pff.PSTByteFileContent
+
 
+
getCalendarType() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getCallbackTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Callback telephone number
+
+
getCarTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Car Phone Number
+
+
getCCAttendees() - Method in class com.pff.PSTAppointment
+
 
+
getChildDescriptorNodes() - Method in class com.pff.PSTFolder
+
 
+
getChildren(int) - Method in class com.pff.PSTFolder
+
+
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.
+
+
getChildrensNames() - Method in class com.pff.PSTContact
+
+
Children's names
+
+
getCleanGlobalObjectId() - Method in class com.pff.PSTAppointment
+
 
+
getClientSubmitTime() - Method in class com.pff.PSTMessage
+
+
get the client submit time
+
+
getColor() - Method in class com.pff.PSTAppointment
+
 
+
getColorCategories() - Method in class com.pff.PSTMessage
+
+
get the categories defined for this message
+
+
getComment() - Method in class com.pff.PSTObject
+
+
Comment
+
+
getCompanyMainPhoneNumber() - Method in class com.pff.PSTContact
+
+
Company Main Phone
+
+
getCompanyName() - Method in class com.pff.PSTContact
+
+
Contact's company name
+
+
getComputerNetworkName() - Method in class com.pff.PSTContact
+
+
Computer Network Name
+
+
getConferenceServerAllowExternal() - Method in class com.pff.PSTAppointment
+
 
+
getConferenceServerPassword() - Method in class com.pff.PSTAppointment
+
 
+
getContainerClass() - Method in class com.pff.PSTFolder
+
 
+
getContainerFlags() - Method in class com.pff.PSTFolder
+
+
Container flags Integer 32-bit signed
+
+
getContentCount() - Method in class com.pff.PSTFolder
+
+
the number of emails in this folder + this is as reported by the PST file, for a number calculated by the + library use getEmailCount
+
+
getContentHandle() - Method in class com.pff.PSTFile
+
+
get the handle to the file content we are currently accessing
+
+
getContentId() - Method in class com.pff.PSTAttachment
+
+
Attachment Content ID
+
+
getConversationId() - Method in class com.pff.PSTMessage
+
 
+
getConversationIndex() - Method in class com.pff.PSTMessage
+
 
+
getConversationTopic() - Method in class com.pff.PSTMessage
+
+
Conversation topic + This is basically the subject from which Fwd:, Re, etc.
+
+
getCreationTime() - Method in class com.pff.PSTAttachment
+
 
+
getCreationTime() - Method in class com.pff.PSTGlobalObjectId
+
 
+
getCreationTime() - Method in class com.pff.PSTObject
+
+
Creation time
+
+
getCreationTimeHigh() - Method in class com.pff.PSTGlobalObjectId
+
 
+
getCreationTimeLow() - Method in class com.pff.PSTGlobalObjectId
+
 
+
getCustomerId() - Method in class com.pff.PSTContact
+
+
Customer ID
+
+
getData() - Method in class com.pff.PSTGlobalObjectId
+
 
+
getDataSize() - Method in class com.pff.PSTGlobalObjectId
+
 
+
getDateItem(int) - Method in class com.pff.PSTObject
+
 
+
getDay() - Method in class com.pff.PSTGlobalObjectId
+
 
+
getDaylightBias() - Method in class com.pff.PSTTimeZone
+
 
+
getDaylightStart() - Method in class com.pff.PSTTimeZone
+
 
+
getDeleteAfterSubmit() - Method in class com.pff.PSTMessage
+
+
Delete after submit
+
+
getDeletedInstanceDates() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getDeliveryTime() - Method in class com.pff.PSTConversationIndex
+
 
+
getDeltaCode() - Method in class com.pff.PSTConversationIndex.ResponseLevel
+
 
+
getDepartmentName() - Method in class com.pff.PSTContact
+
+
Contact's department name Used in contact item
+
+
getDescription() - Method in class com.pff.PSTAppointmentException
+
 
+
getDescriptorNode() - Method in class com.pff.PSTObject
+
+
get the descriptor node for this item + this identifies the location of the node in the BTree and associated info
+
+
getDescriptorNodeId() - Method in class com.pff.PSTObject
+
+
get the descriptor identifier for this item + can be used for loading objects through detectAndLoadPSTObject(PSTFile + theFile, long descriptorIndex)
+
+
getDetails() - Method in class com.pff.PSTMessageStore
+
 
+
getDisableFullFidelity() - Method in class com.pff.PSTMessage
+
+
Disable full fidelity
+
+
getDisplayBCC() - Method in class com.pff.PSTMessage
+
+
Display BCC
+
+
getDisplayCC() - Method in class com.pff.PSTMessage
+
+
Display CC
+
+
getDisplayName() - Method in class com.pff.PSTDistList.OneOffEntry
+
 
+
getDisplayName() - Method in class com.pff.PSTMessageStore
+
+
get the message store display name
+
+
getDisplayName() - Method in class com.pff.PSTObject
+
+
get the display name
+
+
getDisplayName() - Method in class com.pff.PSTRecipient
+
 
+
getDisplayNamePrefix() - Method in class com.pff.PSTContact
+
+
Display Name Prefix (Contact Title)
+
+
getDisplayTo() - Method in class com.pff.PSTMessage
+
+
Display To
+
+
getDistributionListMembers() - Method in class com.pff.PSTDistList
+
+
Get an array of the members in this distribution list.
+
+
getDoubleItem(int) - Method in class com.pff.PSTObject
+
 
+
getDoubleItem(int, double) - Method in class com.pff.PSTObject
+
 
+
getDTStamp() - Method in class com.pff.PSTAppointmentException
+
 
+
getDuration() - Method in class com.pff.PSTAppointment
+
 
+
getEmail1AddressType() - Method in class com.pff.PSTContact
+
+
E-mail1 Address Type
+
+
getEmail1DisplayName() - Method in class com.pff.PSTContact
+
+
E-mail1 Display Name
+
+
getEmail1EmailAddress() - Method in class com.pff.PSTContact
+
+
E-mail1 Address
+
+
getEmail1EmailType() - Method in class com.pff.PSTContact
+
+
E-mail1 type
+
+
getEmail1OriginalDisplayName() - Method in class com.pff.PSTContact
+
+
E-mail1 Display Name
+
+
getEmail2AddressType() - Method in class com.pff.PSTContact
+
+
E-mail2 address type
+
+
getEmail2DisplayName() - Method in class com.pff.PSTContact
+
+
E-mail2 display name
+
+
getEmail2EmailAddress() - Method in class com.pff.PSTContact
+
+
E-mail2 e-mail address
+
+
getEmail2OriginalDisplayName() - Method in class com.pff.PSTContact
+
+
E-mail2 original display name
+
+
getEmail3AddressType() - Method in class com.pff.PSTContact
+
+
E-mail3 address type
+
+
getEmail3DisplayName() - Method in class com.pff.PSTContact
+
+
E-mail3 display name
+
+
getEmail3EmailAddress() - Method in class com.pff.PSTContact
+
+
E-mail3 e-mail address
+
+
getEmail3OriginalDisplayName() - Method in class com.pff.PSTContact
+
+
E-mail3 original display name
+
+
getEmailAddress() - Method in class com.pff.PSTDistList.OneOffEntry
+
 
+
getEmailAddress() - Method in class com.pff.PSTObject
+
+
E-mail address
+
+
getEmailAddress() - Method in class com.pff.PSTRecipient
+
 
+
getEmailAddressType() - Method in class com.pff.PSTRecipient
+
 
+
getEmailCount() - Method in class com.pff.PSTFolder
+
+
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
+
+
getEmbeddedMessage() - Method in class com.pff.PSTAppointmentException
+
 
+
getEmbeddedPSTMessage() - Method in class com.pff.PSTAttachment
+
 
+
getEncryptionType() - Method in class com.pff.PSTFile
+
+
get the type of encryption the file uses
+
+
getEndDate() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getEndDateTime() - Method in class com.pff.PSTAppointmentException
+
 
+
getEndTime() - Method in class com.pff.PSTAppointment
+
 
+
getEndTimeOffset() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getEndTimeZone() - Method in class com.pff.PSTAppointment
+
 
+
getEndType() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getException(int) - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getExceptionCount() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getFax1AddressType() - Method in class com.pff.PSTContact
+
+
Fax1 Address Type
+
+
getFax1EmailAddress() - Method in class com.pff.PSTContact
+
+
Fax1 Email Address
+
+
getFax1OriginalDisplayName() - Method in class com.pff.PSTContact
+
+
Fax1 Original Display Name
+
+
getFax2AddressType() - Method in class com.pff.PSTContact
+
+
Fax2 Address Type
+
+
getFax2EmailAddress() - Method in class com.pff.PSTContact
+
+
Fax2 Email Address
+
+
getFax2OriginalDisplayName() - Method in class com.pff.PSTContact
+
+
Fax2 Original Display Name
+
+
getFax3AddressType() - Method in class com.pff.PSTContact
+
+
Fax3 Address Type
+
+
getFax3EmailAddress() - Method in class com.pff.PSTContact
+
+
Fax3 Email Address
+
+
getFax3OriginalDisplayName() - Method in class com.pff.PSTContact
+
+
Fax3 Original Display Name
+
+
getFile() - Method in class com.pff.PSTRAFileContent
+
 
+
getFileHandle() - Method in class com.pff.PSTFile
+
+
get the handle to the RandomAccessFile we are currently accessing (if + any)
+
+
getFileInputStream() - Method in class com.pff.PSTAttachment
+
 
+
getFilename() - Method in class com.pff.PSTAttachment
+
+
Attachment (short) filename ASCII or Unicode string
+
+
getFilePointer() - Method in class com.pff.PSTByteFileContent
+
 
+
getFilePointer() - Method in class com.pff.PSTFileContent
+
 
+
getFilePointer() - Method in class com.pff.PSTRAFileContent
+
 
+
getFilesize() - Method in class com.pff.PSTAttachment
+
 
+
getFileUnder() - Method in class com.pff.PSTContact
+
+
File under FTK: File as
+
+
getFirstDateTime() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getFirstDOW() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getFolderType() - Method in class com.pff.PSTFolder
+
 
+
getFreeBusyLocation() - Method in class com.pff.PSTContact
+
+
Free/Busy Location (URL)
+
+
getFtpSite() - Method in class com.pff.PSTContact
+
+
Ftp Site
+
+
getGeneration() - Method in class com.pff.PSTContact
+
+
Contact's generational abbreviation FTK: Name suffix
+
+
getGivenName() - Method in class com.pff.PSTContact
+
+
Contacts given name
+
+
getGlobalObjectId() - Method in class com.pff.PSTAppointment
+
 
+
getGovernmentIdNumber() - Method in class com.pff.PSTContact
+
+
Contacts Government ID Number
+
+
getGuid() - Method in class com.pff.PSTConversationIndex
+
 
+
getHobbies() - Method in class com.pff.PSTContact
+
+
Hobbies
+
+
getHome2TelephoneNumber() - Method in class com.pff.PSTContact
+
+
Home Phone 2
+
+
getHomeAddress() - Method in class com.pff.PSTContact
+
+
Home Address
+
+
getHomeAddressCity() - Method in class com.pff.PSTContact
+
+
Home Address City
+
+
getHomeAddressCountry() - Method in class com.pff.PSTContact
+
+
Home Address Country
+
+
getHomeAddressPostalCode() - Method in class com.pff.PSTContact
+
+
Home Address Postal Code
+
+
getHomeAddressPostOfficeBox() - Method in class com.pff.PSTContact
+
+
Home Address Post Office Box
+
+
getHomeAddressStateOrProvince() - Method in class com.pff.PSTContact
+
+
Home Address State or Province
+
+
getHomeAddressStreet() - Method in class com.pff.PSTContact
+
+
Home Address Street
+
+
getHomeFaxNumber() - Method in class com.pff.PSTContact
+
+
Contact's home fax number
+
+
getHomeTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Home Telephone Number
+
+
getHtml() - Method in class com.pff.PSTContact
+
+
Webpage
+
+
getIconIndex() - Method in class com.pff.PSTMessage
+
+
Icon index
+
+
getImportance(int) - Method in class com.pff.PSTAppointmentException
+
 
+
getImportance() - Method in class com.pff.PSTMessage
+
+
get the importance of the email
+
+
getInitials() - Method in class com.pff.PSTContact
+
+
Contacts initials
+
+
getInReplyToId() - Method in class com.pff.PSTMessage
+
+
In-Reply-To
+
+
getInstantMessagingAddress() - Method in class com.pff.PSTContact
+
+
IM Address
+
+
getInternetArticleNumber() - Method in class com.pff.PSTMessage
+
+
Internet article number
+
+
getInternetMessageId() - Method in class com.pff.PSTMessage
+
+
Message ID for this email as allocated per rfc2822
+
+
getIntItem(int) - Method in class com.pff.PSTObject
+
 
+
getIntItem(int, int) - Method in class com.pff.PSTObject
+
 
+
getIsdnNumber() - Method in class com.pff.PSTContact
+
+
ISDN Number
+
+
getItemsString() - Method in class com.pff.PSTObject
+
 
+
getKeyword() - Method in class com.pff.PSTContact
+
+
Keyword
+
+
getLanguage() - Method in class com.pff.PSTContact
+
+
Contact's language
+
+
getLastModificationTime() - Method in class com.pff.PSTObject
+
+
Modification time
+
+
getLeafSize(long) - Method in class com.pff.PSTFile
+
 
+
getLocaleId() - Method in class com.pff.PSTAppointment
+
 
+
getLocation() - Method in class com.pff.PSTAppointment
+
 
+
getLocation() - Method in class com.pff.PSTAppointmentException
+
 
+
getLocation() - Method in class com.pff.PSTContact
+
+
Contact's location
+
+
getLocationBytes() - Method in class com.pff.PSTAppointmentException
+
 
+
getLogDuration() - Method in class com.pff.PSTActivity
+
+
Duration
+
+
getLogEnd() - Method in class com.pff.PSTActivity
+
+
End
+
+
getLogFlags() - Method in class com.pff.PSTActivity
+
+
LogFlags
+
+
getLogStart() - Method in class com.pff.PSTActivity
+
+
Start
+
+
getLogType() - Method in class com.pff.PSTActivity
+
+
Type
+
+
getLogTypeDesc() - Method in class com.pff.PSTActivity
+
+
Type Description
+
+
getLongFilename() - Method in class com.pff.PSTAttachment
+
+
Attachment long filename ASCII or Unicode string
+
+
getLongItem(int) - Method in class com.pff.PSTObject
+
 
+
getLongItem(int, long) - Method in class com.pff.PSTObject
+
 
+
getLongPathname() - Method in class com.pff.PSTAttachment
+
+
Attachment long pathname ASCII or Unicode string
+
+
getManagerName() - Method in class com.pff.PSTContact
+
+
Manager�s Name
+
+
getMeetingStatus() - Method in class com.pff.PSTAppointment
+
 
+
getMeetingType() - Method in class com.pff.PSTAppointmentException
+
 
+
getMessageCcMe() - Method in class com.pff.PSTMessage
+
+
My address in CC field Boolean
+
+
getMessageClass() - Method in class com.pff.PSTMessage
+
+
get the message class for the email
+
+
getMessageClass() - Method in class com.pff.PSTObject
+
 
+
getMessageDeliveryTime() - Method in class com.pff.PSTMessage
+
+
Message delivery time
+
+
getMessageRecipMe() - Method in class com.pff.PSTMessage
+
+
Indicates that the receiving mailbox owner is a primary or a carbon copy + (Cc) recipient
+
+
getMessageSize() - Method in class com.pff.PSTMessage
+
+
Message size
+
+
getMessageStore() - Method in class com.pff.PSTFile
+
+
get the message store of the PST file.
+
+
getMessageToMe() - Method in class com.pff.PSTMessage
+
+
My address in To field Boolean
+
+
getMhsCommonName() - Method in class com.pff.PSTContact
+
+
MHS Common Name
+
+
getMiddleName() - Method in class com.pff.PSTContact
+
+
Middle Name
+
+
getMimeSequence() - Method in class com.pff.PSTAttachment
+
+
Attachment mime sequence
+
+
getMimeTag() - Method in class com.pff.PSTAttachment
+
+
Attachment mime type ASCII or Unicode string
+
+
getMobileTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Mobile Phone Number
+
+
getModificationTime() - Method in class com.pff.PSTAttachment
+
 
+
getModifiedInstanceDates() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getMonth() - Method in class com.pff.PSTGlobalObjectId
+
 
+
getName() - Method in class com.pff.PSTTimeZone
+
 
+
getNativeBodyType() - Method in class com.pff.PSTMessage
+
+
Message content properties
+
+
getNetMeetingAutostart() - Method in class com.pff.PSTAppointment
+
 
+
getNetMeetingDocumentPathName() - Method in class com.pff.PSTAppointment
+
 
+
getNetMeetingOrganizerAlias() - Method in class com.pff.PSTAppointment
+
 
+
getNetMeetingServer() - Method in class com.pff.PSTAppointment
+
 
+
getNetMeetingType() - Method in class com.pff.PSTAppointment
+
 
+
getNetShowURL() - Method in class com.pff.PSTAppointment
+
 
+
getNextChild() - Method in class com.pff.PSTFolder
+
+
Get the next child of this folder + As there could be thousands of emails, we have these kind of cursor + operations
+
+
getNextSendAcct() - Method in class com.pff.PSTMessage
+
 
+
getNickname() - Method in class com.pff.PSTContact
+
+
Nickname
+
+
getNodeType() - Method in class com.pff.PSTObject
+
 
+
getNodeType(int) - Static method in class com.pff.PSTObject
+
 
+
getNote() - Method in class com.pff.PSTContact
+
+
Note
+
+
getNumberOfAttachments() - Method in class com.pff.PSTMessage
+
+
get the number of attachments for this message
+
+
getNumberOfRecipients() - Method in class com.pff.PSTMessage
+
+
get the number of recipients for this message
+
+
getObjectType() - Method in class com.pff.PSTMessage
+
+
Object type
+
+
getOccurrenceCount() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getOfficeLocation() - Method in class com.pff.PSTContact
+
+
Contact's office location
+
+
getOrganizationalIdNumber() - Method in class com.pff.PSTContact
+
+
Organizational identification number
+
+
getOriginalDisplayBcc() - Method in class com.pff.PSTMessage
+
+
Original display BCC ASCII or Unicode string
+
+
getOriginalDisplayCc() - Method in class com.pff.PSTMessage
+
+
Original display CC ASCII or Unicode string
+
+
getOriginalDisplayName() - Method in class com.pff.PSTContact
+
+
Original display name
+
+
getOriginalDisplayTo() - Method in class com.pff.PSTMessage
+
+
Original display TO ASCII or Unicode string
+
+
getOriginalSensitivity() - Method in class com.pff.PSTMessage
+
+
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
+
+
getOriginalStartDate() - Method in class com.pff.PSTAppointmentException
+
 
+
getOriginalSubject() - Method in class com.pff.PSTMessage
+
+
Original subject ASCII or Unicode string
+
+
getOriginatorDeliveryReportRequested() - Method in class com.pff.PSTMessage
+
+
Originator delivery report requested set if the sender wants a delivery + report from all recipients 0 = false 0 != true
+
+
getOtherAddress() - Method in class com.pff.PSTContact
+
+
Other Address
+
+
getOtherAddressCity() - Method in class com.pff.PSTContact
+
+
Other Address City
+
+
getOtherAddressCountry() - Method in class com.pff.PSTContact
+
+
Other Address Country
+
+
getOtherAddressPostalCode() - Method in class com.pff.PSTContact
+
+
Other Address Postal Code
+
+
getOtherAddressPostOfficeBox() - Method in class com.pff.PSTContact
+
+
Other Address Post Office box
+
+
getOtherAddressStateOrProvince() - Method in class com.pff.PSTContact
+
+
Other Address State
+
+
getOtherAddressStreet() - Method in class com.pff.PSTContact
+
+
Other Address Street
+
+
getOtherTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Other Phone Number
+
+
getOwnerCriticalChange() - Method in class com.pff.PSTAppointment
+
 
+
getPagerTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Pager Phone Number
+
+
getPathname() - Method in class com.pff.PSTAttachment
+
+
Attachment (short) pathname ASCII or Unicode string
+
+
getPatternSpecific() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getPatternSpecificNth() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getPatternType() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getPercentComplete() - Method in class com.pff.PSTTask
+
+
Percent Complete Floating point double precision (64-bit)
+
+
getPeriod() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getPersonalHomePage() - Method in class com.pff.PSTContact
+
+
Personal Home Page
+
+
getPidTagSentRepresentingSearchKey() - Method in class com.pff.PSTMessage
+
 
+
getPostalAddress() - Method in class com.pff.PSTContact
+
+
Default Postal Address
+
+
getPostalAddressId() - Method in class com.pff.PSTContact
+
+
Selected Mailing Address
+
+
getPostRssChannel() - Method in class com.pff.PSTRss
+
+
Channel GUID
+
+
getPostRssChannelLink() - Method in class com.pff.PSTRss
+
+
Channel
+
+
getPostRssItemGuid() - Method in class com.pff.PSTRss
+
+
Item GUID
+
+
getPostRssItemHash() - Method in class com.pff.PSTRss
+
+
Item hash Integer 32-bit signed
+
+
getPostRssItemLink() - Method in class com.pff.PSTRss
+
+
Item link
+
+
getPostRssItemXml() - Method in class com.pff.PSTRss
+
+
Item XML
+
+
getPostRssSubscription() - Method in class com.pff.PSTRss
+
+
Subscription
+
+
getPreferredByName() - Method in class com.pff.PSTContact
+
+
Preferred By Name
+
+
getPrimaryFaxNumber() - Method in class com.pff.PSTContact
+
+
Primary Fax Number
+
+
getPrimarySendAccount() - Method in class com.pff.PSTMessage
+
 
+
getPrimaryTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Primary Telephone
+
+
getPriority() - Method in class com.pff.PSTMessage
+
+
Priority Integer 32-bit signed -1 = NonUrgent 0 = Normal 1 = Urgent
+
+
getProfession() - Method in class com.pff.PSTContact
+
+
Profession
+
+
getPSTFile() - Method in class com.pff.PSTNodeInputStream
+
 
+
getPSTFileType() - Method in class com.pff.PSTFile
+
 
+
getRadioTelephoneNumber() - Method in class com.pff.PSTContact
+
+
Radio Phone Number
+
+
getRandom() - Method in class com.pff.PSTConversationIndex.ResponseLevel
+
 
+
getRcvdRepresentingAddrtype() - Method in class com.pff.PSTMessage
+
+
Received representing address type.
+
+
getRcvdRepresentingEmailAddress() - Method in class com.pff.PSTMessage
+
+
Received representing e-mail address
+
+
getRcvdRepresentingName() - Method in class com.pff.PSTMessage
+
+
Received representing name ASCII or Unicode string
+
+
getReadReceiptRequested() - Method in class com.pff.PSTMessage
+
+
Read Receipt Requested Boolean 0 = false 0 != true
+
+
getReceivedByAddress() - Method in class com.pff.PSTMessage
+
+
Received by email address
+
+
getReceivedByAddressType() - Method in class com.pff.PSTMessage
+
+
Received by address type + Known values are SMTP, EX (Exchange) and UNKNOWN
+
+
getReceivedByName() - Method in class com.pff.PSTMessage
+
+
get received by name
+
+
getRecipient(int) - Method in class com.pff.PSTMessage
+
+
get a specific recipient from this email.
+
+
getRecipientFlags() - Method in class com.pff.PSTRecipient
+
 
+
getRecipientOrder() - Method in class com.pff.PSTRecipient
+
 
+
getRecipientReassignmentProhibited() - Method in class com.pff.PSTMessage
+
+
Recipient Reassignment Prohibited Boolean 0 = false 0 != true
+
+
getRecipientsString() - Method in class com.pff.PSTMessage
+
 
+
getRecipientType() - Method in class com.pff.PSTMessage
+
+
Recipient type Integer 32-bit signed 0x01 => To 0x02 =>CC
+
+
getRecipientType() - Method in class com.pff.PSTRecipient
+
 
+
getRecurFrequency() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getRecurrenceBase() - Method in class com.pff.PSTAppointment
+
 
+
getRecurrencePattern() - Method in class com.pff.PSTAppointment
+
 
+
getRecurrenceStructure() - Method in class com.pff.PSTAppointment
+
 
+
getRecurrenceTimeZone() - Method in class com.pff.PSTAppointment
+
 
+
getRecurrenceType() - Method in class com.pff.PSTAppointment
+
 
+
getReminderDelta() - Method in class com.pff.PSTAppointmentException
+
 
+
getReminderDelta() - Method in class com.pff.PSTMessage
+
 
+
getReminderSet() - Method in class com.pff.PSTAppointmentException
+
 
+
getReminderSet() - Method in class com.pff.PSTMessage
+
+
Is a reminder set on this object?
+
+
getRenderingPosition() - Method in class com.pff.PSTAttachment
+
+
Attachment Position Integer 32-bit signed
+
+
getReplyRecipientNames() - Method in class com.pff.PSTMessage
+
+
Reply recipients names ASCII or Unicode string
+
+
getRequiredAttendees() - Method in class com.pff.PSTAppointment
+
 
+
getResponseLevels() - Method in class com.pff.PSTConversationIndex
+
 
+
getResponseRequested() - Method in class com.pff.PSTMessage
+
+
Response requested Boolean
+
+
getResponseStatus() - Method in class com.pff.PSTAppointment
+
 
+
getResponsibility() - Method in class com.pff.PSTMessage
+
+
Responsibility
+
+
getReturnPath() - Method in class com.pff.PSTMessage
+
+
Return Path
+
+
getRootFolder() - Method in class com.pff.PSTFile
+
+
get the root folder for the PST file.
+
+
getRTFBody() - Method in class com.pff.PSTMessage
+
 
+
getRTFSyncBodyCount() - Method in class com.pff.PSTMessage
+
+
RTF Sync Body character count
+
+
getRTFSyncBodyCRC() - Method in class com.pff.PSTMessage
+
+
RTF Sync Body CRC
+
+
getRTFSyncBodyTag() - Method in class com.pff.PSTMessage
+
+
RTF Sync body tag
+
+
getRTFSyncPrefixCount() - Method in class com.pff.PSTMessage
+
+
RTF whitespace prefix count
+
+
getRTFSyncTrailingCount() - Method in class com.pff.PSTMessage
+
+
RTF whitespace tailing count
+
+
getSendAsICAL() - Method in class com.pff.PSTAppointment
+
 
+
getSenderAddrtype() - Method in class com.pff.PSTMessage
+
+
Sender address type.
+
+
getSenderEmailAddress() - Method in class com.pff.PSTMessage
+
+
Sender e-mail address
+
+
getSenderEntryId() - Method in class com.pff.PSTMessage
+
 
+
getSenderName() - Method in class com.pff.PSTMessage
+
+
Sender name
+
+
getSensitivity() - Method in class com.pff.PSTMessage
+
+
Sensitivity Integer 32-bit signed sender's opinion of the sensitivity of + an email 0 = None 1 = Personal 2 = Private 3 = Company Confidential
+
+
getSentRepresentingAddressType() - Method in class com.pff.PSTMessage
+
+
Sent representing address type + Known values are SMTP, EX (Exchange) and UNKNOWN
+
+
getSentRepresentingAddrtype() - Method in class com.pff.PSTMessage
+
+
Sent representing address type ASCII or Unicode string Known values are + SMTP, EX (Exchange) and UNKNOWN
+
+
getSentRepresentingEmailAddress() - Method in class com.pff.PSTMessage
+
+
Sent representing email address
+
+
getSentRepresentingName() - Method in class com.pff.PSTMessage
+
+
get sent representing name
+
+
getShowAsBusy() - Method in class com.pff.PSTAppointment
+
 
+
getSimpleTimeZone() - Method in class com.pff.PSTTimeZone
+
 
+
getSize() - Method in class com.pff.PSTAttachment
+
 
+
getSlidingFlag() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getSMTPAddress() - Method in class com.pff.PSTContact
+
 
+
getSmtpAddress() - Method in class com.pff.PSTRecipient
+
 
+
getSpouseName() - Method in class com.pff.PSTContact
+
+
Spouse�s Name
+
+
getStandardBias() - Method in class com.pff.PSTTimeZone
+
 
+
getStandardStart() - Method in class com.pff.PSTTimeZone
+
 
+
getStart() - Method in class com.pff.PSTTimeZone
+
 
+
getStartDate() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getStartDateTime() - Method in class com.pff.PSTAppointmentException
+
 
+
getStartTime() - Method in class com.pff.PSTAppointment
+
 
+
getStartTimeOffset() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getStartTimeZone() - Method in class com.pff.PSTAppointment
+
 
+
getStringItem(int) - Method in class com.pff.PSTObject
+
 
+
getStringItem(int, int) - Method in class com.pff.PSTObject
+
 
+
getStringItem(int, int, String) - Method in class com.pff.PSTObject
+
 
+
getSubFolderCount() - Method in class com.pff.PSTFolder
+
+
the number of child folders in this folder
+
+
getSubFolders() - Method in class com.pff.PSTFolder
+
+
get all of the sub folders...
+
+
getSubject() - Method in class com.pff.PSTAppointmentException
+
 
+
getSubject() - Method in class com.pff.PSTMessage
+
+
get the subject
+
+
getSubjectBytes() - Method in class com.pff.PSTAppointmentException
+
 
+
getSubType() - Method in class com.pff.PSTAppointment
+
 
+
getSubType() - Method in class com.pff.PSTAppointmentException
+
 
+
getSurname() - Method in class com.pff.PSTContact
+
+
Contact's surname FTK: Last name
+
+
getTagRecordKeyAsUUID() - Method in class com.pff.PSTMessageStore
+
+
Get the tag record key, unique to this pst
+
+
getTaskActualEffort() - Method in class com.pff.PSTTask
+
+
Actual effort in minutes Integer 32-bit signed
+
+
getTaskAssigner() - Method in class com.pff.PSTTask
+
+
Delegator ASCII or Unicode string
+
+
getTaskDateCompleted() - Method in class com.pff.PSTTask
+
+
Date completed Filetime
+
+
getTaskDueDate() - Method in class com.pff.PSTMessage
+
+
Due date Filetime
+
+
getTaskEstimatedEffort() - Method in class com.pff.PSTTask
+
+
Total effort in minutes Integer 32-bit signed
+
+
getTaskLastUser() - Method in class com.pff.PSTTask
+
+
Unknown ASCII or Unicode string
+
+
getTaskOrdinal() - Method in class com.pff.PSTTask
+
+
Ordinal Integer 32-bit signed
+
+
getTaskOwner() - Method in class com.pff.PSTTask
+
+
Owner ASCII or Unicode string
+
+
getTaskOwnership() - Method in class com.pff.PSTTask
+
+
Ownership Integer 32-bit signed
+
+
getTaskRole() - Method in class com.pff.PSTTask
+
+
Role ASCII or Unicode string
+
+
getTaskStartDate() - Method in class com.pff.PSTMessage
+
+
Start date Filetime
+
+
getTaskStatus() - Method in class com.pff.PSTTask
+
+
Status Integer 32-bit signed 0x0 => Not started
+
+
getTaskVersion() - Method in class com.pff.PSTTask
+
+
Task version Integer 32-bit signed FTK: Access count
+
+
getTelexNumber() - Method in class com.pff.PSTContact
+
+
Telex Number
+
+
getTimeDelta() - Method in class com.pff.PSTConversationIndex.ResponseLevel
+
 
+
getTimezone() - Method in class com.pff.PSTAppointment
+
 
+
getTimeZone() - Method in class com.pff.PSTAppointmentRecurrence
+
 
+
getTimeZoneItem(int) - Method in class com.pff.PSTObject
+
 
+
getTitle() - Method in class com.pff.PSTContact
+
+
Contact's job title FTK: Profession
+
+
getToAttendees() - Method in class com.pff.PSTAppointment
+
 
+
getTransmittableDisplayName() - Method in class com.pff.PSTContact
+
+
Transmittable display name
+
+
getTransportMessageHeaders() - Method in class com.pff.PSTMessage
+
+
Transport message headers ASCII or Unicode string These contain the SMTP + e-mail headers.
+
+
getTtytddPhoneNumber() - Method in class com.pff.PSTContact
+
+
TTY/TDD Phone
+
+
getUnreadCount() - Method in class com.pff.PSTFolder
+
+
Amount of unread content items Integer 32-bit signed
+
+
getURLCompName() - Method in class com.pff.PSTMessage
+
+
URL computer name + Contains the .eml file name
+
+
getURLCompNamePostfix() - Method in class com.pff.PSTMessage
+
+
URL computer name postfix
+
+
getWorkAddress() - Method in class com.pff.PSTContact
+
+
Business Address
+
+
getWorkAddressCity() - Method in class com.pff.PSTContact
+
+
Business Address Street
+
+
getWorkAddressCountry() - Method in class com.pff.PSTContact
+
+
Business Address Country
+
+
getWorkAddressPostalCode() - Method in class com.pff.PSTContact
+
+
Business Address Postal Code
+
+
getWorkAddressPostOfficeBox() - Method in class com.pff.PSTContact
+
+
Business Address Country
+
+
getWorkAddressState() - Method in class com.pff.PSTContact
+
+
Business Address State
+
+
getWorkAddressStreet() - Method in class com.pff.PSTContact
+
+
Business Address City
+
+
getYear() - Method in class com.pff.PSTGlobalObjectId
+
 
+
getYearHigh() - Method in class com.pff.PSTGlobalObjectId
+
 
+
getYearLow() - Method in class com.pff.PSTGlobalObjectId
+
 
+
+ + + +

H

+
+
hasAttachments() - Method in class com.pff.PSTMessage
+
 
+
hasForwarded() - Method in class com.pff.PSTMessage
+
+
is the action flag for this item "forward"?
+
+
hasReplied() - Method in class com.pff.PSTMessage
+
+
is the action flag for this item "replied"?
+
+
hasSubfolders() - Method in class com.pff.PSTFolder
+
+
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
+
+
hexArray - Static variable in class com.pff.PSTGlobalObjectId
+
 
+
+ + + +

I

+
+
IMPORTANCE_HIGH - Static variable in class com.pff.PSTMessage
+
 
+
IMPORTANCE_LOW - Static variable in class com.pff.PSTMessage
+
 
+
IMPORTANCE_NORMAL - Static variable in class com.pff.PSTMessage
+
 
+
index - Variable in class com.pff.PSTByteFileContent
+
 
+
isAssociated() - Method in class com.pff.PSTMessage
+
 
+
isAttachmentInvisibleInHtml() - Method in class com.pff.PSTAttachment
+
+
Attachment not available in HTML
+
+
isAttachmentInvisibleInRTF() - Method in class com.pff.PSTAttachment
+
+
Attachment not available in RTF
+
+
isAttachmentMhtmlRef() - Method in class com.pff.PSTAttachment
+
+
Attachment is MHTML REF
+
+
isConversationIndexTracking() - Method in class com.pff.PSTMessage
+
 
+
isDocumentPosted() - Method in class com.pff.PSTActivity
+
+
DocPosted
+
+
isDocumentPrinted() - Method in class com.pff.PSTActivity
+
+
DocPrinted
+
+
isDocumentRouted() - Method in class com.pff.PSTActivity
+
+
DocRouted
+
+
isDocumentSaved() - Method in class com.pff.PSTActivity
+
+
DocSaved
+
+
isEncrypted() - Method in class com.pff.PSTNodeInputStream
+
 
+
isEqual(PSTTimeZone) - Method in class com.pff.PSTTimeZone
+
 
+
isFlagged() - Method in class com.pff.PSTMessage
+
+
"flagged" items are actually emails with a due date.
+
+
isFromMe() - Method in class com.pff.PSTMessage
+
 
+
isNonReceiptNotificationRequested() - Method in class com.pff.PSTMessage
+
+
Non receipt notification requested
+
+
isOnlineMeeting() - Method in class com.pff.PSTAppointment
+
 
+
isOriginatorNonDeliveryReportRequested() - Method in class com.pff.PSTMessage
+
+
Originator non delivery report requested
+
+
isPasswordProtected() - Method in class com.pff.PSTMessageStore
+
+
Is this pst file is password protected.
+
+
isRead() - Method in class com.pff.PSTMessage
+
 
+
isRecurring() - Method in class com.pff.PSTAppointment
+
 
+
isReplyRequested() - Method in class com.pff.PSTMessage
+
+
Reply requested
+
+
isResent() - Method in class com.pff.PSTMessage
+
 
+
isRTFInSync() - Method in class com.pff.PSTMessage
+
+
Compressed RTF in Sync Boolean
+
+
isSilent() - Method in class com.pff.PSTAppointment
+
 
+
isSubmitted() - Method in class com.pff.PSTMessage
+
 
+
isTaskComplete() - Method in class com.pff.PSTTask
+
+
Complete Boolean
+
+
isTaskFRecurring() - Method in class com.pff.PSTTask
+
+
Is recurring Boolean
+
+
isTeamTask() - Method in class com.pff.PSTTask
+
+
Is team task Boolean
+
+
isUnmodified() - Method in class com.pff.PSTMessage
+
 
+
isUnsent() - Method in class com.pff.PSTMessage
+
 
+
isURLCompNameSet() - Method in class com.pff.PSTMessage
+
+
URL computer name set
+
+
items - Variable in class com.pff.PSTObject
+
 
+
itemType - Variable in class com.pff.DescriptorIndexNode
+
 
+
+ + + +

L

+
+
length() - Method in class com.pff.PSTNodeInputStream
+
 
+
localDescriptorItems - Variable in class com.pff.PSTObject
+
 
+
localDescriptorsOffsetIndexIdentifier - Variable in class com.pff.DescriptorIndexNode
+
 
+
LZFu - Class in com.pff
+
+
An implementation of the LZFu algorithm to decompress RTF content
+
+
LZFu() - Constructor for class com.pff.LZFu
+
 
+
LZFU_HEADER - Static variable in class com.pff.LZFu
+
 
+
+ + + +

M

+
+
main(String[]) - Static method in class example.Test
+
 
+
main(String[]) - Static method in class example.TestGui
+
 
+
MAPI_BCC - Static variable in class com.pff.PSTRecipient
+
 
+
MAPI_CC - Static variable in class com.pff.PSTRecipient
+
 
+
MAPI_TO - Static variable in class com.pff.PSTRecipient
+
 
+
markSupported() - Method in class com.pff.PSTNodeInputStream
+
 
+
moveChildCursorTo(int) - Method in class com.pff.PSTFolder
+
+
move the internal folder cursor to the desired position + position 0 is before the first record.
+
+
+ + + +

N

+
+
NID_TYPE_ASSOC_CONTENTS_TABLE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_ASSOC_MESSAGE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_ATTACHMENT - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_ATTACHMENT_TABLE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_CONTENTS_TABLE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_CONTENTS_TABLE_INDEX - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_HID - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_HIERARCHY_TABLE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_INTERNAL - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_LTP - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_NORMAL_FOLDER - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_NORMAL_MESSAGE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_OUTGOING_QUEUE_TABLE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_RECEIVE_FOLDER_TABLE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_RECIPIENT_TABLE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_SEARCH_CONTENTS_TABLE - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_SEARCH_CRITERIA_OBJECT - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_SEARCH_FOLDER - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_SEARCH_TABLE_INDEX - Static variable in class com.pff.PSTObject
+
 
+
NID_TYPE_SEARCH_UPDATE_QUEUE - Static variable in class com.pff.PSTObject
+
 
+
+ + + +

O

+
+
OneOffEntry() - Constructor for class com.pff.PSTDistList.OneOffEntry
+
 
+
+ + + +

P

+
+
parentDescriptorIndexIdentifier - Variable in class com.pff.DescriptorIndexNode
+
 
+
printDepth() - Method in class example.Test
+
 
+
printFormattedNumber(String, long) - Static method in class com.pff.PSTObject
+
+
Output a number in a variety of formats for easier consumption
+
+
printFormattedNumber(long) - Static method in class com.pff.PSTObject
+
 
+
printHexFormatted(byte[], boolean) - Static method in class com.pff.PSTObject
+
+
Output a dump of data in hex format in the order it was read in
+
+
printHexFormatted(byte[], boolean, int[]) - Static method in class com.pff.PSTObject
+
 
+
processFolder(PSTFolder) - Method in class example.Test
+
 
+
PS_INTERNET_HEADERS - Static variable in class com.pff.PSTFile
+
 
+
PS_MAPI - Static variable in class com.pff.PSTFile
+
 
+
PS_PUBLIC_STRINGS - Static variable in class com.pff.PSTFile
+
 
+
PSETID_Address - Static variable in class com.pff.PSTFile
+
 
+
PSETID_AirSync - Static variable in class com.pff.PSTFile
+
 
+
PSETID_Appointment - Static variable in class com.pff.PSTFile
+
 
+
PSETID_Common - Static variable in class com.pff.PSTFile
+
 
+
PSETID_Log - Static variable in class com.pff.PSTFile
+
 
+
PSETID_Meeting - Static variable in class com.pff.PSTFile
+
 
+
PSETID_Messaging - Static variable in class com.pff.PSTFile
+
 
+
PSETID_Note - Static variable in class com.pff.PSTFile
+
 
+
PSETID_PostRss - Static variable in class com.pff.PSTFile
+
 
+
PSETID_Sharing - Static variable in class com.pff.PSTFile
+
 
+
PSETID_Task - Static variable in class com.pff.PSTFile
+
 
+
PSETID_UnifiedMessaging - Static variable in class com.pff.PSTFile
+
 
+
PST_TYPE_2013_UNICODE - Static variable in class com.pff.PSTFile
+
 
+
PST_TYPE_ANSI - Static variable in class com.pff.PSTFile
+
 
+
PST_TYPE_ANSI_2 - Static variable in class com.pff.PSTFile
+
 
+
PST_TYPE_UNICODE - Static variable in class com.pff.PSTFile
+
 
+
PSTActivity - Class in com.pff
+
+
PSTActivity represents Journal entries
+
+
PSTActivity(PSTFile, DescriptorIndexNode) - Constructor for class com.pff.PSTActivity
+
 
+
PSTActivity(PSTFile, DescriptorIndexNode, PSTTableBC, HashMap<Integer, PSTDescriptorItem>) - Constructor for class com.pff.PSTActivity
+
 
+
PSTAppointment - Class in com.pff
+
+
PSTAppointment is for Calendar items
+
+
PSTAppointmentException - Class in com.pff
+
+
Class containing information on exceptions to a recurring appointment
+
+
PSTAppointmentRecurrence - Class in com.pff
+
+
Class containing recurrence information for a recurring appointment
+
+
PSTAppointmentRecurrence(byte[], PSTAppointment, PSTTimeZone) - Constructor for class com.pff.PSTAppointmentRecurrence
+
 
+
PSTAttachment - Class in com.pff
+
+
Class containing attachment information.
+
+
PSTByteFileContent - Class in com.pff
+
 
+
PSTByteFileContent(byte[]) - Constructor for class com.pff.PSTByteFileContent
+
 
+
PSTContact - Class in com.pff
+
+
Class for Contacts
+
+
PSTContact(PSTFile, DescriptorIndexNode) - Constructor for class com.pff.PSTContact
+
 
+
PSTContact(PSTFile, DescriptorIndexNode, PSTTableBC, HashMap<Integer, PSTDescriptorItem>) - Constructor for class com.pff.PSTContact
+
 
+
PSTConversationIndex - Class in com.pff
+
+
Class to hold decoded PidTagConversationIndex
+
+
PSTConversationIndex(byte[]) - Constructor for class com.pff.PSTConversationIndex
+
 
+
PSTConversationIndex.ResponseLevel - Class in com.pff
+
 
+
PSTDistList - Class in com.pff
+
+
PST DistList for extracting Addresses from Distribution lists.
+
+
PSTDistList.OneOffEntry - Class in com.pff
+
+
Inner class to represent distribution list one-off entries.
+
+
PSTException - Exception in com.pff
+
+
Simple exception for PST File related errors
+
+
PSTFile - Class in com.pff
+
+
PSTFile is the containing class that allows you to access items within a .pst + file.
+
+
PSTFile(String) - Constructor for class com.pff.PSTFile
+
+
constructor
+
+
PSTFile(File) - Constructor for class com.pff.PSTFile
+
 
+
PSTFile(byte[]) - Constructor for class com.pff.PSTFile
+
 
+
PSTFile(PSTFileContent) - Constructor for class com.pff.PSTFile
+
 
+
pstFile - Variable in class com.pff.PSTObject
+
 
+
PSTFileContent - Class in com.pff
+
 
+
PSTFileContent() - Constructor for class com.pff.PSTFileContent
+
 
+
PSTFolder - Class in com.pff
+
+
Represents a folder in the PST File + Allows you to access child folders or items.
+
+
PSTGlobalObjectId - Class in com.pff
+
+
Class to represent a decoded PidLidGlobalObjectId or + PidLidCleanGlobalObjectId (for Meeting Exceptions) + See [MS-OXOCAL] + https://msdn.microsoft.com/en-us/library/cc425490(v=exchg.80).aspx, sections + 2.2.1.27(PidLidGlobalObjectId) & 2.2.1.28(PidLidCleanGlobalObjectId)
+
+
PSTGlobalObjectId(byte[]) - Constructor for class com.pff.PSTGlobalObjectId
+
 
+
PSTMessage - Class in com.pff
+
+
PST Message contains functions that are common across most MAPI objects.
+
+
PSTMessageStore - Class in com.pff
+
+
Object that represents the message store.
+
+
PSTNodeInputStream - Class in com.pff
+
+
this input stream basically "maps" an input stream on top of the random + access file
+
+
PSTObject - Class in com.pff
+
+
PST Object is the root class of all PST Items.
+
+
PSTObject(PSTFile, DescriptorIndexNode) - Constructor for class com.pff.PSTObject
+
 
+
PSTObject(PSTFile, DescriptorIndexNode, PSTTableBC, HashMap<Integer, PSTDescriptorItem>) - Constructor for class com.pff.PSTObject
+
+
for pre-population
+
+
PSTRAFileContent - Class in com.pff
+
 
+
PSTRAFileContent(File) - Constructor for class com.pff.PSTRAFileContent
+
 
+
PSTRecipient - Class in com.pff
+
+
Class containing recipient information
+
+
PSTRss - Class in com.pff
+
+
Object that represents a RSS item
+
+
PSTRss(PSTFile, DescriptorIndexNode) - Constructor for class com.pff.PSTRss
+
 
+
PSTRss(PSTFile, DescriptorIndexNode, PSTTableBC, HashMap<Integer, PSTDescriptorItem>) - Constructor for class com.pff.PSTRss
+
 
+
PSTTask - Class in com.pff
+
+
Object that represents Task items
+
+
PSTTask(PSTFile, DescriptorIndexNode) - Constructor for class com.pff.PSTTask
+
 
+
PSTTask(PSTFile, DescriptorIndexNode, PSTTableBC, HashMap<Integer, PSTDescriptorItem>) - Constructor for class com.pff.PSTTask
+
 
+
PSTTimeZone - Class in com.pff
+
+
Class containing time zone information
+
+
PSTTimeZone.SYSTEMTIME - Class in com.pff
+
 
+
+ + + +

R

+
+
read() - Method in class com.pff.PSTByteFileContent
+
 
+
read(byte[]) - Method in class com.pff.PSTByteFileContent
+
 
+
read() - Method in class com.pff.PSTFileContent
+
 
+
read(byte[]) - Method in class com.pff.PSTFileContent
+
 
+
read() - Method in class com.pff.PSTNodeInputStream
+
 
+
read(byte[]) - Method in class com.pff.PSTNodeInputStream
+
+
Read a block from the input stream.
+
+
read(byte[], int, int) - Method in class com.pff.PSTNodeInputStream
+
 
+
read() - Method in class com.pff.PSTRAFileContent
+
 
+
read(byte[]) - Method in class com.pff.PSTRAFileContent
+
 
+
readByte() - Method in class com.pff.PSTByteFileContent
+
 
+
readByte() - Method in class com.pff.PSTFileContent
+
 
+
readByte() - Method in class com.pff.PSTRAFileContent
+
 
+
readCompletely(byte[]) - Method in class com.pff.PSTFileContent
+
 
+
readCompletely(byte[]) - Method in class com.pff.PSTNodeInputStream
+
+
Read a block from the input stream, ensuring buffer is completely filled.
+
+
RECIPIENT_TYPE_CC - Static variable in class com.pff.PSTMessage
+
 
+
RECIPIENT_TYPE_TO - Static variable in class com.pff.PSTMessage
+
 
+
ReferenceByteArrayID - Static variable in class com.pff.PSTGlobalObjectId
+
 
+
reset() - Method in class com.pff.PSTNodeInputStream
+
 
+
ResponseLevel(short, long, short) - Constructor for class com.pff.PSTConversationIndex.ResponseLevel
+
 
+
+ + + +

S

+
+
seek(long) - Method in class com.pff.PSTByteFileContent
+
 
+
seek(long) - Method in class com.pff.PSTFileContent
+
 
+
seek(long) - Method in class com.pff.PSTNodeInputStream
+
 
+
seek(long) - Method in class com.pff.PSTRAFileContent
+
 
+
seekAndReadLong(long, int) - Method in class com.pff.PSTNodeInputStream
+
 
+
setBytes(byte[]) - Method in class com.pff.PSTByteFileContent
+
 
+
setFile(RandomAccessFile) - Method in class com.pff.PSTRAFileContent
+
 
+
+ + + +

T

+
+
table - Variable in class com.pff.PSTObject
+
 
+
Test - Class in example
+
 
+
Test(String) - Constructor for class example.Test
+
 
+
TestGui - Class in example
+
 
+
TestGui() - Constructor for class example.TestGui
+
 
+
toString() - Method in class com.pff.DescriptorIndexNode
+
 
+
toString() - Method in class com.pff.PSTActivity
+
 
+
toString() - Method in class com.pff.PSTContact
+
 
+
toString() - Method in class com.pff.PSTConversationIndex
+
 
+
toString() - Method in class com.pff.PSTDistList.OneOffEntry
+
 
+
toString() - Method in class com.pff.PSTGlobalObjectId
+
 
+
toString() - Method in class com.pff.PSTMessage
+
+
string representation of this email
+
+
toString() - Method in class com.pff.PSTObject
+
 
+
toString() - Method in class com.pff.PSTRss
+
 
+
toString() - Method in class com.pff.PSTTask
+
 
+
+ + + +

U

+
+
utcTimeZone - Static variable in class com.pff.PSTTimeZone
+
+
A static copy of the UTC time zone, available for others to use
+
+
+ + + +

W

+
+
wDay - Variable in class com.pff.PSTTimeZone.SYSTEMTIME
+
 
+
wDayOfWeek - Variable in class com.pff.PSTTimeZone.SYSTEMTIME
+
 
+
wHour - Variable in class com.pff.PSTTimeZone.SYSTEMTIME
+
 
+
withOffset(Date) - Method in class com.pff.PSTConversationIndex.ResponseLevel
+
 
+
wMilliseconds - Variable in class com.pff.PSTTimeZone.SYSTEMTIME
+
 
+
wMinute - Variable in class com.pff.PSTTimeZone.SYSTEMTIME
+
 
+
wMonth - Variable in class com.pff.PSTTimeZone.SYSTEMTIME
+
 
+
wSecond - Variable in class com.pff.PSTTimeZone.SYSTEMTIME
+
 
+
wYear - Variable in class com.pff.PSTTimeZone.SYSTEMTIME
+
 
+
+A B C D E F G H I L M N O P R S T U W 
+ +
+ + + + + + + +
+ + +

Copyright © 2016. All rights reserved.

+ + diff --git a/index.html b/index.html new file mode 100644 index 0000000..86ddfa5 --- /dev/null +++ b/index.html @@ -0,0 +1,75 @@ + + + + + + +java-libpst 0.9.3-SNAPSHOT API + + + + + + + + + +<noscript> +<div>JavaScript is disabled on your browser.</div> +</noscript> +<h2>Frame Alert</h2> +<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> + + + diff --git a/overview-frame.html b/overview-frame.html new file mode 100644 index 0000000..82235d3 --- /dev/null +++ b/overview-frame.html @@ -0,0 +1,23 @@ + + + + + + +Overview List (java-libpst 0.9.3-SNAPSHOT API) + + + + + + +
+

Packages

+ +
+

 

+ + diff --git a/overview-summary.html b/overview-summary.html new file mode 100644 index 0000000..57e59a0 --- /dev/null +++ b/overview-summary.html @@ -0,0 +1,144 @@ + + + + + + +Overview (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

java-libpst 0.9.3-SNAPSHOT API

+
+
+ + + + + + + + + + + + + + + + +
Packages 
PackageDescription
com.pff 
example 
+
+ +
+ + + + + + + +
+ + +

Copyright © 2016. All rights reserved.

+ + diff --git a/overview-tree.html b/overview-tree.html new file mode 100644 index 0000000..b8aa812 --- /dev/null +++ b/overview-tree.html @@ -0,0 +1,190 @@ + + + + + + +Class Hierarchy (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

Hierarchy For All Packages

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+ +
+ + + + + + + +
+ + +

Copyright © 2016. All rights reserved.

+ + diff --git a/package-list b/package-list new file mode 100644 index 0000000..ab51bcb --- /dev/null +++ b/package-list @@ -0,0 +1,2 @@ +com.pff +example diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 08b0c46..0000000 --- a/pom.xml +++ /dev/null @@ -1,125 +0,0 @@ - - 4.0.0 - - - org.sonatype.oss - oss-parent - 7 - - - com.pff - java-libpst - jar - - java-libpst - 0.9.5-SNAPSHOT - A library to read PST files with java, without need for external libraries. - https://code.google.com/p/java-libpst/ - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - https://github.com/rjohnsondev/java-libpst/tags/java-libpst-0.9.4 - scm:https://github.com/rjohnsondev/java-libpst.git/tags/java-libpst-0.9.4 - - - - - Richard Johnson - @rjohnsondev - - - - - - UTF-8 - - - - - junit - junit - 4.13.1 - test - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9.1 - - - - attach-javadocs - - jar - - - - - - - org.apache.maven.plugins - maven-gpg-plugin - - - sign-artifacts - verify - - sign - - - - - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.1 - - forked-path - false - ${arguments} -Psonatype-oss-release - - - - - - - diff --git a/script.js b/script.js new file mode 100644 index 0000000..b346356 --- /dev/null +++ b/script.js @@ -0,0 +1,30 @@ +function show(type) +{ + count = 0; + for (var key in methods) { + var row = document.getElementById(key); + if ((methods[key] & type) != 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) +{ + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} diff --git a/serialized-form.html b/serialized-form.html new file mode 100644 index 0000000..585c4e2 --- /dev/null +++ b/serialized-form.html @@ -0,0 +1,143 @@ + + + + + + +Serialized Form (java-libpst 0.9.3-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

Serialized Form

+
+
+ +
+ +
+ + + + + + + +
+ + +

Copyright © 2016. All rights reserved.

+ + diff --git a/src/main/java/com/pff/DescriptorIndexNode.java b/src/main/java/com/pff/DescriptorIndexNode.java deleted file mode 100644 index dbd9f68..0000000 --- a/src/main/java/com/pff/DescriptorIndexNode.java +++ /dev/null @@ -1,105 +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; - -/** - * DescriptorIndexNode is a leaf item from the Descriptor index b-tree - * It is like a pointer to an element in the PST file, everything has one... - * - * @author Richard Johnson - */ -public class DescriptorIndexNode { - public int descriptorIdentifier; - public long dataOffsetIndexIdentifier; - public long localDescriptorsOffsetIndexIdentifier; - public int parentDescriptorIndexIdentifier; - public int itemType; - - // PSTFile.PSTFileBlock dataBlock = null; - - /** - * parse the data out into something meaningful - * - * @param data the data - * @param pstFileType the pst file type - */ - DescriptorIndexNode(final byte[] data, final int pstFileType) { - // parse it out - // first 4 bytes - if (pstFileType == PSTFile.PST_TYPE_ANSI) { - this.descriptorIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, 0, 4); - this.dataOffsetIndexIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, 4, 8); - this.localDescriptorsOffsetIndexIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, 8, 12); - this.parentDescriptorIndexIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, 12, 16); - // itemType = (int)PSTObject.convertLittleEndianBytesToLong(data, - // 28, 32); - } else { - this.descriptorIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, 0, 4); - this.dataOffsetIndexIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, 8, 16); - this.localDescriptorsOffsetIndexIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, 16, 24); - this.parentDescriptorIndexIdentifier = (int) PSTObject.convertLittleEndianBytesToLong(data, 24, 28); - this.itemType = (int) PSTObject.convertLittleEndianBytesToLong(data, 28, 32); - } - } - - /* - * void readData(PSTFile file) - * throws IOException, PSTException - * { - * if ( dataBlock == null ) { - * dataBlock = file.readLeaf(dataOffsetIndexIdentifier); - * } - * } - * - */ - - PSTNodeInputStream getNodeInputStream(final PSTFile pstFile) throws IOException, PSTException { - return new PSTNodeInputStream(pstFile, pstFile.getOffsetIndexNode(this.dataOffsetIndexIdentifier)); - } - - @Override - public String toString() { - - return "DescriptorIndexNode\n" + "Descriptor Identifier: " + this.descriptorIdentifier + " (0x" - + Long.toHexString(this.descriptorIdentifier) + ")\n" + "Data offset identifier: " - + this.dataOffsetIndexIdentifier + " (0x" + Long.toHexString(this.dataOffsetIndexIdentifier) + ")\n" - + "Local descriptors offset index identifier: " + this.localDescriptorsOffsetIndexIdentifier + " (0x" - + Long.toHexString(this.localDescriptorsOffsetIndexIdentifier) + ")\n" - + "Parent Descriptor Index Identifier: " + this.parentDescriptorIndexIdentifier + " (0x" - + Long.toHexString(this.parentDescriptorIndexIdentifier) + ")\n" + "Item Type: " + this.itemType + " (0x" - + Long.toHexString(this.itemType) + ")"; - } -} diff --git a/src/main/java/com/pff/LZFu.java b/src/main/java/com/pff/LZFu.java deleted file mode 100644 index 044e95e..0000000 --- a/src/main/java/com/pff/LZFu.java +++ /dev/null @@ -1,127 +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; - -/** - * An implementation of the LZFu algorithm to decompress RTF content - * - * @author Richard Johnson - */ -public class LZFu { - - public static final String LZFU_HEADER = "{\\rtf1\\ansi\\mac\\deff0\\deftab720{\\fonttbl;}{\\f0\\fnil \\froman \\fswiss \\fmodern \\fscript \\fdecor MS Sans SerifSymbolArialTimes New RomanCourier{\\colortbl\\red0\\green0\\blue0\n\r\\par \\pard\\plain\\f0\\fs20\\b\\i\\u\\tab\\tx"; - - public static String decode(final byte[] data) throws PSTException { - - @SuppressWarnings("unused") - final int compressedSize = (int) PSTObject.convertLittleEndianBytesToLong(data, 0, 4); - final int uncompressedSize = (int) PSTObject.convertLittleEndianBytesToLong(data, 4, 8); - final int compressionSig = (int) PSTObject.convertLittleEndianBytesToLong(data, 8, 12); - @SuppressWarnings("unused") - final int compressedCRC = (int) PSTObject.convertLittleEndianBytesToLong(data, 12, 16); - - if (compressionSig == 0x75465a4c) { - // we are compressed... - final byte[] output = new byte[uncompressedSize]; - int outputPosition = 0; - final byte[] lzBuffer = new byte[4096]; - // preload our buffer. - try { - final byte[] bytes = LZFU_HEADER.getBytes("US-ASCII"); - System.arraycopy(bytes, 0, lzBuffer, 0, LZFU_HEADER.length()); - } catch (final UnsupportedEncodingException e) { - e.printStackTrace(); - } - int bufferPosition = LZFU_HEADER.length(); - int currentDataPosition = 16; - - // next byte is the flags, - while (currentDataPosition < data.length - 2 && outputPosition < output.length) { - int flags = data[currentDataPosition++] & 0xFF; - for (int x = 0; x < 8 && outputPosition < output.length; x++) { - final boolean isRef = ((flags & 1) == 1); - flags >>= 1; - if (isRef) { - // get the starting point for the buffer and the - // length to read - final int refOffsetOrig = data[currentDataPosition++] & 0xFF; - final int refSizeOrig = data[currentDataPosition++] & 0xFF; - final int refOffset = (refOffsetOrig << 4) | (refSizeOrig >>> 4); - final int refSize = (refSizeOrig & 0xF) + 2; - // refOffset &= 0xFFF; - try { - // copy the data from the buffer - int index = refOffset; - for (int y = 0; y < refSize && outputPosition < output.length; y++) { - output[outputPosition++] = lzBuffer[index]; - lzBuffer[bufferPosition] = lzBuffer[index]; - bufferPosition++; - bufferPosition %= 4096; - ++index; - index %= 4096; - } - } catch (final Exception e) { - e.printStackTrace(); - } - - } else { - // copy the byte over - lzBuffer[bufferPosition] = data[currentDataPosition]; - bufferPosition++; - bufferPosition %= 4096; - output[outputPosition++] = data[currentDataPosition++]; - } - } - } - - if (outputPosition != uncompressedSize) { - throw new PSTException(String.format("Error decompressing RTF! Expected %d bytes, got %d bytes\n", - uncompressedSize, outputPosition)); - } - return new String(output).trim(); - - } else if (compressionSig == 0x414c454d) { - // we are not compressed! - // just return the rest of the contents as a string - final byte[] output = new byte[data.length - 16]; - System.arraycopy(data, 16, output, 0, data.length - 16); - return new String(output).trim(); - } - - return ""; - } -} diff --git a/src/main/java/com/pff/OffsetIndexItem.java b/src/main/java/com/pff/OffsetIndexItem.java deleted file mode 100644 index f1e5225..0000000 --- a/src/main/java/com/pff/OffsetIndexItem.java +++ /dev/null @@ -1,72 +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; - -/** - * OffsetIndexItem is a leaf item from the Offset index b-tree - * Only really used internally to get the file offset for items - * - * @author Richard Johnson - */ -class OffsetIndexItem { - long indexIdentifier; - long fileOffset; - int size; - long cRef; - - OffsetIndexItem(final byte[] data, final int pstFileType) { - if (pstFileType == PSTFile.PST_TYPE_ANSI) { - this.indexIdentifier = PSTObject.convertLittleEndianBytesToLong(data, 0, 4); - this.fileOffset = PSTObject.convertLittleEndianBytesToLong(data, 4, 8); - this.size = (int) PSTObject.convertLittleEndianBytesToLong(data, 8, 10); - this.cRef = (int) PSTObject.convertLittleEndianBytesToLong(data, 10, 12); - } else { - this.indexIdentifier = PSTObject.convertLittleEndianBytesToLong(data, 0, 8); - this.fileOffset = PSTObject.convertLittleEndianBytesToLong(data, 8, 16); - this.size = (int) PSTObject.convertLittleEndianBytesToLong(data, 16, 18); - this.cRef = (int) PSTObject.convertLittleEndianBytesToLong(data, 16, 18); - } - // System.out.println("Data size: "+data.length); - - } - - @Override - public String toString() { - return "OffsetIndexItem\n" + "Index Identifier: " + this.indexIdentifier + " (0x" - + Long.toHexString(this.indexIdentifier) + ")\n" + "File Offset: " + this.fileOffset + " (0x" - + Long.toHexString(this.fileOffset) + ")\n" + "cRef: " + this.cRef + " (0x" + Long.toHexString(this.cRef) - + " bin:" + Long.toBinaryString(this.cRef) + ")\n" + "Size: " + this.size + " (0x" - + Long.toHexString(this.size) + ")"; - } -} diff --git a/src/main/java/com/pff/PSTActivity.java b/src/main/java/com/pff/PSTActivity.java deleted file mode 100644 index 87b1e56..0000000 --- a/src/main/java/com/pff/PSTActivity.java +++ /dev/null @@ -1,174 +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; - -/** - * PSTActivity represents Journal entries - * - * @author Richard Johnson - */ -public class PSTActivity extends PSTMessage { - - /** - * Instantiates a new Pst activity. - * - * @param theFile the the file - * @param descriptorIndexNode the descriptor index node - * @throws PSTException the pst exception - * @throws IOException the io exception - */ - public PSTActivity(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode) - throws PSTException, IOException { - super(theFile, descriptorIndexNode); - } - - /** - * Instantiates a new Pst activity. - * - * @param theFile the the file - * @param folderIndexNode the folder index node - * @param table the table - * @param localDescriptorItems the local descriptor items - */ - public PSTActivity(final PSTFile theFile, final DescriptorIndexNode folderIndexNode, final PSTTableBC table, - final HashMap localDescriptorItems) { - super(theFile, folderIndexNode, table, localDescriptorItems); - } - - /** - * Type - * - * @return the log type - */ - public String getLogType() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008700, PSTFile.PSETID_Log)); - } - - /** - * Start - * - * @return the log start - */ - public Date getLogStart() { - return this.getDateItem(this.pstFile.getNameToIdMapItem(0x00008706, PSTFile.PSETID_Log)); - } - - /** - * Duration - * - * @return the log duration - */ - public int getLogDuration() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008707, PSTFile.PSETID_Log)); - } - - /** - * End - * - * @return the log end - */ - public Date getLogEnd() { - return this.getDateItem(this.pstFile.getNameToIdMapItem(0x00008708, PSTFile.PSETID_Log)); - } - - /** - * LogFlags - * - * @return the log flags - */ - public int getLogFlags() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x0000870c, PSTFile.PSETID_Log)); - } - - /** - * DocPrinted - * - * @return the boolean - */ - public boolean isDocumentPrinted() { - return (this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x0000870e, PSTFile.PSETID_Log))); - } - - /** - * DocSaved - * - * @return the boolean - */ - public boolean isDocumentSaved() { - return (this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x0000870f, PSTFile.PSETID_Log))); - } - - /** - * DocRouted - * - * @return the boolean - */ - public boolean isDocumentRouted() { - return (this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008710, PSTFile.PSETID_Log))); - } - - /** - * DocPosted - * - * @return the boolean - */ - public boolean isDocumentPosted() { - return (this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008711, PSTFile.PSETID_Log))); - } - - /** - * Type Description - * - * @return the log type desc - */ - public String getLogTypeDesc() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008712, PSTFile.PSETID_Log)); - } - - @Override - public String toString() { - return "Type ASCII or Unicode string: " + this.getLogType() + "\n" + "Start Filetime: " + this.getLogStart() - + "\n" + "Duration Integer 32-bit signed: " + this.getLogDuration() + "\n" + "End Filetime: " - + this.getLogEnd() + "\n" + "LogFlags Integer 32-bit signed: " + this.getLogFlags() + "\n" - + "DocPrinted Boolean: " + this.isDocumentPrinted() + "\n" + "DocSaved Boolean: " + this.isDocumentSaved() - + "\n" + "DocRouted Boolean: " + this.isDocumentRouted() + "\n" + "DocPosted Boolean: " - + this.isDocumentPosted() + "\n" + "TypeDescription ASCII or Unicode string: " + this.getLogTypeDesc(); - - } - -} diff --git a/src/main/java/com/pff/PSTAppointment.java b/src/main/java/com/pff/PSTAppointment.java deleted file mode 100644 index 6f835f1..0000000 --- a/src/main/java/com/pff/PSTAppointment.java +++ /dev/null @@ -1,231 +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; - -/** - * PSTAppointment is for Calendar items - * - * @author Richard Johnson - */ -public class PSTAppointment extends PSTMessage { - - PSTAppointment(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode) - throws PSTException, IOException { - super(theFile, descriptorIndexNode); - } - - PSTAppointment(final PSTFile theFile, final DescriptorIndexNode folderIndexNode, final PSTTableBC table, - final HashMap localDescriptorItems) { - super(theFile, folderIndexNode, table, localDescriptorItems); - } - - public boolean getSendAsICAL() { - return (this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008200, PSTFile.PSETID_Appointment))); - } - - public int getBusyStatus() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008205, PSTFile.PSETID_Appointment)); - } - - public boolean getShowAsBusy() { - return this.getBusyStatus() == 2; - } - - public String getLocation() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008208, PSTFile.PSETID_Appointment)); - } - - public Date getStartTime() { - return this.getDateItem(this.pstFile.getNameToIdMapItem(0x0000820d, PSTFile.PSETID_Appointment)); - } - - public PSTTimeZone getStartTimeZone() { - return this.getTimeZoneItem(this.pstFile.getNameToIdMapItem(0x0000825e, PSTFile.PSETID_Appointment)); - } - - public Date getEndTime() { - return this.getDateItem(this.pstFile.getNameToIdMapItem(0x0000820e, PSTFile.PSETID_Appointment)); - } - - public PSTTimeZone getEndTimeZone() { - return this.getTimeZoneItem(this.pstFile.getNameToIdMapItem(0x0000825f, PSTFile.PSETID_Appointment)); - } - - public PSTTimeZone getRecurrenceTimeZone() { - final String desc = this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008234, PSTFile.PSETID_Appointment)); - if (desc != null && desc.length() != 0) { - final byte[] tzData = this - .getBinaryItem(this.pstFile.getNameToIdMapItem(0x00008233, PSTFile.PSETID_Appointment)); - if (tzData != null && tzData.length != 0) { - return new PSTTimeZone(desc, tzData); - } - } - return null; - } - - public int getDuration() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008213, PSTFile.PSETID_Appointment)); - } - - public int getColor() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008214, PSTFile.PSETID_Appointment)); - } - - public boolean getSubType() { - return (this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008215, PSTFile.PSETID_Appointment)) != 0); - } - - public int getMeetingStatus() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008217, PSTFile.PSETID_Appointment)); - } - - public int getResponseStatus() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008218, PSTFile.PSETID_Appointment)); - } - - public boolean isRecurring() { - return this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008223, PSTFile.PSETID_Appointment)); - } - - public Date getRecurrenceBase() { - return this.getDateItem(this.pstFile.getNameToIdMapItem(0x00008228, PSTFile.PSETID_Appointment)); - } - - public int getRecurrenceType() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008231, PSTFile.PSETID_Appointment)); - } - - public String getRecurrencePattern() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008232, PSTFile.PSETID_Appointment)); - } - - public byte[] getRecurrenceStructure() { - return this.getBinaryItem(this.pstFile.getNameToIdMapItem(0x00008216, PSTFile.PSETID_Appointment)); - } - - public byte[] getTimezone() { - return this.getBinaryItem(this.pstFile.getNameToIdMapItem(0x00008233, PSTFile.PSETID_Appointment)); - } - - public String getAllAttendees() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008238, PSTFile.PSETID_Appointment)); - } - - public String getToAttendees() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x0000823b, PSTFile.PSETID_Appointment)); - } - - public String getCCAttendees() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x0000823c, PSTFile.PSETID_Appointment)); - } - - public int getAppointmentSequence() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008201, PSTFile.PSETID_Appointment)); - } - - // online meeting properties - public boolean isOnlineMeeting() { - return (this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008240, PSTFile.PSETID_Appointment))); - } - - public int getNetMeetingType() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008241, PSTFile.PSETID_Appointment)); - } - - public String getNetMeetingServer() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008242, PSTFile.PSETID_Appointment)); - } - - public String getNetMeetingOrganizerAlias() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008243, PSTFile.PSETID_Appointment)); - } - - public boolean getNetMeetingAutostart() { - return (this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008245, PSTFile.PSETID_Appointment)) != 0); - } - - public boolean getConferenceServerAllowExternal() { - return (this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008246, PSTFile.PSETID_Appointment))); - } - - public String getNetMeetingDocumentPathName() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008247, PSTFile.PSETID_Appointment)); - } - - public String getNetShowURL() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008248, PSTFile.PSETID_Appointment)); - } - - public Date getAttendeeCriticalChange() { - return this.getDateItem(this.pstFile.getNameToIdMapItem(0x00000001, PSTFile.PSETID_Meeting)); - } - - public Date getOwnerCriticalChange() { - return this.getDateItem(this.pstFile.getNameToIdMapItem(0x0000001a, PSTFile.PSETID_Meeting)); - } - - public String getConferenceServerPassword() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00008249, PSTFile.PSETID_Appointment)); - } - - public boolean getAppointmentCounterProposal() { - return (this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00008257, PSTFile.PSETID_Appointment))); - } - - public boolean isSilent() { - return (this.getBooleanItem(this.pstFile.getNameToIdMapItem(0x00000004, PSTFile.PSETID_Meeting))); - } - - public String getRequiredAttendees() { - return this.getStringItem(this.pstFile.getNameToIdMapItem(0x00000006, PSTFile.PSETID_Meeting)); - } - - public int getLocaleId() { - return this.getIntItem(0x3ff1); - } - - public PSTGlobalObjectId getGlobalObjectId() { - return new PSTGlobalObjectId( - this.getBinaryItem(this.pstFile.getNameToIdMapItem(0x00000003, PSTFile.PSETID_Meeting))); - } - - public PSTGlobalObjectId getCleanGlobalObjectId() { - return new PSTGlobalObjectId( - this.getBinaryItem(this.pstFile.getNameToIdMapItem(0x00000023, PSTFile.PSETID_Meeting))); - } -} diff --git a/src/main/java/com/pff/PSTAppointmentException.java b/src/main/java/com/pff/PSTAppointmentException.java deleted file mode 100644 index a113f5c..0000000 --- a/src/main/java/com/pff/PSTAppointmentException.java +++ /dev/null @@ -1,389 +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.util.Calendar; -import java.util.Date; - -/** - * Class containing information on exceptions to a recurring appointment - * - * @author Orin Eman - * - * - */ -public class PSTAppointmentException { - - // Access methods - return the value from the exception if - // OverrideFlags say it's present, otherwise the value from the appointment. - public String getSubject() { - if ((this.OverrideFlags & 0x0001) != 0) { - try { - return new String(this.WideCharSubject, "UTF-16LE"); - } catch (final UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - - return this.appt.getSubject(); - } - - public int getMeetingType() { - if ((this.OverrideFlags & 0x0002) != 0) { - return this.MeetingType; - } - - return this.appt.getMeetingStatus(); - } - - public int getReminderDelta() { - if ((this.OverrideFlags & 0x0004) != 0) { - return this.ReminderDelta; - } - - return this.appt.getReminderDelta(); - } - - public boolean getReminderSet() { - if ((this.OverrideFlags & 0x0008) != 0) { - return this.ReminderSet; - } - - return this.appt.getReminderSet(); - } - - public String getLocation() { - if ((this.OverrideFlags & 0x0010) != 0) { - try { - return new String(this.WideCharLocation, "UTF-16LE"); - } catch (final UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - - return this.appt.getLocation(); - } - - public int getBusyStatus() { - if ((this.OverrideFlags & 0x0020) != 0) { - return this.BusyStatus; - } - - return this.appt.getBusyStatus(); - } - - public boolean getSubType() { - if ((this.OverrideFlags & 0x0080) != 0) { - return this.SubType; - } - - return this.appt.getSubType(); - } - - public String getDescription() { - if (this.embeddedMessage != null) { - return this.embeddedMessage.getBodyPrefix(); - } - - return null; - } - - public Date getDTStamp() { - Date ret = null; - if (this.embeddedMessage != null) { - ret = this.embeddedMessage.getOwnerCriticalChange(); - } - - if (ret == null) { - // Use current date/time - final Calendar c = Calendar.getInstance(PSTTimeZone.utcTimeZone); - ret = c.getTime(); - } - - return ret; - } - - public int getStartDateTime() { - return this.StartDateTime; - } - - public int getEndDateTime() { - return this.EndDateTime; - } - - public int getOriginalStartDate() { - return this.OriginalStartDate; - } - - public int getAppointmentSequence(final int def) { - if (this.embeddedMessage == null) { - return def; - } - return this.embeddedMessage.getAppointmentSequence(); - } - - public int getImportance(final int def) { - if (this.embeddedMessage == null) { - return def; - } - return this.embeddedMessage.getImportance(); - } - - public byte[] getSubjectBytes() { - if ((this.OverrideFlags & 0x0010) != 0) { - return this.Subject; - } - - return null; - } - - public byte[] getLocationBytes() { - if ((this.OverrideFlags & 0x0010) != 0) { - return this.Location; - } - - return null; - } - - public boolean attachmentsPresent() { - if ((this.OverrideFlags & 0x0040) != 0 && this.Attachment == 0x00000001) { - return true; - } - - return false; - } - - public boolean embeddedMessagePresent() { - return this.embeddedMessage != null; - } - - // - // Allow access to an embedded message for - // properties that don't have access methods here. - // - public PSTAppointment getEmbeddedMessage() { - return this.embeddedMessage; - } - - PSTAppointmentException(final byte[] recurrencePattern, int offset, final int writerVersion2, - final PSTAppointment appt) { - this.writerVersion2 = writerVersion2; - final int initialOffset = offset; - this.appt = appt; - this.embeddedMessage = null; - - this.StartDateTime = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.EndDateTime = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.OriginalStartDate = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.OverrideFlags = (short) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 2); - offset += 2; - - if ((this.OverrideFlags & ARO_SUBJECT) != 0) { - // @SuppressWarnings("unused") - // short SubjectLength = - // (short)PSTObject.convertLittleEndianBytesToLong(recurrencePattern, - // offset, offset+2); - offset += 2; - final short SubjectLength2 = (short) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 2); - offset += 2; - this.Subject = new byte[SubjectLength2]; - System.arraycopy(recurrencePattern, offset, this.Subject, 0, SubjectLength2); - offset += SubjectLength2; - } - - if ((this.OverrideFlags & ARO_MEETINGTYPE) != 0) { - this.MeetingType = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - } - - if ((this.OverrideFlags & ARO_REMINDERDELTA) != 0) { - this.ReminderDelta = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - } - - if ((this.OverrideFlags & ARO_REMINDER) != 0) { - this.ReminderSet = ((int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 4) != 0); - offset += 4; - } - - if ((this.OverrideFlags & ARO_LOCATION) != 0) { - // @SuppressWarnings("unused") - // short LocationLength = - // (short)PSTObject.convertLittleEndianBytesToLong(recurrencePattern, - // offset, offset+2); - offset += 2; - final short LocationLength2 = (short) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 2); - offset += 2; - this.Location = new byte[LocationLength2]; - System.arraycopy(recurrencePattern, offset, this.Location, 0, LocationLength2); - offset += LocationLength2; - } - - if ((this.OverrideFlags & ARO_BUSYSTATUS) != 0) { - this.BusyStatus = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - } - - if ((this.OverrideFlags & ARO_ATTACHMENT) != 0) { - this.Attachment = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - } - - if ((this.OverrideFlags & ARO_SUBTYPE) != 0) { - this.SubType = ((int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4) != 0); - offset += 4; - } - - this.length = offset - initialOffset; - } - - void ExtendedException(final byte[] recurrencePattern, int offset) { - final int initialOffset = offset; - - if (this.writerVersion2 >= 0x00003009) { - final int ChangeHighlightSize = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 4); - offset += 4; - this.ChangeHighlightValue = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 4); - offset += ChangeHighlightSize; - } - - int ReservedBlockEESize = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4 + ReservedBlockEESize; - - // See http://msdn.microsoft.com/en-us/library/cc979209(office.12).aspx - if ((this.OverrideFlags & (ARO_SUBJECT | ARO_LOCATION)) != 0) { - // Same as regular Exception structure? - this.StartDateTime = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.EndDateTime = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.OriginalStartDate = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 4); - offset += 4; - } - - if ((this.OverrideFlags & ARO_SUBJECT) != 0) { - this.WideCharSubjectLength = (short) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 2); - offset += 2; - this.WideCharSubject = new byte[this.WideCharSubjectLength * 2]; - System.arraycopy(recurrencePattern, offset, this.WideCharSubject, 0, this.WideCharSubject.length); - offset += this.WideCharSubject.length; - /* - * try { - * String subject = new String(WideCharSubject, "UTF-16LE"); - * System.out.printf("Exception Subject: %s\n", subject); - * } catch (UnsupportedEncodingException e) { - * e.printStackTrace(); - * } - * / - **/ - } - - if ((this.OverrideFlags & ARO_LOCATION) != 0) { - this.WideCharLocationLength = (short) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 2); - offset += 2; - this.WideCharLocation = new byte[this.WideCharLocationLength * 2]; - System.arraycopy(recurrencePattern, offset, this.WideCharLocation, 0, this.WideCharLocation.length); - offset += this.WideCharLocation.length; - } - - // See http://msdn.microsoft.com/en-us/library/cc979209(office.12).aspx - if ((this.OverrideFlags & (ARO_SUBJECT | ARO_LOCATION)) != 0) { - ReservedBlockEESize = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4 + ReservedBlockEESize; - } - - this.extendedLength = offset - initialOffset; - } - - void setEmbeddedMessage(final PSTAppointment embeddedMessage) { - this.embeddedMessage = embeddedMessage; - } - - private final int writerVersion2; - private int StartDateTime; - private int EndDateTime; - private int OriginalStartDate; - private final short OverrideFlags; - private byte[] Subject = null; - private int MeetingType; - private int ReminderDelta; - private boolean ReminderSet; - private byte[] Location = null; - private int BusyStatus; - private int Attachment; - private boolean SubType; - // private int AppointmentColor; // Reserved - don't read from the PST file - @SuppressWarnings("unused") - private int ChangeHighlightValue; - private int WideCharSubjectLength = 0; - private byte[] WideCharSubject = null; - private int WideCharLocationLength = 0; - private byte[] WideCharLocation = null; - private PSTAppointment embeddedMessage = null; - private final PSTAppointment appt; - private final int length; - private int extendedLength; - - // Length of this ExceptionInfo structure in the PST file - int getLength() { - return this.length; - } - - // Length of this ExtendedException structure in the PST file - int getExtendedLength() { - return this.extendedLength; - } - - static final short ARO_SUBJECT = 0x0001; - static final short ARO_MEETINGTYPE = 0x0002; - static final short ARO_REMINDERDELTA = 0x0004; - static final short ARO_REMINDER = 0x0008; - static final short ARO_LOCATION = 0x0010; - static final short ARO_BUSYSTATUS = 0x0020; - static final short ARO_ATTACHMENT = 0x0040; - static final short ARO_SUBTYPE = 0x0080; -} diff --git a/src/main/java/com/pff/PSTAppointmentRecurrence.java b/src/main/java/com/pff/PSTAppointmentRecurrence.java deleted file mode 100644 index c91f6f4..0000000 --- a/src/main/java/com/pff/PSTAppointmentRecurrence.java +++ /dev/null @@ -1,344 +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.text.SimpleDateFormat; - * / - **/ - -import java.util.Calendar; -import java.util.Date; -import java.util.SimpleTimeZone; - -/** - * Class containing recurrence information for a recurring appointment - * - * @author Orin Eman - * - * - */ - -public class PSTAppointmentRecurrence { - - // Access methods - - public short getExceptionCount() { - return this.ExceptionCount; - } - - public PSTAppointmentException getException(final int i) { - if (i < 0 || i >= this.ExceptionCount) { - return null; - } - return this.Exceptions[i]; - } - - public Calendar[] getDeletedInstanceDates() { - return this.DeletedInstanceDates; - } - - public Calendar[] getModifiedInstanceDates() { - return this.ModifiedInstanceDates; - } - - public short getCalendarType() { - return this.CalendarType; - } - - public short getPatternType() { - return this.PatternType; - } - - public int getPeriod() { - return this.Period; - } - - public int getPatternSpecific() { - return this.PatternSpecific; - } - - public int getFirstDOW() { - return this.FirstDOW; - } - - public int getPatternSpecificNth() { - return this.PatternSpecificNth; - } - - public int getFirstDateTime() { - return this.FirstDateTime; - } - - public int getEndType() { - return this.EndType; - } - - public int getOccurrenceCount() { - return this.OccurrenceCount; - } - - public int getEndDate() { - return this.EndDate; - } - - public int getStartTimeOffset() { - return this.StartTimeOffset; - } - - public PSTTimeZone getTimeZone() { - return this.RecurrenceTimeZone; - } - - public int getRecurFrequency() { - return this.RecurFrequency; - } - - public int getSlidingFlag() { - return this.SlidingFlag; - } - - public int getStartDate() { - return this.StartDate; - } - - public int getEndTimeOffset() { - return this.EndTimeOffset; - } - - public PSTAppointmentRecurrence(final byte[] recurrencePattern, final PSTAppointment appt, final PSTTimeZone tz) { - this.RecurrenceTimeZone = tz; - final SimpleTimeZone stz = this.RecurrenceTimeZone.getSimpleTimeZone(); - - // Read the structure - this.RecurFrequency = (short) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, 4, 6); - this.PatternType = (short) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, 6, 8); - this.CalendarType = (short) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, 8, 10); - this.FirstDateTime = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, 10, 14); - this.Period = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, 14, 18); - this.SlidingFlag = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, 18, 22); - int offset = 22; - if (this.PatternType != 0) { - this.PatternSpecific = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 4); - offset += 4; - if (this.PatternType == 0x0003 || this.PatternType == 0x000B) { - this.PatternSpecificNth = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 4); - offset += 4; - } - } - this.EndType = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.OccurrenceCount = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.FirstDOW = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - - this.DeletedInstanceCount = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 4); - offset += 4; - this.DeletedInstanceDates = new Calendar[this.DeletedInstanceCount]; - for (int i = 0; i < this.DeletedInstanceCount; ++i) { - this.DeletedInstanceDates[i] = PSTObject.apptTimeToUTC( - (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4), - this.RecurrenceTimeZone); - offset += 4; - /* - * SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); - * f.setTimeZone(RecurrenceTimeZone.getSimpleTimeZone()); - * System.out.printf("DeletedInstanceDates[%d]: %s\n", i, - * f.format(DeletedInstanceDates[i].getTime())); - * / - **/ - } - - this.ModifiedInstanceCount = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 4); - offset += 4; - this.ModifiedInstanceDates = new Calendar[this.ModifiedInstanceCount]; - for (int i = 0; i < this.ModifiedInstanceCount; ++i) { - this.ModifiedInstanceDates[i] = PSTObject.apptTimeToUTC( - (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4), - this.RecurrenceTimeZone); - offset += 4; - /* - * SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); - * f.setTimeZone(RecurrenceTimeZone.getSimpleTimeZone()); - * System.out.printf("ModifiedInstanceDates[%d]: %s\n", i, - * f.format(ModifiedInstanceDates[i].getTime())); - * / - **/ - } - - this.StartDate = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.EndDate = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4 + 4; // Skip ReaderVersion2 - - this.writerVersion2 = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - - this.StartTimeOffset = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.EndTimeOffset = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 4); - offset += 4; - this.ExceptionCount = (short) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, offset + 2); - offset += 2; - - // Read exceptions - this.Exceptions = new PSTAppointmentException[this.ExceptionCount]; - for (int i = 0; i < this.ExceptionCount; ++i) { - this.Exceptions[i] = new PSTAppointmentException(recurrencePattern, offset, this.writerVersion2, appt); - offset += this.Exceptions[i].getLength(); - } - - if ((offset + 4) <= recurrencePattern.length) { - final int ReservedBlock1Size = (int) PSTObject.convertLittleEndianBytesToLong(recurrencePattern, offset, - offset + 4); - offset += 4 + (ReservedBlock1Size * 4); - } - - // Read extended exception info - for (int i = 0; i < this.ExceptionCount; ++i) { - this.Exceptions[i].ExtendedException(recurrencePattern, offset); - offset += this.Exceptions[i].getExtendedLength(); - /* - * Calendar c = - * PSTObject.apptTimeToUTC(Exceptions[i].getStartDateTime(), - * RecurrenceTimeZone); - * System.out.printf("Exception[%d] start: %s\n", i, - * FormatUTC(c.getTime())); - * c = PSTObject.apptTimeToUTC(Exceptions[i].getEndDateTime(), - * RecurrenceTimeZone); - * System.out.printf("Exception[%d] end: %s\n", i, - * FormatUTC(c.getTime())); - * c = PSTObject.apptTimeToUTC(Exceptions[i].getOriginalStartDate(), - * RecurrenceTimeZone); - * System.out.printf("Exception[%d] original start: %s\n", i, - * FormatUTC(c.getTime())); - * / - **/ - } - // Ignore any extra data - see - // http://msdn.microsoft.com/en-us/library/cc979209(office.12).aspx - - // Get attachments, if any - PSTAttachment[] attachments = new PSTAttachment[appt.getNumberOfAttachments()]; - for (int i = 0; i < attachments.length; ++i) { - try { - attachments[i] = appt.getAttachment(i); - } catch (final Exception e) { - e.printStackTrace(); - attachments[i] = null; - } - } - - PSTAppointment embeddedMessage = null; - for (int i = 0; i < this.ExceptionCount; ++i) { - try { - // Match up an attachment to this exception... - for (final PSTAttachment attachment : attachments) { - if (attachment != null) { - final PSTMessage message = attachment.getEmbeddedPSTMessage(); - if (!(message instanceof PSTAppointment)) { - continue; - } - embeddedMessage = (PSTAppointment) message; - final Date replaceTime = embeddedMessage.getRecurrenceBase(); - /* - * SimpleDateFormat f = new - * SimpleDateFormat("yyyyMMdd'T'HHmmss"); - * f.setTimeZone(stz); - * System.out.printf("Attachment[%d] time: %s\n", - * iAttachment, f.format(replaceTime)); - * / - **/ - final Calendar c = Calendar.getInstance(stz); - c.setTime(replaceTime); - if (c.get(Calendar.YEAR) == this.ModifiedInstanceDates[i].get(Calendar.YEAR) - && c.get(Calendar.MONTH) == this.ModifiedInstanceDates[i].get(Calendar.MONTH) - && c.get(Calendar.DAY_OF_MONTH) == this.ModifiedInstanceDates[i].get(Calendar.DAY_OF_MONTH)) { - /* - * System.out.println("\tEmbedded Message matched"); - * / - **/ - - this.Exceptions[i].setEmbeddedMessage(embeddedMessage); - break; - } - } - } - } catch (final Exception e) { - e.printStackTrace(); - } - } - - attachments = null; - } - - /* - * private String FormatUTC(Date date) { - * SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); - * f.setTimeZone(PSTTimeZone.utcTimeZone); - * return f.format(date); - * } - * / - **/ - - private final short RecurFrequency; - private final short PatternType; - private final short CalendarType; - private final int FirstDateTime; - private final int Period; - private final int SlidingFlag; - private int PatternSpecific; - private int PatternSpecificNth; - private final int EndType; - private final int OccurrenceCount; - private final int FirstDOW; - private final int DeletedInstanceCount; - private Calendar[] DeletedInstanceDates = null; - private final int ModifiedInstanceCount; - private Calendar[] ModifiedInstanceDates = null; - private final int StartDate; - private final int EndDate; - // private int readerVersion2; - private final int writerVersion2; - private final int StartTimeOffset; - private final int EndTimeOffset; - private final short ExceptionCount; - private PSTAppointmentException[] Exceptions = null; - private PSTTimeZone RecurrenceTimeZone = null; -} diff --git a/src/main/java/com/pff/PSTAttachment.java b/src/main/java/com/pff/PSTAttachment.java deleted file mode 100644 index 35c7cf8..0000000 --- a/src/main/java/com/pff/PSTAttachment.java +++ /dev/null @@ -1,364 +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.InputStream; -import java.util.Date; -import java.util.HashMap; - -import java.io.ByteArrayInputStream; - -/** - * Class containing attachment information. - * - * @author Richard Johnson - */ -public class PSTAttachment extends PSTObject { - - /** - * Instantiates a new Pst attachment. - * - * @param theFile the the file - * @param table the table - * @param localDescriptorItems the local descriptor items - */ - PSTAttachment(final PSTFile theFile, final PSTTableBC table, - final HashMap localDescriptorItems) { - super(theFile, null, table, localDescriptorItems); - } - - /** - * Gets size. - * - * @return the size - */ - public int getSize() { - return this.getIntItem(0x0e20); - } - - @Override - public Date getCreationTime() { - return this.getDateItem(0x3007); - } - - /** - * Gets modification time. - * - * @return the modification time - */ - public Date getModificationTime() { - return this.getDateItem(0x3008); - } - - /** - * Gets embedded pst message. - * - * @return the embedded pst message - * @throws IOException the io exception - * @throws PSTException the pst exception - */ - public PSTMessage getEmbeddedPSTMessage() throws IOException, PSTException { - PSTNodeInputStream in = null; - if (this.getIntItem(0x3705) == PSTAttachment.ATTACHMENT_METHOD_EMBEDDED) { - final PSTTableBCItem item = this.items.get(0x3701); - if (item.entryValueType == 0x0102) { - if (!item.isExternalValueReference) { - in = new PSTNodeInputStream(this.pstFile, item.data); - } else { - // We are in trouble! - throw new PSTException("External reference in getEmbeddedPSTMessage()!\n"); - } - } else if (item.entryValueType == 0x000D) { - final int descriptorItem = (int) PSTObject.convertLittleEndianBytesToLong(item.data, 0, 4); - // PSTObject.printHexFormatted(item.data, true); - final PSTDescriptorItem descriptorItemNested = this.localDescriptorItems.get(descriptorItem); - in = new PSTNodeInputStream(this.pstFile, descriptorItemNested); - if (descriptorItemNested.subNodeOffsetIndexIdentifier > 0) { - this.localDescriptorItems - .putAll(this.pstFile - .getPSTDescriptorItems(descriptorItemNested.subNodeOffsetIndexIdentifier)); - } - /* - * if ( descriptorItemNested != null ) { - * try { - * data = descriptorItemNested.getData(); - * blockOffsets = descriptorItemNested.getBlockOffsets(); - * } catch (Exception e) { - * e.printStackTrace(); - * - * data = null; - * blockOffsets = null; - * } - * } - * - */ - } - - if (in == null) { - return null; - } - - try { - final PSTTableBC attachmentTable = new PSTTableBC(in); - return PSTObject.createAppropriatePSTMessageObject(this.pstFile, this.descriptorIndexNode, - attachmentTable, this.localDescriptorItems); - } catch (final PSTException e) { - e.printStackTrace(); - } - return null; - } - return null; - } - - /** - * Gets file input stream. - * - * @return the file input stream - * @throws IOException the io exception - * @throws PSTException the pst exception - */ - public InputStream getFileInputStream() throws IOException, PSTException { - - final PSTTableBCItem attachmentDataObject = this.items.get(0x3701); - - if (null == attachmentDataObject) { - return new ByteArrayInputStream(new byte[0]); - } else if (attachmentDataObject.isExternalValueReference) { - final PSTDescriptorItem descriptorItemNested = this.localDescriptorItems - .get(attachmentDataObject.entryValueReference); - return new PSTNodeInputStream(this.pstFile, descriptorItemNested); - } else { - // internal value references are never encrypted - return new PSTNodeInputStream(this.pstFile, attachmentDataObject.data, false); - } - - } - - /** - * Gets filesize. - * - * @return the filesize - * @throws PSTException the pst exception - * @throws IOException the io exception - */ - public int getFilesize() throws PSTException, IOException { - final PSTTableBCItem attachmentDataObject = this.items.get(0x3701); - if (attachmentDataObject.isExternalValueReference) { - final PSTDescriptorItem descriptorItemNested = this.localDescriptorItems - .get(attachmentDataObject.entryValueReference); - if (descriptorItemNested == null) { - throw new PSTException( - "missing attachment descriptor item for: " + attachmentDataObject.entryValueReference); - } - return descriptorItemNested.getDataSize(); - } else { - // raw attachment data, right there! - return attachmentDataObject.data.length; - } - - } - - // attachment properties - - /** - * Attachment (short) filename ASCII or Unicode string - * - * @return the filename - */ - public String getFilename() { - return this.getStringItem(0x3704); - } - - /** - * The constant ATTACHMENT_METHOD_NONE. - */ - public static final int ATTACHMENT_METHOD_NONE = 0; - /** - * The constant ATTACHMENT_METHOD_BY_VALUE. - */ - public static final int ATTACHMENT_METHOD_BY_VALUE = 1; - /** - * The constant ATTACHMENT_METHOD_BY_REFERENCE. - */ - public static final int ATTACHMENT_METHOD_BY_REFERENCE = 2; - /** - * The constant ATTACHMENT_METHOD_BY_REFERENCE_RESOLVE. - */ - public static final int ATTACHMENT_METHOD_BY_REFERENCE_RESOLVE = 3; - /** - * The constant ATTACHMENT_METHOD_BY_REFERENCE_ONLY. - */ - public static final int ATTACHMENT_METHOD_BY_REFERENCE_ONLY = 4; - /** - * The constant ATTACHMENT_METHOD_EMBEDDED. - */ - public static final int ATTACHMENT_METHOD_EMBEDDED = 5; - /** - * The constant ATTACHMENT_METHOD_OLE. - */ - public static final int ATTACHMENT_METHOD_OLE = 6; - - /** - * Attachment method Integer 32-bit signed 0 => None (No attachment) 1 => By - * value 2 => By reference 3 => By reference resolve 4 => By reference only - * 5 => Embedded message 6 => OLE - * - * @return the attach method - */ - public int getAttachMethod() { - return this.getIntItem(0x3705); - } - - /** - * Attachment size - * - * @return the attach size - */ - public int getAttachSize() { - return this.getIntItem(0x0e20); - } - - /** - * Attachment number - * - * @return the attach num - */ - public int getAttachNum() { - return this.getIntItem(0x0e21); - } - - /** - * Attachment long filename ASCII or Unicode string - * - * @return the long filename - */ - public String getLongFilename() { - return this.getStringItem(0x3707); - } - - /** - * Attachment (short) pathname ASCII or Unicode string - * - * @return the pathname - */ - public String getPathname() { - return this.getStringItem(0x3708); - } - - /** - * Attachment Position Integer 32-bit signed - * - * @return the rendering position - */ - public int getRenderingPosition() { - return this.getIntItem(0x370b); - } - - /** - * Attachment long pathname ASCII or Unicode string - * - * @return the long pathname - */ - public String getLongPathname() { - return this.getStringItem(0x370d); - } - - /** - * Attachment mime type ASCII or Unicode string - * - * @return the mime tag - */ - public String getMimeTag() { - return this.getStringItem(0x370e); - } - - /** - * Attachment mime sequence - * - * @return the mime sequence - */ - public int getMimeSequence() { - return this.getIntItem(0x3710); - } - - /** - * Attachment Content ID - * - * @return the content id - */ - public String getContentId() { - return this.getStringItem(0x3712); - } - - /** - * Attachment not available in HTML - * - * @return the boolean - */ - public boolean isAttachmentInvisibleInHtml() { - final int actionFlag = this.getIntItem(0x3714); - return ((actionFlag & 0x1) > 0); - } - - /** - * Attachment not available in RTF - * - * @return the boolean - */ - public boolean isAttachmentInvisibleInRTF() { - final int actionFlag = this.getIntItem(0x3714); - return ((actionFlag & 0x2) > 0); - } - - /** - * Attachment is MHTML REF - * - * @return the boolean - */ - public boolean isAttachmentMhtmlRef() { - final int actionFlag = this.getIntItem(0x3714); - return ((actionFlag & 0x4) > 0); - } - - /** - * Attachment content disposition - * - * @return the attachment content disposition - */ - public String getAttachmentContentDisposition() { - return this.getStringItem(0x3716); - } - -} diff --git a/src/main/java/com/pff/PSTByteFileContent.java b/src/main/java/com/pff/PSTByteFileContent.java deleted file mode 100644 index 9f8adc7..0000000 --- a/src/main/java/com/pff/PSTByteFileContent.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.pff; - -import java.io.IOException; - -public class PSTByteFileContent extends PSTFileContent { - - protected byte[] content; - protected int index; - - public PSTByteFileContent(final byte[] content) { - this.content = content; - this.index = 0; - } - - public byte[] getBytes() { - return this.content; - } - - public void setBytes(final byte[] content) { - this.content = content; - } - - @Override - public void seek(final long index) { - this.index = (int) index; - } - - @Override - public long getFilePointer() { - return this.index; - } - - @Override - public int read() { - if (this.index >= this.content.length) { - return -1; - } - return ((int) this.content[this.index++]) & 0xFF; - } - - @Override - public int read(final byte[] target) { - if (this.index >= this.content.length) { - return -1; - } - int targetindex = 0; - while (targetindex < target.length & this.index < this.content.length) { - target[targetindex++] = this.content[this.index++]; - } - return targetindex; - } - - @Override - public byte readByte() { - return this.content[this.index++]; - } - - @Override - public void close() { - // Do nothing - } - -} diff --git a/src/main/java/com/pff/PSTContact.java b/src/main/java/com/pff/PSTContact.java deleted file mode 100644 index aee335d..0000000 --- a/src/main/java/com/pff/PSTContact.java +++ /dev/null @@ -1,1135 +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; - -/** - * Class for Contacts - * - * @author Richard Johnson - */ -public class PSTContact extends PSTMessage { - - /** - * Instantiates a new Pst contact. - * - * @param theFile the the file - * @param descriptorIndexNode the descriptor index node - * @throws PSTException the pst exception - * @throws IOException the io exception - */ - public PSTContact(final PSTFile theFile, final DescriptorIndexNode descriptorIndexNode) - throws PSTException, IOException { - super(theFile, descriptorIndexNode); - } - - /** - * Instantiates a new Pst contact. - * - * @param theFile the the file - * @param folderIndexNode the folder index node - * @param table the table - * @param localDescriptorItems the local descriptor items - */ - public PSTContact(final PSTFile theFile, final DescriptorIndexNode folderIndexNode, final PSTTableBC table, - final HashMap localDescriptorItems) { - super(theFile, folderIndexNode, table, localDescriptorItems); - } - - /** - * Contact's Account name - * - * @return the account - */ - public String getAccount() { - return this.getStringItem(0x3a00); - } - - /** - * Callback telephone number - * - * @return the callback telephone number - */ - public String getCallbackTelephoneNumber() { - return this.getStringItem(0x3a02); - } - - /** - * Contact's generational abbreviation FTK: Name suffix - * - * @return the generation - */ - public String getGeneration() { - return this.getStringItem(0x3a05); - } - - /** - * Contacts given name - * - * @return the given name - */ - public String getGivenName() { - return this.getStringItem(0x3a06); - } - - /** - * Contacts Government ID Number - * - * @return the government id number - */ - public String getGovernmentIdNumber() { - return this.getStringItem(0x3a07); - } - - /** - * Business/Office Telephone Number - * - * @return the business telephone number - */ - public String getBusinessTelephoneNumber() { - return this.getStringItem(0x3a08); - } - - /** - * Home Telephone Number - * - * @return the home telephone number - */ - public String getHomeTelephoneNumber() { - return this.getStringItem(0x3a09); - } - - /** - * Contacts initials - * - * @return the initials - */ - public String getInitials() { - return this.getStringItem(0x3a0a); - } - - /** - * Keyword - * - * @return the keyword - */ - public String getKeyword() { - return this.getStringItem(0x3a0b); - } - - /** - * Contact's language - * - * @return the language - */ - public String getLanguage() { - return this.getStringItem(0x3a0c); - } - - /** - * Contact's location - * - * @return the location - */ - public String getLocation() { - return this.getStringItem(0x3a0d); - } - - /** - * MHS Common Name - * - * @return the mhs common name - */ - public String getMhsCommonName() { - return this.getStringItem(0x3a0f); - } - - /** - * Organizational identification number - * - * @return the organizational id number - */ - public String getOrganizationalIdNumber() { - return this.getStringItem(0x3a10); - } - - /** - * Contact's surname FTK: Last name - * - * @return the surname - */ - public String getSurname() { - return this.getStringItem(0x3a11); - } - - /** - * Original display name - * - * @return the original display name - */ - public String getOriginalDisplayName() { - return this.getStringItem(0x3a13); - } - - /** - * Default Postal Address - * - * @return the postal address - */ - public String getPostalAddress() { - return this.getStringItem(0x3a15); - } - - /** - * Contact's company name - * - * @return the company name - */ - public String getCompanyName() { - return this.getStringItem(0x3a16); - } - - /** - * Contact's job title FTK: Profession - * - * @return the title - */ - public String getTitle() { - return this.getStringItem(0x3a17); - } - - /** - * Contact's department name Used in contact item - * - * @return the department name - */ - public String getDepartmentName() { - return this.getStringItem(0x3a18); - } - - /** - * Contact's office location - * - * @return the office location - */ - public String getOfficeLocation() { - return this.getStringItem(0x3a19); - } - - /** - * Primary Telephone - * - * @return the primary telephone number - */ - public String getPrimaryTelephoneNumber() { - return this.getStringItem(0x3a1a); - } - - /** - * Contact's secondary office (business) phone number - * - * @return the business 2 telephone number - */ - public String getBusiness2TelephoneNumber() { - return this.getStringItem(0x3a1b); - } - - /** - * Mobile Phone Number - * - * @return the mobile telephone number - */ - public String getMobileTelephoneNumber() { - return this.getStringItem(0x3a1c); - } - - /** - * Radio Phone Number - * - * @return the radio telephone number - */ - public String getRadioTelephoneNumber() { - return this.getStringItem(0x3a1d); - } - - /** - * Car Phone Number - * - * @return the car telephone number - */ - public String getCarTelephoneNumber() { - return this.getStringItem(0x3a1e); - } - - /** - * Other Phone Number - * - * @return the other telephone number - */ - public String getOtherTelephoneNumber() { - return this.getStringItem(0x3a1f); - } - - /** - * Transmittable display name - * - * @return the transmittable display name - */ - public String getTransmittableDisplayName() { - return this.getStringItem(0x3a20); - } - - /** - * Pager Phone Number - * - * @return the pager telephone number - */ - public String getPagerTelephoneNumber() { - return this.getStringItem(0x3a21); - } - - /** - * Primary Fax Number - * - * @return the primary fax number - */ - public String getPrimaryFaxNumber() { - return this.getStringItem(0x3a23); - } - - /** - * Contact's office (business) fax number - * - * @return the business fax number - */ - public String getBusinessFaxNumber() { - return this.getStringItem(0x3a24); - } - - /** - * Contact's home fax number - * - * @return the home fax number - */ - public String getHomeFaxNumber() { - return this.getStringItem(0x3a25); - } - - /** - * Business Address Country - * - * @return the business address country - */ - public String getBusinessAddressCountry() { - return this.getStringItem(0x3a26); - } - - /** - * Business Address City - * - * @return the business address city - */ - public String getBusinessAddressCity() { - return this.getStringItem(0x3a27); - } - - /** - * Business Address State - * - * @return the business address state or province - */ - public String getBusinessAddressStateOrProvince() { - return this.getStringItem(0x3a28); - } - - /** - * Business Address Street - * - * @return the business address street - */ - public String getBusinessAddressStreet() { - return this.getStringItem(0x3a29); - } - - /** - * Business Postal Code - * - * @return the business postal code - */ - public String getBusinessPostalCode() { - return this.getStringItem(0x3a2a); - } - - /** - * Business PO Box - * - * @return the business po box - */ - public String getBusinessPoBox() { - return this.getStringItem(0x3a2b); - } - - /** - * Telex Number - * - * @return the telex number - */ - public String getTelexNumber() { - return this.getStringItem(0x3a2c); - } - - /** - * ISDN Number - * - * @return the isdn number - */ - public String getIsdnNumber() { - return this.getStringItem(0x3a2d); - } - - /** - * Assistant Phone Number - * - * @return the assistant telephone number - */ - public String getAssistantTelephoneNumber() { - return this.getStringItem(0x3a2e); - } - - /** - * Home Phone 2 - * - * @return the home 2 telephone number - */ - public String getHome2TelephoneNumber() { - return this.getStringItem(0x3a2f); - } - - /** - * Assistant�s Name - * - * @return the assistant - */ - public String getAssistant() { - return this.getStringItem(0x3a30); - } - - /** - * Hobbies - * - * @return the hobbies - */ - public String getHobbies() { - return this.getStringItem(0x3a43); - } - - /** - * Middle Name - * - * @return the middle name - */ - public String getMiddleName() { - return this.getStringItem(0x3a44); - } - - /** - * Display Name Prefix (Contact Title) - * - * @return the display name prefix - */ - public String getDisplayNamePrefix() { - return this.getStringItem(0x3a45); - } - - /** - * Profession - * - * @return the profession - */ - public String getProfession() { - return this.getStringItem(0x3a46); - } - - /** - * Preferred By Name - * - * @return the preferred by name - */ - public String getPreferredByName() { - return this.getStringItem(0x3a47); - } - - /** - * Spouse�s Name - * - * @return the spouse name - */ - public String getSpouseName() { - return this.getStringItem(0x3a48); - } - - /** - * Computer Network Name - * - * @return the computer network name - */ - public String getComputerNetworkName() { - return this.getStringItem(0x3a49); - } - - /** - * Customer ID - * - * @return the customer id - */ - public String getCustomerId() { - return this.getStringItem(0x3a4a); - } - - /** - * TTY/TDD Phone - * - * @return the ttytdd phone number - */ - public String getTtytddPhoneNumber() { - return this.getStringItem(0x3a4b); - } - - /** - * Ftp Site - * - * @return the ftp site - */ - public String getFtpSite() { - return this.getStringItem(0x3a4c); - } - - /** - * Manager�s Name - * - * @return the manager name - */ - public String getManagerName() { - return this.getStringItem(0x3a4e); - } - - /** - * Nickname - * - * @return the nickname - */ - public String getNickname() { - return this.getStringItem(0x3a4f); - } - - /** - * Personal Home Page - * - * @return the personal home page - */ - public String getPersonalHomePage() { - return this.getStringItem(0x3a50); - } - - /** - * Business Home Page - * - * @return the business home page - */ - public String getBusinessHomePage() { - return this.getStringItem(0x3a51); - } - - /** - * Note - * - * @return the note - */ - public String getNote() { - return this.getStringItem(0x6619); - } - - /** - * Gets named string item. - * - * @param key the key - * @return the named string item - */ - String getNamedStringItem(final int key) { - final int id = this.pstFile.getNameToIdMapItem(key, PSTFile.PSETID_Address); - if (id != -1) { - return this.getStringItem(id); - } - return ""; - } - - /** - * Gets smtp address. - * - * @return the smtp address - */ - public String getSMTPAddress() { - return this.getNamedStringItem(0x00008084); - } - - /** - * Company Main Phone - * - * @return the company main phone number - */ - public String getCompanyMainPhoneNumber() { - return this.getStringItem(0x3a57); - } - - /** - * Children's names - * - * @return the childrens names - */ - public String getChildrensNames() { - return this.getStringItem(0x3a58); - } - - /** - * Home Address City - * - * @return the home address city - */ - public String getHomeAddressCity() { - return this.getStringItem(0x3a59); - } - - /** - * Home Address Country - * - * @return the home address country - */ - public String getHomeAddressCountry() { - return this.getStringItem(0x3a5a); - } - - /** - * Home Address Postal Code - * - * @return the home address postal code - */ - public String getHomeAddressPostalCode() { - return this.getStringItem(0x3a5b); - } - - /** - * Home Address State or Province - * - * @return the home address state or province - */ - public String getHomeAddressStateOrProvince() { - return this.getStringItem(0x3a5c); - } - - /** - * Home Address Street - * - * @return the home address street - */ - public String getHomeAddressStreet() { - return this.getStringItem(0x3a5d); - } - - /** - * Home Address Post Office Box - * - * @return the home address post office box - */ - public String getHomeAddressPostOfficeBox() { - return this.getStringItem(0x3a5e); - } - - /** - * Other Address City - * - * @return the other address city - */ - public String getOtherAddressCity() { - return this.getStringItem(0x3a5f); - } - - /** - * Other Address Country - * - * @return the other address country - */ - public String getOtherAddressCountry() { - return this.getStringItem(0x3a60); - } - - /** - * Other Address Postal Code - * - * @return the other address postal code - */ - public String getOtherAddressPostalCode() { - return this.getStringItem(0x3a61); - } - - /** - * Other Address State - * - * @return the other address state or province - */ - public String getOtherAddressStateOrProvince() { - return this.getStringItem(0x3a62); - } - - /** - * Other Address Street - * - * @return the other address street - */ - public String getOtherAddressStreet() { - return this.getStringItem(0x3a63); - } - - /** - * Other Address Post Office box - * - * @return the other address post office box - */ - public String getOtherAddressPostOfficeBox() { - return this.getStringItem(0x3a64); - } - - /////////////////////////////////////////////////// - // Below are the values from the name to id map... - /////////////////////////////////////////////////// - - /** - * File under FTK: File as - * - * @return the file under - */ - public String getFileUnder() { - return this.getNamedStringItem(0x00008005); - } - - /** - * Home Address - * - * @return the home address - */ - public String getHomeAddress() { - return this.getNamedStringItem(0x0000801a); - } - - /** - * Business Address - * - * @return the work address - */ - public String getWorkAddress() { - return this.getNamedStringItem(0x0000801b); - } - - /** - * Other Address - * - * @return the other address - */ - public String getOtherAddress() { - return this.getNamedStringItem(0x0000801c); - } - - /** - * Selected Mailing Address - * - * @return the postal address id - */ - public int getPostalAddressId() { - return this.getIntItem(this.pstFile.getNameToIdMapItem(0x00008022, PSTFile.PSETID_Address)); - } - - /** - * Webpage - * - * @return the html - */ - public String getHtml() { - return this.getNamedStringItem(0x0000802b); - } - - /** - * Business Address City - * - * @return the work address street - */ - public String getWorkAddressStreet() { - return this.getNamedStringItem(0x00008045); - } - - /** - * Business Address Street - * - * @return the work address city - */ - public String getWorkAddressCity() { - return this.getNamedStringItem(0x00008046); - } - - /** - * Business Address State - * - * @return the work address state - */ - public String getWorkAddressState() { - return this.getNamedStringItem(0x00008047); - } - - /** - * Business Address Postal Code - * - * @return the work address postal code - */ - public String getWorkAddressPostalCode() { - return this.getNamedStringItem(0x00008048); - } - - /** - * Business Address Country - * - * @return the work address country - */ - public String getWorkAddressCountry() { - return this.getNamedStringItem(0x00008049); - } - - /** - * Business Address Country - * - * @return the work address post office box - */ - public String getWorkAddressPostOfficeBox() { - return this.getNamedStringItem(0x0000804A); - } - - /** - * IM Address - * - * @return the instant messaging address - */ - public String getInstantMessagingAddress() { - return this.getNamedStringItem(0x00008062); - } - - /** - * E-mail1 Display Name - * - * @return the email 1 display name - */ - public String getEmail1DisplayName() { - return this.getNamedStringItem(0x00008080); - } - - /** - * E-mail1 Address Type - * - * @return the email 1 address type - */ - public String getEmail1AddressType() { - return this.getNamedStringItem(0x00008082); - } - - /** - * E-mail1 Address - * - * @return the email 1 email address - */ - public String getEmail1EmailAddress() { - return this.getNamedStringItem(0x00008083); - } - - /** - * E-mail1 Display Name - * - * @return the email 1 original display name - */ - public String getEmail1OriginalDisplayName() { - return this.getNamedStringItem(0x00008084); - } - - /** - * E-mail1 type - * - * @return the email 1 email type - */ - public String getEmail1EmailType() { - return this.getNamedStringItem(0x00008087); - } - - /** - * E-mail2 display name - * - * @return the email 2 display name - */ - public String getEmail2DisplayName() { - return this.getNamedStringItem(0x00008090); - } - - /** - * E-mail2 address type - * - * @return the email 2 address type - */ - public String getEmail2AddressType() { - return this.getNamedStringItem(0x00008092); - } - - /** - * E-mail2 e-mail address - * - * @return the email 2 email address - */ - public String getEmail2EmailAddress() { - return this.getNamedStringItem(0x00008093); - } - - /** - * E-mail2 original display name - * - * @return the email 2 original display name - */ - public String getEmail2OriginalDisplayName() { - return this.getNamedStringItem(0x00008094); - } - - /** - * E-mail3 display name - * - * @return the email 3 display name - */ - public String getEmail3DisplayName() { - return this.getNamedStringItem(0x000080a0); - } - - /** - * E-mail3 address type - * - * @return the email 3 address type - */ - public String getEmail3AddressType() { - return this.getNamedStringItem(0x000080a2); - } - - /** - * E-mail3 e-mail address - * - * @return the email 3 email address - */ - public String getEmail3EmailAddress() { - return this.getNamedStringItem(0x000080a3); - } - - /** - * E-mail3 original display name - * - * @return the email 3 original display name - */ - public String getEmail3OriginalDisplayName() { - return this.getNamedStringItem(0x000080a4); - } - - /** - * Fax1 Address Type - * - * @return the fax 1 address type - */ - public String getFax1AddressType() { - return this.getNamedStringItem(0x000080b2); - } - - /** - * Fax1 Email Address - * - * @return the fax 1 email address - */ - public String getFax1EmailAddress() { - return this.getNamedStringItem(0x000080b3); - } - - /** - * Fax1 Original Display Name - * - * @return the fax 1 original display name - */ - public String getFax1OriginalDisplayName() { - return this.getNamedStringItem(0x000080b4); - } - - /** - * Fax2 Address Type - * - * @return the fax 2 address type - */ - public String getFax2AddressType() { - return this.getNamedStringItem(0x000080c2); - } - - /** - * Fax2 Email Address - * - * @return the fax 2 email address - */ - public String getFax2EmailAddress() { - return this.getNamedStringItem(0x000080c3); - } - - /** - * Fax2 Original Display Name - * - * @return the fax 2 original display name - */ - public String getFax2OriginalDisplayName() { - return this.getNamedStringItem(0x000080c4); - } - - /** - * Fax3 Address Type - * - * @return the fax 3 address type - */ - public String getFax3AddressType() { - return this.getNamedStringItem(0x000080d2); - } - - /** - * Fax3 Email Address - * - * @return the fax 3 email address - */ - public String getFax3EmailAddress() { - return this.getNamedStringItem(0x000080d3); - } - - /** - * Fax3 Original Display Name - * - * @return the fax 3 original display name - */ - public String getFax3OriginalDisplayName() { - return this.getNamedStringItem(0x000080d4); - } - - /** - * Free/Busy Location (URL) - * - * @return the free busy location - */ - public String getFreeBusyLocation() { - return this.getNamedStringItem(0x000080d8); - } - - /** - * Birthday - * - * @return the birthday - */ - public Date getBirthday() { - return this.getDateItem(0x3a42); - } - - /** - * (Wedding) Anniversary - * - * @return the anniversary - */ - public Date getAnniversary() { - return this.getDateItem(0x3a41); - } - - @Override - public String toString() { - - return "Contact's Account name: " + this.getAccount() + "\n" + "Display Name: " + this.getGivenName() + " " - + this.getSurname() + " (" + this.getSMTPAddress() + ")\n" + "Email1 Address Type: " - + this.getEmail1AddressType() + "\n" + "Email1 Address: " + this.getEmail1EmailAddress() + "\n" - + "Callback telephone number: " + this.getCallbackTelephoneNumber() + "\n" - + "Contact's generational abbreviation (name suffix): " + this.getGeneration() + "\n" - + "Contacts given name: " + this.getGivenName() + "\n" + "Contacts Government ID Number: " - + this.getGovernmentIdNumber() + "\n" + "Business/Office Telephone Number: " - + this.getBusinessTelephoneNumber() + "\n" + "Home Telephone Number: " + this.getHomeTelephoneNumber() - + "\n" + "Contacts initials: " + this.getInitials() + "\n" + "Keyword: " + this.getKeyword() + "\n" - + "Contact's language: " + this.getLanguage() + "\n" + "Contact's location: " + this.getLocation() + "\n" - + "MHS Common Name: " + this.getMhsCommonName() + "\n" + "Organizational identification number: " - + this.getOrganizationalIdNumber() + "\n" + "Contact's surname (Last name): " + this.getSurname() + "\n" - + "Original display name: " + this.getOriginalDisplayName() + "\n" + "Default Postal Address: " - + this.getPostalAddress() + "\n" + "Contact's company name: " + this.getCompanyName() + "\n" - + "Contact's job title (Profession): " + this.getTitle() + "\n" - + "Contact's department name Used in contact ite: " + this.getDepartmentName() + "\n" - + "Contact's office location: " + this.getOfficeLocation() + "\n" + "Primary Telephone: " - + this.getPrimaryTelephoneNumber() + "\n" + "Contact's secondary office (business) phone number: " - + this.getBusiness2TelephoneNumber() + "\n" + "Mobile Phone Number: " + this.getMobileTelephoneNumber() - + "\n" + "Radio Phone Number: " + this.getRadioTelephoneNumber() + "\n" + "Car Phone Number: " - + this.getCarTelephoneNumber() + "\n" + "Other Phone Number: " + this.getOtherTelephoneNumber() + "\n" - + "Transmittable display name: " + this.getTransmittableDisplayName() + "\n" + "Pager Phone Number: " - + this.getPagerTelephoneNumber() + "\n" + "Primary Fax Number: " + this.getPrimaryFaxNumber() + "\n" - + "Contact's office (business) fax numbe: " + this.getBusinessFaxNumber() + "\n" - + "Contact's home fax number: " + this.getHomeFaxNumber() + "\n" + "Business Address Country: " - + this.getBusinessAddressCountry() + "\n" + "Business Address City: " + this.getBusinessAddressCity() + "\n" - + "Business Address State: " + this.getBusinessAddressStateOrProvince() + "\n" + "Business Address Street: " - + this.getBusinessAddressStreet() + "\n" + "Business Postal Code: " + this.getBusinessPostalCode() + "\n" - + "Business PO Box: " + this.getBusinessPoBox() + "\n" + "Telex Number: " + this.getTelexNumber() + "\n" - + "ISDN Number: " + this.getIsdnNumber() + "\n" + "Assistant Phone Number: " - + this.getAssistantTelephoneNumber() + "\n" + "Home Phone 2: " + this.getHome2TelephoneNumber() + "\n" - + "Assistant's Name: " + this.getAssistant() + "\n" + "Hobbies: " + this.getHobbies() + "\n" - + "Middle Name: " + this.getMiddleName() + "\n" + "Display Name Prefix (Contact Title): " - + this.getDisplayNamePrefix() + "\n" + "Profession: " + this.getProfession() + "\n" + "Preferred By Name: " - + this.getPreferredByName() + "\n" + "Spouse's Name: " + this.getSpouseName() + "\n" - + "Computer Network Name: " + this.getComputerNetworkName() + "\n" + "Customer ID: " + this.getCustomerId() - + "\n" + "TTY/TDD Phone: " + this.getTtytddPhoneNumber() + "\n" + "Ftp Site: " + this.getFtpSite() + "\n" - + "Manager's Name: " + this.getManagerName() + "\n" + "Nickname: " + this.getNickname() + "\n" - + "Personal Home Page: " + this.getPersonalHomePage() + "\n" + "Business Home Page: " - + this.getBusinessHomePage() + "\n" + "Company Main Phone: " + this.getCompanyMainPhoneNumber() + "\n" - + "Childrens names: " + this.getChildrensNames() + "\n" + "Home Address City: " + this.getHomeAddressCity() - + "\n" + "Home Address Country: " + this.getHomeAddressCountry() + "\n" + "Home Address Postal Code: " - + this.getHomeAddressPostalCode() + "\n" + "Home Address State or Province: " - + this.getHomeAddressStateOrProvince() + "\n" + "Home Address Street: " + this.getHomeAddressStreet() + "\n" - + "Home Address Post Office Box: " + this.getHomeAddressPostOfficeBox() + "\n" + "Other Address City: " - + this.getOtherAddressCity() + "\n" + "Other Address Country: " + this.getOtherAddressCountry() + "\n" - + "Other Address Postal Code: " + this.getOtherAddressPostalCode() + "\n" + "Other Address State: " - + this.getOtherAddressStateOrProvince() + "\n" + "Other Address Street: " + this.getOtherAddressStreet() - + "\n" + "Other Address Post Office box: " + this.getOtherAddressPostOfficeBox() + "\n" + "\n" - + this.getBody(); - } -} diff --git a/src/main/java/com/pff/PSTConversationIndex.java b/src/main/java/com/pff/PSTConversationIndex.java deleted file mode 100644 index a290183..0000000 --- a/src/main/java/com/pff/PSTConversationIndex.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.pff; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.UUID; - -/** - * Class to hold decoded PidTagConversationIndex - * - * @author Nick Buller - */ -public class PSTConversationIndex { - private static final int HUNDRED_NS_TO_MS = 1000; - private static final int MINIMUM_HEADER_SIZE = 22; - private static final int RESPONSE_LEVEL_SIZE = 5; - - private Date deliveryTime; - private UUID guid; - private List responseLevels = new ArrayList<>(); - - public Date getDeliveryTime() { - return this.deliveryTime; - } - - public UUID getGuid() { - return this.guid; - } - - public List 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; +}