xref: /aosp_15_r20/frameworks/av/media/mtp/MtpServer.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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