OSDN Git Service

#27060 バックグラウンドの曲検索が完了した後で選曲画面に入り直せば、曲検索内容が曲リストの反映されるよう対応。ただし選曲位置は初期状態に戻る。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 02.タイトル / CEnumSongs.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Diagnostics;\r
5 using System.Runtime.InteropServices;\r
6 using System.IO;\r
7 using System.Threading;\r
8 using System.Runtime.Serialization.Formatters.Binary;\r
9 using SlimDX;\r
10 using SlimDX.Direct3D9;\r
11 using FDK;\r
12 using SampleFramework;\r
13 \r
14 namespace DTXMania\r
15 {\r
16         internal class CEnumSongs                                                       // #27060 2011.2.7 yyagi 曲リストを取得するクラス\r
17         {                                                                                                       // ファイルキャッシュ(songslist.db)からの取得と、ディスクからの取得を、この一つのクラスに集約。\r
18 \r
19                 public CSongs管理 Songs管理                                         // 曲の探索結果はこのSongs管理に読み込まれる\r
20                 {\r
21                         get;\r
22                         private set;\r
23                 }\r
24 \r
25                 public bool IsSongListEnumCompletelyDone                // 曲リスト探索と、実際の曲リストへの反映が完了した?\r
26                 {\r
27                         get\r
28                         {\r
29                                 return ( this.state == DTXEnumState.CompletelyDone );\r
30                         }\r
31                 }\r
32                 public bool IsSongListEnumerated                                // 曲リスト探索が完了したが、実際の曲リストへの反映はまだ?\r
33                 {\r
34                         get\r
35                         {\r
36                                 return ( this.state == DTXEnumState.Enumeratad );\r
37                         }\r
38                 }\r
39                 public bool IsSongListEnumStarted                               // 曲リスト探索開始後?(探索完了も含む)\r
40                 {\r
41                         get\r
42                         {\r
43                                 return ( this.state != DTXEnumState.None );\r
44                         }\r
45                 }\r
46                 public void SongListEnumCompletelyDone()\r
47                 {\r
48                         this.state = DTXEnumState.CompletelyDone;\r
49                 }\r
50                 private readonly string strPathSongsDB = CDTXMania.strEXEのあるフォルダ + "songs.db";\r
51                 private readonly string strPathSongList = CDTXMania.strEXEのあるフォルダ + "songlist.db";\r
52 \r
53                 public Thread thDTXFileEnumerate\r
54                 {\r
55                         get;\r
56                         private set;\r
57                 }\r
58                 private enum DTXEnumState\r
59                 {\r
60                         None,\r
61                         Ongoing,\r
62                         Suspended,\r
63                         Enumeratad,                     // 探索完了、現在の曲リストに未反映\r
64                         CompletelyDone          // 探索完了、現在の曲リストに反映完了\r
65                 }\r
66                 private DTXEnumState state = DTXEnumState.None;\r
67 \r
68 \r
69                 /// <summary>\r
70                 /// Constractor\r
71                 /// </summary>\r
72                 public CEnumSongs()\r
73                 {\r
74                         this.Songs管理 = new CSongs管理();\r
75                 }\r
76 \r
77                 public void Init( List<Cスコア> ls, int n )\r
78                 {\r
79                         if ( state == DTXEnumState.None )\r
80                         {\r
81                                 this.Songs管理.listSongsDB = ls;\r
82                                 this.Songs管理.nSongsDBから取得できたスコア数 = n;\r
83                         }\r
84                 }\r
85 \r
86                 /// <summary>\r
87                 /// 曲リストのキャッシュ(songlist.db)取得スレッドの開始\r
88                 /// </summary>\r
89                 public void StartEnumFromCache()\r
90                 {\r
91                         this.thDTXFileEnumerate = new Thread( new ThreadStart( this.t曲リストの構築1 ) );\r
92                         this.thDTXFileEnumerate.Name = "曲リストの構築";\r
93                         this.thDTXFileEnumerate.IsBackground = true;\r
94                         this.thDTXFileEnumerate.Start();\r
95                 }\r
96 \r
97                 /// <summary>\r
98                 /// \r
99                 /// </summary>\r
100                 public delegate void AsyncDelegate();\r
101 \r
102                 /// <summary>\r
103                 /// 曲検索スレッドの開始\r
104                 /// </summary>\r
105                 public void StartEnumFromDisk()\r
106                 {\r
107                         if ( state == DTXEnumState.None )\r
108                         {\r
109                                 Trace.TraceInformation( "★曲データ検索スレッドを起動しました。" );\r
110                                 lock ( this )\r
111                                 {\r
112                                         state = DTXEnumState.Ongoing;\r
113                                 }\r
114                                 // this.autoReset = new AutoResetEvent( true );\r
115 \r
116                                 this.thDTXFileEnumerate = new Thread( new ThreadStart( this.t曲リストの構築2 ) );\r
117                                 this.thDTXFileEnumerate.Name = "曲リストの構築";\r
118                                 this.thDTXFileEnumerate.IsBackground = true;\r
119                                 this.thDTXFileEnumerate.Priority = System.Threading.ThreadPriority.Lowest;\r
120                                 this.thDTXFileEnumerate.Start();\r
121                         }\r
122                 }\r
123 \r
124 \r
125                 /// <summary>\r
126                 /// 曲探索スレッドのサスペンド\r
127                 /// </summary>\r
128                 public void Suspend()\r
129                 {\r
130                         if ( this.state != DTXEnumState.CompletelyDone &&\r
131                                 ( thDTXFileEnumerate.ThreadState == System.Threading.ThreadState.Background ) )\r
132                         {\r
133                                 // this.thDTXFileEnumerate.Suspend();           // obsoleteにつき使用中止\r
134                                 this.Songs管理.bIsSuspending = true;\r
135                                 this.state = DTXEnumState.Suspended;\r
136                                 Trace.TraceInformation( "★曲データ検索スレッドを中断しました。" );\r
137                         }\r
138                 }\r
139 \r
140                 /// <summary>\r
141                 /// 曲探索スレッドのレジューム\r
142                 /// </summary>\r
143                 public void Resume()\r
144                 {\r
145                         if ( this.state == DTXEnumState.Suspended )\r
146                         {\r
147                                 if ( ( this.thDTXFileEnumerate.ThreadState & ( System.Threading.ThreadState.WaitSleepJoin | System.Threading.ThreadState.StopRequested ) ) != 0 )       //\r
148                                 {\r
149                                         // this.thDTXFileEnumerate.Resume();    // obsoleteにつき使用中止\r
150                                         this.Songs管理.bIsSuspending = false;\r
151                                         this.Songs管理.AutoReset.Set();\r
152                                         this.state = DTXEnumState.Ongoing;\r
153                                         Trace.TraceInformation( "★曲データ検索スレッドを再開しました。" );\r
154                                 }\r
155                         }\r
156                 }\r
157 \r
158                 /// <summary>\r
159                 /// 曲探索スレッドにサスペンド指示を出してから、本当にサスペンド状態に遷移するまでの間、ブロックする\r
160                 /// 500ms * 10回=5秒でタイムアウトし、サスペンド完了して無くてもブロック解除する\r
161                 /// </summary>\r
162                 public void WaitUntilSuspended()\r
163                 {\r
164                         // 曲検索が一時中断されるまで待機\r
165                         for ( int i = 0; i < 10; i++ )\r
166                         {\r
167                                 if ( this.state == DTXEnumState.CompletelyDone ||\r
168                                         ( thDTXFileEnumerate.ThreadState & ( System.Threading.ThreadState.WaitSleepJoin | System.Threading.ThreadState.Background ) ) != 0 )\r
169                                 {\r
170                                         break;\r
171                                 }\r
172                                 Trace.TraceInformation( "★曲データ検索スレッドの中断待ちです: {0}", this.thDTXFileEnumerate.ThreadState.ToString() );\r
173                                 Thread.Sleep( 500 );\r
174                         }\r
175 \r
176                 }\r
177 \r
178 \r
179 \r
180 \r
181                 /// <summary>\r
182                 /// songlist.dbからの曲リスト構築\r
183                 /// </summary>\r
184                 public void t曲リストの構築1()\r
185                 {\r
186                         // !注意!\r
187                         // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、\r
188                         // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16)\r
189                         // 構築が完了したら、DTXEnumerateState state を DTXEnumerateState.Done にすること。(2012.2.9)\r
190                         DateTime now = DateTime.Now;\r
191 \r
192                         try\r
193                         {\r
194                                 #region [ 0) システムサウンドの構築  ]\r
195                                 //-----------------------------\r
196                                 CDTXMania.stage起動.eフェーズID = CStage.Eフェーズ.起動0_システムサウンドを構築;\r
197 \r
198                                 Trace.TraceInformation( "0) システムサウンドを構築します。" );\r
199                                 Trace.Indent();\r
200 \r
201                                 try\r
202                                 {\r
203                                         for ( int i = 0; i < CDTXMania.Skin.nシステムサウンド数; i++ )\r
204                                         {\r
205                                                 CSkin.Cシステムサウンド cシステムサウンド = CDTXMania.Skin[ i ];\r
206                                                 if ( !CDTXMania.bコンパクトモード || cシステムサウンド.bCompact対象 )\r
207                                                 {\r
208                                                         try\r
209                                                         {\r
210                                                                 cシステムサウンド.t読み込み();\r
211                                                                 Trace.TraceInformation( "システムサウンドを読み込みました。({0})",cシステムサウンド.strファイル名 );\r
212                                                                 if ( ( cシステムサウンド == CDTXMania.Skin.bgm起動画面 ) && cシステムサウンド.b読み込み成功 )\r
213                                                                 {\r
214                                                                         cシステムサウンド.t再生する();\r
215                                                                 }\r
216                                                         }\r
217                                                         catch ( FileNotFoundException )\r
218                                                         {\r
219                                                                 Trace.TraceWarning( "システムサウンドが存在しません。({0})", cシステムサウンド.strファイル名 );\r
220                                                         }\r
221                                                         catch ( Exception e )\r
222                                                         {\r
223                                                                 Trace.TraceError( e.Message );\r
224                                                                 Trace.TraceWarning( "システムサウンドの読み込みに失敗しました。({0})", cシステムサウンド.strファイル名 );\r
225                                                         }\r
226                                                 }\r
227                                         }\r
228                                         lock ( CDTXMania.stage起動.list進行文字列 )\r
229                                         {\r
230                                                 CDTXMania.stage起動.list進行文字列.Add( "Loading system sounds ... OK " );\r
231                                         }\r
232                                 }\r
233                                 finally\r
234                                 {\r
235                                         Trace.Unindent();\r
236                                 }\r
237                                 //-----------------------------\r
238                                 #endregion\r
239 \r
240                                 if ( CDTXMania.bコンパクトモード )\r
241                                 {\r
242                                         Trace.TraceInformation( "コンパクトモードなので残りの起動処理は省略します。" );\r
243                                         return;\r
244                                 }\r
245 \r
246                                 #region [ 00) songlist.dbの読み込みによる曲リストの構築  ]\r
247                                 //-----------------------------\r
248                                 CDTXMania.stage起動.eフェーズID = CStage.Eフェーズ.起動00_songlistから曲リストを作成する;\r
249 \r
250                                 Trace.TraceInformation( "1) songlist.dbを読み込みます。" );\r
251                                 Trace.Indent();\r
252 \r
253                                 try\r
254                                 {\r
255                                         if ( !CDTXMania.ConfigIni.bConfigIniがないかDTXManiaのバージョンが異なる )\r
256                                         {\r
257                                                 CSongs管理 s = new CSongs管理();\r
258                                                 s = Deserialize( strPathSongList );             // 直接this.Songs管理にdeserialize()結果を代入するのは避ける。nullにされてしまうことがあるため。\r
259                                                 if ( s != null )\r
260                                                 {\r
261                                                         this.Songs管理 = s;\r
262                                                 }\r
263 \r
264                                                 int scores = this.Songs管理.n検索されたスコア数;\r
265                                                 Trace.TraceInformation( "songlist.db の読み込みを完了しました。[{0}スコア]", scores );\r
266                                                 lock ( CDTXMania.stage起動.list進行文字列 )\r
267                                                 {\r
268                                                         CDTXMania.stage起動.list進行文字列.Add( "Loading songlist.db ... OK" );\r
269                                                 }\r
270                                         }\r
271                                         else\r
272                                         {\r
273                                                 Trace.TraceInformation( "初回の起動であるかまたはDTXManiaのバージョンが上がったため、songlist.db の読み込みをスキップします。" );\r
274                                                 lock ( CDTXMania.stage起動.list進行文字列 )\r
275                                                 {\r
276                                                         CDTXMania.stage起動.list進行文字列.Add( "Loading songlist.db ... Skip" );\r
277                                                 }\r
278                                         }\r
279                                 }\r
280                                 finally\r
281                                 {\r
282                                         Trace.Unindent();\r
283                                 }\r
284 \r
285                                 #endregion\r
286 \r
287                                 #region [ 1) songs.db の読み込み ]\r
288                                 //-----------------------------\r
289                                 CDTXMania.stage起動.eフェーズID = CStage.Eフェーズ.起動1_SongsDBからスコアキャッシュを構築;\r
290 \r
291                                 Trace.TraceInformation( "2) songs.db を読み込みます。" );\r
292                                 Trace.Indent();\r
293 \r
294                                 try\r
295                                 {\r
296                                         if ( !CDTXMania.ConfigIni.bConfigIniがないかDTXManiaのバージョンが異なる )\r
297                                         {\r
298                                                 try\r
299                                                 {\r
300                                                         this.Songs管理.tSongsDBを読み込む( strPathSongsDB );\r
301                                                 }\r
302                                                 catch\r
303                                                 {\r
304                                                         Trace.TraceError( "songs.db の読み込みに失敗しました。" );\r
305                                                 }\r
306 \r
307                                                 int scores = ( this.Songs管理 == null ) ? 0 : this.Songs管理.nSongsDBから取得できたスコア数;     // 読み込み途中でアプリ終了した場合など、CDTXMania.Songs管理 がnullの場合があるので注意\r
308                                                 Trace.TraceInformation( "songs.db の読み込みを完了しました。[{0}スコア]", scores );\r
309                                                 lock ( CDTXMania.stage起動.list進行文字列 )\r
310                                                 {\r
311                                                         CDTXMania.stage起動.list進行文字列.Add( "Loading songs.db ... OK" );\r
312                                                 }\r
313                                         }\r
314                                         else\r
315                                         {\r
316                                                 Trace.TraceInformation( "初回の起動であるかまたはDTXManiaのバージョンが上がったため、songs.db の読み込みをスキップします。" );\r
317                                                 lock ( CDTXMania.stage起動.list進行文字列 )\r
318                                                 {\r
319                                                         CDTXMania.stage起動.list進行文字列.Add( "Loading songs.db ... Skip" );\r
320                                                 }\r
321                                         }\r
322                                 }\r
323                                 finally\r
324                                 {\r
325                                         Trace.Unindent();\r
326                                 }\r
327                                 //-----------------------------\r
328                                 #endregion\r
329 \r
330                         }\r
331                         finally\r
332                         {\r
333                                 CDTXMania.stage起動.eフェーズID = CStage.Eフェーズ.起動7_完了;\r
334                                 TimeSpan span = (TimeSpan) ( DateTime.Now - now );\r
335                                 Trace.TraceInformation( "起動所要時間: {0}", span.ToString() );\r
336                         }\r
337                         lock ( this )\r
338                         {\r
339                                 state = DTXEnumState.CompletelyDone;\r
340                         }\r
341                 }\r
342 \r
343 \r
344                 /// <summary>\r
345                 /// 起動してタイトル画面に遷移した後にバックグラウンドで発生させる曲検索\r
346                 /// #27060 2012.2.6 yyagi\r
347                 /// </summary>\r
348                 private void t曲リストの構築2()\r
349                 {\r
350                         // !注意!\r
351                         // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、\r
352                         // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16)\r
353                         // 構築が完了したら、DTXEnumerateState state を DTXEnumerateState.Done にすること。(2012.2.9)\r
354 \r
355                         DateTime now = DateTime.Now;\r
356                         bool bIsAvailableSongList = false;\r
357                         bool bIsAvailableSongsDB = false;\r
358                         bool bSucceededFastBoot = false;\r
359 \r
360                         try\r
361                         {\r
362 \r
363                                 #region [ 2) 曲データの検索 ]\r
364                                 //-----------------------------\r
365                                 //      base.eフェーズID = CStage.Eフェーズ.起動2_曲を検索してリストを作成する;\r
366 \r
367                                 Trace.TraceInformation( "enum2) 曲データを検索します。" );\r
368                                 Trace.Indent();\r
369 \r
370                                 try\r
371                                 {\r
372                                         if ( !string.IsNullOrEmpty( CDTXMania.ConfigIni.str曲データ検索パス ) )\r
373                                         {\r
374                                                 string[] strArray = CDTXMania.ConfigIni.str曲データ検索パス.Split( new char[] { ';' } );\r
375                                                 if ( strArray.Length > 0 )\r
376                                                 {\r
377                                                         // 全パスについて…\r
378                                                         foreach ( string str in strArray )\r
379                                                         {\r
380                                                                 string path = str;\r
381                                                                 if ( !Path.IsPathRooted( path ) )\r
382                                                                 {\r
383                                                                         path = CDTXMania.strEXEのあるフォルダ + str;     // 相対パスの場合、絶対パスに直す(2010.9.16)\r
384                                                                 }\r
385 \r
386                                                                 if ( !string.IsNullOrEmpty( path ) )\r
387                                                                 {\r
388                                                                         Trace.TraceInformation( "検索パス: " + path );\r
389                                                                         Trace.Indent();\r
390 \r
391                                                                         try\r
392                                                                         {\r
393                                                                                 this.Songs管理.t曲を検索してリストを作成する( path, true );\r
394                                                                         }\r
395                                                                         catch ( Exception e )\r
396                                                                         {\r
397                                                                                 Trace.TraceError( e.Message );\r
398                                                                                 Trace.TraceError( e.StackTrace );\r
399                                                                                 Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
400                                                                 }\r
401                                                                                 finally\r
402                                                                         {\r
403                                                                                 Trace.Unindent();\r
404                                                                         }\r
405                                                                 }\r
406                                                         }\r
407                                                 }\r
408                                         }\r
409                                         else\r
410                                         {\r
411                                                 Trace.TraceWarning( "曲データの検索パス(DTXPath)の指定がありません。" );\r
412                                         }\r
413                                 }\r
414                                 finally\r
415                                 {\r
416                                         Trace.TraceInformation( "曲データの検索を完了しました。[{0}曲{1}スコア]", this.Songs管理.n検索された曲ノード数, this.Songs管理.n検索されたスコア数 );\r
417                                         Trace.Unindent();\r
418                                 }\r
419                                 //      lock ( this.list進行文字列 )\r
420                                 //      {\r
421                                 //              this.list進行文字列.Add( string.Format( "{0} ... {1} scores ({2} songs)", "Enumerating songs", this..Songs管理_裏読.n検索されたスコア数, this.Songs管理_裏読.n検索された曲ノード数 ) );\r
422                                 //      }\r
423                                 //-----------------------------\r
424                                 #endregion\r
425                                 #region [ 3) songs.db 情報の曲リストへの反映 ]\r
426                                 //-----------------------------\r
427                                 //                                      base.eフェーズID = CStage.Eフェーズ.起動3_スコアキャッシュをリストに反映する;\r
428                                 Trace.TraceInformation( "enum3) songs.db の情報を曲リストへ反映します。" );\r
429                                 Trace.Indent();\r
430 \r
431                                 try\r
432                                 {\r
433                                         if ( this.Songs管理.listSongsDB != null )\r
434                                         {\r
435                                                 this.Songs管理.tスコアキャッシュを曲リストに反映する();\r
436                                         }\r
437                                 }\r
438                                 catch ( Exception e )\r
439                                 {\r
440                                         Trace.TraceError( e.Message );\r
441                                         Trace.TraceError( e.StackTrace );\r
442                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
443                                 }\r
444                                 finally\r
445                                 {\r
446                                         Trace.TraceInformation( "曲リストへの反映を完了しました。[{0}/{1}スコア]", this.Songs管理.nスコアキャッシュから反映できたスコア数, this.Songs管理.n検索されたスコア数 );\r
447                                         Trace.Unindent();\r
448                                 }\r
449                                 //      lock ( this.list進行文字列 )\r
450                                 //      {\r
451                                 //              this.list進行文字列.Add( string.Format( "{0} ... {1}/{2}", "Loading score properties from songs.db", CDTXMania.Songs管理_裏読.nスコアキャッシュから反映できたスコア数, cs.n検索されたスコア数 ) );\r
452                                 //      }\r
453                                 //-----------------------------\r
454                                 #endregion\r
455                                 #region [ 4) songs.db になかった曲データをファイルから読み込んで反映 ]\r
456                                 //-----------------------------\r
457                                 //                                      base.eフェーズID = CStage.Eフェーズ.起動4_スコアキャッシュになかった曲をファイルから読み込んで反映する;\r
458 \r
459                                 int num2 = this.Songs管理.n検索されたスコア数 - this.Songs管理.nスコアキャッシュから反映できたスコア数;\r
460 \r
461                                 Trace.TraceInformation( "{0}, {1}", this.Songs管理.n検索されたスコア数, this.Songs管理.nスコアキャッシュから反映できたスコア数 );\r
462                                 Trace.TraceInformation( "enum4) songs.db になかった曲データ[{0}スコア]の情報をファイルから読み込んで反映します。", num2 );\r
463                                 Trace.Indent();\r
464 \r
465                                 try\r
466                                 {\r
467                                         this.Songs管理.tSongsDBになかった曲をファイルから読み込んで反映する();\r
468                                 }\r
469                                 catch ( Exception e )\r
470                                 {\r
471                                         Trace.TraceError( e.Message );\r
472                                         Trace.TraceError( e.StackTrace );\r
473                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
474                                 }\r
475                                 finally\r
476                                 {\r
477                                         Trace.TraceInformation( "曲データへの反映を完了しました。[{0}/{1}スコア]", this.Songs管理.nファイルから反映できたスコア数, num2 );\r
478                                         Trace.Unindent();\r
479                                 }\r
480                                 //                                      lock ( this.list進行文字列 )\r
481                                 //                                      {\r
482                                 //                                              this.list進行文字列.Add( string.Format( "{0} ... {1}/{2}", "Loading score properties from files", CDTXMania.Songs管理_裏読.nファイルから反映できたスコア数, CDTXMania.Songs管理_裏読.n検索されたスコア数 - cs.nスコアキャッシュから反映できたスコア数 ) );\r
483                                 //                                      }\r
484                                 //-----------------------------\r
485                                 #endregion\r
486                                 #region [ 5) 曲リストへの後処理の適用 ]\r
487                                 //-----------------------------\r
488                                 //                                      base.eフェーズID = CStage.Eフェーズ.起動5_曲リストへ後処理を適用する;\r
489 \r
490                                 Trace.TraceInformation( "enum5) 曲リストへの後処理を適用します。" );\r
491                                 Trace.Indent();\r
492 \r
493                                 try\r
494                                 {\r
495                                         this.Songs管理.t曲リストへ後処理を適用する();\r
496                                 }\r
497                                 catch ( Exception e )\r
498                                 {\r
499                                         Trace.TraceError( e.Message );\r
500                                         Trace.TraceError( e.StackTrace );\r
501                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
502                                 }\r
503                                 finally\r
504                                 {\r
505                                         Trace.TraceInformation( "曲リストへの後処理を完了しました。" );\r
506                                         Trace.Unindent();\r
507                                 }\r
508                                 //                                      lock ( this.list進行文字列 )\r
509                                 //                                      {\r
510                                 //                                              this.list進行文字列.Add( string.Format( "{0} ... OK", "Building songlists" ) );\r
511                                 //                                      }\r
512                                 //-----------------------------\r
513                                 #endregion\r
514                                 #region [ 6) songs.db への保存 ]\r
515                                 //-----------------------------\r
516                                 //                                      base.eフェーズID = CStage.Eフェーズ.起動6_スコアキャッシュをSongsDBに出力する;\r
517 \r
518                                 Trace.TraceInformation( "enum6) 曲データの情報を songs.db へ出力します。" );\r
519                                 Trace.Indent();\r
520 \r
521                                 try\r
522                                 {\r
523                                         this.Songs管理.tスコアキャッシュをSongsDBに出力する( strPathSongsDB );\r
524                                 }\r
525                                 catch ( Exception e )\r
526                                 {\r
527                                         Trace.TraceError( e.Message );\r
528                                         Trace.TraceError( e.StackTrace );\r
529                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
530                                 }\r
531                                 finally\r
532                                 {\r
533                                         Trace.TraceInformation( "songs.db への出力を完了しました。[{0}スコア]", this.Songs管理.nSongsDBへ出力できたスコア数 );\r
534                                         Trace.Unindent();\r
535                                 }\r
536                                 //                                      lock ( this.list進行文字列 )\r
537                                 //                                      {\r
538                                 //                                              this.list進行文字列.Add( string.Format( "{0} ... OK", "Saving songs.db" ) );\r
539                                 //                                      }\r
540                                 #endregion\r
541 \r
542                                 //                              if ( !bSucceededFastBoot )      // songs2.db読み込みに成功したなら、songs2.dbを新たに作らない\r
543                                 #region [ 7) songs2.db への保存 ]           // #27060 2012.1.26 yyagi\r
544                                 Trace.TraceInformation( "enum7) 曲データの情報を songlist.db へ出力します。" );\r
545                                 Trace.Indent();\r
546 \r
547                                 SerializeSongList( this.Songs管理, strPathSongList );\r
548                                 Trace.TraceInformation( "songlist.db への出力を完了しました。[{0}スコア]", this.Songs管理.nSongsDBへ出力できたスコア数 );\r
549                                 Trace.Unindent();\r
550                                 //-----------------------------\r
551                                 #endregion\r
552                                 //                              }\r
553 \r
554                         }\r
555                         finally\r
556                         {\r
557                                 //                              base.eフェーズID = CStage.Eフェーズ.起動7_完了;\r
558                                 TimeSpan span = (TimeSpan) ( DateTime.Now - now );\r
559                                 Trace.TraceInformation( "曲探索所要時間: {0}", span.ToString() );\r
560                         }\r
561                         lock ( this )\r
562                         {\r
563                                 // state = DTXEnumState.Done;           // DoneにするのはCDTXMania.cs側にて。\r
564                                 state = DTXEnumState.Enumeratad;\r
565                         }\r
566                 }\r
567 \r
568 \r
569 \r
570                 /// <summary>\r
571                 /// 曲リストのserialize\r
572                 /// </summary>\r
573                 private static void SerializeSongList( CSongs管理 cs, string strPathSongList )\r
574                 {\r
575                         bool bSucceededSerialize = true;\r
576                         Stream output = null;\r
577                         try\r
578                         {\r
579                                 output = File.Create( strPathSongList );\r
580                                 BinaryFormatter formatter = new BinaryFormatter();\r
581                                 formatter.Serialize( output, cs );\r
582                         }\r
583                         catch ( Exception e )\r
584                         {\r
585                                 bSucceededSerialize = false;\r
586                                 Trace.TraceError( e.Message );\r
587                                 Trace.TraceError( e.StackTrace );\r
588                                 Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
589                         }\r
590                         finally\r
591                         {\r
592                                 output.Close();\r
593                                 if ( !bSucceededSerialize )\r
594                                 {\r
595                                         try\r
596                                         {\r
597                                                 File.Delete( strPathSongList ); // serializeに失敗したら、songs2.dbファイルを消しておく\r
598                                         }\r
599                                         catch ( Exception )\r
600                                         {\r
601                                                 // 特に何もしない\r
602                                         }\r
603                                 }\r
604                         }\r
605                 }\r
606 \r
607                 /// <summary>\r
608                 /// 曲リストのdeserialize\r
609                 /// </summary>\r
610                 /// <param name="songs管理"></param>\r
611                 /// <param name="strPathSongList"></param>\r
612                 private CSongs管理 Deserialize( string strPathSongList )\r
613                 {\r
614                         CSongs管理 songs管理 = null;\r
615                         try\r
616                         {\r
617                                 #region [ SongListDB(songlist.db)を読み込む ]\r
618                                 //      byte[] buf = File.ReadAllBytes( SongListDBファイル名 );                    // 一旦メモリにまとめ読みしてからdeserializeした方が高速かと思ったら全く変わらなかったので削除\r
619                                 //      using ( MemoryStream input = new MemoryStream(buf, false) )\r
620                                 using ( Stream input = File.OpenRead( strPathSongList ) )\r
621                                 {\r
622                                         try\r
623                                         {\r
624                                                 BinaryFormatter formatter = new BinaryFormatter();\r
625                                                 songs管理 = (CSongs管理) formatter.Deserialize( input );\r
626                                         }\r
627                                         catch ( Exception )\r
628                                         {\r
629                                                 // songs管理 = null;\r
630                                         }\r
631                                 }\r
632                                 #endregion\r
633                         }\r
634                         catch\r
635                         {\r
636                                 Trace.TraceError( "songlist.db の読み込みに失敗しました。" );\r
637                         }\r
638                         return songs管理;\r
639                 }\r
640         }\r
641 }\r