/** Returns a Map of message UID => ParsedMessageEnvelope */ public Map<String, ParsedMessageEnvelope> getMessageEnvelopes() { Map<String, ParsedMessageEnvelope> envelopes = new HashMap<String, ParsedMessageEnvelope>(); for (String uid : mData.keySet()) { ParsedMessageEnvelope envelope = new ParsedMessageEnvelope(); Map<String, String> data = mData.get(uid); if (data != null) { for (Map.Entry<String, String> entry : data.entrySet()) { String header = entry.getKey(); if (header.equals("read")) { String read = entry.getValue(); boolean readStatus = !read.equals("0"); envelope.setReadStatus(readStatus); } else if (header.equals("date")) { /** * Exchange doesn't give us rfc822 dates like it claims. The date is in the format: * yyyy-MM-dd'T'HH:mm:ss.SSS<Single digit representation of timezone, so far, all * instances are Z> */ String date = entry.getValue(); date = date.substring(0, date.length() - 1); DateFormat dfInput = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US); DateFormat dfOutput = new SimpleDateFormat("EEE, d MMM yy HH:mm:ss Z", Locale.US); String tempDate = ""; try { Date parsedDate = dfInput.parse(date); tempDate = dfOutput.format(parsedDate); } catch (java.text.ParseException pe) { Log.e( LOG_TAG, "Error parsing date: " + pe + "\nTrace: " + WebDavUtils.processException(pe)); } envelope.addHeader(header, tempDate); } else { envelope.addHeader(header, entry.getValue()); } } } envelopes.put(uid, envelope); } return envelopes; }
/** * Fetches the full messages or up to {@param lines} lines and passes them to the message parser. */ private void fetchMessages( List<WebDavMessage> messages, MessageRetrievalListener<WebDavMessage> listener, int lines) throws MessagingException { WebDavHttpClient httpclient; httpclient = store.getHttpClient(); /** We can't hand off to processRequest() since we need the stream to parse. */ for (int i = 0, count = messages.size(); i < count; i++) { WebDavMessage wdMessage = messages.get(i); int statusCode = 0; if (listener != null) { listener.messageStarted(wdMessage.getUid(), i, count); } /** * If fetch is called outside of the initial list (ie, a locally stored message), it may not * have a URL associated. Verify and fix that */ if (wdMessage.getUrl().equals("")) { wdMessage.setUrl(getMessageUrls(new String[] {wdMessage.getUid()}).get(wdMessage.getUid())); Log.i( LOG_TAG, "Fetching messages with UID = '" + wdMessage.getUid() + "', URL = '" + wdMessage.getUrl() + "'"); if (wdMessage.getUrl().equals("")) { throw new MessagingException("Unable to get URL for message"); } } try { Log.i( LOG_TAG, "Fetching message with UID = '" + wdMessage.getUid() + "', URL = '" + wdMessage.getUrl() + "'"); HttpGet httpget = new HttpGet(new URI(wdMessage.getUrl())); HttpResponse response; HttpEntity entity; httpget.setHeader("translate", "f"); if (store.getAuthentication() == WebDavConstants.AUTH_TYPE_BASIC) { httpget.setHeader("Authorization", store.getAuthString()); } response = httpclient.executeOverride(httpget, store.getContext()); statusCode = response.getStatusLine().getStatusCode(); entity = response.getEntity(); if (statusCode < 200 || statusCode > 300) { throw new IOException( "Error during with code " + statusCode + " during fetch: " + response.getStatusLine().toString()); } if (entity != null) { InputStream istream = null; StringBuilder buffer = new StringBuilder(); String tempText; String resultText; BufferedReader reader = null; int currentLines = 0; try { istream = WebDavHttpClient.getUngzippedContent(entity); if (lines != -1) { // Convert the ungzipped input stream into a StringBuilder // containing the given line count reader = new BufferedReader(new InputStreamReader(istream), 8192); while ((tempText = reader.readLine()) != null && (currentLines < lines)) { buffer.append(tempText).append("\r\n"); currentLines++; } IOUtils.closeQuietly(istream); resultText = buffer.toString(); istream = new ByteArrayInputStream(resultText.getBytes("UTF-8")); } // Parse either the entire message stream, or a stream of the given lines wdMessage.parse(istream); } catch (IOException ioe) { Log.e( LOG_TAG, "IOException: " + ioe.getMessage() + "\nTrace: " + WebDavUtils.processException(ioe)); throw new MessagingException("I/O Error", ioe); } finally { IOUtils.closeQuietly(reader); IOUtils.closeQuietly(istream); } } else { Log.v(LOG_TAG, "Empty response"); } } catch (IllegalArgumentException iae) { Log.e( LOG_TAG, "IllegalArgumentException caught " + iae + "\nTrace: " + WebDavUtils.processException(iae)); throw new MessagingException("IllegalArgumentException caught", iae); } catch (URISyntaxException use) { Log.e( LOG_TAG, "URISyntaxException caught " + use + "\nTrace: " + WebDavUtils.processException(use)); throw new MessagingException("URISyntaxException caught", use); } catch (IOException ioe) { Log.e( LOG_TAG, "Non-success response code loading message, response code was " + statusCode + "\nURL: " + wdMessage.getUrl() + "\nError: " + ioe.getMessage() + "\nTrace: " + WebDavUtils.processException(ioe)); throw new MessagingException("Failure code " + statusCode, ioe); } if (listener != null) { listener.messageFinished(wdMessage, i, count); } } }