public bool GetNextFriendsInfo(bool isRefresh, bool restoreSession, FriendsListResponse additionalFriendsListResponse, FriendsListResponse oldFriendsListResponse) { DebugHelper.WriteLogEntry("BaseLogic.GetAdditionalFriendsInfo"); // запускаем функцию try { if (isRefresh) { throw new Exception(); } return false; // если не обновление, то возвращаем что есть } catch (Exception) { //WiFi if (_iDataLogic.GetOnlyWIFI() == "1") { if (!CoreHelper.TurnWiFi(true)) { throw new VKException(ExceptionMessage.NoConnection); } } // восстанавливаем сессию if (restoreSession) { AutoLogin(); } ErrorResponse newErrorResponse = null; // ошибка if (oldFriendsListResponse == null) { return false; } // проходим по списку "стандартных" данных // если в "стандартном" списке есть пользователь, данных которого нет в "дополнительном" // закачиваем профиль foreach (User oldUser in oldFriendsListResponse.Users) { User additionalUserInfo = null; // буферная переменная для хранения полного профиля друга if (additionalFriendsListResponse.IsUserInList(oldUser.Uid)) { continue; // не добавляем, если уже есть инфо } else { // пользователя вносим в любом случае... User newUser = new User(); // для минимизирования данных создаем нового пользователя для которого храним только 3 поля additionalFriendsListResponse.Users.Add(newUser); newUser.Uid = oldUser.Uid; // ID пользователя // получаем профиль друга try { additionalUserInfo = _iCommunicationLogic.UserGetInfo(oldUser.Uid, _iDataLogic.GetSessionKey(), out newErrorResponse); } catch (VKException) { throw; } catch (TimeoutException ex) { DebugHelper.WriteLogEntry("BaseLogic.GetFriendsInfo TimeoutException Message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.GetFriendsInfo TimeoutException StackTrace: " + ex.StackTrace); throw new VKException(ExceptionMessage.NoConnection); } catch (WebException ex) { DebugHelper.WriteLogEntry("BaseLogic.GetFriendsInfo WebException Message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.GetFriendsInfo WebException StackTrace: " + ex.StackTrace); throw new VKException(ExceptionMessage.NoConnection); } catch (OutOfMemoryException ex) { DebugHelper.WriteLogEntry("BaseLogic.GetFriendsInfo OutOfMemoryException Message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.GetFriendsInfo OutOfMemoryException StackTrace: " + ex.StackTrace); throw; } catch (Exception ex) { DebugHelper.WriteLogEntry("BaseLogic.GetFriendsInfo Exception Message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.GetFriendsInfo Exception StackTrace: " + ex.StackTrace); } if (additionalUserInfo != null) // что-то получили от сервера { newUser.Birthday = additionalUserInfo.Birthday; // бездэй и мобилка из нового инфо newUser.MobilePhone = additionalUserInfo.MobilePhone; } else // ищем ошибку... { if (newErrorResponse != null) { if (newErrorResponse.error_code == "1") { if (!restoreSession) { return GetNextFriendsInfo(isRefresh, true, additionalFriendsListResponse, oldFriendsListResponse); } else { throw new VKException(ExceptionMessage.ServerUnavalible); } } else if (newErrorResponse.error_code == "2") { throw new VKException(ExceptionMessage.AccountBloked); } else { throw new VKException(ExceptionMessage.UnknownError); } } else { //throw new VKException(ExceptionMessage.UnknownError); } } // сохраняем результат //try //{ // DebugHelper.WriteLogEntry("(Кэш) Сохранение данных FriendsListAdditionalResponse..."); // bool result; // result = Cache.Cache.SaveToCache(additionalFriendsListResponse, string.Empty, "FriendsListAdditionalResponse"); // if (result) // { // DebugHelper.WriteLogEntry("(Кэш) Данные FriendsListAdditionalResponse успешно сохранены."); // } // else // { // DebugHelper.WriteLogEntry("(Кэш) Данные FriendsListAdditionalResponse не сохранены."); // } //} //catch (Exception) //{ // DebugHelper.WriteLogEntry("(Кэш) В процессе сохранения данных FriendsListAdditionalResponse произошла ошибка."); //} return true; // признак того что последний пользователь был обработан успешно } } //// сохраняем результат в кэш //try //{ // DebugHelper.WriteLogEntry("(Кэш) Сохранение данных FriendsListAdditionalResponse..."); // bool result; // result = Cache.Cache.SaveToCache(additionalFriendsListResponse, string.Empty, "FriendsListAdditionalResponse"); // if (result) // { // DebugHelper.WriteLogEntry("(Кэш) Данные FriendsListAdditionalResponse успешно сохранены."); // } // else // { // DebugHelper.WriteLogEntry("(Кэш) Данные FriendsListAdditionalResponse не сохранены."); // } //} //catch (Exception) //{ // DebugHelper.WriteLogEntry("(Кэш) В процессе сохранения данных FriendsListAdditionalResponse произошла ошибка."); //} return false; // если дошли до сюда, то значит юзверей для которых можно закачать данные больше нет } }
public FriendsListResponse LoadFriendsOnlineListData(string uid, string sid, out ErrorResponse newErrorResponse) { var newFriendsListResponse = new FriendsListResponse(); newErrorResponse = null; //формируем запрос var newUri = new Uri { Address = SystemConfiguration.ServerConnectionToApiCalls, Method = "/data?act=friends_online&" }; newUri.Parameters.Add("id=" + uid); newUri.Parameters.Add("sid=" + sid); HttpWebRequest newHttpWebRequest = HttpUtility.PrepareHttpWebRequest(newUri.GetUri()); //WebResponse newHttpWebResponse = null; Stream newStream = null; try { using (WebResponse newHttpWebResponse = newHttpWebRequest.GetResponse()) { bool logging = (LogRequestEvent != null); if (logging) { newStream = new MemoryStream(2048); HttpUtility.CopyStream(HttpUtility.PrepareResponseStream(newHttpWebResponse), newStream); newStream.Flush(); newStream.Position = 0; OnLogRequest(new LogRequestEventArgs(string.Format("LoadFriendsOnlineListData requested: Address: {0} Header: {1}", newHttpWebRequest.Address, newHttpWebRequest.Headers), null)); } else { newStream = HttpUtility.PrepareResponseStream(newHttpWebResponse); } using (var newJsonTextReader = new JsonTextReader(new StreamReader(newStream))) { try { #region парсинг while (newJsonTextReader.Read()) { //открыли массив 1-ого порядка (список друзей) if (newJsonTextReader.TokenType == JsonToken.StartArray) { while (newJsonTextReader.Read()) //открываем очередь чтения списка друзей { //читаем содержимое списка друзей //открыли массив 1-ого порядка (профиль друг) if (newJsonTextReader.TokenType == JsonToken.StartArray) { User newUser = new User(); newFriendsListResponse.Users.Add(newUser); int index = 0; while (newJsonTextReader.Read()) //открываем очередь чтения профиля друга { //читаем содержимое профиля друга if (newJsonTextReader.TokenType == JsonToken.Integer || newJsonTextReader.TokenType == JsonToken.String) { switch (index) { case 0: newUser.Uid = newJsonTextReader.Value.ToString(); break; case 1: //fullName = newJsonTextReader.Value.ToString().Split(' '); //newUser.FirstName = fullName[0]; //newUser.LastName = fullName[1]; newUser.FullName = newJsonTextReader.Value.ToString(); break; case 2: newUser.Photo100px = (string)newJsonTextReader.Value; break; case 3: newUser.IsOnline = newJsonTextReader.Value.ToString(); break; } } //если до конца массива, то прерываем очередь чтения профиля друга else if (newJsonTextReader.TokenType == JsonToken.EndArray) { break; } index++; } } //если до конца массива, то прерываем очередь чтения (список друзей) else if (newJsonTextReader.TokenType == JsonToken.EndArray) { break; } } } //ошибки if (newJsonTextReader.TokenType == JsonToken.PropertyName && string.Equals(newJsonTextReader.Value, "ok")) { newErrorResponse = new ErrorResponse(); newJsonTextReader.Read(); int error_code = Convert.ToInt32(newJsonTextReader.Value); switch (error_code) { case -1: //истекшая сессия newErrorResponse.error_code = "1"; break; case -2: //флуд-контроль newErrorResponse.error_code = "2"; break; } return null; } } #endregion return newFriendsListResponse; } finally { if (logging) { newStream.Position = 0; OnLogResponse(new LogResponseEventArgs("LoadFriendsListData", newStream)); newStream.Flush(); } } } } } catch (ObjectDisposedException ex) { DebugHelper.WriteLogEntry(ex, "LoadFriendsOnlineListData ObjectDisposedException"); newErrorResponse = null; return null; } finally { newHttpWebRequest.Abort(); if (newStream != null) newStream.Close(); //if (newHttpWebResponse != null) // newHttpWebResponse.Close(); } }