chxavurllist.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:6k
源码类别:

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * chxavurllist.cpp
  3.  * ----------------
  4.  *
  5.  * Synopsis:
  6.  * Contains the implementation of the CHXAvURLList class.  It's basically
  7.  * a neat way to keep track of the urls most recently viewed.
  8.  *
  9.  *
  10.  * Target:
  11.  * Symbian OS
  12.  *
  13.  *
  14.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  15.  *
  16.  *****************************************************************************/
  17. // Symbian includes...
  18. #include <e32base.h>
  19. // Standard includes...
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. // Helix includes...
  23. #include "unkimp.h"
  24. #include "ihxpckts.h"
  25. #include "hxstring.h"
  26. #include "hxurl.h"
  27. #include "hxassert.h"
  28. #include "hxwintyp.h"
  29. #include "hxcom.h"
  30. #include "hxbuffer.h"
  31. #include "hxcomm.h"
  32. #include "hxmon.h"
  33. // Include from this project...
  34. #include "chxavurlinfo.h"
  35. #include "chxavurllist.h"
  36. #include "chxavstringutils.h"
  37.  
  38. CHXAvURLList::CHXAvURLList() : m_maxURLs(10)
  39. {
  40. }
  41. CHXAvURLList::~CHXAvURLList()
  42. {
  43.     Clear();
  44. }
  45. void
  46. CHXAvURLList::InitializeL()
  47. {
  48.     HX_ASSERT(m_urls.IsEmpty());
  49. }
  50. CHXAvURLList::CHXAvURLList(int maxURLs)
  51.     : m_maxURLs(maxURLs)
  52. {}
  53. int 
  54. CHXAvURLList::NumURLs() const
  55. {
  56.     return m_urls.GetCount();
  57. }
  58. void
  59. CHXAvURLList::Remove(const CHXAvURLInfo*& pURLInfo)
  60. {
  61.     LISTPOSITION position = m_urls.Find((void*)pURLInfo, NULL);
  62.     if (position != NULL)
  63.     { 
  64. HX_DELETE(pURLInfo);
  65. m_urls.RemoveAt(position);
  66.     }
  67. }
  68. void
  69. CHXAvURLList::Clear()
  70. {
  71.     LISTPOSITION position = m_urls.GetHeadPosition();
  72.     while (position != NULL)
  73.     {
  74. CHXAvURLInfo* pURLInfo = (CHXAvURLInfo*)(m_urls.GetNext(position));
  75. delete pURLInfo;
  76.     }
  77.     m_urls.RemoveAll();
  78. }
  79. int 
  80. CHXAvURLList::GetMax() const
  81. {
  82.     return m_maxURLs;
  83. }
  84. // remove all entries matching given url; return count of removed items
  85. int CHXAvURLList::RemoveMatches(const TDesC& url)
  86. {
  87.     int removeCount = 0;
  88.     
  89.     LISTPOSITION position = m_urls.GetHeadPosition();
  90.     LISTPOSITION prevPosition = position;
  91.     while (position != NULL)
  92.     {
  93. CHXAvURLInfo* pInfo = (CHXAvURLInfo*)(m_urls.GetNext(position));
  94. if ((pInfo != NULL) && (pInfo->URL() == url))
  95. {
  96.             // this url matches; delete and remove
  97.             ++removeCount;
  98.     delete pInfo;
  99.     m_urls.RemoveAt(prevPosition);
  100.     break;
  101. }
  102. prevPosition = position;
  103.     }
  104.     return removeCount;
  105. }
  106. // we assume ownership of pURLInfo
  107. void
  108. CHXAvURLList::AddHead(const CHXAvURLInfo*& pURLInfo)
  109. {
  110.     // remove existing urls that match the one being added
  111.     RemoveMatches(pURLInfo->URL());
  112.     // add new one to head
  113.     m_urls.AddHead((void*)pURLInfo);
  114.     // drop old one off tail if list is full
  115.     if (m_urls.GetCount() > m_maxURLs)
  116.     {
  117. CHXAvURLInfo* pInfo = (CHXAvURLInfo*)(m_urls.GetTail());
  118. delete pInfo;
  119. m_urls.RemoveTail();
  120.     }
  121. }
  122. // we assume ownership of pURLInfo
  123. void
  124. CHXAvURLList::AddTail(const CHXAvURLInfo*& pURLInfo)
  125. {
  126.     // remove existing urls that match the one being added
  127.     RemoveMatches(pURLInfo->URL());
  128.     if( m_urls.GetCount() < m_maxURLs )
  129.     {
  130.         // add new one to tail
  131.         m_urls.AddTail((void*)pURLInfo);
  132.     }
  133.     else
  134.     {
  135.         // can't add; delete
  136.         HX_DELETE(pURLInfo);
  137.     }
  138. }
  139. void CHXAvURLList::SetMax(int count)
  140. {
  141.     m_maxURLs = count;
  142.     while (m_urls.GetCount() > m_maxURLs)
  143.     {
  144. CHXAvURLInfo* pInfo = (CHXAvURLInfo*)(m_urls.GetTail());
  145. delete pInfo;
  146. m_urls.RemoveTail();
  147.     }
  148. }
  149. CHXAvURLInfo*
  150. CHXAvURLList::GetURL(int index) const
  151. {
  152.     if (index < 0 || index > m_urls.GetCount())
  153. return NULL;
  154.     LISTPOSITION position = m_urls.FindIndex(index);
  155.     if (position != NULL)
  156.     {
  157. return ((CHXAvURLInfo*)m_urls.GetAt(position));
  158.     }
  159.     return NULL;
  160. }
  161. // we assume ownership of pURLInfo
  162. void
  163. CHXAvURLList::SetURL(int index, const CHXAvURLInfo*& pURLInfo)
  164. {
  165.     if (index < 0 || index > m_urls.GetCount())
  166. return;
  167.     CHXAvURLInfo* pInfo = NULL;
  168.     LISTPOSITION position = m_urls.FindIndex(index);
  169.     if (position != NULL)
  170.     {
  171. pInfo = (CHXAvURLInfo*)m_urls.GetAt(position);
  172. delete pInfo;
  173. m_urls.SetAt(position, (void*)pURLInfo);
  174.     }
  175. }
  176. bool
  177. CHXAvURLList::ReadFile(const CHXString& filename)
  178. {
  179.     bool ret = false;
  180.     CHXString surl;
  181.     CHXString stitle;
  182.     CHXString tempStr;
  183.     CHXBuffer *buffer = new (ELeave) CHXBuffer(); //XXXLCM leave
  184.     buffer->AddRef();
  185.     buffer->SetSize(320);
  186.     UCHAR *ptr = buffer->GetBuffer();
  187.     int count = 0;
  188.     FILE* fp = ::fopen((const char *)filename, "rt");
  189.     if (fp)
  190.     {
  191. while(!feof(fp) && count < m_maxURLs)
  192. {
  193.     if (::fgets((char *)ptr, buffer->GetSize(), fp))
  194.     {
  195. // Get rid of the new line...
  196. tempStr = ptr;
  197. stitle = tempStr.Left(tempStr.GetLength() - 1);
  198.     }
  199.     if (::fgets((char *)ptr, buffer->GetSize(), fp))
  200.     {
  201. // Get rid of the new line...
  202. tempStr = ptr;
  203. surl = tempStr.Left(tempStr.GetLength() - 1);
  204.     }
  205.     if ((!feof(fp)) && (stitle.GetLength() > 0) && (surl.GetLength() > 0))
  206.     {
  207. // Add to the head of the list....
  208. CHXAvURLInfo* pClip = new (ELeave) CHXAvURLInfo(surl, stitle);
  209. AddTail(pClip);
  210. ++count;
  211.     }
  212. }
  213. ret = true;
  214. ::fclose(fp);
  215.     }
  216.     HX_RELEASE(buffer);
  217.     return ret;
  218. }
  219. bool 
  220. CHXAvURLList::WriteFile(const CHXString& filename) const
  221. {
  222.     bool ret = false;
  223.     
  224.     FILE* fp = ::fopen(filename, "wt");
  225.     if (fp)
  226.     {
  227. CHXString stitle;
  228. CHXString surl;
  229. LISTPOSITION position = m_urls.GetHeadPosition();
  230. while (position != NULL)
  231. {
  232.     CHXAvURLInfo* pURL = (CHXAvURLInfo*)(m_urls.GetNext(position));
  233.     HX_ASSERT(pURL != NULL);
  234.     if (pURL != NULL)
  235.     {
  236. CHXAvStringUtils::DesToString(pURL->Title(), stitle);
  237. CHXAvStringUtils::DesToString(pURL->URL(), surl);
  238. ::fprintf(fp, "%sn", (const char*)stitle);
  239. ::fprintf(fp, "%sn", (const char*)surl);
  240.     }
  241. }
  242. ::fclose(fp);
  243. ret = true;
  244.     }
  245.     return ret;
  246. }