private HRESULT ProcessStartEnumeration( PRJ_CALLBACK_DATA callbackData, Guid enumerationId ) { try { var cts = new CancellationTokenSource(); var ongoing = new OngoingEnumeration { Path = callbackData.FilePathName, VersionInfo = LevelShifter.PlaceholderVersionFromPRJ_PLACEHOLDER_VERSION_INFO(callbackData.VersionInfo), State = EnumerationState.Init }; if (!_inFlightEnumerations.TryAdd(enumerationId, ongoing)) { cts.Cancel(); return(HRESULT.E_INVALIDARG); } return(HRESULT.S_OK); } catch (Exception) { return(HRESULT.E_INVALIDARG); } }
private bool SendCurrentEnumeratorValue(OngoingEnumeration ongoing, IntPtr dirEntryBufferHandle) { var current = ongoing.Enumerator.Current; if (_outboundFunctions.PrjFillDirEntryBuffer( current.Name, LevelShifter.PRJ_FILE_BASIC_INFOFromBasicInfo(current), dirEntryBufferHandle) == HRESULT.S_OK) { return(true); } return(false); }
private void InitializeEnumeration(PRJ_CALLBACK_DATA callbackData, OngoingEnumeration ongoing) { if ((callbackData.Flags & PRJ_CALLBACK_DATA_FLAGS.PRJ_CB_DATA_FLAG_ENUM_RESTART_SCAN) != 0 || ongoing.State == EnumerationState.Init) { ongoing.MatchPattern = callbackData.FilePathName; if (ongoing.CancellationForEnumeration != null) { ongoing.CancellationForEnumeration.Cancel(); } ongoing.CancellationForEnumeration = new CancellationTokenSource(); ongoing.Enumerator = FileSystem.FindContent( ongoing.Path, ongoing.VersionInfo, s => _outboundFunctions.PrjFileNameMatch(s, ongoing.MatchPattern), new SortComparer(_outboundFunctions), ongoing.CancellationForEnumeration.Token ); ongoing.State = EnumerationState.Ongoing; } }
private void ContinueEnumerationAsync(IntPtr namespaceVirtualizationContext, bool enumerationResult, OngoingEnumeration enumeration, IntPtr dirEntryBufferHandle, int commandId) { while (true) { if (!enumerationResult) { _asyncOperations.AsyncProvideHRESULTWithDirEntry(namespaceVirtualizationContext, commandId, HRESULT.S_OK, dirEntryBufferHandle); return; } if (SendCurrentEnumeratorValue(enumeration, dirEntryBufferHandle)) { enumeration.State = EnumerationState.Ongoing; var newTask = enumeration.Enumerator.MoveNextAsync(); if (newTask.IsCompleted) { enumerationResult = newTask.Result; continue; } else { newTask.AsTask().ContinueWith(answer => ContinueEnumerationAsync(namespaceVirtualizationContext, answer.Result, enumeration, dirEntryBufferHandle, commandId), TaskContinuationOptions.RunContinuationsAsynchronously); return; } } else { var returnSync = enumeration.State == EnumerationState.NotOneSent ? HRESULT.ERROR_INSUFFICIENT_BUFFER : HRESULT.S_OK; enumeration.State = EnumerationState.CurrentPending; _asyncOperations.AsyncProvideHRESULTWithDirEntry(namespaceVirtualizationContext, commandId, returnSync, dirEntryBufferHandle); return; } } }