FileReader.hxx 2.37 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * Copyright (C) 2003-2014 The Music Player Daemon Project
 * http://www.musicpd.org
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef MPD_NFS_FILE_READER_HXX
#define MPD_NFS_FILE_READER_HXX

#include "check.h"
#include "Lease.hxx"
#include "Callback.hxx"
#include "event/DeferredMonitor.hxx"
27
#include "Compiler.h"
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

#include <string>

#include <stdint.h>
#include <stddef.h>
#include <sys/stat.h>

struct nfsfh;
class NfsConnection;

class NfsFileReader : NfsLease, NfsCallback, DeferredMonitor {
	enum class State {
		INITIAL,
		DEFER,
		MOUNT,
		OPEN,
		STAT,
		READ,
		IDLE,
	};

	State state;

	std::string server, export_name;
	const char *path;

	NfsConnection *connection;

	nfsfh *fh;

public:
	NfsFileReader();
	~NfsFileReader();

	void Close();
	void DeferClose();

	bool Open(const char *uri, Error &error);
	bool Read(uint64_t offset, size_t size, Error &error);
	void CancelRead();

	bool IsIdle() const {
		return state == State::IDLE;
	}

protected:
	virtual void OnNfsFileOpen(uint64_t size) = 0;
	virtual void OnNfsFileRead(const void *data, size_t size) = 0;
	virtual void OnNfsFileError(Error &&error) = 0;

private:
79 80 81 82 83 84
	/**
	 * Cancel the current operation, if any.  The NfsLease must be
	 * unregistered already.
	 */
	void CancelOrClose();

85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
	void OpenCallback(nfsfh *_fh);
	void StatCallback(const struct stat *st);

	/* virtual methods from NfsLease */
	void OnNfsConnectionReady() final;
	void OnNfsConnectionFailed(const Error &error) final;
	void OnNfsConnectionDisconnected(const Error &error) final;

	/* virtual methods from NfsCallback */
	void OnNfsCallback(unsigned status, void *data) final;
	void OnNfsError(Error &&error) final;

	/* virtual methods from DeferredMonitor */
	void RunDeferred() final;
};

#endif