/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You 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: Bi-directional protocol.                                   *
 * Author:      Costin <costin@costin.dnt.ro>                              *
 * Author:      Gal Shachor <shachor@il.ibm.com>                           *
 * Author:      Henri Gomez <hgomez@apache.org>                            *
 ***************************************************************************/

#include "jk_ajp13_worker.h"


/* -------------------- Method -------------------- */
static int JK_METHOD validate(jk_worker_t *pThis,
                              jk_map_t *props,
                              jk_worker_env_t *we, jk_log_context_t *l)
{
    int rc;
    JK_TRACE_ENTER(l);
    rc = ajp_validate(pThis, props, we, l, AJP13_PROTO);
    JK_TRACE_EXIT(l);
    return rc;
}


static int JK_METHOD init(jk_worker_t *pThis,
                          jk_map_t *props,
                          jk_worker_env_t *we, jk_log_context_t *l)
{
    int rc;
    JK_TRACE_ENTER(l);

    rc = ajp_init(pThis, props, we, l, AJP13_PROTO);
    JK_TRACE_EXIT(l);
    return rc;
}


static int JK_METHOD destroy(jk_worker_t **pThis, jk_log_context_t *l)
{
    int rc;
    JK_TRACE_ENTER(l);
    rc = ajp_destroy(pThis, l, AJP13_PROTO);
    JK_TRACE_EXIT(l);
    return rc;
}


static int JK_METHOD get_endpoint(jk_worker_t *pThis,
                                  jk_endpoint_t **pend, jk_log_context_t *l)
{
    int rc;
    JK_TRACE_ENTER(l);
    rc = ajp_get_endpoint(pThis, pend, l, AJP13_PROTO);
    JK_TRACE_EXIT(l);
    return rc;
}

int JK_METHOD ajp13_worker_factory(jk_worker_t **w,
                                   const char *name, jk_log_context_t *l)
{
    ajp_worker_t *aw;

    JK_TRACE_ENTER(l);
    if (ajp_worker_factory(w, name, l) == JK_FALSE)
        return 0;

    aw = (*w)->worker_private;
    aw->proto = AJP13_PROTO;

    aw->worker.validate = validate;
    aw->worker.init = init;
    aw->worker.get_endpoint = get_endpoint;
    aw->worker.destroy = destroy;

    JK_TRACE_EXIT(l);
    return JK_AJP13_WORKER_TYPE;
}
