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