//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:  pccarden.h

Abstract:

Platform dependent PCMCIA initialization functions

Notes: 
--*/
#ifndef __PCCARDEN_H_
#define __PCCARDEN_H_
#include <CRefCon.h>
#include <CMthread.h>
#include "CBTuple.h"
#include <DevLoad.h>
#include <PCIBUS.h>
#include <cardsv2.h>
#include <sysacc.h>

// For PCMCIA
#define PCMCIA_INSTANCE_PATH TEXT("Drivers\\PCCARD\\PCMCIA\\INSTANCE")
#define PCMCIA_TEMPLATE_PATH TEXT("Drivers\\PCCARD\\PCMCIA\\TEMPLATE")
#define PCMCIA_PNP_PATH TEXT("Drivers\\PCCARD\\PCMCIA\\PNP")
// For CARDBUS
#define CARDBUS_INSTANCE_PATH TEXT("Drivers\\PCCARD\\CARDBUS\\INSTANCE")
#define CARDBUS_PNP_PATH TEXT("Drivers\\PCCARD\\CARDBUS\\PNP")

// For Install_Driver
typedef LPTSTR ( *PFN_INSTALL_DRIVER )( LPTSTR, LPTSTR, DWORD );

#define MAX_TUPLES 500
#define DEVID_LEN   128
#define PROD_LEN    64
#define MANFNAME_END (DEVID_LEN - 12)
#define PRODNAME_END (DEVID_LEN - 8)
#define STR_UNKNOWN_MANID    (TEXT("UNKNOWN_MANUFACTURER"))


extern "C"
{
    void EnEnableClient();
    void DisEnableClient();
    STATUS EnableClienCallBack( CARD_EVENT,
                                CARD_SOCKET_HANDLE,
                                PCARD_EVENT_PARMS );
};


class CPCEnableCard : public CRefObject,
                      public CLockObject,
                      public CPCCardAccessCoreDll
{
public:
                    CPCEnableCard( CARD_SOCKET_HANDLE hSocket,
                                   CARD_CLIENT_HANDLE hClient );
    virtual         ~CPCEnableCard();
    virtual BOOL    Init() ;
    BOOL            ReleaesExclusive();
    BOOL            QueryDriverName( LPTSTR lpPnpStr );
    CARD_SOCKET_HANDLE GetCardHandle()
    {
        return m_hCard;
    };
    CARD_CLIENT_HANDLE GetClientHandle()
    {
        return m_hClient;
    };
    virtual BOOL IsCardBusCard()
    {
        return FALSE;
    };
    virtual STATUS  HandleEvent( CARD_EVENT cEvent, PCARD_EVENT_PARMS pParms );
    HANDLE GetDeviceHandle()
    {
        return m_hDeviceHandle;
    };
    LPCTSTR GetDeviceBusName()
    {
        return m_lpDeviceBusName;
    };

    static const unsigned short m_rgCRC16a[];
    static const unsigned short m_rgCRC16b[];
    static const unsigned short m_rgTplList[];

    static const TCHAR          m_rgcHexDigit[];

    TCHAR*                      itoah( TCHAR* ptr, USHORT val ) const;
    STATUS                      CreateDeviceID( LPTSTR lpDeviceId,
                                                DWORD dwNumOfUnit );

protected:
    USHORT                      GetCardCRC() ;
    UINT                        CisToChar( BYTE* pcstr, LPTSTR ptstr, DWORD dwNumOfCharsOfTstr ) const;
    UINT                        ConvertVoltage( PUCHAR pCIS, PUSHORT pDescr ) const ;
    UINT                        ParseVoltageDescr( PUCHAR pVolt,
                                                   PPOWER_DESCR pDescr ) const;
    INTERFACE_TYPE              m_IntefaceType;
    DWORD                       m_dwBusNumber;
    PCI_SLOT_NUMBER             m_SlotNumber;
    BOOL                        m_bSuccess;
    HANDLE                      m_hDeviceHandle;
    LPTSTR                      m_lpDeviceBusName;
    BOOL                        GetTupleData( PCARD_TUPLE_PARMS pTupleParams,
                                              PVOID pTupleData,
                                              DWORD dwLength,
                                              DWORD dwOffset = 0 );
    BOOL                        FindTuple( PCARD_TUPLE_PARMS pTupleParams,
                                           BOOL bFirst = TRUE,
                                           UINT8 uDesiredTuple = 0xff,
                                           UINT16 attributes = 0 );

private:
    const CARD_SOCKET_HANDLE    m_hCard;
    const CARD_CLIENT_HANDLE    m_hClient;
};

CPCEnableCard* CreatePcmciaEnabler( CARD_SOCKET_HANDLE hSocket,
                                    CARD_CLIENT_HANDLE hClient );
CPCEnableCard* CreateCardBusEnabler( CARD_SOCKET_HANDLE hSocket,
                                     CARD_CLIENT_HANDLE hClient );

#endif
