• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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