1487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang/*
2487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * Copyright (C) 2016 The Android Open Source Project
3487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang *
4487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * Licensed under the Apache License, Version 2.0 (the "License");
5487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * you may not use this file except in compliance with the License.
6487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * You may obtain a copy of the License at
7487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang *
8487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang *      http://www.apache.org/licenses/LICENSE-2.0
9487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang *
10487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * Unless required by applicable law or agreed to in writing, software
11487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * distributed under the License is distributed on an "AS IS" BASIS,
12487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * See the License for the specific language governing permissions and
14487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * limitations under the License.
15487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang */
16487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
17487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#ifndef _MTP_FFS_HANDLE_H
18487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#define _MTP_FFS_HANDLE_H
19487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
20487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <android-base/unique_fd.h>
21487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <IMtpHandle.h>
22487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
23487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangnamespace android {
24487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
25487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangclass MtpFfsHandleTest;
26487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
27487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangclass MtpFfsHandle : public IMtpHandle {
28487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    friend class android::MtpFfsHandleTest;
29487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangprivate:
30487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int writeHandle(int fd, const void *data, int len);
31487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int readHandle(int fd, void *data, int len);
32487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int spliceReadHandle(int fd, int fd_out, int len);
33487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    bool initFunctionfs();
34487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    void closeConfig();
35487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    void closeEndpoints();
36487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
37487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    bool mPtp;
38487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
390475d911fcc1e6e1b4f49626f59a0a07038590faJerry Zhang    std::timed_mutex mLock;
40487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
41487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    android::base::unique_fd mControl;
42487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    // "in" from the host's perspective => sink for mtp server
43487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    android::base::unique_fd mBulkIn;
44487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    // "out" from the host's perspective => source for mtp server
45487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    android::base::unique_fd mBulkOut;
46487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    android::base::unique_fd mIntr;
47487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
48487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int mMaxWrite;
49487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int mMaxRead;
50487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
51cc9d0fdd302cf997607055e0a8b5559509cba766Jerry Zhang    std::vector<char> mBuffer1;
52cc9d0fdd302cf997607055e0a8b5559509cba766Jerry Zhang    std::vector<char> mBuffer2;
53cc9d0fdd302cf997607055e0a8b5559509cba766Jerry Zhang
54487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangpublic:
55487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int read(void *data, int len);
56487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int write(const void *data, int len);
57487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
585410756e75fb7567540f13d3813f42f4ac3838a0Jerry Zhang    int receiveFile(mtp_file_range mfr, bool zero_packet);
59487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int sendFile(mtp_file_range mfr);
60487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int sendEvent(mtp_event me);
61487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
62b4f54266042f0553b41409a3d1f0542b684c2129Jerry Zhang    /**
63b4f54266042f0553b41409a3d1f0542b684c2129Jerry Zhang     * Open ffs endpoints and allocate necessary kernel and user memory.
64b4f54266042f0553b41409a3d1f0542b684c2129Jerry Zhang     * Will sleep until endpoints are enabled, for up to 1 second.
65b4f54266042f0553b41409a3d1f0542b684c2129Jerry Zhang     */
66487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int start();
67487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    void close();
68487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
69487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    int configure(bool ptp);
70487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
71487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    MtpFfsHandle();
72487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    ~MtpFfsHandle();
73487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang};
74487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
75487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangstruct mtp_data_header {
76487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    /* length of packet, including this header */
77487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    __le32 length;
78487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    /* container type (2 for data packet) */
79487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    __le16 type;
80487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    /* MTP command code */
81487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    __le16 command;
82487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    /* MTP transaction ID */
83487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    __le32 transaction_id;
84487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang};
85487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
86487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang} // namespace android
87487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
88487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#endif // _MTP_FF_HANDLE_H
89487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
90