1d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank/* Copyright (C) 2010 The Android Open Source Project.
2d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
3d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Licensed under the Apache License, Version 2.0 (the "License");
4d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * you may not use this file except in compliance with the License.
5d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * You may obtain a copy of the License at
6d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
7d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *      http://www.apache.org/licenses/LICENSE-2.0
8d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
9d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Unless required by applicable law or agreed to in writing, software
10d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * distributed under the License is distributed on an "AS IS" BASIS,
11d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * See the License for the specific language governing permissions and
13d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * limitations under the License.
14d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank */
15d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
16d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankpackage com.android.exchange.adapter;
17d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
18d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport com.android.exchange.EasSyncService;
19d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport com.android.exchange.provider.GalResult;
20d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport com.android.exchange.provider.GalResult.GalData;
21d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
22d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport java.io.IOException;
23d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport java.io.InputStream;
24d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
25d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank/**
26d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Parse the result of a GAL command.
27d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank */
28d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankpublic class GalParser extends Parser {
29d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private EasSyncService mService;
30d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    GalResult mGalResult = new GalResult();
31d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
32d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public GalParser(InputStream in, EasSyncService service) throws IOException {
33d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        super(in);
34d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        mService = service;
35d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
36d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
37d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public GalResult getGalResult() {
38d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        return mGalResult;
39d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
40d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
41d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    @Override
42d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public boolean parse() throws IOException {
43d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        if (nextTag(START_DOCUMENT) != Tags.SEARCH_SEARCH) {
44d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            throw new IOException();
45d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
46d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        while (nextTag(START_DOCUMENT) != END_DOCUMENT) {
47d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            if (tag == Tags.SEARCH_RESPONSE) {
48d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                parseResponse(mGalResult);
49d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            } else {
50d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                skipTag();
51d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            }
52d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank         }
53d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank         return mGalResult.total > 0;
54d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     }
55d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
56d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public void parseProperties(GalResult galResult) throws IOException {
57d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        GalData galData = new GalData();
58d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        while (nextTag(Tags.SEARCH_STORE) != END) {
59d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            switch(tag) {
60d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                // Display name and email address use both legacy and new code for galData
61d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_DISPLAY_NAME:
62d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    String displayName = getValue();
63d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.DISPLAY_NAME, displayName);
64d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.displayName = displayName;
65d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
66d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_EMAIL_ADDRESS:
67d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    String emailAddress = getValue();
68d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.EMAIL_ADDRESS, emailAddress);
69d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.emailAddress = emailAddress;
70d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
71d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_PHONE:
72d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.WORK_PHONE, getValue());
73d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
74d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_OFFICE:
75d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.OFFICE, getValue());
76d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
77d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_TITLE:
78d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.TITLE, getValue());
79d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
80d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_COMPANY:
81d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.COMPANY, getValue());
82d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
83d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_ALIAS:
84d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.ALIAS, getValue());
85d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
86d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_FIRST_NAME:
87d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.FIRST_NAME, getValue());
88d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
89d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_LAST_NAME:
90d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.LAST_NAME, getValue());
91d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
92d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_HOME_PHONE:
93d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.HOME_PHONE, getValue());
94d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
95d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                case Tags.GAL_MOBILE_PHONE:
96d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    galData.put(GalData.MOBILE_PHONE, getValue());
97d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    break;
98d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                default:
99d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    skipTag();
100d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            }
101d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
102d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        galResult.addGalData(galData);
103d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
104d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
105d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     public void parseResult(GalResult galResult) throws IOException {
106d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank         while (nextTag(Tags.SEARCH_STORE) != END) {
107d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             if (tag == Tags.SEARCH_PROPERTIES) {
108d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 parseProperties(galResult);
109d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             } else {
110d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 skipTag();
111d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             }
112d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank         }
113d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     }
114d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
115d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     public void parseResponse(GalResult galResult) throws IOException {
116d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank         while (nextTag(Tags.SEARCH_RESPONSE) != END) {
117d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             if (tag == Tags.SEARCH_STORE) {
118d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 parseStore(galResult);
119d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             } else {
120d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 skipTag();
121d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             }
122d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank         }
123d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     }
124d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
125d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     public void parseStore(GalResult galResult) throws IOException {
126d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank         while (nextTag(Tags.SEARCH_STORE) != END) {
127d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             if (tag == Tags.SEARCH_RESULT) {
128d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 parseResult(galResult);
129d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             } else if (tag == Tags.SEARCH_RANGE) {
130d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 // Retrieve value, even if we're not using it for debug logging
131d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 String range = getValue();
132d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 if (EasSyncService.DEBUG_GAL_SERVICE) {
133d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                     mService.userLog("GAL result range: " + range);
134d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 }
135d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             } else if (tag == Tags.SEARCH_TOTAL) {
136d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 galResult.total = getValueInt();
137d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             } else {
138d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                 skipTag();
139d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank             }
140d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank         }
141d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     }
142d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank}
143d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
144