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

/*
 * \file $RCSfile$
 * \version $Revision: 223270 $
 * \date $Date:: 2020-12-22 12:08:10 +0300#$
 * \author $Author: markova $
 * \brief Объявления, которые необходимо вывести наружу для предоставления 
 *  работы со всем списком. 
 */

#if !defined _SUPPORT_SUP_SYSE_H
#define _SUPPORT_SUP_SYSE_H

#include "reader/support.h"

#define SUPSYSE_FLAG_BLOCK_GENERAL 0
#define SUPSYSE_FLAG_GENERAL_ADD_LIBRARY 0
#define SUPSYSE_FLAG_GENERAL_VERSION_1 1
#define SUPSYSE_FLAG_GENERAL_SUID 1
#define SUPSYSE_FLAG_GENERAL_VERSION_2 2

// Значение выбрано в соответствии с кодом pcsc-lite
#define SUPSYSE_NICKNAME_LENGTH 0xFF

#define SUPSYSE_REGISTER_FLAG_FAILED 0x1
#define SUPSYSE_REGISTER_FLAG_DISABLED 0x2
#define SUPSYSE_REGISTER_FLAG_NOCONNECT 0x4
#define SUPSYSE_REGISTER_FLAG_REREAD 0x8
#define SUPSYSE_REGISTER_FLAG_PNPGROUP 0x10
#define SUPSYSE_REGISTER_FLAG_FORCE_REREAD 0x20

/* номер иконки пустого считывателя */
#define SUPSYSE_MEDIA_ICON_EMPTY 0
/* номер иконки считывателя со вставленным носителем */
#define SUPSYSE_MEDIA_ICON_INSERTED 1
/* номер иконки считывателя со вставленным носителем, с ошибкой */
#define SUPSYSE_MEDIA_ICON_ERROR 2
/* номер иконки считывателя со вставленным носителем, с неизвестным состоянием */
#define SUPSYSE_MEDIA_ICON_UNKNOWN 3
/* номер иконки считывателя со вставленным носителем, неподходящим */
#define SUPSYSE_MEDIA_ICON_BLOCKED 4

typedef TCHAR TSupSysNickname[SUPSYSE_NICKNAME_LENGTH + 1];
struct TSupSysEContext_;
typedef struct TSupSysEContext_ TSupSysEContext;
struct TSupSysEList_;
typedef struct TSupSysEList_ TSupSysEList;
struct TSupSysEFind_;
typedef struct TSupSysEFind_ TSupSysEFind;
struct TSupSysEHandle_;
typedef struct TSupSysEHandle_ TSupSysEHandle;
struct TSupSysFindInfo_;
typedef struct TSupSysFindInfo_ TSupSysFindInfo;

typedef int(*TSupSysFindValidFun)(const TSupSysFindInfo *add_info, const TSupSysEContext *item);
typedef int(*TSupSysFindValidFunCC)(void * call_ctx, const TSupSysFindInfo *add_info, const TSupSysEContext *item);

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

/* Прозвище элемента. */
DWORD supsys_nickname( 
    const TSupSysEContext *context, TSupSysNickname nickname );

/* Имя элемента. */
DWORD supsys_name( 
    const TSupSysEContext *context, size_t *length, TCHAR *name );

/* Получить имя элемента, так как он зарегистрирован. */
DWORD supsys_register_name( 
    const TSupSysEContext *context, size_t *length, TCHAR *name );

DWORD supsys_applet_term(
    const TSupSysEContext * context, TSupSysNickname applet_term);

/* Функция получения иконки элемента. */
DWORD supsys_icon( 
    const TSupSysEContext *context, TSupIconHandle *icon_handle );

/* Функция получения иконки элемента. */
DWORD supsys_icons( 
    const TSupSysEContext *context, TSupIcon *icons, int iconnum );

/* Функция открытия перечисления элемента. */
DWORD supsys_find_open( 
    const TSupSysEList *list, TSupSysEFind **context );

/* Функция открытия перечисления элемента. */
DWORD supsys_find_open_ext(
    const TSupSysEList *list, TSupSysEFind **context, TSupSysFindInfo *add_info,
    TSupSysFindValidFun valid_fun);

/* Функция открытия перечисления элемента с передачей CallCtx. */
DWORD supsys_find_open_ext_cc(
    const TSupSysEList *list, TSupSysEFind **context, TSupSysFindInfo *add_info,
    TSupSysFindValidFunCC valid_fun_cc);

