public void testAddHeaders() { HttpRequestBase method = new HttpPost(); EasSyncService svc = new EasSyncService(); svc.mAuthString = "auth"; svc.mProtocolVersion = "12.1"; svc.mAccount = null; // With second argument false, there should be no header svc.setHeaders(method, false); Header[] headers = method.getHeaders("X-MS-PolicyKey"); assertEquals(0, headers.length); // With second argument true, there should always be a header // The value will be "0" without an account method.removeHeaders("X-MS-PolicyKey"); svc.setHeaders(method, true); headers = method.getHeaders("X-MS-PolicyKey"); assertEquals(1, headers.length); assertEquals("0", headers[0].getValue()); // With an account, but null security key, the header's value should be "0" Account account = new Account(); account.mSecuritySyncKey = null; svc.mAccount = account; method.removeHeaders("X-MS-PolicyKey"); svc.setHeaders(method, true); headers = method.getHeaders("X-MS-PolicyKey"); assertEquals(1, headers.length); assertEquals("0", headers[0].getValue()); // With an account and security key, the header's value should be the security key account.mSecuritySyncKey = "key"; svc.mAccount = account; method.removeHeaders("X-MS-PolicyKey"); svc.setHeaders(method, true); headers = method.getHeaders("X-MS-PolicyKey"); assertEquals(1, headers.length); assertEquals("key", headers[0].getValue()); }
public static int searchMessages( Context context, long accountId, SearchParams searchParams, long destMailboxId) { // Sanity check for arguments final int offset = searchParams.mOffset; final int limit = searchParams.mLimit; final String filter = searchParams.mFilter; if (limit < 0 || limit > MAX_SEARCH_RESULTS || offset < 0) return 0; // TODO Should this be checked in UI? Are there guidelines for minimums? if (filter == null || filter.length() < MIN_QUERY_LENGTH) return 0; int res = 0; final Account account = Account.restoreAccountWithId(context, accountId); if (account == null) return res; final EasSyncService svc = EasSyncService.setupServiceForAccount(context, account); if (svc == null) return res; final Mailbox searchMailbox = Mailbox.restoreMailboxWithId(context, destMailboxId); // Sanity check; account might have been deleted? if (searchMailbox == null) return res; final ContentValues statusValues = new ContentValues(2); try { // Set the status of this mailbox to indicate query statusValues.put(Mailbox.UI_SYNC_STATUS, UIProvider.SyncStatus.LIVE_QUERY); searchMailbox.update(context, statusValues); svc.mMailbox = searchMailbox; svc.mAccount = account; final Serializer s = new Serializer(); s.start(Tags.SEARCH_SEARCH).start(Tags.SEARCH_STORE); s.data(Tags.SEARCH_NAME, "Mailbox"); s.start(Tags.SEARCH_QUERY).start(Tags.SEARCH_AND); s.data(Tags.SYNC_CLASS, "Email"); // If this isn't an inbox search, then include the collection id final Mailbox inbox = Mailbox.restoreMailboxOfType(context, accountId, Mailbox.TYPE_INBOX); if (inbox == null) return 0; if (searchParams.mMailboxId != inbox.mId) { s.data(Tags.SYNC_COLLECTION_ID, inbox.mServerId); } s.data(Tags.SEARCH_FREE_TEXT, filter); // Add the date window if appropriate if (searchParams.mStartDate != null) { s.start(Tags.SEARCH_GREATER_THAN); s.tag(Tags.EMAIL_DATE_RECEIVED); s.data(Tags.SEARCH_VALUE, Eas.DATE_FORMAT.format(searchParams.mStartDate)); s.end(); // SEARCH_GREATER_THAN } if (searchParams.mEndDate != null) { s.start(Tags.SEARCH_LESS_THAN); s.tag(Tags.EMAIL_DATE_RECEIVED); s.data(Tags.SEARCH_VALUE, Eas.DATE_FORMAT.format(searchParams.mEndDate)); s.end(); // SEARCH_LESS_THAN } s.end().end(); // SEARCH_AND, SEARCH_QUERY s.start(Tags.SEARCH_OPTIONS); if (offset == 0) { s.tag(Tags.SEARCH_REBUILD_RESULTS); } if (searchParams.mIncludeChildren) { s.tag(Tags.SEARCH_DEEP_TRAVERSAL); } // Range is sent in the form first-last (e.g. 0-9) s.data(Tags.SEARCH_RANGE, offset + "-" + (offset + limit - 1)); s.start(Tags.BASE_BODY_PREFERENCE); s.data(Tags.BASE_TYPE, Eas.BODY_PREFERENCE_HTML); s.data(Tags.BASE_TRUNCATION_SIZE, "20000"); s.end(); // BASE_BODY_PREFERENCE s.end().end().end().done(); // SEARCH_OPTIONS, SEARCH_STORE, SEARCH_SEARCH final EasResponse resp = svc.sendHttpClientPost("Search", s.toByteArray()); try { final int code = resp.getStatus(); if (code == HttpStatus.SC_OK) { final InputStream is = resp.getInputStream(); try { final SearchParser sp = new SearchParser(is, svc, filter); sp.parse(); res = sp.getTotalResults(); /** M: Set and update mailbox flag. @{ */ int currentCount = offset + sp.getCurrentResults(); boolean allMessagesLoaded = false; if (currentCount >= res) { allMessagesLoaded = true; } searchMailbox.updateAllMessageDownloadFlag(context, allMessagesLoaded); /** @} */ } finally { is.close(); } } else { svc.userLog("Search returned " + code); } } finally { resp.close(); } } catch (IOException e) { svc.userLog("Search exception " + e); } finally { // TODO: Handle error states // Set the status of this mailbox to indicate query over statusValues.put(Mailbox.SYNC_TIME, System.currentTimeMillis()); statusValues.put(Mailbox.UI_SYNC_STATUS, UIProvider.SyncStatus.NO_SYNC); searchMailbox.update(context, statusValues); } // Return the total count return res; }