1b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo/*
2b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * Copyright (C) 2014 The Android Open Source Project
3b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo *
4b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * Licensed under the Apache License, Version 2.0 (the "License");
5b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * you may not use this file except in compliance with the License.
6b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * You may obtain a copy of the License at
7b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo *
8b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo *      http://www.apache.org/licenses/LICENSE-2.0
9b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo *
10b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * Unless required by applicable law or agreed to in writing, software
11b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * distributed under the License is distributed on an "AS IS" BASIS,
12b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * See the License for the specific language governing permissions and
14b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * limitations under the License.
15b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo */
16b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
17b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzopackage com.android.bluetooth.mapclient;
18b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
19b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.io.IOException;
20b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.io.InputStream;
21b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.util.ArrayList;
22b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.util.Date;
23b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
24b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport javax.obex.ClientSession;
25b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport javax.obex.HeaderSet;
26b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
27b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo/* Get a listing of messages in directory. */
28b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzofinal class RequestGetMessagesListing extends Request {
29b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
30b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    private static final String TYPE = "x-bt/MAP-msg-listing";
31b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
32b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    private MessagesListing mResponse = null;
33b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
34b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    private boolean mNewMessage = false;
35b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
36b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    private Date mServerTime = null;
37b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
38b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    public RequestGetMessagesListing(String folderName, int parameters,
39b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            MessagesFilter filter, int subjectLength, int maxListCount,
40b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            int listStartOffset) {
41b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (subjectLength < 0 || subjectLength > 255) {
42b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            throw new IllegalArgumentException("subjectLength should be [0..255]");
43b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
44b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
45b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (maxListCount < 0 || maxListCount > 65535) {
46b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            throw new IllegalArgumentException("maxListCount should be [0..65535]");
47b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
48b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
49b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (listStartOffset < 0 || listStartOffset > 65535) {
50b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            throw new IllegalArgumentException("listStartOffset should be [0..65535]");
51b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
52b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
53b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        mHeaderSet.setHeader(HeaderSet.TYPE, TYPE);
54b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
55b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (folderName == null) {
56b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            mHeaderSet.setHeader(HeaderSet.NAME, "");
57b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        } else {
58b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            mHeaderSet.setHeader(HeaderSet.NAME, folderName);
59b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
60b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
61b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        ObexAppParameters oap = new ObexAppParameters();
62b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
63b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (filter != null) {
64b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            if (filter.messageType != MessagesFilter.MESSAGE_TYPE_ALL) {
65b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo                oap.add(OAP_TAGID_FILTER_MESSAGE_TYPE, filter.messageType);
66b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            }
67b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
68b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            if (filter.periodBegin != null) {
69b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo                oap.add(OAP_TAGID_FILTER_PERIOD_BEGIN, filter.periodBegin);
70b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            }
71b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
72b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            if (filter.periodEnd != null) {
73b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo                oap.add(OAP_TAGID_FILTER_PERIOD_END, filter.periodEnd);
74b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            }
75b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
76b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            if (filter.readStatus != MessagesFilter.READ_STATUS_ANY) {
77b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo                oap.add(OAP_TAGID_FILTER_READ_STATUS, filter.readStatus);
78b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            }
79b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
80b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            if (filter.recipient != null) {
81b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo                oap.add(OAP_TAGID_FILTER_RECIPIENT, filter.recipient);
82b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            }
83b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
84b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            if (filter.originator != null) {
85b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo                oap.add(OAP_TAGID_FILTER_ORIGINATOR, filter.originator);
86b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            }
87b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
88b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            if (filter.priority != MessagesFilter.PRIORITY_ANY) {
89b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo                oap.add(OAP_TAGID_FILTER_PRIORITY, filter.priority);
90b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            }
91b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
92b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
93b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (subjectLength != 0) {
94b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            oap.add(OAP_TAGID_SUBJECT_LENGTH, (byte) subjectLength);
95b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
96b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        /* Include parameterMask only when specific values are selected,
97b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo         * to avoid IOT specific issue with no paramterMask header support.
98b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo         */
99b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (parameters > 0) {
100b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            oap.add(OAP_TAGID_PARAMETER_MASK, parameters);
101b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
102b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        // Allow GetMessageListing for maxlistcount value 0 also.
103b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (maxListCount >= 0) {
104b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            oap.add(OAP_TAGID_MAX_LIST_COUNT, (short) maxListCount);
105b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
106b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
107b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (listStartOffset != 0) {
108b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            oap.add(OAP_TAGID_START_OFFSET, (short) listStartOffset);
109b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
110b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
111b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        oap.addToHeaderSet(mHeaderSet);
112b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    }
113b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
114b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    @Override
115b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    protected void readResponse(InputStream stream) {
116b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        mResponse = new MessagesListing(stream);
117b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    }
118b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
119b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    @Override
120b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    protected void readResponseHeaders(HeaderSet headerset) {
121b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        ObexAppParameters oap = ObexAppParameters.fromHeaderSet(headerset);
122b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
123b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        mNewMessage = ((oap.getByte(OAP_TAGID_NEW_MESSAGE) & 0x01) == 1);
124b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
125b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (oap.exists(OAP_TAGID_MSE_TIME)) {
126b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            String mseTime = oap.getString(OAP_TAGID_MSE_TIME);
127b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            if (mseTime != null) {
128b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo                mServerTime = (new ObexTime(mseTime)).getTime();
129b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            }
130b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
131b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    }
132b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
133b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    public ArrayList<Message> getList() {
134b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        if (mResponse == null) {
135b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo            return null;
136b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        }
137b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
138b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        return mResponse.getList();
139b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    }
140b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
141b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    public boolean getNewMessageStatus() {
142b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        return mNewMessage;
143b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    }
144b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
145b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    public Date getMseTime() {
146b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        return mServerTime;
147b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    }
148b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo
149b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    @Override
150b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    public void execute(ClientSession session) throws IOException {
151b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo        executeGet(session);
152b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo    }
153b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo}
154