/// <summary> /// すぱこーRSSフィードの取得が完了した時に実行します。 /// </summary> private async void spacomicMainViewModel_GetRSSCompleted(object sender, GetRSSResult e) { // 失敗した場合、エラーダイアログを表示します。 if (e != GetRSSResult.Succeeded) { await LoadErrorDialog.ShowAsync(); } }
/// <summary> /// ローカルに保存したファイルから、すぱこーRSSフィードを読み込みます。 /// </summary> /// <returns>結果情報とすぱこーRSSフィードコレクションのタプルオブジェクト</returns> public static async Task <(GetRSSResult ResultCode, IEnumerable <SpacomicRSSItem> Items)> LoadRSSCollectionFile() { GetRSSResult result = GetRSSResult.Succeeded; List <SpacomicRSSItem> list = null; try { StorageFolder localFolder = ApplicationData.Current.LocalFolder; var spacoRSSListFile = await localFolder.TryGetItemAsync(rssListFilePath); // ローカルファイルを正しく開いた時 if (spacoRSSListFile != null && spacoRSSListFile is IStorageFile) { XElement spacoXml = XDocument.Parse(await FileIO.ReadTextAsync(( IStorageFile )spacoRSSListFile)).Root; list = spacoXml.Elements("item").Select(item => new SpacomicRSSItem { Type = item.Attribute("type").Value, Title = item.Attribute("title").Value, Description = item.Attribute("description").Value, Author = item.Attribute("author").Value, PubDate = DateTime.Parse(item.Attribute("pubDate").Value), Link = item.Attribute("link").Value, ModifiedDate = DateTime.Parse(item.Attribute("modified").Value), Volume = int.Parse(item.Attribute("volume").Value), ThumbnailURL = item.Attribute("thumbnail").Value, MediaURL = item.Attribute("content").Value, ID = item.Attribute("id").Value, IsAvailable = bool.Parse(item.Attribute("isAvailable").Value) } ).ToList(); } else { result = GetRSSResult.Failed; } } catch (Exception) { result = GetRSSResult.Failed; } return(result, list); }
/// <summary> /// ローカルに保存したファイルから、すぱこーRSSフィードのチャネル情報を読み込みます。 /// </summary> /// <returns>結果情報とすぱこーRSSフィードのチャネル情報のタプルオブジェクト</returns> public static async Task <(GetRSSResult ResultCode, IEnumerable <KeyValuePair <string, SpacoRSSSause> > Items)> LoadSpacoRSSSauseFile() { GetRSSResult result = GetRSSResult.Succeeded; List <KeyValuePair <string, SpacoRSSSause> > list = null; try { StorageFolder localFolder = ApplicationData.Current.LocalFolder; var spacoRSSSauseFile = await localFolder.TryGetItemAsync(rssSauseFilePath); // ローカルファイルを正しく開いた時 if (spacoRSSSauseFile != null && spacoRSSSauseFile is IStorageFile) { XElement sauseXml = XDocument.Parse(await FileIO.ReadTextAsync(( IStorageFile )spacoRSSSauseFile)).Root; list = sauseXml.Elements("sause").Select(item => new KeyValuePair <string, SpacoRSSSause>( item.Attribute("type").Value, new SpacoRSSSause { Title = item.Attribute("title").Value, Description = item.Attribute("description").Value, Author = item.Attribute("author").Value, PubDate = DateTime.Parse(item.Attribute("pubDate").Value), Link = item.Attribute("link").Value, BannerURL = item.Attribute("banner").Value } ) ).ToList(); } else { result = GetRSSResult.Failed; } } catch (Exception) { result = GetRSSResult.Failed; } return(result, list); }
/// <summary> /// RSSフィードを取得(保存済みのローカルファイルから読み込み or Webから取得)します。 /// </summary> /// <param name="forceReload">強制的にWebから取得するフラグ</param> public async Task GetRSS(bool forceReload = false) { // 初期化 GetRSSResult result = GetRSSResult.Succeeded; SauseItems.Clear(); Items.Clear(); cancellationTokenSource = new CancellationTokenSource(); GetRSSStarted(this, null); try { // Webからの再取得をリクエストされた時 if (forceReload) { try { Items.AddRange((await GetRSSCore()).OrderByDescending(_ => _.PubDate)); // 取得したすぱこーRSSフィードのデータをローカルファイルに保存します。 await SpacomicLocalIO.SaveSpacoRSSSauseFile(SauseItems); await SpacomicLocalIO.SaveRSSCollectionFile(Items); } // Webからの再取得に失敗した場合、ローカルファイルからリストアします。 // Itemsが空であれば、保存済みのローカルファイルは、再取得する前のすぱこーRSSフィードのデータが残っています。 catch (Exception) when(!Items.Any()) { // 保存済みのローカルファイルからリストア var spacoRSSauseFromLocal = await SpacomicLocalIO.LoadSpacoRSSSauseFile(); var spacoRSSListFromLocal = await SpacomicLocalIO.LoadRSSCollectionFile(); // 保存済みのローカルファイルからのリストアが成功した時 if (spacoRSSauseFromLocal.ResultCode == GetRSSResult.Succeeded && spacoRSSListFromLocal.ResultCode == GetRSSResult.Succeeded) { foreach (var item in spacoRSSauseFromLocal.Items) { SauseItems[item.Key] = item.Value; } Items.AddRange(spacoRSSListFromLocal.Items); result = GetRSSResult.LocalDataRestored; } // リストアに失敗した場合、例外をリスローします。 else { throw; } } } else { // 保存済みのローカルファイルから読み込み var spacoRSSauseFromLocal = await SpacomicLocalIO.LoadSpacoRSSSauseFile(); var spacoRSSListFromLocal = await SpacomicLocalIO.LoadRSSCollectionFile(); // 保存済みのローカルファイルからの読み込みが成功した時 if (spacoRSSauseFromLocal.ResultCode == GetRSSResult.Succeeded && spacoRSSListFromLocal.ResultCode == GetRSSResult.Succeeded) { foreach (var item in spacoRSSauseFromLocal.Items) { SauseItems[item.Key] = item.Value; } Items.AddRange(spacoRSSListFromLocal.Items); // Web上に最新話があるかどうかチェックします。 CheckNewContents(); } // ローカルファイルからの読み込みに失敗した場合、Webから取得します else { Items.AddRange((await GetRSSCore()).OrderByDescending(_ => _.PubDate)); await SpacomicLocalIO.SaveSpacoRSSSauseFile(SauseItems); await SpacomicLocalIO.SaveRSSCollectionFile(Items); } } } catch (OperationCanceledException) { SauseItems.Clear(); Items.Clear(); result = GetRSSResult.Canceled; } catch (Exception) { SauseItems.Clear(); Items.Clear(); result = GetRSSResult.Failed; } finally { cancellationTokenSource.Dispose(); } // すぱこーRSSフィードの取得が完了したことをViewModel側に通知します。 GetRSSCompleted?.Invoke(this, result); }