summaryrefslogblamecommitdiffstats
path: root/mtp/legacy/MtpServer.h
blob: d58cb30a481583826d849a84dab81dc1786b8a15 (plain) (tree)


























































































































































                                                                                                                        
/*
 * 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