예제 #1
0
파일: ItemInfo.cs 프로젝트: balihb/basenji
            public static void GetFSItemProperties(FileSystemVolumeItem item,
                                                   out ItemProperty[] properties,
                                                   out Dictionary <string, string> nameProperty)
            {
                List <ItemProperty> tmp;

                GetCommonItemProperties(item, out tmp, out nameProperty);

                tmp.Add(new ItemProperty(S._("Location"), item.Location, 202));
                if (item.LastWriteTime.Ticks > 0L)
                {
                    tmp.Add(new ItemProperty(S._("Last write time"), item.LastWriteTime.ToString(), 205));
                }

                if (item.IsSymLink)
                {
                    FileSystemVolumeItem targetItem = item.GetSymLinkTargetItem();
                    string symlinkTargetPath        = null;

                    if (targetItem.Location != "/" && targetItem.Name != "/")
                    {
                        symlinkTargetPath = string.Format("{0}/{1}", targetItem.Location, targetItem.Name);
                    }
                    else
                    {
                        symlinkTargetPath = targetItem.Location + targetItem.Name;
                    }

                    tmp.Add(new ItemProperty(S._("Symlink target"), symlinkTargetPath, 203));
                }

                if (item is FileVolumeItem)
                {
                    FileVolumeItem fvi     = (FileVolumeItem)item;
                    string         sizeStr = Util.GetSizeStr(fvi.Size);
                    string         hash    = fvi.Hash;

                    tmp.Add(new ItemProperty(S._("Size"), sizeStr, 204));
                    if (!string.IsNullOrEmpty(hash))
                    {
                        tmp.Add(new ItemProperty(S._("Hash"), hash, 207));
                    }
                }

                if (!string.IsNullOrEmpty(item.MimeType))
                {
                    tmp.Add(new ItemProperty(S._("Filetype"), item.MimeType, 206));
                }

                tmp.Sort();                 // sort by priority
                properties = tmp.ToArray();
            }
예제 #2
0
        protected override void LoadFromObject(VolumeDB.VolumeItem item)
        {
            if (!(item is FileSystemVolumeItem))
            {
                throw new ArgumentException(string.Format("must be of type {0}",
                                                          typeof(FileSystemVolumeItem)), "item");
            }

            base.LoadFromObject(item);

            FileSystemVolumeItem fsvi = (FileSystemVolumeItem)item;

            UpdateLabel(lblLocation, fsvi.Location);
            UpdateLabel(lblLastWriteTime, fsvi.LastWriteTime.ToString());
            UpdateLabel(lblMimeType, string.IsNullOrEmpty(fsvi.MimeType) ? "-" : fsvi.MimeType);
        }
예제 #3
0
            public void InsertSymLinkItems(BufferedVolumeItemWriter writer, long volumeID)
            {
                if (symLinkItems.Count == 0)
                {
                    return;
                }

                /* if scanner has no db associated, just update the counters
                 * and return */
                if (!scanner.HasDB)
                {
                    foreach (SymLinkItem sli in symLinkItems)
                    {
                        if (sli.isDir)
                        {
                            Interlocked.Increment(ref scanner.VolumeInfo.directories);
                        }
                        else
                        {
                            Interlocked.Increment(ref scanner.VolumeInfo.files);
                        }

                        // TODO :
                        // increase totalsize by size of symlinks too? (not size of target!)
                        // or are symlinks as big as dirs, those aren't respected as well..
                        //Interlocked.Add(ref VolumeInfo.size, sli.size);
                    }
                    return;
                }

                // make sure all files/dirs have been written to the database
                // before searching for symlink targets.
                writer.Flush();

                foreach (SymLinkItem sli in symLinkItems)
                {
                    scanner.CheckForCancellationRequest();

                    long itemID;
                    if (!files.TryGetValue(sli.fullTargetPath, out itemID))
                    {
                        /* may throw ScanCancelledException */
                        scanner.SendScannerWarning(string.Format(S._("Failed to resolve target item for symlink '{0}'."),
                                                                 sli.fullPath));
                    }
                    else
                    {
                        SearchCriteriaGroup g = new SearchCriteriaGroup(MatchRule.AllMustMatch);
                        g.AddSearchCriteria(new IDSearchCriteria(volumeID, IDSearchField.VolumeID, CompareOperator.Equal));
                        g.AddSearchCriteria(new IDSearchCriteria(itemID, IDSearchField.ItemID, CompareOperator.Equal));

                        // query target item.
                        // async BeginItemSearch() won't work here
                        // (active transaction prevents other threads from accessing the database)
                        VolumeItem[] queriedItems = scanner.Database.SearchItem(g);

                        FileSystemVolumeItem targetItem = (FileSystemVolumeItem)queriedItems[0];
                        FileSystemVolumeItem newItem;

                        if (targetItem is FileVolumeItem)
                        {
                            newItem = scanner.GetNewVolumeItem <FileVolumeItem>(sli.parentID,
                                                                                sli.name,
                                                                                targetItem.MimeType,
                                                                                targetItem.MetaData,
                                                                                VolumeItemType.FileVolumeItem);

                            ((FileVolumeItem)newItem).SetFileVolumeItemFields(((FileVolumeItem)targetItem).Size,
                                                                              ((FileVolumeItem)targetItem).Hash);

                            Interlocked.Increment(ref scanner.VolumeInfo.files);
                        }
                        else                             // DirectoryVolumeItem
                        {
                            newItem = scanner.GetNewVolumeItem <DirectoryVolumeItem>(sli.parentID,
                                                                                     sli.name,
                                                                                     targetItem.MimeType,
                                                                                     targetItem.MetaData,
                                                                                     VolumeItemType.DirectoryVolumeItem);

                            Interlocked.Increment(ref scanner.VolumeInfo.directories);
                        }

                        newItem.SetFileSystemVolumeItemFields(sli.location,
                                                              targetItem.LastWriteTime,
                                                              targetItem.ItemID);

                        writer.Write(newItem);

                        // TODO :
                        // increase totalsize by size of symlinks too? (not size of target!)
                        // or are symlinks as big as dirs, those aren't respected as well..
                        //Interlocked.Add(ref VolumeInfo.size, sli.size);
                        if (Global.EnableDebugging)
                        {
                            Debug.WriteLine("Successfully resolved and saved symlink item: {0}/{1} -> {2}/{3}",
                                            (sli.location == PATH_SEPARATOR.ToString() ? "" : sli.location),
                                            sli.name,
                                            (targetItem.Location == PATH_SEPARATOR.ToString() ? "" : targetItem.Location),
                                            (targetItem.Name == PATH_SEPARATOR.ToString() ? "" : targetItem.Name));
                        }
                    }             // end if
                }                 // end foreach
            }