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

/*!
 * \file $RCSfile: CA_CMP_Requests.h,v $
 * \version $Revision: 1.24 $
 * \date $Date: 2005/01/24 12:36:43 $
 * \author $Author: cav $
 *
 * \brief RequestInfo class
 */

#ifndef CA_CMP_REQUESTS_H
#define CA_CMP_REQUESTS_H

#define CPCSP_C_SOURCE 30
#include "CA_CMP_Types.h"
#include "CA_CMP_Msg.h"

/**************************************************************/
/*                                                            */
/*  Internal structure                                        */
/*                                                            */
/**************************************************************/

enum RequestTypeEnum {
	REQUEST_TYPE_ALL = -1, // Все запросы
	REQUEST_TYPE_GET_CERTIFICATE = 0, // получить сертификат
	REQUEST_TYPE_REVOKE_CERTIFICATE = 1, // отозвать сертификат
	REQUEST_TYPE_GET_CRL = 2, // получить СОС
	REQUEST_TYPE_INITIAL_REQUEST = 3, // получить первый сертификат
	REQUEST_TYPE_CROSS = 4, // получить cross
	REQUEST_TYPE_CONFIRM = 5,   // подтвердить получение сертификата
	REQUEST_TYPE_UPDATE_KEY = 6, // Запрос на обновление ключа
	REQUEST_TYPE_SUSPEND_CERTIFICATE = 7, // приостановить сертификат
	REQUEST_TYPE_RESUME_CERTIFICATE = 8, // возобновить сертификат
	REQUEST_TYPE_GEN_MSG_CONTENT = 9, // Общее сообешние
	REQUEST_TYPE_CHANGE_NAME = 10 // Изменить имя
};

enum RequestStatusEnum {
	REQUEST_STATUS_ALL = -1,        // Все запросы
	REQUEST_STATUS_ENTERED = 0,     // Поступившие
	REQUEST_STATUS_PENDING = 1,     // Отложенные
	REQUEST_STATUS_DECLINED = 2,    // Отклоненные
	REQUEST_STATUS_ACCEPTED = 3,    // Принятые
	REQUEST_STATUS_PROCESSED = 4,   // Обработанные
	REQUEST_STATUS_COMPLETED = 5    // Удовлетворенные
};

struct ReasonFlags
{
    static const unsigned unused;
    static const unsigned keyCompromise;
    static const unsigned caCompromise;
    static const unsigned affiliationChanged;
    static const unsigned superseded;
    static const unsigned cessationOfOperation;
    static const unsigned certificateHold;

    // последовательность масок.
    static const unsigned sequence[7];

    static std::string toString( int );
    static int fromString( const char* );
};

class RequestInfo : public PKIXCMP_Message
{
public:
	RequestInfo();
	RequestInfo( const RequestInfo& r ):PKIXCMP_Message()
	{
	    *this = r;
	}

	~RequestInfo() {}

	RequestInfo& operator=( const RequestInfo& r );

	void clear();

	// Индекс запроса
	int RequestID;

	// Двоичный -	ASN1T_CertificationRequest
	CACMPT_BLOB RawRequest;

	// Дата создания запроса
	CACMPT_Date messageTime;

	// ASN1T_CertificationRequest.ASN1T_CertificationRequest_certificationRequestInfo.ASN1T_Name subject
	CACMPT_PARSED_RDN subjectRDN;

	// Старое имя субъекта (для ChangeNameReq)
	CACMPT_PARSED_RDN oldSubjectRDN;
	
	// ASN1T_CertificationRequest.ASN1T_CertificationRequest_certificationRequestInfo.ASN1T_CertificationRequest_certificationRequestInfo_subjectPublicKeyInfo
        CACMPT_PublicKeyInfo	SubjectPublicKey;

	// extensions
	CACMPT_Extensions Extensions;

	// Строка
	char RequestAttributes[ 32768 ];

	// Строка -		ASN1T_CertificationRequest.ASN1T_AlgorithmIdentifier signatureAlgorithm;
	char RequestSignatureAlgorithm[ 254 ];

	// Строка - 	ASN1T_CertificationRequest.ASN1TDynBitStr signature;
	CACMPT_BLOB RequestSignature;

	// Далее поля из ТПроекта

	// Двоичный -	ASN1T_Certificate
	CACMPT_BLOB RawOldCertificate;

	// Строка -		ASN1T_Certificate.ASN1T_TBSCertificate.ASN1T_CertificateSerialNumber serialNumber
	CACMPT_SERIAL OldCertificateSerialNumber;

	// enum RequestTypeEnum
	int RequestType;

	// enum RequestStatusEnum
	int Status;

	// Запрос распоряжения
	int Disposition;

	// Строка запроса сообщения распоряжения
	char DispositionMessage[ 8192 ];

	// Запрос даты исполнения
	CACMPT_Date ResolvedWhen;

	// Дата отзыва
	CACMPT_Date RevokedWhen;

	// Вступление в силу отзыва
	CACMPT_Date RevokedEffectiveWhen;

	// Причина отзыва
	int RevokedReason;

	// Серийный номер
	CACMPT_SERIAL SerialNumber;

	// Далее идут поля, полученные из Subject (разобранные из ASN1T_Name.ASN1T_RDNSequence)

	// ASN1T_ChangeNameReq.keyPhrase
	FreeText keyPhrase;

	// ASN1T_ChangeNameReq.additionalInfo
	FreeText additionalInfo;

	// 
	PKIStatusEnum pki_status;

	FreeText status_string;

	FailureInfo failure_info;

	// Строка
	char DeviceSerialNumber[ 256 ];
};
#endif /* CA_CMP_REQUESTS_H */
