15ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood/* 25ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * Copyright (C) 2010 The Android Open Source Project 35ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * 45ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 55ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * you may not use this file except in compliance with the License. 65ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * You may obtain a copy of the License at 75ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * 85ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 95ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * 105ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * Unless required by applicable law or agreed to in writing, software 115ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 125ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * See the License for the specific language governing permissions and 145ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * limitations under the License. 155ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood */ 165ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 175ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#ifndef _MTP_DEVICE_H 185ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#define _MTP_DEVICE_H 195ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 205ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpRequestPacket.h" 215ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpDataPacket.h" 225ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpResponsePacket.h" 235ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpTypes.h" 245ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 250cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood#include <utils/threads.h> 260cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood 27b14e588bec4d5e39e61b020b5b575f2ce555d316Mike Lockwoodstruct usb_device; 2842d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwoodstruct usb_request; 2942d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwoodstruct usb_endpoint_descriptor; 30b14e588bec4d5e39e61b020b5b575f2ce555d316Mike Lockwood 315ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodnamespace android { 325ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 335ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodclass MtpDeviceInfo; 345ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodclass MtpObjectInfo; 355ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodclass MtpStorageInfo; 365ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 375ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodclass MtpDevice { 385ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodprivate: 395ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood struct usb_device* mDevice; 405ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood int mInterface; 4142d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood struct usb_request* mRequestIn1; 4242d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood struct usb_request* mRequestIn2; 4342d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood struct usb_request* mRequestOut; 4442d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood struct usb_request* mRequestIntr; 455ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpDeviceInfo* mDeviceInfo; 46a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood MtpPropertyList mDeviceProperties; 475ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 485ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood // current session ID 495ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpSessionID mSessionID; 505ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood // current transaction ID 515ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpTransactionID mTransactionID; 525ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 535ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpRequestPacket mRequest; 545ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpDataPacket mData; 555ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpResponsePacket mResponse; 56f7454622eaac287d20ab43013d7015fe42b894f8Mike Lockwood // set to true if we received a response packet instead of a data packet 57f7454622eaac287d20ab43013d7015fe42b894f8Mike Lockwood bool mReceivedResponse; 585ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 590cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood // to ensure only one MTP transaction at a time 600cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood Mutex mMutex; 610cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood 625ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodpublic: 635ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpDevice(struct usb_device* device, int interface, 6442d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood const struct usb_endpoint_descriptor *ep_in, 6542d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood const struct usb_endpoint_descriptor *ep_out, 6642d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood const struct usb_endpoint_descriptor *ep_intr); 675ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 6823f1b33c5f88f07510ca5dc01b3afd7af6843d6cMike Lockwood static MtpDevice* open(const char* deviceName, int fd); 6923f1b33c5f88f07510ca5dc01b3afd7af6843d6cMike Lockwood 7023f1b33c5f88f07510ca5dc01b3afd7af6843d6cMike Lockwood virtual ~MtpDevice(); 715ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 725ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood void initialize(); 735ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood void close(); 740c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood void print(); 755ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood const char* getDeviceName(); 765ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 775ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood bool openSession(); 785ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood bool closeSession(); 795ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 805ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpDeviceInfo* getDeviceInfo(); 815ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpStorageIDList* getStorageIDs(); 825ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpStorageInfo* getStorageInfo(MtpStorageID storageID); 8327afe3a1cc9c07ac4884a7720087a597aea3c76fMike Lockwood MtpObjectHandleList* getObjectHandles(MtpStorageID storageID, MtpObjectFormat format, 8427afe3a1cc9c07ac4884a7720087a597aea3c76fMike Lockwood MtpObjectHandle parent); 855ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpObjectInfo* getObjectInfo(MtpObjectHandle handle); 863e072b354d1e1e3ee62d58492f0739139df8aff1Mike Lockwood void* getThumbnail(MtpObjectHandle handle, int& outLength); 870cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood MtpObjectHandle sendObjectInfo(MtpObjectInfo* info); 880cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood bool sendObject(MtpObjectInfo* info, int srcFD); 896afc41d095ccb159f6c4705bed903b6c048b922aMike Lockwood bool deleteObject(MtpObjectHandle handle); 906afc41d095ccb159f6c4705bed903b6c048b922aMike Lockwood MtpObjectHandle getParent(MtpObjectHandle handle); 916afc41d095ccb159f6c4705bed903b6c048b922aMike Lockwood MtpObjectHandle getStorageID(MtpObjectHandle handle); 925ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 9398693f674125484de8873d969c209276a6dd604bMike Lockwood MtpObjectPropertyList* getObjectPropsSupported(MtpObjectFormat format); 9498693f674125484de8873d969c209276a6dd604bMike Lockwood 95a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood MtpProperty* getDevicePropDesc(MtpDeviceProperty code); 9699e393a39a31bfbdeb435462939519e2d0279433Mike Lockwood MtpProperty* getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format); 97a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 9823f1b33c5f88f07510ca5dc01b3afd7af6843d6cMike Lockwood bool readObject(MtpObjectHandle handle, 9923f1b33c5f88f07510ca5dc01b3afd7af6843d6cMike Lockwood bool (* callback)(void* data, int offset, 10023f1b33c5f88f07510ca5dc01b3afd7af6843d6cMike Lockwood int length, void* clientData), 10123f1b33c5f88f07510ca5dc01b3afd7af6843d6cMike Lockwood int objectSize, void* clientData); 10223f1b33c5f88f07510ca5dc01b3afd7af6843d6cMike Lockwood bool readObject(MtpObjectHandle handle, const char* destPath, int group, 10327afe3a1cc9c07ac4884a7720087a597aea3c76fMike Lockwood int perm); 1040cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood 1055ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodprivate: 1065ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood bool sendRequest(MtpOperationCode operation); 1070cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood bool sendData(); 1085ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood bool readData(); 1090cf89f2e622aa53f31fa5762ca4bc805bb509ed3Mike Lockwood bool writeDataHeader(MtpOperationCode operation, int dataLength); 1105ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpResponseCode readResponse(); 1115ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1125ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood}; 1135ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1145ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood}; // namespace android 1155ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1165ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#endif // _MTP_DEVICE_H 117