CASA/c_micasad/init/AppHandler.cs
2006-02-01 17:48:29 +00:00

126 lines
3.8 KiB
C#

/***********************************************************************
*
* Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; version 2.1
* of the License.
*
* This library 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
* Library Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, Novell, Inc.
*
* To contact Novell about this file by physical or electronic mail,
* you may find current contact information at www.novell.com.
*
***********************************************************************/
using System;
using System.Collections;
using System.Text;
using sscs.communication;
using sscs.common;
using sscs.verbs;
using sscs.constants;
class AppHandler
{
//Data
private IPCChannel clientChannel;
//Methods
internal AppHandler(IPCChannel ipcChannel)
{
clientChannel = ipcChannel;
CSSSLogger.ExecutionTrace(this);
}
~AppHandler()
{
CSSSLogger.ExecutionTrace(this);
}
/* Starts servicing the application. This is called as soon
* as a new client connection is established.
*/
internal int ServiceApp()
{
SSVerb verb = null;
CSSSLogger.ExecutionTrace(this);
while(true)
{
byte[] buf = null;
try
{
buf = clientChannel.Read();
if( null == buf )
{
return RetCodes.SUCCESS;
}
RequestParser reqParser = new RequestParser();
verb = reqParser.ParseRequest(buf);
CSSSLogger.logbreak();
CSSSLogger.DbgLog("SSCS going to sevice a :: ** " + verb.GetVerbName() + " **");
UserIdentifier userId = clientChannel.GetIPCChannelUserId();
if(null == userId)
{
CSSSLogger.log(ConstStrings.DEBUG, "In " + CSSSLogger.GetExecutionPath(this) + " a null user is obtained.");
return RetCodes.FAILURE;
}
buf = verb.ProcessRequest(userId);
if ( buf != null)
{
int retVal = clientChannel.Write(buf);
if(retVal < 0)
{
CSSSLogger.DbgLog("Write failed");
return RetCodes.FAILURE;
}
}
else
{
//There must always be something written back to client.
return RetCodes.FAILURE;
}
}
catch(CommunicationException e)
{
CSSSLogger.ExpLog(e.ToString());
throw e;
}
catch(FormatException e)
{
CSSSLogger.ExpLog(e.ToString());
throw e;
}
catch(Exception e)
{
CSSSLogger.ExpLog(e.ToString());
throw e;
}
/* TBD define verb specific heirarchy of exceptions catch
* (Some processing problem)
*/
finally
{
CSSSLogger.DbgLog("SSCS finished processing a SS Verb :: ** " + verb.GetVerbName() + " **");
CSSSLogger.logbreak();
}
}
}
}