/*
 * 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_STORAGE_H
#define _MTP_STORAGE_H

#include "mtp.h"
#include "MtpObjectInfo.h"
#include <string>
#include <deque>
#include <map>
#include <libgen.h>
#include <pthread.h>
#include "btree.hpp"
#include "MtpServer.h"
#include "../../tw_atomic.hpp"

class MtpDatabase;
struct inotify_event;

class MtpStorage {

private:
	MtpStorageID			mStorageID;
	MtpString				mFilePath;
	MtpString				mDescription;
	uint64_t				mMaxCapacity;
	uint64_t				mMaxFileSize;
	// amount of free space to leave unallocated
	uint64_t				mReserveSpace;
	bool					mRemovable;
	MtpServer*				mServer;
	typedef std::map<int, Tree*> maptree;
	typedef maptree::iterator iter;
	maptree mtpmap;
	std::string mtpstorageparent;
	android::Mutex			 mMutex;

public:
							MtpStorage(MtpStorageID id, const char* filePath,
									const char* description, uint64_t reserveSpace,
									bool removable, uint64_t maxFileSize, MtpServer* refserver);
	virtual					~MtpStorage();

	inline MtpStorageID		getStorageID() const { return mStorageID; }
	int						getType() const;
	int						getFileSystemType() const;
	int						getAccessCapability() const;
	uint64_t				getMaxCapacity();
	uint64_t				getFreeSpace();
	const char*				getDescription() const;
	inline const char*		getPath() const { return (const char *)mFilePath; }
	inline bool				isRemovable() const { return mRemovable; }
	inline uint64_t			getMaxFileSize() const { return mMaxFileSize; }

	struct PropEntry {
		MtpObjectHandle handle;
		uint16_t property;
		uint16_t datatype;
		uint64_t intvalue;
		std::string strvalue;
	};

	int readDir(const std::string& path, Tree* tree);
	int createDB();
	MtpObjectHandleList* getObjectList(MtpStorageID storageID, MtpObjectHandle parent);
	int getObjectInfo(MtpObjectHandle handle, MtpObjectInfo& info);
	MtpObjectHandle beginSendObject(const char* path, MtpObjectFormat format, MtpObjectHandle parent, uint64_t size, time_t modified);
	void endSendObject(const char* path, MtpObjectHandle handle, MtpObjectFormat format, bool succeeded);
	int getObjectPropertyList(MtpObjectHandle handle, uint32_t format, uint32_t property, int groupCode, int depth, MtpDataPacket& packet);
	int getObjectFilePath(MtpObjectHandle handle, MtpString& outFilePath, int64_t& outFileLength, MtpObjectFormat& outFormat);
	int deleteFile(MtpObjectHandle handle);
	int renameObject(MtpObjectHandle handle, std::string newName);
	int getObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, PropEntry& prop);
	void lockMutex(int thread_type);
	void unlockMutex(int thread_type);

private:
	pthread_t inotify();
	int inotify_t();
	typedef int (MtpStorage::*ThreadPtr)(void);
	typedef void* (*PThreadPtr)(void *);
	std::map<int, Tree*> inotifymap;	// inotify wd -> tree
	pthread_t inotify_thread;
	int inotify_fd;
	int addInotify(Tree* tree);
	void handleInotifyEvent(struct inotify_event* event);

	bool sendEvents;
	MtpObjectHandle handleCurrentlySending;

	Node* addNewNode(bool isDir, Tree* tree, const std::string& name);
	Node* findNode(MtpObjectHandle handle);
	Node* findNodeByPath(const std::string& path);
	std::string getNodePath(Node* node);

	void queryNodeProperties(std::vector<PropEntry>& results, Node* node, uint32_t property, int groupCode, MtpStorageID storageID);

	bool use_mutex;
	pthread_mutex_t inMutex; // inotify mutex
	pthread_mutex_t mtpMutex; // main mtp mutex
	TWAtomicInt inotify_thread_kill;
};

#endif // _MTP_STORAGE_H
