// aktualizacja danych obiektu po odebraniu ich z sieci internal void Update(DTO.MarketOfferData data) { //TODO: NOL3 na razie przysyła zawsze Level=1 i bez określenia nowy/zmiana. data.Update = (Count > 0); if (data.Level > (data.Update ? Count : Count + 1)) { MyUtil.PrintWarning(string.Format("BosOffers.Update - unexpected level: {0} (current max: {1})", data.Level, Count)); while (list.Count < data.Level) { list.Add(null); } } var n = data.Level - 1; if (data.Volume > 0) { var offer = new BosOffer(data); if (data.Update) { list[n] = offer; } else { list.Insert(n, offer); } } else { list.RemoveAt(n); } }
/// <summary> /// Próba zalogowania się w aplikacji NOL3. /// Normalnie metoda ta jest wywoływana automatycznie już przy utworzeniu obiektu NolClient... /// chyba że skorzystaliśmy z jednego z dodatkowych konstruktorów, pomijając automatyczne zalogowanie. /// </summary> public void Login() { Debug.WriteLine("\nLogin..."); StartLogin: using (Socket socket = GetSyncSocket()) { UserRequestMsg request = new UserRequestMsg(); request.Type = UserRequestType.Login; request.Username = "******"; request.Password = "******"; request.Send(socket); try { UserResponseMsg response = new UserResponseMsg(socket); if ((response.Status == UserStatus.Other) && (response.StatusText == "User is already logged")) { MyUtil.PrintWarning("NOL says: We're already logged in !?"); } else if (response.Status != UserStatus.LoggedIn) { throw new FixmlErrorMsgException(response); } } catch (BizMessageRejectException e) { // całe to przechwytywanie wyjątków i powtórki możnaby pominąć, gdyby NOL nie blokował // numerku ReqID, jeśli jego poprzedni klient nie zrealizował prawidłowo logowania/wylogowania if (e.Msg.RejectText == "Incorrect UserReqID") { if (request.Id < 100) { goto StartLogin; // każdy kolejny UserRequestMsg z większym "Id" } else { throw new FixmlException("UserReqID limit reached!"); } } else { throw; } } } loggedIn = true; Debug.WriteLine("Login OK\n"); }