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

333 lines
9.3 KiB
C#

//
// soapsuds.cs
//
// Author:
// Lluis Sanchez Gual (lluis@ximian.com)
//
// Copyright (C) 2003 Ximian, Inc.
//
using System;
using System.Reflection;
using System.Collections;
using System.Runtime.Remoting.MetadataServices;
using System.Net;
using System.IO;
public class Driver
{
static void Main (string[] args)
{
Runner run = new Runner (args);
AppDomain domain = AppDomain.CreateDomain ("runner", null, Directory.GetCurrentDirectory(), "", false);
domain.DoCallBack (new CrossAppDomainDelegate (run.Main));
}
}
[Serializable]
class Runner
{
static bool logo = true;
static string inputUrl = null;
static string inputTypes = null;
static string inputSchema = null;
static string inputAssembly = null;
static string inputDirectory = null;
static string serviceEndpoint = null;
static string outputSchema = null;
static string outputDirectory = null;
static string outputAssembly = null;
static bool outputCode = false;
static bool wrappedProxy = true;
static string proxyNamespace = null;
static string strongNameFile = null;
static string userName = null;
static string password = null;
static string domain = null;
static string httpProxyName = null;
static string httpProxyPort = null;
string[] args;
public Runner (string[] args)
{
this.args = args;
}
public void Main ()
{
try
{
ReadParameters (args);
if (logo)
WriteLogo ();
if (args.Length == 0 || args[0] == "--help")
{
WriteHelp ();
return;
}
ArrayList types = new ArrayList ();
Assembly assembly = null;
if (inputAssembly != null)
{
assembly = Assembly.LoadFile (inputAssembly);
foreach (Type t in assembly.GetTypes ())
types.Add (new ServiceType (t, serviceEndpoint));
}
if (inputTypes != null)
{
string[] ts = inputTypes.Split (';');
foreach (string type in ts)
{
Type t = null;
string url = null;
string[] typeParts = type.Split (',');
if (typeParts.Length == 1)
throw new Exception ("Type assembly not specified");
if (typeParts.Length >= 2)
{
t = Type.GetType (typeParts[0] + ", " + typeParts [1]);
if (typeParts.Length > 2)
url = typeParts [2];
}
types.Add (new ServiceType (t, url));
}
}
ArrayList writtenFiles = new ArrayList ();
MemoryStream schemaStream = null;
if (types.Count > 0)
{
schemaStream = new MemoryStream ();
MetaData.ConvertTypesToSchemaToStream ((ServiceType[]) types.ToArray (typeof(ServiceType)), SdlType.Wsdl, schemaStream);
}
if (inputUrl != null)
{
if (schemaStream != null) throw new Exception ("Only one type source can be specified");
schemaStream = new MemoryStream ();
MetaData.RetrieveSchemaFromUrlToStream (inputUrl, schemaStream);
}
if (inputSchema != null)
{
if (schemaStream != null) throw new Exception ("Only one type source can be specified");
schemaStream = new MemoryStream ();
FileStream fs = new FileStream (inputSchema, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte [1024*5];
int nr = 0;
while ((nr = fs.Read (buffer, 0, buffer.Length)) > 0)
schemaStream.Write (buffer, 0, nr);
}
if (outputSchema != null)
{
if (schemaStream == null) throw new Exception ("No input schema or assembly has been specified");
schemaStream.Position = 0;
MetaData.SaveStreamToFile (schemaStream, outputSchema);
Console.WriteLine ("Written file " + outputSchema);
}
if (outputCode)
{
if (schemaStream == null) throw new Exception ("No input schema or assembly has been specified");
schemaStream.Position = 0;
MetaData.ConvertSchemaStreamToCodeSourceStream (wrappedProxy, outputDirectory, schemaStream, writtenFiles, null, null);
}
if (outputAssembly != null)
{
if (schemaStream == null) throw new Exception ("No input schema or assembly has been specified");
schemaStream.Position = 0;
if (outputCode)
MetaData.ConvertCodeSourceStreamToAssemblyFile (writtenFiles, outputAssembly, strongNameFile);
else
{
MetaData.ConvertSchemaStreamToCodeSourceStream (wrappedProxy, outputDirectory, schemaStream, writtenFiles, null, null);
MetaData.ConvertCodeSourceStreamToAssemblyFile (writtenFiles, outputAssembly, strongNameFile);
foreach (string file in writtenFiles)
File.Delete (file);
writtenFiles.Clear ();
}
writtenFiles.Add (outputAssembly);
}
foreach (string fn in writtenFiles)
Console.WriteLine ("Written file " + fn);
}
catch (Exception ex)
{
Console.WriteLine ("ERROR: " + ex.Message);
if (ex.GetType() != typeof(Exception))
Console.WriteLine (ex);
}
Console.WriteLine ();
}
static void WriteLogo ()
{
Console.WriteLine ("Mono SOAPSUDS Tool");
Console.WriteLine ();
}
static void WriteHelp ()
{
Console.WriteLine ("Usage: soapsuds [inputs] [outputs] [options]");
Console.WriteLine ();
Console.WriteLine ("Inputs:");
Console.WriteLine (" -url urltoschema:url Url from which to retrieve the schema");
Console.WriteLine (" -types:type1,assembly[,serviceEndpoint][;type2,assembly,...] ");
Console.WriteLine (" List of types from which to generate");
Console.WriteLine (" a schema or proxy");
Console.WriteLine (" -ia -inputassemblyfile:assembly Assembly that contains the types to export");
Console.WriteLine (" -is -inputschemafile:schemafile Schema from which to generate proxy classes");
Console.WriteLine ();
Console.WriteLine ("Input Options:");
Console.WriteLine (" -id -inputdirectory:directory Directory where DLLs are located");
Console.WriteLine (" -se -serviceendpoint:url Url of the service to be placed in the");
Console.WriteLine (" WSDL document");
Console.WriteLine ();
Console.WriteLine ("Outputs:");
Console.WriteLine (" -oa -outputassemblyfile:assembly Generate an assembly");
Console.WriteLine (" -os -outputschemafile:file Generate a schema");
Console.WriteLine (" -gc -generatecode Generate proxy source code");
Console.WriteLine ();
Console.WriteLine ("Output Options:");
Console.WriteLine (" -od -outputdirectory:directory Directory where output will be generated");
Console.WriteLine (" -pn -proxynamespace:namespace Namespace of the generated proxy");
Console.WriteLine (" -nowp -nowrappedproxy Generate a wrapped proxy");
Console.WriteLine (" -wp -wrappedproxy Generate a wrapped proxy");
Console.WriteLine (" -sn -strongnamefile:snfile Strong name file");
Console.WriteLine ();
Console.WriteLine ("General Options:");
Console.WriteLine (" -u -username:name User name for server authentication");
Console.WriteLine (" -p -password:pwd Password for server authentication");
Console.WriteLine (" -d -domain:domain Domain of the server");
Console.WriteLine (" -hpn -httpProxyName:name Name of http proxy");
Console.WriteLine (" -hpp -httpProxyPort:port Port of http proxy");
Console.WriteLine (" -nologo Supress the startup logo");
Console.WriteLine ();
}
static void ReadParameters (string[] args)
{
NetworkCredential cred = new NetworkCredential ();
NetworkCredential proxyCred = new NetworkCredential ();
WebProxy proxy = new WebProxy ();
foreach (string arg in args)
{
if (!arg.StartsWith ("/") && !arg.StartsWith ("-"))
continue;
string parg = arg.Substring (1);
int i = parg.IndexOf (":");
string param = null;
if (i != -1) {
param = parg.Substring (i+1);
parg = parg.Substring (0,i);
}
switch (parg.ToLower ())
{
case "nologo":
logo = false;
break;
case "urltoschema": case "url":
inputUrl = param;
break;
case "types":
inputTypes = param;
break;
case "inputassemblyfile": case "ia":
inputAssembly = param;
break;
case "outputassemblyfile": case "oa":
outputAssembly = param;
break;
case "inputdirectory": case "id":
inputDirectory = param;
break;
case "outputdirectory": case "od":
outputDirectory = param;
break;
case "inputschemafile": case "is":
inputSchema = param;
break;
case "outputschemafile": case "os":
outputSchema = param;
break;
case "proxynamespace": case "pn":
proxyNamespace = param;
break;
case "serviceendpoint": case "se":
serviceEndpoint = param;
break;
case "strongnamefile": case "sn":
strongNameFile = param;
break;
case "nowrappedproxy": case "nowp":
wrappedProxy = false;
break;
case "wrappedproxy": case "wp":
wrappedProxy = true;
break;
case "generatecode": case "gc":
outputCode = true;
break;
case "username": case "u":
userName = param;
break;
case "password": case "p":
password = param;
break;
case "domain": case "d":
domain = param;
break;
case "httpProxyName": case "hpn":
httpProxyName = param;
break;
case "httpProxyPort": case "hpp":
httpProxyPort = param;
break;
}
}
}
}