Basic Zip Archive Filter



It doesn't do much, but I've felt that we should at least index the
files stored in an archive for the longest time, so I'm starting that
project. I'll add the tar/gzip variants later tonight.

This indexes the names of all the files in an archive, as well as the
metadata dc:numFiles

I'm looking for feedback, so be brutal ;)

Cheers,
Kevin Kubasik
//
// FilterZip.cs: Very simplistic Zip filter, just gets names of all files in archive
//
// Author:
//   Kevin Kubasik <kevin kubasik net>
//

using System;
using System.IO;
using System.Diagnostics;

using Beagle.Util;
using Beagle.Daemon;
namespace Beagle.Filters {

	public class FilterZip : Beagle.Daemon.Filter {
		StreamReader reader= null;
		public FilterZip(){
			AddSupportedFlavor (FilterFlavor.NewFromMimeType ("application/zip"));
			AddSupportedFlavor (FilterFlavor.NewFromExtension (".zip"));
			SnippetMode = true;
		}
		
		override protected void DoPull (){
			Process pc = new Process ();
			pc.StartInfo.FileName = "zipinfo";
			// FIXME: We probably need to quote special chars in the path
			pc.StartInfo.Arguments = String.Format ("-2 " + FileInfo.FullName);
			pc.StartInfo.RedirectStandardInput = false;
			pc.StartInfo.RedirectStandardOutput = true;
			pc.StartInfo.UseShellExecute = false;
			try {
				pc.Start ();
			} catch (System.ComponentModel.Win32Exception) {
				Logger.Log.Warn ("Unable to find zipinfo in path; ZIP archive not indexed.");
				Finished ();
				return;
			}

			// Try to not kill CPU
			pc.PriorityClass = ProcessPriorityClass.Idle;

			StreamReader pout = pc.StandardOutput;			
			string str;
			while ((str = pout.ReadLine()) != null) {
				AppendText (str);
				AppendStructuralBreak ();
			}
			pout.Close ();
			pc.WaitForExit ();
			pc.Close ();
			Finished ();
		}
		
		override protected void DoPullProperties (){
			Process pc = new Process ();
			pc.StartInfo.FileName = "zipinfo";
			// FIXME: We probably need to quote special chars in the path
			pc.StartInfo.Arguments = String.Format ("-h " + FileInfo.FullName);
			pc.StartInfo.RedirectStandardInput = false;
			pc.StartInfo.RedirectStandardOutput = true;
			pc.StartInfo.UseShellExecute = false;
			try {
				pc.Start ();
			} catch (System.ComponentModel.Win32Exception) {
				Logger.Log.Warn ("Unable to find zipinfo in path; ZIP archive not indexed.");
				Finished ();
				return;
			}

			// Try to not kill CPU
			StreamReader pout = pc.StandardOutput;
			string str = null;
			string[] tokens = null;
			str = pout.ReadLine();
			tokens = str.Split (' ');
			AddProperty (Beagle.Property.NewKeyword ("dc:numFiles",tokens[tokens.Length-2]));
						
			pout.Close ();
			pc.WaitForExit ();
			pc.Close ();
			
		}
	
	}
	
}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]