//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1997-2001.
//
//  File:       certifct.h
//
//  Contents:   
//
//----------------------------------------------------------------------------

#if !defined(AFX_CERTIFCT_H__9D512D04_126D_11D1_B5D3_00C04FB94F17__INCLUDED_)
#define AFX_CERTIFCT_H__9D512D04_126D_11D1_B5D3_00C04FB94F17__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include "cookie.h"
#include "nodetype.h"

#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

/////////////////////////////////////////////////////////////////////////////
// CCertificate

class CCertificate : public CCertMgrCookie
{
public:
	CCertificate(const PCCERT_CONTEXT pCertContext, CCertStore* pCertStore);
	virtual ~CCertificate();


public:
	bool IsCertStillInStore() const;
	CString GetTemplateName();
	bool CanDelete();
	int CompareExpireDate (const CCertificate& cert) const;
	BOOL DeleteFromStore (bool bDoCommit);
	CString FormatStatus();
	CString GetAlternateSubjectName ();
	CString GetAlternateIssuerName ();
	PCCERT_CONTEXT GetCertContext () const;
	CCertStore* GetCertStore () const;
	CString GetDescription ();
	CString GetEnhancedKeyUsage ();
	CString GetFriendlyName ();
	CString GetMD5Hash ();
	CString GetIssuerName ();
	CString GetShortLastModified ();
	CString GetLongLastModified ();
    HRESULT GetLastModifiedFileTime (FILETIME& ft);
	PCCERT_CONTEXT GetNewCertContext ();
	CString GetSerialNumber ();
	CString GetSHAHash ();
	const SPECIAL_STORE_TYPE GetStoreType () const;
	CString GetSubjectName ();
	CString GetValidNotAfter ();
	CString GetValidNotBefore ();
	bool IsArchived();
	bool IsReadOnly ();
	bool IsValid ();
	virtual void Refresh ();
	HRESULT SetDescription (const CString& szDescription);
    HRESULT SetLastModified ();
    BOOL operator==(CCertificate&);
    void SetStore (CCertStore* pStore);

private:
    CString DecodeV1TemplateName (PCERT_EXTENSION pCertExtension);
    CString DecodeV2TemplateName (PCERT_INFO pCertInfo);
    CString OriginalDecodeV2TemplateName (PCERT_EXTENSION pCertExtension);
    HRESULT FormatSerialNoString(LPWSTR *ppString, CRYPT_INTEGER_BLOB const *pblob);
	bool FormatEnhancedKeyUsagePropertyString (CString& string);
	HRESULT ConvertAltNameToString (LPCWSTR szOID, const DWORD dwNameChoice, CString &altName);
    CString CCertificate::GetLastModified(DWORD dwDateFlags, bool bRetryIfNotPresent = true);

private:	// data
	bool                    m_bIsArchived;
	bool                    m_bCanDelete;
	CCertStore*             m_pCertStore;
	CString GetGenericHash (DWORD dwPropId);
	CString                 m_szSHAHash;
	CString                 m_szMD5Hash;
	CString                 m_szFriendlyName;
	CString					m_szEnhancedKeyUsage;
	CString					m_szPolicyURL;
	CString					m_szAuthorityKeyID;
	CString					m_szSubjectKeyID;
	CString					m_szSerNum;
	CString					m_szAltSubjectName;
	CString					m_szAltIssuerName;
	CString					m_szValidNotBefore;
	CString					m_szValidNotAfter;
	CString					m_szSubjectName;
	CString					m_szIssuerName;
	PCERT_INFO				m_pCertInfo;
	PCCERT_CONTEXT			m_pCertContext;
	DWORD					m_fieldChecked;
    CString                 m_szDescription;
    CString                 m_szTemplateName;
};

#endif // !defined(AFX_CERTIFCT_H__9D512D04_126D_11D1_B5D3_00C04FB94F17__INCLUDED_)