一个RSS阅读器类

简介:


复制代码class CFeedItem
{//RSS条目
public:
    CFeedItem();
    virtual ~CFeedItem();
public:
    CString        m_strAuthor;//作者
    CString        m_strCategory;//类别
    CString        m_strDescription;//描述信息
    CString        m_strLink;//链接地址
    CString        m_strPubDate;//发布日期
    CString        m_strSubject;//主题
    CString        m_strTitle;//标题
    CString        m_strReadStatus;//是否已读
};


class CFeedSource  
{//RSS源
public:
    CFeedSource();
    virtual ~CFeedSource();

public:
    CString        m_strCopyright;//版权
    CString        m_strDescription;//描述信息
    CString        m_strGenerator;//生产者
    CString        m_strLanguage;//语言
    CString        m_strLastBuildDate;//上次构建日期
    CString        m_strLink;//链接地址
    CString        m_strTitle;//标题
    CString        m_strTtl;
    CString        m_strWebMaster;//管理员
    CString        m_strImageDescription;//图片描述信息
    CString        m_strImageHeight;//图片高度
    CString        m_strImageWidth;//图片宽度
    CString        m_strImageLink;//图片链接地址
    CString        m_strImageTitle;//图片标题
    CString        m_strImageUrl;//图片Url
    CString        m_strVersion;//图片版本
};


class CFeed
{//RSS种子
public:
    CFeed();
    CFeed( CString strXMLFile );
    virtual ~CFeed();
public:
    static void RefreshAll();
    static void MarkItemRead( CString strLink );
    static void DeleteFeedSource( CString strLink );
    static void DeleteListArray( CStringArray& strLinkArray );
    static void GetFeedSourceList( CStringArray& strTitleArray, CStringArray& strLinkArray );
    void LoadLocal( CString& strLink );
    void BuildFromFile( CString strXMLFile );
    CFeedSource                        m_source;        // Feed Source
    CArray<CFeedItem,CFeedItem>        m_item;            // Feed Item
    BOOL                            m_bAdded;
    void Save( BOOL bSaveSource = TRUE );
private:
    static CString EscapeQuote( CString strValue );
    static CString GetModuleFileDir();
    static CString GetFieldValue( FieldsPtr fields, long nIndex );
    static CString GetComError( _com_error& e );
    static BOOL ExecuteSQL( _ConnectionPtr& pCnn, CString& strSQL, CString& strMsg );
    void GetVersion(MSXML2::IXMLDOMNode *pNode);
    void IterateChildNodes(MSXML2::IXMLDOMNode *pNode);
    void BuildImage(MSXML2::IXMLDOMNode *pNode);
    void BuildItem(MSXML2::IXMLDOMNode *pNode);
    MSXML2::IXMLDOMDocument2*        m_pDoc;            // XML DOM Document
    int                                m_nDepth;
};


复制代码

复制代码


// FeedSource.cpp: implementation of the CFeedSource class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "AgileReader.h"
#include "FeedSource.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFeedItem::CFeedItem()
{
}

CFeedItem::~CFeedItem()
{
}

CFeedSource::CFeedSource()
{

}

CFeedSource::~CFeedSource()
{

}

CFeed::CFeed()
{
    m_pDoc = NULL;
    m_nDepth = 0;
    m_bAdded = FALSE;
}

CFeed::CFeed( CString strXMLFile )
{
    m_pDoc = NULL;
    m_nDepth = 0;
    m_bAdded = FALSE;
    BuildFromFile( strXMLFile );
}

CFeed::~CFeed()
{

}

