summaryrefslogtreecommitdiff
path: root/Source/modules/asura-base/FileSystem/File.h
blob: 3bb6067558045c3a8b04d61b72020001436c20a4 (plain)
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
27
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#ifndef _ASURA_ENGINE_FILE_H_
#define _ASURA_ENGINE_FILE_H_

#include "physfs/physfs.h"

#include "../Scripting/Scripting.h"
#include "../Threads/Thread.h"

#include "FileData.h"

namespace_begin(AsuraEngine)
namespace_begin(FileSystem)

///
/// ʽļָд㡢Сʹȡʱʹñ࣬ʹFilesystem.read()ֱӶȡļȫ
/// ݣһFileData
///
class File ASURA_FINAL : public AEScripting::Portable<File>
{
public:

	LUAX_DECL_FACTORY(File);

	/// ļдģʽ
	enum FileMode
	{
		FILE_MODE_CLOSED,
		FILE_MODE_READ,
		FILE_MODE_WRITE,
		FILE_MODE_APPEND,
	};

	/// ļдʱΪ
	enum BufferMode
	{
		BUFFER_MODE_NONE, ///< ʹû壬дļ
		BUFFER_MODE_LINE, ///< л壬зߴﵽСʱдļ
		BUFFER_MODE_FULL, ///< ȫ壬ʱдļ
	};

	File(const std::string& filename);
	~File();

	bool Open(FileMode mode); 
	bool Close();
	bool IsOpen();
	FileMode GetMode();
	size_t GetSize(); 

	size_t Read(ASURA_OUT DataBuffer* dst, size_t length);
	size_t ReadAll(ASURA_OUT DataBuffer* dst);
	size_t ReadAsync(ASURA_OUT DataBuffer* dst);

	bool IsEOF();

	bool Write(ASURA_REF DataBuffer* src);
	bool WriteAsync(ASURA_REF DataBuffer* src, AEThreading::Thread* thread);

	bool Flush();

	size_t Tell();

	bool Seek(size_t pos);

	bool SetBuffer(BufferMode mode, size_t size);

	BufferMode GetBuffer(ASURA_OUT size_t& size);

	const std::string& GetFileName();
	const std::string& GetName();
	const std::string& GetExtension();

private:

	PHYSFS_File* m_FileHandle; ///< physfs ļ
	std::string  m_FileName;   ///< ļ
	std::string  m_Extension;  ///< չ
	std::string  m_Name;       ///< չļ
	FileMode     m_Mode;       ///< ļģʽ
	BufferMode   m_BufferMode;	///< д뻺ģʽ
	size_t       m_BufferSize;	///< д뻺С

	LUAX_DECL_ENUM(FileMode);
	LUAX_DECL_ENUM(BufferMode);

	LUAX_DECL_METHOD(_New);
	LUAX_DECL_METHOD(_Open);
	LUAX_DECL_METHOD(_Close);
	LUAX_DECL_METHOD(_IsOpen);
	LUAX_DECL_METHOD(_GetMode);
	LUAX_DECL_METHOD(_GetSize);
	LUAX_DECL_METHOD(_Read);
	LUAX_DECL_METHOD(_Write);
	LUAX_DECL_METHOD(_ReadAsync);
	LUAX_DECL_METHOD(_WriteAsync);
	LUAX_DECL_METHOD(_IsEOF);
	LUAX_DECL_METHOD(_Flush);
	LUAX_DECL_METHOD(_Tell);
	LUAX_DECL_METHOD(_Seek);
	LUAX_DECL_METHOD(_SetBuffer);
	LUAX_DECL_METHOD(_GetBuffer);
	LUAX_DECL_METHOD(_GetFileName);
	LUAX_DECL_METHOD(_GetExtension);
	LUAX_DECL_METHOD(_GetName);

};

namespace_end
namespace_end

#endif