blob: 0c9c29c0efcd0e60d7faf5045bccc2edf0e7fc06 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.bluetooth.client.map;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.obex.ClientOperation;
import javax.obex.ClientSession;
import javax.obex.HeaderSet;
import javax.obex.Operation;
import javax.obex.ResponseCodes;
abstract class BluetoothMasRequest {
protected static final byte OAP_TAGID_MAX_LIST_COUNT = 0x01;
protected static final byte OAP_TAGID_START_OFFSET = 0x02;
protected static final byte OAP_TAGID_FILTER_MESSAGE_TYPE = 0x03;
protected static final byte OAP_TAGID_FILTER_PERIOD_BEGIN = 0x04;
protected static final byte OAP_TAGID_FILTER_PERIOD_END = 0x05;
protected static final byte OAP_TAGID_FILTER_READ_STATUS = 0x06;
protected static final byte OAP_TAGID_FILTER_RECIPIENT = 0x07;
protected static final byte OAP_TAGID_FILTER_ORIGINATOR = 0x08;
protected static final byte OAP_TAGID_FILTER_PRIORITY = 0x09;
protected static final byte OAP_TAGID_ATTACHMENT = 0x0a;
protected static final byte OAP_TAGID_TRANSPARENT = 0xb;
protected static final byte OAP_TAGID_RETRY = 0xc;
protected static final byte OAP_TAGID_NEW_MESSAGE = 0x0d;
protected static final byte OAP_TAGID_NOTIFICATION_STATUS = 0x0e;
protected static final byte OAP_TAGID_MAS_INSTANCE_ID = 0x0f;
protected static final byte OAP_TAGID_PARAMETER_MASK = 0x10;
protected static final byte OAP_TAGID_FOLDER_LISTING_SIZE = 0x11;
protected static final byte OAP_TAGID_MESSAGES_LISTING_SIZE = 0x12;
protected static final byte OAP_TAGID_SUBJECT_LENGTH = 0x13;
protected static final byte OAP_TAGID_CHARSET = 0x14;
protected static final byte OAP_TAGID_STATUS_INDICATOR = 0x17;
protected static final byte OAP_TAGID_STATUS_VALUE = 0x18;
protected static final byte OAP_TAGID_MSE_TIME = 0x19;
protected static byte NOTIFICATION_ON = 0x01;
protected static byte NOTIFICATION_OFF = 0x00;
protected static byte ATTACHMENT_ON = 0x01;
protected static byte ATTACHMENT_OFF = 0x00;
protected static byte CHARSET_NATIVE = 0x00;
protected static byte CHARSET_UTF8 = 0x01;
protected static byte STATUS_INDICATOR_READ = 0x00;
protected static byte STATUS_INDICATOR_DELETED = 0x01;
protected static byte STATUS_NO = 0x00;
protected static byte STATUS_YES = 0x01;
protected static byte TRANSPARENT_OFF = 0x00;
protected static byte TRANSPARENT_ON = 0x01;
protected static byte RETRY_OFF = 0x00;
protected static byte RETRY_ON = 0x01;
/* used for PUT requests which require filler byte */
protected static final byte[] FILLER_BYTE = {
0x30
};
protected HeaderSet mHeaderSet;
protected int mResponseCode;
public BluetoothMasRequest() {
mHeaderSet = new HeaderSet();
}
abstract public void execute(ClientSession session) throws IOException;
protected void executeGet(ClientSession session) throws IOException {
ClientOperation op = null;
try {
op = (ClientOperation) session.get(mHeaderSet);
/*
* MAP spec does not explicitly require that GET request should be
* sent in single packet but for some reason PTS complains when
* final GET packet with no headers follows non-final GET with all
* headers. So this is workaround, at least temporary. TODO: check
* with PTS
*/
op.setGetFinalFlag(true);
/*
* this will trigger ClientOperation to use non-buffered stream so
* we can abort operation
*/
op.continueOperation(true, false);
readResponseHeaders(op.getReceivedHeader());
InputStream is = op.openInputStream();
readResponse(is);
is.close();
op.close();
mResponseCode = op.getResponseCode();
} catch (IOException e) {
mResponseCode = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
throw e;
}
}
protected void executePut(ClientSession session, byte[] body) throws IOException {
Operation op = null;
mHeaderSet.setHeader(HeaderSet.LENGTH, Long.valueOf(body.length));
try {
op = session.put(mHeaderSet);
DataOutputStream out = op.openDataOutputStream();
out.write(body);
out.close();
readResponseHeaders(op.getReceivedHeader());
op.close();
mResponseCode = op.getResponseCode();
} catch (IOException e) {
mResponseCode = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
throw e;
}
}
final public boolean isSuccess() {
return (mResponseCode == ResponseCodes.OBEX_HTTP_OK);
}
protected void readResponse(InputStream stream) throws IOException {
/* nothing here by default */
}
protected void readResponseHeaders(HeaderSet headerset) {
/* nothing here by default */
}
}