/////////////////////////////////////////////////////////////////////////////
// Build XML Feed Information from an XML File
//
// strXMLFile:        Parsed in XML File Name
// This function will build Feed Object from scratch by parsing XML Feed Information
// Result is stored in m_source and m_item objects
//
void CFeed::BuildFromFile(CString strXMLFile)
{
    CString        strTmpFile = GetModuleFileDir() + _T("\\AgileReader.xml");

    // Step 0. Download XML File
    if ( URLDownloadToFile( NULL, strXMLFile, strTmpFile,0, NULL ) != S_OK )
    {//下载XML文件
        AfxMessageBox( _T("Failed to download ") + strXMLFile );
        return;
    }


    // Step 1. Open XML Document, if open fails, then return
    if ( m_pDoc != NULL )
    {
        m_pDoc->Release();
        m_pDoc = NULL;
    }
    if ( SUCCEEDED (CoCreateInstance(MSXML2::CLSID_DOMDocument,
                                    NULL,
                                    CLSCTX_INPROC_SERVER,
                                    MSXML2::IID_IXMLDOMDocument,
                                    reinterpret_cast<void**>(&m_pDoc))))

    m_pDoc->put_async( VARIANT_FALSE );
    if ( m_pDoc->load( _bstr_t(strTmpFile) ) == VARIANT_FALSE )
    {//加载XML文档
        // Failed to load XML Document, report error message
        AfxMessageBox( _T("Failed to load XML Document") );
        return;
    }

    // Step 2. Get version property if it is available
    // Step 3. Iterate to channel node, get the following child items
    // title
    // link
    // description
    // language
    // copyright
    // webMaster
    // lastBuildDate
    // ttl
    // generator
    // Then go to image node, get the following items
    //        title
    //        url
    //        link
    //        width
    //        height
    //        description

    // Step 4. go to item node, get the following items
    //        title
    //        description
    //        link
    //        author
    //        category
    //        pubDate
    //        subject
    MSXML2::IXMLDOMNode        *pNode = NULL;
    if ( SUCCEEDED(m_pDoc->QueryInterface(MSXML2::IID_IXMLDOMNode, 
                reinterpret_cast<void**>(&pNode))))
    {
        IterateChildNodes(pNode);
        pNode->Release();
        pNode = NULL;
    }

    // We are not using smart pointer, so we have to release it outself
    if ( m_pDoc )
    {
        m_pDoc->Release();
        m_pDoc = NULL;
    }
}

/////////////////////////////////////////////////////////////////////////////
// Get Feed Version Information
//
void CFeed::GetVersion(MSXML2::IXMLDOMNode *pNode)
{
}

/////////////////////////////////////////////////////////////////////////////
// Iterate Child Node
//
void CFeed::IterateChildNodes(MSXML2::IXMLDOMNode *pNode)
{//迭代访问所有子节点
    BSTR        bstrNodeName;

    if ( pNode )
    {
        m_nDepth++;
        CString strOutput;
        pNode->get_nodeName(&bstrNodeName);

        //
        // Find out the node type (as a string).
        //
        BSTR bstrNodeType;
        pNode->get_nodeTypeString(&bstrNodeType);
        CString strType;
        strType = CString( bstrNodeType );
        SysFreeString(bstrNodeType);

        MSXML2::DOMNodeType eEnum;
        pNode->get_nodeType(&eEnum);

        CString strValue;
        BSTR bstrValue;
        switch( eEnum )
        {
            case MSXML2::NODE_TEXT:
            {
                // Text string in the XML document
                BSTR bstrValue;
                pNode->get_text(&bstrValue);
                strOutput = CString( bstrValue );
                SysFreeString(bstrValue);
                break;
            }
            case MSXML2::NODE_COMMENT:
            {
                // Comment in the XML document
                VARIANT vValue;
                pNode->get_nodeValue(&vValue);
                VariantClear(&vValue);
                break;
            }
            case MSXML2::NODE_PROCESSING_INSTRUCTION:
            {
                // Processing instruction
                strOutput = CString( bstrNodeName );
                break;
            }
            case MSXML2::NODE_ELEMENT:
            {
                // Element
                strOutput = CString( bstrNodeName );
                if ( strOutput == _T("rss") )
                {
                    GetVersion( pNode );
                }
                else if ( strOutput == _T("copyright") )
                {
                    pNode->get_text(&bstrValue);
                    m_source.m_strCopyright = CString( bstrValue );
                }
                else if ( strOutput == _T("title") && m_nDepth == 4 )
                {
                    pNode->get_text(&bstrValue);
                    m_source.m_strTitle = CString( bstrValue );
                }
                else if ( strOutput == _T("link") && m_nDepth == 4 )
                {
                    pNode->get_text(&bstrValue);
                    m_source.m_strLink = CString( bstrValue );
                }
                else if ( strOutput == _T("description") && m_nDepth == 4 )
                {
                    pNode->get_text(&bstrValue);
                    m_source.m_strDescription = CString( bstrValue );
                }
                else if ( strOutput == _T("language") )
                {
                    pNode->get_text(&bstrValue);
                    m_source.m_strLanguage = CString( bstrValue );
                }
                else if ( strOutput == _T("webMaster") )
                {
                    pNode->get_text(&bstrValue);
                    m_source.m_strWebMaster = CString( bstrValue );
                }
                else if ( strOutput == _T("lastBuildDate") )
                {
                    pNode->get_text(&bstrValue);
                    m_source.m_strLastBuildDate = CString( bstrValue );
                }
                else if ( strOutput == _T("ttl") )
                {
                    pNode->get_text(&bstrValue);
                    m_source.m_strTtl = CString( bstrValue );
                }
                else if ( strOutput == _T("generator") )
                {
                    pNode->get_text(&bstrValue);
                    m_source.m_strGenerator = CString( bstrValue );
                }
                else if ( strOutput == _T("image") )
                {
                    BuildImage( pNode );
                }
                else if ( strOutput == _T("item") )
                {
                    BuildItem( pNode );
                }
                break;
            }
            case MSXML2::NODE_DOCUMENT:
            {
                // Document
                strOutput = CString( bstrNodeName ) + _T(" - ") + CString( strType );
                break;
            }
            case MSXML2::NODE_DOCUMENT_TYPE:
            {
                // Document Type
                strOutput = CString( bstrNodeName ) + _T(" - ") + CString( strType );
                break;
            }
            case MSXML2::NODE_DOCUMENT_FRAGMENT:
            {
                // Document Fragment
                strOutput = CString( bstrNodeName ) + _T(" - ") + CString( strType );
                break;
            }
            case MSXML2::NODE_NOTATION:
            {
                // Notation
                strOutput = CString( bstrNodeName ) + _T(" - ") + CString( strType );
                break;
            }
            case MSXML2::NODE_ENTITY:
            {
                // Entity
                strOutput = CString( bstrNodeName ) + _T(" - ") + CString( strType );
                break;
            }
            case MSXML2::NODE_ENTITY_REFERENCE:
            {
                // Entity Reference
                strOutput = CString( bstrNodeName ) + _T(" - ") + CString( strType );
            }
            case MSXML2::NODE_CDATA_SECTION:
            {
                // CData section
                strOutput = CString( bstrNodeName ) + _T(" - ") + CString( strType );
            }
        }
        SysFreeString(bstrNodeName);
    }

    //
    // Any child nodes of this node need displaying too.
    //
    MSXML2::IXMLDOMNode *pNext = NULL;
    MSXML2::IXMLDOMNode *pChild;
    pNode->get_firstChild(&pChild);
    while( pChild )
    {//递归遍历子节点
        IterateChildNodes(pChild);
        pChild->get_nextSibling(&pNext);
        pChild->Release();
        pChild = pNext;
    }
    m_nDepth--;//递归深度减
}

/////////////////////////////////////////////////////////////////////////////
// Build Image Section
//
void CFeed::BuildImage(MSXML2::IXMLDOMNode *pNode)
{
    MSXML2::IXMLDOMNode *pNext = NULL;
    MSXML2::IXMLDOMNode *pChild;
    CString        strOutput;
    BSTR        bstrNodeName;
    BSTR        bstrValue;
    pNode->get_firstChild(&pChild);
    while( pChild )
    {
        pChild->get_nodeName(&bstrNodeName);
        strOutput = CString( bstrNodeName );
        if ( strOutput == _T("title") )
        {
            pChild->get_text(&bstrValue);
            m_source.m_strImageTitle = CString( bstrValue );
        }
        else if ( strOutput == _T("url") )
        {
            pChild->get_text(&bstrValue);
            m_source.m_strImageUrl = CString( bstrValue );
        }
        else if ( strOutput == _T("link") )
        {
            pChild->get_text(&bstrValue);
            m_source.m_strImageLink = CString( bstrValue );
        }
        else if ( strOutput == _T("width") )
        {
            pChild->get_text(&bstrValue);
            m_source.m_strImageWidth = CString( bstrValue );
        }
        else if ( strOutput == _T("height") )
        {
            pChild->get_text(&bstrValue);
            m_source.m_strImageHeight = CString( bstrValue );
        }
        else if ( strOutput == _T("description") )
        {
            pChild->get_text(&bstrValue);
            m_source.m_strImageDescription = CString( bstrValue );
        }

        pChild->get_nextSibling(&pNext);
        pChild->Release();
        pChild = pNext;
    }
}

