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

/*!
 * \file $RCSfile$
 * \version $Revision: 165177 $
 * \date $Date:: 2017-10-26 13:15:08 +0300#$
 * \author $Author: frolov $
 * \brief Интерфейс к ДСЧ.
 */

#if !defined _RNDM_RNDM_H
#define _RNDM_RNDM_H

#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif /* HAVE_LIMITS_H */
#include "reader/sup_syse.h"
#include "reader/std_decl.h"

#define rndm_context_free supsys_context_free

#define TRndmContext TSupSysEContext
#define TRndmHandle TSupSysEHandle

/*! \ingroup rndm_error
 * \brief Ошибка. ДСЧ не найден. 
 *
 * Результат выполнения функции: ДСЧ не найден. 
 */
/*данная ошибка нигде не обрабатывается, соответственно,
1) есть подозрение, что фактически никогда не возникает.
2) если и возникает, приводит к когнитивному диссонансу у пользователя.
Посему заменена на (DWORD)NTE_PROVIDER_DLL_FAIL*/
//#define RNDM_ERR_NOT_FOUND -> (DWORD)NTE_PROVIDER_DLL_FAIL

/*+ Коды возврата для описания требуемых действий. +*/
// #define CPR_ERR_RNDM_RETCODE (CPR_ERR_RETCODE|0x2000)

//#define CPR_ERR_RNDM_RETCODE (CPR_ERR_RNDM_RETCODE|0x0001)

/*+ Первый код ошибки не использующийся для вывода сообщения на экран. +*/
//#define RNDM_ERR_INVALID -> (DWORD)CPR_ERR_RNDM_RETCODE

/*! \ingroup rndm_type 
 * \brief ДСЧ не выдающий окон.
 */
#define RNDM_TYPE_WINDOWLESS 0x1

/*! \ingroup rndm_type 
 * \brief Отчуждаемый ДСЧ.
 */
#define RNDM_TYPE_REMOVABLE 0x2

/*! \ingroup rndm_type 
 * \brief Сертифицированный ФАПСИ ДСЧ
 */
#define RNDM_TYPE_CERTIFIED 0x4

/*! \ingroup rndm_type
 * \brief Физический ДСЧ.
 */
#define RNDM_TYPE_HARD 0x8

/*! \ingroup rndm_type
 * \brief Гамма ФАПСИ
 */
#define RNDM_TYPE_FAPSI_GAMMA 0x10

/*! \ingroup rndm_type 
 * \brief Маска поиска любого ДСЧ. 
 */
#define RNDM_TYPE_ANY_MASK 0 

/*! \ingroup rndm_type 
 * \brief Результат наложения маски любого ДСЧ
 */
#define RNDM_TYPE_ANY_VALUE 0

/* **** **** typedef **** **** */

/*! \ingroup rndm_type 
 * \brief Флаги типов ДСЧ. 
 */
typedef unsigned long TRndmType;

/* Уровень регистрации ДСЧ. */
typedef unsigned TRndmLevel;

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



/*! 
 * \ingroup rndm_rndm           				
 * \brief Функция получения случайного числа.
 * \param context [in] контекст ДСЧ
 * \param length [in] размер случайного числа в байтах
 * \param info [out] случайное число
 * \return Код ошибки получения случайного числа.
 * \retval ERROR_SUCCESS случайное число получено.
 * \retval (DWORD)ERROR_INVALID_PARAMETER при передаче неправильных параметров
 */
 DWORD rndm( TRndmContext *context, size_t length, 
    void *info ); 

/*!
 * \ingroup rndm_rndm
 * \brief Функция получения типа ДСЧ. 
 * \param context [in] контекст ДСЧ
 * \param ptype [out] тип ДСЧ
 * \return Код ошибки получения типа
 * \retval ERROR_SUCCESS тип ДСЧ получен
 * \retval (DWORD)ERROR_INVALID_PARAMETER при передаче неправильных параметров
 * \retval (DWORD)NTE_PROVIDER_DLL_FAIL функция из контекста не поддерживается
 * \retval "другие" 
 */
 DWORD rndm_type_get( const TRndmContext *context, 
    TRndmType *type ); 

/*!
 * \ingroup rndm_rndm
 * \brief Функция поиска заданного ДСЧ по маске.
 * \param list [in] список, в котором ищем
 * \param context [out] контекст ДСЧ
 * \param mask [in] маска поиска ДСЧ
 * \param value [in] значение, которое ищем
 * \retun код ошибки
 * \retval ERROR_SUCCESS контекст корректно открыт
 * \retval (DWORD)NTE_NO_MEMORY недостаточно оперативной памяти
 */
 DWORD rndm_find_mask(TSupSysEList *list,
    TRndmContext **context, TRndmType mask, TRndmType value );

/*!
 * \ingroup rndm_rndm
 * \brief  Функция установки уровня ДСЧ.
 * \param ctx [in] контекст ДСЧ
 * \param level [in] уровень ДСЧ
 * \retun код ошибки
 */
 DWORD rndm_level_set( const TRndmContext *ctx,
    TRndmLevel level );

/*!
 * \ingroup rndm_rndm
 * \brief  Функция получения уровня ДСЧ.
 * \param ctx [in] контекст ДСЧ
 * \retun \ref TRndmLevel уровень ДСЧ. 
 */
 TRndmLevel rndm_level_get( const TRndmContext *ctx);

#if defined _WIN32
/*!
 * \ingroup rndm_rndm
 * \brief Функция установки p	arent HWND. 
 * \param context [in] контекст ДСЧ.
 * \param hwnd [in] parent HWND.
 * \retval ERROR_SUCCESS HWND установлено или установка HWND не требуется.
 * \retval "ошибки ДСЧ" \ret rndm_err_code
 */
 DWORD rndm_set_hwnd( const TRndmContext *ctx,
    HWND hwnd );
#endif	/* _WIN32 */

/* Функция регистрации ДСЧ. */
 DWORD rndm_register_start(TSupSysEList **list);

#ifndef NO_SUP_PROPERTIES
 DWORD rndm_wnd_configure( HWND hwnd ); 
#endif /* !NO_SUP_PROPERTIES */


#if defined( __cplusplus )
}
#endif

#endif /* !_RNDM_RNDM_H */
