/* * 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 android.bluetooth.client.map.BluetoothMasClient.MessagesFilter; import android.bluetooth.client.map.utils.ObexAppParameters; import android.bluetooth.client.map.utils.ObexTime; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import javax.obex.ClientSession; import javax.obex.HeaderSet; final class BluetoothMasRequestGetMessagesListing extends BluetoothMasRequest { private static final String TYPE = "x-bt/MAP-msg-listing"; private BluetoothMapMessagesListing mResponse = null; private boolean mNewMessage = false; private Date mServerTime = null; public BluetoothMasRequestGetMessagesListing(String folderName, int parameters, BluetoothMasClient.MessagesFilter filter, int subjectLength, int maxListCount, int listStartOffset) { if (subjectLength < 0 || subjectLength > 255) { throw new IllegalArgumentException("subjectLength should be [0..255]"); } if (maxListCount < 0 || maxListCount > 65535) { throw new IllegalArgumentException("maxListCount should be [0..65535]"); } if (listStartOffset < 0 || listStartOffset > 65535) { throw new IllegalArgumentException("listStartOffset should be [0..65535]"); } mHeaderSet.setHeader(HeaderSet.TYPE, TYPE); if (folderName == null) { mHeaderSet.setHeader(HeaderSet.NAME, ""); } else { mHeaderSet.setHeader(HeaderSet.NAME, folderName); } ObexAppParameters oap = new ObexAppParameters(); if (filter != null) { if (filter.messageType != MessagesFilter.MESSAGE_TYPE_ALL) { oap.add(OAP_TAGID_FILTER_MESSAGE_TYPE, filter.messageType); } if (filter.periodBegin != null) { oap.add(OAP_TAGID_FILTER_PERIOD_BEGIN, filter.periodBegin); } if (filter.periodEnd != null) { oap.add(OAP_TAGID_FILTER_PERIOD_END, filter.periodEnd); } if (filter.readStatus != MessagesFilter.READ_STATUS_ANY) { oap.add(OAP_TAGID_FILTER_READ_STATUS, filter.readStatus); } if (filter.recipient != null) { oap.add(OAP_TAGID_FILTER_RECIPIENT, filter.recipient); } if (filter.originator != null) { oap.add(OAP_TAGID_FILTER_ORIGINATOR, filter.originator); } if (filter.priority != MessagesFilter.PRIORITY_ANY) { oap.add(OAP_TAGID_FILTER_PRIORITY, filter.priority); } } if (subjectLength != 0) { oap.add(OAP_TAGID_SUBJECT_LENGTH, (byte) subjectLength); } /* Include parameterMask only when specific values are selected, * to avoid IOT specific issue with no paramterMask header support. */ if (parameters > 0 ) { oap.add(OAP_TAGID_PARAMETER_MASK, parameters); } // Allow GetMessageListing for maxlistcount value 0 also. if (maxListCount >= 0) { oap.add(OAP_TAGID_MAX_LIST_COUNT, (short) maxListCount); } if (listStartOffset != 0) { oap.add(OAP_TAGID_START_OFFSET, (short) listStartOffset); } oap.addToHeaderSet(mHeaderSet); } @Override protected void readResponse(InputStream stream) { mResponse = new BluetoothMapMessagesListing(stream); } @Override protected void readResponseHeaders(HeaderSet headerset) { ObexAppParameters oap = ObexAppParameters.fromHeaderSet(headerset); mNewMessage = ((oap.getByte(OAP_TAGID_NEW_MESSAGE) & 0x01) == 1); if (oap.exists(OAP_TAGID_MSE_TIME)) { String mseTime = oap.getString(OAP_TAGID_MSE_TIME); if(mseTime != null ) mServerTime = (new ObexTime(mseTime)).getTime(); } } public ArrayList<BluetoothMapMessage> getList() { if (mResponse == null) { return null; } return mResponse.getList(); } public boolean getNewMessageStatus() { return mNewMessage; } public Date getMseTime() { return mServerTime; } @Override public void execute(ClientSession session) throws IOException { executeGet(session); } }