portaddr.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:15k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: portaddr.cpp,v 1.8.20.3 2004/07/09 01:48:16 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hxcom.h"
  50. #if defined (_UNIX) || defined (_WIN16)
  51. #include <stdlib.h>
  52. #endif
  53. #include "hxcomm.h"
  54. #include "hxslist.h"
  55. #include "hxstring.h"
  56. #include "hxstrutl.h"
  57. #include "hxbuffer.h"
  58. #include "hxprefs.h"
  59. #include "netbyte.h"
  60. #include "portaddr.h"
  61. #include "hxheap.h"
  62. #ifdef _DEBUG
  63. #undef HX_THIS_FILE
  64. static const char HX_THIS_FILE[] = __FILE__;
  65. #endif
  66. HX_RESULT
  67. ReadUDPPorts(IHXBuffer* pBuffer, REF(CHXSimpleList*) pUDPPortList)
  68. {
  69.     HX_RESULT hr = HXR_OK;
  70.     int i = 0;
  71.     UINT16 iPort = 0;
  72.     BOOL bNewEntry = TRUE;
  73.     char* pUDPPorts = NULL;
  74.     char* pToken = NULL;
  75.     UDP_PORTS* pEntry = NULL;
  76.     UDP_PORTS* pUDPPort = NULL;
  77.     CHXString szToken;
  78.     if (!pBuffer || !pUDPPortList)
  79.     {
  80. hr = HXR_FAILED;
  81. goto cleanup;
  82.     }
  83.     pUDPPorts = (char*)pBuffer->GetBuffer();
  84.     pToken = strtok(pUDPPorts, ",");
  85.     while (pToken)
  86.     {
  87. bNewEntry = TRUE;
  88. szToken = pToken;
  89. pEntry = new UDP_PORTS;
  90. // trim off the spaces
  91. szToken.TrimLeft();
  92. szToken.TrimRight();
  93. i = szToken.Find('-');
  94. if (-1 == i)
  95. {
  96.     // single port
  97.     iPort = atoi(szToken);
  98.     CHXSimpleList::Iterator lIterator = pUDPPortList->Begin();
  99.     for (; lIterator != pUDPPortList->End(); ++lIterator)
  100.     {
  101.  pUDPPort = (UDP_PORTS*) (*lIterator);
  102.  if (pUDPPort->uFrom == iPort + 1)
  103.  {
  104.      pUDPPort->uFrom = iPort;
  105.      bNewEntry = FALSE;
  106.  }
  107.  else if (pUDPPort->uTo + 1 == iPort)
  108.  {
  109.      pUDPPort->uTo = iPort;
  110.      bNewEntry = FALSE;
  111.  }
  112.     }
  113.     if (bNewEntry)
  114.     {
  115. pEntry->uFrom = atoi(szToken);
  116. pEntry->uTo = atoi(szToken);
  117. pUDPPortList->AddTail((void*)pEntry);
  118.     }
  119.     else
  120.     {
  121. HX_DELETE(pEntry);
  122.     }
  123. }
  124. // the entry is a range
  125. else
  126. {
  127.     CHXString szFrom = szToken.Left(i);
  128.     CHXString szTo = szToken.Right(szToken.GetLength() - (i + 1));
  129.     szFrom.TrimRight();
  130.     szTo.TrimLeft();
  131.     pEntry->uFrom = atoi(szFrom);
  132.     pEntry->uTo = atoi(szTo);
  133.     pUDPPortList->AddTail((void*)pEntry);
  134. }
  135. pToken = strtok(NULL, ",");
  136.     }
  137. cleanup:
  138.     return hr;
  139. }
  140. HX_RESULT   
  141. ReadListEntries(IHXBuffer* pValue, REF(CHXSimpleList*) pEntryList)
  142. {
  143.     HX_RESULT hr = HXR_OK;
  144.     char* pszValue = NULL;
  145.     char* pszToken = NULL;
  146.     CHXString* pToken = NULL;
  147.     CommonEntry* pEntry = NULL;
  148.     if (!pValue)
  149.     {
  150. hr = HXR_FAILED;
  151. goto cleanup;
  152.     }
  153.     // collect the # of entries with/without wildcard
  154.     pszValue = new char[pValue->GetSize() + 1];
  155.     SafeStrCpy(pszValue, (char*)pValue->GetBuffer(), pValue->GetSize());
  156.     pszToken = strtok(pszValue, ",n");
  157.     while (pszToken)
  158.     {
  159. pToken = new CHXString(pszToken);
  160. // trim off the spaces
  161. pToken->TrimLeft();
  162. pToken->TrimRight();
  163. if (IsValidSubnetEntry(*pToken))
  164. {
  165.     pEntry = new SubnetEntry(*pToken);
  166. }
  167. else if (IsValidWildcardEntry(*pToken))
  168. {
  169.     pEntry = new WideCardEntry(*pToken);
  170. }
  171. else
  172. {
  173.     pEntry = new NonWideCardEntry(*pToken);
  174. }
  175. if (!pEntryList)
  176. {
  177.     pEntryList = new CHXSimpleList();
  178. }
  179. pEntryList->AddTail(pEntry);
  180. HX_DELETE(pToken);
  181. pszToken = strtok(NULL, ",n");
  182.     }
  183. cleanup:
  184.     HX_VECTOR_DELETE(pszValue);
  185.     
  186.     return hr;
  187. }
  188. BOOL     
  189. IsValidWildcardEntry(const char* pszValue)
  190. {
  191.     BOOL bResult = FALSE;
  192.     CHXString string = pszValue;
  193.     // there are only 3 cases
  194.     // *.XXX
  195.     // XXX.*
  196.     // XXX.*.XXX
  197.     if (!string.Left(2).Compare("*.") ||
  198. !string.Right(2).Compare(".*") ||
  199. string.Find(".*.") != -1)
  200.     {
  201. if (string.Find('*') == string.ReverseFind('*'))
  202. {
  203.     bResult = TRUE;
  204. }
  205.     }
  206.     return bResult;
  207. }
  208. BOOL
  209. IsValidSubnetEntry(const char* pszValue)
  210. {
  211.     BOOL bResult = FALSE;
  212.     CHXString inString = pszValue;
  213.     CHXString outString;
  214.     // XXX.XXX.XXX.XXX:XXX.XXX.XXX.XXX
  215.     if (2 == inString.CountFields(':'))
  216.     {
  217. outString = inString.NthField(':', 1);
  218. if (4 != outString.CountFields('.'))
  219. {
  220.     goto cleanup;
  221. }
  222. outString = inString.NthField(':', 2);
  223. if (4 != outString.CountFields('.'))
  224. {
  225.     goto cleanup;
  226. }
  227. bResult = TRUE;
  228.     }
  229. cleanup:
  230.     return bResult;
  231. }
  232. CommonEntry::CommonEntry(const char* pszValue)
  233. {
  234.     UINT8   size = 0;
  235.     if (pszValue)
  236.     {
  237. size = strlen(pszValue) + 1;
  238. m_pszValue = new char[size];
  239. memset(m_pszValue, 0, size);
  240. strcpy(m_pszValue, pszValue); /* Flawfinder: ignore */
  241.     }
  242.     m_nChunks = 0;
  243.     m_pChunks = 0;
  244. }
  245. CommonEntry::~CommonEntry()
  246. {
  247.     int i = 0;
  248.     for (i = 0; i < m_nChunks; i++)
  249.     {
  250. HX_VECTOR_DELETE(m_pChunks[i]);
  251.     }
  252.     HX_VECTOR_DELETE(m_pChunks);
  253.     HX_VECTOR_DELETE(m_pszValue);
  254. }
  255. NonWideCardEntry::NonWideCardEntry(const char* pszValue)
  256. : CommonEntry(pszValue)
  257. {
  258. }
  259. BOOL
  260. NonWideCardEntry::IsEqual(const char* pszValue)
  261. {
  262.     BOOL bResult = FALSE;
  263.     if (!m_pszValue || !pszValue)
  264.     {
  265. goto cleanup;
  266.     }
  267.     if (0 == strcasecmp(m_pszValue, pszValue))
  268.     {
  269. bResult = TRUE;
  270.     }
  271. cleanup:
  272.     return bResult;
  273. }
  274. WideCardEntry::WideCardEntry(const char* pszValue)
  275.      : CommonEntry(pszValue)
  276. {
  277.     char* pHead = NULL;
  278.     char* pTail = NULL;
  279.     UINT8 i = 0;
  280.     UINT8 nLength = 0;
  281.     CHXString string;
  282.     if (pszValue)
  283.     {
  284. // caculate the # of chunks
  285. pHead = pTail = (char*)pszValue;
  286. string = pszValue;
  287. m_pChunks = new char*[string.CountFields('.')];
  288. nLength = (UINT8)(string.GetLength());
  289. for (i = 0; i < nLength; i++)
  290. {
  291.     if (*pTail == '.')
  292.     {
  293. m_pChunks[m_nChunks] = new char[(pTail - pHead) + 1];
  294. strncpy(m_pChunks[m_nChunks], pHead, pTail - pHead); /* Flawfinder: ignore */
  295. m_pChunks[m_nChunks][pTail - pHead] = '';
  296. m_nChunks++;
  297. pHead = pTail + 1;
  298.     }
  299.     pTail++;
  300. }
  301. m_pChunks[m_nChunks] = new char[(pTail - pHead) + 1];
  302. strncpy(m_pChunks[m_nChunks], pHead, pTail - pHead); /* Flawfinder: ignore */
  303. m_pChunks[m_nChunks][pTail - pHead] = '';
  304. m_nChunks++;
  305.     }
  306. }
  307. BOOL
  308. WideCardEntry::IsEqual(const char* pszValue)
  309. {
  310.     BOOL     bResult = FALSE;
  311.     int      i = 0;
  312.     int      j = 0;
  313.     WideCardEntry*  pTargetEntry = NULL;
  314.     if (!m_pszValue || !pszValue)
  315.     {
  316. goto cleanup;
  317.     }
  318.     pTargetEntry = new WideCardEntry(pszValue);
  319.     if (pTargetEntry->m_nChunks == 1)
  320.     {
  321.         goto cleanup;
  322.     }
  323.     bResult = TRUE;
  324.     
  325.     // start from left to right till either hit '*' or done with pTargetInfo
  326.     for (i = 0, j = 0; strcasecmp(m_pChunks[i], "*") != 0 && j < pTargetEntry->m_nChunks; i++, j++)
  327.     {
  328. if (strcasecmp(m_pChunks[i], pTargetEntry->m_pChunks[j]) != 0)
  329. {
  330.     bResult = FALSE;
  331.     break;
  332. }
  333.     }
  334.     // start from right to left
  335.     for (i = m_nChunks-1, j = pTargetEntry->m_nChunks-1; 
  336.  bResult && strcasecmp(m_pChunks[i], "*") != 0 && j >= 0; i--, j--)
  337.     {
  338. if (strcasecmp(m_pChunks[i], pTargetEntry->m_pChunks[j]) != 0)
  339. {
  340.     bResult = FALSE;
  341.     break;
  342. }
  343.     }
  344. cleanup:
  345.     HX_DELETE(pTargetEntry);
  346.     return bResult;
  347. }
  348. SubnetEntry::SubnetEntry(const char* pszValue)
  349.    : CommonEntry(pszValue)
  350. {
  351.     UINT8   size = 0;
  352.     UINT32  ulIAddress = 0;
  353.     char*   pColumn = NULL;
  354.     if (pszValue)
  355.     {
  356. pColumn = (char*) strchr(pszValue, ':');
  357. *pColumn = '';
  358. pColumn++;
  359. ulIAddress = HXinet_addr(pszValue);
  360. m_ulSubnet = DwToHost(ulIAddress);
  361. ulIAddress = HXinet_addr(pColumn);
  362. m_ulSubnetMask = DwToHost(ulIAddress);
  363.     }
  364. }
  365. BOOL
  366. SubnetEntry::IsEqual(const char* pszValue)
  367. {
  368.     BOOL    bResult = FALSE;
  369.     UINT32  ulIAddress = 0;
  370.     UINT32  ulHostAddress = 0;
  371.     
  372.     if(IsNumericAddr(pszValue, strlen(pszValue)))
  373.     {
  374. ulIAddress = HXinet_addr(pszValue);
  375. ulHostAddress = DwToHost(ulIAddress);
  376. if (m_ulSubnet == (ulHostAddress & m_ulSubnetMask))
  377. {
  378.     bResult = TRUE;
  379. }
  380.     }
  381.     return bResult;
  382. }
  383.  
  384. HXSubnetManager::HXSubnetManager(IUnknown* pContext)
  385. : m_pContext(pContext)
  386. , m_pEntryList(NULL)
  387. , m_pPreferences(NULL)
  388. , m_pPrevSubnet(NULL)
  389. {
  390.     if (m_pContext)
  391.     {
  392. m_pContext->AddRef();
  393. m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences);
  394. Initialize();
  395.     }
  396. }
  397. HXSubnetManager::~HXSubnetManager()
  398. {
  399.     Close();
  400. }
  401. void    
  402. HXSubnetManager::Initialize(void)
  403. {
  404.     IHXBuffer* pBuffer = NULL;
  405.     if (m_pPreferences && m_pPreferences->ReadPref("SubnetList", pBuffer) == HXR_OK)
  406.     {
  407. if (!m_pPrevSubnet ||
  408.     strcasecmp((const char*)m_pPrevSubnet->GetBuffer(), (const char*)pBuffer->GetBuffer()))
  409. {
  410.     ResetEntryList();
  411.     ReadListEntries(pBuffer, m_pEntryList);
  412.     HX_RELEASE(m_pPrevSubnet);
  413.     m_pPrevSubnet = pBuffer;
  414.     m_pPrevSubnet->AddRef();
  415. }
  416.     }
  417.     HX_RELEASE(pBuffer);
  418. }
  419. BOOL
  420. HXSubnetManager::IsSubnet(const char* pszDomain)
  421. {
  422.     BOOL bResult = FALSE;
  423.     CommonEntry* pEntry = NULL;
  424.     CHXSimpleList::Iterator lIterator;
  425.     if (m_pEntryList)
  426.     {
  427. lIterator = m_pEntryList->Begin();
  428. for (; lIterator != m_pEntryList->End(); ++lIterator)
  429. {
  430.     pEntry = (CommonEntry*)(*lIterator);
  431.     if (pEntry->IsEqual(pszDomain))
  432.     {
  433. bResult = TRUE;
  434. break;
  435.     }
  436. }
  437.     }
  438.     return bResult;
  439. }
  440. void
  441. HXSubnetManager::Close(void)
  442. {
  443.     ResetEntryList();
  444.     HX_DELETE(m_pEntryList);
  445.     HX_RELEASE(m_pPrevSubnet);
  446.     HX_RELEASE(m_pPreferences);
  447.     HX_RELEASE(m_pContext);
  448. }
  449. void
  450. HXSubnetManager::ResetEntryList(void)
  451. {
  452.     while (m_pEntryList && m_pEntryList->GetCount() > 0)
  453.     {
  454. CommonEntry* pEntry = (CommonEntry*)m_pEntryList->RemoveHead();
  455. HX_DELETE(pEntry);
  456.     }
  457. }
  458. #if defined(HELIX_FEATURE_PROXYMGR)
  459. HXProxyManager::HXProxyManager(void)
  460. : m_lRefCount(0)
  461. , m_pContext(NULL)
  462. , m_pPreferences(NULL)
  463. , m_pEntryList(NULL)
  464. , m_pPrevNoProxyFor(NULL)
  465. {
  466. }
  467. HXProxyManager::~HXProxyManager()
  468. {
  469.     Close();
  470. }
  471. STDMETHODIMP
  472. HXProxyManager::QueryInterface(REFIID riid, void**ppvObj)
  473. {
  474. QInterfaceList qiList[] =
  475. {
  476. { GET_IIDHANDLE(IID_IUnknown), this },
  477. { GET_IIDHANDLE(IID_IHXProxyManager), (IHXProxyManager*) this },
  478. };
  479.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  480. }
  481. /////////////////////////////////////////////////////////////////////////
  482. //  Method:
  483. // IUnknown::AddRef
  484. //  Purpose:
  485. // Everyone usually implements this the same... feel free to use
  486. // this implementation.
  487. //
  488. STDMETHODIMP_(ULONG32) 
  489. HXProxyManager::AddRef()
  490. {
  491.     return InterlockedIncrement(&m_lRefCount);
  492. }
  493. /////////////////////////////////////////////////////////////////////////
  494. //  Method:
  495. // IUnknown::Release
  496. //  Purpose:
  497. // Everyone usually implements this the same... feel free to use
  498. // this implementation.
  499. //
  500. STDMETHODIMP_(ULONG32) 
  501. HXProxyManager::Release()
  502. {
  503.     if (InterlockedDecrement(&m_lRefCount) > 0)
  504.     {
  505.         return m_lRefCount;
  506.     }
  507.     delete this;
  508.     return 0;
  509. }
  510. STDMETHODIMP
  511. HXProxyManager::Initialize(IUnknown* pContext)
  512. {
  513.     HX_RESULT hr = HXR_OK;
  514.     IHXBuffer* pBuffer = NULL;
  515.     if (!m_pPreferences)
  516.     {
  517.         HX_RELEASE(m_pContext);
  518. m_pContext = pContext;
  519. if (!m_pContext)
  520. {
  521.     hr = HXR_FAILED;
  522.     goto cleanup;
  523. }
  524. m_pContext->AddRef();
  525. if (HXR_OK != m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences))
  526. {
  527.     m_pPreferences = NULL;
  528. }
  529.     }
  530.     if (m_pPreferences && m_pPreferences->ReadPref("NoProxyFor", pBuffer) == HXR_OK)
  531.     {
  532. if (!m_pPrevNoProxyFor ||
  533.     strcasecmp((const char*)m_pPrevNoProxyFor->GetBuffer(), (const char*)pBuffer->GetBuffer()))
  534. {
  535.     ResetEntryList();
  536.     ReadListEntries(pBuffer, m_pEntryList);
  537.     HX_RELEASE(m_pPrevNoProxyFor);
  538.     m_pPrevNoProxyFor = pBuffer;
  539.     m_pPrevNoProxyFor->AddRef();
  540. }
  541.     }
  542.     HX_RELEASE(pBuffer);
  543. cleanup:
  544.     return hr;
  545. }
  546. STDMETHODIMP_(BOOL)
  547. HXProxyManager::IsExemptionHost(char* pszDomain)
  548. {
  549.     BOOL bResult = FALSE;
  550.     CommonEntry* pEntry = NULL;
  551.     CHXSimpleList::Iterator lIterator;
  552.     if (m_pEntryList)
  553.     {
  554. lIterator = m_pEntryList->Begin();
  555. for (; lIterator != m_pEntryList->End(); ++lIterator)
  556. {
  557.     pEntry = (CommonEntry*)(*lIterator);
  558.     if (pEntry->IsEqual(pszDomain))
  559.     {
  560. bResult = TRUE;
  561. break;
  562.     }
  563. }
  564.     }
  565.     return bResult;
  566. }
  567. void
  568. HXProxyManager::Close()
  569. {
  570.     ResetEntryList();
  571.     HX_DELETE(m_pEntryList);
  572.     HX_RELEASE(m_pPrevNoProxyFor);
  573.     HX_RELEASE(m_pPreferences);
  574.     HX_RELEASE(m_pContext);
  575. }
  576. void
  577. HXProxyManager::ResetEntryList(void)
  578. {
  579.     while (m_pEntryList && m_pEntryList->GetCount() > 0)
  580.     {
  581. CommonEntry* pEntry = (CommonEntry*)m_pEntryList->RemoveHead();
  582. HX_DELETE(pEntry);
  583.     }
  584. }
  585. #endif /* HELIX_FEATURE_PROXYMGR */