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