116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood/* 216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Copyright (C) 2010 The Android Open Source Project 316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * 416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * you may not use this file except in compliance with the License. 616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * You may obtain a copy of the License at 716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * 816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * 1016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Unless required by applicable law or agreed to in writing, software 1116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 1216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * See the License for the specific language governing permissions and 1416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * limitations under the License. 1516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood */ 1616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 1716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#ifndef _MTP_SERVER_H 1816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#define _MTP_SERVER_H 1916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 2016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "MtpRequestPacket.h" 2116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "MtpDataPacket.h" 2216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "MtpResponsePacket.h" 23873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include "MtpEventPacket.h" 2416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "mtp.h" 2516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "MtpUtils.h" 2616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 27a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood#include <utils/threads.h> 28a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood 297850ef999740f214a1990a9c090d3f3865d435aaMike Lockwoodnamespace android { 307850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood 311865a5ddcfe7b0e8dc211419aea1094b1491a5fdMike Lockwoodclass MtpDatabase; 321865a5ddcfe7b0e8dc211419aea1094b1491a5fdMike Lockwoodclass MtpStorage; 3316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 3416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodclass MtpServer { 3516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 3616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodprivate: 3716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood // file descriptor for MTP kernel driver 3816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood int mFD; 3916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 401865a5ddcfe7b0e8dc211419aea1094b1491a5fdMike Lockwood MtpDatabase* mDatabase; 4116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 423d1d7767afc7c488197ec40a22739159c5110721Mike Lockwood // appear as a PTP device 433d1d7767afc7c488197ec40a22739159c5110721Mike Lockwood bool mPtp; 443d1d7767afc7c488197ec40a22739159c5110721Mike Lockwood 458e2a280ab7f98bf00ff2651f1f93c8f8bd46c08dMike Lockwood // group to own new files and folders 468e2a280ab7f98bf00ff2651f1f93c8f8bd46c08dMike Lockwood int mFileGroup; 478e2a280ab7f98bf00ff2651f1f93c8f8bd46c08dMike Lockwood // permissions for new files and directories 488e2a280ab7f98bf00ff2651f1f93c8f8bd46c08dMike Lockwood int mFilePermission; 498e2a280ab7f98bf00ff2651f1f93c8f8bd46c08dMike Lockwood int mDirectoryPermission; 508e2a280ab7f98bf00ff2651f1f93c8f8bd46c08dMike Lockwood 5116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood // current session ID 5216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpSessionID mSessionID; 5316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood // true if we have an open session and mSessionID is valid 5416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood bool mSessionOpen; 5516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 5616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpRequestPacket mRequest; 5716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpDataPacket mData; 5816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponsePacket mResponse; 59873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood MtpEventPacket mEvent; 6016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 6116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpStorageList mStorages; 6216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 6316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood // handle for new object, set by SendObjectInfo and used by SendObject 6416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpObjectHandle mSendObjectHandle; 654714b0766ecf48f09f39b4781a5c4deafc092d49Mike Lockwood MtpObjectFormat mSendObjectFormat; 6616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpString mSendObjectFilePath; 6716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood size_t mSendObjectFileSize; 6816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 69a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood Mutex mMutex; 70a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood 717d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood // represents an MTP object that is being edited using the android extensions 727d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood // for direct editing (BeginEditObject, SendPartialObject, TruncateObject and EndEditObject) 73c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood class ObjectEdit { 74c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood public: 75c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood MtpObjectHandle mHandle; 76c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood MtpString mPath; 77c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood uint64_t mSize; 78c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood MtpObjectFormat mFormat; 79c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood int mFD; 80c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood 81c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood ObjectEdit(MtpObjectHandle handle, const char* path, uint64_t size, 82c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood MtpObjectFormat format, int fd) 83c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood : mHandle(handle), mPath(path), mSize(size), mFormat(format), mFD(fd) { 84c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood } 85c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood 86c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood virtual ~ObjectEdit() { 87c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood close(mFD); 88c3f16e5620c090aeb75c0836572a8b913a4ef864Mike Lockwood } 897d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood }; 907d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood Vector<ObjectEdit*> mObjectEditList; 917d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood 9216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodpublic: 933d1d7767afc7c488197ec40a22739159c5110721Mike Lockwood MtpServer(int fd, MtpDatabase* database, bool ptp, 948e2a280ab7f98bf00ff2651f1f93c8f8bd46c08dMike Lockwood int fileGroup, int filePerm, int directoryPerm); 9516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood virtual ~MtpServer(); 9616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 9730adaaf9d6fd944c8f6a2c7a06774b019878c368Mike Lockwood MtpStorage* getStorage(MtpStorageID id); 9830adaaf9d6fd944c8f6a2c7a06774b019878c368Mike Lockwood inline bool hasStorage() { return mStorages.size() > 0; } 9930adaaf9d6fd944c8f6a2c7a06774b019878c368Mike Lockwood bool hasStorage(MtpStorageID id); 100a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood void addStorage(MtpStorage* storage); 101a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood void removeStorage(MtpStorage* storage); 102a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood 10316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void run(); 10416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 105873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood void sendObjectAdded(MtpObjectHandle handle); 106873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood void sendObjectRemoved(MtpObjectHandle handle); 107873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 10816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodprivate: 109a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood void sendStoreAdded(MtpStorageID id); 110a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood void sendStoreRemoved(MtpStorageID id); 111a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood void sendEvent(MtpEventCode code, uint32_t param1); 112a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood 1137d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood void addEditObject(MtpObjectHandle handle, MtpString& path, 1147d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood uint64_t size, MtpObjectFormat format, int fd); 1157d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood ObjectEdit* getEditObject(MtpObjectHandle handle); 1167d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood void removeEditObject(MtpObjectHandle handle); 1177d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood void commitEdit(ObjectEdit* edit); 1187d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood 119916076c6d84dac9b104fbdf94af5dcd7bce669fdMike Lockwood bool handleRequest(); 12016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 12116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doGetDeviceInfo(); 12216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doOpenSession(); 12316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doCloseSession(); 12416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doGetStorageIDs(); 12516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doGetStorageInfo(); 12616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doGetObjectPropsSupported(); 12716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doGetObjectHandles(); 128343af4ef512869695456a91519e73ed3c3d82101Mike Lockwood MtpResponseCode doGetNumObjects(); 129438344fba74ddd6b931ac733fa48643f27b63de3Mike Lockwood MtpResponseCode doGetObjectReferences(); 130438344fba74ddd6b931ac733fa48643f27b63de3Mike Lockwood MtpResponseCode doSetObjectReferences(); 13116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doGetObjectPropValue(); 1328277cec96ffa55082962591bca1c55abbeec8c26Mike Lockwood MtpResponseCode doSetObjectPropValue(); 1338277cec96ffa55082962591bca1c55abbeec8c26Mike Lockwood MtpResponseCode doGetDevicePropValue(); 1348277cec96ffa55082962591bca1c55abbeec8c26Mike Lockwood MtpResponseCode doSetDevicePropValue(); 1358277cec96ffa55082962591bca1c55abbeec8c26Mike Lockwood MtpResponseCode doResetDevicePropValue(); 136b6da06e9dfb916da4b88e09e8a83e22ddae445b5Mike Lockwood MtpResponseCode doGetObjectPropList(); 13716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doGetObjectInfo(); 13816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doGetObject(); 13964000788211f4c7e78c80a4a155390d1316e1176Mike Lockwood MtpResponseCode doGetThumb(); 1407d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood MtpResponseCode doGetPartialObject(MtpOperationCode operation); 14116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doSendObjectInfo(); 14216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doSendObject(); 14316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doDeleteObject(); 14416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpResponseCode doGetObjectPropDesc(); 1458277cec96ffa55082962591bca1c55abbeec8c26Mike Lockwood MtpResponseCode doGetDevicePropDesc(); 1467d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood MtpResponseCode doSendPartialObject(); 1477d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood MtpResponseCode doTruncateObject(); 1487d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood MtpResponseCode doBeginEditObject(); 1497d77dcfadd7fb637ed2c3aef5bb3990dd0a67dc0Mike Lockwood MtpResponseCode doEndEditObject(); 15016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}; 15116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 1527850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood}; // namespace android 1537850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood 15416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#endif // _MTP_SERVER_H 155