예제 #1
0
 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);
     }
 }
예제 #2
0
        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);
        }
예제 #3
0
 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;
     }
 }
예제 #4
0
 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;
         }
     }
 }