/*
 * Copyright(C) 2000 Проект ИОК
 *
 * Этот файл содержит информацию, являющуюся
 * собственностью компании Крипто Про.
 *
 * Любая часть этого файла не может быть скопирована,
 * исправлена, переведена на другие языки,
 * локализована или модифицирована любым способом,
 * откомпилирована, передана по сети с или на
 * любую компьютерную систему без предварительного
 * заключения соглашения с компанией Крипто Про.
 */

#if !defined( _READER_FAT12_FAT12INT_H )
#define _READER_FAT12_FAT12INT_H

#include <tchar.h>
#include "reader.kit/reader.h"
#include "os_specific.h"

#ifdef UNIX
#   define _POSIX_PTHREAD_SEMANTICS 1
#   include <dirent.h>
#endif /* UNIX */

#define DIR_NOTEXIST 0
#define DIR_EXIST 1
#define DIR_INVALID 2
#define DIR_WRONG_NAME 3

/*++++
 * Функция преобразования символа уникального номера.
 ++++*/
static SUP_INLINE TCHAR fat12_convert( int c )
{
    if( c >= 'a' && c <= 'z' )
	return (TCHAR)c;
    if( c >= 'A' && c <= 'Z' )
	return (TCHAR)c;
    if( c >= '0' && c <= '9' )
	return (TCHAR)c;
    if( c == '-' )
	return (TCHAR)c;
    return (TCHAR)( ( (unsigned char)c ) % ( 'z' - 'a' + 1 ) + 'a' );
}

#if defined( __cplusplus )
extern "C" {
#endif

#if !defined( _RESOURCE )
/*+ Заменитель ресурса. +*/
extern TSupResourceInstance FAT12_RESOURCE;
#else
#define FAT12_RESOURCE FAT12_DLL_INSTANCE
extern HINSTANCE FAT12_DLL_INSTANCE;
#endif /* !defined( _RESOURCE ) */

#define FAT12_FLAG_HDIMAGE 0x1

//тип данных для проверки провайдера: запоминаем, как создали контекст. Требуем правильной функции удаления. register/unregister & dup/free
typedef enum {
    TCtxCreationType_registered,
    TCtxCreationType_duplicated
} TCtxCreationType;

/*Структура группового контекста fat12, пока используется только f12def.c - в считывателе FLASH!*/
typedef struct {
    TCHAR *path_to_item;
    TCtxCreationType m_creation_type; //используем для проверки провайдера на корректность удаления контекста
} TFat12GroupContext;

/*+ Структура внутреннего контекста дискеты в формате fat12. +*/
typedef struct {
    TCHAR *path; /*+ Имя дисковода. 
	Для A: "A", для B: "B", для removable соответствующее имя. +*/
#if defined _WIN32 
    HANDLE handle;
    DWORD access; /*!< Способ доступа к файлу. */
    void * pSD; /* !< Отложенный SecurityDescriptor*/
    DWORD SecInfo; /* !< Отложенная информация для SD*/
    size_t pSD_size; /* !< Размер отложенного SecurityDescriptor*/
#else
    FILE *handle;
#endif /* _WIN32 */
    BOOL    long_names; /* признак, что имена длинные */
    unsigned long volume_serial; /* а используется ? */
    TCHAR *volume_label;
    TCHAR *file_name; /*!< Имя открытого файла. */
    TCHAR *folder;
    TCHAR *path_to_item;
    unsigned flags;
    int machine;
    TSupSysNickname nickname;
    TSupSysNickname connect;
    BOOL is_encrypted;
    TGenericMutex lock;
    BOOL locked;
    TSupSysNickname lock_name;
} TFat12Context;

typedef struct TFat12FolderEnumNew_
{
    TCHAR *full_prefix;
    TCHAR prefix[10];
    unsigned num;
} TFat12FolderEnumNew;

#define SHARING_VIOLATION_TRIES 10

/*++++
 * Функция получения кода ошибки в формате драйвера по коду ошибки ОС.
 ++++*/
DWORD fat12_os_error( void );
DWORD fat12_os_error_inside(void);

DWORD check_container_access_by_file(const TFat12Context *ctx, const TCHAR* folder, const TCHAR* file);

#if defined _WIN32
DWORD fat12_unique_form( unsigned long volume_serial, const TCHAR *vname,
    size_t *length, TCHAR *unique );
BOOL isCPdisk(TCHAR * name);
#endif	/* _WIN32 */

int fat12_is_dir_exist( const TCHAR *path );

DWORD fat12_volume_name(const TCHAR* path, TCHAR** name, unsigned long* serial);

DWORD hdimage_path_default(TCHAR **str, int machine, BOOL is_hsm);

static const TCHAR BASE_PATH_CFG[] = _TEXT("\\config\\KeyDevices");
static const TCHAR DEFAULT_CONNECT[] = _TEXT("Default");
static const TCHAR LONG_NAMES_KEY[] = _TEXT("long_names");
BOOL get_registry_long_names_flag(TCHAR *path);

#if defined( __cplusplus )
}
#endif

#endif /* !_READER_FAT12_FAT12INT_H */
