MtpServer.h revision 6ff6131f4d020684aa5e75355ec70ccda5ef01c3
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 27#include <utils/threads.h> 28 29namespace android { 30 31class MtpDatabase; 32class MtpStorage; 33 34class MtpServer { 35 36private: 37 // file descriptor for MTP kernel driver 38 int mFD; 39 40 MtpDatabase* mDatabase; 41 42 // group to own new files and folders 43 int mFileGroup; 44 // permissions for new files and directories 45 int mFilePermission; 46 int mDirectoryPermission; 47 48 // current session ID 49 MtpSessionID mSessionID; 50 // true if we have an open session and mSessionID is valid 51 bool mSessionOpen; 52 53 MtpRequestPacket mRequest; 54 MtpDataPacket mData; 55 MtpResponsePacket mResponse; 56 MtpEventPacket mEvent; 57 58 MtpStorageList mStorages; 59 60 // handle for new object, set by SendObjectInfo and used by SendObject 61 MtpObjectHandle mSendObjectHandle; 62 MtpObjectFormat mSendObjectFormat; 63 MtpString mSendObjectFilePath; 64 size_t mSendObjectFileSize; 65 66 Mutex mMutex; 67 68 // represents an MTP object that is being edited using the android extensions 69 // for direct editing (BeginEditObject, SendPartialObject, TruncateObject and EndEditObject) 70 struct ObjectEdit { 71 MtpObjectHandle handle; 72 MtpString path; 73 uint64_t size; 74 MtpObjectFormat format; 75 int fd; 76 }; 77 Vector<ObjectEdit*> mObjectEditList; 78 79public: 80 MtpServer(int fd, MtpDatabase* database, 81 int fileGroup, int filePerm, int directoryPerm); 82 virtual ~MtpServer(); 83 84 MtpStorage* getStorage(MtpStorageID id); 85 inline bool hasStorage() { return mStorages.size() > 0; } 86 bool hasStorage(MtpStorageID id); 87 void addStorage(MtpStorage* storage); 88 void removeStorage(MtpStorage* storage); 89 90 void run(); 91 92 void sendObjectAdded(MtpObjectHandle handle); 93 void sendObjectRemoved(MtpObjectHandle handle); 94 95private: 96 void sendStoreAdded(MtpStorageID id); 97 void sendStoreRemoved(MtpStorageID id); 98 void sendEvent(MtpEventCode code, uint32_t param1); 99 100 void addEditObject(MtpObjectHandle handle, MtpString& path, 101 uint64_t size, MtpObjectFormat format, int fd); 102 ObjectEdit* getEditObject(MtpObjectHandle handle); 103 void removeEditObject(MtpObjectHandle handle); 104 void commitEdit(ObjectEdit* edit); 105 106 bool handleRequest(); 107 108 MtpResponseCode doGetDeviceInfo(); 109 MtpResponseCode doOpenSession(); 110 MtpResponseCode doCloseSession(); 111 MtpResponseCode doGetStorageIDs(); 112 MtpResponseCode doGetStorageInfo(); 113 MtpResponseCode doGetObjectPropsSupported(); 114 MtpResponseCode doGetObjectHandles(); 115 MtpResponseCode doGetNumObjects(); 116 MtpResponseCode doGetObjectReferences(); 117 MtpResponseCode doSetObjectReferences(); 118 MtpResponseCode doGetObjectPropValue(); 119 MtpResponseCode doSetObjectPropValue(); 120 MtpResponseCode doGetDevicePropValue(); 121 MtpResponseCode doSetDevicePropValue(); 122 MtpResponseCode doResetDevicePropValue(); 123 MtpResponseCode doGetObjectPropList(); 124 MtpResponseCode doGetObjectInfo(); 125 MtpResponseCode doGetObject(); 126 MtpResponseCode doGetPartialObject(MtpOperationCode operation); 127 MtpResponseCode doSendObjectInfo(); 128 MtpResponseCode doSendObject(); 129 MtpResponseCode doDeleteObject(); 130 MtpResponseCode doGetObjectPropDesc(); 131 MtpResponseCode doGetDevicePropDesc(); 132 MtpResponseCode doSendPartialObject(); 133 MtpResponseCode doTruncateObject(); 134 MtpResponseCode doBeginEditObject(); 135 MtpResponseCode doEndEditObject(); 136}; 137 138}; // namespace android 139 140#endif // _MTP_SERVER_H 141