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

Symbian

开发平台:

C/C++

  1. /*============================================================================*
  2.  *
  3.  * (c) 1995-2002 RealNetworks, Inc. Patents pending. All rights reserved.
  4.  *
  5.  *============================================================================*/
  6.  
  7. /*
  8.  *  Description: 
  9.  *
  10.  */
  11. #include <ctype.h>
  12. #include "hxstring.h"
  13. #include "chxavurlrep.h"
  14. #include "chxavramparser.h"
  15. #include "chxavurlrep.h"
  16. #include "chxavurlfix.h"
  17. #include "chxavparseiterator.h"
  18. #include "chxavramparser.h"
  19. class URLParser {
  20. public:
  21.     URLParser();
  22.     bool Parse(const CHXString& line);
  23.     bool Valid() const;
  24.     void Reset();
  25.     const CHXAvURLRep& Value() const;
  26.     
  27. private:
  28.     CHXAvURLRep m_url;
  29. };
  30. inline
  31. static
  32. CHXString Trim(const CHXString& line)
  33. {
  34.     int len = line.GetLength();
  35.     // trim left
  36.     const char* s = line;
  37.     while (*s && isspace(*s))
  38.     {
  39.        ++s;
  40.        --len;
  41.     }
  42.     // trim right
  43.     const char* p = strrchr(s, '#');
  44.     if (p)
  45.     len = p - s;
  46.     while (len > 0 && isspace(s[len-1]))
  47.     --len;
  48.    
  49.     return CHXString((const char*)s, len);
  50. }
  51. URLParser::URLParser()
  52.     : m_url("")
  53. {}
  54. bool URLParser::Parse(const CHXString& line)
  55. {
  56.     CHXString trimmed = Trim(line);
  57.     // Make sure the line contains characters
  58.     // and has '://' which should be present in
  59.     // all RAM file URLs
  60.     if ((trimmed.GetLength() > 0) &&
  61. (strstr((const char*)trimmed, "://")))
  62.     {
  63.         CHXAvURLRep url(trimmed);
  64.         if (!url.Valid())
  65.         {
  66.     // Perhaps invalid because it has back-slashes instead of forward slashes
  67.             if(stricmp(url.Protocol(), "file") == 0)
  68.             {
  69.                 CHXString strNewPath = url.Path();
  70.                 if( strNewPath.FindAndReplace("\", "/", TRUE) )
  71.                 {
  72.                     url = CHXAvURLRep(url.Protocol(), url.Host(), url.Port(), strNewPath);
  73.                 }
  74.             }
  75.         }
  76.         if (!url.Valid())
  77.         {
  78.             // Perhaps invalid because it has unescaped chars
  79.     url = CHXAvURLFixup::TryEscapeURL(url);
  80.         }
  81.         // check for valid URL and supported protocols
  82.         if (url.Valid() &&
  83.     (stricmp(url.Protocol(), "rtsp") == 0 ||
  84.      stricmp(url.Protocol(), "http") == 0 ||
  85.      stricmp(url.Protocol(), "file") == 0))
  86.         {
  87.     m_url = url;
  88.     return true;
  89.         }
  90.     }
  91.     return false;
  92. }
  93. bool URLParser::Valid() const
  94. {
  95.     return (m_url.Valid() && (m_url.Protocol().GetLength() > 0));
  96. }
  97. void URLParser::Reset()
  98. {
  99.     m_url = CHXAvURLRep("");
  100. }
  101. const CHXAvURLRep& URLParser::Value() const
  102. {
  103.     return m_url;
  104. }
  105. //////////////////////////////////////////////////////////
  106. //
  107. // the returned playlist is guaranteed to be valid (have at least one item)
  108. //
  109. CHXAvPlaylistPtr CHXAvRAMParser::Parse(const CHXString& filename)
  110. {
  111.     CHXAvPlaylistPtr pList = new (ELeave) CHXAvPlaylist(); // XXXLCM can leave
  112.     CHXAvParseIterator<URLParser> urls(filename);
  113.     for (; urls.More(); urls.Next())
  114.     {
  115.     const URLParser& url = urls.Current();
  116.     if (url.Valid())
  117.         pList->Append(url.Value());
  118.     }
  119.     return pList->Length() > 0 ? pList : CHXAvPlaylistPtr(0);
  120. }