/* * AttachmentAction.java * * Copyright � 1998-2011 Research In Motion Limited * * 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. * * Note: For the sake of simplicity, this sample application may not leverage * resource bundles and resource strings. However, it is STRONGLY recommended * that application developers make use of the localization features available * within the BlackBerry development platform to ensure a seamless application * experience across a variety of languages and geographies. For more information * on localizing your application, please refer to the BlackBerry Java Development * Environment Development Guide associated with this release. */ package com.rim.samples.device.attachmentdemo; import java.io.IOException; import java.util.Enumeration; import java.util.Vector; import net.rim.blackberry.api.mail.AttachmentDownloadManager; import net.rim.blackberry.api.mail.BodyPart; import net.rim.blackberry.api.mail.DownloadProgressListener; import net.rim.blackberry.api.mail.Folder; import net.rim.blackberry.api.mail.Message; import net.rim.blackberry.api.mail.MessagingException; import net.rim.blackberry.api.mail.ServiceConfiguration; import net.rim.blackberry.api.mail.Session; import net.rim.blackberry.api.mail.Store; import net.rim.device.api.servicebook.ServiceBook; import net.rim.device.api.servicebook.ServiceRecord; /** * A class to retrieve all email messages and extract those that contain * attachments. */ public final class AttachmentAction implements DownloadProgressListener { private final AttachmentDownloadManager _downloadManager; private final AttachmentDemoScreen _screen; private final Vector _messageVector; /** * Creates a new AttachmentAction object * * @param screen * The main screen for the application */ public AttachmentAction(final AttachmentDemoScreen screen) { _screen = screen; _downloadManager = new AttachmentDownloadManager(); _messageVector = new Vector(); } /** * Adds all email messages to the messages vector * * @param folders * An array of mail folder objects */ private void populateMessages(final Folder[] folders) { for (int folderIndex = 0; folderIndex < folders.length; folderIndex++) { final Folder[] subfolders = folders[folderIndex].list(); // Call this method recursively populateMessages(subfolders); Message[] messages; try { // Retrieve messages from current folder messages = folders[folderIndex].getMessages(); } catch (final MessagingException e) { AttachmentDemo.errorDialog("Folder#getMessages() threw " + e.toString()); return; } for (int messageIndex = 0; messageIndex < messages.length; messageIndex++) { _messageVector.addElement(messages[messageIndex]); } } } /** * Gets all the email messages from the mail box * * @return True if any messages were retrieved, otherwise false */ public boolean getMessages() { // Open the service book and get the mail service records final ServiceBook serviceBook = ServiceBook.getSB(); final ServiceRecord[] mailServiceRecords = serviceBook.findRecordsByCid("CMIME"); for (int cnt = mailServiceRecords.length - 1; cnt >= 0; --cnt) { final ServiceConfiguration sc = new ServiceConfiguration(mailServiceRecords[cnt]); final Store store = Session.getInstance(sc).getStore(); populateMessages(store.list(Folder.SUBTREE)); } return !_messageVector.isEmpty(); } /** * Downloads attachments * * @param downloadAll * True if all attachments are to be downloaded, false if only * msword or png files are to be downloaded */ public void download(final boolean downloadAll) throws IOException { final Enumeration msg_enum = _messageVector.elements(); final Vector partsToBeDownloaded = new Vector(); // Get all messages while (msg_enum.hasMoreElements()) { final Message m = (Message) msg_enum.nextElement(); // Get body parts containing attachments final BodyPart[] bodyParts = _downloadManager.getAttachmentBodyParts(m); if (bodyParts != null && bodyParts.length > 0) { for (int i = 0; i < bodyParts.length; i++) { final BodyPart bp = bodyParts[i]; if (!downloadAll) { // Download png and msword attachments only final String type = _downloadManager.getFileContentType(bp); if (!type.trim().endsWith("png") && !type.trim().endsWith("msword")) { continue; } } partsToBeDownloaded.addElement(bp); } } } if (partsToBeDownloaded.size() > 0) { // Re-initialize the body parts array with the body parts we are // interested in final BodyPart[] bodyParts = new BodyPart[partsToBeDownloaded.size()]; partsToBeDownloaded.copyInto(bodyParts); if (bodyParts != null && bodyParts.length > 0) { // Download the body parts _downloadManager.download(bodyParts, null, this); } } } // DownloadProgressListener implementation --------------------------------- /** * @see DownloadProgressListener#downloadCancelled(Object) */ public void downloadCancelled(final Object element) { final BodyPart bodyPart = (BodyPart) element; _screen.displayStatus("Failed to download " + _downloadManager.getFileName(bodyPart)); } /** * @see DownloadProgressListener#downloadCompleted(Object) */ public void downloadCompleted(final Object element) { final BodyPart bodyPart = (BodyPart) element; _screen.displayStatus(_downloadManager.getFileName(bodyPart) + " downloaded."); } /** * @see DownloadProgressListener#updateProgress(Object, int, int) */ public void updateProgress(final Object element, final int current, final int total) { // Not implemented } }