// CspProfile.h -- CSP Profile class declaration

// (c) Copyright Schlumberger Technology Corp., unpublished work, created
// 1998. This computer program includes Confidential, Proprietary
// Information and is a Trade Secret of Schlumberger Technology Corp. All
// use, disclosure, and/or reproduction is prohibited unless authorized
// in writing.  All Rights Reserved.

#if !defined(SLBCSP_PROFILE_H)
#define SLBCSP_PROFILE_H

#if _UNICODE
  #if !defined(UNICODE)
    #define UNICODE
  #endif //!UNICODE
#endif //_UNICODE
#if defined(UNICODE)
  #if !defined(_UNICODE)
    #define _UNICODE
  #endif //!_UNICODE
#endif //UNICODE

#ifndef __AFXWIN_H__
        #error include 'stdafx.h' before including this file for PCH
#endif

#include <memory>                                 // for auto_ptr
#include <string>
#include <vector>

namespace ProviderProfile
{

    class ATR
    {
    public:
        typedef unsigned char Length;
        enum Attribute
        {
            MaxLength = 33
        };

        explicit
        ATR();

        ATR(Length al, BYTE const abATR[], BYTE const abMask[]);

        BYTE const *String() const;
        BYTE const *Mask() const;
        ATR::Length ATRLength() const;
        size_t Size() const;

        ATR &operator=(ATR const &rhs);
        bool operator==(ATR const &rhs);
        bool operator!=(ATR const &rhs);

    private:
        typedef BYTE ATRString[MaxLength];

        Length m_al;
        ATRString m_atrstring;
        ATRString m_atrsMask;
    };

    class CardProfile
    {
    public:
        enum Attribute
        {
            attrNone = 0,

            // Card has the "Cryptoflex Most Significant Byte zero
            // private Key Defect."
            attrMsbKeyDefect = 0x01,
        };

        explicit
        CardProfile();

        CardProfile(ProviderProfile::ATR const &ratr,
                    std::string const &rsFriendlyName,
                    std::string const &rsRegistryName,
                    GUID const &rgPrimaryProvider,
                    Attribute attr = attrNone);

        CardProfile(ProviderProfile::ATR const &ratr,
                    CString const &rcsFriendlyName,
                    CString const &rcsRegistryName,
                    GUID const &rgPrimaryProvider,
                    Attribute attr = attrNone);

        ~CardProfile();

        ATR const &ATR() const;
        std::string FriendlyName() const;
        CString csFriendlyName() const;
        GUID const &PrimaryProvider() const;
        std::string RegistryName() const;
        CString csRegistryName() const;
        bool AtrMatches(ATR::Length cAtr,
                        BYTE const *pbAtr) const;
        bool HasAttribute(Attribute attr) const;

        bool operator==(CardProfile const &rhs);
        bool operator!=(CardProfile const &rhs);

    private:
        ProviderProfile::ATR m_atr;
        std::string m_sFriendlyName;
        std::string m_sRegistryName;
        CString m_csFriendlyName;
        CString m_csRegistryName;
        GUID m_gPrimaryProvider;
        Attribute m_attr;
    };

    struct VersionInfo
    {
        explicit
        VersionInfo()
            : m_dwMajor(0),
              m_dwMinor(0)
        {}

        DWORD m_dwMajor;
        DWORD m_dwMinor;
    };

    class CspProfile
    {
    public:
        HINSTANCE
        DllInstance() const;

        static CspProfile const &
        Instance();

        const CString
        Name() const;

        HINSTANCE
        Resources() const;

        DWORD
        Type() const;

        VersionInfo
        Version() const;

        std::vector<CardProfile> const &
        Cards() const;

        static void
        Release();

    private:
        // client can not directly create a Profile
        // object, use Instance to get the handle
        CspProfile(DWORD Type,
                   std::vector<CardProfile> const &rvcp);

        // not implemented, copy is not allowed
        CspProfile(CspProfile const &rhs);

        // client can not directly delete a profile, use Release to
        // delete one.
        ~CspProfile();

        // not implemented, assignment is not allowed
        CspProfile &
        operator=(CspProfile const &rProfile);

        HINSTANCE m_hDllInstance;
        DWORD const m_dwType;
        VersionInfo m_vi;
        std::vector<CardProfile> m_vcp;
        HINSTANCE m_hResInstance;
        AFX_EXTENSION_MODULE m_RsrcExtensionDLL;
        std::auto_ptr<CDynLinkLibrary> m_apExtDll;

        static CspProfile *m_pInstance;
    };
}

#endif // SLBCSP_PROFILE_H