protected override IEnumerable <ParsingResult> ImportHand(string handHistory, GameInfo gameInfo, IFileImporter dbImporter, DHProgress progress) { var parsingResults = dbImporter.Import(handHistory, progress, gameInfo); IPokerFileInfo importedFileInfo = null; if (importedHandsHistory.ContainsKey(gameInfo.FullFileName)) { importedFileInfo = importedHandsHistory[gameInfo.FullFileName]; } else { importedFileInfo = new IPokerFileInfo(); importedHandsHistory.Add(gameInfo.FullFileName, importedFileInfo); } foreach (var parsingResult in parsingResults) { if (parsingResult != null && parsingResult.HandHistory != null && !importedFileInfo.ImportedHands.Contains(parsingResult.HandHistory.Gamenumber)) { importedFileInfo.ImportedHands.Add(parsingResult.HandHistory.Gamenumber); } } return(parsingResults); }
protected override string GetHandTextFromStream(Stream fs, Encoding encoding, string fileName) { IPokerFileInfo importedFileInfo = null; var fileWasImportedOnce = importedHandsHistory.ContainsKey(fileName); var fileInfo = new FileInfo(fileName); if (fileWasImportedOnce) { importedFileInfo = importedHandsHistory[fileName]; // file hasn't been changed so we don't read it if (importedFileInfo.LastWriteTime == fileInfo.LastWriteTime && importedFileInfo.Length == fs.Length) { return(null); } } var data = new byte[fs.Length]; if (data.Length == 0) { return(string.Empty); } fs.Position = 0; fs.Read(data, 0, data.Length); if (importedFileInfo == null) { importedFileInfo = new IPokerFileInfo(); } importedFileInfo.LastWriteTime = fileInfo.LastWriteTime; importedFileInfo.Length = fs.Length; var handText = encoding.GetString(data); if (!fileWasImportedOnce) { importedHandsHistory.Add(fileName, importedFileInfo); return(handText); } var xmlHandDocument = XDocument.Parse(handText, LoadOptions.PreserveWhitespace); var gameNodes = xmlHandDocument.Document.Descendants("game").ToArray(); foreach (var gameNode in gameNodes) { var gamecodeAttribute = gameNode.Attribute("gamecode"); // skip game nodes without gamecode attribute if (gamecodeAttribute == null) { gameNode.Remove(); continue; } long gamecode = 0; // skip game nodes if gamecode can't be parsed if (!long.TryParse(gamecodeAttribute.Value, out gamecode)) { gameNode.Remove(); continue; } if (importedFileInfo != null && importedFileInfo.ImportedHands.Contains(gamecode)) { gameNode.Remove(); } } handText = xmlHandDocument.ToString(SaveOptions.None); return(handText); }