/* Функция получения контекста элемента. */
DWORD supsys_find_next( 
    TSupSysEFind *context, TSupSysEContext **ctx );

/* Функция получения контекста элемента. */
DWORD supsys_find_next_cc(
    void * call_ctx, TSupSysEFind *context, TSupSysEContext **ctx);

/* Функция получения контекста элемента по прозвищу. */
DWORD supsys_find_nickname(
    const TSupSysEList *list, TSupSysNickname nickname,
    TSupSysEContext **ctx);

/* Получение текущего имени соединения. */
DWORD supsys_connect_current( 
    const TSupSysEContext *context, size_t *length, TCHAR *name );

/* Получение atr текущего соединения. */
DWORD supsys_atr_current(
    const TSupSysEContext *context, BYTE* atr, size_t *length);

/* Получение mask текущего соединения. */
DWORD supsys_mask_current(
    const TSupSysEContext *context, BYTE* mask, size_t *length);


/* Поключение. */
DWORD supsys_connect( 
    TSupSysEContext *context );

/* Отключение. */
DWORD supsys_disconnect( 
    TSupSysEContext *context );

/* Проверка использования внутреннего имени. */
DWORD supsys_parse_internal_name( 
    const TSupSysEList *list, const TCHAR *name, TSupSysEContext **context );

/* Функция закрытия перечисления элемента. */
DWORD supsys_find_close( TSupSysEFind *context );

/* Функция закрытия HANDLE на элемент. */
DWORD supsys_context_free( TSupSysEContext *ctx ); 

/* Функция дублирования контекста элемента. */
DWORD supsys_context_dup( 
    const TSupSysEContext *src, TSupSysEContext **dest );

/* Разрешение / запрещение элемента. */
DWORD supsys_enable( 
    TSupSysEContext *ctx, const TCHAR *ssconnect, const TCHAR *name,
    int enabling );

/* Функция получения флагов элемента. */
DWORD supsys_flags(
    const TSupSysEContext *context, size_t type, size_t *quant,
    unsigned char *flags );

/* Функция получения флага элемента. */
DWORD supsys_flag( 
    const TSupSysEContext *context, size_t type, size_t num,
    int *flag );

/*Функция получения флага элемента, в случае, если данный флаг не поддерживается,
присваивает переменной flag значение def_flag_value*/
DWORD supsys_flag_ex(
    const TSupSysEContext *context,
    size_t type,
    size_t num,
    int def_flag_value,
    int *flag);

/* Функция полной разрегистрации всех элементов. */
DWORD supsys_unregister_all( TSupSysEList *list, 
    int unload );

/* Функция регистрации всех элементов списка. */
DWORD supsys_register_all_ext( 
    TSupSysEList *list, unsigned flags );

/* Функция регистрации всех элементов списка. */
DWORD supsys_register_all( 
    TSupSysEList *list );

/* Функция регистрации одного элемента списка. */
DWORD supsys_register_one(
    TSupSysEList *list, const TCHAR *reader);

DWORD supsys_add_ctx_to_list(
    TSupSysEList *list, TSupSysEContext *context);

DWORD supsys_clear_check_list(
    const TSupSysEList* list);

DWORD supsys_add_ctx_to_check_list(
    const TSupSysEList* list, TSupSysEContext *context);

DWORD supsys_get_item_marks(
    const TSupSysEList* list, unsigned short * mark_out);

DWORD supsys_list_notificator( 
    const TSupSysEList *list, TSupRegNotificator **notificator );

/* Функция, привнесённая из supsys */
DWORD support_default_internal_register_name( 
    const TSupSysEContext *context, size_t *length, TCHAR *name, 
    const TCHAR *ssconnect );
/* Еще одна внутренняя функция*/
DWORD supsys_load_connect(TSupSysEList *list,
	unsigned registration_flags,
	BOOL disabled_flag,
	BOOL no_register_flag,
	const TCHAR *dll_name,
	const TCHAR *nickname,
	const TCHAR *path2connect,
	const TCHAR *connect,
	const TCHAR *in_group_name);

DWORD supsys_company(const TSupSysEContext *context, size_t *length, TCHAR *company);

#if defined( __cplusplus )
}
#endif

#endif /* _SUPPORT_SUP_SYSE_H */