/////////////////////////////////////////////////////////////////////////////
// Build Item Section
//
void CFeed::BuildItem(MSXML2::IXMLDOMNode *pNode)
{
    MSXML2::IXMLDOMNode *pNext = NULL;
    MSXML2::IXMLDOMNode *pChild;
    CString        strOutput;
    BSTR        bstrNodeName;
    CFeedItem    item;
    BSTR        bstrValue;
    pNode->get_firstChild(&pChild);
    while( pChild )
    {
        pChild->get_nodeName(&bstrNodeName);
        strOutput = CString( bstrNodeName );
        if ( strOutput == _T("title") )
        {
            pChild->get_text(&bstrValue);
            item.m_strTitle = CString( bstrValue );
        }
        else if ( strOutput == _T("description") )
        {
            pChild->get_text(&bstrValue);
            item.m_strDescription = CString( bstrValue );
        }
        else if ( strOutput == _T("link") )
        {
            pChild->get_text(&bstrValue);
            item.m_strLink = CString( bstrValue );
        }
        else if ( strOutput == _T("author") )
        {
            pChild->get_text(&bstrValue);
            item.m_strAuthor = CString( bstrValue );
        }
        else if ( strOutput == _T("category") )
        {
            pChild->get_text(&bstrValue);
            item.m_strCategory = CString( bstrValue );
        }
        else if ( strOutput == _T("pubDate") )
        {
            pChild->get_text(&bstrValue);
            item.m_strPubDate = CString( bstrValue );
        }
        else if ( strOutput == _T("subject") )
        {
            pChild->get_text(&bstrValue);
            item.m_strSubject = CString( bstrValue );
        }

        pChild->get_nextSibling(&pNext);
        pChild->Release();
        pChild = pNext;
    }
    m_item.Add( item );
}

