' ******************************************************************************
' **
' ** 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 Finance.API
''' <summary>
''' Provides methods for downloading quote options.
''' </summary>
''' <remarks></remarks>
Public Class QuoteOptionsDownload
Inherits Base.Download
''' <summary>
''' Raises if an asynchronous download of quote options completes
''' </summary>
''' <param name="sender">The event raising object</param>
''' <param name="ea">The event args of the asynchronous download</param>
''' <remarks></remarks>
Public Event AsyncDownloadCompleted(ByVal sender As Base.Download, ByVal ea As QuoteOptionsDownloadCompletedEventArgs)
Friend ReadOnly mFinanceHelper As New FinanceHelper
Private mXmlParser As New ImportExport.XML
''' <summary>
''' Downloads quote options.
''' </summary>
''' <param name="managedID">The managed ID</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Download(ByVal managedID As IID) As QuoteOptionsResponse
If managedID Is Nothing Then : Throw New ArgumentNullException("managedID", "The passed ID is null.")
Else : Return Me.Download(managedID.ID)
End If
End Function
''' <summary>
''' Downloads quote options.
''' </summary>
''' <param name="unmanagedID">The unmanaged ID</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Download(ByVal unmanagedID As String) As QuoteOptionsResponse
If unmanagedID = String.Empty Then : Throw New ArgumentNullException("unmanagedID", "The passed ID is empty.")
Else : Return Me.Download(New String() {unmanagedID})
End If
End Function
''' <summary>
''' Downloads quote options.
''' </summary>
''' <param name="managedIDs">The managed IDs</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Download(ByVal managedIDs As IEnumerable(Of IID)) As QuoteOptionsResponse
If managedIDs Is Nothing Then : Throw New ArgumentNullException("managedIDs", "The passed list is null.")
Else : Return Me.Download(mFinanceHelper.IIDsToStrings(managedIDs))
End If
End Function
''' <summary>
''' Downloads quote options.
''' </summary>
''' <param name="unmanagedIDs">The unmanaged IDs</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Download(ByVal unmanagedIDs As IEnumerable(Of String)) As QuoteOptionsResponse
If unmanagedIDs Is Nothing Then : Throw New ArgumentNullException("unmanagedIDs", "The passed list is null.")
Else : Return Me.ToResponse(MyBase.DownloadStream(Me.DownloadURL(unmanagedIDs)))
End If
End Function
''' <summary>
''' Starts an asynchronous download of quote options.
''' </summary>
''' <param name="managedID">The unmanaged ID</param>
''' <param name="userArgs">Individual user argument</param>
''' <remarks></remarks>
Public Overloads Sub DownloadAsync(ByVal managedID As IID, Optional ByVal userArgs As Object = Nothing)
If managedID Is Nothing Then Throw New ArgumentNullException("managedID", "The passed ID is null.")
Me.DownloadAsync(managedID.ID, userArgs)
End Sub
''' <summary>
''' Starts an asynchronous download of quote options.
''' </summary>
''' <param name="unmanagedID">The unmanaged ID</param>
''' <param name="userArgs">Individual user argument</param>
''' <remarks></remarks>
Public Overloads Sub DownloadAsync(ByVal unmanagedID As String, Optional ByVal userArgs As Object = Nothing)
If unmanagedID = String.Empty Then Throw New ArgumentNullException("unmanagedID", "The passed ID is empty.")
Me.DownloadAsync(New String() {unmanagedID}, userArgs)
End Sub
''' <summary>
''' Starts an asynchronous download of quote options.
''' </summary>
''' <param name="managedIDs">The managed list of IDs</param>
''' <param name="userArgs">Individual user argument</param>
''' <remarks></remarks>
Public Overloads Sub DownloadAsync(ByVal managedIDs As IEnumerable(Of IID), Optional ByVal userArgs As Object = Nothing)
If managedIDs Is Nothing Then Throw New ArgumentNullException("managedID", "The passed list is null.")
Me.DownloadAsync(mFinanceHelper.IIDsToStrings(managedIDs), userArgs)
End Sub
''' <summary>
''' Starts an asynchronous download of quote options.
''' </summary>
''' <param name="unmanagedIDs">The unmanaged list of IDs</param>
''' <param name="userArgs">Individual user argument</param>
''' <remarks></remarks>
Public Overloads Sub DownloadAsync(ByVal unmanagedIDs As IEnumerable(Of String), Optional ByVal userArgs As Object = Nothing)
If unmanagedIDs Is Nothing Then Throw New ArgumentNullException("unmanagedIDs", "The passed list is null.")
Dim args As New AsyncDownloadArgs(userArgs, mHelper.EnumToArray(unmanagedIDs))
MyBase.DownloadStreamAsync(Me.DownloadURL(args.IDs), args)
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
If e IsNot Nothing AndAlso e.UserArgs IsNot Nothing AndAlso TypeOf e.UserArgs Is AsyncDownloadArgs Then
Dim dlArgs As AsyncDownloadArgs = DirectCast(e.UserArgs, AsyncDownloadArgs)
Dim args As New QuoteOptionsDownloadCompletedEventArgs(dlArgs.UserArgs, Me.ToResponse(e.Response), dlArgs.IDs)
RaiseEvent AsyncDownloadCompleted(Me, args)
End If
End Sub
Private Function DownloadURL(ByVal unmanagedIDs As IEnumerable(Of String)) As String
Dim lst() As String = mHelper.EnumToArray(unmanagedIDs)
If lst.Length > 0 Then
Dim whereClause As New Text.StringBuilder
whereClause.Append("symbol in (")
For Each id As String In unmanagedIDs
whereClause.Append(""""c)
whereClause.Append(mHelper.CleanYqlParam(id))
whereClause.Append(""",")
Next
whereClause.Remove(whereClause.Length - 1, 1)
whereClause.Append(")"c)
Return mHelper.YqlUrl("*"c, "yahoo.finance.options", whereClause.ToString, Nothing, False)
Else
Throw New NotSupportedException("An empty id list will not be supported.")
End If
End Function
Private Function ToResponse(ByVal resp As Base.StreamResponse) As QuoteOptionsResponse
Dim options As New List(Of QuoteOptionDataChain)
Dim culture As New Globalization.CultureInfo("en-US")
Dim mainLst() As XmlNode = mHelper.GetResultsFromXml(resp.Result, "optionsChain")
For Each chain As XmlNode In mainLst
Dim idAtt As XmlAttribute = chain.Attributes("symbol")
Dim lst As New List(Of QuoteOptionData)
For Each optionNode As XmlNode In chain.ChildNodes
If optionNode.Name = "option" Then
Dim opt As QuoteOptionData = mXmlParser.ToQuoteOption(optionNode, culture)
If opt IsNot Nothing Then lst.Add(opt)
End If
Next
options.Add(New QuoteOptionDataChain(idAtt.Value, lst))
Next
Return New QuoteOptionsResponse(resp.Connection, options.ToArray)
End Function
Private Class AsyncDownloadArgs
Inherits Base.DownloadEventArgs
Public IDs() As String
Public Sub New(ByVal userArgs As Object, ByVal id() As String)
MyBase.New(userArgs)
Me.IDs = id
End Sub
End Class
End Class
''' <summary>
''' Stores the received quote informations of an asynchronous download.
''' </summary>
''' <remarks></remarks>
Public Class QuoteOptionsDownloadCompletedEventArgs
Inherits Base.DownloadCompletedEventArgs
Private mIDs() As String
''' <summary>
''' The requested IDs of the download.
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public ReadOnly Property IDs() As IEnumerable(Of String)
Get
Return mIDs
End Get
End Property
''' <summary>
''' Gets the response with quote options.
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Overloads ReadOnly Property Response() As QuoteOptionsResponse
Get
Return DirectCast(MyBase.Response, QuoteOptionsResponse)
End Get
End Property
Friend Sub New(ByVal userArgs As Object, ByVal resp As QuoteOptionsResponse, ByVal ids() As String)
MyBase.New(userArgs, resp)
mIDs = ids
End Sub
End Class
''' <summary>
''' Provides information and response of an asynchronous quote otions download.
''' </summary>
''' <remarks></remarks>
Public Class QuoteOptionsResponse
Inherits Base.Response
''' <summary>
''' Gets the received quote options.
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Overloads ReadOnly Property Result() As QuoteOptionDataChain()
Get
Return DirectCast(MyBase.Result, QuoteOptionDataChain())
End Get
End Property
Friend Sub New(ByVal info As Base.ConnectionInfo, ByVal result As QuoteOptionDataChain())
MyBase.New(info, result)
End Sub
End Class
End Namespace