//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1998 - 1998.
//
//  File:	section.hxx
//
//  Contents:	CSection definition
//
//  Classes:	CSection
//
//  Functions:	
//
//  History:	22-Sep-99	PhilipLa	Created
//
//----------------------------------------------------------------------------

#ifndef __SECTION_HXX__
#define __SECTION_HXX__

#include "filelist.hxx"

class CSection
{
public:
    inline CSection();
    inline ~CSection();
    
    inline const TCHAR * GetSectionTitle(void) const;
    inline DWORD SetSectionTitle(const TCHAR *ptsName);

    inline const TCHAR * GetSectionPath(void) const;
    inline DWORD SetSectionPath(const TCHAR *ptsName);
    inline DWORD GetSectionPathLength(void) const;

    inline const TCHAR * GetSectionDest(void) const;
    inline DWORD SetSectionDest(const TCHAR *ptsDest);
    inline DWORD GetSectionDestLength(void) const;

    inline DWORD SetName(const TCHAR *ptsName,
                         DWORD *pdwIndex,
                         BOOL fDeconstruct);
    inline DWORD SetDestination(const TCHAR *ptsName, DWORD dwIndex);
    inline ULONG GetNameCount(void) const;
    
    inline const TCHAR * GetFullFileName(ULONG i) const;
    inline const TCHAR * GetDestination(ULONG i) const;

    inline void AddToList(CSection *pcsSection);
    inline CSection * GetNextSection(void) const;
    
private:
    TCHAR _tsSectionName[MAX_PATH + 1];

    TCHAR _tsSectionPath[MAX_PATH + 1];
    DWORD _dwSectionPathLength;

    TCHAR _tsSectionDest[MAX_PATH + 1];
    DWORD _dwSectionDestLength;

    CFileList _cfl;
    CSection *_pcsNext;
};

inline CSection::CSection()
{
    _tsSectionName[0] = 0;
    _tsSectionPath[0] = 0;
    _tsSectionDest[0] = 0;
    _dwSectionPathLength = 0;
    _dwSectionDestLength = 0;
    _pcsNext = NULL;
}

inline CSection::~CSection()
{
    FreeFileList(_cfl.GetNextFileList());
}

inline const TCHAR * CSection::GetSectionTitle(void) const
{
    return _tsSectionName;
}

inline DWORD CSection::SetSectionTitle(const TCHAR *ptsName)
{
    DWORD dwLen = _tcslen(ptsName);

    if (dwLen > MAX_PATH)
    {
        if (DebugOutput)
            Win32Printf(LogFile, "Error: ptsName too long %s\r\n", ptsName);
        return ERROR_FILENAME_EXCED_RANGE;
    }
    _tcscpy(_tsSectionName, ptsName);

    //Go through some additional trickery to remove trailing backslashes,
    //since the output .inf file uses a backslash as a line continuation
    //character
    if (_tsSectionName[dwLen - 1] == TEXT('\\'))
    {
        _tsSectionName[dwLen - 1] = 0;
    }
    return ERROR_SUCCESS;
}

inline const TCHAR * CSection::GetSectionPath(void) const
{
    return _tsSectionPath;
}

inline DWORD CSection::SetSectionPath(const TCHAR *ptsName)
{
    DWORD dwLen = _tcslen(ptsName);

    if (dwLen > MAX_PATH)
    {
        if (DebugOutput)
            Win32Printf(LogFile, "Error: ptsName too long %s\r\n", ptsName);
        return ERROR_FILENAME_EXCED_RANGE;
    }
    _tcscpy(_tsSectionPath, ptsName);
    _dwSectionPathLength = _tcslen(_tsSectionPath);
    if (_tsSectionPath[_dwSectionPathLength - 1] == TEXT('\\'))
    {
        _tsSectionPath[_dwSectionPathLength - 1] = 0;
        _dwSectionPathLength--;
    }
    return ERROR_SUCCESS;
}

inline DWORD CSection::GetSectionPathLength(void) const
{
    return _dwSectionPathLength;
}


inline const TCHAR * CSection::GetSectionDest(void) const
{
    return _tsSectionDest;
}

inline DWORD CSection::SetSectionDest(const TCHAR *ptsName)
{
    DWORD dwLen = _tcslen(ptsName);

    if (dwLen > MAX_PATH)
    {
        if (DebugOutput)
            Win32Printf(LogFile, "Error: ptsName too long %s\r\n", ptsName);
        return ERROR_FILENAME_EXCED_RANGE;
    }
    _tcscpy(_tsSectionDest, ptsName);
    _dwSectionDestLength = _tcslen(_tsSectionDest);
    if (_tsSectionDest[_dwSectionDestLength - 1] == TEXT('\\'))
    {
        _tsSectionDest[_dwSectionDestLength - 1] = 0;
        _dwSectionDestLength--;
    }
    return ERROR_SUCCESS;
}

inline DWORD CSection::GetSectionDestLength(void) const
{
    return _dwSectionDestLength;
}

inline DWORD CSection::SetName(const TCHAR *ptsName,
                               DWORD *pdwIndex,
                               BOOL fDeconstruct)
{
    return _cfl.SetName(ptsName, pdwIndex, fDeconstruct);
}

inline DWORD CSection::SetDestination(const TCHAR *ptsName, DWORD dwIndex)
{
    return _cfl.SetDestination(ptsName, dwIndex);
}

inline ULONG CSection::GetNameCount(void) const
{
    return _cfl.GetNameCount();
}

inline const TCHAR * CSection::GetFullFileName(ULONG i) const
{
    return _cfl.GetFullName(i);
}

inline const TCHAR * CSection::GetDestination(ULONG i) const
{
    return _cfl.GetDestination(i);
}

inline void CSection::AddToList(CSection *pcsNew)
{
    CSection *pcs = this;
    while (pcs->_pcsNext != NULL)
    {
        pcs = pcs->_pcsNext;
    }
    pcs->_pcsNext = pcsNew;
}

inline CSection * CSection::GetNextSection(void) const
{
    return _pcsNext;
}
    
inline void FreeSectionList(CSection *pcs)
{
    CSection *pcsNext;
    while (pcs != NULL)
    {
        pcsNext = pcs->GetNextSection();
        delete pcs;
        pcs = pcsNext;
    }
}

#endif // #ifndef __SECTION_HXX__