프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

markus / KCOM / PageManager / PageStorage.cs @ ddc223b4

이력 | 보기 | 이력해설 | 다운로드 (12 KB)

1 d7e20d2d taeseongkim
using System;
2 2007ecaa taeseongkim
using System.Collections.Concurrent;
3 d7e20d2d taeseongkim
using System.Collections.Generic;
4
using System.ComponentModel;
5
using System.Linq;
6
using System.Text;
7
using System.Threading.Tasks;
8
using System.Windows.Media.Imaging;
9
10
namespace KCOM.PageManager
11
{
12
    public class PageStorage
13
    {
14
        private const int DEFUALT_TALK_PAGE_COUNT = 10;
15 2007ecaa taeseongkim
16
        public event EventHandler<PageLoadCompletedEventArgs> PageLoadCompleted;
17
18
        List<int> WorkItems = new List<int>();
19
        ConcurrentBag<PageItem> fileItems = new ConcurrentBag<PageItem>();
20 d7e20d2d taeseongkim
        BackgroundWorker backgroundWorker;
21 2007ecaa taeseongkim
22
        //List<PageItem> fileItems = new List<PageItem>();
23 9d5b4bc2 taeseongkim
        public string LocalStorage;
24 54a28343 taeseongkim
        string _fileExt;
25 d7e20d2d taeseongkim
        string _BaseUri;
26
        int _TotalPages;
27 54a28343 taeseongkim
        int _TakeCount;
28 d7e20d2d taeseongkim
29 2007ecaa taeseongkim
        bool IsDownload = false;
30 d7e20d2d taeseongkim
31
        BitmapFrame PageImage;
32
33 2007ecaa taeseongkim
        public PageStorage(string BaseUri, string localStoragePath, string fileExt, int totalPages, int takeCount = 5)
34 d7e20d2d taeseongkim
        {
35
            try
36
            {
37 2007ecaa taeseongkim
                backgroundWorker = new BackgroundWorker { WorkerSupportsCancellation = true, WorkerReportsProgress = true };
38 d7e20d2d taeseongkim
                backgroundWorker.DoWork += BackgroundWorker_DoWork;
39 2007ecaa taeseongkim
                backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
40 54a28343 taeseongkim
                _fileExt = fileExt;
41 d7e20d2d taeseongkim
                _BaseUri = BaseUri;
42 9d5b4bc2 taeseongkim
                LocalStorage = localStoragePath;
43 d7e20d2d taeseongkim
                _TotalPages = totalPages;
44 54a28343 taeseongkim
                _TakeCount = takeCount;
45 d7e20d2d taeseongkim
46 77cdac33 taeseongkim
                System.IO.DirectoryInfo info = System.IO.Directory.CreateDirectory(LocalStorage);
47 d7e20d2d taeseongkim
48
                //backgroundWorker.RunWorkerAsync(new int[] { 1, 10 });
49
            }
50
            catch (Exception ex)
51
            {
52
                throw new Exception("PageStorage", ex);
53
            }
54
        }
55
56 2007ecaa taeseongkim
        private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
57 d7e20d2d taeseongkim
        {
58 2007ecaa taeseongkim
            System.Diagnostics.Debug.WriteLine(_fileExt + ":" + e.ProgressPercentage.ToString() + "%");
59
        }
60 d7e20d2d taeseongkim
61 2007ecaa taeseongkim
        private async void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
62
        {
63 d7e20d2d taeseongkim
64 2007ecaa taeseongkim
            while (WorkItems.Count > 0)
65
            {
66
                if (!IsDownload)
67 d7e20d2d taeseongkim
                {
68 2007ecaa taeseongkim
                    int item = -1;
69
                    try
70
                    {
71 d7e20d2d taeseongkim
72 2007ecaa taeseongkim
                        if (WorkItems.TryFrist(true, out item))
73
                        {
74
                            var result = await DownloadPageAsync(item, null);
75 d7e20d2d taeseongkim
76 2007ecaa taeseongkim
                            if (!result.IsDownLoad)
77
                            {
78
                                System.Threading.Thread.Sleep(100);
79
                            }
80
                            await Task.Delay(100);
81
                            //System.Threading.Thread.Sleep(10);
82
                            //backgroundWorker.ReportProgress(fileItems.Count / _TotalPages * 100);
83
                        }
84
                    }
85
                    catch (Exception ex)
86
                    {
87
                        System.Diagnostics.Debug.WriteLine(ex.ToString());
88
                    }
89 d7e20d2d taeseongkim
                }
90
            }
91
        }
92
93
        public void ResetImage()
94
        {
95
            //if (PageImage != null)
96
            //{
97
            //    PageImage = null;
98
            //}
99
100
            //PageImage.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
101
102
        }
103
104 2007ecaa taeseongkim
        public async Task<BitmapFrame> GetPageImageAsync(System.Threading.CancellationToken cts, int PageNo, bool IsRestart = false)
105 d7e20d2d taeseongkim
        {
106
            try
107
            {
108 54a28343 taeseongkim
109 2007ecaa taeseongkim
                var localUri = await GetPageUriAsync(null, PageNo);
110 54a28343 taeseongkim
111 24c5e56c taeseongkim
                if (localUri != null || !cts.IsCancellationRequested)
112
                {
113
                    PageImage = BitmapFrame.Create(localUri, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
114
                }
115 54a28343 taeseongkim
            }
116
            catch (Exception ex)
117
            {
118 04d21859 taeseongkim
                PageImage = BitmapFrame.Create(new Uri(_BaseUri.Replace("{PageNo}", PageNo.ToString())), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
119 54a28343 taeseongkim
            }
120
            finally
121
            {
122
            }
123
124
            return PageImage;
125
        }
126
127 2007ecaa taeseongkim
        private void DownloadWorkAsync(int startPage, int TakeCount)
128
        {
129
130
            lock (WorkItems)
131
            {
132
                WorkItems.AddRange(Enumerable.Range(startPage, TakeCount));
133
            }
134
135
            if (TakeCount == _TotalPages)
136
            {
137
                _TakeCount = 0;
138
            }
139
140
            // var files = fileItems.Select(x => x.PageNo);
141
142
143
            //for (int i = startPage; i < TakeCount + 1; i++)
144
            //{
145
            //    if (i < _TotalPages && !WorkItems.Contains(i) && !files.Contains(i))
146
            //    {
147
            //        WorkItems.Add(i);
148
            //       // System.Threading.Thread.Sleep(1);
149
            //    }
150
            //    else if(i == _TotalPages)
151
            //    {
152
            //        _TakeCount = 0;
153
            //    }
154
            //}
155
156
            if (!backgroundWorker.IsBusy && WorkItems.Count() > 0)
157
            {
158
                backgroundWorker.RunWorkerAsync();
159
            }
160
161
            //await Task.Delay(10);//  System.Threading.Thread.Sleep(10);
162
            //while (WorkItems.Count > 0)
163
            //{
164
            //    int item = -1;
165
166
            //    if (WorkItems.TryDequeue(out item))
167
            //    {
168
            //        var result = await DownloadPageAsync(item, null);
169
            //    }
170
171
            //}
172
173
        }
174
175 43a743e4 taeseongkim
        /// <summary>
176
        /// 
177
        /// </summary>
178
        /// <param name="cts"></param>
179
        /// <param name="PageNo"></param>
180
        /// <param name="IsClone"></param>
181
        /// <param name="IsRestart"></param>
182
        /// <returns></returns>
183 2007ecaa taeseongkim
        public async Task<Uri> GetPageUriAsync(System.Threading.CancellationToken? cts, int PageNo, bool IsRestart = false)
184 54a28343 taeseongkim
        {
185
            Uri result = null;
186
187
            try
188
            {
189 d7e20d2d taeseongkim
                System.Diagnostics.Debug.WriteLine("GetPageAsync");
190 54a28343 taeseongkim
191 2007ecaa taeseongkim
                var pageItem = await DownloadPageAsync(PageNo, cts);
192
193
                if (pageItem != null && 0 < _TakeCount && PageNo + 1 < _TotalPages)
194 d7e20d2d taeseongkim
                {
195 2007ecaa taeseongkim
                    int takecount = _TakeCount;
196 d7e20d2d taeseongkim
197 2007ecaa taeseongkim
                    if (_TotalPages < PageNo + 1 + takecount)
198 d7e20d2d taeseongkim
                    {
199 2007ecaa taeseongkim
                        takecount = takecount - (PageNo + 1 + takecount - _TotalPages) - 1;
200
                    }
201 d7e20d2d taeseongkim
202 2007ecaa taeseongkim
                    DownloadWorkAsync(PageNo + 1, takecount);
203
                    //var takePageNoList = Enumerable.Range(PageNo + 1, _TakeCount);
204 54a28343 taeseongkim
                }
205 d7e20d2d taeseongkim
206 54a28343 taeseongkim
                result = pageItem.LocalUri;
207 d7e20d2d taeseongkim
            }
208 54a28343 taeseongkim
            catch (Exception ex)
209 d7e20d2d taeseongkim
            {
210 2007ecaa taeseongkim
                if (cts != null)
211
                {
212
                    if (cts.Value.IsCancellationRequested)
213
                    {
214
                        return result;
215
                    }
216
                }
217
218
                if (!IsRestart)
219 96bc6e8e taeseongkim
                {
220
                    await Task.Delay(100);
221 54a28343 taeseongkim
222 2007ecaa taeseongkim
                    result = await GetPageUriAsync(cts, PageNo, true);
223 96bc6e8e taeseongkim
                }
224 a7372e37 taeseongkim
                //throw new Exception("GetPageAsync(string BasePageUri,int PageNo)", ex);
225 d7e20d2d taeseongkim
            }
226
            finally
227
            {
228
            }
229
230 54a28343 taeseongkim
            return result;
231 d7e20d2d taeseongkim
        }
232
233 2007ecaa taeseongkim
        public async Task<PageItem> DownloadPageAsync(int PageNo, System.Threading.CancellationToken? cts)
234 d7e20d2d taeseongkim
        {
235
            PageItem result = new PageItem { PageNo = PageNo };
236
237
            try
238
            {
239 2007ecaa taeseongkim
                var page = fileItems.Where(x => x.PageNo == PageNo).ToList();
240 d7e20d2d taeseongkim
241 2007ecaa taeseongkim
                if (page.Count > 0)
242 d7e20d2d taeseongkim
                {
243
                    System.Diagnostics.Debug.WriteLine("DownloadPageAsync fileItems");
244
245 2007ecaa taeseongkim
                    result = page.First();
246 d7e20d2d taeseongkim
247
                    /// 파일 체크 후 없으면 다시 다운로드
248 2007ecaa taeseongkim
                    if (!System.IO.File.Exists(result.LocalFilePath))
249 d7e20d2d taeseongkim
                    {
250 2007ecaa taeseongkim
                        //fileItems.(result);
251 d7e20d2d taeseongkim
252 2007ecaa taeseongkim
                        result = await DownloadPageAsync(PageNo, cts);
253 d7e20d2d taeseongkim
                    }
254
                }
255
                else
256
                {
257 2007ecaa taeseongkim
258 77cdac33 taeseongkim
                    if (!System.IO.Directory.Exists(LocalStorage))
259
                    {
260
                        System.IO.Directory.CreateDirectory(LocalStorage);
261
                        System.Threading.Thread.Sleep(100);
262
                    }
263
264 d7e20d2d taeseongkim
                    System.Diagnostics.Debug.WriteLine("DownloadPageAsync down");
265
266 43a743e4 taeseongkim
                    string downloadFilePath = System.IO.Path.Combine(LocalStorage, System.IO.Path.GetRandomFileName()); /// PageNo.ToString() + "." + _fileExt);
267 d7e20d2d taeseongkim
268 96bc6e8e taeseongkim
                    Uri originalUri = new Uri(_BaseUri.Replace("{PageNo}", PageNo.ToString()));
269
270 2007ecaa taeseongkim
                    result = new PageItem
271
                    {
272
                        PageNo = PageNo,
273
                        OriginalUri = originalUri,
274
                        LocalUri = new Uri(downloadFilePath, UriKind.Absolute),
275
                        LocalFilePath = downloadFilePath
276
                    };
277
278
                    if (fileItems.Where(x => x.PageNo == PageNo).Count() == 0)
279
                    {
280
                        fileItems.Add(result);
281
                    }
282 d7e20d2d taeseongkim
283 448c5399 taeseongkim
                    using (System.Net.WebClient client = new System.Net.WebClient())
284 24c5e56c taeseongkim
                    {
285 77cdac33 taeseongkim
                        client.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
286
                        client.Headers.Add("Cache-Control", "no-cache");
287 448c5399 taeseongkim
                        client.UseDefaultCredentials = true;
288
                        System.Net.IWebProxy webProxy = client.Proxy;
289 d7e20d2d taeseongkim
290 448c5399 taeseongkim
                        if (webProxy != null)
291 d97dbc7f taeseongkim
                        {
292 448c5399 taeseongkim
                            // Use the default credentials of the logged on user.
293
                            webProxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
294 d97dbc7f taeseongkim
                        }
295
296 448c5399 taeseongkim
                        //client.DownloadFileCompleted += (snd, evt) =>
297
                        //{
298 24c5e56c taeseongkim
299 d7e20d2d taeseongkim
300 448c5399 taeseongkim
                        //    //(snd as System.Net.WebClient).Dispose();
301
                        //};
302 d7e20d2d taeseongkim
303 2007ecaa taeseongkim
                        if (cts != null)
304
                        {
305 24c5e56c taeseongkim
                            client.DownloadProgressChanged += (snd, ect) =>
306
                            {
307 2007ecaa taeseongkim
                                IsDownload = client.IsBusy;
308
309
                                if (cts.Value.IsCancellationRequested)
310 24c5e56c taeseongkim
                                {
311
                                    client.CancelAsync();
312
                                }
313
                            };
314 2007ecaa taeseongkim
                        }
315
316
                        client.DownloadFileCompleted += (snd, evt) =>
317
                        {
318
                            result.IsDownLoad = true;
319
                            System.Diagnostics.Debug.WriteLine("Download : " + downloadFilePath);
320 24c5e56c taeseongkim
321 2007ecaa taeseongkim
                            PageLoadCompleted?.Invoke(this, new PageLoadCompletedEventArgs(result));
322
                        };
323 72424099 taeseongkim
324 448c5399 taeseongkim
                        await client.DownloadFileTaskAsync(originalUri, downloadFilePath);
325
326
                    }
327 2007ecaa taeseongkim
328
                    //}
329 54a28343 taeseongkim
                    //System.Diagnostics.Debug.WriteLine("Download : " + result.LocalFilePath);
330 d7e20d2d taeseongkim
                }
331
            }
332
            catch (Exception ex)
333
            {
334
                throw new Exception("DownloadPageAsync : ", ex);
335
            }
336
            finally
337
            {
338 2007ecaa taeseongkim
                IsDownload = false;
339 d7e20d2d taeseongkim
            }
340
341
            return result;
342
        }
343
344
        public void Clear()
345
        {
346
            try
347
            {
348
                ResetImage();
349
            }
350
            catch (Exception ex)
351
            {
352
                System.Diagnostics.Debug.WriteLine(ex.ToString());
353
            }
354
355
            try
356
            {
357
                backgroundWorker.CancelAsync();
358
                backgroundWorker.Dispose();
359
360 03960fa5 taeseongkim
                /// downloadmanager에서 삭제함
361
                //foreach (var item in fileItems)
362
                //{
363
                //    System.IO.File.Delete(item.LocalFilePath);
364
                //}
365 d7e20d2d taeseongkim
366 03960fa5 taeseongkim
                //System.IO.Directory.Delete(LocalStorage, true);
367 d7e20d2d taeseongkim
            }
368
            catch (Exception ex)
369
            {
370
                System.Diagnostics.Debug.WriteLine(ex.ToString());
371
            }
372
        }
373
    }
374
}
클립보드 이미지 추가 (최대 크기: 500 MB)