Ported .Net Core commits:

hondacrx:
- Initial commit: Switch to .Net Core 2.0
- Fix build and removed not needed files
Fabi:
- Updated solution platforms.
- Changed folder structure.
- Change library target framework to netstandard2.0.
- Updated solution platforms again...
- Removed windows specific kernel32 function usage (Ctrl-C handler).
This commit is contained in:
Fabian
2017-10-26 17:23:44 +02:00
parent 227702e19c
commit a3dc7b3f48
844 changed files with 26064 additions and 1824 deletions
+238
View File
@@ -0,0 +1,238 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Database;
using System;
using System.IO;
using System.Text;
class ConsoleAppender : Appender
{
public ConsoleAppender(byte id, string name, LogLevel level, AppenderFlags flags) : base(id, name, level, flags)
{
_consoleColor = new[]
{
ConsoleColor.White,
ConsoleColor.White,
ConsoleColor.Gray,
ConsoleColor.Green,
ConsoleColor.Yellow,
ConsoleColor.Red,
ConsoleColor.Blue
};
}
public override void _write(LogMessage message)
{
Console.ForegroundColor = _consoleColor[(int)message.level];
Console.WriteLine(message.prefix + message.text);
Console.ResetColor();
}
public override AppenderType GetAppenderType()
{
return AppenderType.Console;
}
ConsoleColor[] _consoleColor;
}
class FileAppender : Appender, IDisposable
{
public FileAppender(byte id, string name, LogLevel level, string fileName, string logDir, AppenderFlags flags) : base(id, name, level, flags)
{
Directory.CreateDirectory(logDir);
_fileName = fileName;
_logDir = logDir;
_dynamicName = _fileName.Contains("{0}");
if (_dynamicName)
{
Directory.CreateDirectory(logDir + "/" + _fileName.Substring(0, _fileName.IndexOf('/') + 1));
return;
}
_logStream = OpenFile(_fileName, FileMode.Create);
}
FileStream OpenFile(string filename, FileMode mode)
{
return new FileStream(_logDir + "/" + filename, mode, FileAccess.Write, FileShare.ReadWrite);
}
public override void _write(LogMessage message)
{
lock (locker)
{
var logBytes = Encoding.Unicode.GetBytes(message.prefix + message.text + "\r\n");
if (_dynamicName)
{
var logStream = OpenFile(string.Format(_fileName, message.dynamicName), FileMode.Append);
logStream.Write(logBytes, 0, logBytes.Length);
logStream.Flush();
logStream.Close();
return;
}
_logStream.Write(logBytes, 0, logBytes.Length);
_logStream.Flush();
}
}
public override AppenderType GetAppenderType()
{
return AppenderType.File;
}
#region IDisposable Support
private bool disposedValue = false;
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
_logStream.Dispose();
}
disposedValue = true;
}
}
public void Dispose()
{
Dispose(true);
}
#endregion
string _fileName;
string _logDir;
bool _dynamicName;
FileStream _logStream;
object locker = new object();
}
class DBAppender : Appender
{
public DBAppender(byte id, string name, LogLevel level) : base(id, name, level) { }
public override void _write(LogMessage message)
{
// Avoid infinite loop, PExecute triggers Logging with "sql.sql" type
if (!enabled || message.type == LogFilter.Sql)
return;
PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.INS_LOG);
stmt.AddValue(0, Time.DateTimeToUnixTime(message.mtime));
stmt.AddValue(1, realmId);
stmt.AddValue(2, message.type);
stmt.AddValue(3, (byte)message.level);
stmt.AddValue(4, message.text);
DB.Login.Execute(stmt);
}
public override AppenderType GetAppenderType()
{
return AppenderType.DB;
}
public override void setRealmId(uint _realmId)
{
enabled = true;
realmId = _realmId;
}
uint realmId;
bool enabled;
}
abstract class Appender
{
public Appender(byte id, string name, LogLevel level = LogLevel.Disabled, AppenderFlags flags = AppenderFlags.None)
{
_id = id;
_name = name;
_level = level;
_flags = flags;
}
public void Write(LogMessage message)
{
if (_level == LogLevel.Disabled || _level > message.level)
return;
StringBuilder ss = new StringBuilder();
if (_flags.HasAnyFlag(AppenderFlags.PrefixTimestamp))
ss.AppendFormat("{0} ", message.mtime.ToString("MM/dd/yyyy HH:mm:ss"));
if (_flags.HasAnyFlag(AppenderFlags.PrefixLogLevel))
ss.AppendFormat("{0}: ", message.level);
if (_flags.HasAnyFlag(AppenderFlags.PrefixLogFilterType))
ss.AppendFormat("[{0}] ", message.type);
message.prefix = ss.ToString();
_write(message);
}
public abstract void _write(LogMessage message);
public byte getId()
{
return _id;
}
public string getName()
{
return _name;
}
public abstract AppenderType GetAppenderType();
public virtual void setRealmId(uint realmId) { }
public void setLogLevel(LogLevel level)
{
_level = level;
}
byte _id;
string _name;
LogLevel _level;
AppenderFlags _flags;
}
class LogMessage
{
public LogMessage(LogLevel _level, LogFilter _type, string _text)
{
level = _level;
type = _type;
text = _text;
mtime = DateTime.Now;
}
public LogLevel level;
public LogFilter type;
public string text;
public string prefix;
public string dynamicName;
public DateTime mtime;
}
+436
View File
@@ -0,0 +1,436 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Collections;
using Framework.Configuration;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
public class Log
{
static Log()
{
m_logsDir = ConfigMgr.GetDefaultValue("LogsDir", "");
foreach (var appenderName in ConfigMgr.GetKeysByString("Appender."))
{
CreateAppenderFromConfig(appenderName);
}
foreach (var loggerName in ConfigMgr.GetKeysByString("Logger."))
{
CreateLoggerFromConfig(loggerName);
}
// Bad config configuration, creating default config
if (!loggers.ContainsKey(LogFilter.Server))
{
Console.WriteLine("Wrong Loggers configuration. Review your Logger config section.\nCreating default loggers [Server (Info)] to console\n");
loggers.Clear();
appenders.Clear();
byte id = NextAppenderId();
var appender = new ConsoleAppender(id, "Console", LogLevel.Debug, AppenderFlags.None);
appenders[id] = appender;
var serverLogger = new Logger("Server", LogLevel.Error);
serverLogger.addAppender(id, appender);
loggers[LogFilter.Server] = serverLogger;
}
outInfo(LogFilter.Server, @" ____ __ ");
outInfo(LogFilter.Server, @"/\ _`\ /\ \ ");
outInfo(LogFilter.Server, @"\ \ \/\_\ __ __ _____\ \ \___ __ _ __ ");
outInfo(LogFilter.Server, @" \ \ \/_/_/\ \/\ \/\ '__`\ \ _ `\ /'__`\/\`'__\");
outInfo(LogFilter.Server, @" \ \ \L\ \ \ \_\ \ \ \L\ \ \ \ \ \/\ __/\ \ \/ ");
outInfo(LogFilter.Server, @" \ \____/\/`____ \ \ ,__/\ \_\ \_\ \____\\ \_\ ");
outInfo(LogFilter.Server, @" \/___/ `/___/> \ \ \/ \/_/\/_/\/____/ \/_/ ");
outInfo(LogFilter.Server, @" /\___/\ \_\ ");
outInfo(LogFilter.Server, @" \/__/ \/_/ Core");
outInfo(LogFilter.Server, "\r");
}
static bool ShouldLog(LogFilter type, LogLevel level)
{
Logger logger = GetLoggerByType(type);
if (logger == null)
return false;
LogLevel logLevel = logger.getLogLevel();
return logLevel != LogLevel.Disabled && logLevel <= level;
}
public static void outInfo(LogFilter type, string text, params object[] args)
{
if (!ShouldLog(type, LogLevel.Info))
return;
outMessage(type, LogLevel.Info, text, args);
}
public static void outWarn(LogFilter type, string text, params object[] args)
{
if (!ShouldLog(type, LogLevel.Warn))
return;
outMessage(type, LogLevel.Warn, text, args);
}
[Conditional("DEBUG")]
public static void outDebug(LogFilter type, string text, params object[] args)
{
if (!ShouldLog(type, LogLevel.Debug))
return;
outMessage(type, LogLevel.Debug, text, args);
}
public static void outError(LogFilter type, string text, params object[] args)
{
if (!ShouldLog(type, LogLevel.Error))
return;
outMessage(type, LogLevel.Error, text, args);
}
public static void outException(Exception ex, [CallerMemberName]string memberName = "")
{
if (!ShouldLog(LogFilter.Server, LogLevel.Fatal))
return;
outMessage(LogFilter.Server, LogLevel.Fatal, "MemberName: {0} ExceptionMessage: {1}", memberName, ex.Message);
}
public static void outFatal(LogFilter type, string text, params object[] args)
{
if (!ShouldLog(type, LogLevel.Fatal))
return;
outMessage(type, LogLevel.Fatal, text, args);
}
public static void outTrace(LogFilter type, string text, params object[] args)
{
if (!ShouldLog(type, LogLevel.Trace))
return;
outMessage(type, LogLevel.Trace, text, args);
}
public static void outCommand(uint accountId, string text, params object[] args)
{
if (!ShouldLog(LogFilter.Commands, LogLevel.Info))
return;
var msg = new LogMessage(LogLevel.Info, LogFilter.Commands, string.Format(text, args));
msg.dynamicName = accountId.ToString();
Logger logger = GetLoggerByType(LogFilter.Commands);
logger.write(msg);
}
static void outMessage(LogFilter type, LogLevel level, string text, params object[] args)
{
Logger logger = GetLoggerByType(type);
logger.write(new LogMessage(level, type, string.Format(text, args)));
}
static byte NextAppenderId()
{
return AppenderId++;
}
static void CreateAppenderFromConfig(string appenderName)
{
if (string.IsNullOrEmpty(appenderName))
return;
string options = ConfigMgr.GetDefaultValue(appenderName, "");
var tokens = new StringArray(options, ',');
string name = appenderName.Substring(9);
if (tokens.Length < 2)
{
Console.WriteLine("Log.CreateAppenderFromConfig: Wrong configuration for appender {0}. Config line: {1}", name, options);
return;
}
AppenderFlags flags = AppenderFlags.None;
AppenderType type = (AppenderType)uint.Parse(tokens[0]);
LogLevel level = (LogLevel)uint.Parse(tokens[1]);
if (level > LogLevel.Fatal)
{
Console.WriteLine("Log.CreateAppenderFromConfig: Wrong Log Level {0} for appender {1}\n", level, name);
return;
}
if (tokens.Length > 2)
flags = (AppenderFlags)uint.Parse(tokens[2]);
byte id = NextAppenderId();
switch (type)
{
case AppenderType.Console:
{
var appender = new ConsoleAppender(id, name, level, flags);
appenders[id] = appender;
break;
}
case AppenderType.File:
{
string filename = "";
if (tokens.Length < 4)
{
if (name != "Server")
{
Console.WriteLine("Log.CreateAppenderFromConfig: Missing file name for appender {0}", name);
return;
}
filename = Process.GetCurrentProcess().ProcessName + ".log";
}
else
filename = tokens[3];
appenders[id] = new FileAppender(id, name, level, filename, m_logsDir, flags);
break;
}
case AppenderType.DB:
{
appenders[id] = new DBAppender(id, name, level);
break;
}
default:
Console.WriteLine("Log.CreateAppenderFromConfig: Unknown type {0} for appender {1}", type, name);
break;
}
}
static void CreateLoggerFromConfig(string appenderName)
{
if (string.IsNullOrEmpty(appenderName))
return;
LogLevel level = LogLevel.Disabled;
string name = appenderName.Substring(7);
string options = ConfigMgr.GetDefaultValue(appenderName, "");
if (string.IsNullOrEmpty(options))
{
Console.WriteLine("Log.CreateLoggerFromConfig: Missing config option Logger.{0}", name);
return;
}
var tokens = new StringArray(options, ',');
LogFilter type = name.ToEnum<LogFilter>();
if (loggers.ContainsKey(type))
{
Console.WriteLine("Error while configuring Logger {0}. Already defined", name);
return;
}
level = (LogLevel)uint.Parse(tokens[0]);
if (level > LogLevel.Fatal)
{
Console.WriteLine("Log.CreateLoggerFromConfig: Wrong Log Level {0} for logger {1}", type, name);
return;
}
Logger logger = new Logger(name, level);
int i = 0;
var ss = new StringArray(tokens[1], ' ');
while (i < ss.Length)
{
var str = ss[i++];
Appender appender = GetAppenderByName(str);
if (appender == null)
Console.WriteLine("Error while configuring Appender {0} in Logger {1}. Appender does not exist", str, name);
else
logger.addAppender(appender.getId(), appender);
}
loggers[type] = logger;
}
static Appender GetAppenderByName(string name)
{
return appenders.First(p => p.Value.getName() == name).Value;
}
static Logger GetLoggerByType(LogFilter type)
{
if (loggers.ContainsKey(type))
return loggers[type];
string typeString = type.ToString();
int index = 1;
for (; index < typeString.Length - 1; ++index)
{
if (char.IsUpper(typeString[index]))
break;
}
typeString = typeString.Substring(0, index);
if (typeString.IsEmpty())
return null;
LogFilter parentLogger;
if (!Enum.TryParse(typeString, out parentLogger))
return null;
return GetLoggerByType(parentLogger);
}
public static bool SetLogLevel(string name, string newLevelc, bool isLogger = true)
{
LogLevel newLevel = (LogLevel)uint.Parse(newLevelc);
if (newLevel < 0)
return false;
if (isLogger)
{
foreach (var logger in loggers.Values)
{
if (logger.getName() == name)
{
logger.setLogLevel(newLevel);
return true;
}
}
return false;
}
else
{
Appender appender = GetAppenderByName(name);
if (appender == null)
return false;
appender.setLogLevel(newLevel);
}
return true;
}
public static void SetRealmId(uint id)
{
foreach (var appender in appenders.Values)
appender.setRealmId(id);
}
static string GetLogsDir() { return m_logsDir; }
static Dictionary<byte, Appender> appenders = new Dictionary<byte, Appender>();
static Dictionary<LogFilter, Logger> loggers = new Dictionary<LogFilter, Logger>();
static string m_logsDir;
static byte AppenderId;
}
enum AppenderType
{
None,
Console,
File,
DB
}
[Flags]
enum AppenderFlags
{
None = 0x00,
PrefixTimestamp = 0x01,
PrefixLogLevel = 0x02,
PrefixLogFilterType = 0x04,
}
enum LogLevel
{
Disabled = 0,
Trace = 1,
Debug = 2,
Info = 3,
Warn = 4,
Error = 5,
Fatal = 6,
Max = 6
}
public enum LogFilter
{
Misc,
Achievement,
Addon,
Ahbot,
AreaTrigger,
Arena,
Auctionhouse,
Battlefield,
Battleground,
BattlegroundReportPvpAfk,
Calendar,
ChatLog,
ChatSystem,
Cheat,
Commands,
Condition,
Garrison,
Gameevent,
Guild,
Lfg,
Loot,
MapsScript,
Maps,
Movement,
Network,
Outdoorpvp,
Pet,
Player,
PlayerCharacter,
PlayerDump,
PlayerItems,
PlayerLoading,
PlayerSkills,
Pool,
Rbac,
Realmlist,
Scenario,
Scenes,
Scripts,
ScriptsAi,
Server,
ServerLoading,
ServiceProtobuf,
Session,
SessionRpc,
Spells,
SpellsPeriodic,
Sql,
SqlDev,
SqlDriver,
SqlUpdates,
Transport,
Unit,
Vehicle,
Warden,
}
+65
View File
@@ -0,0 +1,65 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System.Collections.Generic;
class Logger
{
public Logger(string _name, LogLevel _level)
{
name = _name;
level = _level;
}
public void addAppender(byte id, Appender appender)
{
appenders[id] = appender;
}
public void delAppender(byte id)
{
appenders.Remove(id);
}
public void setLogLevel(LogLevel _level)
{
level = _level;
}
public string getName()
{
return name;
}
public LogLevel getLogLevel()
{
return level;
}
public void write(LogMessage message)
{
if (level == 0 || level > message.level || string.IsNullOrEmpty(message.text))
return;
foreach (var appender in appenders.Values)
appender.Write(message);
}
string name;
LogLevel level;
Dictionary<byte, Appender> appenders = new Dictionary<byte, Appender>();
}