1192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta/*
2192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Copyright (C) 2014 The Android Open Source Project
3192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta *
4192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Licensed under the Apache License, Version 2.0 (the "License");
5192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * you may not use this file except in compliance with the License.
6192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * You may obtain a copy of the License at
7192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta *
8192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta *      http://www.apache.org/licenses/LICENSE-2.0
9192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta *
10192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Unless required by applicable law or agreed to in writing, software
11192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * distributed under the License is distributed on an "AS IS" BASIS,
12192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * See the License for the specific language governing permissions and
14192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * limitations under the License.
15192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */
16192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
17192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapackage android.bluetooth.client.pbap;
18192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
19192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.util.Log;
20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport com.android.vcard.VCardEntry;
22192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.bluetooth.client.pbap.utils.ObexAppParameters;
23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.IOException;
25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.InputStream;
26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.ArrayList;
27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.HeaderSet;
29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptafinal class BluetoothPbapRequestPullPhoneBook extends BluetoothPbapRequest {
31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    private static final String TAG = "BluetoothPbapRequestPullPhoneBook";
33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    private static final String TYPE = "x-bt/phonebook";
35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    private BluetoothPbapVcardList mResponse;
37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    private int mNewMissedCalls = -1;
39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    private final byte mFormat;
41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public BluetoothPbapRequestPullPhoneBook(String pbName, long filter, byte format,
43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            int maxListCount, int listStartOffset) {
44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        if (maxListCount < 0 || maxListCount > 65535) {
46192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            throw new IllegalArgumentException("maxListCount should be [0..65535]");
47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        if (listStartOffset < 0 || listStartOffset > 65535) {
50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            throw new IllegalArgumentException("listStartOffset should be [0..65535]");
51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mHeaderSet.setHeader(HeaderSet.NAME, pbName);
54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mHeaderSet.setHeader(HeaderSet.TYPE, TYPE);
56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        ObexAppParameters oap = new ObexAppParameters();
58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        /* make sure format is one of allowed values */
60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        if (format != BluetoothPbapClient.VCARD_TYPE_21
61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta                && format != BluetoothPbapClient.VCARD_TYPE_30) {
62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            format = BluetoothPbapClient.VCARD_TYPE_21;
63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        if (filter != 0) {
66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            oap.add(OAP_TAGID_FILTER, filter);
67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        oap.add(OAP_TAGID_FORMAT, format);
70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        /*
72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta         * maxListCount is a special case which is handled in
73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta         * BluetoothPbapRequestPullPhoneBookSize
74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta         */
75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        if (maxListCount > 0) {
76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            oap.add(OAP_TAGID_MAX_LIST_COUNT, (short) maxListCount);
77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        } else {
78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            oap.add(OAP_TAGID_MAX_LIST_COUNT, (short) 65535);
79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        if (listStartOffset > 0) {
82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            oap.add(OAP_TAGID_LIST_START_OFFSET, (short) listStartOffset);
83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        oap.addToHeaderSet(mHeaderSet);
86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
87192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mFormat = format;
88192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
89192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
90192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    @Override
91192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected void readResponse(InputStream stream) throws IOException {
92192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        Log.v(TAG, "readResponse");
93192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
94192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mResponse = new BluetoothPbapVcardList(stream, mFormat);
95192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
96192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
97192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    @Override
98192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected void readResponseHeaders(HeaderSet headerset) {
99192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        Log.v(TAG, "readResponse");
100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        ObexAppParameters oap = ObexAppParameters.fromHeaderSet(headerset);
102192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
103192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        if (oap.exists(OAP_TAGID_NEW_MISSED_CALLS)) {
104192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            mNewMissedCalls = oap.getByte(OAP_TAGID_NEW_MISSED_CALLS);
105192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
106192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
107192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
108192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public ArrayList<VCardEntry> getList() {
109192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        return mResponse.getList();
110192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
111192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
112192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public int getNewMissedCalls() {
113192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        return mNewMissedCalls;
114192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
115192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta}
116