/// <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);
        }
Esempio n. 4
0
        /// <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);
        }