|
|
//=============================================================================
// File: intcat.cpp
// Author: a-jammar
// Covers: GATH_VALUE, GATH_FIELD, GATH_LINESPEC, GATH_LINE,
// INTERNAL_CATEGORY
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// This file contains the support methods for the INTERNAL_CATERORY struct
// and its related structs, including some constructors and destructors, and
// dump routines to output the contents of the structs. The gathint.h include
// file describes how these structures interrelate.
//
// Also contains some utility functions.
//=============================================================================
#include "stdafx.h"
#include "gather.h"
#include "gathint.h"
//-----------------------------------------------------------------------------
// Here are the constructor and destructor for the internal category struct,
// and some of the structures used within it.
//-----------------------------------------------------------------------------
// INTERNAL_CATEGORY constructor and destructor.
//-----------------------------------------------------------------------------
INTERNAL_CATEGORY::INTERNAL_CATEGORY() { m_categoryName.m_strText = CString(" "); m_fieldName.m_strFormat = CString(" "); m_strEnumerateClass = CString(""); m_strIdentifier = CString(""); m_strNoInstances = CString(""); m_fListView = FALSE; m_fDynamic = FALSE; m_dwID = 0; m_dwParentID = 0; m_dwChildID = 0; m_dwPrevID = 0; m_dwNextID = 0; m_dwDynamicChildID = 0; m_dwColCount = 0; m_pColSpec = NULL; m_aCols = NULL; m_pLineSpec = NULL; m_dwLineCount = 0; m_apLines = NULL; m_fIncluded = TRUE; m_fRefreshed = FALSE; m_dwLastError = GATH_ERR_NOERROR; }
INTERNAL_CATEGORY::~INTERNAL_CATEGORY() { if (m_pColSpec) delete m_pColSpec;
if (m_aCols) delete [] m_aCols;
if (m_pLineSpec) delete m_pLineSpec;
if (m_apLines) { for (DWORD dwIndex = 0; dwIndex < m_dwLineCount; dwIndex++) delete m_apLines[dwIndex]; delete [] m_apLines; } }
//-----------------------------------------------------------------------------
// GATH_FIELD constructor and destructor.
//-----------------------------------------------------------------------------
GATH_FIELD::GATH_FIELD() { m_pArgs = NULL; m_pNext = NULL; m_usWidth = 0; m_sort = NOSORT; m_datacomplexity = BASIC; }
GATH_FIELD::~GATH_FIELD() { if (m_pArgs) delete m_pArgs; if (m_pNext) delete m_pNext; }
//-----------------------------------------------------------------------------
// GATH_VALUE constructor and destructor.
//-----------------------------------------------------------------------------
GATH_VALUE::GATH_VALUE() { m_pNext = NULL; m_dwValue = 0L; }
GATH_VALUE::~GATH_VALUE() { if (m_pNext) delete m_pNext; }
//-----------------------------------------------------------------------------
// GATH_LINESPEC constructor and destructor.
//-----------------------------------------------------------------------------
GATH_LINESPEC::GATH_LINESPEC() { m_pFields = NULL; m_pEnumeratedGroup = NULL; m_pConstraintFields = NULL; m_pNext = NULL; m_datacomplexity = BASIC; }
GATH_LINESPEC::~GATH_LINESPEC() { if (m_pFields) delete m_pFields;
if (m_pEnumeratedGroup) delete m_pEnumeratedGroup;
if (m_pConstraintFields) delete m_pConstraintFields;
if (m_pNext) delete m_pNext; }
//-----------------------------------------------------------------------------
// GATH_LINE constructor and destructor.
//-----------------------------------------------------------------------------
GATH_LINE::GATH_LINE() { m_datacomplexity = BASIC; m_aValue = NULL; }
GATH_LINE::~GATH_LINE() { if (m_aValue) delete [] m_aValue; }
//-----------------------------------------------------------------------------
// Dump a category and all its children. Indent by the current iIndent level.
//-----------------------------------------------------------------------------
#if _DEBUG
void INTERNAL_CATEGORY::DumpCategoryRecursive(int iIndent, CDataGatherer * pGatherer) { TCHAR szIndent[100]; INTERNAL_CATEGORY * pNextCat; int i;
for (i = 0; i < iIndent; i++) szIndent[i] = _T(' '); szIndent[iIndent] = 0;
// Dump the contents of this category.
TRACE1("%sCATEGORY(", szIndent); TRACE1("m_categoryName = %s", this->m_categoryName.m_strText); TRACE0(")-----------------------------\n"); TRACE2("%sm_fieldName = %s\n", szIndent, DumpField(&this->m_fieldName)); TRACE2("%sm_strIdentifier = %s\n", szIndent, this->m_strIdentifier); TRACE2("%sm_strEnumerateClass = %s\n", szIndent, this->m_strEnumerateClass); TRACE2("%sm_strNoInstances = %s\n", szIndent, this->m_strNoInstances); TRACE2("%sm_fListView = %s\n", szIndent, (this->m_fListView ? "TRUE" : "FALSE")); TRACE2("%sm_fDynamic = %s\n", szIndent, (this->m_fDynamic ? "TRUE" : "FALSE")); TRACE2("%sm_dwID = %ld\n", szIndent, this->m_dwID); TRACE2("%sm_dwParentID = %ld\n", szIndent, this->m_dwParentID); TRACE2("%sm_dwChildID = %ld\n", szIndent, this->m_dwChildID); TRACE2("%sm_dwDynamicChildID = %ld\n", szIndent, this->m_dwDynamicChildID); TRACE2("%sm_dwNextID = %ld\n", szIndent, this->m_dwNextID); TRACE2("%sm_dwPrevID = %ld\n", szIndent, this->m_dwPrevID);
TRACE1("%sm_pColSpec = ", szIndent); for (GATH_FIELD * pField = this->m_pColSpec; pField; pField = pField->m_pNext) TRACE1("%s ", DumpField(pField)); TRACE0("\n");
TRACE2("%sm_dwColCount = %ld\n", szIndent, this->m_dwColCount); TRACE1("%sm_aCols = ", szIndent); for (i = 0; i < (int)this->m_dwColCount; i++) TRACE1("(%s) ", this->m_aCols[i].m_strText); TRACE0("\n");
TRACE1("%sm_pLineSpec =\n", szIndent); for (GATH_LINESPEC * pLine = this->m_pLineSpec; pLine; pLine = pLine->m_pNext) TRACE2("%s %s\n", szIndent, DumpLineSpec(pLine, szIndent));
TRACE2("%sm_dwLineCount = %ld\n", szIndent, this->m_dwLineCount); TRACE1("%sm_apLines = \n", szIndent); for (i = 0; i < (int)this->m_dwLineCount; i++) TRACE2("%s %s\n", szIndent, DumpLine(this->m_apLines[i], this->m_dwColCount));
// Dump the children of this category.
if (this->m_dwChildID) { pNextCat = pGatherer->GetInternalRep(this->m_dwChildID); if (pNextCat) pNextCat->DumpCategoryRecursive(iIndent + 2, pGatherer); }
// Dump the siblings of this category.
if (this->m_dwNextID) { pNextCat = pGatherer->GetInternalRep(this->m_dwNextID); if (pNextCat) pNextCat->DumpCategoryRecursive(iIndent, pGatherer); } }
//-----------------------------------------------------------------------------
// Return a string containing the text dump of a field variable.
//-----------------------------------------------------------------------------
CString INTERNAL_CATEGORY::DumpField(GATH_FIELD * pField) { CString strDump;
strDump.Format(_T("(%s, %s, %d"), pField->m_strSource, pField->m_strFormat, pField->m_usWidth); for (GATH_VALUE * pArg = pField->m_pArgs; pArg; pArg = pArg->m_pNext) strDump += CString(", ") + pArg->m_strText; strDump += CString(")");
return strDump; }
//-----------------------------------------------------------------------------
// Return a string containing the text dump of a line specifier variable.
//-----------------------------------------------------------------------------
CString INTERNAL_CATEGORY::DumpLineSpec(GATH_LINESPEC * pLineSpec, CString strIndent) { CString strDump; if (pLineSpec->m_strEnumerateClass.IsEmpty() || pLineSpec->m_strEnumerateClass.CompareNoCase(CString(STATIC_SOURCE)) == 0) { strDump = CString("LineSpec = "); for (GATH_FIELD * pField = pLineSpec->m_pFields; pField; pField = pField->m_pNext) strDump += DumpField(pField) + CString(" "); } else { strDump.Format(_T("EnumLines(%s) = "), pLineSpec->m_strEnumerateClass);
GATH_LINESPEC * pEnumLine = pLineSpec->m_pEnumeratedGroup; if /* while TBD */ (pEnumLine) { strDump += CString("\n ") + strIndent + DumpLineSpec(pEnumLine, strIndent); pEnumLine = pEnumLine->m_pNext; } }
return strDump; }
//-----------------------------------------------------------------------------
// Return a string containing the text dump of a line variable.
//-----------------------------------------------------------------------------
CString INTERNAL_CATEGORY::DumpLine(GATH_LINE * pLine, DWORD nColumns) { CString strDump("Line = "); for (DWORD dwIndex = 0; dwIndex < nColumns; dwIndex++) strDump += pLine->m_aValue[dwIndex].m_strText + CString(" "); return strDump; }
#endif
//-----------------------------------------------------------------------------
// This utility function is used to get a token from the front of a string.
// It searches through strString for cDelimiter, returning the token found
// in strToken. strString is modified to remove the token returned, and
// the delimiter character. TBD: inefficient.
//-----------------------------------------------------------------------------
void GetToken(CString & strToken, CString & strString, TCHAR cDelimiter) { int iDelimiter = strString.Find(cDelimiter);
if (iDelimiter == -1) strToken = strString; else strToken = strString.Left(iDelimiter);
// Remove the token we found from strString.
if (!strToken.IsEmpty()) { if (strString.GetLength() >= strToken.GetLength()) strString = strString.Right(strString.GetLength() - strToken.GetLength()); else strString.Empty(); }
// Remove any leading delimiter characters from strString.
while (!strString.IsEmpty() && strString[0] == cDelimiter) strString = strString.Right(strString.GetLength() - 1); }
|