public static string GetProtocolAsString(udtProtocol protocol) { switch(protocol) { case udtProtocol.Dm68: return "68 (Quake 3's last protocol)"; case udtProtocol.Dm73: return "73 (Quake Live's old protocol)"; case udtProtocol.Dm90: return "90 (Quake Live's current protocol)"; default: return "?"; } }
private static bool ConvertDemosImpl(ref udtParseArg parseArg, udtProtocol outProtocol, List<MapConversionRule> mapRules, List<string> filePaths, int maxThreadCount) { var resources = new ArgumentResources(); var errorCodeArray = new Int32[filePaths.Count]; var filePathArray = new IntPtr[filePaths.Count]; for(var i = 0; i < filePaths.Count; ++i) { var filePath = Marshal.StringToHGlobalAnsi(Path.GetFullPath(filePaths[i])); filePathArray[i] = filePath; resources.GlobalAllocationHandles.Add(filePath); } var pinnedFilePaths = new PinnedObject(filePathArray); var pinnedErrorCodes = new PinnedObject(errorCodeArray); resources.PinnedObjects.Add(pinnedFilePaths); resources.PinnedObjects.Add(pinnedErrorCodes); var multiParseArg = new udtMultiParseArg(); multiParseArg.FileCount = (UInt32)filePathArray.Length; multiParseArg.FilePaths = pinnedFilePaths.Address; multiParseArg.OutputErrorCodes = pinnedErrorCodes.Address; multiParseArg.MaxThreadCount = (UInt32)maxThreadCount; var conversionArg = new udtProtocolConversionArg(); conversionArg.OutputProtocol = (UInt32)outProtocol; conversionArg.MapRules = IntPtr.Zero; conversionArg.MapRuleCount = 0; if(mapRules.Count > 0) { var mapRuleArray = new udtMapConversionRule[mapRules.Count]; for(var i = 0; i < mapRules.Count; ++i) { var inputName = Marshal.StringToHGlobalAnsi(mapRules[i].InputName); var outputName = Marshal.StringToHGlobalAnsi(mapRules[i].OutputName); mapRuleArray[i].InputName = inputName; mapRuleArray[i].OutputName = outputName; mapRuleArray[i].PositionOffsetX = mapRules[i].OffsetX; mapRuleArray[i].PositionOffsetY = mapRules[i].OffsetY; mapRuleArray[i].PositionOffsetZ = mapRules[i].OffsetZ; resources.GlobalAllocationHandles.Add(inputName); resources.GlobalAllocationHandles.Add(outputName); } var pinnedMapRules = new PinnedObject(mapRuleArray); resources.PinnedObjects.Add(pinnedMapRules); conversionArg.MapRules = pinnedMapRules.Address; conversionArg.MapRuleCount = (UInt32)mapRuleArray.Length; } var result = udtErrorCode.OperationFailed; try { result = udtConvertDemoFiles(ref parseArg, ref multiParseArg, ref conversionArg); } finally { resources.Free(); } return result != udtErrorCode.None; }
public static bool ConvertDemos(ref udtParseArg parseArg, udtProtocol outProtocol, List<MapConversionRule> mapRules, List<string> filePaths, int maxThreadCount) { var timer = new Stopwatch(); timer.Start(); var fileCount = filePaths.Count; if(fileCount <= MaxBatchSizeConverting) { var result = ConvertDemosImpl(ref parseArg, outProtocol, mapRules, filePaths, maxThreadCount); PrintExecutionTime(timer); return result; } var oldProgressCb = parseArg.ProgressCb; var progressBase = 0.0f; var progressRange = 0.0f; var fileIndex = 0; var newParseArg = parseArg; newParseArg.ProgressCb = delegate(float progress, IntPtr userData) { var realProgress = progressBase + progressRange * progress; oldProgressCb(realProgress, userData); }; var batchCount = (fileCount + MaxBatchSizeConverting - 1) / MaxBatchSizeConverting; var filesPerBatch = fileCount / batchCount; for(int i = 0; i < batchCount; ++i) { progressBase = (float)fileIndex / (float)fileCount; var currentFileCount = (i == batchCount - 1) ? (fileCount - fileIndex) : filesPerBatch; var currentFiles = filePaths.GetRange(fileIndex, currentFileCount); progressRange = (float)currentFileCount / (float)fileCount; fileIndex += currentFileCount; ConvertDemosImpl(ref newParseArg, outProtocol, mapRules, currentFiles, maxThreadCount); if(Marshal.ReadInt32(parseArg.CancelOperation) != 0) { break; } } PrintExecutionTime(timer); return true; }
private static extern Int32 udtIsValidProtocol(udtProtocol protocol);
private static extern UInt32 udtGetSizeOfIdEntityState(udtProtocol protocol);
private static extern UInt32 udtGetSizeOfidClientSnapshot(udtProtocol protocol);
private static extern IntPtr udtGetFileExtensionByProtocol(udtProtocol protocol);