public Task AddDrcsMap(DrcsImage drcsMap) { return(Send(RPCMethodId.AddDrcsMap, drcsMap)); }
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 }); } } }
public Task AddDrcsMap(DrcsImage drcsMap) { return(Server.AddDrcsMap(Copy(drcsMap))); }
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; } }