1873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood/*
2873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * Copyright (C) 2010 The Android Open Source Project
3873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood *
4873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
5873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * you may not use this file except in compliance with the License.
6873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * You may obtain a copy of the License at
7873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood *
8873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
9873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood *
10873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * Unless required by applicable law or agreed to in writing, software
11873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
12873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * See the License for the specific language governing permissions and
14873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * limitations under the License.
15873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood */
16873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
17873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#define LOG_TAG "MtpEventPacket"
18873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
19873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include <stdio.h>
20873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include <sys/types.h>
21873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include <fcntl.h>
22873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include <sys/ioctl.h>
23873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
24be9a95ce176e94c54f08454dc19e500546578154Mike Lockwood#ifdef MTP_DEVICE
258065e2056073808716db32136d7acfd50eeab924Mike Lockwood#include <linux/usb/f_mtp.h>
26be9a95ce176e94c54f08454dc19e500546578154Mike Lockwood#endif
27873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
28873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include "MtpEventPacket.h"
29873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
3042d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood#include <usbhost/usbhost.h>
3142d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood
32873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwoodnamespace android {
33873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
34873871f3e75831bcda6c3f75bb4d53355ca5c53aMike LockwoodMtpEventPacket::MtpEventPacket()
35873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    :   MtpPacket(512)
36873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood{
37873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood}
38873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
39873871f3e75831bcda6c3f75bb4d53355ca5c53aMike LockwoodMtpEventPacket::~MtpEventPacket() {
40873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood}
41873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
42873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#ifdef MTP_DEVICE
43873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwoodint MtpEventPacket::write(int fd) {
44873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    struct mtp_event    event;
45873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
46873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
47873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_EVENT);
48873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
49873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    event.data = mBuffer;
50873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    event.length = mPacketSize;
51873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    int ret = ::ioctl(fd, MTP_SEND_EVENT, (unsigned long)&event);
52873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    return (ret < 0 ? ret : 0);
53873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood}
54873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#endif
55873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
56873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#ifdef MTP_HOST
5742d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwoodint MtpEventPacket::read(struct usb_request *request) {
5842d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood    request->buffer = mBuffer;
5942d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood    request->buffer_length = mBufferSize;
6042d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood    int ret = transfer(request);
61873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood     if (ret >= 0)
62873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood        mPacketSize = ret;
63873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    else
64873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood        mPacketSize = 0;
65873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood    return ret;
66873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood}
67873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#endif
68873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
69873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood}  // namespace android
70873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood
71