120754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono/*
220754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono * Copyright (C) 2015 The Android Open Source Project
320754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono *
420754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono * Licensed under the Apache License, Version 2.0 (the "License");
520754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono * you may not use this file except in compliance with the License.
620754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono * You may obtain a copy of the License at
720754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono *
820754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono *      http://www.apache.org/licenses/LICENSE-2.0
920754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono *
1020754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono * Unless required by applicable law or agreed to in writing, software
1120754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono * distributed under the License is distributed on an "AS IS" BASIS,
1220754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono * See the License for the specific language governing permissions and
1420754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono * limitations under the License.
1520754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono */
1620754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono
1720754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hironopackage com.android.mtp;
1820754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono
19148954a657941ea95ef17da5b3ce40b9145f8755Daichi Hironoimport android.annotation.Nullable;
200f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hironoimport android.mtp.MtpConstants;
21148954a657941ea95ef17da5b3ce40b9145f8755Daichi Hirono
2220754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hironoclass MtpDeviceRecord {
2320754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono    public final int deviceId;
2420754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono    public final String name;
25ebd24051599280443435606cab220de33b9356adDaichi Hirono    public final @Nullable String deviceKey;
2620754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono    public final boolean opened;
2720754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono    public final MtpRoot[] roots;
28148954a657941ea95ef17da5b3ce40b9145f8755Daichi Hirono    public final @Nullable int[] operationsSupported;
29148954a657941ea95ef17da5b3ce40b9145f8755Daichi Hirono    public final @Nullable int[] eventsSupported;
3020754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono
31ebd24051599280443435606cab220de33b9356adDaichi Hirono    MtpDeviceRecord(int deviceId, String name, @Nullable String deviceKey, boolean opened,
32ebd24051599280443435606cab220de33b9356adDaichi Hirono                    MtpRoot[] roots, @Nullable int[] operationsSupported,
33ebd24051599280443435606cab220de33b9356adDaichi Hirono                    @Nullable int[] eventsSupported) {
3420754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono        this.deviceId = deviceId;
3520754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono        this.name = name;
3620754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono        this.opened = opened;
3720754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono        this.roots = roots;
38ebd24051599280443435606cab220de33b9356adDaichi Hirono        this.deviceKey = deviceKey;
391d4779c29a95114c89ec353a8899c0cc8eee3ba5Daichi Hirono        this.operationsSupported = operationsSupported;
40148954a657941ea95ef17da5b3ce40b9145f8755Daichi Hirono        this.eventsSupported = eventsSupported;
4120754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono    }
420f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono
430f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono    /**
440f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono     * Helper method to check operations/events are supported by the device or not.
450f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono     */
460f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono    static boolean isSupported(@Nullable int[] supportedList, int code) {
470f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono        if (supportedList == null) {
480f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono            return false;
490f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono        }
500f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono        for (int i = 0; i < supportedList.length; i++) {
510f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono            if (supportedList[i] == code) {
520f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono                return true;
530f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono            }
540f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono        }
550f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono        return false;
560f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono    }
570f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono
580f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono    static boolean isPartialReadSupported(@Nullable int[] supportedList, long fileSize) {
5977a1c65610618891ba28d7a10e4f107ea27e392eDaichi Hirono        if (isSupported(supportedList, MtpConstants.OPERATION_GET_PARTIAL_OBJECT_64)) {
6077a1c65610618891ba28d7a10e4f107ea27e392eDaichi Hirono            return true;
6177a1c65610618891ba28d7a10e4f107ea27e392eDaichi Hirono        }
6277a1c65610618891ba28d7a10e4f107ea27e392eDaichi Hirono        if (0 <= fileSize &&
6377a1c65610618891ba28d7a10e4f107ea27e392eDaichi Hirono                fileSize <= 0xffffffffL &&
6477a1c65610618891ba28d7a10e4f107ea27e392eDaichi Hirono                isSupported(supportedList, MtpConstants.OPERATION_GET_PARTIAL_OBJECT)) {
6577a1c65610618891ba28d7a10e4f107ea27e392eDaichi Hirono            return true;
6677a1c65610618891ba28d7a10e4f107ea27e392eDaichi Hirono        }
6777a1c65610618891ba28d7a10e4f107ea27e392eDaichi Hirono        return false;
680f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono    }
690f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono
700f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono    static boolean isWritingSupported(@Nullable int[] supportedList) {
710f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono        return isSupported(supportedList, MtpConstants.OPERATION_SEND_OBJECT_INFO) &&
720f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono                isSupported(supportedList, MtpConstants.OPERATION_SEND_OBJECT);
730f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono    }
7420754c5a112e418c11cc88176283db2c4bf2efd6Daichi Hirono}
75