/////////////////////////////////////////////////////////////////////////////
// Save Feed Information into Database
//
void CFeed::Save( BOOL bSaveSource /*= TRUE*/ )
{//保持RSS种子信息倒数据库种
    _ConnectionPtr        pCnn = NULL;
    CString                strSQL;
    CString                strMsg;
    int                    nIndex;

    // Step 1. Create object
    pCnn.CreateInstance( __uuidof( Connection ) );
    if ( pCnn == NULL )
    {
        AfxMessageBox( _T("Can not create connection object, please install MDAC!") );
        return;
    }

    // Step 2. Open connection
    try
    {
        CString        strCnn;
        strCnn.Format( _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\AgileReader.mdb;Jet OLEDB:Database Password=philips;"), GetModuleFileDir() );
        pCnn->Open( _bstr_t(strCnn), "", "", adConnectUnspecified );
    }
    catch( _com_error& e )
    {
        AfxMessageBox( _T("Can not open connection:\n") + GetComError( e ) );
        pCnn.Release();
        return;
    }

    // Step 3. Execute Insert Statement on FeedSource
    // In double click case, we don't want to save this
    if ( bSaveSource )
    {
        strSQL.Format( _T("insert into FeedSource (FeedLink, description, title, version, copyright, generator, feedlanguage, lastbuilddate, ttl, webmaster, imagedescription, imageheight, imagewidth, imagelink, imagetitle, imageurl ) values('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s')"),
            EscapeQuote( m_source.m_strLink ),
            EscapeQuote( m_source.m_strDescription ),
            EscapeQuote( m_source.m_strTitle ),
            _T("2.0"),
            EscapeQuote( m_source.m_strCopyright ),
            EscapeQuote( m_source.m_strGenerator ),
            EscapeQuote( m_source.m_strLanguage ),
            EscapeQuote( m_source.m_strLastBuildDate ),
            EscapeQuote( m_source.m_strTtl ),
            EscapeQuote( m_source.m_strWebMaster ),
            EscapeQuote( m_source.m_strImageDescription ),
            EscapeQuote( m_source.m_strImageHeight ),
            EscapeQuote( m_source.m_strImageWidth ),
            EscapeQuote( m_source.m_strImageLink ),
            EscapeQuote( m_source.m_strImageTitle ),
            EscapeQuote( m_source.m_strImageUrl ) );
        if ( !ExecuteSQL( pCnn, strSQL, strMsg ) )
        {
            // AfxMessageBox( strMsg + strSQL );
        }
        else
        {
            m_bAdded = TRUE;
        }
    }

  // Step 4. Execute Insert Statement on FeedItem
    for( nIndex = 0; nIndex < m_item.GetSize(); nIndex++ )
    {
        strSQL.Format( _T("insert into FeedItem (FeedLink, title, link, description, pubdate, author, category, subject) values('%s','%s','%s','%s','%s','%s','%s','%s')"),
            EscapeQuote( m_source.m_strLink ),
            EscapeQuote( m_item[nIndex].m_strTitle ),
            EscapeQuote( m_item[nIndex].m_strLink ),
            EscapeQuote( m_item[nIndex].m_strDescription ),
            EscapeQuote( m_item[nIndex].m_strPubDate ),
            EscapeQuote( m_item[nIndex].m_strAuthor ),
            EscapeQuote( m_item[nIndex].m_strCategory ),
            EscapeQuote( m_item[nIndex].m_strSubject )
            );
        if ( !ExecuteSQL( pCnn, strSQL, strMsg ) )
        {
            // AfxMessageBox( strMsg + strSQL );
        }
    }

    pCnn.Release();
}

/////////////////////////////////////////////////////////////////////////////
// Execute SQL Statement and return error message if any
//
BOOL CFeed::ExecuteSQL(_ConnectionPtr &pCnn, CString &strSQL, CString& strMsg)
{
    try
    {
        pCnn->Execute( _bstr_t( strSQL ), NULL, adCmdText );
    }
    catch( _com_error& e )
    {
        strMsg = GetComError( e );
        return FALSE;
    }
    return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// Retrieve Com Error Information
//
CString CFeed::GetComError( _com_error& e )
{
    CString        strMsg;

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    
    strMsg.Format( _T("Code = %08lx\nCode meaning = %s\nSource = %s\nDescription = %s"),
        e.Error(),
        e.ErrorMessage(),
        (LPCSTR) bstrSource,
        (LPCSTR) bstrDescription );
    return strMsg;
}

/////////////////////////////////////////////////////////////////////////////
// Load Feed Information from database
//
void CFeed::LoadLocal(CString &strLink)
{//从数据库中读取RSS种子信息
    _ConnectionPtr        pCnn = NULL;
    CString                strSQL;
    CString                strMsg;
    _RecordsetPtr        rs = NULL;

    // Step 1. Create object
    pCnn.CreateInstance( __uuidof( Connection ) );
    if ( pCnn == NULL )
    {
        AfxMessageBox( _T("Can not create connection object, please install MDAC!") );
        return;
    }

    // Step 2. Open connection
    try
    {
        CString        strCnn;
        strCnn.Format( _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\AgileReader.mdb;Jet OLEDB:Database Password=philips;"), GetModuleFileDir() );
        pCnn->Open( _bstr_t(strCnn), "", "", adConnectUnspecified );
    }
    catch( _com_error& e )
    {
        AfxMessageBox( _T("Can not open connection:\n") + GetComError( e ) );
        pCnn.Release();
        return;
    }

    // Step 3. Read FeedSource and populate it into m_source object
    strSQL.Format( _T("select * from FeedSource where FeedLink = '%s'"), strLink );
    try
    {
        rs = pCnn->Execute( _bstr_t( strSQL ), NULL, adCmdText );
        if ( rs != NULL && rs->adoEOF != TRUE )
        {
            m_source.m_strLink = strLink;
            m_source.m_strDescription = GetFieldValue( rs->Fields, 1 );
            m_source.m_strTitle = GetFieldValue( rs->Fields, 2 );
            m_source.m_strVersion = GetFieldValue( rs->Fields, 3 );
            m_source.m_strCopyright = GetFieldValue( rs->Fields, 4 );
            m_source.m_strGenerator = GetFieldValue( rs->Fields, 5 );
            m_source.m_strLanguage = GetFieldValue( rs->Fields, 6 );
            m_source.m_strLastBuildDate = GetFieldValue( rs->Fields, 7 );
            m_source.m_strTtl = GetFieldValue( rs->Fields, 8 );
            m_source.m_strWebMaster = GetFieldValue( rs->Fields, 9 );
            m_source.m_strImageDescription = GetFieldValue( rs->Fields, 10 );
            m_source.m_strImageHeight = GetFieldValue( rs->Fields, 11 );
            m_source.m_strImageWidth = GetFieldValue( rs->Fields, 12 );
            m_source.m_strImageLink = GetFieldValue( rs->Fields, 13 );
            m_source.m_strImageTitle = GetFieldValue( rs->Fields, 14 );
            m_source.m_strImageUrl = GetFieldValue( rs->Fields, 15 );
        }
    }
    catch( _com_error& e )
    {
        AfxMessageBox( GetComError( e ) );
    }
    rs.Release();
    rs = NULL;

    // Step 4. Read FeedItem and populate it into m_item object
    strSQL.Format( _T("select * from FeedItem where FeedLink = '%s' order by pubDate desc, title asc"), strLink );
    try
    {
        rs = pCnn->Execute( _bstr_t( strSQL ), NULL, adCmdText );
        while( rs != NULL && rs->adoEOF != TRUE )
        {
            if ( rs->adoEOF )
            {
                break;
            }
            CFeedItem    item;
            item.m_strTitle = GetFieldValue( rs->Fields, 1 );
            item.m_strLink = GetFieldValue( rs->Fields, 2 );
            item.m_strDescription = GetFieldValue( rs->Fields, 3 );
            item.m_strPubDate = GetFieldValue( rs->Fields, 4 );
            item.m_strAuthor = GetFieldValue( rs->Fields, 5 );
            item.m_strCategory = GetFieldValue( rs->Fields, 6 );
            item.m_strSubject = GetFieldValue( rs->Fields, 7 );
            item.m_strReadStatus = GetFieldValue( rs->Fields, 8 );
            m_item.Add( item );
            rs->MoveNext();
            if ( rs->adoEOF )
            {
                break;
            }
        }
    }
    catch( _com_error& e )
    {
        AfxMessageBox( GetComError( e ) );
    }
    rs.Release();
    rs = NULL;

    pCnn.Release();
    pCnn = NULL;
}

/////////////////////////////////////////////////////////////////////////////
// Get Field Value
//
CString CFeed::GetFieldValue(FieldsPtr fields, long nIndex)
{
    _variant_t vt = fields->GetItem( nIndex )->Value;
    if ( vt.vt == VT_NULL || vt.vt == VT_EMPTY )
    {
        return _T("");
    }
    return CString( (char*)_bstr_t( vt ) );
}

void CFeed::GetFeedSourceList( CStringArray& strTitleArray, CStringArray& strLinkArray )
{
    _ConnectionPtr        pCnn = NULL;
    CString                strSQL;
    CString                strMsg;
    _RecordsetPtr        rs = NULL;

    // Step 1. Create object
    pCnn.CreateInstance( __uuidof( Connection ) );
    if ( pCnn == NULL )
    {
        AfxMessageBox( _T("Can not create connection object, please install MDAC!") );
        return;
    }

    // Step 2. Open connection
    try
    {
        CString        strCnn;
        strCnn.Format( _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\AgileReader.mdb;Jet OLEDB:Database Password=philips;"), GetModuleFileDir() );
        pCnn->Open( _bstr_t(strCnn), "", "", adConnectUnspecified );
    }
    catch( _com_error& e )
    {
        AfxMessageBox( _T("Can not open connection:\n") + GetComError( e ) );
        pCnn.Release();
        return;
    }

    // Step 3. Read FeedSource and populate it into m_source object
    strSQL = _T("select distinct title, FeedLink from FeedSource order by title");
    try
    {
        rs = pCnn->Execute( _bstr_t( strSQL ), NULL, adCmdText );
        while ( rs != NULL && rs->adoEOF != TRUE && rs->BOF != TRUE )
        {
            if ( rs->adoEOF )
            {
                break;
            }
            strTitleArray.Add( GetFieldValue( rs->Fields, 0 ) );
            strLinkArray.Add( GetFieldValue( rs->Fields, 1 ) );
            rs->MoveNext();
        }
    }
    catch( _com_error& e )
    {
        AfxMessageBox( GetComError( e ) );
    }
    rs.Release();
    rs = NULL;
    pCnn.Release();
}

/////////////////////////////////////////////////////////////////////////////
// Get Module File Path
//
CString CFeed::GetModuleFileDir()
{//获取模块文件路径
    DWORD    dwLength, dwSize;
    TCHAR    szFileName [MAX_PATH];
    CString    strFileName;
    int        nPos;
    
    dwSize = sizeof (szFileName) / sizeof (szFileName [0]);
    dwLength = ::GetModuleFileName (AfxGetInstanceHandle(), szFileName, dwSize);
    if (dwLength <= 0) 
    {
        return _T("");
    }

    strFileName = szFileName;
    nPos = strFileName.ReverseFind( '\\' );
    return strFileName.Left( nPos );
}

/////////////////////////////////////////////////////////////////////////////
// Escape Single Quote
//
CString CFeed::EscapeQuote(CString strValue)
{
    strValue.Replace( _T("'"), _T("''") );
    return strValue;
}

/////////////////////////////////////////////////////////////////////////////
// Delete list from Database
//
void CFeed::DeleteListArray(CStringArray &strLinkArray)
{
    _ConnectionPtr        pCnn = NULL;
    CString                strSQL;
    CString                strMsg;
    int                    nIndex;

    // Step 1. Create object
    pCnn.CreateInstance( __uuidof( Connection ) );
    if ( pCnn == NULL )
    {
        AfxMessageBox( _T("Can not create connection object, please install MDAC!") );
        return;
    }

    // Step 2. Open connection
    try
    {
        CString        strCnn;
        strCnn.Format( _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\AgileReader.mdb;Jet OLEDB:Database Password=philips;"), GetModuleFileDir() );
        pCnn->Open( _bstr_t(strCnn), "", "", adConnectUnspecified );
    }
    catch( _com_error& e )
    {
        AfxMessageBox( _T("Can not open connection:\n") + GetComError( e ) );
        pCnn.Release();
        return;
    }

    // Step 3. Delete Link from FeedList table
    for(nIndex = 0; nIndex < strLinkArray.GetSize(); nIndex++ )
    {
        strSQL.Format( _T("delete from FeedItem where link = '%s'"), EscapeQuote( strLinkArray[nIndex] ) );
        ExecuteSQL( pCnn, strSQL, strMsg );
    }

    // Step 4. Done!
    pCnn.Release();
}

/////////////////////////////////////////////////////////////////////////////
// Delete Feed Source
//
void CFeed::DeleteFeedSource(CString strLink)
{
    _ConnectionPtr        pCnn = NULL;
    CString                strSQL;
    CString                strMsg;

    // Step 1. Create object
    pCnn.CreateInstance( __uuidof( Connection ) );
    if ( pCnn == NULL )
    {
        AfxMessageBox( _T("Can not create connection object, please install MDAC!") );
        return;
    }

    // Step 2. Open connection
    try
    {
        CString        strCnn;
        strCnn.Format( _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\AgileReader.mdb;Jet OLEDB:Database Password=philips;"), GetModuleFileDir() );
        pCnn->Open( _bstr_t(strCnn), "", "", adConnectUnspecified );
    }
    catch( _com_error& e )
    {
        AfxMessageBox( _T("Can not open connection:\n") + GetComError( e ) );
        pCnn.Release();
        return;
    }

    // Step 3. Delete Link from FeedList table
    strSQL.Format( _T("delete from FeedSource where FeedLink = '%s'"), EscapeQuote( strLink ) );
    ExecuteSQL( pCnn, strSQL, strMsg );

    // Step 4. Done!
    pCnn.Release();
}

/////////////////////////////////////////////////////////////////////////////
// Mark an item as read
//
void CFeed::MarkItemRead(CString strLink)
{//标记Rss条目为已读状态
    _ConnectionPtr        pCnn = NULL;
    CString                strSQL;
    CString                strMsg;

    // Step 1. Create object
    pCnn.CreateInstance( __uuidof( Connection ) );
    if ( pCnn == NULL )
    {
        AfxMessageBox( _T("Can not create connection object, please install MDAC!") );
        return;
    }

    // Step 2. Open connection
    try
    {
        CString        strCnn;
        strCnn.Format( _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\AgileReader.mdb;Jet OLEDB:Database Password=philips;"), GetModuleFileDir() );
        pCnn->Open( _bstr_t(strCnn), "", "", adConnectUnspecified );
    }
    catch( _com_error& e )
    {
        AfxMessageBox( _T("Can not open connection:\n") + GetComError( e ) );
        pCnn.Release();
        return;
    }

    // Step 3. Delete Link from FeedList table
    strSQL.Format( _T("update FeedItem set readstatus = 1 where link = '%s'"), EscapeQuote( strLink ) );
    ExecuteSQL( pCnn, strSQL, strMsg );

    // Step 4. Done!
    pCnn.Release();
}

/////////////////////////////////////////////////////////////////////////////
// Refresh All SubScriptions
//
void CFeed::RefreshAll()
{//刷新订阅信息
    _ConnectionPtr        pCnn = NULL;
    CString                strSQL;
    CString                strMsg;
    CStringArray        strLinkArray;
    _RecordsetPtr        rs = NULL;

    // Step 1. Create object
    pCnn.CreateInstance( __uuidof( Connection ) );
    if ( pCnn == NULL )
    {
        AfxMessageBox( _T("Can not create connection object, please install MDAC!") );
        return;
    }

    // Step 2. Open connection
    try
    {
        CString        strCnn;
        strCnn.Format( _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\AgileReader.mdb;Jet OLEDB:Database Password=philips;"), GetModuleFileDir() );
        pCnn->Open( _bstr_t(strCnn), "", "", adConnectUnspecified );
    }
    catch( _com_error& e )
    {
        AfxMessageBox( _T("Can not open connection:\n") + GetComError( e ) );
        pCnn.Release();
        return;
    }

    // Step 3. Get all the subscriptions
    strSQL = _T("select FeedLink from FeedSource");
    try
    {
        rs = pCnn->Execute( _bstr_t( strSQL ), NULL, adCmdText );
        while ( rs != NULL && rs->adoEOF != TRUE )
        {
            if ( rs->adoEOF )
            {
                break;
            }
            strLinkArray.Add( GetFieldValue( rs->Fields, 0 ) );
            rs->MoveNext();
        }
    }
    catch( _com_error& e )
    {
        AfxMessageBox( GetComError( e ) );
    }
    rs.Release();
    rs = NULL;

    // Step 4. Refreah each link
    for( int nIndex = 0; nIndex < strLinkArray.GetSize(); nIndex++ )
    {
        CFeed    feed( strLinkArray.GetAt( nIndex ) );
        feed.m_source.m_strLink = strLinkArray.GetAt( nIndex );
        feed.Save();
    }

    // Step 5. Done!
    pCnn.Release();
}


复制代码




本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/07/11/1240757.html,如需转载请自行联系原作者
目录
相关文章
05EasyUI 应用- 创建 RSS Feed 阅读器
05EasyUI 应用- 创建 RSS Feed 阅读器
53 0
|
监控 搜索推荐
最佳RSS阅读器
最佳RSS阅读器
|
XML JavaScript Android开发
网易新闻RSS阅读器
网易新闻RSS阅读器
392 2
|
安全 小程序 网络安全
安全信息流工具-中文安全RSS小程序
网络安全资讯的RSS订阅,网络安全博客的RSS订阅,网络安全公众号的RSS订阅,可在中文安全RSS小程序自定义自己的安全资讯信息流,并查看最新文章内容、可分享、收藏、稍后阅读等等。
544 0
安全信息流工具-中文安全RSS小程序
|
XML 数据格式
[UWP]涨姿势UWP源码——RSS feed的获取和解析
原文:[UWP]涨姿势UWP源码——RSS feed的获取和解析   本篇开始具体分析涨姿势UWP这个APP的代码,首先从数据的源头着手,即RSS feed的获取和解析,相关的类为RssReader,所有和数据相关的操作均放在里面。
1572 0