/**
 * @brief Режим открытия/создания файла

typedef enum {
    HSAL_FILE_O_READ   := 16#01,                                      // Только чтение
    HSAL_FILE_O_WRITE  := 16#02,                                      // Только запись
    HSAL_FILE_O_RDWR   := (HSAL_FILE_O_READ | HSAL_FILE_O_WRITE),    // Чтение и запись
    HSAL_FILE_O_CREATE := 16#04,                                      // Файл будет создан, если не существует
    HSAL_FILE_O_APPEND := 16#08                                       // Перед каждой записью в файл текущая позиция будет установлена на конец файла
} HSAL_File_Mode;*/
TYPE HSAL_File_Mode:
(
	HSAL_FILE_O_READ   := 16#01,                                      // Только чтение
    HSAL_FILE_O_WRITE  := 16#02,                                      // Только запись
    HSAL_FILE_O_RDWR   := 16#03, //(HSAL_FILE_O_READ | HSAL_FILE_O_WRITE),    // Чтение и запись
    HSAL_FILE_O_CREATE := 16#04,                                      // Файл будет создан, если не существует
    HSAL_FILE_O_APPEND := 16#08                                       // Перед каждой записью в файл текущая позиция будет установлена на конец файла

);
END_TYPE

/**
 * @brief Способ отсчета смещения в файле

typedef enum {
    HSAL_FILE_ORIGIN_SET := 0,   // Cмещение от начала файла
    HSAL_FILE_ORIGIN_CUR,       // Cмещение от текущей позиции в файле
    HSAL_FILE_ORIGIN_END        // Смещение от конца файла
} HSAL_File_Origin;*/
TYPE HSAL_File_Origin:
(
    HSAL_FILE_ORIGIN_SET := 0,   // Cмещение от начала файла
    HSAL_FILE_ORIGIN_CUR,       // Cмещение от текущей позиции в файле
    HSAL_FILE_ORIGIN_END        // Смещение от конца файла
);
END_TYPE

/*
typedef enum {
    HSAL_FILE_RD_OWNER  = 0x4000,	// Чтение доступно владельцу
    HSAL_FILE_WR_OWNER  = 0x2000,	// Запись доступна владельцу
    HSAL_FILE_EXE_OWNER = 0x1000,	// Исполнение доступно владельцу
    HSAL_FILE_RWX_OWNER = 0x7000,   // Все права доступны владельцу
    HSAL_FILE_RD_USER   = 0x0400,	// Чтение доступно пользователю
    HSAL_FILE_WR_USER   = 0x0200,	// Запись доступна пользователю
    HSAL_FILE_EXE_USER	= 0x0100,	// Исполнение доступно пользователю
    HSAL_FILE_RWX_USER  = 0x0700,   // Все права доступны пользователю
    HSAL_FILE_RD_GROUP  = 0x0040,	// Чтение доступно группе
    HSAL_FILE_WR_GROUP  = 0x0020,	// Запись доступна группе
    HSAL_FILE_EXE_GROUP = 0x0010,	// Исполнение доступно группе
    HSAL_FILE_RWX_GROUP = 0x0070,   // Все права доступны группе
    HSAL_FILE_RD_OTHER  = 0x0004,	// Чтение доступно остальным
    HSAL_FILE_WR_OTHER  = 0x0002,	// Запись доступна остальным
    HSAL_FILE_EXE_OTHER = 0x0001,	// Исполнение доступно остальным
    HSAL_FILE_RWX_OTHER = 0x0007,   // Все права доступны остальным
} HSAL_File_Permissions;
 */

 TYPE HSAL_File_Permissions:
(
    HSAL_FILE_RD_OWNER  := 16#4000,	// Чтение доступно владельцу
    HSAL_FILE_WR_OWNER  := 16#2000,	// Запись доступна владельцу
    HSAL_FILE_EXE_OWNER := 16#1000,	// Исполнение доступно владельцу
    HSAL_FILE_RWX_OWNER := 16#7000,   // Все права доступны владельцу
    HSAL_FILE_RD_USER   := 16#0400,	// Чтение доступно пользователю
    HSAL_FILE_WR_USER   := 16#0200,	// Запись доступна пользователю
    HSAL_FILE_EXE_USER	:= 16#0100,	// Исполнение доступно пользователю
    HSAL_FILE_RWX_USER  := 16#0700,   // Все права доступны пользователю
    HSAL_FILE_RD_GROUP  := 16#0040,	// Чтение доступно группе
    HSAL_FILE_WR_GROUP  := 16#0020,	// Запись доступна группе
    HSAL_FILE_EXE_GROUP := 16#0010,	// Исполнение доступно группе
    HSAL_FILE_RWX_GROUP := 16#0070,   // Все права доступны группе
    HSAL_FILE_RD_OTHER  := 16#0004,	// Чтение доступно остальным
    HSAL_FILE_WR_OTHER  := 16#0002,	// Запись доступна остальным
    HSAL_FILE_EXE_OTHER := 16#0001,	// Исполнение доступно остальным
    HSAL_FILE_RWX_OTHER := 16#0007,   // Все права доступны остальным
);
END_TYPE




