Пример #1
0
 public Task AddDrcsMap(DrcsImage drcsMap)
 {
     return(Send(RPCMethodId.AddDrcsMap, drcsMap));
 }
Пример #2
0
        public async Task AddDrcsMap(DrcsImage recvitem)
        {
            if (drcsMap.ContainsKey(recvitem.MD5))
            {
                var item = drcsMap[recvitem.MD5];

                if (item.MapStr != recvitem.MapStr)
                {
                    var filepath   = server.GetDRCSMapPath();
                    var updateType = DrcsUpdateType.Update;

                    // データ更新
                    if (item.MapStr == null)
                    {
                        // 既存のマッピングにないので追加
                        item.MapStr = recvitem.MapStr;
                        try
                        {
                            File.AppendAllLines(filepath,
                                                new string[] { item.MD5 + "=" + recvitem.MapStr },
                                                Encoding.UTF8);
                        }
                        catch (Exception e)
                        {
                            await server.FatalError(
                                "DRCSマッピングファイル書き込みに失敗", e);
                        }
                    }
                    else
                    {
                        // 既にマッピングにある
                        item.MapStr = recvitem.MapStr;
                        if (item.MapStr == null)
                        {
                            // 削除
                            drcsMap.Remove(recvitem.MD5);
                            updateType = DrcsUpdateType.Remove;
                            try
                            {
                                File.Delete(server.GetDRCSImagePath(recvitem.MD5));
                            }
                            catch (Exception e)
                            {
                                await server.FatalError(
                                    "DRCS画像ファイル削除に失敗", e);
                            }
                        }

                        // まず、一時ファイルに書き込む
                        var tmppath = filepath + ".tmp";
                        // BOMありUTF-8
                        try
                        {
                            using (var sw = new StreamWriter(File.Create(tmppath), Encoding.UTF8))
                            {
                                foreach (var s in drcsMap.Values)
                                {
                                    sw.WriteLine(s.MD5 + "=" + s.MapStr);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            await server.FatalError(
                                "DRCSマッピングファイル書き込みに失敗", e);
                        }
                        // ファイル置き換え
                        Util.MoveFileEx(tmppath, filepath, 11);
                    }

                    await server.Client.OnDrcsData(new DrcsImageUpdate()
                    {
                        Type  = updateType,
                        Image = item
                    });
                }
            }
        }
Пример #3
0
 public Task AddDrcsMap(DrcsImage drcsMap)
 {
     return(Server.AddDrcsMap(Copy(drcsMap)));
 }
Пример #4
0
        public async Task Update()
        {
            string drcspath    = server.GetDRCSDirectoryPath();
            string drcsmappath = server.GetDRCSMapPath();

            if (!Directory.Exists(drcspath))
            {
                Directory.CreateDirectory(drcspath);
            }
            if (!File.Exists(drcsmappath))
            {
                using (File.Create(drcsmappath)) { }
            }

            // 全ログファイルを読むのは時間がかかりそうなので、
            // 別スレッドで実行する
            // 大丈夫だとは思うけど、一応 drcsSourceMap と UpdateCount に触る時は
            // drcsSourceMapをロックすること

            if (logQueue.Count > 0)
            {
                // 読んでる途中で追加されるとマズいので
                // コピーを取って、logQueueはクリアしておく
                var input = logQueue.ToArray();
                logQueue.Clear();

                await Task.Run(() =>
                {
                    lock (drcsSourceMap)
                    {
                        ReadLogFiles(input);
                    }
                });
            }

            {
                // 今drcsMapにある分については、drcsSourceMapの更新分をクライアントに通知
                var updateImages = new List <DrcsImage>();

                lock (drcsSourceMap)
                {
                    foreach (var item in drcsMap.Values)
                    {
                        if (drcsSourceMap.ContainsKey(item.MD5))
                        {
                            var srcItem = drcsSourceMap[item.MD5];
                            if (srcItem.LastUpdate >= LastUpdate)
                            {
                                // 更新された
                                item.SourceList = srcItem.Items.ToArray();
                                updateImages.Add(item);
                            }
                        }
                    }
                    LastUpdate = UpdateCount;
                }

                if (updateImages.Count > 0)
                {
                    await server.Client.OnDrcsData(new DrcsImageUpdate()
                    {
                        Type      = DrcsUpdateType.Update,
                        ImageList = updateImages.Distinct().ToList()
                    });
                }
            }

            // ファイルの更新を見る
            bool needUpdate   = false;
            var  lastModified = Directory.GetLastWriteTime(drcspath);

            if (drcsDirTime != lastModified)
            {
                // ファイルが追加された
                needUpdate  = true;
                drcsDirTime = lastModified;
            }
            lastModified = File.GetLastWriteTime(drcsmappath);
            if (drcsTime != lastModified)
            {
                // マッピングが更新された
                needUpdate = true;
                drcsTime   = lastModified;
            }
            if (needUpdate)
            {
                var newImageMap = LoadDrcsImages();
                var newStrMap   = LoadDrcsMap();

                var newDrcsMap = new Dictionary <string, DrcsImage>();
                lock (drcsSourceMap)
                {
                    foreach (var key in newImageMap.Keys.Union(newStrMap.Keys))
                    {
                        var newItem = new DrcsImage()
                        {
                            MD5 = key
                        };
                        if (newImageMap.ContainsKey(key))
                        {
                            newItem.Image = newImageMap[key].Image;
                        }
                        if (newStrMap.ContainsKey(key))
                        {
                            newItem.MapStr = newStrMap[key].MapStr;
                        }
                        if (drcsSourceMap.ContainsKey(key))
                        {
                            newItem.SourceList = drcsSourceMap[key].Items.ToArray();
                        }
                        newDrcsMap.Add(key, newItem);
                    }
                }

                // 更新処理
                var updateImages = new List <DrcsImage>();
                foreach (var key in newDrcsMap.Keys.Union(drcsMap.Keys))
                {
                    if (newDrcsMap.ContainsKey(key) == false)
                    {
                        // 消えた
                        await server.Client.OnDrcsData(new DrcsImageUpdate()
                        {
                            Type  = DrcsUpdateType.Remove,
                            Image = drcsMap[key]
                        });
                    }
                    else if (drcsMap.ContainsKey(key) == false)
                    {
                        // 追加された
                        updateImages.Add(newDrcsMap[key]);
                    }
                    else
                    {
                        var oldItem = drcsMap[key];
                        var newItem = newDrcsMap[key];
                        if (oldItem.MapStr != newItem.MapStr || oldItem.Image != newItem.Image)
                        {
                            // 変更された
                            updateImages.Add(newDrcsMap[key]);
                        }
                    }
                }

                if (updateImages.Count > 0)
                {
                    await server.Client.OnDrcsData(new DrcsImageUpdate()
                    {
                        Type      = DrcsUpdateType.Update,
                        ImageList = updateImages.Distinct().ToList()
                    });
                }

                drcsMap = newDrcsMap;
            }
        }