blob: 1d57bd0b3b8106f91d2c2914a40da1f865a15fc2 [file] [log] [blame]
/*
* 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.
*/
#ifndef JK_REQ_H
#define JK_REQ_H
#include "jk_global.h"
#include "jk_env.h"
#include "jk_logger.h"
#include "jk_pool.h"
#include "jk_endpoint.h"
#include "jk_service.h"
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
struct jk_env;
struct jk_msg;
typedef struct jk_msg jk_msg_t;
struct jk_endpoint;
struct jk_ws_service;
struct jk_logger;
#define DEF_BUFFER_SZ (8*1024)
#define AJP13_MAX_SEND_BODY_SZ (DEF_BUFFER_SZ - 6)
/**
* Abstract interface to marshalling. Different encodings and
* communication mechanisms can be supported.
*
* This object is recyclable, but is not thread safe - it can
* handle a single message at a time.
*
* It is created by a channel( XXX endpoint ? )
* and can be sent/received only on that channel.
*
* XXX Lifecycle: on send the buffer will be reused after send
* On receive - it will be recycled after reset() or equiv.
* Same as on the java side.
*
* @author Costin Manolache
*/
struct jk_msg
{
/** Human-readable method name */
char *name;
/** Method id - to be sent in the packet
*/
int id;
/** Header length for this message
*/
int headerLength;
/*
* Prepare the buffer for a new invocation
*/
void (*reset) (struct jk_env * env, struct jk_msg * _this);
/*
* Finalize the buffer before sending - set length fields, etc
*/
void (*end) (struct jk_env * env, struct jk_msg * _this);
int (*checkHeader) (struct jk_env * env, struct jk_msg * _this,
struct jk_endpoint * e);
/*
* Dump the buffer header
* @param err Message text
*/
void (*dump) (struct jk_env * env, struct jk_msg * _this, char *err);
int (*appendByte) (struct jk_env * env, struct jk_msg * _this,
unsigned char val);
int (*appendBytes) (struct jk_env * env, struct jk_msg * _this,
const unsigned char *param, const int len);
int (*appendInt) (struct jk_env * env, struct jk_msg * _this,
const unsigned short val);
int (*appendLong) (struct jk_env * env, struct jk_msg * _this,
const unsigned long val);
int (*appendString) (struct jk_env * env, struct jk_msg * _this,
const char *param);
int (*appendAsciiString) (struct jk_env * env, struct jk_msg * _this,
const char *param);
int (*appendMap) (struct jk_env * env, struct jk_msg * _this,
struct jk_map * map);
unsigned char (*getByte) (struct jk_env * env, struct jk_msg * _this);
unsigned short (*getInt) (struct jk_env * env, struct jk_msg * _this);
/** Look at the next int, without reading it
*/
unsigned short (*peekInt) (struct jk_env * env,
struct jk_msg * _this);
unsigned long (*getLong) (struct jk_env * env, struct jk_msg * _this);
/** Return a string.
The buffer is internal to the message, you must save
or make sure the message lives long enough.
*/
char *(*getString) (struct jk_env * env, struct jk_msg * _this);
/** Return a byte[] and it's length.
* The buffer is internal to the message, you must save
* or make sure the message lives long enough.
*/
unsigned char *(*getBytes) (struct jk_env * env,
struct jk_msg * _this, int *len);
/** Read a map structure from the message. The map is encoded
* as an int count and then the NV pairs.
*
* The content will not be copied - but point to the msg's buffer.
* If you want to use the map after the msg becomes invalid, you need
* to copy it.
*/
int (*getMap) (struct jk_env * env, struct jk_msg * _this,
struct jk_map * map);
/**
* Special method. Will read data from the server and add them as
* bytes. It is equivalent with jk2_requtil_readFully() in a buffer
* and then jk_msg_appendBytes(), except that we use directly the
* internal buffer.
*
* Returns -1 on error, else number of bytes read
*/
int (*appendFromServer) (struct jk_env * env,
struct jk_msg * _this,
struct jk_ws_service * r,
struct jk_endpoint * ae, int len);
/**
* Clone the msg buf into another one, sort of clone.
*
* Returns -1 on error, else number of bytes copied
*/
int (*copy) (struct jk_env * env,
struct jk_msg * _this, struct jk_msg * dst);
void *_privatePtr;
/* Temporary, don't use */
struct jk_pool *pool;
unsigned char *buf;
int pos;
int len;
int maxlen;
/* JK_TRUE if the message is sent/received by the server ( tomcat ).
*/
int serverSide;
};
/* Temp */
jk_msg_t *jk2_msg_ajp_create(struct jk_env *env, struct jk_pool *p,
int buffSize);
jk_msg_t *jk2_msg_ajp_create2(struct jk_env *env, struct jk_pool *pool,
char *buf, int buffSize);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif