/*****************************************************************************
* Copyright (c) 1990-98 Digi International Inc., All Rights Reserved
* 
* This software contains proprietary and confidential information of Digi
* International Inc.  By accepting transfer of this copy, Recipient agrees
* to retain this software in confidence, to prevent disclosure to others,
* and to make no use of this software other than that for which it was
* delivered.  This is an unpublished copyrighted work of Digi International
* Inc.  Except as permitted by federal law, 17 USC 117, copying is strictly
* prohibited.
* 
* Restricted Rights Legend
*
* Use, duplication, or disclosure by the Government is subject to
* restrictions set forth in sub-paragraph (c)(1)(ii) of The Rights in
* Technical Data and Computer Software clause at DFARS 252.227-7031 or
* subparagraphs (c)(1) and (2) of the Commercial Computer Software -
* Restricted Rights at 48 CFR 52.227-19, as applicable.
*
* Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
*
*****************************************************************************/


// Service.cpp: implementation of the CService class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Service.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNAMIC(CService, CConfigObject)

CService::CService(HKEY const hKeyRoot, CString const & strRegPath, CConfigObject const * const pParent) : CConfigObject(hKeyRoot, strRegPath, pParent)
{
   try
   {
      AffirmThrow(m_hKey != NULL);
      AffirmThrow(pParent != NULL);
      SetType(CConfigObject::SERVICE);

     CLine * pLine = (CLine *)pParent->GetParent();
     AffirmThrow(pLine != NULL);

     CAdapter * pAdapter = (CAdapter *)pLine->GetParent();
     AffirmThrow(pLine != NULL);

     m_dwSnid = pLine->GetSnid();

	 m_intVAdapterNumber = pAdapter->GetVAdapterNum();

	 m_intLineNumber =  pLine->GetLineNumber();

	 TRACE("**** CService::Get Snid           = %d ***** \n",m_dwSnid);
	 TRACE("**** CService::Get GetVAdapterNum = %d ***** \n",m_intVAdapterNumber);
	 TRACE("**** CService::Get GetLineNumber  = %d ***** \n",m_intLineNumber);
   }
   catch (CAffirmException ae)
   {
   }
}

CService::~CService()
{
   try
   {
   }
   catch (CAffirmException ae)
   {
   }
}

//////////////////////////////////////////////////////////////////////
// Get/Set parameters
//////////////////////////////////////////////////////////////////////

BOOL CService::GetParameters(void)
{
   BOOL fSuccess = FALSE;

   try
   {
	  // added for DataFire Prime adapters
      TRACE("**** CService::Get m_dwSnid = %d ***** \n",m_dwSnid);
	  if ((m_dwSnid & 0xffff) >= 0x40)
		  m_dwSnid -= 0x40;

      fSuccess = TRUE;
   }
   catch (CAffirmException ae)
   {
   }

   return fSuccess;
}

BOOL CService::SetParameters(void)
{
   BOOL fSuccess = FALSE;

   try
   {
      AffirmThrow(CConfigObject::SetParameters());

	  CConfigObject* pParent = GetParent();  // Get Protocol
	  AffirmThrow(pParent != NULL);
	  pParent = pParent->GetParent();		 // Get Line
	  AffirmThrow(pParent != NULL);
	  pParent = pParent->GetParent();		 // Get Adapter
	  AffirmThrow(pParent != NULL);
	  
	  CString strIdent(pParent->GetIdentity());
	  if (!strIdent.CompareNoCase(DXB_REGVAL_ADAPTER_ENUM_PRIME_T1_PCI) ||
		  !strIdent.CompareNoCase(DXB_REGVAL_ADAPTER_ENUM_PRIME_E1_PCI) ||
		  !strIdent.CompareNoCase(DXB_REGVAL_ADAPTER_ENUM_PRIME_ISA))
	  {
		  TRACE("**** CService::Set m_dwSnid = %d ***** \n",m_dwSnid);
		  DWORD dwSnid = m_dwSnid + 0x40;
		  AffirmThrow(RegWriteDWordValue(m_hKey, DXB_REGVAL_LINE_SNID, dwSnid));
		  AffirmThrow(RegWriteDWordValue(m_hKey, DXB_REGVAL_LEGACY_API, 1));
	  }
	  else
		AffirmThrow(RegWriteDWordValue(m_hKey, DXB_REGVAL_LINE_SNID, m_dwSnid));


      fSuccess = TRUE;
   }
   catch (CAffirmException ae)
   {
   }

   return fSuccess;
}

BOOL CService::RemoveParameters(BOOL fRemoveKey /* = FALSE */)
{
   BOOL fSuccess = FALSE;

   try
   {
      AffirmThrow(RegDelValue(m_hKey, DXB_REGVAL_LINE_SNID));

      AffirmThrow(CConfigObject::RemoveParameters(fRemoveKey));

      fSuccess = TRUE;
   }
   catch (CAffirmException ae)
   {
   }

   return fSuccess;
}

//////////////////////////////////////////////////////////////////////
// Config data
//////////////////////////////////////////////////////////////////////

BOOL CService::GetConfigData(void)
{
   BOOL fSuccess = FALSE;

   try
   {
      CString strConfigDataRegPath;
      AffirmThrow(BuildConfigDataRegPath(strConfigDataRegPath));

      HKEY hConfigData = NULL;
      AffirmThrow(RegOpenKey(HKEY_LOCAL_MACHINE, strConfigDataRegPath, &hConfigData));
      AffirmThrow(hConfigData != NULL);

      try
      {
         AffirmThrow(RegReadIntValue(hConfigData, DXB_REGVAL_MAX_PORTS, &m_cMaxPorts));
      }
      catch (CAffirmException ae)
      {
      }

      RegCloseKey(hConfigData);

      fSuccess = TRUE;
   }
   catch (CAffirmException ae)
   {
   }

   return fSuccess;
}
