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

#ifndef SIPOBJCB_HXX
#define SIPOBJCB_HXX

#include    "sipobj.hxx"

extern "C"
{
#   include    "cabinet.h"
};

#define RESERVE_LEN_ALIGN(Len)  ((Len + 3) & ~3)        // all abReserve is alligned @ 4

#define RESERVE_CNT_HDR_LEN     (sizeof(USHORT) * 2)    // cbJund & cbSig

#define RESERVE_CAB_FLAG        0x00000001
#define VERIFY_CAB_FLAG         0x00000002

typedef struct _CAB_HDR_PARA 
{
    CFHEADER            cfheader;
    CFRESERVE           cfres;
    USHORT              cbcfres;        // 0 or sizeof(CFRESERVE)
    BYTE                *pbReserve;
    BYTE                *pbStrings;
    DWORD               cbStrings;
    USHORT              cbJunk;
    USHORT              cbSig;
    CABSignatureStruct_ *pCabSigStruct;
    DWORD               cbTotalHdr;
} CAB_HDR_PARA;

typedef struct _CAB_PARA 
{
    DWORD               dwFlags;
    CAB_HDR_PARA        Hdr;
} CAB_PARA, *PCAB_PARA;

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

        BOOL            CreateIndirectData(SIP_SUBJECTINFO *pSI,DWORD *pdwDLen,
                                        SIP_INDIRECT_DATA *psData);
        virtual BOOL    RemoveSignedDataMsg(SIP_SUBJECTINFO *pSI,DWORD dwIdx);

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

    protected:
        virtual BOOL    PutMessageInFile(SIP_SUBJECTINFO *pSI,WIN_CERTIFICATE *pWinCert,
                                         DWORD *pdwIndex);
        virtual BOOL    GetMessageFromFile(SIP_SUBJECTINFO *pSI,WIN_CERTIFICATE *pWinCert,
                                           DWORD dwIndex,DWORD *pcbCert);
        virtual BOOL    GetDigestStream(DIGEST_DATA *pDigestData, 
                                        DIGEST_FUNCTION pfnCallBack, DWORD dwFlags);

    private:
        CAB_PARA        Para;
        BOOL            fUseV1Sig;

        BOOL            ReadHeader(void);
        BOOL            ReadSignedData(BYTE *pbRet);
        BOOL            WriteSignedData(BYTE *pbSig, DWORD cbSig);
        BOOL            WriteSignedDataV1(BYTE *pbSignedData, DWORD cbSignedData);

        BOOL            WriteHeader(void);
        void            FreeHeader(void);
        BOOL            RemoveCertificate(DWORD Index);
        BOOL            ShiftFileBytes(LONG lbShift);   // this may be needed in SIPObject_ (base)
        BOOL            ReserveSignedData(DWORD cbSignedData);
        BOOL            DigestHeader(DIGEST_FUNCTION pfnDigestData, DIGEST_HANDLE hDigestData);
        void            ChecksumHeader(void);
};


#endif // SIPOBJCB_HXX