[xbuild] Implement FileLogger . Fix #676650 .
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / FileLogger.cs
index 865a2b52ec821e17ca0c500224db3974c638f6f9..d816b66a370701ac500b716591f29ae72327490e 100644 (file)
@@ -3,8 +3,10 @@
 //
 // Author:
 //   Marek Sieradzki (marek.sieradzki@gmail.com)
+//   Ankit Jain (jankit@novell.com)
 // 
 // (C) 2005 Marek Sieradzki
+// Copyright 2011 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 
 #if NET_2_0
 
+using System;
+using System.IO;
+using System.Text;
 using Microsoft.Build.Framework;
 
 namespace Microsoft.Build.BuildEngine {
        public class FileLogger : ConsoleLogger {
+               StreamWriter sw;
+               string logfile;
+               string encoding = null;
+               IEventSource eventSource;
+
                public FileLogger ()
                {
+                       base.Verbosity = LoggerVerbosity.Detailed;
                }
 
-               // FIXME: add our handlers to the events
                public override void Initialize (IEventSource eventSource)
                {
+                       this.eventSource = eventSource;
+                       logfile = "msbuild.log";
+
+                       bool append = false;
+                       string key, value;
+                       string[] splittedParameters = Parameters.Split (new char [] {';'}, StringSplitOptions.RemoveEmptyEntries);
+                       foreach (string s in splittedParameters) {
+                               if (String.Compare (s, "Append") == 0) {
+                                       append = true;
+                                       continue;
+                               }
+
+                               if (s.StartsWith ("Encoding")) {
+                                       if (!TrySplitKeyValuePair (s, out key, out value))
+                                               throw new LoggerException ("Encoding should be specified as: Encoding=<encoding>, eg. Encoding=UTF-8");
+
+                                       if (String.IsNullOrEmpty (value))
+                                               throw new LoggerException ("Encoding must be non-empty");
+
+                                       encoding = value;
+                                       continue;
+                               }
+
+                               if (s.StartsWith ("LogFile")) {
+                                       if (!TrySplitKeyValuePair (s, out key, out value))
+                                               throw new LoggerException ("LogFile should be specified as: LogFile=<encoding>, eg. LogFile=foo.log");
+
+                                       if (String.IsNullOrEmpty (value))
+                                               throw new LoggerException ("LogFile value must be non-empty");
+
+                                       logfile = value;
+                                       continue;
+                               }
+                       }
+
+                       // Attach *our* HandleBuildStarted as the first one,
+                       // as it needs to create the writer!
+                       eventSource.BuildStarted += HandleBuildStarted;
+                       base.Initialize (eventSource);
+                       // Attach *our* HandleBuildFinished as the last one,
+                       // as it needs to close the writer!
+                       eventSource.BuildFinished += HandleBuildFinished;
+
+                       CreateWriter (append);
+               }
+
+               void CreateWriter (bool append_to)
+               {
+                       if (sw != null)
+                               return;
+
+                       if (!String.IsNullOrEmpty (encoding))
+                               sw = new StreamWriter (logfile, append_to, Encoding.GetEncoding (encoding));
+                       else
+                               sw = new StreamWriter (logfile, append_to, Encoding.Default);
+                       WriteHandler = sw.WriteLine;
+               }
+
+               void HandleBuildStarted (object sender, BuildStartedEventArgs args)
+               {
+                       CreateWriter (true);
+               }
+
+               void HandleBuildFinished (object sender, BuildFinishedEventArgs args)
+               {
+                       base.WriteHandler = null;
+                       if (sw != null) {
+                               sw.Close ();
+                               sw = null;
+                       }
+               }
+
+               bool TrySplitKeyValuePair (string pair, out string key, out string value)
+               {
+                       key = value = null;
+                       string[] parts = pair.Split ('=');
+                       if (parts.Length != 2)
+                               return false;
+
+                       key = parts [0];
+                       value = parts [1];
+                       return true;
                }
 
                public override void Shutdown ()
                {
+                       base.WriteHandler = null;
+                       if (sw != null) {
+                               sw.Close ();
+                               sw = null;
+                       }
+
+                       if (eventSource != null) {
+                               eventSource.BuildStarted -= HandleBuildStarted;
+                               eventSource.BuildFinished -= HandleBuildFinished;
+                       }
+
+                       base.Shutdown ();
                }
        }
 }
 
-#endif
\ No newline at end of file
+#endif