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