//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1996 - 1999
//
//  File:       SIPObj.hxx  (base)
//
//  Contents:   Microsoft SIP Provider
//
//  History:    15-Feb-1997 pberkman   created
//
//--------------------------------------------------------------------------

#ifndef SIPOBJ_HXX
#define SIPOBJ_HXX

#include    "global.hxx"

class SIPObject_
{
    public:
        SIPObject_(DWORD id);
        virtual ~SIPObject_(void);

        virtual BOOL    GetSignedDataMsg(SIP_SUBJECTINFO *pSI,DWORD dwIdx,
                                         DWORD *pdwDLen,BYTE *pbData,
                                         DWORD *pdwEncodeType);
        virtual BOOL    PutSignedDataMsg(SIP_SUBJECTINFO *pSI,DWORD *dwIdx,
                                         DWORD dwDLen,BYTE *pbData,
                                         DWORD dwEncodeType);
        virtual BOOL    RemoveSignedDataMsg(SIP_SUBJECTINFO *pSI,DWORD dwIdx) { return(FALSE); }
        virtual BOOL    CreateIndirectData(SIP_SUBJECTINFO *pSI,DWORD *pdwDLen,
                                           SIP_INDIRECT_DATA *psData);
        virtual BOOL    VerifyIndirectData(SIP_SUBJECTINFO *pSI,
                                           SIP_INDIRECT_DATA *psData);

        virtual char    *GetDataObjectID(void) { return(NULL); }
        virtual char    *GetDataOIDHint(void) { return(NULL); }

        void            set_CertVersion(DWORD dwNewCertVersion);
        DWORD           get_CertVersion(void) { return(uCertVersion); }


    protected:
        HANDLE          hFile;
        BOOL            fUseFileMap;
        BYTE            *pbFileMap;
        DWORD           cbFileMap;
        HANDLE          hMappedFile;
        DWORD           dwFileAccess;
        HCRYPTPROV      hProv;
        BOOL            bCloseFile;
        BOOL            fSizeFileOnly;
        UINT            uSubjectForm;
        DWORD           uCertVersion;
                        
        void            *SIPNew(DWORD cbytes);

        virtual DWORD   GetDigestFlags(SIP_SUBJECTINFO *pSI) { return(0); }

        virtual void    *GetMyStructure(SIP_SUBJECTINFO *pSI) { return(NULL); }
        virtual DWORD   GetMyStructureSize(void) { return(0); }

        virtual BOOL    PutMessageInFile(SIP_SUBJECTINFO *pSI,
                                         WIN_CERTIFICATE *pWinCert,DWORD *pdwIndex)
                                        { return(FALSE); }

        virtual BOOL    GetMessageFromFile(SIP_SUBJECTINFO *pSI,
                                           WIN_CERTIFICATE *pWinCert,DWORD dwIndex,
                                           DWORD *pcbCert)
                                        { return(FALSE); }

        virtual BOOL    GetDigestStream(DIGEST_DATA *pDigestData, 
                                        DIGEST_FUNCTION pfnCallBack, DWORD dwFlags)
                                        { return(FALSE); }

        virtual BOOL    FileHandleFromSubject(SIP_SUBJECTINFO *pSubject,
                                              DWORD dwAccess = GENERIC_READ,
                                              DWORD dwShared = FILE_SHARE_READ);

        BYTE            *DigestFile(HCRYPTPROV hProv, DWORD dwFlags,    // allocates digest
                                    char *pszAlgObjId, DWORD *cbDigest); // delete it after use!!!
        BOOL            OpenFile(LPCWSTR wFileName, DWORD dwAccess, DWORD dwShared);
        void            AllocateAndFillCryptBitBlob(CRYPT_BIT_BLOB *bb,DWORD Flags,
                                                    DWORD cUnusedBits);
        void            DestroyCryptBitBlob(CRYPT_BIT_BLOB *bb);
        DWORD           CryptBitBlobToFlags(CRYPT_BIT_BLOB *bb);
        BOOL            LoadDefaultProvider(void);
        BOOL            SeekAndReadFile(DWORD lFileOffset, BYTE *pb, DWORD cb);
        BOOL            SeekAndWriteFile(DWORD lFileOffset,BYTE *pb, DWORD cb);
        BOOL            MapFile(void);
        BOOL            UnmapFile(void);
};


#endif // SIPOBJ_HXX