/*
Media File XStream, Network file stream server supporting XBMSP
Copyright (C) 2004 j3g
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 2 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, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
This project can be found on SourceForge.
http://sourceforge.net/projects/mfxstream
*/
using System;
using System.Net.Sockets;
namespace MediaStream{
/// <summary>
///
/// </summary>
public class CXBMSPHandler : CXBMSPUtility
{
public CXBMSPHandler()
{
}
public void AcceptHandler(CIPConnection pConn)
{
pConn.Send(StringToByteArray("XBMSP-1.0 1.0 Media File XStream Server " + "" + "\n"));
}
public void MessageHandler(CIPConnection pConn, Int32 iNumberOfBytes)
{
XBMSPClient xsMessage = (XBMSPClient) pConn.GetMessage[4];
Byte [] xsMsgId = GetByteArray(pConn.GetMessage, 5, 4);
// Checking for init message.
if (XBMSPClient.XBMSP_PACKET_INIT == xsMessage)
{
// Log(System.Text.ASCIIEncoding.ASCII.GetString(pConn.GetMessage, 0, pConn.GetMessage.Length));
return;
}
else
// Log(xsMessage.ToString());
try
{
if (!CheckAuthentication(pConn, xsMsgId, xsMessage)) return;
switch (xsMessage)
{
case XBMSPClient.XBMSP_PACKET_NULL : SendPacketOk(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_SETCWD : HandlePacketSetCwd(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_FILELIST_OPEN : HandlePacketFileListOpen(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_FILELIST_READ : HandlePacketFileListRead(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_FILE_INFO : HandlePacketFileInfo(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_FILE_OPEN : HandlePacketFileOpen(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_FILE_READ : HandlePacketFileRead(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_FILE_SEEK : HandlePacketFileSeek(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_CLOSE : HandlePacketClose(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_CLOSE_ALL : HandlePacketCloseAll(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_SET_CONFIGURATION_OPTION : SendPacketError(pConn, xsMsgId,XBMSPError.XBMSP_ERROR_INVALID_OPTION_VALUE,""); break;
case XBMSPClient.XBMSP_PACKET_AUTHENTICATION_INIT : HandlePacketAuthenticationInit(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_AUTHENTICATE : HandlePacketAuthenticate(pConn, xsMsgId); break;
case XBMSPClient.XBMSP_PACKET_UPCWD : HandlePacketUpCwd(pConn, xsMsgId); break;
default : SendPacketError(pConn, xsMsgId,XBMSPError.XBMSP_ERROR_UNSUPPORTED, ""); break;
}
}
catch (Exception e)
{
CLogFile.Log(xsMessage.ToString() + ": " + e.Message, this.ToString(), LogLevel.Error);
SendPacketError(pConn, xsMsgId, XBMSPError.XBMSP_ERROR_FAILURE,"");
}
}
}
/// <summary>
///
/// </summary>
public class CXBMSPStream : CIPListener
{
private static CShares _xsMasterShares;
public CXBMSPStream()
{
}
public void CreateFileAndFolderCount()
{
int nFiles = 0, nFolders = 0;
_xsMasterShares.GetFileAndFolderCount(out nFiles, out nFolders);
CSettings.SharedFileCount = nFiles;
CSettings.SharedFolderCount = nFolders;
}
public void Start()
{
if (!System.IO.File.Exists(CSettings.GetSharesFilePath))
{
throw(new Exception("Can not start server whitout a Share file."));
}
_xsMasterShares = new CShares();
base.GetMessageHandler = new CIPListener.MESSAGE_HANDLER(MessageHandler);
base.GetAcceptHandler = new CIPListener.ACCEPT_HANDLER(AcceptHandler);
base.GetCloseHandler = new CIPListener.CLOSE_HANDLER(CloseHandler);
base.GetErrorHandler = new CIPListener.ERROR_HANDLER(ErrorHandler);
base.Start(CSettings.GetServerIPAddress, CSettings.GetPortNumber, CSettings.GetMaxClientConnections, CSettings.GetClientBufferSize, ProtocolType.Tcp);
}
public void Start(Int16 nPort, Int32 nMaxConnections, Int32 nMessageBufferSize)
{
if (!System.IO.File.Exists(CSettings.GetSharesFilePath))
{
throw(new Exception("Can not start server whitout a Share file."));
}
_xsMasterShares = new CShares();
base.GetMessageHandler = new CIPListener.MESSAGE_HANDLER(MessageHandler);
base.GetAcceptHandler = new CIPListener.ACCEPT_HANDLER(AcceptHandler);
base.GetCloseHandler = new CIPListener.CLOSE_HANDLER(CloseHandler);
base.GetErrorHandler = new CIPListener.ERROR_HANDLER(ErrorHandler);
base.Start(CSettings.GetServerIPAddress, nPort, nMaxConnections, nMessageBufferSize, ProtocolType.Tcp);
}
static public void AcceptHandler(CIPConnection pConn)
{
CXBMSPHandler xsHandler = new CXBMSPHandler();
xsHandler.GetShares = _xsMasterShares;
pConn.GetStateObject = xsHandler;
xsHandler.AcceptHandler(pConn);
CLogFile.Log("Connected.", "CXBMSPStream", LogLevel.Information);
}
static public void CloseHandler(CIPConnection pConn)
{
pConn.GetStateObject = null;
CLogFile.Log("Connection closed.", "CXBMSPStream",LogLevel.Information);
}
static public void ErrorHandler(CIPConnection pConn, Exception pException)
{
CLogFile.Log("Connection Error: " + pException.Message, "CXBMSPStream",LogLevel.Error);
}
static public void MessageHandler(CIPConnection pConn, Int32 iNumberOfBytes)
{
CXBMSPHandler xsHandler = (CXBMSPHandler) pConn.GetStateObject;
xsHandler.MessageHandler(pConn, iNumberOfBytes);
}
public override void Stop()
{
base.Stop();
if (null != _xsMasterShares)
_xsMasterShares.Close();
_xsMasterShares = null;
}
}
}
|