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 "mtp.h" 25 #include "MtpUtils.h" 26 #include "IMtpHandle.h" 27 28 #include <utils/threads.h> 29 #include <queue> 30 #include <memory> 31 #include <mutex> 32 33 namespace android { 34 35 class MtpDatabase; 36 class MtpStorage; 37 38 class MtpServer { 39 40 private: 41 MtpDatabase* mDatabase; 42 43 // appear as a PTP device 44 bool mPtp; 45 46 // group to own new files and folders 47 int mFileGroup; 48 // permissions for new files and directories 49 int mFilePermission; 50 int mDirectoryPermission; 51 52 // Manufacturer to report in DeviceInfo 53 MtpString mDeviceInfoManufacturer; 54 // Model to report in DeviceInfo 55 MtpString mDeviceInfoModel; 56 // Device version to report in DeviceInfo 57 MtpString mDeviceInfoDeviceVersion; 58 // Serial number to report in DeviceInfo 59 MtpString mDeviceInfoSerialNumber; 60 61 // current session ID 62 MtpSessionID mSessionID; 63 // true if we have an open session and mSessionID is valid 64 bool mSessionOpen; 65 66 MtpRequestPacket mRequest; 67 MtpDataPacket mData; 68 MtpResponsePacket mResponse; 69 70 MtpEventPacket mEvent; 71 72 MtpStorageList mStorages; 73 74 static IMtpHandle* sHandle; 75 76 // handle for new object, set by SendObjectInfo and used by SendObject 77 MtpObjectHandle mSendObjectHandle; 78 MtpObjectFormat mSendObjectFormat; 79 MtpString mSendObjectFilePath; 80 size_t mSendObjectFileSize; 81 time_t mSendObjectModifiedTime; 82 83 Mutex mMutex; 84 85 // represents an MTP object that is being edited using the android extensions 86 // for direct editing (BeginEditObject, SendPartialObject, TruncateObject and EndEditObject) 87 class ObjectEdit { 88 public: 89 MtpObjectHandle mHandle; 90 MtpString mPath; 91 uint64_t mSize; 92 MtpObjectFormat mFormat; 93 int mFD; 94 ObjectEdit(MtpObjectHandle handle,const char * path,uint64_t size,MtpObjectFormat format,int fd)95 ObjectEdit(MtpObjectHandle handle, const char* path, uint64_t size, 96 MtpObjectFormat format, int fd) 97 : mHandle(handle), mPath(path), mSize(size), mFormat(format), mFD(fd) { 98 } 99 ~ObjectEdit()100 virtual ~ObjectEdit() { 101 close(mFD); 102 } 103 }; 104 Vector<ObjectEdit*> mObjectEditList; 105 106 public: 107 MtpServer(MtpDatabase* database, bool ptp, 108 int fileGroup, int filePerm, int directoryPerm, 109 const MtpString& deviceInfoManufacturer, 110 const MtpString& deviceInfoModel, 111 const MtpString& deviceInfoDeviceVersion, 112 const MtpString& deviceInfoSerialNumber); 113 virtual ~MtpServer(); 114 115 MtpStorage* getStorage(MtpStorageID id); hasStorage()116 inline bool hasStorage() { return mStorages.size() > 0; } 117 bool hasStorage(MtpStorageID id); 118 void addStorage(MtpStorage* storage); 119 void removeStorage(MtpStorage* storage); 120 121 static int configure(bool usePtp); 122 void run(); 123 124 void sendObjectAdded(MtpObjectHandle handle); 125 void sendObjectRemoved(MtpObjectHandle handle); 126 void sendDevicePropertyChanged(MtpDeviceProperty property); 127 128 private: 129 void sendStoreAdded(MtpStorageID id); 130 void sendStoreRemoved(MtpStorageID id); 131 void sendEvent(MtpEventCode code, uint32_t param1); 132 133 void addEditObject(MtpObjectHandle handle, MtpString& path, 134 uint64_t size, MtpObjectFormat format, int fd); 135 ObjectEdit* getEditObject(MtpObjectHandle handle); 136 void removeEditObject(MtpObjectHandle handle); 137 void commitEdit(ObjectEdit* edit); 138 139 bool handleRequest(); 140 141 MtpResponseCode doGetDeviceInfo(); 142 MtpResponseCode doOpenSession(); 143 MtpResponseCode doCloseSession(); 144 MtpResponseCode doGetStorageIDs(); 145 MtpResponseCode doGetStorageInfo(); 146 MtpResponseCode doGetObjectPropsSupported(); 147 MtpResponseCode doGetObjectHandles(); 148 MtpResponseCode doGetNumObjects(); 149 MtpResponseCode doGetObjectReferences(); 150 MtpResponseCode doSetObjectReferences(); 151 MtpResponseCode doGetObjectPropValue(); 152 MtpResponseCode doSetObjectPropValue(); 153 MtpResponseCode doGetDevicePropValue(); 154 MtpResponseCode doSetDevicePropValue(); 155 MtpResponseCode doResetDevicePropValue(); 156 MtpResponseCode doGetObjectPropList(); 157 MtpResponseCode doGetObjectInfo(); 158 MtpResponseCode doGetObject(); 159 MtpResponseCode doGetThumb(); 160 MtpResponseCode doGetPartialObject(MtpOperationCode operation); 161 MtpResponseCode doSendObjectInfo(); 162 MtpResponseCode doSendObject(); 163 MtpResponseCode doDeleteObject(); 164 MtpResponseCode doGetObjectPropDesc(); 165 MtpResponseCode doGetDevicePropDesc(); 166 MtpResponseCode doSendPartialObject(); 167 MtpResponseCode doTruncateObject(); 168 MtpResponseCode doBeginEditObject(); 169 MtpResponseCode doEndEditObject(); 170 }; 171 172 }; // namespace android 173 174 #endif // _MTP_SERVER_H 175