Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

188 lines
4.6 KiB
C#

//
// BrowserCapsUpdater.cs: updates $prefix/etc/mono/browscap.ini file.
//
// Authors:
// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) 2003 Novell, Inc (http://www.novell.com)
//
using System;
using System.IO;
using System.Net;
using System.Reflection;
using System.Text;
namespace Mono.ASPNET
{
class Driver
{
static string GetFilePath ()
{
Type type = typeof (Environment);
MethodInfo method = type.GetMethod ("GetMachineConfigPath", BindingFlags.Static |
BindingFlags.NonPublic);
if (method == null) {
Console.WriteLine ("You need to run this under Mono runtime");
return null;
}
string path = (string) method.Invoke (null, null);
return Path.Combine (Path.GetDirectoryName (path), "browscap.ini");
}
static int Main (string [] args)
{
string path = GetFilePath ();
if (path == null)
return 1;
Updater updater = new Updater (path);
if (File.Exists (path)) {
bool uptodate;
Console.WriteLine (updater.GetLocalMessage (out uptodate));
if (uptodate)
return 0;
Console.WriteLine ("WARNING: your site may be blocked from updating if you abuse.");
Console.WriteLine ("You're encouraged to browse and understand " +
"http://browsers.GaryKeith.com/");
string r = "NO";
while (r != "YES") {
Console.Write ("Do you want to update your file now? (yes/NO) ");
r = Console.ReadLine ();
if (r == null)
r = "NO";
else
r = r.ToUpper ();
if (r == "NO")
return 0;
}
}
try {
updater.Update ();
Console.WriteLine ("browscap.ini file provided by Gary J. Keith.");
} catch (Exception e) {
Console.Error.WriteLine ("Update failed.");
Console.Error.WriteLine ("Reason: {0}", e.Message);
return 1;
}
return 0;
}
}
class Updater
{
static string VersionUrl = "http://browsers.garykeith.com/version-number.asp";
static string BrowscapUrl = "http://browsers.garykeith.com/stream.asp?BrowsCapINI";
static string UserAgent = "Mono Browser Capabilities Updater 0.1";
string filename;
string tempfile;
string local;
int nupdates;
string date;
public Updater (string filename)
{
this.filename = filename;
}
public string GetLocalMessage (out bool upToDate)
{
StringBuilder sb = new StringBuilder ();
string localdate = null;
string remotedate = null;
using (StreamReader reader = new StreamReader (File.OpenRead (filename))) {
string str;
while ((str = reader.ReadLine ()) != null) {
if (str.StartsWith ("version="))
break;
}
if (str != null) {
localdate = str.Substring (8);
sb.AppendFormat ("Your file is dated {0}\r\n", localdate);
} else {
sb.AppendFormat ("Couldn't retrieve date from {0}\r\n", filename);
}
}
remotedate = GetRemoteDate ();
remotedate = remotedate.Replace ("AM ", "");
remotedate = remotedate.Replace ("PM ", "");
remotedate = remotedate.Replace ("/", "-");
sb.AppendFormat ("Remote file is dated {0}", remotedate);
upToDate = (remotedate == localdate);
if (upToDate)
sb.Append ("\r\nThe file IS up to date.");
return sb.ToString ();
}
static string GetRemoteDate ()
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create (VersionUrl);
request.UserAgent = UserAgent;
WebResponse resp = request.GetResponse ();
string str = new StreamReader (resp.GetResponseStream ()).ReadLine ();
resp.Close ();
return str;
}
public void Update ()
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create (BrowscapUrl);
request.UserAgent = UserAgent;
StreamWriter writer = null;
StreamReader reader = null;
Console.Write ("Connecting...");
WebResponse resp = request.GetResponse ();
string tmppath = null;
try {
tmppath = Path.GetTempFileName ();
reader = new StreamReader (resp.GetResponseStream ());
Console.WriteLine (" done");
writer = new StreamWriter (File.OpenWrite (tmppath));
Console.WriteLine ("Downloading data to {0}", tmppath);
string str;
while ((str = reader.ReadLine ()) != null) {
writer.WriteLine (str);
}
writer.Close ();
writer = null;
reader.Close ();
reader = null;
Console.WriteLine ("Removing old {0}", filename);
File.Delete (filename);
Console.WriteLine ("Copying {0} to {1}", tmppath, filename);
File.Copy (tmppath, filename);
} finally {
try {
File.Delete (tmppath);
} catch {}
if (writer != null) {
try {
writer.Close ();
} catch {}
}
if (reader != null) {
try {
reader.Close ();
} catch {}
}
}
}
}
}