hgomez      01/05/03 07:29:23

  Added:       proposals/web-connector/native/common jk_msg_buff.c
                        jk_msg_buff.h
  Log:
  buffer stuff
  
  Revision  Changes    Path
  1.1                  
jakarta-tomcat/proposals/web-connector/native/common/jk_msg_buff.c
  
  Index: jk_msg_buff.c
  ===================================================================
  /*
   * Copyright (c) 1997-1999 The Java Apache Project.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Java Apache 
   *    Project for use in the Apache JServ servlet engine project
   *    <http://java.apache.org/>."
   *
   * 4. The names "Apache JServ", "Apache JServ Servlet Engine" and 
   *    "Java Apache Project" must not be used to endorse or promote products 
   *    derived from this software without prior written permission.
   *
   * 5. Products derived from this software may not be called "Apache JServ"
   *    nor may "Apache" nor "Apache JServ" appear in their names without 
   *    prior written permission of the Java Apache Project.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Java Apache 
   *    Project for use in the Apache JServ servlet engine project
   *    <http://java.apache.org/>."
   *    
   * THIS SOFTWARE IS PROVIDED BY THE JAVA APACHE PROJECT "AS IS" AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE JAVA APACHE PROJECT OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Java Apache Group. For more information
   * on the Java Apache Project and the Apache JServ Servlet Engine project,
   * please see <http://java.apache.org/>.
   *
   */
  
  /***************************************************************************
   * Description: Data marshaling. XDR like                                  *
   * Author:      Costin <[EMAIL PROTECTED]>                              *
   * Author:      Gal Shachor <[EMAIL PROTECTED]>                           *
   * Author:      Henri Gomez <[EMAIL PROTECTED]>                               *
   * Version:     $Revision: 1.1 $                                           *
   ***************************************************************************/
  
  #include "jk_pool.h"
  #include "jk_connect.h"
  #include "jk_util.h"
  #include "jk_sockbuf.h"
  #include "jk_msg_buff.h"
  #include "jk_logger.h"
  
  struct jk_msg_buf {
      jk_pool_t *pool;
  
      unsigned char *buf;
      int pos; 
      int len;
      int maxlen;
  };
  
  
  /*
   * Simple marshaling code.
   */
  
  /* XXX what's above this line can go to .h XXX */
  void jk_b_dump(jk_msg_buf_t *msg, 
                 char *err) 
  {
      int i=0;
        printf("%s %d/%d/%d %x %x %x %x - %x %x %x %x - %x %x %x %x - %x %x %x %x\n", 
err, msg->pos, msg->len, msg->maxlen,  
               msg->buf[i++],msg->buf[i++],msg->buf[i++],msg->buf[i++],
               msg->buf[i++],msg->buf[i++],msg->buf[i++],msg->buf[i++],
               msg->buf[i++],msg->buf[i++],msg->buf[i++],msg->buf[i++],
               msg->buf[i++],msg->buf[i++],msg->buf[i++],msg->buf[i++]);
  
        i = msg->pos - 4;
      if(i < 0) {
          i=0;
      }
        
      printf("        %x %x %x %x - %x %x %x %x --- %x %x %x %x - %x %x %x %x\n", 
               msg->buf[i++],msg->buf[i++],msg->buf[i++],msg->buf[i++],
               msg->buf[i++],msg->buf[i++],msg->buf[i++],msg->buf[i++],
               msg->buf[i++],msg->buf[i++],msg->buf[i++],msg->buf[i++],
               msg->buf[i++],msg->buf[i++],msg->buf[i++],msg->buf[i++]);
  
  }
  
  void jk_b_reset(jk_msg_buf_t *msg) 
  {
      msg->len = 4;
      msg->pos = 4;
  }
  
  void jk_b_set_int(jk_msg_buf_t *msg, 
                    int pos, 
                    unsigned short val) 
  {
      msg->buf[pos]       = (unsigned char)((val >> 8) & 0xff);
      msg->buf[pos + 1]   = (unsigned char)(val & 0xff);
  }
  
  
  int jk_b_append_int(jk_msg_buf_t *msg, 
                      unsigned short val) 
  {
      if(msg->len + 2 > msg->maxlen) {
            return -1;
      }
  
      jk_b_set_int(msg, msg->len, val);
  
      msg->len += 2;
  
      return 0;
  }
  
  
  void jk_b_set_byte(jk_msg_buf_t *msg, 
                     int pos, 
                     unsigned char val) 
  {
      msg->buf[pos]= val;
  }
  
  int jk_b_append_byte(jk_msg_buf_t *msg, 
                       unsigned char val)
  {
      if(msg->len + 1 > msg->maxlen) {
            return -1;
      }
  
      jk_b_set_byte(msg, msg->len, val);
  
      msg->len += 1;
  
      return 0;
  }
  
  
  void jk_b_end(jk_msg_buf_t *msg) 
  {
      /* 
       * Ugly way to set the size in the right position 
       */
      jk_b_set_int(msg, 2, (unsigned short )(msg->len - 4)); /* see protocol */
      jk_b_set_int(msg, 0, 0x1234);
  }
  
  
  jk_msg_buf_t *jk_b_new(jk_pool_t *p) 
  {
      jk_msg_buf_t *msg = 
              (jk_msg_buf_t *)jk_pool_alloc(p, sizeof(jk_msg_buf_t));
  
      if(!msg) {
          return NULL;
      }
  
      msg->pool = p;
      
      return msg;
  }
  
  int jk_b_set_buffer(jk_msg_buf_t *msg, 
                      char *data, 
                      int buffSize) 
  {
      if(!msg) {
          return -1;
      }
  
      msg->len = 0;
      msg->buf = (unsigned char *)data;
      msg->maxlen = buffSize;
      
      return 0;
  }
  
  
  int jk_b_set_buffer_size(jk_msg_buf_t *msg, 
                           int buffSize) 
  {
      unsigned char *data = (unsigned char *)jk_pool_alloc(msg->pool, buffSize);
      
      if(!data) {
            return -1;
      }
  
      jk_b_set_buffer(msg, (char *)data, buffSize);
      return 0;
  }
  
  unsigned char *jk_b_get_buff(jk_msg_buf_t *msg) 
  {
      return msg->buf;
  }
  
  unsigned int jk_b_get_pos(jk_msg_buf_t *msg) 
  {
      return msg->pos;
  }
  
  void jk_b_set_pos(jk_msg_buf_t *msg,
                            int pos) 
  {
      msg->pos = pos;
  }
  
  unsigned int jk_b_get_len(jk_msg_buf_t *msg) 
  {
      return msg->len;
  }
  
  void jk_b_set_len(jk_msg_buf_t *msg, 
                    int len) 
  {
      msg->len=len;
  }
  
  int jk_b_get_size(jk_msg_buf_t *msg) 
  {
      return msg->maxlen;
  }
  
  int jk_b_append_string(jk_msg_buf_t *msg, 
                         const char *param) 
  {
      int len;
  
      if(!param) {
            jk_b_append_int( msg, 0xFFFF );
            return 0; 
      }
  
      len = strlen(param);
      if(msg->len + len + 2  > msg->maxlen) {
            return -1;
      }
  
      /* ignore error - we checked once */
      jk_b_append_int(msg, (unsigned short )len);
  
      /* We checked for space !!  */
      strncpy((char *)msg->buf + msg->len , param, len+1); /* including \0 */
      msg->len += len + 1;
  
      return 0;
  }
  
  unsigned short jk_b_get_int(jk_msg_buf_t *msg) 
  {
      int i;
      if(msg->pos + 1 > msg->len) {
            printf( "Read after end \n");
            return -1;
      }
      i  = ((msg->buf[msg->pos++]&0xff)<<8);
      i += (msg->buf[(msg->pos++)] & 0xFF);
      return i;
  }
  
  unsigned short jk_b_pget_int(jk_msg_buf_t *msg, 
                               int pos) 
  {
      int i= ((msg->buf[pos++]&0xff)<<8);
      i+= (msg->buf[pos] & 0xFF);
      return i;
  }
  
  unsigned char jk_b_get_byte(jk_msg_buf_t *msg) 
  {
      unsigned char rc;
      if(msg->pos > msg->len) {
            printf("Read after end \n");
            return -1;
      }
      rc = msg->buf[msg->pos++];
      
      return rc;
  }
  
  unsigned char jk_b_pget_byte(jk_msg_buf_t *msg, 
                               int pos) 
  {
      return msg->buf[pos];
  }
  
  
  unsigned char *jk_b_get_string(jk_msg_buf_t *msg) 
  {
      int size = jk_b_get_int(msg);
      int start = msg->pos;
  
      if((size < 0 ) || (size + start > msg->maxlen)) { 
            jk_b_dump(msg, "After get int"); 
            printf("ERROR\n" );
            return (unsigned char *)"ERROR"; /* XXX */
      }
  
      msg->pos += size;
      msg->pos++;  /* terminating NULL */
      
      return (unsigned char *)(msg->buf + start); 
  }
  
  /** Shame-less copy from somewhere.
      assert (src != dst)
   */
  static void swap_16(unsigned char *src, unsigned char *dst) 
  {
      *dst++ = *(src + 1 );
      *dst= *src;
  }
  
  /** Helpie dump function 
   */
  void jk_dump_buff(jk_logger_t *l,
                        const char *file,
                        int line,
                        int level,
                        char * what,
                        jk_msg_buf_t * msg)
  {
  #ifdef USE_ALSO_BODY
          jk_log(l, file, line, level, "%s #%d %.*s\n",
                    what,
                    jk_b_get_len(msg),
                    jk_b_get_len(msg),
                    jk_b_get_buff(msg));
  #else
  jk_log(l, file, line, level, "%s #%d\n", what, jk_b_get_len(msg));
  #endif
  }
  
  
  
  
  1.1                  
