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