This update splits old MTP code and new MTP code from Google into two trees, legacy and ffs. Depending on the SDK level, the build system will select the correct version. The reason for separating the versions out are due to older android trees not supporting the updated MTP code from Google. Most MTP code is from Google, with additions needed from implementing the Java functions in C++ for TWRP and FFS. We assume if you are in android-9.0 or above, your kernel has support for FFS over MTP. Verify that your init.rc is mounting the MTP FFS driver to the proper location. Change-Id: I4b107b239bd9bc5699527f9c8c77d9079f264a7e
156 lines
4.6 KiB
C++
156 lines
4.6 KiB
C++
/*
|
|
* Copyright (C) 2010 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
* Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
|
|
*/
|
|
|
|
#ifndef _MTP_SERVER_H
|
|
#define _MTP_SERVER_H
|
|
|
|
#include <utils/threads.h>
|
|
#include <utils/Vector.h>
|
|
#include "MtpRequestPacket.h"
|
|
#include "MtpDatabase.h"
|
|
#include "MtpDataPacket.h"
|
|
#include "MtpResponsePacket.h"
|
|
#include "MtpEventPacket.h"
|
|
#include "mtp.h"
|
|
#include "MtpUtils.h"
|
|
|
|
|
|
class MtpDatabase;
|
|
class MtpStorage;
|
|
|
|
class MtpServer {
|
|
|
|
private:
|
|
// file descriptor for MTP kernel driver
|
|
int mFD;
|
|
android::Mutex mMutex;
|
|
MtpDatabase* mDatabase;
|
|
|
|
// appear as a PTP device
|
|
bool mPtp;
|
|
|
|
// group to own new files and folders
|
|
int mFileGroup;
|
|
// permissions for new files and directories
|
|
int mFilePermission;
|
|
int mDirectoryPermission;
|
|
|
|
// current session ID
|
|
MtpSessionID mSessionID;
|
|
// true if we have an open session and mSessionID is valid
|
|
bool mSessionOpen;
|
|
|
|
MtpRequestPacket mRequest;
|
|
MtpDataPacket mData;
|
|
MtpResponsePacket mResponse;
|
|
MtpEventPacket mEvent;
|
|
|
|
MtpStorageList mStorages;
|
|
|
|
// handle for new object, set by SendObjectInfo and used by SendObject
|
|
MtpObjectHandle mSendObjectHandle;
|
|
MtpObjectFormat mSendObjectFormat;
|
|
MtpString mSendObjectFilePath;
|
|
size_t mSendObjectFileSize;
|
|
|
|
pthread_mutex_t mtpMutex;
|
|
|
|
// represents an MTP object that is being edited using the android extensions
|
|
// for direct editing (BeginEditObject, SendPartialObject, TruncateObject and EndEditObject)
|
|
class ObjectEdit {
|
|
public:
|
|
MtpObjectHandle mHandle;
|
|
MtpString mPath;
|
|
uint64_t mSize;
|
|
MtpObjectFormat mFormat;
|
|
int mFD;
|
|
|
|
ObjectEdit(MtpObjectHandle handle, const char* path, uint64_t size,
|
|
MtpObjectFormat format, int fd)
|
|
: mHandle(handle), mPath(path), mSize(size), mFormat(format), mFD(fd) {
|
|
}
|
|
|
|
virtual ~ObjectEdit() {
|
|
close(mFD);
|
|
}
|
|
};
|
|
android::Vector<ObjectEdit*> mObjectEditList;
|
|
|
|
public:
|
|
MtpServer(MtpDatabase* database, bool ptp,
|
|
int fileGroup, int filePerm, int directoryPerm);
|
|
virtual ~MtpServer();
|
|
|
|
MtpStorage* getStorage(MtpStorageID id);
|
|
inline bool hasStorage() { return mStorages.size() > 0; }
|
|
bool hasStorage(MtpStorageID id);
|
|
void addStorage(MtpStorage* storage);
|
|
void removeStorage(MtpStorage* storage);
|
|
|
|
void run(int fd);
|
|
|
|
void sendObjectAdded(MtpObjectHandle handle);
|
|
void sendObjectRemoved(MtpObjectHandle handle);
|
|
void sendObjectUpdated(MtpObjectHandle handle);
|
|
|
|
private:
|
|
void sendStoreAdded(MtpStorageID id);
|
|
void sendStoreRemoved(MtpStorageID id);
|
|
void sendEvent(MtpEventCode code, uint32_t param1);
|
|
|
|
void addEditObject(MtpObjectHandle handle, MtpString& path,
|
|
uint64_t size, MtpObjectFormat format, int fd);
|
|
ObjectEdit* getEditObject(MtpObjectHandle handle);
|
|
void removeEditObject(MtpObjectHandle handle);
|
|
void commitEdit(ObjectEdit* edit);
|
|
|
|
bool handleRequest();
|
|
|
|
MtpResponseCode doGetDeviceInfo();
|
|
MtpResponseCode doOpenSession();
|
|
MtpResponseCode doCloseSession();
|
|
MtpResponseCode doGetStorageIDs();
|
|
MtpResponseCode doGetStorageInfo();
|
|
MtpResponseCode doGetObjectPropsSupported();
|
|
MtpResponseCode doGetObjectHandles();
|
|
MtpResponseCode doGetNumObjects();
|
|
MtpResponseCode doGetObjectReferences();
|
|
MtpResponseCode doSetObjectReferences();
|
|
MtpResponseCode doGetObjectPropValue();
|
|
MtpResponseCode doSetObjectPropValue();
|
|
MtpResponseCode doGetDevicePropValue();
|
|
MtpResponseCode doSetDevicePropValue();
|
|
MtpResponseCode doResetDevicePropValue();
|
|
MtpResponseCode doGetObjectPropList();
|
|
MtpResponseCode doGetObjectInfo();
|
|
MtpResponseCode doGetObject();
|
|
MtpResponseCode doGetThumb();
|
|
MtpResponseCode doGetPartialObject(MtpOperationCode operation);
|
|
MtpResponseCode doSendObjectInfo();
|
|
MtpResponseCode doSendObject();
|
|
MtpResponseCode doDeleteObject();
|
|
MtpResponseCode doGetObjectPropDesc();
|
|
MtpResponseCode doGetDevicePropDesc();
|
|
MtpResponseCode doSendPartialObject();
|
|
MtpResponseCode doTruncateObject();
|
|
MtpResponseCode doBeginEditObject();
|
|
MtpResponseCode doEndEditObject();
|
|
};
|
|
|
|
#endif // _MTP_SERVER_H
|