?? opml.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 + -