diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..810481f --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,728 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1460544842728 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + java-libpst:jar + + + + + + + + No facets are configured + + + + + + + + + + + + + + + 1.8 + + + + + + + + main + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/pff/PSTFolder.java b/src/main/java/com/pff/PSTFolder.java index d3fc0a4..4700183 100644 --- a/src/main/java/com/pff/PSTFolder.java +++ b/src/main/java/com/pff/PSTFolder.java @@ -1,37 +1,37 @@ /** * 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 - * + *

+ * 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.util.*; @@ -43,363 +43,383 @@ * @author Richard Johnson */ public class PSTFolder extends PSTObject { - - /** - * a constructor for the rest of us... - * @param theFile - * @param descriptorIndexNode - * @throws PSTException - * @throws IOException - */ - PSTFolder(PSTFile theFile, 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 - * @param folderIndexNode - * @param table - */ - PSTFolder(PSTFile theFile, DescriptorIndexNode folderIndexNode, PSTTableBC table, 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 - * @throws IOException - */ - public Vector getSubFolders() - throws PSTException, IOException - { - initSubfoldersTable(); - Vector output = new Vector(); - if (this.hasSubfolders()) { - try { - List> itemMapSet = subfoldersTable.getItems(); - for (HashMap itemMap : itemMapSet) { - PSTTable7CItem item = itemMap.get(26610); - PSTFolder folder = (PSTFolder)PSTObject.detectAndLoadPSTObject(pstFile, item.entryValueReference); - output.add(folder); - } - } catch (PSTException err) { - // hierachy node doesn't exist - throw new PSTException("Can't get child folders for folder "+this.getDisplayName()+"("+this.getDescriptorNodeId()+") child count: "+this.getContentCount()+ " - "+err.toString()); - } - } - // try and get subfolders? - return output; - } - - private void initSubfoldersTable() - throws IOException, PSTException - { - if (subfoldersTable != null) { - return; - } - - if (this.hasSubfolders()) { - long folderDescriptorIndex = this.descriptorIndexNode.descriptorIdentifier + 11; - try { - DescriptorIndexNode folderDescriptor = this.pstFile.getDescriptorIndexNode(folderDescriptorIndex); - HashMap tmp = null; - if (folderDescriptor.localDescriptorsOffsetIndexIdentifier > 0) { - //tmp = new PSTDescriptor(pstFile, folderDescriptor.localDescriptorsOffsetIndexIdentifier).getChildren(); - tmp = pstFile.getPSTDescriptorItems(folderDescriptor.localDescriptorsOffsetIndexIdentifier); - } - subfoldersTable = new PSTTable7C(new PSTNodeInputStream(pstFile, pstFile.getOffsetIndexNode(folderDescriptor.dataOffsetIndexIdentifier)), tmp); - } catch (PSTException err) { - // hierachy node doesn't exist - throw new PSTException("Can't get child folders for folder "+this.getDisplayName()+"("+this.getDescriptorNodeId()+") child count: "+this.getContentCount()+ " - "+err.toString()); - } - } - - } - - /** - * internal vars for the tracking of things.. - */ - private int currentEmailIndex = 0; - private 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 - * @throws IOException - */ - 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 { - long folderDescriptorIndex = this.descriptorIndexNode.descriptorIdentifier + 12; // +12 lists emails! :D - DescriptorIndexNode folderDescriptor = this.pstFile.getDescriptorIndexNode(folderDescriptorIndex); - HashMap tmp = null; - if (folderDescriptor.localDescriptorsOffsetIndexIdentifier > 0) { - //tmp = new PSTDescriptor(pstFile, folderDescriptor.localDescriptorsOffsetIndexIdentifier).getChildren(); - tmp = pstFile.getPSTDescriptorItems(folderDescriptor.localDescriptorsOffsetIndexIdentifier); - } - //PSTTable7CForFolder folderDescriptorTable = new PSTTable7CForFolder(folderDescriptor.dataBlock.data, folderDescriptor.dataBlock.blockOffsets,tmp, 0x67F2); - emailsTable = new PSTTable7C( - new PSTNodeInputStream(pstFile, pstFile.getOffsetIndexNode(folderDescriptor.dataOffsetIndexIdentifier)), - tmp, - 0x67F2 - ); - } catch (Exception err) { - - // here we have to attempt to fallback onto the children as listed by the descriptor b-tree - LinkedHashMap> tree = this.pstFile.getChildDescriptorTree(); - - fallbackEmailsTable = new LinkedList(); - LinkedList allChildren = tree.get(this.getDescriptorNode().descriptorIdentifier); - - if (allChildren != null) { - // quickly go through and remove those entries that are not messages! - for (DescriptorIndexNode node : allChildren) { - if (node != null && PSTObject.getNodeType(node.descriptorIdentifier) == PSTObject.NID_TYPE_NORMAL_MESSAGE) { - 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 " + 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 - * @return bunch of children in this folder - * @throws PSTException - * @throws IOException - */ - public Vector getChildren(int numberToReturn) - throws PSTException, IOException - { - initEmailsTable(); - - Vector output = new Vector(); - if (emailsTable != null) { - List> rows = this.emailsTable.getItems(currentEmailIndex, numberToReturn); - - for (int x = 0; x < rows.size(); x++) { - if (this.currentEmailIndex >= this.getContentCount()) - { - // no more! - break; - } - // get the emails from the rows - PSTTable7CItem emailRow = rows.get(x).get(0x67F2); - DescriptorIndexNode childDescriptor = pstFile.getDescriptorIndexNode(emailRow.entryValueReference); - PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); - output.add(child); - currentEmailIndex++; - } - } else if (fallbackEmailsTable != null) { - // we use the fallback - ListIterator iterator = this.fallbackEmailsTable.listIterator(currentEmailIndex); - for (int x = 0; x < numberToReturn; x++) { - if (this.currentEmailIndex >= this.getContentCount()) - { - // no more! - break; - } - DescriptorIndexNode childDescriptor = iterator.next(); - PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); - output.add(child); - currentEmailIndex++; - } - } - - - return output; - } - - public LinkedList getChildDescriptorNodes() throws PSTException, IOException { - initEmailsTable(); - if (this.emailsTable == null) { - return new LinkedList(); - } - LinkedList output = new LinkedList(); - List> rows = this.emailsTable.getItems(); - for (HashMap row : rows) { - // get the emails from the rows - if (this.currentEmailIndex == this.getContentCount()) - { - // no more! - break; - } - 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 - * @throws IOException - */ - public PSTObject getNextChild() - throws PSTException, IOException - { - initEmailsTable(); - - if (this.emailsTable != null) { - List> rows = this.emailsTable.getItems(currentEmailIndex, 1); - - if (this.currentEmailIndex == this.getContentCount()) - { - // no more! - return null; - } - // get the emails from the rows - PSTTable7CItem emailRow = rows.get(0).get(0x67F2); - DescriptorIndexNode childDescriptor = pstFile.getDescriptorIndexNode(emailRow.entryValueReference); - PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); - currentEmailIndex++; - - return child; - } else if (this.fallbackEmailsTable != null) { - if (this.currentEmailIndex >= this.getContentCount() || this.currentEmailIndex >= this.fallbackEmailsTable.size()) - { - // no more! - return null; - } - // get the emails from the rows - DescriptorIndexNode childDescriptor = fallbackEmailsTable.get(currentEmailIndex); - PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); - currentEmailIndex++; - return child; - } - return null; - } - - /** - * move the internal folder cursor to the desired position - * position 0 is before the first record. - * @param newIndex - */ - public void moveChildCursorTo(int newIndex) - throws IOException, PSTException - { - initEmailsTable(); - - if (newIndex < 1) { - currentEmailIndex = 0; - return; - } - if (newIndex > this.getContentCount()) { - newIndex = this.getContentCount(); - } - currentEmailIndex = newIndex; - } - - /** - * the number of child folders in this folder - * @return number of subfolders as counted - * @throws IOException - * @throws PSTException - */ - 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 - * @throws PSTException - public int getEmailCount() - throws IOException, PSTException - { - this.initEmailsTable(); - return this.emailsTable.getRowCount(); - } - */ - - - 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 - */ - 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); - } - - public String getContainerClass() { - return this.getStringItem(0x3613); - } - - public int getAssociateContentCount() { - return this.getIntItem(0x3617); - } - - /** - * Container flags Integer 32-bit signed - */ - public int getContainerFlags() { - return this.getIntItem(0x3600); - } - + + /** + * a constructor for the rest of us... + * @param theFile + * @param descriptorIndexNode + * @throws PSTException + * @throws IOException + */ + PSTFolder(PSTFile theFile, 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 + * @param folderIndexNode + * @param table + */ + PSTFolder(PSTFile theFile, DescriptorIndexNode folderIndexNode, PSTTableBC table, 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 + * @throws IOException + */ + public Vector getSubFolders() + throws PSTException, IOException { + initSubfoldersTable(); + Vector output = new Vector(); + if (this.hasSubfolders()) { + try { + List> itemMapSet = subfoldersTable.getItems(); + for (HashMap itemMap : itemMapSet) { + PSTTable7CItem item = itemMap.get(26610); + PSTFolder folder = (PSTFolder) PSTObject.detectAndLoadPSTObject(pstFile, item.entryValueReference); + output.add(folder); + } + } catch (PSTException err) { + // hierachy node doesn't exist + throw new PSTException("Can't get child folders for folder " + this.getDisplayName() + "(" + this.getDescriptorNodeId() + ") child count: " + this.getContentCount() + " - " + err.toString()); + } + } + // try and get subfolders? + return output; + } + + private void initSubfoldersTable() + throws IOException, PSTException { + if (subfoldersTable != null) { + return; + } + + if (this.hasSubfolders()) { + long folderDescriptorIndex = this.descriptorIndexNode.descriptorIdentifier + 11; + try { + DescriptorIndexNode folderDescriptor = this.pstFile.getDescriptorIndexNode(folderDescriptorIndex); + HashMap tmp = null; + if (folderDescriptor.localDescriptorsOffsetIndexIdentifier > 0) { + //tmp = new PSTDescriptor(pstFile, folderDescriptor.localDescriptorsOffsetIndexIdentifier).getChildren(); + tmp = pstFile.getPSTDescriptorItems(folderDescriptor.localDescriptorsOffsetIndexIdentifier); + } + subfoldersTable = new PSTTable7C(new PSTNodeInputStream(pstFile, pstFile.getOffsetIndexNode(folderDescriptor.dataOffsetIndexIdentifier)), tmp); + } catch (PSTException err) { + // hierachy node doesn't exist + throw new PSTException("Can't get child folders for folder " + this.getDisplayName() + "(" + this.getDescriptorNodeId() + ") child count: " + this.getContentCount() + " - " + err.toString()); + } + } + + } + + /** + * internal vars for the tracking of things.. + */ + private int currentEmailIndex = 0; + private 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 + * @throws IOException + */ + 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 { + long folderDescriptorIndex = this.descriptorIndexNode.descriptorIdentifier + 12; // +12 lists emails! :D + DescriptorIndexNode folderDescriptor = this.pstFile.getDescriptorIndexNode(folderDescriptorIndex); + HashMap tmp = null; + if (folderDescriptor.localDescriptorsOffsetIndexIdentifier > 0) { + //tmp = new PSTDescriptor(pstFile, folderDescriptor.localDescriptorsOffsetIndexIdentifier).getChildren(); + tmp = pstFile.getPSTDescriptorItems(folderDescriptor.localDescriptorsOffsetIndexIdentifier); + } + //PSTTable7CForFolder folderDescriptorTable = new PSTTable7CForFolder(folderDescriptor.dataBlock.data, folderDescriptor.dataBlock.blockOffsets,tmp, 0x67F2); + emailsTable = new PSTTable7C( + new PSTNodeInputStream(pstFile, pstFile.getOffsetIndexNode(folderDescriptor.dataOffsetIndexIdentifier)), + tmp, + 0x67F2 + ); + } catch (Exception err) { + + // here we have to attempt to fallback onto the children as listed by the descriptor b-tree + LinkedHashMap> tree = this.pstFile.getChildDescriptorTree(); + + fallbackEmailsTable = new LinkedList(); + LinkedList allChildren = tree.get(this.getDescriptorNode().descriptorIdentifier); + + if (allChildren != null) { + // quickly go through and remove those entries that are not messages! + for (DescriptorIndexNode node : allChildren) { + if (node != null && PSTObject.getNodeType(node.descriptorIdentifier) == PSTObject.NID_TYPE_NORMAL_MESSAGE) { + 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 " + 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 + * @return bunch of children in this folder + * @throws PSTException + * @throws IOException + */ + public Vector getChildren(int numberToReturn) + throws PSTException, IOException { + initEmailsTable(); + + Vector output = new Vector(); + if (emailsTable != null) { + List> rows = this.emailsTable.getItems(currentEmailIndex, numberToReturn); + + for (int x = 0; x < rows.size(); x++) { + if (this.currentEmailIndex >= this.getContentCount()) { + // no more! + break; + } + // get the emails from the rows + PSTTable7CItem emailRow = rows.get(x).get(0x67F2); + DescriptorIndexNode childDescriptor = pstFile.getDescriptorIndexNode(emailRow.entryValueReference); + PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); + output.add(child); + currentEmailIndex++; + } + } else if (fallbackEmailsTable != null) { + // we use the fallback + ListIterator iterator = this.fallbackEmailsTable.listIterator(currentEmailIndex); + for (int x = 0; x < numberToReturn; x++) { + if (this.currentEmailIndex >= this.getContentCount()) { + // no more! + break; + } + DescriptorIndexNode childDescriptor = iterator.next(); + PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); + output.add(child); + currentEmailIndex++; + } + } + + + return output; + } + + public LinkedList getChildDescriptorNodes() throws PSTException, IOException { + initEmailsTable(); + if (this.emailsTable == null) { + return new LinkedList(); + } + LinkedList output = new LinkedList(); + List> rows = this.emailsTable.getItems(); + for (HashMap row : rows) { + // get the emails from the rows + if (this.currentEmailIndex == this.getContentCount()) { + // no more! + break; + } + 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 + * @throws IOException + */ + public PSTObject getNextChild() + throws PSTException, IOException { + initEmailsTable(); + + if (this.emailsTable != null) { + List> rows = this.emailsTable.getItems(currentEmailIndex, 1); + + if (this.currentEmailIndex == this.getContentCount()) { + // no more! + return null; + } + // get the emails from the rows + PSTTable7CItem emailRow = rows.get(0).get(0x67F2); + DescriptorIndexNode childDescriptor = pstFile.getDescriptorIndexNode(emailRow.entryValueReference); + PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); + currentEmailIndex++; + + return child; + } else if (this.fallbackEmailsTable != null) { + if (this.currentEmailIndex >= this.getContentCount() || this.currentEmailIndex >= this.fallbackEmailsTable.size()) { + // no more! + return null; + } + // get the emails from the rows + DescriptorIndexNode childDescriptor = fallbackEmailsTable.get(currentEmailIndex); + PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); + currentEmailIndex++; + return child; + } + return null; + } + + + public PSTObject getPreviousChild() + throws PSTException, IOException { + initEmailsTable(); + + if (this.emailsTable != null) { + List> rows = this.emailsTable.getItems(currentEmailIndex, 1); + + if (this.currentEmailIndex < 0) { + // no more! + return null; + } + // get the emails from the rows + PSTTable7CItem emailRow = rows.get(0).get(0x67F2); + DescriptorIndexNode childDescriptor = pstFile.getDescriptorIndexNode(emailRow.entryValueReference); + PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); + currentEmailIndex--; + + return child; + } else if (this.fallbackEmailsTable != null) { + if (this.currentEmailIndex < 0) { + // no more! + return null; + } + // get the emails from the rows + DescriptorIndexNode childDescriptor = fallbackEmailsTable.get(currentEmailIndex); + PSTObject child = PSTObject.detectAndLoadPSTObject(pstFile, childDescriptor); + currentEmailIndex--; + return child; + } + return null; + } + + + /** + * move the internal folder cursor to the desired position + * position 0 is before the first record. + * @param newIndex + */ + public void moveChildCursorTo(int newIndex) + throws IOException, PSTException { + initEmailsTable(); + + if (newIndex < 1) { + currentEmailIndex = 0; + return; + } + if (newIndex > this.getContentCount()) { + newIndex = this.getContentCount(); + } + currentEmailIndex = newIndex; + } + + /** + * the number of child folders in this folder + * @return number of subfolders as counted + * @throws IOException + * @throws PSTException + */ + 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 + * @throws PSTException + public int getEmailCount() + throws IOException, PSTException + { + this.initEmailsTable(); + return this.emailsTable.getRowCount(); + } + */ + + + 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 + */ + 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); + } + + public String getContainerClass() { + return this.getStringItem(0x3613); + } + + public int getAssociateContentCount() { + return this.getIntItem(0x3617); + } + + /** + * Container flags Integer 32-bit signed + */ + public int getContainerFlags() { + return this.getIntItem(0x3600); + } + } diff --git a/src/main/main.iml b/src/main/main.iml new file mode 100644 index 0000000..19dbd15 --- /dev/null +++ b/src/main/main.iml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/test/test.iml b/src/test/test.iml new file mode 100644 index 0000000..19dbd15 --- /dev/null +++ b/src/test/test.iml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file