' ******************************************************************************
' **
' ** 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.Support
''' <summary>
''' Class for downloading exchange data
''' </summary>
''' <remarks></remarks>
Public Class ExchangeRateDownload
Inherits API.QuotesBaseDownload
''' <summary>
''' Raises if an asynchronous download of exchange rates 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 AsyncRateDownloadCompleted(ByVal sender As Base.Download, ByVal ea As ExchangeRateDownloadCompletedEventArgs)
''' <summary>
''' Downloads a list of currency exchange rates
''' </summary>
''' <param name="currencies">List of all currency-pairs</param>
''' <returns></returns>
''' <remarks></remarks>
Public Overloads Function Download(ByVal currencies() As YCurrencyID) As ExchangeRateResponse
If currencies Is Nothing Then : Throw New ArgumentNullException("currencies", "The passed currencies have no values.")
Else : Return Me.ToResponse(MyBase.Download(mFinanceHelper.IIDsToStrings(currencies)))
End If
End Function
''' <summary>
''' Starts an asynchronous download of currency exchange rates
''' </summary>
''' <param name="currencies">List of all currency-pairs</param>
''' <param name="userArgs">Individual user argument</param>
''' <remarks></remarks>
Public Overloads Sub DownloadAsync(ByVal currencies() As YCurrencyID, Optional ByVal userArgs As Object = Nothing)
If currencies Is Nothing Then : Throw New ArgumentNullException("currencies", "The passed currencies have no values.")
Else
Dim args As New AsyncDownloadArgs(userArgs, currencies)
MyBase.DownloadAsync(mFinanceHelper.IIDsToStrings(args.Currencies), args)
End If
End Sub
''' <summary>
''' Default constructor
''' </summary>
''' <remarks></remarks>
Public Sub New()
End Sub
Private Sub DownloadAsync_Completed(ByVal sender As Base.Download, ByVal ba As API.QuotesBaseDownloadCompletedEventArgs) Handles MyBase.AsyncDownloadCompleted
If ba IsNot Nothing Then
Dim userArgs As Object = Nothing
Dim curs() As Support.YCurrencyID = Nothing
If ba.UserArgs IsNot Nothing AndAlso TypeOf ba.UserArgs Is ExchangeRateDownload.AsyncDownloadArgs Then
Dim dlArgs As AsyncDownloadArgs = DirectCast(ba.UserArgs, AsyncDownloadArgs)
userArgs = dlArgs.UserArgs
curs = dlArgs.Currencies
Else
userArgs = ba.UserArgs
Dim lst As New List(Of Support.YCurrencyID)
For Each id In ba.IDs
Dim curID As YCurrencyID = mFinanceHelper.YCurrencyIDFromString(id)
If curID IsNot Nothing Then lst.Add(curID)
Next
curs = lst.ToArray
End If
Dim args As New ExchangeRateDownloadCompletedEventArgs(userArgs, Me.ToResponse(ba.Response), curs)
RaiseEvent AsyncRateDownloadCompleted(Me, args)
End If
End Sub
Private Function ToResponse(ByVal resp As API.QuotesBaseResponse) As ExchangeRateResponse
Dim lst As New List(Of ExchangeRateData)
If resp.Result IsNot Nothing Then
For Each q As QuoteBaseData In resp.Result
Dim cur As YCurrencyID = mFinanceHelper.YCurrencyIDFromString(q.ID)
If cur IsNot Nothing Then lst.Add(New ExchangeRateData(cur.BaseCurrency, cur.DepCurrency, q))
Next
End If
Return New ExchangeRateResponse(resp.Connection, lst.ToArray)
End Function
Private Class AsyncDownloadArgs
Inherits Base.DownloadEventArgs
Public Currencies() As YCurrencyID
Public Sub New(ByVal userArgs As Object, ByVal curs() As YCurrencyID)
MyBase.New(userArgs)
Me.Currencies = curs
End Sub
End Class
End Class
''' <summary>
''' Stores the received exchange rate informations of an asynchronous download
''' </summary>
''' <remarks></remarks>
Public Class ExchangeRateDownloadCompletedEventArgs
Inherits Base.DownloadCompletedEventArgs
Private mCurrencies() As YCurrencyID
Public ReadOnly Property Currencies() As YCurrencyID()
Get
Return mCurrencies
End Get
End Property
Public Overloads ReadOnly Property Response() As ExchangeRateResponse
Get
Return DirectCast(MyBase.Response, ExchangeRateResponse)
End Get
End Property
Friend Sub New(ByVal userArgs As Object, ByVal resp As ExchangeRateResponse, ByVal curs() As YCurrencyID)
MyBase.New(userArgs, resp)
mCurrencies = curs
End Sub
End Class
Public Class ExchangeRateResponse
Inherits Base.Response
Public Overloads ReadOnly Property Result() As ExchangeRateData()
Get
Return TryCast(MyBase.Result, ExchangeRateData())
End Get
End Property
Friend Sub New(ByVal info As Base.ConnectionInfo, ByVal result As ExchangeRateData())
MyBase.New(info, result)
End Sub
End Class
End Namespace