Click here to Skip to main content
15,891,876 members
Articles / Mobile Apps

Yahoo! Managed

Rate me:
Please Sign up or sign in to vote.
4.87/5 (56 votes)
8 Jan 2015Apache12 min read 527.5K   25.5K   262  
Download financial data, managing online portfolio or using Search BOSS from Yahoo! with .NET
' ******************************************************************************
' ** 
' **  Yahoo Finance Managed
' **  Written by Marius Häusler 2010
' **  It would be pleasant, if you contact me when you are using this code.
' **  Contact: YahooFinanceManaged@gmail.com
' **  Project Home: http://code.google.com/p/yahoo-finance-managed/
' **  
' ******************************************************************************
' **  
' **  Copyright 2010 Marius Häusler
' **  
' **  Licensed under the Apache License, Version 2.0 (the "License");
' **  you may not use this file except in compliance with the License.
' **  You may obtain a copy of the License at
' **  
' **    http://www.apache.org/licenses/LICENSE-2.0
' **  
' **  Unless required by applicable law or agreed to in writing, software
' **  distributed under the License is distributed on an "AS IS" BASIS,
' **  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
' **  See the License for the specific language governing permissions and
' **  limitations under the License.
' ** 
' ******************************************************************************


Namespace RSS

    ''' <summary>
    ''' Class for downloading RSS feeds
    ''' </summary>
    ''' <remarks></remarks>
    Public Class FeedDownload
        Inherits base.Download
        Public Event AsyncDownloadCompleted(ByVal sender As base.Download, ByVal ea As FeedDownloadCompletedEventArgs)

        Private mXmlParser As New ImportExport.XML

        Public Function Download(ByVal url As String) As FeedResponse
            If url = String.Empty Then Throw New ArgumentNullException("url", "The url is empty.")
            Return Me.Download(New Uri(url))
        End Function
        Public Function Download(ByVal url As Uri) As FeedResponse
            If url Is Nothing Then Throw New ArgumentNullException("url", "The url is null.")
            Return Me.Download(New Uri() {url})
        End Function
        Public Function Download(ByVal urls As IEnumerable(Of String)) As FeedResponse
            If urls Is Nothing Then Throw New ArgumentNullException("urls", "The list is null.")
            Dim lst As New List(Of Uri)
            For Each url In urls
                lst.Add(New Uri(url))
            Next
            Return Me.Download(lst)
        End Function
        Public Function Download(ByVal urls As IEnumerable(Of Uri)) As FeedResponse
            If urls Is Nothing Then Throw New ArgumentNullException("urls", "The list is null.")
            Return Me.ToResponse(MyBase.DownloadStream(Me.DownloadUrl(urls)))
        End Function


        Public Overloads Sub DownloadAsync(ByVal url As String, Optional ByVal userArgs As Object = Nothing)
            If url = String.Empty Then Throw New ArgumentNullException("url", "The url is empty.")
            Me.DownloadAsync(New Uri(url), userArgs)
        End Sub
        Public Overloads Sub DownloadAsync(ByVal url As Uri, Optional ByVal userArgs As Object = Nothing)
            If url Is Nothing Then Throw New ArgumentNullException("url", "The url is null.")
            Me.DownloadAsync(New Uri() {url}, userArgs)
        End Sub
        Public Overloads Sub DownloadAsync(ByVal urls As IEnumerable(Of String), Optional ByVal userArgs As Object = Nothing)
            If urls Is Nothing Then Throw New ArgumentNullException("urls", "The list is null.")
            Dim lst As New List(Of Uri)
            For Each url In urls
                lst.Add(New Uri(url))
            Next
            Me.DownloadAsync(lst, userArgs)
        End Sub
        Public Overloads Sub DownloadAsync(ByVal urls As IEnumerable(Of Uri), Optional ByVal userArgs As Object = Nothing)
            If urls Is Nothing Then Throw New ArgumentNullException("urls", "The list is null.")
            MyBase.DownloadStreamAsync(Me.DownloadUrl(urls), New AsyncDownloadArgs(userArgs) With {.URLs = mHelper.EnumToArray(urls)})
        End Sub

        ''' <summary>
        ''' Default constructor
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New()
        End Sub

        Private Sub DownloadAsync_Completed(ByVal sender As base.Download, ByVal e As base.StreamDownloadCompletedEventArgs) Handles MyBase.AsyncStreamDownloadCompleted
            Dim dlArgs As AsyncDownloadArgs = DirectCast(e.UserArgs, AsyncDownloadArgs)
            Dim args As New FeedDownloadCompletedEventArgs(dlArgs.UserArgs, Me.ToResponse(e.Response), dlArgs.URLs)
            RaiseEvent AsyncDownloadCompleted(Me, args)
        End Sub

        Private Function DownloadUrl(ByVal urls As IEnumerable(Of Uri)) As String
            Dim arr() As Uri = mHelper.EnumToArray(urls)
            If arr.Length > 0 Then
                If arr.Length = 1 Then
                    Return arr(0).ToString
                Else
                    Dim whereClause As New Text.StringBuilder("url in (")
                    For i As Integer = 0 To arr.Length - 1
                        whereClause.Append("'")
                        whereClause.Append(arr(i).ToString)
                        whereClause.Append("'")
                        If i < arr.Length - 1 Then whereClause.Append(",")
                    Next
                    whereClause.Append(")")
                    Return mHelper.YqlUrl("*", "xml", whereClause.ToString, Nothing, False)
                End If
            Else
                Throw New ArgumentException("The list of urls is empty", "urls")
            End If
        End Function

        Private Function ToResponse(ByVal resp As base.StreamResponse) As FeedResponse
            Dim feeds As New List(Of Feed)
            Dim enc As System.Text.Encoding = Nothing
            Try
                Dim doc As New XmlDocument
                doc.Load(resp.Result)
                If doc.FirstChild IsNot Nothing AndAlso TypeOf doc.FirstChild Is XmlDeclaration Then
                    Try
                        enc = System.Text.Encoding.GetEncoding(DirectCast(doc.FirstChild, XmlDeclaration).Encoding)
                    Catch ex As Exception
                    End Try
                End If
                For Each f As XmlNode In doc.GetElementsByTagName("channel")
                    feeds.Add(mXmlParser.ToFeed(f))
                Next
            Catch ex As Exception
            Finally
                mHelper.CloseStream(resp.Result)
            End Try
            Return New FeedResponse(resp.Connection, feeds.ToArray, enc)
        End Function

        Private Class AsyncDownloadArgs
            Inherits base.DownloadEventArgs
            Public URLs() As Uri
            Public Sub New(ByVal userArgs As Object)
                MyBase.New(userArgs)
            End Sub
        End Class

    End Class

    Public Class FeedDownloadCompletedEventArgs
        Inherits base.DownloadCompletedEventArgs

        Private mURLs() As Uri

        Public ReadOnly Property URLs() As Uri()
            Get
                Return mURLs
            End Get
        End Property
        Public Overloads ReadOnly Property Response() As FeedResponse
            Get
                Return DirectCast(MyBase.Response, FeedResponse)
            End Get
        End Property

        Friend Sub New(ByVal userArgs As Object, ByVal resp As FeedResponse, ByVal urls() As Uri)
            MyBase.New(userArgs, resp)
            mURLs = urls
        End Sub

    End Class

    Public Class FeedResponse
        Inherits base.Response

        Private mEncoding As System.Text.Encoding = Nothing

        Public ReadOnly Property Encoding() As System.Text.Encoding
            Get
                Return mEncoding
            End Get
        End Property
        Public Overloads ReadOnly Property Result() As Feed()
            Get
                Return TryCast(MyBase.Result, Feed())
            End Get
        End Property

        Friend Sub New(ByVal info As base.ConnectionInfo, ByVal result() As Feed, ByVal enc As System.Text.Encoding)
            MyBase.New(info, result)
            mEncoding = enc
        End Sub

    End Class

End Namespace

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Apache License, Version 2.0


Written By
Germany Germany
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions