📄 portaddr.cpp
字号:
/* ***** BEGIN LICENSE BLOCK ***** * Source last modified: $Id: portaddr.cpp,v 1.8.20.3 2004/07/09 01:48:16 hubbe Exp $ * * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. * * The contents of this file, and the files included with this file, * are subject to the current version of the RealNetworks Public * Source License (the "RPSL") available at * http://www.helixcommunity.org/content/rpsl unless you have licensed * the file under the current version of the RealNetworks Community * Source License (the "RCSL") available at * http://www.helixcommunity.org/content/rcsl, in which case the RCSL * will apply. You may also obtain the license terms directly from * RealNetworks. You may not use this file except in compliance with * the RPSL or, if you have a valid RCSL with RealNetworks applicable * to this file, the RCSL. Please see the applicable RPSL or RCSL for * the rights, obligations and limitations governing use of the * contents of the file. * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL") in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your version of * this file only under the terms of the GPL, and not to allow others * to use your version of this file under the terms of either the RPSL * or RCSL, indicate your decision by deleting the provisions above * and replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient may * use your version of this file under the terms of any one of the * RPSL, the RCSL or the GPL. * * This file is part of the Helix DNA Technology. RealNetworks is the * developer of the Original Code and owns the copyrights in the * portions it created. * * This file, and the files included with this file, is distributed * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET * ENJOYMENT OR NON-INFRINGEMENT. * * Technology Compatibility Kit Test Suite(s) Location: * http://www.helixcommunity.org/content/tck * * Contributor(s): * * ***** END LICENSE BLOCK ***** */#include "hxcom.h"#if defined (_UNIX) || defined (_WIN16)#include <stdlib.h>#endif#include "hxcomm.h"#include "hxslist.h"#include "hxstring.h"#include "hxstrutl.h"#include "hxbuffer.h"#include "hxprefs.h"#include "netbyte.h"#include "portaddr.h"#include "hxheap.h"#ifdef _DEBUG#undef HX_THIS_FILE static const char HX_THIS_FILE[] = __FILE__;#endifHX_RESULTReadUDPPorts(IHXBuffer* pBuffer, REF(CHXSimpleList*) pUDPPortList){ HX_RESULT hr = HXR_OK; int i = 0; UINT16 iPort = 0; BOOL bNewEntry = TRUE; char* pUDPPorts = NULL; char* pToken = NULL; UDP_PORTS* pEntry = NULL; UDP_PORTS* pUDPPort = NULL; CHXString szToken; if (!pBuffer || !pUDPPortList) { hr = HXR_FAILED; goto cleanup; } pUDPPorts = (char*)pBuffer->GetBuffer(); pToken = strtok(pUDPPorts, ","); while (pToken) { bNewEntry = TRUE; szToken = pToken; pEntry = new UDP_PORTS; // trim off the spaces szToken.TrimLeft(); szToken.TrimRight(); i = szToken.Find('-'); if (-1 == i) { // single port iPort = atoi(szToken); CHXSimpleList::Iterator lIterator = pUDPPortList->Begin(); for (; lIterator != pUDPPortList->End(); ++lIterator) { pUDPPort = (UDP_PORTS*) (*lIterator); if (pUDPPort->uFrom == iPort + 1) { pUDPPort->uFrom = iPort; bNewEntry = FALSE; } else if (pUDPPort->uTo + 1 == iPort) { pUDPPort->uTo = iPort; bNewEntry = FALSE; } } if (bNewEntry) { pEntry->uFrom = atoi(szToken); pEntry->uTo = atoi(szToken); pUDPPortList->AddTail((void*)pEntry); } else { HX_DELETE(pEntry); } } // the entry is a range else { CHXString szFrom = szToken.Left(i); CHXString szTo = szToken.Right(szToken.GetLength() - (i + 1)); szFrom.TrimRight(); szTo.TrimLeft(); pEntry->uFrom = atoi(szFrom); pEntry->uTo = atoi(szTo); pUDPPortList->AddTail((void*)pEntry); } pToken = strtok(NULL, ","); }cleanup: return hr;}HX_RESULT ReadListEntries(IHXBuffer* pValue, REF(CHXSimpleList*) pEntryList){ HX_RESULT hr = HXR_OK; char* pszValue = NULL; char* pszToken = NULL; CHXString* pToken = NULL; CommonEntry* pEntry = NULL; if (!pValue) { hr = HXR_FAILED; goto cleanup; } // collect the # of entries with/without wildcard pszValue = new char[pValue->GetSize() + 1]; SafeStrCpy(pszValue, (char*)pValue->GetBuffer(), pValue->GetSize()); pszToken = strtok(pszValue, ",\n"); while (pszToken) { pToken = new CHXString(pszToken); // trim off the spaces pToken->TrimLeft(); pToken->TrimRight(); if (IsValidSubnetEntry(*pToken)) { pEntry = new SubnetEntry(*pToken); } else if (IsValidWildcardEntry(*pToken)) { pEntry = new WideCardEntry(*pToken); } else { pEntry = new NonWideCardEntry(*pToken); } if (!pEntryList) { pEntryList = new CHXSimpleList(); } pEntryList->AddTail(pEntry); HX_DELETE(pToken); pszToken = strtok(NULL, ",\n"); }cleanup: HX_VECTOR_DELETE(pszValue); return hr;}BOOL IsValidWildcardEntry(const char* pszValue){ BOOL bResult = FALSE; CHXString string = pszValue; // there are only 3 cases // *.XXX // XXX.* // XXX.*.XXX if (!string.Left(2).Compare("*.") || !string.Right(2).Compare(".*") || string.Find(".*.") != -1) { if (string.Find('*') == string.ReverseFind('*')) { bResult = TRUE; } } return bResult;}BOOLIsValidSubnetEntry(const char* pszValue){ BOOL bResult = FALSE; CHXString inString = pszValue; CHXString outString; // XXX.XXX.XXX.XXX:XXX.XXX.XXX.XXX if (2 == inString.CountFields(':')) { outString = inString.NthField(':', 1); if (4 != outString.CountFields('.')) { goto cleanup; } outString = inString.NthField(':', 2); if (4 != outString.CountFields('.')) { goto cleanup; } bResult = TRUE; }cleanup: return bResult;}CommonEntry::CommonEntry(const char* pszValue){ UINT8 size = 0; if (pszValue) { size = strlen(pszValue) + 1; m_pszValue = new char[size]; memset(m_pszValue, 0, size); strcpy(m_pszValue, pszValue); /* Flawfinder: ignore */ } m_nChunks = 0; m_pChunks = 0;}CommonEntry::~CommonEntry(){ int i = 0; for (i = 0; i < m_nChunks; i++) { HX_VECTOR_DELETE(m_pChunks[i]); } HX_VECTOR_DELETE(m_pChunks); HX_VECTOR_DELETE(m_pszValue);}NonWideCardEntry::NonWideCardEntry(const char* pszValue) : CommonEntry(pszValue){}BOOLNonWideCardEntry::IsEqual(const char* pszValue){ BOOL bResult = FALSE; if (!m_pszValue || !pszValue) { goto cleanup; } if (0 == strcasecmp(m_pszValue, pszValue)) { bResult = TRUE; }cleanup: return bResult;}WideCardEntry::WideCardEntry(const char* pszValue) : CommonEntry(pszValue){ char* pHead = NULL; char* pTail = NULL; UINT8 i = 0; UINT8 nLength = 0; CHXString string; if (pszValue) { // caculate the # of chunks pHead = pTail = (char*)pszValue; string = pszValue; m_pChunks = new char*[string.CountFields('.')]; nLength = (UINT8)(string.GetLength()); for (i = 0; i < nLength; i++) { if (*pTail == '.') { m_pChunks[m_nChunks] = new char[(pTail - pHead) + 1]; strncpy(m_pChunks[m_nChunks], pHead, pTail - pHead); /* Flawfinder: ignore */ m_pChunks[m_nChunks][pTail - pHead] = '\0'; m_nChunks++; pHead = pTail + 1; } pTail++; } m_pChunks[m_nChunks] = new char[(pTail - pHead) + 1]; strncpy(m_pChunks[m_nChunks], pHead, pTail - pHead); /* Flawfinder: ignore */ m_pChunks[m_nChunks][pTail - pHead] = '\0'; m_nChunks++; }}BOOLWideCardEntry::IsEqual(const char* pszValue){ BOOL bResult = FALSE; int i = 0; int j = 0; WideCardEntry* pTargetEntry = NULL; if (!m_pszValue || !pszValue) { goto cleanup; } pTargetEntry = new WideCardEntry(pszValue); if (pTargetEntry->m_nChunks == 1) { goto cleanup; } bResult = TRUE; // start from left to right till either hit '*' or done with pTargetInfo for (i = 0, j = 0; strcasecmp(m_pChunks[i], "*") != 0 && j < pTargetEntry->m_nChunks; i++, j++) { if (strcasecmp(m_pChunks[i], pTargetEntry->m_pChunks[j]) != 0) { bResult = FALSE; break; } } // start from right to left for (i = m_nChunks-1, j = pTargetEntry->m_nChunks-1; bResult && strcasecmp(m_pChunks[i], "*") != 0 && j >= 0; i--, j--) { if (strcasecmp(m_pChunks[i], pTargetEntry->m_pChunks[j]) != 0) { bResult = FALSE; break; } }cleanup: HX_DELETE(pTargetEntry); return bResult;}SubnetEntry::SubnetEntry(const char* pszValue) : CommonEntry(pszValue){ UINT8 size = 0; UINT32 ulIAddress = 0; char* pColumn = NULL; if (pszValue) { pColumn = (char*) strchr(pszValue, ':'); *pColumn = '\0'; pColumn++; ulIAddress = HXinet_addr(pszValue); m_ulSubnet = DwToHost(ulIAddress); ulIAddress = HXinet_addr(pColumn); m_ulSubnetMask = DwToHost(ulIAddress); }}BOOLSubnetEntry::IsEqual(const char* pszValue){ BOOL bResult = FALSE; UINT32 ulIAddress = 0; UINT32 ulHostAddress = 0; if(IsNumericAddr(pszValue, strlen(pszValue))) { ulIAddress = HXinet_addr(pszValue); ulHostAddress = DwToHost(ulIAddress); if (m_ulSubnet == (ulHostAddress & m_ulSubnetMask)) { bResult = TRUE; } } return bResult;} HXSubnetManager::HXSubnetManager(IUnknown* pContext) : m_pContext(pContext) , m_pEntryList(NULL) , m_pPreferences(NULL) , m_pPrevSubnet(NULL){ if (m_pContext) { m_pContext->AddRef(); m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences); Initialize(); }}HXSubnetManager::~HXSubnetManager(){ Close();}void HXSubnetManager::Initialize(void){ IHXBuffer* pBuffer = NULL; if (m_pPreferences && m_pPreferences->ReadPref("SubnetList", pBuffer) == HXR_OK) { if (!m_pPrevSubnet || strcasecmp((const char*)m_pPrevSubnet->GetBuffer(), (const char*)pBuffer->GetBuffer())) { ResetEntryList(); ReadListEntries(pBuffer, m_pEntryList); HX_RELEASE(m_pPrevSubnet); m_pPrevSubnet = pBuffer; m_pPrevSubnet->AddRef(); } } HX_RELEASE(pBuffer);}BOOLHXSubnetManager::IsSubnet(const char* pszDomain){ BOOL bResult = FALSE; CommonEntry* pEntry = NULL; CHXSimpleList::Iterator lIterator; if (m_pEntryList) { lIterator = m_pEntryList->Begin(); for (; lIterator != m_pEntryList->End(); ++lIterator) { pEntry = (CommonEntry*)(*lIterator); if (pEntry->IsEqual(pszDomain)) { bResult = TRUE; break; } } } return bResult;}voidHXSubnetManager::Close(void){ ResetEntryList(); HX_DELETE(m_pEntryList); HX_RELEASE(m_pPrevSubnet); HX_RELEASE(m_pPreferences); HX_RELEASE(m_pContext);}voidHXSubnetManager::ResetEntryList(void){ while (m_pEntryList && m_pEntryList->GetCount() > 0) { CommonEntry* pEntry = (CommonEntry*)m_pEntryList->RemoveHead(); HX_DELETE(pEntry); }}#if defined(HELIX_FEATURE_PROXYMGR)HXProxyManager::HXProxyManager(void) : m_lRefCount(0) , m_pContext(NULL) , m_pPreferences(NULL) , m_pEntryList(NULL) , m_pPrevNoProxyFor(NULL){}HXProxyManager::~HXProxyManager(){ Close();}STDMETHODIMPHXProxyManager::QueryInterface(REFIID riid, void**ppvObj){ QInterfaceList qiList[] = { { GET_IIDHANDLE(IID_IUnknown), this }, { GET_IIDHANDLE(IID_IHXProxyManager), (IHXProxyManager*) this }, }; return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);}/////////////////////////////////////////////////////////////////////////// Method:// IUnknown::AddRef// Purpose:// Everyone usually implements this the same... feel free to use// this implementation.//STDMETHODIMP_(ULONG32) HXProxyManager::AddRef(){ return InterlockedIncrement(&m_lRefCount);}/////////////////////////////////////////////////////////////////////////// Method:// IUnknown::Release// Purpose:// Everyone usually implements this the same... feel free to use// this implementation.//STDMETHODIMP_(ULONG32) HXProxyManager::Release(){ if (InterlockedDecrement(&m_lRefCount) > 0) { return m_lRefCount; } delete this; return 0;}STDMETHODIMPHXProxyManager::Initialize(IUnknown* pContext){ HX_RESULT hr = HXR_OK; IHXBuffer* pBuffer = NULL; if (!m_pPreferences) { HX_RELEASE(m_pContext); m_pContext = pContext; if (!m_pContext) { hr = HXR_FAILED; goto cleanup; } m_pContext->AddRef(); if (HXR_OK != m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences)) { m_pPreferences = NULL; } } if (m_pPreferences && m_pPreferences->ReadPref("NoProxyFor", pBuffer) == HXR_OK) { if (!m_pPrevNoProxyFor || strcasecmp((const char*)m_pPrevNoProxyFor->GetBuffer(), (const char*)pBuffer->GetBuffer())) { ResetEntryList(); ReadListEntries(pBuffer, m_pEntryList); HX_RELEASE(m_pPrevNoProxyFor); m_pPrevNoProxyFor = pBuffer; m_pPrevNoProxyFor->AddRef(); } } HX_RELEASE(pBuffer);cleanup: return hr;}STDMETHODIMP_(BOOL)HXProxyManager::IsExemptionHost(char* pszDomain){ BOOL bResult = FALSE; CommonEntry* pEntry = NULL; CHXSimpleList::Iterator lIterator; if (m_pEntryList) { lIterator = m_pEntryList->Begin(); for (; lIterator != m_pEntryList->End(); ++lIterator) { pEntry = (CommonEntry*)(*lIterator); if (pEntry->IsEqual(pszDomain)) { bResult = TRUE; break; } } } return bResult;}voidHXProxyManager::Close(){ ResetEntryList(); HX_DELETE(m_pEntryList); HX_RELEASE(m_pPrevNoProxyFor); HX_RELEASE(m_pPreferences); HX_RELEASE(m_pContext);}voidHXProxyManager::ResetEntryList(void){ while (m_pEntryList && m_pEntryList->GetCount() > 0) { CommonEntry* pEntry = (CommonEntry*)m_pEntryList->RemoveHead(); HX_DELETE(pEntry); }}#endif /* HELIX_FEATURE_PROXYMGR */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -