/**************************************************************************** Copyright (c) 1998-1999 Microsoft Corporation Module Name: rules.cpp Abstract: Rules Object implementation Author: noela - 09/11/98 Notes: Rev History: ****************************************************************************/ //#define unicode #include #include #include "tapi.h" #include "tspi.h" #include "utils.h" #include "client.h" #include "rules.h" /**************************************************************************** Class : CRuleSet Method : Constructer ****************************************************************************/ CRuleSet::CRuleSet() { m_pszInternationalRule = NULL; m_pszLongDistanceRule = NULL; m_pszLocalRule = NULL; } /**************************************************************************** Class : CRuleSet Method : Destructer Clean up memory allocations ****************************************************************************/ CRuleSet::~CRuleSet() { if ( m_pszInternationalRule != NULL ) { ClientFree(m_pszInternationalRule); } if ( m_pszLongDistanceRule != NULL ) { ClientFree(m_pszLongDistanceRule); } if ( m_pszLocalRule != NULL ) { ClientFree(m_pszLocalRule); } } /**************************************************************************** Class : CRuleSet Method : Initialize ****************************************************************************/ STDMETHODIMP CRuleSet::Initialize ( PWSTR pszInternationalRule, PWSTR pszLongDistanceRule, PWSTR pszLocalRule ) { ////////////////////////////////////////////////// // copy the international Rule // m_pszInternationalRule = ClientAllocString( pszInternationalRule ); if (m_pszInternationalRule == NULL) { LOG(( TL_ERROR, "Initialize create m_pszInternationalRule failed" )); return E_OUTOFMEMORY; } ////////////////////////////////////////////////// // copy the long Distance Rule // m_pszLongDistanceRule = ClientAllocString( pszLongDistanceRule ); if (m_pszLongDistanceRule == NULL) { ClientFree(m_pszInternationalRule); LOG(( TL_ERROR, "Initialize create m_pszLongDistanceRule failed" )); return E_OUTOFMEMORY; } ////////////////////////////////////////////////// // copy the local Rule // m_pszLocalRule = ClientAllocString( pszLocalRule ); if (m_pszLocalRule == NULL) { ClientFree(m_pszInternationalRule); ClientFree(m_pszLongDistanceRule); LOG(( TL_ERROR, "Initialize create m_pszLocalRule failed" )); return E_OUTOFMEMORY; } return S_OK; } /**************************************************************************** /**************************************************************************** /**************************************************************************** Class : CAreaCodeRule Method : Constructer ****************************************************************************/ CAreaCodeRule::CAreaCodeRule() { m_pszAreaCode = NULL; m_pszNumberToDial = NULL; m_pszzPrefixList = NULL; } /**************************************************************************** Class : CAreaCodeRule Method : Destructer Clean up memory allocations ****************************************************************************/ CAreaCodeRule::~CAreaCodeRule() { if ( m_pszAreaCode != NULL ) { ClientFree(m_pszAreaCode); } if ( m_pszNumberToDial != NULL ) { ClientFree(m_pszNumberToDial); } if ( m_pszzPrefixList != NULL ) { ClientFree(m_pszzPrefixList); } } /**************************************************************************** Class : CAreaCodeRule Method : Initialize ****************************************************************************/ STDMETHODIMP CAreaCodeRule::Initialize ( PWSTR pszAreaCode, PWSTR pszNumberToDial, DWORD dwOptions, PWSTR pszzPrefixList, DWORD dwPrefixListSize ) { HRESULT hr = S_OK; ////////////////////////////////////////////////// // copy the AreaCode // m_pszAreaCode = ClientAllocString( pszAreaCode ); if (m_pszAreaCode == NULL) { LOG(( TL_ERROR, "Initialize create m_pszAreaCode failed" )); return E_OUTOFMEMORY; } m_pszNumberToDial = ClientAllocString( pszNumberToDial ); if (m_pszNumberToDial == NULL) { LOG(( TL_ERROR, "Initialize create m_pszNumberToDial failed" )); return E_OUTOFMEMORY; } m_dwOptions = dwOptions; SetPrefixList(pszzPrefixList, dwPrefixListSize); return hr; } /**************************************************************************** Class : CAreaCodeRule Method : SetAreaCode ****************************************************************************/ STDMETHODIMP CAreaCodeRule::SetAreaCode(PWSTR pszAreaCode) { HRESULT hr = S_OK; if (m_pszAreaCode != NULL) { ClientFree(m_pszAreaCode); m_pszAreaCode = NULL; } if(pszAreaCode != NULL) { m_pszAreaCode = ClientAllocString( pszAreaCode ); if (m_pszAreaCode == NULL) { LOG(( TL_ERROR, "SetAreaCode - alloc failed" )); hr = E_OUTOFMEMORY; } } return hr; } /**************************************************************************** Class : CAreaCodeRule Method : SetAreaCode ****************************************************************************/ STDMETHODIMP CAreaCodeRule::SetNumberToDial(PWSTR pszNumberToDial) { HRESULT hr = S_OK; if (m_pszNumberToDial != NULL) { ClientFree(m_pszNumberToDial); m_pszNumberToDial = NULL; } if(pszNumberToDial != NULL) { m_pszNumberToDial = ClientAllocString( pszNumberToDial ); if (m_pszNumberToDial == NULL) { LOG(( TL_ERROR, "SetNumberToDial - alloc failed" )); hr = E_OUTOFMEMORY; } } return hr; } /**************************************************************************** Class : CAreaCodeRule Method : SetPrefixList ****************************************************************************/ STDMETHODIMP CAreaCodeRule::SetPrefixList(PWSTR pszzPrefixList, DWORD dwSize) { HRESULT hr = S_OK; if (m_pszzPrefixList != NULL) { ClientFree(m_pszzPrefixList); m_pszzPrefixList = NULL; m_dwPrefixListSize = 0; } if(pszzPrefixList != NULL) { m_pszzPrefixList = (PWSTR) ClientAlloc(dwSize); if (m_pszzPrefixList != NULL) { CopyMemory(m_pszzPrefixList, pszzPrefixList, dwSize); // set the size ! m_dwPrefixListSize = dwSize; } else { LOG(( TL_ERROR, "SetPrefixList - alloc failed" )); hr = E_OUTOFMEMORY; } } return hr; } /**************************************************************************** Class : CAreaCodeRule Method : UseCallingCard ****************************************************************************/ void CAreaCodeRule::SetDialAreaCode(BOOL bDa) { if(bDa) { m_dwOptions |= RULE_DIALAREACODE; } else { m_dwOptions &= ~RULE_DIALAREACODE; } } /**************************************************************************** Class : CAreaCodeRule Method : UseCallingCard ****************************************************************************/ void CAreaCodeRule::SetDialNumber(BOOL bDn) { if(bDn) { m_dwOptions |= RULE_DIALNUMBER; } else { m_dwOptions &= ~RULE_DIALNUMBER; } } /**************************************************************************** Class : CAreaCodeRule Method : UseCallingCard ****************************************************************************/ void CAreaCodeRule::SetAppliesToAllPrefixes(BOOL bApc) { if(bApc) { m_dwOptions |= RULE_APPLIESTOALLPREFIXES; } else { m_dwOptions &= ~RULE_APPLIESTOALLPREFIXES; } } /**************************************************************************** Class : CAreaCodeRule Method : TapiSize Number of bytes needed to pack this into a TAPI structure to send to TAPISRV ****************************************************************************/ DWORD CAreaCodeRule::TapiSize() { DWORD dwSize=0; // Calc size ofArea Code Rule dwSize = sizeof(AREACODERULE); dwSize += ALIGN((lstrlenW(m_pszAreaCode) + 1) * sizeof(WCHAR)); dwSize += ALIGN((lstrlenW(m_pszNumberToDial) + 1) * sizeof(WCHAR)); dwSize += ALIGN(m_dwPrefixListSize); return dwSize; } /**************************************************************************** /**************************************************************************** /**************************************************************************** Function : CreateDialingRule Create TAPI dialing rule - "xxxxFG" from number to dial & area code if required & subcriber number ****************************************************************************/ STDMETHODIMP CreateDialingRule ( PWSTR * pszRule, PWSTR pszNumberToDial, BOOL bDialAreaCode ) { HRESULT hr = S_OK; PWSTR pszRule1= NULL; ////////////////////////////////////////////////// // Create the dialing Rule // alloc enough space for number + "FG" // pszRule1 = (PWSTR) ClientAlloc( (lstrlenW(pszNumberToDial) + 3 ) * sizeof (WCHAR) ); if (pszRule1 != NULL) { // copy number "xxxx" if(pszNumberToDial != NULL) { lstrcpyW(pszRule1, pszNumberToDial); } // Area code ? "xxxxF" if (bDialAreaCode) { lstrcatW(pszRule1, L"F"); } // Subcriber Nmber "xxxxFG" or "xxxxG" lstrcatW(pszRule1, L"G"); } else { LOG(( TL_ERROR, "CreateDialingRule - Alloc pszRule failed" )); hr = E_OUTOFMEMORY; } *pszRule = pszRule1; return hr; } /**************************************************************************** Function : ClientAllocString Copys string. Allocate space for new string using ClientAlloc Returns pointer to new string or NULL ****************************************************************************/ #if DBG PWSTR ClientAllocStringReal(PCWSTR psz, DWORD dwLine, PSTR pszFile ) #else PWSTR ClientAllocStringReal(PCWSTR psz ) #endif { PWSTR pszNewString = NULL; if (psz != NULL) { #if DBG pszNewString = (PWSTR) ClientAllocReal((lstrlenW(psz)+1)* sizeof (WCHAR),dwLine,pszFile ); #else pszNewString = (PWSTR) ClientAlloc((lstrlenW(psz)+1)* sizeof (WCHAR) ); #endif if (pszNewString != NULL) { lstrcpyW(pszNewString, psz); } else { LOG(( TL_ERROR, "ClientAllocString Alloc string failed" )); } } return pszNewString; }