aboutsummaryrefslogtreecommitdiffstatsci
path: root/src/Interface.cs
diff options
context:
space:
mode:
authorjpbruyere <jp.bruyere@hotmail.com>2015-09-13 15:06:21 +0200
committerjpbruyere <jp.bruyere@hotmail.com>2015-09-13 15:06:21 +0200
commit3877825a82ea3c48bcd782f3e49c9037a0cac0c1 (patch)
tree237c30cc42e1de8b00a239d4ff72996923e90eae /src/Interface.cs
parent5a72cb51a2ab0a34e546f16a3cea61d44e943793 (diff)
allow goml loading from memory stream with single call to
getTopGraphicObject type when loading several time the same template.
Diffstat (limited to 'src/Interface.cs')
-rw-r--r--src/Interface.cs72
1 files changed, 30 insertions, 42 deletions
diff --git a/src/Interface.cs b/src/Interface.cs
index 54cd752a..c3ddc8fa 100644
--- a/src/Interface.cs
+++ b/src/Interface.cs
@@ -87,33 +87,38 @@ namespace go
}
return stream;
}
-
- public static GraphicObject Load(string path, object hostClass = null)
- {
+ /// <summary>
+ /// Pre-read first node to set GraphicObject class for loading
+ /// and reset stream position to 0
+ /// </summary>
+ public static Type GetTopContainerOfGOMLStream(Stream stream){
string root = "Object";
-
- using (Stream stream = GetStreamFromPath (path)) {
-
- #region Pre-read first node to set GraphicObject class for loading
- using (XmlReader reader = XmlReader.Create (stream)) {
- while (reader.Read()) {
- // first element is the root element
- if (reader.NodeType == XmlNodeType.Element) {
- root = reader.Name;
- break;
- }
+ stream.Seek(0,SeekOrigin.Begin);
+ using (XmlReader reader = XmlReader.Create (stream)) {
+ while (reader.Read()) {
+ // first element is the root element
+ if (reader.NodeType == XmlNodeType.Element) {
+ root = reader.Name;
+ break;
}
}
+ }
- Type t = Type.GetType("go." + root);
- //var go = Activator.CreateInstance(t);
- stream.Seek(0,SeekOrigin.Begin);
- #endregion
-
- return Load(stream, t, hostClass);
+ Type t = Type.GetType("go." + root);
+ //var go = Activator.CreateInstance(t);
+ stream.Seek(0,SeekOrigin.Begin);
+ return t;
+ }
+ public static string CurrentGOMLPath;
+ public static GraphicObject Load(string path, object hostClass = null)
+ {
+ CurrentGOMLPath = path;
+ using (Stream stream = GetStreamFromPath (path)) {
+ return Load(stream, GetTopContainerOfGOMLStream(stream), hostClass);
}
+ CurrentGOMLPath = "";
}
- static GraphicObject Load(Stream stream, Type type, object hostClass = null)
+ public static GraphicObject Load(Stream stream, Type type, object hostClass = null, bool resolve = true)
{
GraphicObject result;
GOMLResolutionStack.Push(new List<DynAttribute>());
@@ -129,31 +134,14 @@ namespace go
GOMLResolutionStack.Pop ();
return result;
}
-
- resolveGOML (hostClass);
-
-// while (Bindings.Count > 0) {
-// DynAttribute binding = Bindings [0];
-// Bindings.RemoveAt (0);
-// CompilerServices.ResolveBinding (binding, hostClass);
-// }
-
-// foreach (DynAttribute binding in Bindings) {
-// // Type tSource = binding.Source.GetType ();
-// // if (!tSource.GetInterfaces ().Any (i => i.Name == "IValueChange")){
-// // Debug.WriteLine ("Binding source does not implement IValueChange.");
-// // continue;
-// // }
-// //MemberInfo mi = binding.Source.GetType ().GetMember (binding.MemberName);
-// CompilerServices.CreateBinding (binding, hostClass);
-// }
-// Bindings.Clear ();
-
+
+ if (resolve)
+ resolveGOML (hostClass);
return result;
}
- static void resolveGOML(object hostClass)
+ public static void resolveGOML(object hostClass)
{
foreach (DynAttribute es in GOMLResolver)
{