/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _MTP_CLIENT_H
#define _MTP_CLIENT_H

#include "MtpRequestPacket.h"
#include "MtpDataPacket.h"
#include "MtpResponsePacket.h"
#include "mtp.h"

#include "MtpUtils.h"

namespace android {

class MtpClient {
private:
    struct usb_endpoint *mEndpointIn;
    struct usb_endpoint *mEndpointOut;
    struct usb_endpoint *mEndpointIntr;

    // current session ID
    MtpSessionID        mSessionID;
    // current transaction ID
    MtpTransactionID    mTransactionID;

    MtpRequestPacket    mRequest;
    MtpDataPacket       mData;
    MtpResponsePacket   mResponse;

public:
                        MtpClient(struct usb_endpoint *ep_in, struct usb_endpoint *ep_out,
                                    struct usb_endpoint *ep_intr);
    virtual             ~MtpClient();

    bool                openSession();
    bool                getDeviceInfo();
    bool                closeSession();

private:
    bool                sendRequest(MtpOperationCode operation);
    bool                sendData(MtpOperationCode operation);
    bool                readData();
    MtpResponseCode     readResponse();

};

}; // namespace android

#endif // _MTP_CLIENT_H
