Updates to SharpLib

This commit is contained in:
Marc Hernandez 2021-06-17 01:47:52 -07:00
parent 26716c6648
commit 2844950af3
22 changed files with 2380 additions and 2494 deletions

5
.gitignore vendored
View File

@ -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

View File

@ -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}" ) );
} }
} }

1232
Id.cs

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,7 @@
<ItemGroup> <ItemGroup>
<Folder Include="Properties\" /> <Folder Include="Properties\" />
<Folder Include="reflect\" />
</ItemGroup> </ItemGroup>

108
Token.cs
View File

@ -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;
} }
} }

View File

@ -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>

View File

@ -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 );
} }

View File

@ -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
{ {
} }
} }

View File

@ -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
{ {
} }
} }

View File

@ -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();

View File

@ -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();

File diff suppressed because it is too large Load Diff

View File

@ -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";
} }

View File

@ -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;
} }
} }

View File

@ -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
} }

View File

@ -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 ) );

View File

@ -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;
} }

View File

@ -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
} }
} }

View File

@ -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 )

View File

@ -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();
} }
} }
} }

View File

@ -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 )
{ {

View File

@ -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; }