|
|
// TSNameValueMgr.cpp: implementation of the CTSNameValueMgr class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TSNameValueMgr.h"
#include "apgtsassert.h"
#include "functions.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CTSNameValueMgr::CTSNameValueMgr(const VARIANT& name, const VARIANT& value, int count) : m_bIsValid(true), m_pvarNames(NULL), m_pvarValues(NULL), m_nCount(count) { try { Initialize(name, value, count); FormDataFromArray(); } catch (exception& /*x*/) { // catch custom exception (our custon exceptions are normally inherited from STL exception class
m_bIsValid = false; /*
CString str; CBuildSrcFileLinenoStr SrcLoc( __FILE__, __LINE__ ); CEvent::ReportWFEvent( SrcLoc.GetSrcFileLineStr(), SrcLoc.GetSrcFileLineStr(), CCharConversion::ConvertACharToString(x.what(), str), _T(""), EV_GTS_STL_EXCEPTION ); */ } }
CTSNameValueMgr::CTSNameValueMgr(const CArrNameValue& arr) : m_bIsValid(true), m_pvarNames(NULL), m_pvarValues(NULL), m_nCount(arr.size()), m_arrNameValue(arr) { FormDataFromArray(); }
CTSNameValueMgr::CTSNameValueMgr() : m_bIsValid(true), m_pvarNames(NULL), m_pvarValues(NULL), m_nCount(0) { }
CTSNameValueMgr::~CTSNameValueMgr() { }
void CTSNameValueMgr::Initialize(const VARIANT& varCmds, const VARIANT& varVals, int size) { USES_CONVERSION;
const VARIANT* pVarCmds; const VARIANT* pVarVals;
if (VT_BYREF == (VT_BYREF & varCmds.vt) && // ???
VT_VARIANT == (VT_VARIANT & varCmds.vt)) { if (VT_ARRAY == (VT_ARRAY & varCmds.vt)) pVarCmds = &varCmds; else pVarCmds = varCmds.pvarVal; } else { pVarCmds = NULL; CString str = _T("Cmd parameters from VB were not a variant or not by ref."); ASSERT(FALSE); throw exception((const char*)str); } if (VT_BYREF == (VT_BYREF & varVals.vt) && // ???
VT_VARIANT == (VT_VARIANT & varVals.vt)) { if (VT_ARRAY == (VT_ARRAY & varVals.vt)) pVarVals = &varVals; else pVarVals = varVals.pvarVal; } else { pVarVals = NULL; CString str = _T("Cmd parameters from VB were not a variant or not by ref."); ASSERT(FALSE); throw exception((const char*)str); }
if (VT_BYREF != (VT_BYREF & pVarCmds->vt) || VT_ARRAY != (VT_ARRAY & pVarCmds->vt) || VT_VARIANT != (0xFFF & pVarCmds->vt)) { CString str = _T("Wrong Cmd parameters passed from VB."); ASSERT(FALSE); throw exception((const char*)str); }
if (VT_BYREF != (VT_BYREF & pVarVals->vt) || VT_ARRAY != (VT_ARRAY & pVarVals->vt) || VT_VARIANT != (0xFFF & pVarVals->vt)) { CString str = _T("Wrong Cmd parameters passed from VB."); ASSERT(FALSE); throw exception((const char*)str); }
SAFEARRAY *pArrCmds = *(pVarCmds->pparray); SAFEARRAY *pArrVals = *(pVarVals->pparray);
if (0 != pArrCmds->rgsabound[0].lLbound || 0 != pArrVals->rgsabound[0].lLbound) { CString str = _T("Wrong Cmd parameters passed from VB. Lower bounds are wrong."); ASSERT(FALSE); throw exception((const char*)str); } if (pArrCmds->rgsabound[0].cElements != pArrVals->rgsabound[0].cElements) { CString str = _T("Wrong Cmd parameters passed from VB. Cmds upperbound != Vals upperbound."); ASSERT(FALSE); throw exception((const char*)str); }
m_nCount = size; m_pvarNames = (VARIANT *) pArrCmds->pvData; m_pvarValues = (VARIANT *) pArrVals->pvData;
if (0 != m_nCount) { if (m_pvarNames->vt != VT_BSTR || m_pvarValues->vt != VT_BSTR) { CString str; str.Format(_T("Wrong Cmd parameters passed from VB. Array of unexpected type.\n\n") _T("Cmd Type: %s\nVal Type: %s"), (LPCTSTR) DecodeVariantTypes(m_pvarNames->vt), (LPCTSTR) DecodeVariantTypes(m_pvarValues->vt)); ASSERT(FALSE); throw exception((const char*)str); } }
m_arrNameValue.clear(); m_strData = _T(""); // Extract the last name in order to check and remove any previous references to that name.
// If there is only one name, there is no need to extract the name.
CString strLastName; if (m_nCount > 1) strLastName= W2T( m_pvarNames[ m_nCount - 1 ].bstrVal );
for (int i = 0; i < m_nCount; i++) { CString name = W2T(m_pvarNames[i].bstrVal); CString value = W2T(m_pvarValues[i].bstrVal);
if (0 == _tcsicmp(name, _T("TShootProblem"))) name = _T("ProblemAsk");
if (i == 0) // "value" contains network name
value.MakeLower(); // for compatibility with Online TS, where network name
// is forced lower case
// Check if we need to remove any previous reference to the last name.
if ((i == (m_nCount - 1)) || (strLastName != name)) { CNameValue name_value; name_value.strName = name; name_value.strValue = value; m_arrNameValue.push_back(name_value); } } }
bool CTSNameValueMgr::IsValid() const { return m_bIsValid; }
const CString& CTSNameValueMgr::GetData() const { return m_strData; }
int CTSNameValueMgr::GetCount() const { return m_nCount; }
CNameValue CTSNameValueMgr::GetNameValue(int i) const { if (i < 0 || i >= m_arrNameValue.size()) return CNameValue(); return m_arrNameValue[i]; }
void CTSNameValueMgr::FormDataFromArray() { m_strData = _T("");
for (CArrNameValue::iterator i = m_arrNameValue.begin(); i != m_arrNameValue.end(); i++) { m_strData += (*i).strName; m_strData += _T("="); m_strData += (*i).strValue; if (i != m_arrNameValue.end() - 1/*??? or decrement???*/) // it is not last pass through the loop
m_strData += _T("&"); } }
|