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
33namespace android {
34
35class MtpDatabase;
36class MtpStorage;
37
38class MtpServer {
39
40private:
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
82    Mutex               mMutex;
83
84    // represents an MTP object that is being edited using the android extensions
85    // for direct editing (BeginEditObject, SendPartialObject, TruncateObject and EndEditObject)
86    class ObjectEdit {
87        public:
88        MtpObjectHandle     mHandle;
89        MtpString           mPath;
90        uint64_t            mSize;
91        MtpObjectFormat     mFormat;
92        int                 mFD;
93
94        ObjectEdit(MtpObjectHandle handle, const char* path, uint64_t size,
95            MtpObjectFormat format, int fd)
96                : mHandle(handle), mPath(path), mSize(size), mFormat(format), mFD(fd) {
97            }
98
99        virtual ~ObjectEdit() {
100            close(mFD);
101        }
102    };
103    Vector<ObjectEdit*>  mObjectEditList;
104
105public:
106                        MtpServer(MtpDatabase* database, bool ptp,
107                                    int fileGroup, int filePerm, int directoryPerm,
108                                    const MtpString& deviceInfoManufacturer,
109                                    const MtpString& deviceInfoModel,
110                                    const MtpString& deviceInfoDeviceVersion,
111                                    const MtpString& deviceInfoSerialNumber);
112    virtual             ~MtpServer();
113
114    MtpStorage*         getStorage(MtpStorageID id);
115    inline bool         hasStorage() { return mStorages.size() > 0; }
116    bool                hasStorage(MtpStorageID id);
117    void                addStorage(MtpStorage* storage);
118    void                removeStorage(MtpStorage* storage);
119
120    static int          configure(bool usePtp);
121    void                run();
122
123    void                sendObjectAdded(MtpObjectHandle handle);
124    void                sendObjectRemoved(MtpObjectHandle handle);
125    void                sendDevicePropertyChanged(MtpDeviceProperty property);
126
127private:
128    void                sendStoreAdded(MtpStorageID id);
129    void                sendStoreRemoved(MtpStorageID id);
130    void                sendEvent(MtpEventCode code, uint32_t param1);
131
132    void                addEditObject(MtpObjectHandle handle, MtpString& path,
133                                uint64_t size, MtpObjectFormat format, int fd);
134    ObjectEdit*         getEditObject(MtpObjectHandle handle);
135    void                removeEditObject(MtpObjectHandle handle);
136    void                commitEdit(ObjectEdit* edit);
137
138    bool                handleRequest();
139
140    MtpResponseCode     doGetDeviceInfo();
141    MtpResponseCode     doOpenSession();
142    MtpResponseCode     doCloseSession();
143    MtpResponseCode     doGetStorageIDs();
144    MtpResponseCode     doGetStorageInfo();
145    MtpResponseCode     doGetObjectPropsSupported();
146    MtpResponseCode     doGetObjectHandles();
147    MtpResponseCode     doGetNumObjects();
148    MtpResponseCode     doGetObjectReferences();
149    MtpResponseCode     doSetObjectReferences();
150    MtpResponseCode     doGetObjectPropValue();
151    MtpResponseCode     doSetObjectPropValue();
152    MtpResponseCode     doGetDevicePropValue();
153    MtpResponseCode     doSetDevicePropValue();
154    MtpResponseCode     doResetDevicePropValue();
155    MtpResponseCode     doGetObjectPropList();
156    MtpResponseCode     doGetObjectInfo();
157    MtpResponseCode     doGetObject();
158    MtpResponseCode     doGetThumb();
159    MtpResponseCode     doGetPartialObject(MtpOperationCode operation);
160    MtpResponseCode     doSendObjectInfo();
161    MtpResponseCode     doSendObject();
162    MtpResponseCode     doDeleteObject();
163    MtpResponseCode     doGetObjectPropDesc();
164    MtpResponseCode     doGetDevicePropDesc();
165    MtpResponseCode     doSendPartialObject();
166    MtpResponseCode     doTruncateObject();
167    MtpResponseCode     doBeginEditObject();
168    MtpResponseCode     doEndEditObject();
169};
170
171}; // namespace android
172
173#endif // _MTP_SERVER_H
174