/* vim:set sw=4 ts=8 fileencoding=cp1251::Кодировка:WINDOWS-1251[АБЁЪЯабёъя] */
#ifdef _WIN32
    #pragma setlocale("rus")
#endif
/*
 * Copyright(C) 2011-2014 Крипто-Про, ООО
 *
 * Этот файл содержит информацию, являющуюся
 * собственностью компании Крипто-Про.
 *
 * Любая часть этого файла не может быть скопирована,
 * исправлена, переведена на другие языки,
 * локализована или модифицирована любым способом,
 * откомпилирована, передана по сети с или на
 * любую компьютерную систему без предварительного
 * заключения соглашения с компанией Крипто-Про.
 */

#pragma once
#ifndef CAdES_cppcades_CPPCadesContent_h_
#define CAdES_cppcades_CPPCadesContent_h_

#include "cplib/Blob.h"
#include "boost/shared_ptr.hpp"

class CCadesContent
{
public:
    CCadesContent() :
        m_contentEncoding(CADESCOM_STRING_TO_UCS2LE) { };
public:
#ifndef UNIX
    // Специально для IE: задать и получить данные
    // через BSTR / CComBSTR
    HRESULT SetContent(const BSTR content);
    HRESULT GetContent(CComBSTR& content);
#endif
    // Задать контент; во внутренний буфер будет
    // положен декодированный контент
    // Специально для вызовов из NPAPI
    HRESULT SetContent(LPCSTR pbData, DWORD cbData);

    // Специально для того, чтобы заполнить подписанное
    // содержимое после проверки при помощи CadesVerifyMessage
    // в случае, если проверка прошла успешно и в сообщении только одна подпись
    HRESULT SetRawContent(PCRYPT_DATA_BLOB pContent);

    // Получить закодированный контент
    HRESULT GetContent(CStringBlob& pVal);

    // Задать и получить используемую кодировку
    // по умолчанию: CADESCOM_STRING_TO_UCS2LE
    HRESULT put_ContentEncoding(CADESCOM_CONTENT_ENCODING_TYPE encoding);
    HRESULT get_ContentEncoding(CADESCOM_CONTENT_ENCODING_TYPE* pVal);

    // Получить ссылку на внутренний буфер и его размер
    const BYTE* pbData() const;
    DWORD cbData() const;

    // Чтобы избежать копирования данных из CStringBlob в CStringBlob
    LPSTR GetBuffer(int nMinBufferLength);
    void ReleaseBufferSetLength(int nNewLength);
    void Empty();

    bool IsEmpty();
private:
    DISALLOW_COPY_AND_ASSIGN(CCadesContent);
    CStringBlob m_content;
    CADESCOM_CONTENT_ENCODING_TYPE m_contentEncoding;
};

#endif // CAdES_cppcades_CPPCadesContent_h_
