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