/*
 *  Copyright 1999-2004 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/***************************************************************************
 * Description: Workers controller header file                             *
 * Author:      Gal Shachor <shachor@il.ibm.com>                           * 
 * Version:     $Revision$                                           *
 ***************************************************************************/

#ifndef JK_WORKERENV_H
#define JK_WORKERENV_H

#include "jk_logger.h"
#include "jk_endpoint.h"
#include "jk_config.h"
#include "jk_worker.h"
#include "jk_map.h"
#include "jk_uriMap.h"
#include "jk_uriEnv.h"
#include "jk_handler.h"
#include "jk_service.h"
#include "jk_shm.h"
#include "jk_vm.h"

#ifdef __cplusplus
extern "C"
{
#endif                          /* __cplusplus */

    struct jk_worker;
    struct jk_channel;
    struct jk_endpoint;
    struct jk_env;
    struct jk_config;
    struct jk_uriMap;
    struct jk_uriEnv;
    struct jk_map;
    struct jk_logger;
    struct jk_handler;
    struct jk_ws_service;

/* Temporary hardcoded handler IDs. Will be replaced with a name based dynamic mechanism */

/* Write a body chunk from the servlet container to the web server */
#define JK_HANDLE_AJP13_SEND_BODY_CHUNK    3

/* Send response headers from the servlet container to the web server. */
#define JK_HANDLE_AJP13_SEND_HEADERS       4

/* Marks the end of response. */
#define JK_HANDLE_AJP13_GET_BODY_CHUNK     6

/*  Marks the end of response. */
#define JK_HANDLE_AJP13_END_RESPONSE       5

/* Get a PONG reply from the servlet container. */
#define JK_HANDLE_AJP13_PONG_REPLY       9

/* Second Login Phase (servlet engine -> web server), md5 seed is received */
#define JK_HANDLE_LOGON_SEED	0x11

/* Login Accepted (servlet engine -> web server) */
#define JK_HANDLE_LOGON_OK	0x13

/* Login Rejected (servlet engine -> web server) */
#define JK_HANDLE_LOGON_ERR	0x14

/* Dispatcher for jni channel ( java->C ) */
#define JK_HANDLE_JNI_DISPATCH 0x15

/* Dispatcher for shm object ( java->C) */
#define JK_HANDLE_SHM_DISPATCH 0x16

/* Dispatcher for channel components ( java->C )*/
#define JK_HANDLE_CH_DISPATCH 0x17

/* Dispatcher for mutex object  ( java->C ) */
#define JK_HANDLE_MUTEX_DISPATCH 0x18


/*
 * Jk configuration and global methods. 
 * 
 * Env Information to be provided to worker at init time
 * With AJP14 support we need to have access to many informations
 * about web-server, uri to worker map....
 */
    struct jk_workerEnv
    {
        struct jk_bean *mbean;

        /* Use this pool for all global settings
         */
        struct jk_pool *pool;

        /* Active workers hashtable. 
         */
        struct jk_map *worker_map;

        /* Channels
         */
        struct jk_map *channel_map;

        struct jk_map *endpointMap;

        /* In a multi-process server, like Apache, stores the child
           id in the scoreboard ( if the scoreboard is used ).
           This in turn is used in the jk scoreboard to store informations
           about each instance.
           If -1 - shm is disabled.
         */
        int childId;
        int childProcessId;
        /* maximum configured number of child processes */
        int maxDaemons;

        struct jk_env *globalEnv;

    /** Worker that will be used by default, if no other
        worker is specified. Usefull for SetHandler or
        to avoid the lookup
        XXX no need - lb is the default, easy to get it.
    */
        struct jk_worker *defaultWorker;

        /* Web-Server we're running on (Apache/IIS/NES).
         */
        char *server_name;

        /* XXX Virtual server handled - "*" is all virtual
         */
        char *virtual;

    /** Initialization properties, set via native options or workers.properties.
     */
        /* XXX renamed from init_data to force all code to use setProperty
           This is private property !
         */
        struct jk_map *initData;

        /*
         * Log options. XXX move it to uriEnv, make it configurable per webapp.
         * XXX What about apache native logger ?
         */
        char *logger_name;

        struct jk_uriMap *uriMap;

        int was_initialized;

        /*
         * SSL Support
         */
        int ssl_enable;
        char *https_indicator;
        char *certs_indicator;
        char *cipher_indicator;
        char *session_indicator;        /* Servlet API 2.3 requirement */
        char *key_size_indicator;       /* Servlet API 2.3 requirement */

        /*
         * Jk Options
         */
        int options;

    /** Old REUSE_WORKER define. Instead of using an object pool, use
        thread data to recycle the connection. */
        int perThreadWorker;

        /*
         * Environment variables support
         */
        int envvars_in_use;
        struct jk_map *envvars;

        struct jk_config *config;

        struct jk_shm *shm;

        /* Slot for endpoint stats
         */
        struct jk_shm_slot *epStat;

        /* Handlers. This is a dispatch table for messages, for
         * each message id we have an entry containing the jk_handler_t.
         * lastMessageId is the size of the table.
         */
        struct jk_handler **handlerTable;
        int lastMessageId;

        /* The vm - we support a single instance per process
         * ( i.e can't have both jdk1.1 and jdk1.2 at the same time,
         *  or 2 instances of the same vm. )
         */
        struct jk_vm *vm;

    /** Private data, associated with the 'real' server
     *  server_rec * in apache
     */
        void *_private;

        struct jk_mutex *cs;

        /* Global setting to enable counters on all requests.
         *  That adds about 2-3 ms per request ( at least on linux ),
         *  and will store average and max processing time per endpoint
         *  ( that can be agregated per worker or per server ).
         * Note that we can't collect per request times - it's not
         * thread safe and sync is expensive. As workaround you
         * can enable timers only on a specific request and/or
         * use a dedicated worker/channel for that request.
         */
        int timing;

        /* -------------------- Methods -------------------- */

        /* Register a callback handler, for methods from java to C
         */
        int (*registerHandler) (struct jk_env * env,
                                struct jk_workerEnv * _this,
                                const char *type, const char *name, int id,
                                jk_handler_callback callback,
                                char *signature);


        int (*addWorker) (struct jk_env * env,
                          struct jk_workerEnv * _this, struct jk_worker * w);

        int (*addChannel) (struct jk_env * env,
                           struct jk_workerEnv * _this,
                           struct jk_channel * w);

    /** Add an endpoint. Endpoints are long lived and used to store
        statistics. The endpoint can be in used in only one thread
        at a time, it's a good way to avoid synchronization.
     */
        int (*addEndpoint) (struct jk_env * env, struct jk_workerEnv * wEnv,
                            struct jk_endpoint * ep);

        int (*initChannel) (struct jk_env * env,
                            struct jk_workerEnv * wEnv,
                            struct jk_channel * ch);

    /** Call the handler associated with the message type.
     */
        int (*dispatch) (struct jk_env * env, struct jk_workerEnv * _this,
                         void *target, struct jk_endpoint * ep, int code,
                         struct jk_msg * msg);

    /** Utility method for stream-based workers. It'll read
     *  messages, dispatch, send the response if any until
     *  done. This assumes one native server thread talking
     *  with a different client thread ( on the java side ).
     *  It does not work for jni or doors or other transports
     *  where a single thread is used for the whole processing.
     */
        int (*processCallbacks) (struct jk_env * env,
                                 struct jk_workerEnv * _this,
                                 struct jk_endpoint * e,
                                 struct jk_ws_service * r);

    /**
     * Special init function to be called from the parent process
     * ( with root privs ? ).
     * Used to create the scoreboard ( workaround required at least for HPUX )
     *
     * init() will be called for each child, parentInit() only once.
     */
        int (*parentInit) (struct jk_env * env, struct jk_workerEnv * _this);

    /**
     *  Init the workers, prepare the worker environment. Will read
     *  all properties and set the jk acordignly.
     * 
     *  Replaces wc_open
     */
        int (*init) (struct jk_env * env, struct jk_workerEnv * _this);

    /** Close all workers, clean up
     *
     */
        void (*close) (struct jk_env * env, struct jk_workerEnv * _this);
    };


    typedef struct jk_workerEnv jk_workerEnv_t;


#ifdef __cplusplus
}
#endif                          /* __cplusplus */

#endif                          /* JK_WORKERENV_H */
