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