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