//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1993.
//
//  File:	dfname.hxx
//
//  Contents:	CDfName header
//
//  Classes:	CDfName
//
//  History:	14-May-93	DrewB	Created
//
//----------------------------------------------------------------------------

#ifndef __DFNAME_HXX__
#define __DFNAME_HXX__

// A name for a docfile element
class CDfName
{
private:
    BYTE _ab[CBSTORAGENAME];
    WORD _cb;

public:
    CDfName(void)               { _cb = 0; }

    inline void Set(WORD const cb, BYTE const *pb);
    void Set(WCHAR const *pwcs) { Set((lstrlenW(pwcs)+1)*sizeof(WCHAR),
				      (BYTE const *)pwcs); }
    void Set(char const *psz)   { Set(strlen(psz)+1, (BYTE const *)psz); }

    inline void Set(CDfName const *pdfn);

    CDfName(WORD const cb, BYTE const *pb)      { Set(cb, pb); }
    CDfName(WCHAR const *pwcs)  { Set(pwcs); }
    CDfName(char const *psz)    { Set(psz); }

    WORD GetLength(void) const  { return _cb; }
    BYTE *GetBuffer(void) const { return (BYTE *) _ab; }

    // Make a copy of a possibly byte-array name in a WCHAR string
    void CopyString(WCHAR const *pwcs);

#ifndef FLAT
    BOOL IsEqual(CDfName const *dfn) const
    {
#ifdef CASE_SENSITIVE
	return _cb == dfn->_cb && memcmp(_ab, dfn->GetBuffer(), _cb) == 0;
#else
	// This assumes that all DfNames are actually Unicode strings
	return _cb == dfn->_cb &&
	    dfwcsnicmp((WCHAR *)_ab, (WCHAR *)dfn->GetBuffer(), _cb) == 0;
#endif
    }
#else
    BOOL IsEqual(CDfName const *pdfn) const;
#endif
};

#ifdef CODESEGMENTS
#pragma code_seg(SEG_CDfName_Set)
#endif

inline void CDfName::Set(WORD const cb, BYTE const *pb)
{
    _cb = cb;
    if (pb)
        memcpy(_ab, pb, cb);
}

#ifdef CODESEGMENTS
#pragma code_seg()
#endif


inline void CDfName::Set(CDfName const *pdfn)
{
    Set(pdfn->GetLength(), pdfn->GetBuffer());
}

#endif // #ifndef __DFNAME_HXX__