1
// created on 10/11/2002 at 2:08 PM
4
using System.Collections;
7
using System.Runtime.InteropServices;
8
using System.Diagnostics;
11
using System.Web.Services.Description;
13
using System.CodeDom.Compiler;
14
using System.Reflection;
16
using MonoDevelop.Internal.Project;
17
using MonoDevelop.Core.Services;
19
namespace MonoDevelop.Gui.Dialogs
22
/// Summary description for WebReference.
24
public class WebReference
27
/// <summary>Creates a ServiceDescription object from a valid URI</summary>
29
public static ServiceDescription ReadServiceDescription(string uri) {
30
ServiceDescription desc = null;
33
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
34
WebResponse response = request.GetResponse();
36
desc = ServiceDescription.Read(response.GetResponseStream());
38
desc.RetrievalUrl = uri;
40
// possibly error reading WSDL?
43
if(desc.Services.Count == 0)
50
/// <summary>Generates a valid directory from a URI</summary>
52
public static string GetDirectoryFromUri(string uri) {
53
// TODO: construct the namespace using th URL in the WSDL
55
if(uri.IndexOf("://") > -1) {
56
tmp = uri.Substring(uri.IndexOf("://") + 3);
58
tmp = tmp.Substring(0, tmp.LastIndexOf("/"));
59
string[] dirs = tmp.Split(new Char[] {'/'});
61
StringBuilder savedir = new StringBuilder();
62
savedir.Append(dirs[0]);
64
return savedir.ToString();
68
/// <summary>Generates a valid Namespace from a URI</summary>
70
public static string GetNamespaceFromUri(string uri) {
71
// TODO: construct the namespace using th URL in the WSDL
73
if(uri.IndexOf("://") > -1) {
74
tmp = uri.Substring(uri.IndexOf("://") + 3);
76
tmp = tmp.Substring(0, tmp.LastIndexOf("/"));
77
string[] dirs = tmp.Split(new Char[] {'/'});
83
public static ProjectReference GenerateWebProxyDLL(IProject project, ServiceDescription desc) {
84
ProjectReference refInfo = null;
86
string serviceName = String.Empty;
87
if(desc.Services.Count > 0) {
88
serviceName = desc.Services[0].Name;
90
serviceName = "UnknownService";
93
string nmspace = GetNamespaceFromUri(desc.RetrievalUrl);
95
StringBuilder savedir = new StringBuilder();
96
savedir.Append(project.BaseDirectory);
97
savedir.Append(Path.DirectorySeparatorChar);
98
savedir.Append("WebReferences");
99
// second, create the path if it doesn't exist
101
if(!Directory.Exists(savedir.ToString()))
103
di = Directory.CreateDirectory(savedir.ToString());
106
// generate the assembly
107
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
108
importer.AddServiceDescription(desc, null, null);
110
CodeNamespace codeNamespace = new CodeNamespace(nmspace);
111
CodeCompileUnit codeUnit = new CodeCompileUnit();
112
codeUnit.Namespaces.Add(codeNamespace);
113
ServiceDescriptionImportWarnings warnings = importer.Import(codeNamespace, codeUnit);
115
CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
116
System.CodeDom.Compiler.ICodeCompiler compiler;
119
if(provider != null) {
120
compiler = provider.CreateCompiler();
121
CompilerParameters parms = new CompilerParameters();
122
parms.ReferencedAssemblies.Add("System.Dll");
123
parms.ReferencedAssemblies.Add("System.Xml.Dll");
124
parms.ReferencedAssemblies.Add("System.Web.Services.Dll");
125
parms.OutputAssembly = project.BaseDirectory + Path.DirectorySeparatorChar + "WebReferences" + Path.DirectorySeparatorChar + nmspace + ".Reference.Dll";
126
CompilerResults results = compiler.CompileAssemblyFromDom(parms, codeUnit);
127
Assembly assembly = results.CompiledAssembly;
129
if(assembly != null) {
130
refInfo = new ProjectReference();
131
refInfo.ReferenceType = ReferenceType.Assembly;
132
refInfo.Reference = parms.OutputAssembly;
140
/// <summary>Generates a Web Service proxy DLL from a URI</summary>
142
public static ProjectReference GenerateWebProxyDLL(IProject project, string url) {
144
ServiceDescription desc = ReadServiceDescription(url);
145
return GenerateWebProxyDLL(project, desc);
149
public static ArrayList GenerateWebProxyCode(IProject project, ServiceDescription desc) {
150
ArrayList fileList = null;
152
string serviceName = String.Empty;
153
if(desc.Services.Count > 0) {
154
serviceName = desc.Services[0].Name;
156
serviceName = "UnknownService";
159
string webRefFolder = "Web References";
160
string nmspace = GetNamespaceFromUri(desc.RetrievalUrl);
162
StringBuilder savedir = new StringBuilder();
163
savedir.Append(project.BaseDirectory);
164
savedir.Append(Path.DirectorySeparatorChar);
165
savedir.Append(webRefFolder);
166
savedir.Append(Path.DirectorySeparatorChar);
167
savedir.Append(GetDirectoryFromUri(desc.RetrievalUrl) + Path.DirectorySeparatorChar + serviceName);
169
// second, create the path if it doesn't exist
171
if(!Directory.Exists(savedir.ToString()))
173
di = Directory.CreateDirectory(savedir.ToString());
176
// generate the assembly
177
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
178
importer.AddServiceDescription(desc, null, null);
180
CodeNamespace codeNamespace = new CodeNamespace(nmspace);
181
CodeCompileUnit codeUnit = new CodeCompileUnit();
182
codeUnit.Namespaces.Add(codeNamespace);
183
ServiceDescriptionImportWarnings warnings = importer.Import(codeNamespace, codeUnit);
185
CodeDomProvider provider;
186
System.CodeDom.Compiler.ICodeGenerator generator;
188
String ext = String.Empty;
189
switch(project.ProjectType) {
191
provider = new Microsoft.CSharp.CSharpCodeProvider();
195
provider = new Microsoft.VisualBasic.VBCodeProvider();
200
// project type not supported error
205
string filename = savedir.ToString() + Path.DirectorySeparatorChar + serviceName + "WebProxy." + ext;
206
string wsdlfilename = savedir.ToString() + Path.DirectorySeparatorChar + serviceName + ".wsdl";
208
if(provider != null) {
209
StreamWriter sw = new StreamWriter(filename);
211
generator = provider.CreateGenerator();
212
CodeGeneratorOptions options = new CodeGeneratorOptions();
213
options.BracingStyle = "C";
214
generator.GenerateCodeFromCompileUnit(codeUnit, sw, options);
217
if(File.Exists(filename))
219
fileList = new ArrayList();
221
// add project files to the list
222
ProjectFile pfile = new ProjectFile();
224
pfile.Name = project.BaseDirectory + Path.DirectorySeparatorChar + webRefFolder;
225
pfile.BuildAction = BuildAction.Nothing;
226
pfile.Subtype = Subtype.WebReferences;
227
pfile.DependsOn = String.Empty;
228
pfile.Data = String.Empty;
232
pfile = new ProjectFile();
233
pfile.Name = project.BaseDirectory + @"\Web References\" + nmspace;
234
pfile.BuildAction = BuildAction.Nothing;
235
pfile.Subtype = Subtype.Directory;
236
pfile.DependsOn = project.BaseDirectory + @"\Web References\";
237
pfile.WebReferenceUrl = String.Empty;
241
pfile = new ProjectFile();
242
pfile.Name = project.BaseDirectory + @"\Web References\" + nmspace + @"\" + serviceName;
243
pfile.BuildAction = BuildAction.Nothing;
244
pfile.Subtype = Subtype.Directory;
245
pfile.DependsOn = project.BaseDirectory + @"\Web References\" + nmspace + @"\";
246
pfile.WebReferenceUrl = desc.RetrievalUrl;
249
// the Web Reference Proxy
250
pfile = new ProjectFile();
251
pfile.Name = filename;
252
pfile.BuildAction = BuildAction.Compile;
253
pfile.Subtype = Subtype.Code;
254
pfile.DependsOn = project.BaseDirectory + Path.DirectorySeparatorChar + webRefFolder;
255
pfile.Data = desc.RetrievalUrl;
258
// the WSDL File used to generate the Proxy
259
desc.Write(wsdlfilename);
260
pfile = new ProjectFile();
261
pfile.Name = wsdlfilename;
262
pfile.BuildAction = BuildAction.Nothing;
263
pfile.Subtype = Subtype.Code;
264
pfile.DependsOn = project.BaseDirectory + Path.DirectorySeparatorChar + webRefFolder;
265
pfile.Data = desc.RetrievalUrl;
274
/// <summary>Generates a Web Service proxy class from a URI</summary>
276
public static ArrayList GenerateWebProxyCode(IProject project, string url) {
279
ServiceDescription desc = ReadServiceDescription(url);
281
return GenerateWebProxyCode(project, desc);