/// <summary> /// Logs out user asynchronously from the TD Ameritrade web service. /// </summary> /// <returns>The <see cref="T:Response"/>.</returns> public Task<Response> LogOutAsync() { var url = this.Config.ServiceUrl + "LogOut?source=" + Uri.EscapeDataString(this.App.Key); return GetXmlAsync(url) .ContinueWith(task => { var xml = task.Result.Root; if (xml.Element("result").Value == "LoggedOut") { this.User = new User(); return new Response(); } return new Response(new ResponseError(xml.Element("error").Value)); }); }
/// <summary> /// Logs in user asynchronously to the TD Ameritrade web service. /// </summary> /// <param name="userid">The user's ID.</param> /// <param name="password">The user's password.</param> /// <returns>true if user logged in successfully; false if not</returns> public Task<Response<bool>> LogInAsync(string userid, string password) { var url = this.Config.ServiceUrl + "LogIn?source=" + Uri.EscapeDataString(this.App.Key) + "&version=" + Uri.EscapeDataString(this.App.Version); var data = new { userid = userid, password = password, source = this.App.Key, version = this.App.Version }; return GetXmlAsync(url, data) .ContinueWith(task => { var xml = task.Result.Root; if (xml.Element("result").Value == "OK") { var user = xml.Element("xml-log-in"); this.sessionID = user.Element("session-id").Value; this.timeout = user.Element("timeout").ToTimeSpan(); this.User = new User { IsAuthenticated = true, UserName = user.Element("user-id").Value, LastLoginDate = user.Element("login-time").ToDate(), Status = user.Element("exchange-status").ToExchangeStatus(), }; this.User.Realtime.NYSE = user.Element("nyse-quotes").IsRealtime(); this.User.Realtime.NASDAQ = user.Element("nasdaq-quotes").IsRealtime(); this.User.Realtime.OPRA = user.Element("opra-quotes").IsRealtime(); this.User.Realtime.AMEX = user.Element("amex-quotes").IsRealtime(); this.User.Authorizations.Options360 = user.Element("authorizations").Element("options360").ToBoolean(); this.User.Accounts = new ReadOnlyCollection<Account>( user.Element("accounts").Elements("account").Select(x => { var pref = x.Element("preferences"); var auth = x.Element("authorizations"); var account = new Account { ID = x.Element("account-id").Value, DisplayName = x.Element("display-name").Value, Description = x.Element("description").Value, IsAssociatedAccount = x.Element("associated-account").ToBoolean(), Company = x.Element("company").Value, Segment = x.Element("segment").Value, IsUnified = x.Element("unified").ToBoolean(), Preferences = new AccountPreferences { IsExpressTrading = pref.Element("express-trading").ToBoolean(), IsOptionDirectRouting = pref.Element("option-direct-routing").ToBoolean(), IsStockDirectRouting = pref.Element("stock-direct-routing").ToBoolean(), }, Authorizations = new AccountAuthorizations { Apex = auth.Element("apex").ToBoolean(), Level2 = auth.Element("level2").ToBoolean(), StockTrading = auth.Element("stock-trading").ToBoolean(), MarginTrading = auth.Element("margin-trading").ToBoolean(), StreamingNews = auth.Element("streaming-news").ToBoolean(), OptionTrading = auth.Element("option-trading").ToOptionTradingType(), Streamer = auth.Element("streamer").ToBoolean(), AdvancedMargin = auth.Element("advanced-margin").ToBoolean(), } }; return account; } ).ToList() ); this.User.Account = this.User.Accounts.FirstOrDefault(x => x.ID == user.Element("associated-account-id").Value); return new Response<bool>(true); } this.User = new User(); return new Response<bool>(false, new ResponseError(xml.Element("error").Value)); }); }