1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef _MTP_SERVER_H 18#define _MTP_SERVER_H 19 20#include "MtpRequestPacket.h" 21#include "MtpDataPacket.h" 22#include "MtpResponsePacket.h" 23#include "MtpEventPacket.h" 24#include "MtpStringBuffer.h" 25#include "mtp.h" 26#include "MtpUtils.h" 27#include "IMtpHandle.h" 28 29#include <memory> 30#include <mutex> 31#include <queue> 32 33namespace android { 34 35class IMtpDatabase; 36class MtpStorage; 37 38class MtpServer { 39 40private: 41 IMtpDatabase* mDatabase; 42 43 // appear as a PTP device 44 bool mPtp; 45 46 // Manufacturer to report in DeviceInfo 47 MtpStringBuffer mDeviceInfoManufacturer; 48 // Model to report in DeviceInfo 49 MtpStringBuffer mDeviceInfoModel; 50 // Device version to report in DeviceInfo 51 MtpStringBuffer mDeviceInfoDeviceVersion; 52 // Serial number to report in DeviceInfo 53 MtpStringBuffer mDeviceInfoSerialNumber; 54 55 // current session ID 56 MtpSessionID mSessionID; 57 // true if we have an open session and mSessionID is valid 58 bool mSessionOpen; 59 60 MtpRequestPacket mRequest; 61 MtpDataPacket mData; 62 MtpResponsePacket mResponse; 63 64 MtpEventPacket mEvent; 65 66 MtpStorageList mStorages; 67 68 IMtpHandle* mHandle; 69 70 // handle for new object, set by SendObjectInfo and used by SendObject 71 MtpObjectHandle mSendObjectHandle; 72 MtpObjectFormat mSendObjectFormat; 73 MtpStringBuffer mSendObjectFilePath; 74 size_t mSendObjectFileSize; 75 time_t mSendObjectModifiedTime; 76 77 std::mutex mMutex; 78 79 // represents an MTP object that is being edited using the android extensions 80 // for direct editing (BeginEditObject, SendPartialObject, TruncateObject and EndEditObject) 81 class ObjectEdit { 82 public: 83 MtpObjectHandle mHandle; 84 MtpStringBuffer mPath; 85 uint64_t mSize; 86 MtpObjectFormat mFormat; 87 int mFD; 88 89 ObjectEdit(MtpObjectHandle handle, const char* path, uint64_t size, 90 MtpObjectFormat format, int fd) 91 : mHandle(handle), mPath(path), mSize(size), mFormat(format), mFD(fd) { 92 } 93 94 virtual ~ObjectEdit() { 95 close(mFD); 96 } 97 }; 98 std::vector<ObjectEdit*> mObjectEditList; 99 100public: 101 MtpServer(IMtpDatabase* database, int controlFd, bool ptp, 102 const char *deviceInfoManufacturer, 103 const char *deviceInfoModel, 104 const char *deviceInfoDeviceVersion, 105 const char *deviceInfoSerialNumber); 106 virtual ~MtpServer(); 107 108 MtpStorage* getStorage(MtpStorageID id); 109 inline bool hasStorage() { return mStorages.size() > 0; } 110 bool hasStorage(MtpStorageID id); 111 void addStorage(MtpStorage* storage); 112 void removeStorage(MtpStorage* storage); 113 114 void run(); 115 116 void sendObjectAdded(MtpObjectHandle handle); 117 void sendObjectRemoved(MtpObjectHandle handle); 118 void sendDevicePropertyChanged(MtpDeviceProperty property); 119 120private: 121 void sendStoreAdded(MtpStorageID id); 122 void sendStoreRemoved(MtpStorageID id); 123 void sendEvent(MtpEventCode code, uint32_t param1); 124 125 void addEditObject(MtpObjectHandle handle, MtpStringBuffer& path, 126 uint64_t size, MtpObjectFormat format, int fd); 127 ObjectEdit* getEditObject(MtpObjectHandle handle); 128 void removeEditObject(MtpObjectHandle handle); 129 void commitEdit(ObjectEdit* edit); 130 131 bool handleRequest(); 132 133 MtpResponseCode doGetDeviceInfo(); 134 MtpResponseCode doOpenSession(); 135 MtpResponseCode doCloseSession(); 136 MtpResponseCode doGetStorageIDs(); 137 MtpResponseCode doGetStorageInfo(); 138 MtpResponseCode doGetObjectPropsSupported(); 139 MtpResponseCode doGetObjectHandles(); 140 MtpResponseCode doGetNumObjects(); 141 MtpResponseCode doGetObjectReferences(); 142 MtpResponseCode doSetObjectReferences(); 143 MtpResponseCode doGetObjectPropValue(); 144 MtpResponseCode doSetObjectPropValue(); 145 MtpResponseCode doGetDevicePropValue(); 146 MtpResponseCode doSetDevicePropValue(); 147 MtpResponseCode doResetDevicePropValue(); 148 MtpResponseCode doGetObjectPropList(); 149 MtpResponseCode doGetObjectInfo(); 150 MtpResponseCode doGetObject(); 151 MtpResponseCode doGetThumb(); 152 MtpResponseCode doGetPartialObject(MtpOperationCode operation); 153 MtpResponseCode doSendObjectInfo(); 154 MtpResponseCode doSendObject(); 155 MtpResponseCode doDeleteObject(); 156 MtpResponseCode doMoveObject(); 157 MtpResponseCode doCopyObject(); 158 MtpResponseCode doGetObjectPropDesc(); 159 MtpResponseCode doGetDevicePropDesc(); 160 MtpResponseCode doSendPartialObject(); 161 MtpResponseCode doTruncateObject(); 162 MtpResponseCode doBeginEditObject(); 163 MtpResponseCode doEndEditObject(); 164}; 165 166}; // namespace android 167 168#endif // _MTP_SERVER_H 169