#pragma once
#include <string>
#include <fcntl.h>

namespace M3D
{

	/**
	 * Обертка над стандартным POSIX вызовом open/close. Обеспечивает закрытие файла при вызове деструктора.
	 * @author Denis A. Biryukov <denis.birukov@gmail.com>
	 */
	class File
	{
		public:
                        File ( );
                        /**
                         * Конструктор открывающий файл сразу. 
                         * Если идет создание файла то он создается с правами доступа 0666, если идет открытие файла то он открывается только для чтения
                         * @param fname имя файла
                         * @param is_creating создавать файл или нет
                         */
			File ( const std::string &fname, bool is_creating );
                        /**
                         * Конструктор открывающий файл сразу. 
                         * Если идет создание файла то он создается с правами доступа 0666, если идет открытие файла то он открывается только для чтения
                         * @param fname имя файла
                         * @param is_creating создавать файл или нет
                         */
                        File ( const char *fname, bool is_creating = false );
                        
			~File();
                        
                        /**
                         * Функция открытия файла. Параметры совпадают с функцией open (man 2 open)
                         * @param fname имя файла
                         * @param flags параметры открытия файла
                         */
                        void open(const char *fname, int flags = O_RDONLY);
                        /**
                         * Функция создания файла. Параметры совпадают с функцией creat (man 2 creat)
                         * @param fname имя файла
                         * @param mode права доступа к вновь созданному файлу
                         */
                        void creat(const char *fname, int mode = 0666);
			
			/**
			 * Функция производит запись данных в файл. В случае ошибки бросается икслючение.
			 * @param buf данные которые требуется записать
			 * @param count объем данных в байтах
			 */
			void write(const void *buf, size_t count);
			/**
			 * Функция производит чтение данных из файла. В случае ошибки бросается исключение.
			 * @param buf получатель данных
			 * @param count объем данных в байтах
			 */
			 void read(void *buf, size_t count);
                        
			void close();
                        operator int() const { return _fdesc_;}
		private:
			int _fdesc_;
			std::string _opened_file_name_;

	};

}

