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