[DispIdAttribute(21)]
public int ProtocolSubStatus { get; }
An integer that represents the protocol-specific substatus error code.
If the integer is zero it indicates that no additional error information is available. Currently all protocols return zero for substatus. This may change in future releases of the toolkit.
If the method fails, an error is raised. For more information, refer to the Error Codes.
using Leadtools;
using Leadtools.MediaStreaming;
enum W3CLOG
{
date = 0x00000001,
time = 0x00000002,
c_ip = 0x00000004,
cs_username = 0x00000008,
s_sitename = 0x00000010,
s_computername = 0x00000020,
s_ip = 0x00000040,
s_port = 0x00000080,
cs_method = 0x00000100,
cs_uri_stem = 0x00000200,
cs_uri_query = 0x00000400,
sc_status = 0x00000800,
sc_win32_status = 0x00001000,
sc_bytes = 0x00002000,
cs_bytes = 0x00004000,
time_taken = 0x00008000,
cs_version = 0x00010000,
cs_host = 0x00020000,
cs_user_agent = 0x00040000,
cs_cookie = 0x00080000,
cs_referer = 0x00100000,
sc_substatus = 0x00200000,
};
public class CW3CLogHandler : ILtmsLogHandler
{
bool m_enable;
int m_fields;
bool m_localtime;
DateTime m_dtfile;
string m_software;
string m_folder;
string m_prefix;
StreamWriter m_sw;
public CW3CLogHandler(string prefix, string software, bool enable, string folder, int fields, bool localtime)
{
m_prefix = prefix;
m_software = software;
m_enable = enable;
m_folder = folder;
m_fields = fields;
m_localtime = localtime;
}
~CW3CLogHandler()
{
}
void WriteString(string str)
{
m_sw.Write(str);
}
DateTime GetTime(double dTime)
{
DateTime dt = DateTime.FromOADate(dTime);
if (m_localtime)
return dt.ToLocalTime();
return dt;
}
string GetLogPath(double timestamp)
{
DateTime dt = GetTime(timestamp);
string strFullPath;
try
{
PathResolver resolver = new PathResolver();
strFullPath = resolver.Resolve(m_folder);
}
catch
{
return "";
}
strFullPath += "\\";
strFullPath += m_prefix;
if (!m_localtime)
{
strFullPath += dt.ToString("y-MM-dd-HH-mm-ss").Replace("-", "") + "UTC.log";
}
else
{
strFullPath += dt.ToString("y-MM-dd-HH-mm-ss").Replace("-", "") + ".log";
}
return strFullPath;
}
public void LoadConfig(Server server)
{
bool enable = m_enable;
bool localtime = m_localtime;
string folder = m_folder;
int fields = m_fields;
bool dirty = false;
ApplicationProperties AppProps = server.GetApplicationProperties();
try
{
enable = AppProps.GetBoolean("LogEnable");
}
catch
{
AppProps.AddBoolean("LogEnable", enable);
dirty = true;
}
try
{
localtime = AppProps.GetBoolean("LogLocalTime");
}
catch
{
AppProps.AddBoolean("LogLocalTime", localtime);
dirty = true;
}
try
{
folder = AppProps.GetString("LogFolder");
}
catch
{
AppProps.AddString("LogFolder", folder);
dirty = true;
}
try
{
fields = AppProps.GetInteger("LogFields");
}
catch
{
AppProps.AddInteger("LogFields", fields);
dirty = true;
}
if (dirty)
server.SetApplicationProperties(AppProps);
// if anything has changed then we need to close the current file
if (!enable && (string.Compare(m_folder, folder, true) != 0) || fields != m_fields || m_localtime != localtime)
{
if (m_sw != null)
m_sw.Close();
}
m_folder = folder;
m_localtime = localtime;
m_enable = enable;
m_fields = fields;
}
bool CreateLog(double timestamp)
{
if (m_sw != null)
m_sw.Close();
if (!m_enable)
return false;
try
{
m_sw = File.CreateText(GetLogPath(timestamp));
}
catch
{
return false;
}
m_dtfile = GetTime(timestamp);
string s;
s = "#Software: " + m_software + "\r\n";
WriteString(s);
WriteString("#Version: 1.0\r\n");
DateTime dt = GetTime(timestamp);
s = "#Date: " + dt.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n";
WriteString(s);
s = "#Fields:";
if ((m_fields & (int)W3CLOG.date) == (int)W3CLOG.date)
{
s += " date";
}
if ((m_fields & (int)W3CLOG.time) == (int)W3CLOG.time)
{
s += " time";
}
if ((m_fields & (int)W3CLOG.s_sitename) == (int)W3CLOG.s_sitename)
{
s += " s-sitename";
}
if ((m_fields & (int)W3CLOG.s_computername) == (int)W3CLOG.s_computername)
{
s += " s-computername";
}
if ((m_fields & (int)W3CLOG.s_ip) == (int)W3CLOG.s_ip)
{
s += " s-ip";
}
if ((m_fields & (int)W3CLOG.cs_method) == (int)W3CLOG.cs_method)
{
s += " cs-method";
}
if ((m_fields & (int)W3CLOG.cs_uri_stem) == (int)W3CLOG.cs_uri_stem)
{
s += " cs-uri-stem";
}
if ((m_fields & (int)W3CLOG.cs_uri_query) == (int)W3CLOG.cs_uri_query)
{
s += " cs-uri-query";
}
if ((m_fields & (int)W3CLOG.s_port) == (int)W3CLOG.s_port)
{
s += " s-port";
}
if ((m_fields & (int)W3CLOG.cs_username) == (int)W3CLOG.cs_username)
{
s += " cs-username";
}
if ((m_fields & (int)W3CLOG.c_ip) == (int)W3CLOG.c_ip)
{
s += " c-ip";
}
if ((m_fields & (int)W3CLOG.cs_version) == (int)W3CLOG.cs_version)
{
s += " cs-version";
}
if ((m_fields & (int)W3CLOG.cs_user_agent) == (int)W3CLOG.cs_user_agent)
{
s += " cs(User-Agent)";
}
if ((m_fields & (int)W3CLOG.cs_cookie) == (int)W3CLOG.cs_cookie)
{
s += " cs(Cookie)";
}
if ((m_fields & (int)W3CLOG.cs_referer) == (int)W3CLOG.cs_referer)
{
s += " cs(Referer)";
}
if ((m_fields & (int)W3CLOG.cs_host) == (int)W3CLOG.cs_host)
{
s += " cs-host";
}
if ((m_fields & (int)W3CLOG.sc_status) == (int)W3CLOG.sc_status)
{
s += " sc-status";
}
if ((m_fields & (int)W3CLOG.sc_substatus) == (int)W3CLOG.sc_substatus)
{
s += " sc-substatus";
}
if ((m_fields & (int)W3CLOG.sc_win32_status) == (int)W3CLOG.sc_win32_status)
{
s += " sc-win32-status";
}
if ((m_fields & (int)W3CLOG.sc_bytes) == (int)W3CLOG.sc_bytes)
{
s += " sc-bytes";
}
if ((m_fields & (int)W3CLOG.cs_bytes) == (int)W3CLOG.cs_bytes)
{
s += " cs-bytes";
}
if ((m_fields & (int)W3CLOG.time_taken) == (int)W3CLOG.time_taken)
{
s += " time-taken";
}
s += "\r\n";
WriteString(s);
m_sw.Flush();
return true;
}
string escape(string s)
{
string t = "";
foreach (char c in s)
{
if (!char.IsControl(c) && !char.IsWhiteSpace(c))
t += c;
else
t += "+";
}
return t;
}
public void InitializeLog(double timestamp)
{
CreateLog(timestamp);
}
public void TerminateLog()
{
if (m_sw != null)
m_sw.Close();
}
public void LogInformation(ILtmsLogInformation info)
{
string s = "";
if (!m_enable)
return;
// check if we need to roll to a new file
{
DateTime dt = GetTime(info.TimeStamp);
if (m_sw == null || dt.Day != m_dtfile.Day || dt.Month != m_dtfile.Month || dt.Year != m_dtfile.Year)
{
if (!CreateLog(info.TimeStamp))
return;
}
}
if ((m_fields & (int)W3CLOG.date) == (int)W3CLOG.date)
{
DateTime dt = GetTime(info.TimeStamp);
if (s.Length > 0)
s += " ";
s += dt.ToString("yyyy-MM-dd");
}
if ((m_fields & (int)W3CLOG.time) == (int)W3CLOG.time)
{
DateTime dt = GetTime(info.TimeStamp);
if (s.Length > 0)
s += " ";
s += dt.ToString("HH:mm:ss");
}
if ((m_fields & (int)W3CLOG.s_sitename) == (int)W3CLOG.s_sitename)
{
string str = info.SiteName;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.s_computername) == (int)W3CLOG.s_computername)
{
string str = info.ComputerName;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.s_ip) == (int)W3CLOG.s_ip)
{
string str = info.ServerIP;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.cs_method) == (int)W3CLOG.cs_method)
{
string str = info.Method;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.cs_uri_stem) == (int)W3CLOG.cs_uri_stem)
{
string str = info.URIStem;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.cs_uri_query) == (int)W3CLOG.cs_uri_query)
{
string str = info.URIQuery;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.s_port) == (int)W3CLOG.s_port)
{
int n = info.ServerPort;
if (s.Length > 0)
s += " ";
s += n.ToString();
}
if ((m_fields & (int)W3CLOG.cs_username) == (int)W3CLOG.cs_username)
{
string str = info.UserName;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.c_ip) == (int)W3CLOG.c_ip)
{
string str = info.ClientIP;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.cs_version) == (int)W3CLOG.cs_version)
{
string str = info.ProtocolVersion;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.cs_user_agent) == (int)W3CLOG.cs_user_agent)
{
string str = info.UserAgent;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.cs_cookie) == (int)W3CLOG.cs_cookie)
{
string str = info.Cookie;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.cs_referer) == (int)W3CLOG.cs_referer)
{
string str = info.Referrer;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.cs_host) == (int)W3CLOG.cs_host)
{
string str = info.Host;
if (s.Length > 0)
s += " ";
if (str.Length == 0)
s += "-";
else
s += escape(str);
}
if ((m_fields & (int)W3CLOG.sc_status) == (int)W3CLOG.sc_status)
{
int n = info.Status;
if (s.Length > 0)
s += " ";
s += n.ToString();
}
if ((m_fields & (int)W3CLOG.sc_substatus) == (int)W3CLOG.sc_substatus)
{
int n = info.ProtocolSubStatus;
if (s.Length > 0)
s += " ";
s += n.ToString();
}
if ((m_fields & (int)W3CLOG.sc_win32_status) == (int)W3CLOG.sc_win32_status)
{
int n = info.Win32Status;
if (s.Length > 0)
s += " ";
s += n.ToString();
}
if ((m_fields & (int)W3CLOG.sc_bytes) == (int)W3CLOG.sc_bytes)
{
int n = info.BytesSent;
if (s.Length > 0)
s += " ";
if (n < 0)
s += "-";
else
s += n.ToString();
}
if ((m_fields & (int)W3CLOG.cs_bytes) == (int)W3CLOG.cs_bytes)
{
int n = info.BytesReceived;
if (s.Length > 0)
s += " ";
if (n < 0)
s += "-";
else
s += n.ToString();
}
if ((m_fields & (int)W3CLOG.time_taken) == (int)W3CLOG.time_taken)
{
int n = info.TimeTaken;
if (s.Length > 0)
s += " ";
if (n < 0)
s += "-";
else
s += n.ToString();
}
s += "\r\n";
WriteString(s);
m_sw.Flush();
}
}
public Server _server = null;
public bool _result = false;
public void W3CLogHandlerExample()
{
try
{
State enumState;
CW3CLogHandler _loghandler;
// create an instance of the server object
_server = new Leadtools.MediaStreaming.Server();
// create the log handler
_loghandler = new CW3CLogHandler("ltmsServer_", "LEADTOOLS Media Streaming Server", true, "%ltmsLogFolder%", 0, false);
// set the log handler
_server.ILogHandler = _loghandler;
{
// for demonstration, compare the interface we just set
ILtmsLogHandler ihandler = null;
ihandler = _server.ILogHandler;
if (ihandler != (ILtmsLogHandler)_loghandler)
{
_result = false;
return;
}
}
// Run with the server's default settings
// or uncomment this section to load the config file located in the config subfolder under the executable folder
//_server.ImportConfigFile("%ltmsConfigFolder%\\LeadtoolsMediaStreamingServer.xml");
// start the server
_server.Start();
// confirm the running state for demonstration purposes
enumState = _server.State;
if (enumState == State.Started)
{
// display a message that the server is running and wait for OK
MessageBox.Show("The server has started. Press OK to stop.", "LEADTOOLS Media Streaming Examples", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
// stop the server
_server.Stop();
// remove the log handler
_server.ILogHandler = null;
_result = true;
}
catch (Exception)
{
_result = false;
}
}