/**
 * @brief Дескриптор файла. Обобщенный тип для хранения дескриптора файла в разных системах
 * @param id Указатель на дескриптор файла (или дескриптор файла), используемый в конкретной системе

typedef uintptr_t HSAL_File_ID;
*/

TYPE HSAL_File_ID: uintptr_t; END_TYPE


/**
 * @brief Структура для работы с файлом
*/


@EXTERNAL FUNCTION typedef_HSAL_File_init : DINT
VAR_INPUT 
	file:REF_TO HSAL_File;
    file_name:REF_TO BYTE;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_open : DINT
VAR_INPUT 
	file :REF_TO HSAL_File;
    flags:DINT;
	mode :DWORD;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_is_opened : DINT
VAR_INPUT 
	file :REF_TO HSAL_File;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_close : DINT
VAR_INPUT 
	file:REF_TO HSAL_File;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_read : DINT
VAR_INPUT 
	file:REF_TO HSAL_File;
    buf:REF_TO VOID;
    size:DWORD;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_write : DINT
VAR_INPUT 
	file:REF_TO HSAL_File;
    buf:REF_TO VOID;
    size:DWORD;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_seek : DINT
VAR_INPUT 
	file:REF_TO HSAL_File;
    offset:DINT;
    origin:HSAL_File_Origin; 
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_tell : DINT
VAR_INPUT 
	file:REF_TO HSAL_File;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_destroy : DINT
VAR_INPUT 
	file:REF_TO HSAL_File;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_get_id : HSAL_File_ID
VAR_INPUT 
	file :REF_TO HSAL_File;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_set_permissions : DINT
VAR_INPUT 
	file : REF_TO HSAL_File;
    perm : HSAL_File_Permissions;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_permissions : DINT
VAR_INPUT 
	file : REF_TO HSAL_File;
    perm : REF_TO HSAL_File_Permissions;
END_VAR
END_FUNCTION

@EXTERNAL FUNCTION typedef_HSAL_File_exists : DINT
VAR_INPUT 
	file :REF_TO HSAL_File;
END_VAR
END_FUNCTION


@EXTERNAL FUNCTION typedef_HSAL_File_remove : DINT
VAR_INPUT 
	file : REF_TO HSAL_File;
END_VAR
END_FUNCTION


TYPE HSAL_File:
STRUCT 
	id: HSAL_File_ID; 
    __file_name: REF_TO BYTE;
    init       : REF_TO typedef_HSAL_File_init;
    open       : REF_TO typedef_HSAL_File_open;
    is_opened  : REF_TO typedef_HSAL_File_is_opened;
    close      : REF_TO typedef_HSAL_File_close;
    read       : REF_TO typedef_HSAL_File_read;
    write      : REF_TO typedef_HSAL_File_write;
    seek       : REF_TO typedef_HSAL_File_seek;
    tell       : REF_TO typedef_HSAL_File_tell;
    destroy    : REF_TO typedef_HSAL_File_destroy;
	get_id     : REF_TO typedef_HSAL_File_get_id;
    set_permissions : REF_TO typedef_HSAL_File_set_permissions;
    permissions     : REF_TO typedef_HSAL_File_permissions;
    exists      : REF_TO typedef_HSAL_File_exists;
    remove      : REF_TO typedef_HSAL_File_remove;
END_STRUCT
END_TYPE


/**
 * @brief Конструктор файла  
 * @param [in] file Описатель файла
 * @return Результат
 * := 0 - Успешное завершение
 * < 0 - Код ошибки
 
int hsal_file_constructor(HSAL_File *file);*/
@EXTERNAL FUNCTION hsal_file_constructor: DINT
VAR_INPUT
    file: REF_TO HSAL_File; 
END_VAR
END_FUNCTION


