Updates to SharpLib
This commit is contained in:
parent
26716c6648
commit
2844950af3
5
.gitignore
vendored
5
.gitignore
vendored
@ -1,7 +1,3 @@
|
|||||||
###################################
|
|
||||||
# Git ignore file for Molyjam2012 #
|
|
||||||
###################################
|
|
||||||
|
|
||||||
#Folders
|
#Folders
|
||||||
Library/
|
Library/
|
||||||
Temp/
|
Temp/
|
||||||
@ -12,6 +8,7 @@ Release/
|
|||||||
run/
|
run/
|
||||||
bin/
|
bin/
|
||||||
obj/
|
obj/
|
||||||
|
.vs/
|
||||||
|
|
||||||
#Project/User Preference Files
|
#Project/User Preference Files
|
||||||
*.pidb
|
*.pidb
|
||||||
|
|||||||
64
Helpers.cs
64
Helpers.cs
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: Need to verify types are correct when deserializing.
|
* TODO: Need to verify types are correct when deserializing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -22,10 +22,10 @@ namespace lib
|
|||||||
{
|
{
|
||||||
FileStream fs = new FileStream( filename, FileMode.Create, FileAccess.Write );
|
FileStream fs = new FileStream( filename, FileMode.Create, FileAccess.Write );
|
||||||
|
|
||||||
XmlSerializer xs = new XmlSerializer( obj.GetType() );
|
XmlSerializer xs = new XmlSerializer( obj.GetType() );
|
||||||
//MemoryStream memoryStream = new MemoryStream( StringToUTF8ByteArray( pXmlizedString ) );
|
//MemoryStream memoryStream = new MemoryStream( StringToUTF8ByteArray( pXmlizedString ) );
|
||||||
//XmlTextReader reader = new XmlTextReader( fs, Encoding.UTF8 );
|
//XmlTextReader reader = new XmlTextReader( fs, Encoding.UTF8 );
|
||||||
|
|
||||||
xs.Serialize( fs, obj );
|
xs.Serialize( fs, obj );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,10 +33,10 @@ namespace lib
|
|||||||
{
|
{
|
||||||
FileStream fs = new FileStream( filename, FileMode.Open, FileAccess.Read );
|
FileStream fs = new FileStream( filename, FileMode.Open, FileAccess.Read );
|
||||||
|
|
||||||
XmlSerializer xs = new XmlSerializer( typeof( TType ) );
|
XmlSerializer xs = new XmlSerializer( typeof( TType ) );
|
||||||
//MemoryStream memoryStream = new MemoryStream( StringToUTF8ByteArray( pXmlizedString ) );
|
//MemoryStream memoryStream = new MemoryStream( StringToUTF8ByteArray( pXmlizedString ) );
|
||||||
//XmlTextReader reader = new XmlTextReader( fs, Encoding.UTF8 );
|
//XmlTextReader reader = new XmlTextReader( fs, Encoding.UTF8 );
|
||||||
|
|
||||||
return xs.Deserialize( fs );
|
return xs.Deserialize( fs );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,10 +72,10 @@ namespace lib
|
|||||||
{
|
{
|
||||||
XmlTextWriter xmlWriter = new XmlTextWriter( filename, null );
|
XmlTextWriter xmlWriter = new XmlTextWriter( filename, null );
|
||||||
|
|
||||||
xmlWriter.Formatting = Formatting.Indented;
|
xmlWriter.Formatting = Formatting.Indented;
|
||||||
|
|
||||||
//xmlWriter.WriteStartDocument();
|
//xmlWriter.WriteStartDocument();
|
||||||
|
|
||||||
xmlWriter.WriteStartElement( "dictionary" );
|
xmlWriter.WriteStartElement( "dictionary" );
|
||||||
|
|
||||||
Type[] types = dict.GetType().GetGenericArguments();
|
Type[] types = dict.GetType().GetGenericArguments();
|
||||||
@ -93,10 +93,10 @@ namespace lib
|
|||||||
xmlWriter.WriteEndElement();
|
xmlWriter.WriteEndElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
xmlWriter.WriteEndElement();
|
xmlWriter.WriteEndElement();
|
||||||
|
|
||||||
//xmlWriter.WriteEndDocument();
|
//xmlWriter.WriteEndDocument();
|
||||||
|
|
||||||
xmlWriter.Close();
|
xmlWriter.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,10 +106,10 @@ namespace lib
|
|||||||
|
|
||||||
XmlDocument doc = new XmlDocument();
|
XmlDocument doc = new XmlDocument();
|
||||||
|
|
||||||
doc.Load( fs );
|
doc.Load( fs );
|
||||||
|
|
||||||
//CreateTypeFor()
|
//CreateTypeFor()
|
||||||
|
|
||||||
XmlElement docElem = doc.DocumentElement;
|
XmlElement docElem = doc.DocumentElement;
|
||||||
|
|
||||||
if( docElem.Name == "dictionary" )
|
if( docElem.Name == "dictionary" )
|
||||||
@ -125,10 +125,10 @@ namespace lib
|
|||||||
{
|
{
|
||||||
XmlNodeList nodeList = docElem.ChildNodes;
|
XmlNodeList nodeList = docElem.ChildNodes;
|
||||||
|
|
||||||
object[] args = new object[ 1 ];
|
object[] args = new object[ 1 ];
|
||||||
|
|
||||||
//fi.SetValue( newObj, obj );
|
//fi.SetValue( newObj, obj );
|
||||||
|
|
||||||
foreach( XmlElement node in nodeList )
|
foreach( XmlElement node in nodeList )
|
||||||
{
|
{
|
||||||
if( node.Name == "kvp" )
|
if( node.Name == "kvp" )
|
||||||
@ -147,28 +147,28 @@ namespace lib
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.error( String.Format( $"No attributes in node while loading file {filename}" ) );
|
log.error( String.Format( $"No attributes in node while loading file {filename}" ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.error( String.Format( $"Incorrect key {node.Name} found while loading file {filename}" ) );
|
log.error( String.Format( $"Incorrect key {node.Name} found while loading file {filename}" ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( keyMI == null )
|
if( keyMI == null )
|
||||||
Log.error( String.Format( $"Key type conversion not found for type {keyType}" ) );
|
log.error( String.Format( $"Key type conversion not found for type {keyType}" ) );
|
||||||
|
|
||||||
if( valMI == null )
|
if( valMI == null )
|
||||||
Log.error( String.Format( $"Val type conversion not found for type {valType}" ) );
|
log.error( String.Format( $"Val type conversion not found for type {valType}" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.error( String.Format( $"No dictionary element found while loading file {filename}" ) );
|
log.error( String.Format( $"No dictionary element found while loading file {filename}" ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Properties\" />
|
<Folder Include="Properties\" />
|
||||||
|
<Folder Include="reflect\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
108
Token.cs
108
Token.cs
@ -1,54 +1,54 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace lib
|
namespace lib
|
||||||
{
|
{
|
||||||
|
|
||||||
//TODO PERF fix this and make it fast.
|
//TODO PERF fix this and make it fast.
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public struct Token
|
public struct Token
|
||||||
{
|
{
|
||||||
public string str { get { return m_str; } }
|
public string str { get { return m_str; } }
|
||||||
|
|
||||||
public Token( String str )
|
public Token( String str )
|
||||||
{
|
{
|
||||||
m_str = str;
|
m_str = str;
|
||||||
m_hash = m_str.GetHashCode();
|
m_hash = m_str.GetHashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Equals( object obj )
|
public override bool Equals( object obj )
|
||||||
{
|
{
|
||||||
if( !( obj is Token ) )
|
if( !( obj is Token ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//This doesnt use as because Token is a struct
|
//This doesnt use as because Token is a struct
|
||||||
var otherId = (Token)obj;
|
var otherId = (Token)obj;
|
||||||
|
|
||||||
if( m_hash != otherId.m_hash )
|
if( m_hash != otherId.m_hash )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return m_str == otherId.m_str;
|
return m_str == otherId.m_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public bool Equals_fast( Token other )
|
public bool Equals_fast( Token other )
|
||||||
{
|
{
|
||||||
return m_hash == other.m_hash && m_str == other.m_str;
|
return m_hash == other.m_hash && m_str == other.m_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override int GetHashCode()
|
public override int GetHashCode()
|
||||||
{
|
{
|
||||||
return m_hash;
|
return m_hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return m_str;
|
return m_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
int m_hash;
|
int m_hash;
|
||||||
String m_str;
|
String m_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,32 +1,32 @@
|
|||||||
// Copyright (c) Xenko contributors (https://xenko.com) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
|
// Copyright (c) Xenko contributors (https://xenko.com) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
|
||||||
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
|
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
|
||||||
//
|
//
|
||||||
// Copyright (c) 2010-2012 SharpDX - Alexandre Mutel
|
// Copyright (c) 2010-2012 SharpDX - Alexandre Mutel
|
||||||
//
|
//
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
// in the Software without restriction, including without limitation the rights
|
// in the Software without restriction, including without limitation the rights
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
// furnished to do so, subject to the following conditions:
|
// furnished to do so, subject to the following conditions:
|
||||||
//
|
//
|
||||||
// The above copyright notice and this permission notice shall be included in
|
// The above copyright notice and this permission notice shall be included in
|
||||||
// all copies or substantial portions of the Software.
|
// all copies or substantial portions of the Software.
|
||||||
//
|
//
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
#pragma warning disable SA1300 // Element must begin with upper-case letter
|
#pragma warning disable SA1300 // Element must begin with upper-case letter
|
||||||
#pragma warning disable SA1649 // File name must match first type name
|
#pragma warning disable SA1649 // File name must match first type name
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
namespace lib
|
namespace lib
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Utility class.
|
/// Utility class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -22,6 +22,7 @@
|
|||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
#pragma warning disable SA1405 // Debug.Assert must provide message text
|
#pragma warning disable SA1405 // Debug.Assert must provide message text
|
||||||
using att;
|
using att;
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -88,12 +89,12 @@ namespace lib
|
|||||||
{
|
{
|
||||||
if( !Directory.Exists( path ) )
|
if( !Directory.Exists( path ) )
|
||||||
{
|
{
|
||||||
lib.Log.info( $"Creating directory {path}" );
|
log.info( $"Creating directory {path}" );
|
||||||
Directory.CreateDirectory( path );
|
Directory.CreateDirectory( path );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lib.Log.debug( $"{path} already exists." );
|
log.debug( $"{path} already exists." );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -216,7 +217,7 @@ namespace lib
|
|||||||
|
|
||||||
unsafe
|
unsafe
|
||||||
{
|
{
|
||||||
fixed ( void* pBuffer = buffer )
|
fixed( void* pBuffer = buffer )
|
||||||
Interop.Write( pBuffer, source, 0, source.Length );
|
Interop.Write( pBuffer, source, 0, source.Length );
|
||||||
}
|
}
|
||||||
return buffer;
|
return buffer;
|
||||||
@ -339,7 +340,7 @@ namespace lib
|
|||||||
{
|
{
|
||||||
unsafe
|
unsafe
|
||||||
{
|
{
|
||||||
fixed ( void* pDest = destination )
|
fixed( void* pDest = destination )
|
||||||
{
|
{
|
||||||
Write( (IntPtr)pDest, data, offset, count );
|
Write( (IntPtr)pDest, data, offset, count );
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
// Copyright (c) Xenko contributors (https://xenko.com) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
|
// Copyright (c) Xenko contributors (https://xenko.com) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
|
||||||
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
|
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
|
||||||
|
|
||||||
/* MIT License
|
/* MIT License
|
||||||
|
|
||||||
Copyright (c) 2016 JetBrains http://www.jetbrains.com
|
Copyright (c) 2016 JetBrains http://www.jetbrains.com
|
||||||
@ -21,12 +21,12 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE. */
|
SOFTWARE. */
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace att
|
namespace att
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates that the value of the marked element could be <c>null</c> sometimes, so the check for <c>null</c>
|
/// Indicates that the value of the marked element could be <c>null</c> sometimes, so the check for <c>null</c>
|
||||||
/// is necessary before its usage.
|
/// is necessary before its usage.
|
||||||
@ -45,7 +45,7 @@ namespace att
|
|||||||
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
|
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
|
||||||
AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |
|
AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |
|
||||||
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter )]
|
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter )]
|
||||||
public sealed class CanBeNullAttribute : Attribute
|
public sealed class CanBeNullAttribute: Attribute
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
// Copyright (c) Xenko contributors (https://xenko.com) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
|
// Copyright (c) Xenko contributors (https://xenko.com) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
|
||||||
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
|
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace att
|
namespace att
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates that the value of the marked element could never be <c>null</c>.
|
/// Indicates that the value of the marked element could never be <c>null</c>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -19,7 +19,7 @@ namespace att
|
|||||||
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
|
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
|
||||||
AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |
|
AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |
|
||||||
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter )]
|
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter )]
|
||||||
public sealed class NotNullAttribute : Attribute
|
public sealed class NotNullAttribute: Attribute
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ using System.Reflection;
|
|||||||
namespace lib
|
namespace lib
|
||||||
{
|
{
|
||||||
|
|
||||||
public class DescAttribute : Attribute
|
public class DescAttribute: Attribute
|
||||||
{
|
{
|
||||||
public string Desc { get; private set; }
|
public string Desc { get; private set; }
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ namespace lib
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class ConfigCfg : Config
|
public class ConfigCfg: Config
|
||||||
{
|
{
|
||||||
public readonly bool writeOutTemplateFiles = true;
|
public readonly bool writeOutTemplateFiles = true;
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ namespace lib
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
FileStream fs = new FileStream( filename, FileMode.Open, FileAccess.Read );
|
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
|
||||||
|
|
||||||
XmlFormatter2 formatter = new XmlFormatter2();
|
XmlFormatter2 formatter = new XmlFormatter2();
|
||||||
|
|
||||||
@ -93,13 +93,13 @@ namespace lib
|
|||||||
}
|
}
|
||||||
catch( FileNotFoundException )
|
catch( FileNotFoundException )
|
||||||
{
|
{
|
||||||
Type[] types = new Type[ 0 ];
|
Type[] types = new Type[0];
|
||||||
object[] parms = new object[ 0 ];
|
object[] parms = new object[0];
|
||||||
|
|
||||||
//types[ 0 ] = typeof( string );
|
//types[ 0 ] = typeof( string );
|
||||||
//parms[ 0 ] = filename;
|
//parms[ 0 ] = filename;
|
||||||
|
|
||||||
ConstructorInfo cons = t?.GetConstructor( types );
|
ConstructorInfo cons = t?.GetConstructor(types);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -107,7 +107,7 @@ namespace lib
|
|||||||
}
|
}
|
||||||
catch( Exception e )
|
catch( Exception e )
|
||||||
{
|
{
|
||||||
Log.error( $"Exception while creating config {t.ToString()}, Msg {e.Message}" );
|
log.error( $"Exception while creating config {t.ToString()}, Msg {e.Message}" );
|
||||||
}
|
}
|
||||||
|
|
||||||
//cfg.SetFilename( filename );
|
//cfg.SetFilename( filename );
|
||||||
@ -116,11 +116,11 @@ namespace lib
|
|||||||
{
|
{
|
||||||
var templateFile = $"templates/{filename}";
|
var templateFile = $"templates/{filename}";
|
||||||
|
|
||||||
var dirName = Path.GetDirectoryName( templateFile );
|
var dirName = Path.GetDirectoryName(templateFile);
|
||||||
|
|
||||||
lib.Util.checkAndAddDirectory( dirName );
|
lib.Util.checkAndAddDirectory( dirName );
|
||||||
|
|
||||||
lib.Log.info( $"Writing out template config of type {t?.Name} in {templateFile}" );
|
log.info( $"Writing out template config of type {t?.Name} in {templateFile}" );
|
||||||
|
|
||||||
Config.save( cfg, templateFile );
|
Config.save( cfg, templateFile );
|
||||||
}
|
}
|
||||||
@ -136,7 +136,7 @@ namespace lib
|
|||||||
|
|
||||||
static public void save( Config cfg, String filename )
|
static public void save( Config cfg, String filename )
|
||||||
{
|
{
|
||||||
FileStream fs = new FileStream( filename, FileMode.Create, FileAccess.Write );
|
FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
|
||||||
|
|
||||||
XmlFormatter2 formatter = new XmlFormatter2();
|
XmlFormatter2 formatter = new XmlFormatter2();
|
||||||
|
|
||||||
|
|||||||
645
logging/Log.cs
645
logging/Log.cs
@ -8,66 +8,38 @@ using System.Collections.Immutable;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
//using System.Threading.Tasks;
|
//using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace lib
|
static public class log
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[Flags]
|
|
||||||
public enum LogTypeNew
|
|
||||||
{
|
|
||||||
Invalid = 0,
|
|
||||||
|
|
||||||
// Frequency
|
|
||||||
FrequencyBase = 1,
|
|
||||||
FrequencyBits = 2,
|
|
||||||
FrequencyMask = ( ( 1 << FrequencyBits ) - 1 ) << FrequencyBase,
|
|
||||||
|
|
||||||
Detail = 0b01 << FrequencyBase,
|
|
||||||
Normal = 0b10 << FrequencyBase,
|
|
||||||
Overview = 0b11 << FrequencyBase,
|
|
||||||
|
|
||||||
// Type
|
|
||||||
TypeBase = FrequencyBase + FrequencyBits,
|
|
||||||
TypeBits = 3,
|
|
||||||
TypeMask = ( ( 1 << TypeBits ) - 1 ) << TypeBase,
|
|
||||||
|
|
||||||
Startup = 0b001 << TypeBase,
|
|
||||||
Running = 0b010 << TypeBase,
|
|
||||||
Shutdown = 0b011 << TypeBase,
|
|
||||||
Error = 0b101 << TypeBase,
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
public enum LogType
|
public enum LogType
|
||||||
{
|
{
|
||||||
Invalid = 0,
|
Invalid = 0,
|
||||||
Trace = 1,
|
Trace = 1,
|
||||||
Debug = 2,
|
Debug = 2,
|
||||||
Info = 3,
|
Info = 3,
|
||||||
High = 4,
|
High = 4,
|
||||||
Warn = 5,
|
Warn = 5,
|
||||||
Error = 6,
|
Error = 6,
|
||||||
Fatal = 7,
|
Fatal = 7,
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct LogEvent
|
public struct LogEvent
|
||||||
{
|
{
|
||||||
public DateTime Time;
|
public DateTime Time;
|
||||||
public LogType LogType;
|
public LogType LogType;
|
||||||
public string Msg;
|
public string Msg;
|
||||||
public string Path;
|
public string Path;
|
||||||
public int Line;
|
public int Line;
|
||||||
public string Member;
|
public string Member;
|
||||||
|
|
||||||
public string Cat;
|
public string Cat;
|
||||||
public object Obj;
|
public object Obj;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static ImmutableDictionary<string, string> m_shortname = ImmutableDictionary<string, string>.Empty;
|
static ImmutableDictionary<int, string> s_shortname = ImmutableDictionary<int, string>.Empty;
|
||||||
|
|
||||||
|
|
||||||
public LogEvent( LogType logType, string msg, string path, int line, string member, string cat, object obj )
|
public LogEvent( LogType logType, string msg, string path, int line, string member, string cat, object obj )
|
||||||
@ -76,17 +48,18 @@ namespace lib
|
|||||||
//Cache the automatic category names
|
//Cache the automatic category names
|
||||||
if( string.IsNullOrEmpty( cat ) )
|
if( string.IsNullOrEmpty( cat ) )
|
||||||
{
|
{
|
||||||
if( m_shortname.TryGetValue( path, out var autoCat ) )
|
var pathHash = path.GetHashCode();
|
||||||
|
if( s_shortname.TryGetValue( pathHash, out var autoCat ) )
|
||||||
{
|
{
|
||||||
cat = autoCat;
|
cat = autoCat;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var pathPieces = path.Split('\\');
|
var pathPieces = path.Split( '\\' );
|
||||||
|
|
||||||
var lastDir = pathPieces[pathPieces.Length - 2];
|
var lastDir = pathPieces[ pathPieces.Length - 2 ];
|
||||||
|
|
||||||
ImmutableInterlocked.AddOrUpdate( ref m_shortname, path, lastDir, ( key, value ) => { return lastDir; } );
|
ImmutableInterlocked.AddOrUpdate( ref s_shortname, pathHash, lastDir, ( key, value ) => { return lastDir; } );
|
||||||
|
|
||||||
cat = lastDir;
|
cat = lastDir;
|
||||||
}
|
}
|
||||||
@ -107,343 +80,257 @@ namespace lib
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class Log : TraceListener
|
static public void create( string filename )
|
||||||
{
|
{
|
||||||
static public void create( string filename )
|
createLog( filename );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public void destroy()
|
||||||
|
{
|
||||||
|
string msg = "==============================================================================\nLogfile shutdown at " + DateTime.Now.ToString();
|
||||||
|
|
||||||
|
var evt = CreateLogEvent( LogType.Info, msg, "System", null );
|
||||||
|
|
||||||
|
writeToAll( evt );
|
||||||
|
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static LogEvent CreateLogEvent( LogType logType, string msg, string cat, object obj, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
||||||
|
{
|
||||||
|
var logEvent = new LogEvent( logType, msg, path, line, member, cat, obj );
|
||||||
|
|
||||||
|
return logEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Forwards.
|
||||||
|
static public void fatal( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
||||||
|
{
|
||||||
|
logBase( msg, LogType.Fatal, path, line, member, cat, obj );
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void error( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
||||||
|
{
|
||||||
|
logBase( msg, LogType.Error, path, line, member, cat, obj );
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void warn( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
||||||
|
{
|
||||||
|
logBase( msg, LogType.Warn, path, line, member, cat, obj );
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void info( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
||||||
|
{
|
||||||
|
logBase( msg, LogType.Info, path, line, member, cat, obj );
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void high( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
||||||
|
{
|
||||||
|
logBase( msg, LogType.High, path, line, member, cat, obj );
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void debug( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
||||||
|
{
|
||||||
|
logBase( msg, LogType.Debug, path, line, member, cat, obj );
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void trace( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
||||||
|
{
|
||||||
|
logBase( msg, LogType.Trace, path, line, member, cat, obj );
|
||||||
|
}
|
||||||
|
|
||||||
|
static object s_lock = new object();
|
||||||
|
|
||||||
|
static public void logBase( string msg, LogType type = LogType.Debug, string path = "", int line = -1, string member = "", string cat = "unk", object obj = null )
|
||||||
|
{
|
||||||
|
// @@@@@ TODO Get rid of this lock.
|
||||||
|
var evt = new LogEvent( type, msg, path, line, member, cat, obj );
|
||||||
|
|
||||||
|
lock( s_lock )
|
||||||
{
|
{
|
||||||
s_log = new Log( filename );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static public void destroy()
|
|
||||||
{
|
|
||||||
string msg = "==============================================================================\nLogfile shutdown at " + DateTime.Now.ToString();
|
|
||||||
|
|
||||||
var evt = CreateLogEvent( LogType.Info, msg, "System", null );
|
|
||||||
|
|
||||||
s_log.writeToAll( evt );
|
|
||||||
|
|
||||||
s_log.stop();
|
|
||||||
|
|
||||||
s_log = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
static public Log s_log;
|
|
||||||
|
|
||||||
/*
|
|
||||||
static public Log log
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return s_log;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
static LogEvent CreateLogEvent( LogType logType, string msg, string cat, object obj, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
|
||||||
{
|
|
||||||
var logEvent = new LogEvent( logType, msg, path, line, member, cat, obj );
|
|
||||||
|
|
||||||
return logEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Forwards.
|
|
||||||
static public void fatal( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
|
||||||
{
|
|
||||||
log( msg, LogType.Fatal, path, line, member, cat, obj );
|
|
||||||
}
|
|
||||||
|
|
||||||
static public void error( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
|
||||||
{
|
|
||||||
log( msg, LogType.Error, path, line, member, cat, obj );
|
|
||||||
}
|
|
||||||
|
|
||||||
static public void warn( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
|
||||||
{
|
|
||||||
log( msg, LogType.Warn, path, line, member, cat, obj );
|
|
||||||
}
|
|
||||||
|
|
||||||
static public void info( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
|
||||||
{
|
|
||||||
log( msg, LogType.Info, path, line, member, cat, obj );
|
|
||||||
}
|
|
||||||
|
|
||||||
static public void high( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
|
||||||
{
|
|
||||||
log( msg, LogType.High, path, line, member, cat, obj );
|
|
||||||
}
|
|
||||||
|
|
||||||
static public void debug( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
|
||||||
{
|
|
||||||
log( msg, LogType.Debug, path, line, member, cat, obj );
|
|
||||||
}
|
|
||||||
|
|
||||||
static public void trace( string msg, string cat = "", object obj = null, [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
|
||||||
{
|
|
||||||
log( msg, LogType.Trace, path, line, member, cat, obj );
|
|
||||||
}
|
|
||||||
|
|
||||||
static public void log( string msg, LogType type = LogType.Debug, string path = "", int line = -1, string member = "", string cat = "unk", object obj = null )
|
|
||||||
{
|
|
||||||
// @@@@@ TODO Get rid of this lock.
|
|
||||||
var evt = new LogEvent( type, msg, path, line, member, cat, obj );
|
|
||||||
|
|
||||||
lock( s_log )
|
|
||||||
{
|
|
||||||
s_log.writeToAll( evt );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static public void logProps( object obj, string header, LogType type = LogType.Debug, string cat = "", string prefix = "" )
|
|
||||||
{
|
|
||||||
var list = scr.GetAllProperties( obj.GetType() );
|
|
||||||
|
|
||||||
lock( s_log )
|
|
||||||
{
|
|
||||||
var evt = CreateLogEvent( type, header, cat, obj );
|
|
||||||
|
|
||||||
s_log.writeToAll( evt );
|
|
||||||
|
|
||||||
foreach( var pi in list )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var v = pi.GetValue( obj );
|
|
||||||
|
|
||||||
log( $"{prefix}{pi.Name} = {v}", type, cat );
|
|
||||||
}
|
|
||||||
catch( Exception ex )
|
|
||||||
{
|
|
||||||
log( $"Exception processing {pi.Name} {ex.Message}", LogType.Error, "log" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//This might seem a little odd, but the intent is that usually you wont need to set notExpectedValue.
|
|
||||||
static public void expected<T>( T value, string falseString, string trueString = "", T notExpectedValue = default( T ) )
|
|
||||||
{
|
|
||||||
|
|
||||||
if( !value.Equals( notExpectedValue ) )
|
|
||||||
{
|
|
||||||
lib.Log.info( $"Properly got {value}{trueString}" );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lib.Log.warn( $"Got {notExpectedValue} instead of {value}{falseString}" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private Log( string filename )
|
|
||||||
{
|
|
||||||
//TODO: Fix this so itll work without a directory.
|
|
||||||
Directory.CreateDirectory( Path.GetDirectoryName( filename ) );
|
|
||||||
|
|
||||||
m_stream = new FileStream( filename, FileMode.Append, FileAccess.Write );
|
|
||||||
m_writer = new StreamWriter( m_stream );
|
|
||||||
|
|
||||||
m_errorStream = new FileStream( filename + ".error", FileMode.Append, FileAccess.Write );
|
|
||||||
m_errorWriter = new StreamWriter( m_errorStream );
|
|
||||||
|
|
||||||
//Debug.Listeners.Add( this );
|
|
||||||
|
|
||||||
string msg = "\n==============================================================================\nLogfile " + filename + " startup at " + DateTime.Now.ToString();
|
|
||||||
|
|
||||||
var evt = CreateLogEvent( LogType.Info, msg, "System", null );
|
|
||||||
|
|
||||||
writeToAll( evt );
|
writeToAll( evt );
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Write( string msg )
|
|
||||||
{
|
|
||||||
WriteLine( msg );
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void WriteLine( string msg )
|
|
||||||
{
|
|
||||||
error( msg );
|
|
||||||
//base.WriteLine( msg );
|
|
||||||
}
|
|
||||||
|
|
||||||
void stop()
|
|
||||||
{
|
|
||||||
m_writer.Close();
|
|
||||||
m_stream.Close();
|
|
||||||
|
|
||||||
m_errorWriter.Close();
|
|
||||||
m_errorStream.Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addDelegate( Log_delegate cb )
|
|
||||||
{
|
|
||||||
m_delegates.Add( cb );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
private void writeFileAndLine( StackTrace st )
|
|
||||||
{
|
|
||||||
StackFrame frame = st.GetFrame( 1 );
|
|
||||||
|
|
||||||
string srcFile = frame.GetFileName();
|
|
||||||
string srcLine = frame.GetFileLineNumber().Tostring();
|
|
||||||
|
|
||||||
Console.WriteLine( $"{srcFile} ({srcLine}):" );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void writeStack( StackTrace st )
|
|
||||||
{
|
|
||||||
for( int i=0; i<st.FrameCount; ++i )
|
|
||||||
{
|
|
||||||
StackFrame frame = st.GetFrame( i );
|
|
||||||
|
|
||||||
string srcFile = frame.GetFileName();
|
|
||||||
string srcLine = frame.GetFileLineNumber().Tostring();
|
|
||||||
|
|
||||||
if( srcFile != null )
|
|
||||||
{
|
|
||||||
Console.WriteLine( $"{srcFile} ({srcLine})" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static char getSymbol( LogType type )
|
|
||||||
{
|
|
||||||
switch( type )
|
|
||||||
{
|
|
||||||
case LogType.Trace:
|
|
||||||
return ' ';
|
|
||||||
case LogType.Debug:
|
|
||||||
return ' ';
|
|
||||||
case LogType.Info:
|
|
||||||
return ' ';
|
|
||||||
case LogType.High:
|
|
||||||
return '+';
|
|
||||||
case LogType.Warn:
|
|
||||||
return '+';
|
|
||||||
case LogType.Error:
|
|
||||||
return '*';
|
|
||||||
case LogType.Fatal:
|
|
||||||
return '*';
|
|
||||||
default:
|
|
||||||
return '?';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void writeToAll( LogEvent evt )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// _SHOULDNT_ need this since we lock at the top.
|
|
||||||
//lock( this )
|
|
||||||
{
|
|
||||||
char sym = getSymbol( evt.LogType );
|
|
||||||
|
|
||||||
var truncatedCat = evt.Cat.Substring(0, Math.Min( 8, evt.Cat.Length ) );
|
|
||||||
|
|
||||||
string finalLine = string.Format( "{0,-8}{1}| {2}", truncatedCat, sym, evt.Msg );
|
|
||||||
|
|
||||||
//Console.WriteLine( finalMsg );
|
|
||||||
//Console.Out.Write( finalMsg );
|
|
||||||
|
|
||||||
/*
|
|
||||||
foreach( var l_obj in Debug.Listeners )
|
|
||||||
{
|
|
||||||
var l = l_obj as TraceListener;
|
|
||||||
if( l != null && l != this )
|
|
||||||
{
|
|
||||||
l.WriteLine( finalMsg );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
m_writer.WriteLine( finalLine );
|
|
||||||
|
|
||||||
m_writer.Flush();
|
|
||||||
|
|
||||||
foreach( Log_delegate cb in m_delegates )
|
|
||||||
{
|
|
||||||
//lock( cb )
|
|
||||||
{
|
|
||||||
cb( evt );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( Exception ex )
|
|
||||||
{
|
|
||||||
//oops.
|
|
||||||
//int dummy = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
private void error_i( string msg, object obj )
|
|
||||||
{
|
|
||||||
//var t = Task.Run( () => {
|
|
||||||
StackTrace st = new StackTrace( true );
|
|
||||||
|
|
||||||
writeStack( st );
|
|
||||||
|
|
||||||
string msgPrint = msg;
|
|
||||||
|
|
||||||
if( args.Length > 0 )
|
|
||||||
{
|
|
||||||
msgPrint = string.Format( msg, args );
|
|
||||||
}
|
|
||||||
|
|
||||||
writeToAll( "error", "log", msgPrint );
|
|
||||||
//} );
|
|
||||||
}
|
|
||||||
private void warn_i( string msg, object obj )
|
|
||||||
{
|
|
||||||
//var t = Task.Run( () => {
|
|
||||||
StackTrace st = new StackTrace( true );
|
|
||||||
|
|
||||||
writeStack( st );
|
|
||||||
|
|
||||||
string msgPrint = msg;
|
|
||||||
|
|
||||||
if( args.Length > 0 )
|
|
||||||
{
|
|
||||||
msgPrint = string.Format( msg, args );
|
|
||||||
}
|
|
||||||
|
|
||||||
writeToAll( "warn", "log", msgPrint );
|
|
||||||
//});
|
|
||||||
}
|
|
||||||
private void info_i( string msg, object obj )
|
|
||||||
{
|
|
||||||
//var t = Task.Run( () => {
|
|
||||||
StackTrace st = new StackTrace( true );
|
|
||||||
|
|
||||||
string msgPrint = msg;
|
|
||||||
|
|
||||||
if( args.Length > 0 )
|
|
||||||
{
|
|
||||||
msgPrint = string.Format( msg, args );
|
|
||||||
}
|
|
||||||
|
|
||||||
writeToAll( "info", "log", msgPrint );
|
|
||||||
//} );
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
private Stream m_stream;
|
|
||||||
private StreamWriter m_writer;
|
|
||||||
|
|
||||||
private Stream m_errorStream;
|
|
||||||
private StreamWriter m_errorWriter;
|
|
||||||
|
|
||||||
private ArrayList m_delegates = new ArrayList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public void logProps( object obj, string header, LogType type = LogType.Debug, string cat = "", string prefix = "", [CallerFilePath] string path = "", [CallerLineNumber] int line = -1, [CallerMemberName] string member = "" )
|
||||||
|
{
|
||||||
|
var list = refl.GetAllProperties( obj.GetType() );
|
||||||
|
|
||||||
|
lock( s_lock )
|
||||||
|
{
|
||||||
|
var evt = new LogEvent( type, header, path, line, member, cat, obj );
|
||||||
|
//var evt = CreateLogEvent( type, header, cat, obj );
|
||||||
|
|
||||||
|
writeToAll( evt );
|
||||||
|
|
||||||
|
foreach( var pi in list )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var v = pi.GetValue( obj );
|
||||||
|
|
||||||
|
logBase( $"{prefix}{pi.Name} = {v}", type, path, line, member, cat );
|
||||||
|
}
|
||||||
|
catch( Exception ex )
|
||||||
|
{
|
||||||
|
logBase( $"Exception processing {pi.Name} {ex.Message}", LogType.Error, "log" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//This might seem a little odd, but the intent is that usually you wont need to set notExpectedValue.
|
||||||
|
static public void expected<T>( T value, string falseString, string trueString = "", T notExpectedValue = default( T ) )
|
||||||
|
{
|
||||||
|
|
||||||
|
if( !value.Equals( notExpectedValue ) )
|
||||||
|
{
|
||||||
|
log.info( $"Properly got {value}{trueString}" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log.warn( $"Got {notExpectedValue} instead of {value}{falseString}" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static private void createLog( string filename )
|
||||||
|
{
|
||||||
|
|
||||||
|
string dir = Path.GetDirectoryName( filename );
|
||||||
|
|
||||||
|
if( dir.Length > 0 )
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory( dir );
|
||||||
|
}
|
||||||
|
|
||||||
|
s_stream = new FileStream( filename, FileMode.Append, FileAccess.Write );
|
||||||
|
s_writer = new StreamWriter( s_stream );
|
||||||
|
|
||||||
|
s_errorStream = new FileStream( filename + ".error", FileMode.Append, FileAccess.Write );
|
||||||
|
s_errorWriter = new StreamWriter( s_errorStream );
|
||||||
|
|
||||||
|
//Debug.Listeners.Add( this );
|
||||||
|
|
||||||
|
string msg = "\n==============================================================================\nLogfile " + filename + " startup at " + DateTime.Now.ToString();
|
||||||
|
|
||||||
|
var evt = CreateLogEvent( LogType.Info, msg, "System", null );
|
||||||
|
|
||||||
|
writeToAll( evt );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
static public override void Write( string msg ) {
|
||||||
|
WriteLine( msg );
|
||||||
|
}
|
||||||
|
|
||||||
|
static public override void WriteLine( string msg ) {
|
||||||
|
error( msg );
|
||||||
|
//base.WriteLine( msg );
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void stop()
|
||||||
|
{
|
||||||
|
s_writer.Close();
|
||||||
|
s_stream.Close();
|
||||||
|
|
||||||
|
s_errorWriter.Close();
|
||||||
|
s_errorStream.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void addDelegate( Log_delegate cb )
|
||||||
|
{
|
||||||
|
s_delegates.Add( cb );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static char getSymbol( LogType type )
|
||||||
|
{
|
||||||
|
switch( type )
|
||||||
|
{
|
||||||
|
case LogType.Trace:
|
||||||
|
return ' ';
|
||||||
|
case LogType.Debug:
|
||||||
|
return ' ';
|
||||||
|
case LogType.Info:
|
||||||
|
return ' ';
|
||||||
|
case LogType.High:
|
||||||
|
return '+';
|
||||||
|
case LogType.Warn:
|
||||||
|
return '+';
|
||||||
|
case LogType.Error:
|
||||||
|
return '*';
|
||||||
|
case LogType.Fatal:
|
||||||
|
return '*';
|
||||||
|
default:
|
||||||
|
return '?';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static private void writeToAll( LogEvent evt )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// _SHOULDNT_ need this since we lock at the top.
|
||||||
|
//lock( this )
|
||||||
|
{
|
||||||
|
char sym = getSymbol( evt.LogType );
|
||||||
|
|
||||||
|
var truncatedCat = evt.Cat.Substring( 0, Math.Min( 8, evt.Cat.Length ) );
|
||||||
|
|
||||||
|
string finalLine = string.Format( "{0,-8}{1}| {2}", truncatedCat, sym, evt.Msg );
|
||||||
|
|
||||||
|
//Console.WriteLine( finalMsg );
|
||||||
|
//Console.Out.Write( finalMsg );
|
||||||
|
|
||||||
|
s_writer.WriteLine( finalLine );
|
||||||
|
|
||||||
|
Console.WriteLine( finalLine );
|
||||||
|
|
||||||
|
Debug.WriteLine( finalLine );
|
||||||
|
|
||||||
|
s_writer.Flush();
|
||||||
|
|
||||||
|
foreach( Log_delegate cb in s_delegates )
|
||||||
|
{
|
||||||
|
{
|
||||||
|
cb( evt );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( Exception ex )
|
||||||
|
{
|
||||||
|
Console.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Console.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Console.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Console.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Console.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Console.WriteLine( $"Exception {ex}" );
|
||||||
|
|
||||||
|
Debug.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Debug.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Debug.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Debug.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Debug.WriteLine( "EXCEPTION DURING LOGGING" );
|
||||||
|
Debug.WriteLine( $"Exception {ex}" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Stream s_stream;
|
||||||
|
private static StreamWriter s_writer;
|
||||||
|
|
||||||
|
private static Stream s_errorStream;
|
||||||
|
private static StreamWriter s_errorWriter;
|
||||||
|
|
||||||
|
private static ArrayList s_delegates = new ArrayList();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1506
math/AngleSingle.cs
1506
math/AngleSingle.cs
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
//using System.Threading.Tasks;
|
//using System.Threading.Tasks;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ namespace mod
|
|||||||
{
|
{
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class Config : lib.Config
|
public class Config: lib.Config
|
||||||
{
|
{
|
||||||
public String name = "Generic";
|
public String name = "Generic";
|
||||||
}
|
}
|
||||||
@ -33,13 +33,13 @@ namespace mod
|
|||||||
|
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class FluidConfig : Config
|
public class FluidConfig: Config
|
||||||
{
|
{
|
||||||
public String type = "none";
|
public String type = "none";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class FluidBase : Base
|
public class FluidBase: Base
|
||||||
{
|
{
|
||||||
public new FluidConfig Cfg { get { return (FluidConfig)base.Cfg; } }
|
public new FluidConfig Cfg { get { return (FluidConfig)base.Cfg; } }
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ namespace mod
|
|||||||
|
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class SystemConfig : Config
|
public class SystemConfig: Config
|
||||||
{
|
{
|
||||||
public String type = "none";
|
public String type = "none";
|
||||||
}
|
}
|
||||||
|
|||||||
14
net/Conn.cs
14
net/Conn.cs
@ -20,7 +20,7 @@ namespace lib
|
|||||||
|
|
||||||
public interface ISerDes<T> where T : IFormatter
|
public interface ISerDes<T> where T : IFormatter
|
||||||
{
|
{
|
||||||
|
|
||||||
T getInstance();
|
T getInstance();
|
||||||
|
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ namespace lib
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class NewEveryCall<T> : ISerDes<T> where T : IFormatter, new()
|
public class NewEveryCall<T>: ISerDes<T> where T : IFormatter, new()
|
||||||
{
|
{
|
||||||
public T getInstance()
|
public T getInstance()
|
||||||
{
|
{
|
||||||
@ -38,7 +38,7 @@ namespace lib
|
|||||||
|
|
||||||
|
|
||||||
public class Conn<T, TInst> where T : IFormatter, new()
|
public class Conn<T, TInst> where T : IFormatter, new()
|
||||||
where TInst : ISerDes<T>, new()
|
where TInst : ISerDes<T>, new()
|
||||||
{
|
{
|
||||||
public Socket Sock { get { return m_socket; } }
|
public Socket Sock { get { return m_socket; } }
|
||||||
public Stream Stream { get { return m_streamNet; } }
|
public Stream Stream { get { return m_streamNet; } }
|
||||||
@ -75,7 +75,7 @@ namespace lib
|
|||||||
}
|
}
|
||||||
catch( System.Xml.XmlException ex )
|
catch( System.Xml.XmlException ex )
|
||||||
{
|
{
|
||||||
lib.Log.error( $"Outer Exception {ex.Message}" );
|
log.error( $"Outer Exception {ex.Message}" );
|
||||||
}
|
}
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
@ -92,8 +92,8 @@ namespace lib
|
|||||||
formatter.Serialize( ms, obj );
|
formatter.Serialize( ms, obj );
|
||||||
|
|
||||||
//var str = System.Text.Encoding.Default.GetString( mm_buffer, 0, (int)ms.Position );
|
//var str = System.Text.Encoding.Default.GetString( mm_buffer, 0, (int)ms.Position );
|
||||||
//lib.Log.info( $"Sent data {str} of length {ms.Position}" );
|
//log.info( $"Sent data {str} of length {ms.Position}" );
|
||||||
//lib.Log.info( $"Sent {obj}" );
|
//log.info( $"Sent {obj}" );
|
||||||
|
|
||||||
byte[] byteSize = BitConverter.GetBytes( (uint)ms.Position );
|
byte[] byteSize = BitConverter.GetBytes( (uint)ms.Position );
|
||||||
m_streamNet.Write( byteSize, 0, 4 );
|
m_streamNet.Write( byteSize, 0, 4 );
|
||||||
@ -103,7 +103,7 @@ namespace lib
|
|||||||
}
|
}
|
||||||
catch( Exception e )
|
catch( Exception e )
|
||||||
{
|
{
|
||||||
lib.Log.warn( $"Exception sending obj {obj} of {e}" );
|
log.warn( $"Exception sending obj {obj} of {e}" );
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
156
net/NetMsg.cs
156
net/NetMsg.cs
@ -1,95 +1,95 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace lib.Net
|
|
||||||
{
|
|
||||||
[Serializable]
|
|
||||||
public class Msg
|
|
||||||
{
|
|
||||||
public Msg()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class Login
|
|
||||||
{
|
|
||||||
public Login( String name, String pass )
|
|
||||||
{
|
|
||||||
m_username = name;
|
|
||||||
m_password = pass;
|
|
||||||
}
|
|
||||||
|
|
||||||
public readonly String m_username;
|
namespace lib.Net
|
||||||
public readonly String m_password;
|
{
|
||||||
}
|
[Serializable]
|
||||||
|
public class Msg
|
||||||
[Serializable]
|
{
|
||||||
public class LoginResp
|
public Msg()
|
||||||
{
|
{
|
||||||
public LoginResp( bool resp )
|
|
||||||
{
|
|
||||||
m_resp = resp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly bool m_resp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Admin Messages
|
[Serializable]
|
||||||
|
public class Login
|
||||||
|
{
|
||||||
|
public Login( String name, String pass )
|
||||||
|
{
|
||||||
|
m_username = name;
|
||||||
|
m_password = pass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public readonly String m_username;
|
||||||
|
public readonly String m_password;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class LoginResp
|
||||||
|
{
|
||||||
|
public LoginResp( bool resp )
|
||||||
|
{
|
||||||
|
m_resp = resp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public readonly bool m_resp;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Admin Messages
|
||||||
//Subclasses of this need to be on an admin client.
|
//Subclasses of this need to be on an admin client.
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class Admin
|
public class Admin
|
||||||
{
|
{
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class CreateEntity : Admin
|
public class CreateEntity: Admin
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class MoveEntity : Admin
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endregion
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class EntityBase
|
[Serializable]
|
||||||
{
|
public class MoveEntity: Admin
|
||||||
public EntityBase( int id )
|
{
|
||||||
{
|
|
||||||
m_id = id;
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class EntityBase
|
||||||
|
{
|
||||||
|
public EntityBase( int id )
|
||||||
|
{
|
||||||
|
m_id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly int m_id;
|
public readonly int m_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class EntityPos : EntityBase
|
public class EntityPos: EntityBase
|
||||||
{
|
{
|
||||||
public EntityPos( int id, float x, float y, float z ) :
|
public EntityPos( int id, float x, float y, float z ) :
|
||||||
base( id )
|
base( id )
|
||||||
{
|
{
|
||||||
m_x = x;
|
m_x = x;
|
||||||
m_y = y;
|
m_y = y;
|
||||||
m_z = z;
|
m_z = z;
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly float m_x;
|
public readonly float m_x;
|
||||||
public readonly float m_y;
|
public readonly float m_y;
|
||||||
public readonly float m_z;
|
public readonly float m_z;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class EntityDesc : EntityBase
|
public class EntityDesc: EntityBase
|
||||||
{
|
{
|
||||||
public EntityDesc( int id ) :
|
public EntityDesc( int id ) :
|
||||||
base( id )
|
base( id )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
//Should an entity have a mesh? Be made up of multiple meshes?
|
//Should an entity have a mesh? Be made up of multiple meshes?
|
||||||
@ -100,4 +100,4 @@ namespace lib.Net
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static public class scr
|
static public class refl
|
||||||
{
|
{
|
||||||
|
|
||||||
public class PredEnumerator
|
public class PredEnumerator
|
||||||
@ -30,7 +30,7 @@ static public class scr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PredEnumerator<T> : PredEnumerator, IEnumerator<T>
|
public class PredEnumerator<T>: PredEnumerator, IEnumerator<T>
|
||||||
{
|
{
|
||||||
|
|
||||||
public T Current => m_en.Current;
|
public T Current => m_en.Current;
|
||||||
@ -100,12 +100,12 @@ static public class scr
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
IEnumerator<T> m_en;
|
IEnumerator<T> m_en;
|
||||||
Predicate<T> m_pred;
|
Predicate<T> m_pred;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class PredEnumerable<T> : IEnumerable<T>
|
public class PredEnumerable<T>: IEnumerable<T>
|
||||||
{
|
{
|
||||||
public PredEnumerable( PredEnumerator<T> en )
|
public PredEnumerable( PredEnumerator<T> en )
|
||||||
{
|
{
|
||||||
@ -132,7 +132,7 @@ static public class scr
|
|||||||
BindingFlags.DeclaredOnly |
|
BindingFlags.DeclaredOnly |
|
||||||
BindingFlags.NonPublic |
|
BindingFlags.NonPublic |
|
||||||
BindingFlags.Public |
|
BindingFlags.Public |
|
||||||
BindingFlags.Instance);
|
BindingFlags.Instance );
|
||||||
|
|
||||||
var en = PredEnumerator.Create<FieldInfo>( fieldArr.AsEnumerable<FieldInfo>(), fa => fa.GetCustomAttribute( typeof( NonSerializedAttribute ) ) == null );
|
var en = PredEnumerator.Create<FieldInfo>( fieldArr.AsEnumerable<FieldInfo>(), fa => fa.GetCustomAttribute( typeof( NonSerializedAttribute ) ) == null );
|
||||||
|
|
||||||
@ -167,13 +167,13 @@ static public class scr
|
|||||||
var propArr = t.GetProperties(
|
var propArr = t.GetProperties(
|
||||||
BindingFlags.DeclaredOnly |
|
BindingFlags.DeclaredOnly |
|
||||||
BindingFlags.NonPublic |
|
BindingFlags.NonPublic |
|
||||||
BindingFlags.Public |
|
BindingFlags.Public |
|
||||||
BindingFlags.Instance
|
BindingFlags.Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var en = PredEnumerator.Create<PropertyInfo>( propArr.AsEnumerable<PropertyInfo>(),
|
|
||||||
|
var en = PredEnumerator.Create<PropertyInfo>( propArr.AsEnumerable<PropertyInfo>(),
|
||||||
fa => fa.GetCustomAttribute( typeof( NonSerializedAttribute ) ) == null && !list.Exists( f => f.Name == fa.Name ) );
|
fa => fa.GetCustomAttribute( typeof( NonSerializedAttribute ) ) == null && !list.Exists( f => f.Name == fa.Name ) );
|
||||||
|
|
||||||
list.AddRange( new PredEnumerable<PropertyInfo>( en ) );
|
list.AddRange( new PredEnumerable<PropertyInfo>( en ) );
|
||||||
@ -1,8 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
//using System.Threading.Tasks;
|
//using System.Threading.Tasks;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
@ -16,11 +16,11 @@ namespace res
|
|||||||
|
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class Ref : lib.I_Serialize
|
public class Ref: lib.I_Serialize
|
||||||
{
|
{
|
||||||
public string filename { get { return m_filename; } }
|
public string filename { get { return m_filename; } }
|
||||||
|
|
||||||
//For construction
|
//For construction
|
||||||
public Ref()
|
public Ref()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -51,11 +51,11 @@ namespace res
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class Ref<T> : Ref where T : class
|
public class Ref<T>: Ref where T : class
|
||||||
{
|
{
|
||||||
public T res => m_res != null ? m_res : m_res = Mgr.load<T>( filename );
|
public T res => m_res != null ? m_res : m_res = Mgr.load<T>( filename );
|
||||||
|
|
||||||
//For serialization
|
//For serialization
|
||||||
public Ref()
|
public Ref()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -88,9 +88,9 @@ namespace res
|
|||||||
{
|
{
|
||||||
static public Mgr mgr;
|
static public Mgr mgr;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public class Loader<T>
|
public class Loader<T>
|
||||||
{
|
{
|
||||||
@ -100,8 +100,8 @@ namespace res
|
|||||||
return default(T);
|
return default(T);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public delegate T Load<out T>( string filename );
|
public delegate T Load<out T>( string filename );
|
||||||
|
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ namespace res
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class LoadHolder<T> : LoadHolder
|
class LoadHolder<T>: LoadHolder
|
||||||
{
|
{
|
||||||
public LoadHolder( Load<T> _dlgtLoad )
|
public LoadHolder( Load<T> _dlgtLoad )
|
||||||
{
|
{
|
||||||
@ -128,9 +128,9 @@ namespace res
|
|||||||
{
|
{
|
||||||
return load();
|
return load();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//generic classes make a new static per generic type
|
//generic classes make a new static per generic type
|
||||||
class ResCache<T> where T : class
|
class ResCache<T> where T : class
|
||||||
{
|
{
|
||||||
public static T s_default = default;
|
public static T s_default = default;
|
||||||
@ -157,10 +157,10 @@ namespace res
|
|||||||
var lh = new LoadHolder<T>( loader );
|
var lh = new LoadHolder<T>( loader );
|
||||||
|
|
||||||
ImmutableInterlocked.TryAdd( ref Resource.mgr.m_loaders, typeof( T ), lh );
|
ImmutableInterlocked.TryAdd( ref Resource.mgr.m_loaders, typeof( T ), lh );
|
||||||
}
|
}
|
||||||
|
|
||||||
//Register all subclasses of a particular type
|
//Register all subclasses of a particular type
|
||||||
//???? Should we just always do this?
|
//???? Should we just always do this?
|
||||||
static public void registerSub( Type baseType )
|
static public void registerSub( Type baseType )
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ namespace res
|
|||||||
|
|
||||||
|
|
||||||
static public Ref<T> lookup<T>( string filename ) where T : class
|
static public Ref<T> lookup<T>( string filename ) where T : class
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
LoadHolder loader_gen;
|
LoadHolder loader_gen;
|
||||||
Resource.mgr.m_loaders.TryGetValue( typeof( T ), out loader_gen );
|
Resource.mgr.m_loaders.TryGetValue( typeof( T ), out loader_gen );
|
||||||
@ -214,14 +214,14 @@ namespace res
|
|||||||
Ref<T> rf = rf_raw as Ref<T>;
|
Ref<T> rf = rf_raw as Ref<T>;
|
||||||
return rf;
|
return rf;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return new Ref<T>( filename );
|
return new Ref<T>( filename );
|
||||||
}
|
}
|
||||||
|
|
||||||
//*
|
//*
|
||||||
static public Ref lookup( string filename, Type t )
|
static public Ref lookup( string filename, Type t )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
LoadHolder loader_gen;
|
LoadHolder loader_gen;
|
||||||
Resource.mgr.m_loaders.TryGetValue( t, out loader_gen );
|
Resource.mgr.m_loaders.TryGetValue( t, out loader_gen );
|
||||||
@ -234,12 +234,12 @@ namespace res
|
|||||||
var rf_raw = loaderHolder.load( filename );
|
var rf_raw = loaderHolder.load( filename );
|
||||||
return rf_raw;
|
return rf_raw;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return new Ref( filename );
|
return new Ref( filename );
|
||||||
}
|
}
|
||||||
//*/
|
//*/
|
||||||
|
|
||||||
static public T load<T>( string filename ) where T : class
|
static public T load<T>( string filename ) where T : class
|
||||||
{
|
{
|
||||||
if( ResCache<T>.s_cache.TryGetValue( filename, out var wr ) )
|
if( ResCache<T>.s_cache.TryGetValue( filename, out var wr ) )
|
||||||
@ -247,10 +247,10 @@ namespace res
|
|||||||
if( wr.TryGetTarget( out var v ) )
|
if( wr.TryGetTarget( out var v ) )
|
||||||
return v;
|
return v;
|
||||||
|
|
||||||
lib.Log.info( $"{filename} was in cache, but its been dropped, reloading." );
|
log.info( $"{filename} was in cache, but its been dropped, reloading." );
|
||||||
}
|
}
|
||||||
|
|
||||||
lib.Log.warn( $"Block Loading {filename}." );
|
log.warn( $"Block Loading {filename}." );
|
||||||
|
|
||||||
var newV = actualLoad<T>( filename );
|
var newV = actualLoad<T>( filename );
|
||||||
|
|
||||||
@ -268,7 +268,7 @@ namespace res
|
|||||||
if( wr.TryGetTarget( out var v ) )
|
if( wr.TryGetTarget( out var v ) )
|
||||||
return v;
|
return v;
|
||||||
|
|
||||||
lib.Log.error( $"{filename} was in cache, but its been dropped, reloading." );
|
log.error( $"{filename} was in cache, but its been dropped, reloading." );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,24 +286,24 @@ namespace res
|
|||||||
|
|
||||||
var alreadyAdded = !ImmutableInterlocked.TryAdd( ref ResCache<T>.s_cache, filename, weak );
|
var alreadyAdded = !ImmutableInterlocked.TryAdd( ref ResCache<T>.s_cache, filename, weak );
|
||||||
|
|
||||||
evtNew.Set();
|
evtNew.Set();
|
||||||
|
|
||||||
//Done loading
|
//Done loading
|
||||||
if( !ImmutableInterlocked.TryRemove( ref s_loading, filename, out var oldEvt ) )
|
if( !ImmutableInterlocked.TryRemove( ref s_loading, filename, out var oldEvt ) )
|
||||||
{
|
{
|
||||||
lib.Log.error( $"Error removing loading event for {filename}" );
|
log.error( $"Error removing loading event for {filename}" );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( alreadyAdded )
|
if( alreadyAdded )
|
||||||
{
|
{
|
||||||
lib.Log.error( $"Key {filename} already existed, though it shouldnt." );
|
log.error( $"Key {filename} already existed, though it shouldnt." );
|
||||||
}
|
}
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lib.Log.error( $"Loader could not be found for type {typeof( T )}" );
|
log.error( $"Loader could not be found for type {typeof( T )}" );
|
||||||
|
|
||||||
return ResCache<T>.s_default;
|
return ResCache<T>.s_default;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,25 +1,25 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Xml.Serialization;
|
using System.Xml.Serialization;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Runtime.Serialization.Formatters.Binary;
|
using System.Runtime.Serialization.Formatters.Binary;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Security.Permissions;
|
using System.Security.Permissions;
|
||||||
|
|
||||||
namespace lib
|
namespace lib
|
||||||
{
|
{
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class SerializableDictionary<TKey, TVal> : Dictionary<TKey, TVal>, IXmlSerializable, ISerializable
|
public class SerializableDictionary<TKey, TVal>: Dictionary<TKey, TVal>, IXmlSerializable, ISerializable
|
||||||
{
|
{
|
||||||
#region Constants
|
#region Constants
|
||||||
private const string DictionaryNodeName = "Dictionary";
|
private const string DictionaryNodeName = "Dictionary";
|
||||||
private const string ItemNodeName = "Item";
|
private const string ItemNodeName = "Item";
|
||||||
private const string KeyNodeName = "Key";
|
private const string KeyNodeName = "Key";
|
||||||
private const string ValueNodeName = "Value";
|
private const string ValueNodeName = "Value";
|
||||||
#endregion
|
#endregion
|
||||||
#region Constructors
|
#region Constructors
|
||||||
public SerializableDictionary()
|
public SerializableDictionary()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -49,8 +49,8 @@ namespace lib
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
#region ISerializable Members
|
#region ISerializable Members
|
||||||
|
|
||||||
protected SerializableDictionary( SerializationInfo info, StreamingContext context )
|
protected SerializableDictionary( SerializationInfo info, StreamingContext context )
|
||||||
{
|
{
|
||||||
@ -74,8 +74,8 @@ namespace lib
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
#region IXmlSerializable Members
|
#region IXmlSerializable Members
|
||||||
|
|
||||||
void IXmlSerializable.WriteXml( System.Xml.XmlWriter writer )
|
void IXmlSerializable.WriteXml( System.Xml.XmlWriter writer )
|
||||||
{
|
{
|
||||||
@ -131,8 +131,8 @@ namespace lib
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
#region Private Properties
|
#region Private Properties
|
||||||
protected XmlSerializer ValueSerializer
|
protected XmlSerializer ValueSerializer
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -156,10 +156,10 @@ namespace lib
|
|||||||
return keySerializer;
|
return keySerializer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
#region Private Members
|
#region Private Members
|
||||||
private XmlSerializer keySerializer = null;
|
private XmlSerializer keySerializer = null;
|
||||||
private XmlSerializer valueSerializer = null;
|
private XmlSerializer valueSerializer = null;
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@ namespace lib
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class VersionFormatter : IFormatter
|
public class VersionFormatter: IFormatter
|
||||||
{
|
{
|
||||||
public enum ETypes
|
public enum ETypes
|
||||||
{
|
{
|
||||||
@ -160,44 +160,44 @@ namespace lib
|
|||||||
switch( typeName )
|
switch( typeName )
|
||||||
{
|
{
|
||||||
case "Int32":
|
case "Int32":
|
||||||
writer.Write( (char)ETypes.Int32 );
|
writer.Write( (char)ETypes.Int32 );
|
||||||
writer.Write( name.GetHashCode() );
|
writer.Write( name.GetHashCode() );
|
||||||
|
|
||||||
write( writer, Convert.ToInt32( fi.GetValue( parentObj ) ) );
|
write( writer, Convert.ToInt32( fi.GetValue( parentObj ) ) );
|
||||||
break;
|
break;
|
||||||
case "Single":
|
case "Single":
|
||||||
writer.Write( (char)ETypes.Single );
|
writer.Write( (char)ETypes.Single );
|
||||||
writer.Write( name.GetHashCode() );
|
writer.Write( name.GetHashCode() );
|
||||||
|
|
||||||
write( writer, Convert.ToSingle( fi.GetValue( parentObj ) ) );
|
write( writer, Convert.ToSingle( fi.GetValue( parentObj ) ) );
|
||||||
break;
|
break;
|
||||||
case "Double":
|
case "Double":
|
||||||
writer.Write( (char)ETypes.Double );
|
writer.Write( (char)ETypes.Double );
|
||||||
writer.Write( name.GetHashCode() );
|
writer.Write( name.GetHashCode() );
|
||||||
|
|
||||||
write( writer, Convert.ToDouble( fi.GetValue( parentObj ) ) );
|
write( writer, Convert.ToDouble( fi.GetValue( parentObj ) ) );
|
||||||
break;
|
break;
|
||||||
case "Char":
|
case "Char":
|
||||||
writer.Write( (char)ETypes.Char );
|
writer.Write( (char)ETypes.Char );
|
||||||
writer.Write( name.GetHashCode() );
|
writer.Write( name.GetHashCode() );
|
||||||
|
|
||||||
write( writer, Convert.ToChar( fi.GetValue( parentObj ) ) );
|
write( writer, Convert.ToChar( fi.GetValue( parentObj ) ) );
|
||||||
break;
|
break;
|
||||||
case "String":
|
case "String":
|
||||||
writer.Write( (char)ETypes.String );
|
writer.Write( (char)ETypes.String );
|
||||||
writer.Write( name.GetHashCode() );
|
writer.Write( name.GetHashCode() );
|
||||||
|
|
||||||
write( writer, Convert.ToString( fi.GetValue( parentObj ) ) );
|
write( writer, Convert.ToString( fi.GetValue( parentObj ) ) );
|
||||||
break;
|
break;
|
||||||
case "Boolean":
|
case "Boolean":
|
||||||
writer.Write( (char)ETypes.Boolean );
|
writer.Write( (char)ETypes.Boolean );
|
||||||
writer.Write( name.GetHashCode() );
|
writer.Write( name.GetHashCode() );
|
||||||
|
|
||||||
writer.Write( Convert.ToBoolean( fi.GetValue( parentObj ) ) );
|
writer.Write( Convert.ToBoolean( fi.GetValue( parentObj ) ) );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Console.WriteLine( "VersionFormatter does not understand type " + typeName );
|
Console.WriteLine( "VersionFormatter does not understand type " + typeName );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -433,35 +433,35 @@ namespace lib
|
|||||||
switch( type )
|
switch( type )
|
||||||
{
|
{
|
||||||
case ETypes.Array:
|
case ETypes.Array:
|
||||||
readArray( reader, obj, fi );
|
readArray( reader, obj, fi );
|
||||||
break;
|
break;
|
||||||
case ETypes.Int32:
|
case ETypes.Int32:
|
||||||
readInt( reader, obj, fi );
|
readInt( reader, obj, fi );
|
||||||
break;
|
break;
|
||||||
case ETypes.Single:
|
case ETypes.Single:
|
||||||
readSingle( reader, obj, fi );
|
readSingle( reader, obj, fi );
|
||||||
break;
|
break;
|
||||||
case ETypes.Double:
|
case ETypes.Double:
|
||||||
readDouble( reader, obj, fi );
|
readDouble( reader, obj, fi );
|
||||||
break;
|
break;
|
||||||
case ETypes.Char:
|
case ETypes.Char:
|
||||||
readChar( reader, obj, fi );
|
readChar( reader, obj, fi );
|
||||||
break;
|
break;
|
||||||
case ETypes.Boolean:
|
case ETypes.Boolean:
|
||||||
readBool( reader, obj, fi );
|
readBool( reader, obj, fi );
|
||||||
break;
|
break;
|
||||||
case ETypes.String:
|
case ETypes.String:
|
||||||
readString( reader, obj, fi );
|
readString( reader, obj, fi );
|
||||||
break;
|
break;
|
||||||
case ETypes.Ref:
|
case ETypes.Ref:
|
||||||
readRef( reader, obj, fi );
|
readRef( reader, obj, fi );
|
||||||
break;
|
break;
|
||||||
case ETypes.Object:
|
case ETypes.Object:
|
||||||
readObject( reader );
|
readObject( reader );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Debug.Fail( "Unknown type on read." );
|
Debug.Fail( "Unknown type on read." );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( Exception ex )
|
catch( Exception ex )
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
//using System.Web.Configuration;
|
//using System.Web.Configuration;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
//using System.Collections;
|
//using System.Collections;
|
||||||
//using System.Diagnostics;
|
//using System.Diagnostics;
|
||||||
@ -14,37 +14,37 @@ using System.Reflection;
|
|||||||
//using System.ComponentModel;
|
//using System.ComponentModel;
|
||||||
|
|
||||||
|
|
||||||
namespace lib
|
namespace lib
|
||||||
{
|
{
|
||||||
//Old, use 2 now.
|
//Old, use 2 now.
|
||||||
class XmlFormatter : IFormatter
|
class XmlFormatter: IFormatter
|
||||||
{
|
{
|
||||||
StreamingContext m_context;
|
StreamingContext m_context;
|
||||||
//SerializationMode m_mode;
|
//SerializationMode m_mode;
|
||||||
//KnownTypeCollection known_types;
|
//KnownTypeCollection known_types;
|
||||||
//IDataContractSurrogate m_surrogate;
|
//IDataContractSurrogate m_surrogate;
|
||||||
//int m_maxItems;
|
//int m_maxItems;
|
||||||
|
|
||||||
public XmlFormatter()
|
public XmlFormatter()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public XmlFormatter( SerializationMode mode )
|
public XmlFormatter( SerializationMode mode )
|
||||||
{
|
{
|
||||||
m_mode = mode;
|
m_mode = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XmlFormatter( StreamingContext context )
|
public XmlFormatter( StreamingContext context )
|
||||||
{
|
{
|
||||||
m_context = context;
|
m_context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XmlFormatter( SerializationMode mode,
|
public XmlFormatter( SerializationMode mode,
|
||||||
StreamingContext context )
|
StreamingContext context )
|
||||||
{
|
{
|
||||||
m_mode = mode;
|
m_mode = mode;
|
||||||
m_context = context;
|
m_context = context;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -54,185 +54,185 @@ namespace lib
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
SerializationBinder IFormatter.Binder
|
SerializationBinder IFormatter.Binder
|
||||||
{
|
{
|
||||||
get { throw new NotImplementedException(); }
|
get { throw new NotImplementedException(); }
|
||||||
set { throw new NotImplementedException(); }
|
set { throw new NotImplementedException(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
ISurrogateSelector IFormatter.SurrogateSelector
|
|
||||||
{
|
|
||||||
get { throw new NotImplementedException(); }
|
|
||||||
set { throw new NotImplementedException(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public StreamingContext Context
|
|
||||||
{
|
|
||||||
get { return m_context; }
|
|
||||||
set { m_context = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
ISurrogateSelector IFormatter.SurrogateSelector
|
||||||
public KnownTypeCollection KnownTypes {
|
{
|
||||||
get { return known_types; }
|
get { throw new NotImplementedException(); }
|
||||||
}
|
set { throw new NotImplementedException(); }
|
||||||
|
}
|
||||||
public int MaxItemsInObjectGraph {
|
|
||||||
get { return m_maxItems; }
|
public StreamingContext Context
|
||||||
set { m_maxItems= value; }
|
{
|
||||||
}
|
get { return m_context; }
|
||||||
|
set { m_context = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
public KnownTypeCollection KnownTypes {
|
||||||
|
get { return known_types; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int MaxItemsInObjectGraph {
|
||||||
|
get { return m_maxItems; }
|
||||||
|
set { m_maxItems= value; }
|
||||||
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
object IFormatter.Deserialize( Stream stream )
|
object IFormatter.Deserialize( Stream stream )
|
||||||
{
|
{
|
||||||
return Deserialize( stream, null );
|
return Deserialize( stream, null );
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Deserialize( Stream stream, Type type )
|
public object Deserialize( Stream stream, Type type )
|
||||||
{
|
{
|
||||||
XmlTextReader reader = new XmlTextReader( stream );
|
XmlTextReader reader = new XmlTextReader( stream );
|
||||||
|
|
||||||
return Deserialize( reader, type );
|
return Deserialize( reader, type );
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Deserialize( XmlReader reader, Type type )
|
public object Deserialize( XmlReader reader, Type type )
|
||||||
{
|
{
|
||||||
return Deserialize( reader, type, false );
|
return Deserialize( reader, type, false );
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Deserialize( XmlReader reader, Type type, bool readContentOnly )
|
public object Deserialize( XmlReader reader, Type type, bool readContentOnly )
|
||||||
{
|
{
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
|
||||||
XmlDocument doc = new XmlDocument();
|
XmlDocument doc = new XmlDocument();
|
||||||
|
|
||||||
doc.Load( reader );
|
doc.Load( reader );
|
||||||
|
|
||||||
return Deserialize( doc.DocumentElement );
|
return Deserialize( doc.DocumentElement );
|
||||||
}
|
}
|
||||||
|
|
||||||
ConstructorInfo getNoParamCons( ConstructorInfo[] ciArr )
|
ConstructorInfo getNoParamCons( ConstructorInfo[] ciArr )
|
||||||
{
|
{
|
||||||
foreach( ConstructorInfo ci in ciArr )
|
foreach( ConstructorInfo ci in ciArr )
|
||||||
{
|
{
|
||||||
if( ci.GetParameters().Length == 0 )
|
if( ci.GetParameters().Length == 0 )
|
||||||
{
|
{
|
||||||
return ci;
|
return ci;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static FormatterConverter s_conv = new FormatterConverter();
|
private static FormatterConverter s_conv = new FormatterConverter();
|
||||||
|
|
||||||
private Dictionary<int, object> m_alreadySerialized = new Dictionary<int, object>();
|
private Dictionary<int, object> m_alreadySerialized = new Dictionary<int, object>();
|
||||||
|
|
||||||
public object Deserialize( XmlElement elem )
|
public object Deserialize( XmlElement elem )
|
||||||
{
|
{
|
||||||
string strType = elem.GetAttribute( "t" );
|
string strType = elem.GetAttribute( "t" );
|
||||||
|
|
||||||
return Deserialize( elem, strType );
|
return Deserialize( elem, strType );
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Deserialize( XmlElement elem, string strType )
|
public object Deserialize( XmlElement elem, string strType )
|
||||||
{
|
{
|
||||||
Type type = Type.GetType( strType );
|
Type type = Type.GetType( strType );
|
||||||
|
|
||||||
MemberInfo[] miArr = FormatterServices.GetSerializableMembers( type );
|
MemberInfo[] miArr = FormatterServices.GetSerializableMembers( type );
|
||||||
|
|
||||||
object obj = Activator.CreateInstance( type );
|
object obj = Activator.CreateInstance( type );
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
object obj = FormatterServices.GetUninitializedObject( type );
|
object obj = FormatterServices.GetUninitializedObject( type );
|
||||||
|
|
||||||
|
|
||||||
ConstructorInfo[] ciArr = obj.GetType().GetConstructors();
|
ConstructorInfo[] ciArr = obj.GetType().GetConstructors();
|
||||||
|
|
||||||
ConstructorInfo ci = getNoParamCons( ciArr );
|
ConstructorInfo ci = getNoParamCons( ciArr );
|
||||||
|
|
||||||
if( ci == null )
|
if( ci == null )
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
obj = ci.Invoke( null );
|
obj = ci.Invoke( null );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for( int i = 0; i < miArr.Length; ++i )
|
for( int i = 0; i < miArr.Length; ++i )
|
||||||
{
|
{
|
||||||
FieldInfo fi = (FieldInfo)miArr[ i ];
|
FieldInfo fi = (FieldInfo)miArr[ i ];
|
||||||
|
|
||||||
XmlNodeList nodeList = elem.GetElementsByTagName( fi.Name );
|
XmlNodeList nodeList = elem.GetElementsByTagName( fi.Name );
|
||||||
|
|
||||||
if( nodeList.Count == 1 )
|
if( nodeList.Count == 1 )
|
||||||
{
|
{
|
||||||
Type t = fi.FieldType;
|
Type t = fi.FieldType;
|
||||||
|
|
||||||
TypeCode tc = Type.GetTypeCode( t );
|
TypeCode tc = Type.GetTypeCode( t );
|
||||||
|
|
||||||
XmlElement child = (XmlElement)nodeList[ 0 ];
|
XmlElement child = (XmlElement)nodeList[ 0 ];
|
||||||
|
|
||||||
object childObj = null;
|
object childObj = null;
|
||||||
|
|
||||||
if( tc != TypeCode.Object || fi.FieldType.FullName == "System.String" )
|
if( tc != TypeCode.Object || fi.FieldType.FullName == "System.String" )
|
||||||
{
|
{
|
||||||
childObj = s_conv.Convert( child.GetAttribute( "v" ), fi.FieldType );
|
childObj = s_conv.Convert( child.GetAttribute( "v" ), fi.FieldType );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( !t.IsArray )
|
if( !t.IsArray )
|
||||||
{
|
{
|
||||||
string refStr = child.GetAttribute( "ref" );
|
string refStr = child.GetAttribute( "ref" );
|
||||||
int refInt = Convert.ToInt32( refStr );
|
int refInt = Convert.ToInt32( refStr );
|
||||||
|
|
||||||
if( child.HasAttribute( "t" ) )
|
if( child.HasAttribute( "t" ) )
|
||||||
{
|
{
|
||||||
childObj = Deserialize( child );
|
childObj = Deserialize( child );
|
||||||
|
|
||||||
m_alreadySerialized[refInt] = childObj;
|
m_alreadySerialized[refInt] = childObj;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
childObj = m_alreadySerialized[refInt];
|
childObj = m_alreadySerialized[refInt];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//FormatterServices.GetUninitializedObject()
|
//FormatterServices.GetUninitializedObject()
|
||||||
|
|
||||||
int length = s_conv.ToInt32( child.GetAttribute( "c" ) );
|
int length = s_conv.ToInt32( child.GetAttribute( "c" ) );
|
||||||
|
|
||||||
string elemType = child.GetAttribute( "t" );
|
string elemType = child.GetAttribute( "t" );
|
||||||
|
|
||||||
Array arr = Array.CreateInstance( t.GetElementType(), length );
|
Array arr = Array.CreateInstance( t.GetElementType(), length );
|
||||||
|
|
||||||
XmlNodeList arrNodeList = child.ChildNodes;
|
XmlNodeList arrNodeList = child.ChildNodes;
|
||||||
|
|
||||||
for( int iElems = 0; iElems < arr.Length; ++iElems )
|
for( int iElems = 0; iElems < arr.Length; ++iElems )
|
||||||
{
|
{
|
||||||
XmlElement arrElem = (XmlElement)arrNodeList.Item( iElems );
|
XmlElement arrElem = (XmlElement)arrNodeList.Item( iElems );
|
||||||
|
|
||||||
arr.SetValue( Deserialize( arrElem, elemType ), iElems );
|
arr.SetValue( Deserialize( arrElem, elemType ), iElems );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fi.SetValue( obj, childObj );
|
fi.SetValue( obj, childObj );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( nodeList.Count == 0 )
|
if( nodeList.Count == 0 )
|
||||||
{
|
{
|
||||||
// Should be
|
// Should be
|
||||||
|
|
||||||
//object obj2 = fi.GetRawConstantValue();
|
//object obj2 = fi.GetRawConstantValue();
|
||||||
}
|
}
|
||||||
else //More than 1.
|
else //More than 1.
|
||||||
{
|
{
|
||||||
//Log.error( "Too many fields named the same thing" );
|
//log.error( "Too many fields named the same thing" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//FieldInfo fi = (FieldInfo)miArr[0];
|
//FieldInfo fi = (FieldInfo)miArr[0];
|
||||||
@ -241,144 +241,144 @@ namespace lib
|
|||||||
|
|
||||||
//ci.Invoke( null );
|
//ci.Invoke( null );
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public T Deserialize<T> (Stream stream)
|
public T Deserialize<T> (Stream stream)
|
||||||
{
|
{
|
||||||
return (T) Deserialize (XmlReader.Create (stream), typeof (T));
|
return (T) Deserialize (XmlReader.Create (stream), typeof (T));
|
||||||
}
|
}
|
||||||
|
|
||||||
public T Deserialize<T> (XmlReader reader)
|
public T Deserialize<T> (XmlReader reader)
|
||||||
{
|
{
|
||||||
return (T) Deserialize (reader, typeof (T), false);
|
return (T) Deserialize (reader, typeof (T), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public T Deserialize<T> (XmlReader reader, bool readContentOnly)
|
public T Deserialize<T> (XmlReader reader, bool readContentOnly)
|
||||||
{
|
{
|
||||||
return (T) Deserialize (reader, typeof (T), readContentOnly);
|
return (T) Deserialize (reader, typeof (T), readContentOnly);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public void Serialize( Stream stream, object graph )
|
public void Serialize( Stream stream, object graph )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
XmlWriterSettings settings = new XmlWriterSettings();
|
XmlWriterSettings settings = new XmlWriterSettings();
|
||||||
|
|
||||||
settings.Indent = true;
|
settings.Indent = true;
|
||||||
|
|
||||||
Serialize( XmlWriter.Create( stream, settings ), graph );
|
Serialize( XmlWriter.Create( stream, settings ), graph );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
XmlTextWriter writer = new XmlTextWriter( stream, null );
|
XmlTextWriter writer = new XmlTextWriter( stream, null );
|
||||||
|
|
||||||
writer.Formatting = Formatting.Indented;
|
writer.Formatting = Formatting.Indented;
|
||||||
|
|
||||||
Serialize( writer, graph );
|
Serialize( writer, graph );
|
||||||
|
|
||||||
writer.Close();
|
writer.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Serialize( XmlWriter writer, object graph )
|
public void Serialize( XmlWriter writer, object graph )
|
||||||
{
|
{
|
||||||
Serialize( writer, graph, null, true, false, true );
|
Serialize( writer, graph, null, true, false, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Serialize( XmlWriter writer, object graph,
|
public void Serialize( XmlWriter writer, object graph,
|
||||||
Type rootType, bool preserveObjectReferences,
|
Type rootType, bool preserveObjectReferences,
|
||||||
bool writeContentOnly,
|
bool writeContentOnly,
|
||||||
bool ignoreUnknownSerializationData )
|
bool ignoreUnknownSerializationData )
|
||||||
{
|
{
|
||||||
Type t = graph.GetType();
|
Type t = graph.GetType();
|
||||||
|
|
||||||
//writer.WriteStartDocument();
|
//writer.WriteStartDocument();
|
||||||
|
|
||||||
if( Type.GetTypeCode( t ) == TypeCode.Object )
|
if( Type.GetTypeCode( t ) == TypeCode.Object )
|
||||||
{
|
{
|
||||||
writer.WriteStartElement( "root" );
|
writer.WriteStartElement( "root" );
|
||||||
|
|
||||||
Assembly assem = t.Assembly;
|
Assembly assem = t.Assembly;
|
||||||
|
|
||||||
string assemName = assem.GetName().Name;
|
string assemName = assem.GetName().Name;
|
||||||
|
|
||||||
writer.WriteAttributeString( "t", graph.GetType().FullName + ", " + assemName );
|
writer.WriteAttributeString( "t", graph.GetType().FullName + ", " + assemName );
|
||||||
|
|
||||||
FieldInfo[] fiArr = t.GetFields( BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly );
|
FieldInfo[] fiArr = t.GetFields( BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly );
|
||||||
|
|
||||||
foreach( FieldInfo fi in fiArr )
|
foreach( FieldInfo fi in fiArr )
|
||||||
{
|
{
|
||||||
Serialize( writer, fi.Name, fi.GetValue( graph ) );
|
Serialize( writer, fi.Name, fi.GetValue( graph ) );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if( fi.FieldType.IsClass )
|
if( fi.FieldType.IsClass )
|
||||||
{
|
{
|
||||||
Serialize( writer, fi.GetValue( graph ), rootType, preserveObjectReferences, writeContentOnly, ignoreUnknownSerializationData );
|
Serialize( writer, fi.GetValue( graph ), rootType, preserveObjectReferences, writeContentOnly, ignoreUnknownSerializationData );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SerializePod( writer, fi.GetValue( graph ) );
|
SerializePod( writer, fi.GetValue( graph ) );
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.WriteEndElement();
|
writer.WriteEndElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
//writer.WriteEndDocument();
|
//writer.WriteEndDocument();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ObjectIDGenerator m_idGenerator = new ObjectIDGenerator();
|
private ObjectIDGenerator m_idGenerator = new ObjectIDGenerator();
|
||||||
private Dictionary<long, object> m_alreadyDeserialzied = new Dictionary<long, object>();
|
private Dictionary<long, object> m_alreadyDeserialzied = new Dictionary<long, object>();
|
||||||
|
|
||||||
public void Serialize( XmlWriter writer, string name, object obj )
|
public void Serialize( XmlWriter writer, string name, object obj )
|
||||||
{
|
{
|
||||||
writer.WriteStartElement( name );
|
writer.WriteStartElement( name );
|
||||||
|
|
||||||
if( obj != null )
|
if( obj != null )
|
||||||
{
|
{
|
||||||
Type t = obj.GetType();
|
Type t = obj.GetType();
|
||||||
|
|
||||||
if( Type.GetTypeCode( t ) == TypeCode.Object )
|
if( Type.GetTypeCode( t ) == TypeCode.Object )
|
||||||
{
|
{
|
||||||
bool first = false;
|
bool first = false;
|
||||||
if( !m_alreadyDeserialzied.ContainsKey( m_idGenerator.GetId( obj, out first ) ) )
|
if( !m_alreadyDeserialzied.ContainsKey( m_idGenerator.GetId( obj, out first ) ) )
|
||||||
{
|
{
|
||||||
m_alreadyDeserialzied[m_idGenerator.GetId( obj, out first )] = obj;
|
m_alreadyDeserialzied[m_idGenerator.GetId( obj, out first )] = obj;
|
||||||
|
|
||||||
Assembly assem = t.Assembly;
|
Assembly assem = t.Assembly;
|
||||||
|
|
||||||
string assemName = assem.GetName().Name;
|
string assemName = assem.GetName().Name;
|
||||||
|
|
||||||
if( !t.IsArray )
|
if( !t.IsArray )
|
||||||
{
|
{
|
||||||
writer.WriteAttributeString( "t", t.FullName + ", " + assemName );
|
writer.WriteAttributeString( "t", t.FullName + ", " + assemName );
|
||||||
|
|
||||||
writer.WriteAttributeString( "ref", m_idGenerator.GetId( obj, out first ).ToString() );
|
writer.WriteAttributeString( "ref", m_idGenerator.GetId( obj, out first ).ToString() );
|
||||||
|
|
||||||
FieldInfo[] fiArr = t.GetFields( BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public );
|
FieldInfo[] fiArr = t.GetFields( BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public );
|
||||||
|
|
||||||
foreach( FieldInfo fi in fiArr )
|
foreach( FieldInfo fi in fiArr )
|
||||||
{
|
{
|
||||||
Serialize( writer, fi.Name, fi.GetValue( obj ) );
|
Serialize( writer, fi.Name, fi.GetValue( obj ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Array arr = (Array)obj;
|
Array arr = (Array)obj;
|
||||||
|
|
||||||
Type aType = t.GetElementType();
|
Type aType = t.GetElementType();
|
||||||
|
|
||||||
string aTypeString = aType.FullName;
|
string aTypeString = aType.FullName;
|
||||||
|
|
||||||
writer.WriteAttributeString( "t", aTypeString + ", " + assemName );
|
writer.WriteAttributeString( "t", aTypeString + ", " + assemName );
|
||||||
|
|
||||||
writer.WriteAttributeString( "c", arr.Length.ToString() );
|
writer.WriteAttributeString( "c", arr.Length.ToString() );
|
||||||
|
|
||||||
for( int i = 0; i < arr.Length; ++i )
|
for( int i = 0; i < arr.Length; ++i )
|
||||||
{
|
{
|
||||||
Serialize( writer, "val", arr.GetValue( i ) );
|
Serialize( writer, "val", arr.GetValue( i ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
//writer.WriteStartElement( "values" );
|
//writer.WriteStartElement( "values" );
|
||||||
@ -387,29 +387,29 @@ namespace lib
|
|||||||
|
|
||||||
//writer.WriteEndElement();
|
//writer.WriteEndElement();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
writer.WriteAttributeString( "ref", m_idGenerator.GetId( obj, out first ).ToString() );
|
writer.WriteAttributeString( "ref", m_idGenerator.GetId( obj, out first ).ToString() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
writer.WriteAttributeString( "t", t.FullName );
|
writer.WriteAttributeString( "t", t.FullName );
|
||||||
|
|
||||||
writer.WriteAttributeString( "v", obj.ToString() );
|
writer.WriteAttributeString( "v", obj.ToString() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
writer.WriteAttributeString( "null", "" );
|
writer.WriteAttributeString( "null", "" );
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.WriteEndElement();
|
writer.WriteEndElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -29,12 +29,12 @@ namespace lib
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class XmlFormatter2Cfg : Config
|
public class XmlFormatter2Cfg: Config
|
||||||
{
|
{
|
||||||
public readonly Datastructure datastructure = Datastructure.Full;
|
public readonly Datastructure datastructure = Datastructure.Full;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class XmlFormatter2 : IFormatter
|
public class XmlFormatter2: IFormatter
|
||||||
{
|
{
|
||||||
public StreamingContext Context { get; set; }
|
public StreamingContext Context { get; set; }
|
||||||
|
|
||||||
@ -95,10 +95,10 @@ namespace lib
|
|||||||
{
|
{
|
||||||
//lib.log.info( "DeserializeKnownType( Stream stream, Type t ) {0} {1}", m_rndVal, m_alreadySerialized.Count );
|
//lib.log.info( "DeserializeKnownType( Stream stream, Type t ) {0} {1}", m_rndVal, m_alreadySerialized.Count );
|
||||||
|
|
||||||
XmlTextReader reader = new XmlTextReader( stream );
|
XmlTextReader reader = new XmlTextReader(stream);
|
||||||
//reader.Settings = System.Text.Encoding.ASCII;
|
//reader.Settings = System.Text.Encoding.ASCII;
|
||||||
|
|
||||||
object obj = Deserialize( reader, t );
|
object obj = Deserialize(reader, t);
|
||||||
//lib.log.info( "DeserializeKnownType END( Stream stream, Type t ) {0} {1}", m_rndVal, m_alreadySerialized.Count );
|
//lib.log.info( "DeserializeKnownType END( Stream stream, Type t ) {0} {1}", m_rndVal, m_alreadySerialized.Count );
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@ -128,7 +128,7 @@ namespace lib
|
|||||||
{
|
{
|
||||||
//lib.log.info( "object Deserialize( XmlElement elem ) {0} {1}", m_rndVal, m_alreadySerialized.Count );
|
//lib.log.info( "object Deserialize( XmlElement elem ) {0} {1}", m_rndVal, m_alreadySerialized.Count );
|
||||||
|
|
||||||
string typename = elem.HasAttribute( "t" ) ? elem.GetAttribute( "t" ) : elem.Name;
|
string typename = elem.HasAttribute("t") ? elem.GetAttribute("t") : elem.Name;
|
||||||
|
|
||||||
return Deserialize( elem, typename );
|
return Deserialize( elem, typename );
|
||||||
}
|
}
|
||||||
@ -160,7 +160,7 @@ namespace lib
|
|||||||
|
|
||||||
private object Deserialize( XmlElement elem, Type type, object enclosing = null )
|
private object Deserialize( XmlElement elem, Type type, object enclosing = null )
|
||||||
{
|
{
|
||||||
TypeCode typeCode = Type.GetTypeCode( type );
|
TypeCode typeCode = Type.GetTypeCode(type);
|
||||||
|
|
||||||
if( typeCode != TypeCode.Object )
|
if( typeCode != TypeCode.Object )
|
||||||
{
|
{
|
||||||
@ -170,7 +170,7 @@ namespace lib
|
|||||||
{
|
{
|
||||||
if( !type.IsArray )
|
if( !type.IsArray )
|
||||||
{
|
{
|
||||||
object obj = DeserializeObject( elem, type );
|
object obj = DeserializeObject(elem, type);
|
||||||
|
|
||||||
if( obj is I_Serialize )
|
if( obj is I_Serialize )
|
||||||
{
|
{
|
||||||
@ -193,7 +193,7 @@ namespace lib
|
|||||||
{
|
{
|
||||||
mm_types[0] = t;
|
mm_types[0] = t;
|
||||||
|
|
||||||
var fn = GetType().GetMethod( "GetDefaultGeneric" ).MakeGenericMethod( mm_types );
|
var fn = GetType().GetMethod("GetDefaultGeneric").MakeGenericMethod(mm_types);
|
||||||
|
|
||||||
return fn.Invoke( this, null );
|
return fn.Invoke( this, null );
|
||||||
}
|
}
|
||||||
@ -205,7 +205,7 @@ namespace lib
|
|||||||
|
|
||||||
private object DeserializeConcrete( XmlElement elem, Type type )
|
private object DeserializeConcrete( XmlElement elem, Type type )
|
||||||
{
|
{
|
||||||
string val = elem.GetAttribute( "v" );
|
string val = elem.GetAttribute("v");
|
||||||
|
|
||||||
if( !type.IsEnum )
|
if( !type.IsEnum )
|
||||||
{
|
{
|
||||||
@ -244,7 +244,7 @@ namespace lib
|
|||||||
|
|
||||||
foreach( Assembly a in ass )
|
foreach( Assembly a in ass )
|
||||||
{
|
{
|
||||||
Type t = a.GetType( shortname );
|
Type t = a.GetType(shortname);
|
||||||
|
|
||||||
if( t != null )
|
if( t != null )
|
||||||
{
|
{
|
||||||
@ -255,25 +255,25 @@ namespace lib
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Type[] mm_consType = new Type[ 2 ];
|
private Type[] mm_consType = new Type[2];
|
||||||
private object[] mm_args = new object[ 2 ];
|
private object[] mm_args = new object[2];
|
||||||
private object DeserializeObject( XmlElement elem, Type type )
|
private object DeserializeObject( XmlElement elem, Type type )
|
||||||
{
|
{
|
||||||
string refString = elem.GetAttribute( "ref" );
|
string refString = elem.GetAttribute("ref");
|
||||||
|
|
||||||
int refInt = refString.Length > 0 ? Convert.ToInt32( refString ) : -1;
|
int refInt = refString.Length > 0 ? Convert.ToInt32(refString) : -1;
|
||||||
|
|
||||||
var finalType = type;
|
var finalType = type;
|
||||||
if( elem.HasAttribute( "t" ) )
|
if( elem.HasAttribute( "t" ) )
|
||||||
{
|
{
|
||||||
var typename = elem.GetAttribute( "t" );
|
var typename = elem.GetAttribute("t");
|
||||||
finalType = FindType( typename );
|
finalType = FindType( typename );
|
||||||
|
|
||||||
if( finalType == null )
|
if( finalType == null )
|
||||||
finalType = type;
|
finalType = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
object obj = createObject( finalType, refInt );
|
object obj = createObject(finalType, refInt);
|
||||||
|
|
||||||
if( obj is IList )
|
if( obj is IList )
|
||||||
{
|
{
|
||||||
@ -282,7 +282,7 @@ namespace lib
|
|||||||
return DeserializeList( elem, type, list );
|
return DeserializeList( elem, type, list );
|
||||||
}
|
}
|
||||||
|
|
||||||
Type typeISerializable = typeof( ISerializable );
|
Type typeISerializable = typeof(ISerializable);
|
||||||
|
|
||||||
if( obj is ISerializable ) // type.IsSubclassOf( typeISerializable ) )
|
if( obj is ISerializable ) // type.IsSubclassOf( typeISerializable ) )
|
||||||
{
|
{
|
||||||
@ -290,7 +290,7 @@ namespace lib
|
|||||||
|
|
||||||
//ISerializable ser = obj as ISerializable;
|
//ISerializable ser = obj as ISerializable;
|
||||||
|
|
||||||
var serInfo = new SerializationInfo( finalType, new FormatterConverter() );
|
var serInfo = new SerializationInfo(finalType, new FormatterConverter());
|
||||||
|
|
||||||
//var serInfoForTypes = new SerializationInfo( type, new FormatterConverter() );
|
//var serInfoForTypes = new SerializationInfo( type, new FormatterConverter() );
|
||||||
|
|
||||||
@ -302,13 +302,13 @@ namespace lib
|
|||||||
|
|
||||||
String name = node.Name;
|
String name = node.Name;
|
||||||
|
|
||||||
String childType = node.GetAttribute( "t" );
|
String childType = node.GetAttribute("t");
|
||||||
|
|
||||||
name = scr.TypeToIdentifier( name );
|
name = refl.TypeToIdentifier( name );
|
||||||
|
|
||||||
XmlElement childElem = getNamedChild( allChildren, name );
|
XmlElement childElem = getNamedChild(allChildren, name);
|
||||||
|
|
||||||
var des = Deserialize( childElem, childType );
|
var des = Deserialize(childElem, childType);
|
||||||
|
|
||||||
serInfo.AddValue( name, des, des.GetType() );
|
serInfo.AddValue( name, des, des.GetType() );
|
||||||
}
|
}
|
||||||
@ -323,7 +323,7 @@ namespace lib
|
|||||||
|
|
||||||
mm_consType[0] = typeof( SerializationInfo );
|
mm_consType[0] = typeof( SerializationInfo );
|
||||||
mm_consType[1] = typeof( StreamingContext );
|
mm_consType[1] = typeof( StreamingContext );
|
||||||
ConstructorInfo serCons = finalType.GetConstructor( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, mm_consType, null );
|
ConstructorInfo serCons = finalType.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, mm_consType, null);
|
||||||
|
|
||||||
mm_args[0] = serInfo;
|
mm_args[0] = serInfo;
|
||||||
mm_args[1] = Context;
|
mm_args[1] = Context;
|
||||||
@ -343,7 +343,7 @@ namespace lib
|
|||||||
{
|
{
|
||||||
String name = serMember.Name;
|
String name = serMember.Name;
|
||||||
|
|
||||||
name = scr.TypeToIdentifier( name );
|
name = refl.TypeToIdentifier( name );
|
||||||
|
|
||||||
XmlElement childElem = getNamedChild( allChildren, name );
|
XmlElement childElem = getNamedChild( allChildren, name );
|
||||||
|
|
||||||
@ -355,7 +355,7 @@ namespace lib
|
|||||||
{
|
{
|
||||||
XmlNodeList allChildren = elem.ChildNodes;
|
XmlNodeList allChildren = elem.ChildNodes;
|
||||||
|
|
||||||
var fields = scr.GetAllFields( type );
|
var fields = refl.GetAllFields(type);
|
||||||
|
|
||||||
//MemberInfo[] miArr = FormatterServices.GetSerializableMembers( type, Context );
|
//MemberInfo[] miArr = FormatterServices.GetSerializableMembers( type, Context );
|
||||||
|
|
||||||
@ -364,20 +364,20 @@ namespace lib
|
|||||||
|
|
||||||
String name = childFi.Name;
|
String name = childFi.Name;
|
||||||
|
|
||||||
name = scr.TypeToIdentifier( name );
|
name = refl.TypeToIdentifier( name );
|
||||||
|
|
||||||
XmlElement childElem = getNamedChild( allChildren, name );
|
XmlElement childElem = getNamedChild(allChildren, name);
|
||||||
|
|
||||||
|
|
||||||
if( childElem != null )
|
if( childElem != null )
|
||||||
{
|
{
|
||||||
object childObj = Deserialize( childElem, childFi.FieldType, obj );
|
object childObj = Deserialize(childElem, childFi.FieldType, obj);
|
||||||
|
|
||||||
childFi.SetValue( obj, childObj );
|
childFi.SetValue( obj, childObj );
|
||||||
}
|
}
|
||||||
else if( fields.Count == 1 )
|
else if( fields.Count == 1 )
|
||||||
{
|
{
|
||||||
object childObj = Deserialize( elem, childFi.FieldType, obj );
|
object childObj = Deserialize(elem, childFi.FieldType, obj);
|
||||||
|
|
||||||
childFi.SetValue( obj, childObj );
|
childFi.SetValue( obj, childObj );
|
||||||
}
|
}
|
||||||
@ -403,7 +403,7 @@ namespace lib
|
|||||||
{
|
{
|
||||||
if( arrNodeList.Item( i ) is XmlElement )
|
if( arrNodeList.Item( i ) is XmlElement )
|
||||||
{
|
{
|
||||||
XmlElement arrElem = (XmlElement)arrNodeList.Item( i );
|
XmlElement arrElem = (XmlElement)arrNodeList.Item(i);
|
||||||
|
|
||||||
list.Add( Deserialize( arrElem, genT[0] ) );
|
list.Add( Deserialize( arrElem, genT[0] ) );
|
||||||
}
|
}
|
||||||
@ -416,20 +416,20 @@ namespace lib
|
|||||||
{
|
{
|
||||||
Type typeElem = type.GetElementType();
|
Type typeElem = type.GetElementType();
|
||||||
|
|
||||||
string refString = elem.GetAttribute( "ref" );
|
string refString = elem.GetAttribute("ref");
|
||||||
int refInt = refString.Length > 0 ? Convert.ToInt32( refString ) : -1;
|
int refInt = refString.Length > 0 ? Convert.ToInt32(refString) : -1;
|
||||||
|
|
||||||
XmlNodeList arrNodeList = elem.ChildNodes;
|
XmlNodeList arrNodeList = elem.ChildNodes;
|
||||||
|
|
||||||
int length = arrNodeList.Count;
|
int length = arrNodeList.Count;
|
||||||
|
|
||||||
Array arr = createArray( typeElem, refInt, length );
|
Array arr = createArray(typeElem, refInt, length);
|
||||||
|
|
||||||
for( int i = 0; i < arr.Length; ++i )
|
for( int i = 0; i < arr.Length; ++i )
|
||||||
{
|
{
|
||||||
if( arrNodeList.Item( i ) is XmlElement )
|
if( arrNodeList.Item( i ) is XmlElement )
|
||||||
{
|
{
|
||||||
XmlElement arrElem = (XmlElement)arrNodeList.Item( i );
|
XmlElement arrElem = (XmlElement)arrNodeList.Item(i);
|
||||||
|
|
||||||
arr.SetValue( Deserialize( arrElem, typeElem ), i );
|
arr.SetValue( Deserialize( arrElem, typeElem ), i );
|
||||||
}
|
}
|
||||||
@ -440,14 +440,14 @@ namespace lib
|
|||||||
|
|
||||||
private object createObject( string typename, int refInt )
|
private object createObject( string typename, int refInt )
|
||||||
{
|
{
|
||||||
Type type = Type.GetType( typename );
|
Type type = Type.GetType(typename);
|
||||||
|
|
||||||
return createObject( type, refInt );
|
return createObject( type, refInt );
|
||||||
}
|
}
|
||||||
|
|
||||||
private object createObject( Type type, int refInt )
|
private object createObject( Type type, int refInt )
|
||||||
{
|
{
|
||||||
TypeCode tc = Type.GetTypeCode( type );
|
TypeCode tc = Type.GetTypeCode(type);
|
||||||
|
|
||||||
if( m_cfg.datastructure == Datastructure.Full && refInt > 0 && m_alreadySerialized.ContainsKey( refInt ) )
|
if( m_cfg.datastructure == Datastructure.Full && refInt > 0 && m_alreadySerialized.ContainsKey( refInt ) )
|
||||||
{
|
{
|
||||||
@ -472,14 +472,14 @@ namespace lib
|
|||||||
}
|
}
|
||||||
catch( Exception exInner )
|
catch( Exception exInner )
|
||||||
{
|
{
|
||||||
lib.Log.error( $"Got exception {exInner.Message} trying to make an uninitialized object" );
|
log.error( $"Got exception {exInner.Message} trying to make an uninitialized object" );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( obj == null )
|
if( obj == null )
|
||||||
{
|
{
|
||||||
lib.Log.warn( $"Could not create object of type {type.Name}" );
|
log.warn( $"Could not create object of type {type.Name}" );
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@ -495,14 +495,14 @@ namespace lib
|
|||||||
|
|
||||||
private Array createArray( string elemTypename, int refInt, int length )
|
private Array createArray( string elemTypename, int refInt, int length )
|
||||||
{
|
{
|
||||||
Type elemType = Type.GetType( elemTypename );
|
Type elemType = Type.GetType(elemTypename);
|
||||||
|
|
||||||
return createArray( elemType, refInt, length );
|
return createArray( elemType, refInt, length );
|
||||||
}
|
}
|
||||||
|
|
||||||
private Array createArray( Type elemType, int refInt, int length )
|
private Array createArray( Type elemType, int refInt, int length )
|
||||||
{
|
{
|
||||||
TypeCode elemTC = Type.GetTypeCode( elemType );
|
TypeCode elemTC = Type.GetTypeCode(elemType);
|
||||||
|
|
||||||
if( m_cfg.datastructure == Datastructure.Full && refInt > 0 && m_alreadySerialized.ContainsKey( refInt ) )
|
if( m_cfg.datastructure == Datastructure.Full && refInt > 0 && m_alreadySerialized.ContainsKey( refInt ) )
|
||||||
{
|
{
|
||||||
@ -510,7 +510,7 @@ namespace lib
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Array arr = Array.CreateInstance( elemType, length ) ;
|
Array arr = Array.CreateInstance(elemType, length);
|
||||||
|
|
||||||
if( m_cfg.datastructure == Datastructure.Full )
|
if( m_cfg.datastructure == Datastructure.Full )
|
||||||
{
|
{
|
||||||
@ -545,7 +545,7 @@ namespace lib
|
|||||||
m_alreadySerialized.Clear();
|
m_alreadySerialized.Clear();
|
||||||
m_objectID = new ObjectIDGenerator();
|
m_objectID = new ObjectIDGenerator();
|
||||||
|
|
||||||
XmlTextWriter writer = new XmlTextWriter( stream, System.Text.Encoding.ASCII );
|
XmlTextWriter writer = new XmlTextWriter(stream, System.Text.Encoding.ASCII);
|
||||||
|
|
||||||
writer.Formatting = Formatting.Indented;
|
writer.Formatting = Formatting.Indented;
|
||||||
|
|
||||||
@ -573,7 +573,7 @@ namespace lib
|
|||||||
{
|
{
|
||||||
Type type = root.GetType();
|
Type type = root.GetType();
|
||||||
|
|
||||||
TypeCode typeCode = Type.GetTypeCode( type );
|
TypeCode typeCode = Type.GetTypeCode(type);
|
||||||
|
|
||||||
if( typeCode != TypeCode.Object )
|
if( typeCode != TypeCode.Object )
|
||||||
{
|
{
|
||||||
@ -626,7 +626,7 @@ namespace lib
|
|||||||
|
|
||||||
bool first;
|
bool first;
|
||||||
|
|
||||||
long refInt = m_objectID.GetId( root, out first );
|
long refInt = m_objectID.GetId(root, out first);
|
||||||
|
|
||||||
if( m_cfg.datastructure == Datastructure.Full )
|
if( m_cfg.datastructure == Datastructure.Full )
|
||||||
{
|
{
|
||||||
@ -644,13 +644,13 @@ namespace lib
|
|||||||
Type type = root.GetType();
|
Type type = root.GetType();
|
||||||
|
|
||||||
//*
|
//*
|
||||||
Type typeISerializable = typeof( ISerializable );
|
Type typeISerializable = typeof(ISerializable);
|
||||||
|
|
||||||
if( root is ISerializable ) // type.IsSubclassOf( typeISerializable ) )
|
if( root is ISerializable ) // type.IsSubclassOf( typeISerializable ) )
|
||||||
{
|
{
|
||||||
ISerializable ser = root as ISerializable;
|
ISerializable ser = root as ISerializable;
|
||||||
|
|
||||||
var serInfo = new SerializationInfo( type, new FormatterConverter() );
|
var serInfo = new SerializationInfo(type, new FormatterConverter());
|
||||||
|
|
||||||
ser.GetObjectData( serInfo, Context );
|
ser.GetObjectData( serInfo, Context );
|
||||||
|
|
||||||
@ -660,7 +660,7 @@ namespace lib
|
|||||||
{
|
{
|
||||||
String name = serMember.Name;
|
String name = serMember.Name;
|
||||||
|
|
||||||
name = scr.TypeToIdentifier( name );
|
name = refl.TypeToIdentifier( name );
|
||||||
|
|
||||||
Serialize( writer, serMember.Value, name, true );
|
Serialize( writer, serMember.Value, name, true );
|
||||||
}
|
}
|
||||||
@ -672,14 +672,14 @@ namespace lib
|
|||||||
else
|
else
|
||||||
//*/
|
//*/
|
||||||
{
|
{
|
||||||
var fields = scr.GetAllFields( type );
|
var fields = refl.GetAllFields(type);
|
||||||
|
|
||||||
//MemberInfo[] miArr = FormatterServices.GetSerializableMembers( type, Context );
|
//MemberInfo[] miArr = FormatterServices.GetSerializableMembers( type, Context );
|
||||||
|
|
||||||
foreach( var childFi in fields )
|
foreach( var childFi in fields )
|
||||||
{
|
{
|
||||||
|
|
||||||
object[] objs = childFi.GetCustomAttributes( typeof( NonSerializedAttribute ), true );
|
object[] objs = childFi.GetCustomAttributes(typeof(NonSerializedAttribute), true);
|
||||||
|
|
||||||
if( objs.Length > 0 )
|
if( objs.Length > 0 )
|
||||||
{
|
{
|
||||||
@ -688,7 +688,7 @@ namespace lib
|
|||||||
|
|
||||||
String name = childFi.Name;
|
String name = childFi.Name;
|
||||||
|
|
||||||
name = scr.TypeToIdentifier( name );
|
name = refl.TypeToIdentifier( name );
|
||||||
|
|
||||||
Serialize( writer, childFi.GetValue( root ), name, false );
|
Serialize( writer, childFi.GetValue( root ), name, false );
|
||||||
}
|
}
|
||||||
@ -708,7 +708,7 @@ namespace lib
|
|||||||
|
|
||||||
bool first;
|
bool first;
|
||||||
|
|
||||||
long refInt = m_objectID.GetId( root, out first );
|
long refInt = m_objectID.GetId(root, out first);
|
||||||
|
|
||||||
if( m_cfg.datastructure == Datastructure.Full )
|
if( m_cfg.datastructure == Datastructure.Full )
|
||||||
{
|
{
|
||||||
|
|||||||
@ -6,7 +6,7 @@ using System.Threading;
|
|||||||
namespace lib
|
namespace lib
|
||||||
{
|
{
|
||||||
|
|
||||||
public class MicroStopwatch : System.Diagnostics.Stopwatch
|
public class MicroStopwatch: System.Diagnostics.Stopwatch
|
||||||
{
|
{
|
||||||
readonly double _microSecPerTick
|
readonly double _microSecPerTick
|
||||||
= 1000000D / System.Diagnostics.Stopwatch.Frequency;
|
= 1000000D / System.Diagnostics.Stopwatch.Frequency;
|
||||||
@ -189,7 +189,7 @@ namespace lib
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// MicroTimer Event Argument class
|
/// MicroTimer Event Argument class
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MicroTimerEventArgs : EventArgs
|
public class MicroTimerEventArgs: EventArgs
|
||||||
{
|
{
|
||||||
// Simple counter, number times timed event (callback function) executed
|
// Simple counter, number times timed event (callback function) executed
|
||||||
public int TimerCount { get; private set; }
|
public int TimerCount { get; private set; }
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user