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