jakarta-tomcat/proposals/web-connector/native/common/jk_msg_buff.h
  
  Index: jk_msg_buff.h
  ===================================================================
  /*
   * Copyright (c) 1997-1999 The Java Apache Project.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Java Apache 
   *    Project for use in the Apache JServ servlet engine project
   *    <http://java.apache.org/>."
   *
   * 4. The names "Apache JServ", "Apache JServ Servlet Engine" and 
   *    "Java Apache Project" must not be used to endorse or promote products 
   *    derived from this software without prior written permission.
   *
   * 5. Products derived from this software may not be called "Apache JServ"
   *    nor may "Apache" nor "Apache JServ" appear in their names without 
   *    prior written permission of the Java Apache Project.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Java Apache 
   *    Project for use in the Apache JServ servlet engine project
   *    <http://java.apache.org/>."
   *    
   * THIS SOFTWARE IS PROVIDED BY THE JAVA APACHE PROJECT "AS IS" AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE JAVA APACHE PROJECT OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Java Apache Group. For more information
   * on the Java Apache Project and the Apache JServ Servlet Engine project,
   * please see <http://java.apache.org/>.
   *
   */
  
  /***************************************************************************
   * Description: Data marshaling. XDR like                                  *
   * Author:      Costin <[EMAIL PROTECTED]>                              *
   * Author:      Gal Shachor <[EMAIL PROTECTED]>                           *
   * Version:     $Revision: 1.1 $                                           *
   ***************************************************************************/
  
  #ifndef JK_MSG_BUF_H
  #define JK_MSG_BUF_H
  
  
  #ifdef __cplusplus
  extern "C" {
  #endif /* __cplusplus */
  
  #define DEF_BUFFER_SZ (8 * 1024)
  
  /* XXX replace all return values with error codes */
  #define ERR_BAD_PACKET -5
  
  /*
  RPC details:
  
    - one parameter  - use a structure for more. The method
      is encoded as part of the request
    - one or no result
    - 
  
  
  
   */
  
  struct jk_msg_buf;
  typedef struct jk_msg_buf jk_msg_buf_t;
  
  /* -------------------- Setup routines -------------------- */
  
  /** Allocate a buffer.
   */
  jk_msg_buf_t *jk_b_new(jk_pool_t *p); 
  
  /** Set up a buffer with an existing buffer
   */
  int jk_b_set_buffer(jk_msg_buf_t *msg, 
                      char *data, 
                      int buffSize );
  
  /*
   * Set up a buffer with a new buffer of buffSize
   */
  int jk_b_set_buffer_size(jk_msg_buf_t *msg, 
                           int buffSize);
  
  /*
   * Finalize the buffer before sending - set length fields, etc
   */
  void jk_b_end(jk_msg_buf_t *msg);
  
  /*
   * Recycle the buffer - z for a new invocation 
   */
  void jk_b_reset(jk_msg_buf_t *msg );
  
  /*
   * Return the buffer body 
   */ 
  unsigned char *jk_b_get_buff(jk_msg_buf_t *msg);
  
  /* 
   * Return the current reading position
   */
  unsigned int jk_b_get_pos(jk_msg_buf_t *msg);
  
  /*
   * Buffer size 
   */
  int jk_b_get_size(jk_msg_buf_t *msg);
  
  void jk_b_set_len(jk_msg_buf_t *msg, 
                    int len);
  
  void jk_b_set_pos(jk_msg_buf_t *msg, 
                    int pos);
  
  /*
   * Get the  message length for incomming buffers
   *   or the current length for outgoing
   */
  unsigned int jk_b_get_len(jk_msg_buf_t *msg);
  
  /*
   * Dump the buffer header
   *   @param err Message text
   */
  void jk_b_dump(jk_msg_buf_t *msg, 
                 char *err); 
  
  /* -------------------- Real encoding -------------------- */
  
  void jk_b_set_int(jk_msg_buf_t *msg, 
                    int pos, 
                    unsigned short val);
  
  int jk_b_append_byte(jk_msg_buf_t *msg, 
                       unsigned char val);
  
  int jk_b_append_int(jk_msg_buf_t *msg, 
                      unsigned short val);
  
  int jk_b_append_string(jk_msg_buf_t *msg, 
                         const char *param);
  
  
  /* -------------------- Decoding -------------------- */
  
  unsigned char *jk_b_get_string(jk_msg_buf_t *msg);
  
  /** Get an int from the current position 
   */
  unsigned short jk_b_get_int(jk_msg_buf_t *msg);
  
  unsigned char jk_b_get_byte(jk_msg_buf_t *msg);
  
  /** Get an int from an arbitrary position 
   */
  unsigned short jk_b_pget_int(jk_msg_buf_t *msg, 
                               int pos);
  
  unsigned char jk_b_pget_byte(jk_msg_buf_t *msg, 
                               int pos);
  
  /* --------------------- Help ------------------------ */
  void jk_dump_buff(jk_logger_t *l, 
                        const char *file,
                        int line,
                        int level,
                        char * what,
                        jk_msg_buf_t * msg);
  
  #ifdef __cplusplus
  }
  #endif /* __cplusplus */
  
  #endif /* JK_MSG_BUF_H */
  
  
  

Reply via email to