Logo Search packages:      
Sourcecode: f-spot version File versions

DCRawFile.cs

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

namespace FSpot {
      public class Pipe : System.IO.Stream {
            // This class is a hack to make sure mono doesn't dispose the process
            // and by extension the stream from the pipe when we are still using the
            // the stream.
            Process process;
            Stream stream;

            public override bool CanRead {
                  get { return stream.CanRead; }
            }

            public override bool CanSeek {
                  get { return stream.CanSeek; }
            }

            public override bool CanWrite {
                  get { return stream.CanWrite; }
            }
            
            public override long Length {
                  get { return stream.Length; }
            }

            public override long Position {
                  get { return stream.Position; }
                  set { stream.Position = value; }
            }

            public Pipe (Process p, Stream stream)
            {
                  this.process = p;
                  this.stream = stream;
            }
            
            public override void Flush ()
            {
                  stream.Flush ();
            }

            public override int Read (byte [] b, int s, int l)
            {
                  return stream.Read (b, s, l);
            }

            public override long Seek (long l, SeekOrigin origin)
            {
                  return stream.Seek(l, origin);
            }
            
            public override void SetLength (long l)
            {
                  stream.SetLength (l);
            }

            public override void Write (byte [] b, int s, int l)
            {
                  stream.Write (b, s, l);
            }
            
            public override void Close ()
            {
                  stream.Close ();
                  stream = null;
                  process.Dispose ();
                  process = null;
            }
      }

      public class DCRawFile : ImageFile {
            const string dcraw_command = "dcraw";

            public DCRawFile (string path) : base (path)
            {
            }

            public DCRawFile (Uri uri) : base (uri)
            {
            }

            public override System.IO.Stream PixbufStream ()
            {
                  return RawPixbufStream (uri);
            }

            internal static System.IO.Stream RawPixbufStream (Uri location)
            {
                  string path = location.LocalPath;
                  string [] args = new string [] { dcraw_command, "-h", "-w", "-c", "-t", "0", path };
                  
                  InternalProcess proc = new InternalProcess (System.IO.Path.GetDirectoryName (path), args);
                  proc.StandardInput.Close ();
                  return proc.StandardOutput;
            }
            
            public static System.IO.Stream RawPixbufStreamOld (string path)
            {
                  // FIXME this filename quoting is super lame
                  string args = System.String.Format ("-h -w -c -t 0 \"{0}\"", path);

                  System.Diagnostics.Process process = new System.Diagnostics.Process ();
                  process.StartInfo = new System.Diagnostics.ProcessStartInfo (dcraw_command, args);
                  process.StartInfo.RedirectStandardOutput = true;
                  process.StartInfo.UseShellExecute = false;
                  process.Start ();
                  return new Pipe (process, process.StandardOutput.BaseStream);
            }
            
            public static Gdk.Pixbuf Load (string path, string args)
            {
                  // FIXME this filename quoting is super lame
                  args = System.String.Format ("-h -w -c \"{0}\"", path);

                  System.Console.WriteLine ("path = {0}, args = \"{1}\"", path, args);
                   
                  using (System.Diagnostics.Process process = new System.Diagnostics.Process ()) {
                        process.StartInfo = new System.Diagnostics.ProcessStartInfo (dcraw_command, args);
                        process.StartInfo.RedirectStandardOutput = true;
                        process.StartInfo.UseShellExecute = false;
                        process.Start ();
                        return PixbufUtils.LoadFromStream (process.StandardOutput.BaseStream);
                  }
            }
      }
}

Generated by  Doxygen 1.6.0   Back to index