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
17df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <android-base/logging.h>
18487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <cutils/properties.h>
19487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <dirent.h>
20487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <errno.h>
21df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <fcntl.h>
22487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <linux/usb/ch9.h>
23487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <stdio.h>
24487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <stdlib.h>
25487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <string.h>
26df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <sys/stat.h>
27487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <sys/ioctl.h>
28487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <sys/types.h>
29487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <sys/endian.h>
30487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <unistd.h>
31487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
32df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include "MtpDevHandle.h"
33487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
34df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangnamespace android {
35487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
36df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangconstexpr char mtp_dev_path[] = "/dev/mtp_usb";
37487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
38487be61fb0a38873aec1d12da92437fba5e728f2Jerry ZhangMtpDevHandle::MtpDevHandle()
39487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    : mFd(-1) {};
40487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
41487be61fb0a38873aec1d12da92437fba5e728f2Jerry ZhangMtpDevHandle::~MtpDevHandle() {}
42487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
43df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangint MtpDevHandle::read(void *data, size_t len) {
44487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    return ::read(mFd, data, len);
45487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}
46487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
47df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangint MtpDevHandle::write(const void *data, size_t len) {
48487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    return ::write(mFd, data, len);
49487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}
50487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
515410756e75fb7567540f13d3813f42f4ac3838a0Jerry Zhangint MtpDevHandle::receiveFile(mtp_file_range mfr, bool) {
52487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    return ioctl(mFd, MTP_RECEIVE_FILE, reinterpret_cast<unsigned long>(&mfr));
53487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}
54487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
55487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangint MtpDevHandle::sendFile(mtp_file_range mfr) {
56487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    return ioctl(mFd, MTP_SEND_FILE_WITH_HEADER, reinterpret_cast<unsigned long>(&mfr));
57487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}
58487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
59487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangint MtpDevHandle::sendEvent(mtp_event me) {
60487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    return ioctl(mFd, MTP_SEND_EVENT, reinterpret_cast<unsigned long>(&me));
61487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}
62487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
6363dac45aa868b9048c028967e9865c90a9ba544dJerry Zhangint MtpDevHandle::start(bool /* ptp */) {
64df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    mFd.reset(TEMP_FAILURE_RETRY(open(mtp_dev_path, O_RDWR)));
65487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    if (mFd == -1) return -1;
66487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    return 0;
67487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}
68487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
69487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangvoid MtpDevHandle::close() {
70487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang    mFd.reset();
71487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}
72487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang
73df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang} // namespace android
74