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