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.map;
18192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
19192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.DataOutputStream;
20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.IOException;
21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.InputStream;
22192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ClientOperation;
24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ClientSession;
25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.HeaderSet;
26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.Operation;
27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ResponseCodes;
28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaabstract class BluetoothMasRequest {
30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_MAX_LIST_COUNT = 0x01;
32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_START_OFFSET = 0x02;
33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_FILTER_MESSAGE_TYPE = 0x03;
34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_FILTER_PERIOD_BEGIN = 0x04;
35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_FILTER_PERIOD_END = 0x05;
36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_FILTER_READ_STATUS = 0x06;
37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_FILTER_RECIPIENT = 0x07;
38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_FILTER_ORIGINATOR = 0x08;
39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_FILTER_PRIORITY = 0x09;
40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_ATTACHMENT = 0x0a;
41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_TRANSPARENT = 0xb;
42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_RETRY = 0xc;
43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_NEW_MESSAGE = 0x0d;
44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_NOTIFICATION_STATUS = 0x0e;
45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_MAS_INSTANCE_ID = 0x0f;
464231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta    protected static final byte OAP_TAGID_PARAMETER_MASK = 0x10;
47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_FOLDER_LISTING_SIZE = 0x11;
48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_MESSAGES_LISTING_SIZE = 0x12;
49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_SUBJECT_LENGTH = 0x13;
50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_CHARSET = 0x14;
51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_STATUS_INDICATOR = 0x17;
52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_STATUS_VALUE = 0x18;
53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte OAP_TAGID_MSE_TIME = 0x19;
54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte NOTIFICATION_ON = 0x01;
56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte NOTIFICATION_OFF = 0x00;
57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte ATTACHMENT_ON = 0x01;
59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte ATTACHMENT_OFF = 0x00;
60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte CHARSET_NATIVE = 0x00;
62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte CHARSET_UTF8 = 0x01;
63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte STATUS_INDICATOR_READ = 0x00;
65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte STATUS_INDICATOR_DELETED = 0x01;
66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte STATUS_NO = 0x00;
68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte STATUS_YES = 0x01;
69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte TRANSPARENT_OFF = 0x00;
71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte TRANSPARENT_ON = 0x01;
72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte RETRY_OFF = 0x00;
74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static byte RETRY_ON = 0x01;
75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    /* used for PUT requests which require filler byte */
77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected static final byte[] FILLER_BYTE = {
78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        0x30
79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    };
80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected HeaderSet mHeaderSet;
82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected int mResponseCode;
84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public BluetoothMasRequest() {
86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mHeaderSet = new HeaderSet();
87192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
88192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
89192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    abstract public void execute(ClientSession session) throws IOException;
90192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
91192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected void executeGet(ClientSession session) throws IOException {
92192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        ClientOperation op = null;
93192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
94192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        try {
95192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            op = (ClientOperation) session.get(mHeaderSet);
96192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
97192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            /*
98192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta             * MAP spec does not explicitly require that GET request should be
99192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta             * sent in single packet but for some reason PTS complains when
100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta             * final GET packet with no headers follows non-final GET with all
101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta             * headers. So this is workaround, at least temporary. TODO: check
102192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta             * with PTS
103192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta             */
104192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            op.setGetFinalFlag(true);
105192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
106192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            /*
107192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta             * this will trigger ClientOperation to use non-buffered stream so
108192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta             * we can abort operation
109192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta             */
110192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            op.continueOperation(true, false);
111192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
112192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            readResponseHeaders(op.getReceivedHeader());
113192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
114192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            InputStream is = op.openInputStream();
115192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            readResponse(is);
116192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            is.close();
117192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
118192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            op.close();
119192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
120192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            mResponseCode = op.getResponseCode();
121192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        } catch (IOException e) {
122192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            mResponseCode = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
123192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
124192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            throw e;
125192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
126192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
127192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
128192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected void executePut(ClientSession session, byte[] body) throws IOException {
129192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        Operation op = null;
130192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
131192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mHeaderSet.setHeader(HeaderSet.LENGTH, Long.valueOf(body.length));
132192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
133192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        try {
134192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            op = session.put(mHeaderSet);
135192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
136192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            DataOutputStream out = op.openDataOutputStream();
137192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            out.write(body);
138192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            out.close();
139192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
140192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            readResponseHeaders(op.getReceivedHeader());
141192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
142192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            op.close();
143192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            mResponseCode = op.getResponseCode();
144192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        } catch (IOException e) {
145192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            mResponseCode = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
146192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
147192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            throw e;
148192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
149192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
150192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
151192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    final public boolean isSuccess() {
152192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        return (mResponseCode == ResponseCodes.OBEX_HTTP_OK);
153192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
154192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
155192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected void readResponse(InputStream stream) throws IOException {
156192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        /* nothing here by default */
157192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
158192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
159192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    protected void readResponseHeaders(HeaderSet headerset) {
160192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        /* nothing here by default */
161192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
162192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta}
163