예제 #1
0
    public async Task<IEnumerable<IMediaFile>> StartSearchAsync(StringCollection filesOrDirsCollection) {
      this.IsWorking = true;
      // create the cancellation token source
      this.cancelToken = new CancellationTokenSource();
      // create the cancellation token
      var token = this.cancelToken.Token;

      this.mainTask = Task<IEnumerable<IMediaFile>>.Factory
        .StartNew(() => {
          var results = new ConcurrentQueue<IMediaFile>();

          // get audio files from input collection
          var rawFiles = filesOrDirsCollection.OfType<string>().Where(this.IsAudioFile).OrderBy(s => s).ToList();
          foreach (var rawFile in rawFiles.TakeWhile(rawDir => !token.IsCancellationRequested)) {
            var mf = this.GetMediaFile(rawFile);
            if (mf != null) {
              results.Enqueue(mf);
            }
          }

          // handle all directories from input collection
          var directories = new List<string>();
          foreach (var source in filesOrDirsCollection.OfType<string>().Except(rawFiles).Where(IsDirectory).TakeWhile(source => !token.IsCancellationRequested)) {
            directories.Add(source);
            try {
              directories.AddRange(Directory.EnumerateDirectories(source, "*", SearchOption.AllDirectories).TakeWhile(dir => !token.IsCancellationRequested));
            } catch (Exception e) {
              // System.UnauthorizedAccessException
              Console.WriteLine(e);
            }
          }
          foreach (var rawDir in directories.Distinct().OrderBy(s => s).TakeWhile(rawDir => !token.IsCancellationRequested)) {
            this.doFindFiles(token, rawDir, results);
          }

          return results;
        }, token, TaskCreationOptions.LongRunning, TaskScheduler.Current);

      var mediaFiles = await this.mainTask;
      this.IsWorking = false;
      return mediaFiles;
    }
예제 #2
0
 internal XmlSchema GetQuerySchema()
 {
     var schema = new XmlSchema {TargetNamespace = QuerySpace};
     schema.Namespaces.Add("", QuerySpace);
     var allParameters = new StringCollection();            
     foreach (var queriesForResourceType in _baseQueries.GroupBy(k => k.ResourceKey)
                                                    .Where(k=>_registrationStorage.IsResourceRegistered(k.Key)))
     {
         
         var group = new XmlSchemaAttributeGroup();
         group.Name = _registrationStorage[queriesForResourceType.Key].ResourceName.Replace(" ", "_");
         var parameters = queriesForResourceType.SelectMany(k => k.Arguments)
                                                .Distinct(_parameterComparer)
                                                .ToArray();
        
         allParameters.AddRange(parameters);
         foreach (var attr in parameters.Select(k => new XmlSchemaAttribute { RefName = new XmlQualifiedName(k, QuerySpace) }))
         {
             group.Attributes.Add(attr);
         }
         schema.Items.Add(group);
     }
    foreach(var attr in allParameters.OfType<string>().Distinct().Select(
         k =>
         new XmlSchemaAttribute
             {
                 Name = k,                        
                 SchemaType = XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String)
             }))
    {
        schema.Items.Add(attr);
    }
     
     return schema;
 }