// --------------------------------------------------------------------------------------------------------------------
//
// N/A
//
//
// Implements code generation extension for Silverlight 2.0
//
//
// Updated 2010-01-20 Deerwood McCord Jr. Cleaned CodeSnippetStatements by replacing with specific CodeDom Expressions
//
// --------------------------------------------------------------------------------------------------------------------
namespace Xsd2Code.Library.Extensions
{
using System.CodeDom;
using System.IO;
using System.IO.IsolatedStorage;
using Helpers;
///
/// Implements code generation extension for Silverlight 2.0
///
[CodeExtension(TargetFramework.Silverlight)]
public class SilverlightExtension : Net35Extension
{
///
/// Import namespaces
///
/// Code namespace
protected override void ImportNamespaces(CodeNamespace code)
{
base.ImportNamespaces(code);
if (GeneratorContext.GeneratorParams.IncludeSerializeMethod)
{
code.Imports.Add(new CodeNamespaceImport("System.IO.IsolatedStorage"));
}
}
///
/// Gets the load from file CodeDOM method.
///
/// The type CodeTypeDeclaration.
/// return the codeDom LoadFromFile method
protected override CodeMemberMethod GetLoadFromFileMethod(CodeTypeDeclaration type)
{
string typeName = GeneratorContext.GeneratorParams.UseGenericBaseClass ? "T" : type.Name;
// ---------------------------------------------
// public static T LoadFromFile(string fileName)
// ---------------------------------------------
var loadFromFileMethod = new CodeMemberMethod
{
Attributes = MemberAttributes.Public | MemberAttributes.Static,
Name = GeneratorContext.GeneratorParams.LoadFromFileMethodName
};
loadFromFileMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "fileName"));
loadFromFileMethod.ReturnType = new CodeTypeReference(typeName);
loadFromFileMethod.Statements.Add(
new CodeVariableDeclarationStatement(
new CodeTypeReference(typeof(IsolatedStorageFile)),
"isoFile",
new CodePrimitiveExpression(null)));
loadFromFileMethod.Statements.Add(
new CodeVariableDeclarationStatement(
new CodeTypeReference(typeof(IsolatedStorageFileStream)),
"isoStream",
new CodePrimitiveExpression(null)));
loadFromFileMethod.Statements.Add(
new CodeVariableDeclarationStatement(
new CodeTypeReference(typeof(StreamReader)),
"sr",
new CodePrimitiveExpression(null)));
var tryStatmanentsCol = new CodeStatementCollection();
var finallyStatmanentsCol = new CodeStatementCollection();
tryStatmanentsCol.Add(
new CodeAssignStatement(
new CodeVariableReferenceExpression("isoFile"),
CodeDomHelper.GetInvokeMethod("IsolatedStorageFile", "GetUserStoreForApplication")));
tryStatmanentsCol.Add(
new CodeAssignStatement(
new CodeVariableReferenceExpression("isoStream"),
new CodeObjectCreateExpression(
typeof(IsolatedStorageFileStream),
new CodeExpression[]
{
new CodeArgumentReferenceExpression("fileName"),
CodeDomHelper.GetEnum("FileMode","Open"),
new CodeVariableReferenceExpression("isoFile")
})));
tryStatmanentsCol.Add(
new CodeAssignStatement(
new CodeVariableReferenceExpression("sr"),
new CodeObjectCreateExpression(
typeof(StreamReader),
new CodeExpression[]
{
new CodeVariableReferenceExpression("isoStream"),
})));
// ----------------------------------
// string xmlString = sr.ReadToEnd();
// ----------------------------------
var readToEndInvoke = CodeDomHelper.GetInvokeMethod("sr", "ReadToEnd");
var xmlString = new CodeVariableDeclarationStatement(
new CodeTypeReference(typeof(string)), "xmlString", readToEndInvoke);
tryStatmanentsCol.Add(xmlString);
tryStatmanentsCol.Add(CodeDomHelper.GetInvokeMethod("isoStream", "Close"));
tryStatmanentsCol.Add(CodeDomHelper.GetInvokeMethod("sr", "Close"));
// ------------------------------------------------------
// return Deserialize(xmlString, out obj, out exception);
// ------------------------------------------------------
var fileName = new CodeVariableReferenceExpression("xmlString");
var deserializeInvoke =
new CodeMethodInvokeExpression(
new CodeMethodReferenceExpression(null, GeneratorContext.GeneratorParams.DeserializeMethodName),
new CodeExpression[] { fileName });
var rstmts = new CodeMethodReturnStatement(deserializeInvoke);
tryStatmanentsCol.Add(rstmts);
finallyStatmanentsCol.Add(CodeDomHelper.GetDispose("isoFile"));
finallyStatmanentsCol.Add(CodeDomHelper.GetDispose("isoStream"));
finallyStatmanentsCol.Add(CodeDomHelper.GetDispose("sr"));
var tryfinally = new CodeTryCatchFinallyStatement(
CodeDomHelper.CodeStmtColToArray(tryStatmanentsCol), new CodeCatchClause[0], CodeDomHelper.CodeStmtColToArray(finallyStatmanentsCol));
loadFromFileMethod.Statements.Add(tryfinally);
return loadFromFileMethod;
}
///
/// Gets the Silverlight save to isolate storage file.
///
/// CodeTypeDeclaration type.
/// return the save to file code DOM method statment
protected override CodeMemberMethod GetSaveToFileMethod()
{
// -----------------------------------------------
// public virtual void SaveToFile(string fileName)
// -----------------------------------------------
var saveToFileMethod = new CodeMemberMethod
{
Attributes = MemberAttributes.Public,
Name = GeneratorContext.GeneratorParams.SaveToFileMethodName
};
saveToFileMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "fileName"));
saveToFileMethod.Statements.Add(
new CodeVariableDeclarationStatement(
new CodeTypeReference(typeof(StreamWriter)),
"streamWriter",
new CodePrimitiveExpression(null)));
saveToFileMethod.Statements.Add(
new CodeVariableDeclarationStatement(
new CodeTypeReference(typeof(IsolatedStorageFile)),
"isoFile",
new CodePrimitiveExpression(null)));
saveToFileMethod.Statements.Add(
new CodeVariableDeclarationStatement(
new CodeTypeReference(typeof(IsolatedStorageFileStream)),
"isoStream",
new CodePrimitiveExpression(null)));
// ------------------------
// try {...} finally {...}
// -----------------------
var tryExpression = new CodeStatementCollection();
tryExpression.Add(
new CodeAssignStatement(
new CodeVariableReferenceExpression("isoFile"),
CodeDomHelper.GetInvokeMethod("IsolatedStorageFile", "GetUserStoreForApplication")));
tryExpression.Add(
new CodeAssignStatement(
new CodeVariableReferenceExpression("isoStream"),
new CodeObjectCreateExpression(
typeof(IsolatedStorageFileStream),
new CodeExpression[]
{
new CodeArgumentReferenceExpression("fileName"),
CodeDomHelper.GetEnum("FileMode","Create"),
new CodeVariableReferenceExpression("isoFile")
})));
tryExpression.Add(
new CodeAssignStatement(
new CodeVariableReferenceExpression("streamWriter"),
new CodeObjectCreateExpression(
typeof(StreamWriter),
new CodeExpression[]
{
new CodeVariableReferenceExpression("isoStream"),
})));
// ------------------------------
// string xmlString = Serialize();
// -------------------------------
var serializeMethodInvoke = new CodeMethodInvokeExpression(
new CodeMethodReferenceExpression(null, GeneratorContext.GeneratorParams.SerializeMethodName));
var xmlString = new CodeVariableDeclarationStatement(
new CodeTypeReference(typeof(string)), "xmlString", serializeMethodInvoke);
tryExpression.Add(xmlString);
// ----------------------------------
// streamWriter.WriteLine(xmlString);
// ----------------------------------
var writeLineMethodInvoke =
CodeDomHelper.GetInvokeMethod(
"streamWriter",
"WriteLine",
new CodeExpression[]
{
new CodeVariableReferenceExpression("xmlString")
});
tryExpression.Add(writeLineMethodInvoke);
tryExpression.Add(CodeDomHelper.GetInvokeMethod("streamWriter", "Close"));
tryExpression.Add(CodeDomHelper.GetInvokeMethod("isoStream", "Close"));
var finallyStatmanentsCol = new CodeStatementCollection();
finallyStatmanentsCol.Add(CodeDomHelper.GetDispose("streamWriter"));
finallyStatmanentsCol.Add(CodeDomHelper.GetDispose("isoFile"));
finallyStatmanentsCol.Add(CodeDomHelper.GetDispose("isoStream"));
var trycatch = new CodeTryCatchFinallyStatement(tryExpression.ToArray(), new CodeCatchClause[0], finallyStatmanentsCol.ToArray());
saveToFileMethod.Statements.Add(trycatch);
return saveToFileMethod;
}
}
}