protected internal static int HandleChainedByTagFile(EnhancedFileInfo chain, 
             EnhancedFileInfo newElement)
        {
            MLTag location = new MLTag("Location", chain.Item.Location);

            int fileIndex =
                location.Values.Select(value => value.ToLowerInvariant()).ToList().IndexOf(
                    newElement.FileInformation.FullName.ToLowerInvariant());

            MLTag externalID = new MLTag("ExternalID", chain.Item.ExternalID);

            if (fileIndex >= 0)
            {
                location.Values[fileIndex] = newElement.Item.Location;
                chain.Item.Location = location.Value;
                externalID.Values[fileIndex] = newElement.Item.ExternalID;
                chain.Item.ExternalID = externalID.Value;
            }
            else
            {
                location.Values.Add(newElement.Item.Location);
                location.Values.Sort();
                chain.Item.Location = location.Value;
                externalID.Values.Add(newElement.Item.ExternalID);
                externalID.Values.Sort();
                chain.Item.ExternalID = externalID.Value;
            }

            return fileIndex;
        }
        internal static void HandleUnchainedOrFirstFile(RootFolderHandlerBase rootFolderHandlerBase, EnhancedFileInfo theFile)
        {
            theFile.Item.Location = theFile.FileInformation.FullName;
            theFile.Item.ExternalID = theFile.Item.Location.ToLower();

            if (rootFolderHandlerBase.Importer.TagMasks != null)
            {

                FileTagsRetriever.GetTagsOfFile
                    (rootFolderHandlerBase, theFile);

            }

            theFile.Item.Name = theFile.Item.Tags.Get("name", String.Empty) as string;

            rootFolderHandlerBase.Importer.ImageLinker.LinkAllImages(theFile);

            if (!rootFolderHandlerBase.IsNewItem && !rootFolderHandlerBase.Update)
                return;

            rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Info", "  Getting filesystem information"));

            if (rootFolderHandlerBase.Importer.FileSize)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.FileSizeTagName]
                    = theFile.FileInformation.Length;
            }

            if (rootFolderHandlerBase.Importer.CreationDate)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.CreationDateTagName]
                    = theFile.FileInformation.CreationTime.ToString("yyyy-MM-dd hh:mm:ss");
            }

            if (rootFolderHandlerBase.Importer.LastAccessDate)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.LastAccessDateTagName]
                    = theFile.FileInformation.LastAccessTime.ToString("yyyy-MM-dd hh:mm:ss");
            }

            if (rootFolderHandlerBase.Importer.LastModificationDate)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.LastModificationDateTagName]
                    = theFile.FileInformation.LastWriteTime.ToString("yyyy-MM-dd hh:mm:ss");
            }

            if (rootFolderHandlerBase.Importer.SerialNumber)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.SerialNumberTagName] = rootFolderHandlerBase.InfoOfDrive.SerialNumber;
            }

            if (rootFolderHandlerBase.Importer.VolumeName)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.VolumeNameTagName] = rootFolderHandlerBase.InfoOfDrive.VolumeLabel;
            }
        }
 internal override void DoSpecificHandling()
 {
     if ((this.previousFile == null) ||
         (this.File.FileInformation.DirectoryName != this.previousFile.FileInformation.DirectoryName))
     {
         UnchainedFileHandler.HandleUnchainedOrFirstFile(this, this.File);
         this.previousFile = this.File;
     }
     else
     {
         ChainedFileHandler.HandleChainedFile(this, this.File, this.previousFile);
         this.Files.Remove(this.File);
     }
 }
 public EnhancedFileInfo Query(IMLItem item)
 {
     if (this.files.Keys.Contains(item))
     {
         this.RetrivedItemWasCached = true;
         return this.files[item];
     }
     else
     {
         MLTag location = new MLTag("Location", item.Location);
         EnhancedFileInfo file = new EnhancedFileInfo(new FileInfo(location.Values[0])) { Item = item };
         this.Add(file);
         this.RetrivedItemWasCached = false;
         return file;
     }
 }
 public void Add(EnhancedFileInfo file)
 {
     this.files.Add(file.Item, file);
 }
        internal override void DoSpecificHandling()
        {
            if ((!IsNewItem) && (!this.Update))
            {

                if (Import.Importer.AlwaysUpdateImages)
                {
                    var tempFile = new EnhancedFileInfo
                        (File.FileInformation);

                    UnchainedFileHandler.HandleUnchainedOrFirstFile(this, tempFile);

                    File = tempFile;

                    Files[FilePos] = tempFile;

                    item2File.Add(tempFile);

                }
                else
                {
                    Files.Remove(File);
                }

            }
            else
            {

                var tempFile = new EnhancedFileInfo
                    (File.FileInformation);

                UnchainedFileHandler.HandleUnchainedOrFirstFile(this, tempFile);

                IMLItem cachedItem
                    = Import.ItemsChainedByTagCache.Query
                    (tempFile.Item);

                if (cachedItem != tempFile.Item)
                {

                    File = item2File.Query(cachedItem);

                    File.SuccessfulTagMaskMatch
                        = tempFile.SuccessfulTagMaskMatch;

                    ChainedFileHandler
                        .HandleChainedByTagFile
                        (File, tempFile);

                    if (item2File.RetrivedItemWasCached)
                    {
                        Files.RemoveAt(FilePos);
                    }
                    else
                    {
                        Files[FilePos] = File;
                    }

                }
                else
                {
                    Files[FilePos] = tempFile;
                    item2File.Add(tempFile);
                }

            }
        }
        protected internal static void GetTagsOfFile(RootFolderHandlerBase rootFolderHandlerBase,
             EnhancedFileInfo theFile)
        {
            bool tagMaskMatched = false;
            const string folderPattern = "(?:.*\\\\)*";

            rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Info", "  Retrieving tags"));
            MLItem.AddBaseTagsToTags(theFile.Item);
            if (rootFolderHandlerBase.Importer.ImportFromAlternateDataStream)
            {
                AlternateDataStreamReader adsReader = new AlternateDataStreamReader(rootFolderHandlerBase.File);
                adsReader.ReadItem();
            }

            theFile.SuccessfulTagMaskMatch = rootFolderHandlerBase.Importer.TagMasks.Count == 0;

            foreach (TagMask tagMask in rootFolderHandlerBase.Importer.TagMasks)
            {

                if (tagMask.Mask.Length == 0)
                {
                    tagMaskMatched = false;
                }
                else if (!tagMaskMatched)
                {

                    if (!rootFolderHandlerBase.RootFolder.EndsWith("\\"))
                    {
                        rootFolderHandlerBase.RootFolder += "\\";
                    }

                    string rootFolderPattern = RootFolderHandlerBase
                        .PatternFixEscapeChars
                        (rootFolderHandlerBase.RootFolder);

                    string regExpPattern = rootFolderPattern + folderPattern + tagMask.RegExp;

                    try
                    {

                        Regex tagValuesFinder = new Regex
                            (regExpPattern,
                             RegexOptions.IgnoreCase);

                        MatchCollection matches
                            = tagValuesFinder.Matches
                            (theFile.Item.Location
                            .Replace("._", ' ')
                            .ReplaceLast(' ', '.'));

                        if (matches.Count == 1)
                        {
                            tagMaskMatched = true;
                            theFile.SuccessfulTagMaskMatch = true;
                            Match match = matches[0];
                            rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Info", "    Matched tagmask: " + tagMask.Mask));
                            int groupPos = 0;
                            int tagPos = 0;
                            foreach (Group group in match.Groups)
                            {
                                if (groupPos > 0)
                                {
                                    while (tagMask.Tags[tagPos].Name.Length == 0)
                                    {
                                        tagPos++;
                                    }

                                    theFile.Item.Tags[tagMask.Tags[tagPos].Name] = @group.Value;
                                    tagPos++;
                                }

                                groupPos++;
                            }
                        }
                        else
                        {
                            rootFolderHandlerBase.LogMessages.Enqueue(
                                new LogMessage("Info", "    No match for tagmask: " + tagMask.Mask));
                        }
                        //// LogMessages.Enqueue(new LogMessage("Info", String.Empty));
                    }
                    catch (ArgumentException ex)
                    {
                        string logMessage = "RegEx could not be generated from the tag mask \"" +
                                            tagMask.Mask + "\"" + " (Exception: " + ex.Message + ")";
                        rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Error", logMessage));
                    }

                }

            }

            rootFolderHandlerBase.Importer
                .TagValuesReplacementRules
                .ApplyRulesToItem(theFile.Item);
        }
 public AlternateDataStreamReader(EnhancedFileInfo file)
 {
     _file = file;
 }
        internal static void HandleChainedFile(RootFolderHandlerBase rootFolderHandlerBase,
             EnhancedFileInfo theFile, 
             EnhancedFileInfo previousFile)
        {
            if ((!rootFolderHandlerBase.IsNewItem)
                && (!rootFolderHandlerBase.Update))
            {
                return;
            }

            var location = new MLTag
                ("item_location",
                previousFile.Item.Location);

            location.Values.Add(theFile.FileInformation.FullName);

            location.Values.Sort();

            previousFile.Item.Location = location.Value;

            previousFile.Item.ExternalID
                = previousFile.Item.Location.ToLower();

            if (rootFolderHandlerBase.Importer.FileSize)
            {
                previousFile.Item.Tags[rootFolderHandlerBase.Importer.FileSizeTagName] =
                    (long)previousFile.Item.Tags[rootFolderHandlerBase.Importer.FileSizeTagName] + theFile.FileInformation.Length;
            }

            if (rootFolderHandlerBase.Importer.CreationDate)
            {
                object creationDate = previousFile.Item.Tags[rootFolderHandlerBase.Importer.CreationDateTagName];
                if (creationDate is string)
                {
                    if (!String.IsNullOrEmpty((string)creationDate))
                    {
                        if (String.CompareOrdinal(theFile.FileInformation.CreationTime.ToString("yyyy-MM-dd hh:mm:ss"), (string)creationDate) < 0)
                        {
                            previousFile.Item.Tags[rootFolderHandlerBase.Importer.CreationDateTagName] = theFile.FileInformation.CreationTime.ToString("yyyy-MM-dd hh:mm:ss");
                        }
                    }
                }
            }

            if (rootFolderHandlerBase.Importer.LastAccessDate)
            {

                object lastAccessDate = previousFile.Item.Tags[rootFolderHandlerBase.Importer.LastAccessDateTagName];

                if (lastAccessDate is string)
                {
                    if (!String.IsNullOrEmpty((string)lastAccessDate))
                    {
                        if (String.CompareOrdinal(theFile.FileInformation.LastAccessTime.ToString("yyyy-MM-dd hh:mm:ss"), (string)lastAccessDate) > 0)
                        {
                            previousFile.Item.Tags[rootFolderHandlerBase.Importer.LastAccessDateTagName] = theFile.FileInformation.LastAccessTime.ToString("yyyy-MM-dd hh:mm:ss");
                        }
                    }
                }
            }

            if (!rootFolderHandlerBase
                .Importer.LastModificationDate)
                return;

            object lastModificationDate
                = previousFile.Item.Tags
                [rootFolderHandlerBase
                .Importer.LastModificationDateTagName];

            var modificationDate = lastModificationDate as string;

            if (modificationDate == null)
                return;

            if (String.IsNullOrEmpty
                (modificationDate))
                return;

            if (String.CompareOrdinal
                (theFile.FileInformation
                    .LastWriteTime.ToString
                    ("yyyy-MM-dd hh:mm:ss"),
                    modificationDate) <= 0)
                return;

            previousFile.Item.Tags
                [rootFolderHandlerBase
                .Importer.LastModificationDateTagName]
                = theFile.FileInformation
                .LastWriteTime.ToString
                ("yyyy-MM-dd hh:mm:ss");
        }