1 package com.android.exchange.eas;
2 
3 import android.content.Context;
4 
5 import com.android.emailcommon.provider.Account;
6 import com.android.exchange.CommandStatusException;
7 import com.android.exchange.EasResponse;
8 import com.android.exchange.adapter.GalParser;
9 import com.android.exchange.adapter.Serializer;
10 
11 import org.apache.http.HttpEntity;
12 import org.apache.http.HttpStatus;
13 
14 import com.android.exchange.adapter.Tags;
15 import com.android.exchange.provider.GalResult;
16 import com.android.mail.utils.LogUtils;
17 
18 import java.io.IOException;
19 import java.io.InputStream;
20 
21 public class EasSearchGal extends EasOperation {
22 
23     public static final int RESULT_OK = 1;
24 
25     final private String mFilter;
26     final private int mLimit;
27     private GalResult mResult;
28 
EasSearchGal(Context context, final Account account, final String filter, final int limit)29     public EasSearchGal(Context context, final Account account, final String filter,
30                         final int limit) {
31         super(context, account);
32         mFilter = filter;
33         mLimit = limit;
34     }
35 
36     @Override
getCommand()37     protected String getCommand() {
38         return "Search";
39     }
40 
41     @Override
getRequestEntity()42     protected HttpEntity getRequestEntity() throws IOException, MessageInvalidException {
43         /*
44          * TODO: shorter timeout for interactive lookup
45          * TODO: make watchdog actually work (it doesn't understand our service w/Mailbox == 0)
46          * TODO: figure out why sendHttpClientPost() hangs - possibly pool exhaustion
47          */
48         try {
49             final Serializer s = new Serializer();
50             s.start(Tags.SEARCH_SEARCH).start(Tags.SEARCH_STORE);
51             s.data(Tags.SEARCH_NAME, "GAL").data(Tags.SEARCH_QUERY, mFilter);
52             s.start(Tags.SEARCH_OPTIONS);
53             s.data(Tags.SEARCH_RANGE, "0-" + Integer.toString(mLimit - 1));
54             s.end().end().end().done();
55             return makeEntity(s);
56         } catch (final IOException e) {
57             // TODO: what do we do for exceptions?
58         } catch (final IllegalArgumentException e) {
59         } catch (final IllegalStateException e) {
60         }
61         return null;
62     }
63 
handleResponse(final EasResponse response)64     protected int handleResponse(final EasResponse response) throws
65             IOException, CommandStatusException {
66         final int code = response.getStatus();
67         if (code == HttpStatus.SC_OK) {
68             InputStream is = response.getInputStream();
69             try {
70                 final GalParser gp = new GalParser(is);
71                 if (gp.parse()) {
72                     mResult = gp.getGalResult();
73                 } else {
74                     LogUtils.wtf(LogUtils.TAG, "Failure to parse GalResult");
75                 }
76             } finally {
77                 is.close();
78             }
79             return RESULT_OK;
80         } else {
81             LogUtils.d(LogUtils.TAG, "GAL lookup returned %d", code);
82             return RESULT_OTHER_FAILURE;
83         }
84     }
85 
getResult()86     public GalResult getResult() {
87         return mResult;
88     }
89 
90 }
91