⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opml.cpp

📁 beereader source code
💻 CPP
字号:
// OPML.cpp: implementation of the COPML class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "OPML.h"
#include "CRobotInternet.h"
#include "MarkupMSXML.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

COPML::COPML(HWND hWnd)
{
   m_CallbackHwnd = hWnd;
   m_szTitle = _T("");
   m_szURI = _T("");
   m_Outlines.RemoveAll(); 
   
}

COPML::~COPML()
{
   Clear();
}

void COPML::Clear()
{
    COutlineItem*  pItem;
	for( int i=0; i<m_Outlines.GetSize(); i++ )
	{
	    pItem = (COutlineItem*)m_Outlines.GetAt(i);
		ASSERT(pItem);
		delete(pItem);
	}
	m_Outlines.RemoveAll();
}

int COPML::ReadOPML( CString szURI )
{
    if( m_szURI.Compare( szURI ) == 0 ) 
	{
	    SendStatusMessage( CM_FAILED,RO_EXIST,NULL);
		return  RO_EXIST;
	}
	m_szURI = szURI;

    CMarkupMSXML markup;

    SendStatusMessage( CM_DOWNLOADING,0,NULL); //开始下载OPML文件.
	
	CRobotInternet  internet;
	CString  szXMLBuffer,sErrMsg;
	int nResult;
	
	CString szLeftString = m_szURI.Left(8);
	if( szLeftString.CompareNoCase( _T("file:///") ) == 0 )
		szXMLBuffer = m_szURI.Right( m_szURI.GetLength()-8 );
	else
	{
	    szXMLBuffer = _T("opmltemp.xml");     

	    if( internet.httpGetFile( m_szURI,szXMLBuffer,nResult,sErrMsg) )
		{
			SendStatusMessage( CM_PRASEING,0,NULL); //下载成功.
		}
		else
		{		
			SendStatusMessage( CM_FAILED,RO_ERR_DOWNLOAD,NULL); //下载失败.
			return RO_ERR_DOWNLOAD;
		}	
    }

	if( !markup.Load( szXMLBuffer ) )
	{
		SendStatusMessage( CM_FAILED,RO_ERR_FORMAT,NULL); 
		return RO_ERR_FORMAT;
	}
    
	CString strOutput;
	if( !markup.FindElem( _T("opml") )) 
	{
		SendStatusMessage( CM_FAILED,RO_ERR_FORMAT,NULL); 
		return RO_ERR_FORMAT;
	}

	markup.IntoElem();
	while( markup.NextSlibingElem() )
	{
		strOutput = markup.GetTagName();
		strOutput.MakeLower();
		if( strOutput.Compare(_T("head")) == 0 )
		{
		   //解析<head>
           if( markup.FindChildElem( _T("Title") ) )
		   {
		        SetTitle( markup.GetChildData() ); 
		   }
		}
		else if( strOutput.Compare(_T("body"))==0 )
		{
		   //解析<body>
		   	markup.ResetChildPos();
	        markup.IntoElem();

			COutlineItem* pItem = NULL;

            while( markup.NextSlibingElem() )
			{
		        strOutput = markup.GetTagName();
		        strOutput.MakeLower();   
				if( strOutput.Compare(_T("outline"))==0 )
				{
					pItem = new COutlineItem();
					ASSERT(pItem);
					pItem->SetTitle( markup.GetAttrib(_T("title")) );
					pItem->SetText( markup.GetAttrib(_T("text")));
					pItem->SetXmlUrl( markup.GetAttrib(_T("xmlUrl")));
					pItem->SetHtmlUrl( markup.GetAttrib(_T("htmlUrl")));
					pItem->SetDescription( markup.GetAttrib( _T("description")));
					if( pItem->GetTitle() == _T("") || pItem->GetXmlUrl()==_T("") ) delete pItem;
                    else {
						m_Outlines.Add( pItem );
                        SendStatusMessage( CM_NEWOUTLINE,0,pItem); 
					}
				}
			}

			markup.OutOfElem();
		}
	}

    SendStatusMessage( CM_PRASED,0,NULL); 
	return 0;
}


COutlineItem* COPML::GetNextItem(BOOL bFirst)
{
    COutlineItem*  pItem = NULL;
	static int iCurrent = -1;

	if( m_Outlines.GetSize() <= 0 ) { pItem = NULL; iCurrent = -1;}
	else
	{
		if( bFirst ) { pItem = (COutlineItem*)m_Outlines.GetAt(0); iCurrent = 0; }
		else
		{
			iCurrent++;
			if( iCurrent >= m_Outlines.GetSize() )
			{ pItem = NULL; iCurrent = -1; }
			else
			{
			  pItem = (COutlineItem*)m_Outlines.GetAt(iCurrent);
			}
		}
	}
	return pItem;
}

void COPML::SendStatusMessage(int iCode, int iSubCode, COutlineItem *pItem)
{    
	if( m_CallbackHwnd )
	{
		WPARAM wParam = MAKEWPARAM((WORD)iCode,(WORD)iSubCode);
		::SendMessage( m_CallbackHwnd,WM_READ_OPML,wParam,(LPARAM)pItem);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -