summaryrefslogtreecommitdiff
path: root/ext/hyperwave
diff options
context:
space:
mode:
authorSVN Migration <svn@php.net>2003-02-27 17:43:39 +0000
committerSVN Migration <svn@php.net>2003-02-27 17:43:39 +0000
commit078bcec0997ad0e07b720c43cc9e6d0e046a75ab (patch)
tree36cb0f6be2ef078fe3374de8c087b93ecf82f812 /ext/hyperwave
parentfd61f69077f6156ca71dde60ecfd9ed9765a02db (diff)
downloadphp-git-PHP-5.tar.gz
This commit was manufactured by cvs2svn to create branch 'PHP_5'.PHP-5
Diffstat (limited to 'ext/hyperwave')
-rw-r--r--ext/hyperwave/CREDITS2
-rw-r--r--ext/hyperwave/config.m420
-rw-r--r--ext/hyperwave/debug.h206
-rw-r--r--ext/hyperwave/hg_comm.c5841
-rw-r--r--ext/hyperwave/hg_comm.h238
-rw-r--r--ext/hyperwave/hw.c4081
-rw-r--r--ext/hyperwave/hw_error.h111
-rw-r--r--ext/hyperwave/hyperwave.dsp120
-rw-r--r--ext/hyperwave/php_hyperwave.h147
9 files changed, 0 insertions, 10766 deletions
diff --git a/ext/hyperwave/CREDITS b/ext/hyperwave/CREDITS
deleted file mode 100644
index b01b16907f..0000000000
--- a/ext/hyperwave/CREDITS
+++ /dev/null
@@ -1,2 +0,0 @@
-HyperWave
-Uwe Steinmann
diff --git a/ext/hyperwave/config.m4 b/ext/hyperwave/config.m4
deleted file mode 100644
index 9e5a31cc6d..0000000000
--- a/ext/hyperwave/config.m4
+++ /dev/null
@@ -1,20 +0,0 @@
-dnl
-dnl $Id$
-dnl
-
-AC_MSG_CHECKING(for Hyperwave support)
-AC_ARG_WITH(hyperwave,
-[ --with-hyperwave Include Hyperwave support],
-[
- if test "$withval" != "no"; then
- AC_DEFINE(HYPERWAVE,1,[ ])
- AC_MSG_RESULT(yes)
- PHP_NEW_EXTENSION(hyperwave, hw.c hg_comm.c)
- else
- AC_DEFINE(HYPERWAVE,0,[ ])
- AC_MSG_RESULT(no)
- fi
-],[
- AC_DEFINE(HYPERWAVE,0,[ ])
- AC_MSG_RESULT(no)
-])
diff --git a/ext/hyperwave/debug.h b/ext/hyperwave/debug.h
deleted file mode 100644
index 5b72dbb194..0000000000
--- a/ext/hyperwave/debug.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/****************************************************************************
-*
-* Copyright (C) 1991 Kendall Bennett.
-* All rights reserved.
-*
-* Filename: $RCSfile$
-* Version: $Revision$
-*
-* Language: ANSI C
-* Environment: any
-*
-* Description: General header file for portable code.
-*
-* $Id$
-*
-* Revision History:
-* -----------------
-*
-* $Log$
-* Revision 1.2 2000/07/02 23:46:41 sas
-* Change header protection macros to conform to standard.
-*
-* Draft 3 of IEEE 1003.1 200x, "2.2 The Compilation Environment"
-*
-* All identifiers that begin with an underscore and either an uppercase
-* letter or another underscore are always reserved for any use by the
-* implementation.
-*
-* Revision 1.1 1999/04/21 23:37:47 ssb
-* moved db
-*
-* Revision 1.1.1.1 1999/04/07 21:03:29 zeev
-* PHP 4.0
-*
-* Revision 1.1.1.1 1999/03/17 04:29:10 andi
-* PHP4
-*
-* Revision 1.1.1.1 1998/12/21 07:56:22 andi
-* Trying to start the zend CVS tree
-*
-* Revision 1.1 1998/08/12 09:29:16 steinm
-* First version of Hyperwave module.
-*
-* Revision 1.6 92/03/15 12:51:48 kjb
-* Added MK_FP macro and ushort typedef.
-*
-* Revision 1.5 91/10/28 03:17:33 kjb
-* Ported to the Iris.
-*
-* Revision 1.4 91/09/26 15:29:02 kjb
-* Added stuff for the SGI Iris 4D.
-*
-* Revision 1.3 91/09/26 10:07:04 kjb
-* Added general typedef stuff.
-*
-* Revision 1.2 91/09/03 18:19:14 ROOT_DOS
-* Added a few defines that are supplied by <dir.h> for UNIX compatibility.
-*
-* Revision 1.1 91/08/16 13:19:06 ROOT_DOS
-* Initial revision
-*
-****************************************************************************/
-
-#ifndef DEBUG_H
-#define DEBUG_H
-
-#ifdef DEBUG
-# define D(x) x
-#else
-# define D(x)
-#endif
-
-#define PRIVATE static
-#define PUBLIC
-
-#ifdef __MSDOS__ /* Compiling for MSDOS */
-# define MS(x) x
-# define UX(x)
-# define IR(x)
-# define _8086 /* We know we have an 8086 type processor */
-#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
-# define LDATA
-# define NULL 0L
-#else
-# define NULL 0
-#endif
-#else __MSDOS__
-#ifdef __IRIS4D__ /* Compiling for the SGI Iris 4D */
-# define MS(x)
-# define UX(x) x /* The Iris is a UNIX machine */
-# define IR(x) x
-# define O_BINARY 0 /* no binary input mode in UNIX open() */
-# define MAXFILE 255 /* These are defined in <dir.h>, but */
-# define MAXDIR 255 /* on UNIX machines, we just define */
-# define MAXPATH 255 /* them all to be the same size */
-# define far /* Near and far do not exist under */
-# define near /* UNIX or the Iris. */
-# define NULL ((void *)0)
-#else __IRIS4D__ /* Assume UNIX compilation */
-# define MS(x)
-# define UX(x) x
-# define IR(x)
-# define O_BINARY 0 /* no binary input mode in UNIX open() */
-# define MAXFILE 255 /* These are defined in <dir.h>, but */
-# define MAXDIR 255 /* on UNIX machines, we just define */
-# define MAXPATH 255 /* them all to be the same size */
-# define far /* Near and far do not exist under */
-# define near /* UNIX or the Iris. */
-# ifndef NULL
-# define NULL ((void *)0)
-# endif
-#endif __IRIS4D__
-#endif __MSDOS__
-
-/****************************************************************************
-*
-* SEG(p) Evaluates to the segment portion of an 8086 address.
-* OFF(p) Evaluates to the offset portion of an 8086 address.
-* FP(s,o) Creates a far pointer given a segment offset pair.
-* PHYS(p) Evaluates to a long holding a physical address
-*
-****************************************************************************/
-
-#ifdef _8086
-# define SEG(p) ( ((unsigned *)&(void far *)(p))[1] )
-# define OFF(p) ( (unsigned)(p) )
-# define FP(s,o) ( (void far *)( ((unsigned long)s << 16) + \
- (unsigned long)o ))
-# define PHYS(p) ( (unsigned long)OFF(p) + \
- ((unsigned long)SEG(p) << 4))
-#else
-# define PHYS(p) (p)
-#endif _8086
-
-/****************************************************************************
-*
-* NUMELE(array) Evaluates to the array size in elements
-* LASTELE(array) Evaluates to a pointer to the last element
-* INBOUNDS(array,p) Evaluates to true if p points into the array
-* RANGE(a,b,c) Evaluates to true if a <= b <= c
-* max(a,b) Evaluates to a or b, whichever is larger
-* min(a,b) Evaluates to a or b, whichever is smaller
-* ABS(a) Evaluates to the absolute value of a
-* NBITS(type) Returns the number of bits in a variable of the
-* indicated type
-* MAXINT Evaluates to the value of the largest signed integer
-*
-****************************************************************************/
-
-#define NUMELE(a) (sizeof(a)/sizeof(*(a)))
-#define LASTELE(a) ((a) + (NUMELE(a)-1))
-#ifdef LDATA
-#define TOOHIGH(a, p) ((long)PHYS(p) - (long)PHYS(a) > (long)(NUMELE(a)-1))
-#define TOOLOW(a, p) ((long)PHYS(p) - (long)PHYS(a) < 0)
-#else
-#define TOOHIGH(a, p) ((long)(p) - (long)(a) > (long)(NUMELE(a)-1))
-#define TOOLOW(a, p) ((long)(p) - (long)(a) < 0)
-#endif
-#define INBOUNDS(a, p) ( ! (TOOHIGH(a, p) || TOOLOW(a, p)) )
-
-#define _IS(t, x) (((t)1 << (x)) != 0) /* Evaluates true if the width of */
- /* variable of type t is < x. */
- /* The != 0 assures that the */
- /* answer is 1 or 0 */
-
-#define NBITS(t) (4 * (1 + _IS(t, 4) + _IS(t, 8) + _IS(t, 12) + _IS(t, 16) \
- + _IS(t, 20) + _IS(t, 24) + _IS(t, 28) + _IS(t, 32)))
-
-#define MAXINT (((unsigned)~0) >> 1)
-
-#ifndef MAX
-# define MAX(a, b) ( ((a) > (b)) ? (a) : (b))
-#endif
-#ifndef MIN
-# define MIN(a, b) ( ((a) < (b)) ? (a) : (b))
-#endif
-#ifndef ABS
-# define ABS(a) ((a) >= 0 ? (a) : -(a))
-#endif
-
-#define RANGE(a, b, c) ( (a) <= (b) && (b) <= (c) )
-
-/* General typedefs */
-
-#ifndef __GENDEFS
-#define __GENDEFS
-typedef void *ptr;
-typedef void near *nearptr;
-typedef void far *farptr;
-/*typedef unsigned char uchar;
-typedef unsigned short ushort;
-typedef unsigned int uint;
-typedef unsigned long ulong;*/
-typedef int bool;
-#endif __GENDEFS
-
-/* Boolean truth values */
-
-#define false 0
-#define true 1
-#define FALSE 0
-#define TRUE 1
-#define NO 0
-#define YES 1
-
-#endif /* DEBUG_H */
diff --git a/ext/hyperwave/hg_comm.c b/ext/hyperwave/hg_comm.c
deleted file mode 100644
index 5aaae3dcfd..0000000000
--- a/ext/hyperwave/hg_comm.c
+++ /dev/null
@@ -1,5841 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 4 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2003 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.02 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available at through the world-wide-web at |
- | http://www.php.net/license/2_02.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: Uwe Steinmann <Uwe.Steinmann@fernuni-hagen.de> |
- +----------------------------------------------------------------------+
- */
-
-/* $Id$ */
-
-/* #define HW_DEBUG */
-
-#include <stdlib.h>
-#include "php.h"
-#include "php_globals.h"
-#include "SAPI.h"
-
-#if HYPERWAVE
-
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#ifdef PHP_WIN32
-# include <winsock2.h>
-# define EWOULDBLOCK WSAEWOULDBLOCK
-# define ETIMEDOUT WSAETIMEDOUT
-# define bcopy memcpy
-# define bzero(a, b) memset(a, 0, b)
-#else
-# include <sys/socket.h>
-# include <netinet/in.h>
-# include <netdb.h>
-# include <unistd.h>
-# include <sys/param.h>
-# include <arpa/inet.h>
-#endif
-#include <fcntl.h>
-#include <errno.h>
-#include "hg_comm.h"
-#include "ext/standard/head.h"
-
-/* Defining hw_optimize does optimize the send_objectbyidquery() function.
- Instead of getting the complete return message including the objectrecords
- with recv_hg_msg(), only the header of the return message is fetched.
- The object records itself are fetched as they are needed straight from
- the socket. This method requires less memory and is twice as fast because
- reading from the net seems to be a bottleneck which has less impact if
- the processing of the data is done in parallel.
-*/
-#define hw_optimize
-
-/* Define hw_less_server_stress does reduce the stress on the hw server, by
- using send_objectbyidquery() instead of send_getobject() multiple times.
- send_objectbyidquery() gets a bunch of object records with one message.
- This also reduced the number of lines in the servers log files.
- Unfortunately this is not faster unless hw_optimize is defined, because
- getting object records with multiple send_getobject() is already optimized.
- First all request messages for each object are send and the the answers
- are read. This gives the server the possibility to answer request already
- while more request are comming in.
-*/
-#define hw_less_server_stress
-
-static int set_nonblocking(int fd);
-/* static int set_blocking(int fd); */
-
-static int hg_read_exact(int sockfd, char *buf, int size);
-/* static int hg_read(int sockfd, char *buf, int size); */
-static int hg_write(int sockfd, char *buf, int size);
-
-static int send_hg_msg(int sockfd, hg_msg *msg, int length);
-static void build_msg_header(hg_msg *msg, int length, int version_msgid, int msg_type);
-static char *build_msg_int(char *buf, int val);
-static char *build_msg_str(char *buf, char *str);
-static int swap(int val);
-
-
-int version = HW_VERSION;
-/* F_DISTRIBUTED has the effect that all object ids are
- virtual. This means whenever an object is requested a
- new id is generated for this session. Wavemaster and
- Harmony set this flag. How do I know? tcpdump tells
- a lot if the output is investigated. The bit is also
- need to allow access on other server through the local
- server. The hw_mapid() function won't work unless you
- set F_DISTRIBUTED */
-/* int version = HW_VERSION | F_DISTRIBUTED; */
-/* int version = HW_VERSION | F_DISTRIBUTED | F_COMPRESSED; */
-static int msgid = 1;
-static int sock_flags = -1;
-static int non_blocking = 0;
-static int swap_on = 0;
-static int rtimeout = 40;
-static int wtimeout = 40;
-static int lowerror = 0;
-
-/***********************************************************************
-* Function fnInsStr() *
-* *
-* Insert string in string at position. The old string will be freed *
-* with efree!!! The new string is allocated with malloc. *
-* Parameter: string *str: string in which insstr is to be inserted *
-* int pos: Position where string is to inserted (0=first) *
-* string *insstr: string to be inserted *
-* Return: pointer to new string or NULL. If NULL is returned the *
-* memory for the old string has not been freed. *
-***********************************************************************/
-char *fnInsStr(char *str, int pos, char *insstr)
-{
- char *newstr, *ptr;
-
- if((str == NULL) || (insstr == NULL))
- return NULL;
- if(pos > (int)strlen(str))
- return NULL;
-
- if(insstr[0] == '\0')
- return str;
-
- if(NULL == (newstr = malloc(strlen(str) + strlen(insstr) + 1))) {
- lowerror = LE_MALLOC;
- return NULL;
- }
-
- ptr = newstr;
- memcpy(newstr, str, pos);
- ptr += pos;
- strcpy(ptr, insstr);
- ptr += strlen(insstr);
- strcpy(ptr, str+pos);
-
- free(str);
- return newstr;
-}
-
-/***********************************************************************
-* Function fnAddAnchor() *
-* *
-* Inserts new anchor into anchor list. *
-* Parameter: DLIST pList: Anchor list *
-* int objectID: object ID of Anchor *
-* int start: start position *
-* int end: end position *
-* Return: Pointer to new anchor, NULL if error *
-***********************************************************************/
-#ifdef newlist
-ANCHOR *fnAddAnchor(zend_llist *pAnchorList,
- int objectID,
- int start, int end)
-#else
-ANCHOR *fnAddAnchor(DLIST *pAnchorList,
- int objectID,
- int start, int end)
-#endif
-{
- ANCHOR *cur_ptr;
-
-#ifdef newlist
- ANCHOR **ptr;
- if(NULL == (cur_ptr = (ANCHOR *) emalloc(sizeof(ANCHOR))))
- return NULL;
-#else
- if((cur_ptr = (ANCHOR *) dlst_newnode(sizeof(ANCHOR))) == NULL) {
- return NULL;
- }
-#endif
-
- memset(cur_ptr, 0, sizeof(ANCHOR));
- cur_ptr->start = start;
- cur_ptr->end = end;
- cur_ptr->id = objectID;
- cur_ptr->destdocname = NULL;
- cur_ptr->nameanchor = NULL;
- cur_ptr->link = NULL;
- cur_ptr->tagattr = NULL;
- cur_ptr->htmlattr = NULL;
- cur_ptr->codebase = NULL;
- cur_ptr->code = NULL;
- cur_ptr->keyword = NULL;
- cur_ptr->fragment = NULL;
-
-#ifdef newlist
- zend_llist_prepend_element(pAnchorList, &cur_ptr);
- ptr = (ANCHOR **) zend_llist_get_first(pAnchorList);
-#else
- dlst_insertafter(pAnchorList, cur_ptr, PHP_DLST_HEAD(pAnchorList));
-#endif
-
- return(cur_ptr);
-}
-
-/***********************************************************************
-* Function fnDeleteAnchor() *
-* *
-* Inserts new anchor into anchor list. *
-* Parameter: ptr: pointer to node *
-* Return: void *
-***********************************************************************/
-#ifdef newlist
-void fnDeleteAnchor(void *ptr1)
-#else
-void fnDeleteAnchor(ANCHOR *ptr)
-#endif
-{
-#ifdef newlist
- ANCHOR **ptr2, *ptr;
- ptr2 = (ANCHOR **) ptr1;
- ptr = *ptr2;
-#endif
-
- if(ptr->destdocname) efree(ptr->destdocname);
- if(ptr->nameanchor) efree(ptr->nameanchor);
- if(ptr->link) efree(ptr->link);
- if(ptr->tagattr) efree(ptr->tagattr);
- if(ptr->htmlattr) efree(ptr->htmlattr);
- if(ptr->codebase) efree(ptr->codebase);
- if(ptr->code) efree(ptr->code);
- if(ptr->keyword) efree(ptr->keyword);
- if(ptr->fragment) efree(ptr->fragment);
-
-#ifdef newlist
- efree(ptr);
-#else
- dlst_freenode(ptr);
-#endif
-}
-
-/***********************************************************************
-* Function fnListAnchor() *
-* *
-* Lists all anchors in anchor list. *
-* Parameter: ptr: pointer to list *
-* Return: void *
-***********************************************************************/
-#ifdef newlist
-void fnListAnchor(zend_llist *pAnchorList)
-#else
-void fnListAnchor(DLIST *pAnchorList)
-#endif
-{
-#ifdef newlist
- ANCHOR *cur_ptr, **ptr;
- ptr = (ANCHOR **) zend_llist_get_last(pAnchorList);
- if(ptr)
- cur_ptr = *ptr;
- while(ptr) {
- fprintf(stderr, "0x%X->0x%X ", (int) ptr, (int) cur_ptr);
-#else
- ANCHOR *cur_ptr;
- cur_ptr = (ANCHOR *) dlst_last(pAnchorList);
- while(cur_ptr) {
- fprintf(stderr, "0x%X ", (int) cur_ptr);
-#endif
-
- fprintf(stderr, "%d, %d, %s, %s, %s, %s %s\n", cur_ptr->start,
- cur_ptr->end,
- cur_ptr->tanchor == 1 ? "src" : "dest",
- cur_ptr->destdocname,
- cur_ptr->nameanchor,
- cur_ptr->link,
- cur_ptr->tagattr);
-#ifdef newlist
- ptr = (ANCHOR **) zend_llist_get_prev(pAnchorList);
- if(ptr)
- cur_ptr = *ptr;
-#else
- cur_ptr = (ANCHOR *) dlst_prev(cur_ptr);
-#endif
- }
-}
-
-/***********************************************************************
-* Function fnCmpAnchors() *
-* *
-* Compares to Anchors by its start position *
-* Parameter: ANCHOR a1: First Anchor *
-* ANCHOR a2: Second Anchor *
-* Return: As strcmp *
-***********************************************************************/
-#ifdef newlist
-int fnCmpAnchors(const void *e1, const void *e2 TSRMLS_DC)
-{
- ANCHOR *a1, **aa1, *a2, **aa2;
- zend_llist_element **ee1, **ee2;
- ee1 = (zend_llist_element **) e1;
- ee2 = (zend_llist_element **) e2;
- aa1 = (ANCHOR **) (*ee1)->data;
- aa2 = (ANCHOR **) (*ee2)->data;
- a1 = *aa1;
- a2 = *aa2;
-#else
-int fnCmpAnchors(ANCHOR *a1, ANCHOR *a2 TSRMLS_DC)
-{
-#endif
- if(a1->start < a2->start)
- return -1;
- if(a1->start == a2->start) {
- /* It's importent to check this case as well, because a link with
- a bigger end has to be inserted first.
- */
- if(a1->end < a2->end)
- return -1;
- /* If both start and end are equal (yes, it is possible)
- we will Src Anchor before a Dest anchor. There has been
- a case where an IMG was surrounded by a NAME which was
- surrounded by a HREF. In such a case the HREF doesn't
- work.
- */
- if(a1->end == a2->end) {
- if(a1->tanchor > a2->tanchor)
- return -1;
- }
- }
-
- return 1;
-}
-
-/***********************************************************************
-* Function fnCreateAnchorList() *
-* Uses either docofanchorrec or reldestrec to create a list of anchors *
-* depending on anchormode *
-* *
-* Returns a list of Anchors converted from an object record *
-* Parameter: int objectID: the object for which the list is created *
-* char **anchors: object records of anchors *
-* char **docofanchorrec: Name of destination absolut *
-* char **reldestrec: Name of destination relativ to current *
-* object *
-* int ancount: number of anchors *
-* int anchormode: 0 = use absolut dest, else rel. dest *
-* Return: List of Anchors, NULL if error *
-***********************************************************************/
-#ifdef newlist
-zend_llist *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorrec, char **reldestrec, int ancount, int anchormode)
-#else
-DLIST *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorrec, char **reldestrec, int ancount, int anchormode)
-#endif
-{
- int start, end, i, destid, anchordestid, objectID;
- ANCHOR *cur_ptr = NULL;
-#ifdef newlist
- zend_llist *pAnchorList;
- pAnchorList = (zend_llist *) emalloc(sizeof(zend_llist));
- zend_llist_init(pAnchorList, sizeof(char *), fnDeleteAnchor, 0);
-#else
- DLIST *pAnchorList = dlst_init();
-#endif
-
- for(i=ancount-1; i>=0; i--) {
- char *object = NULL;
- char *docofanchorptr = NULL;
- char *reldestptr = NULL;
- char *str, *str1, link[200];
-
- if(NULL != anchors[i]) {
- object = anchors[i];
- docofanchorptr = docofanchorrec[i];
- if(reldestrec) /* FIXME reldestrec may only be NULL if anchormode != 0 */
- reldestptr = reldestrec[i];
-
- /* Determine Position. Doesn't matter if Src or Dest
- The Position field should always be there. Though there
- are case in which the position has no meaning, e.g. if
- a document is annotated and the annotation text doesn't
- contain a link of type annotation,
- In such a case the Position has the value 'invisible' */
- str = strstr(object, "Position");
- str += 9;
- if(((int) str != 9) && (0 != strncmp(str, "invisible", 9))) {
- sscanf(str, "0x%X 0x%X", &start, &end);
-
- /* Determine ObjectID */
- objectID = 0;
- if(NULL != (str = strstr(object, "ObjectID"))) {
- str += 9;
- sscanf(str, "0x%X", &objectID);
- }
-
- cur_ptr = fnAddAnchor(pAnchorList, objectID, start, end);
-
- /* Determine Type of Anchor */
- str = strstr(object, "TAnchor");
- str += 8;
- if(*str == 'S') {
- char destdocname[200];
- char nameanchor[200];
- cur_ptr->tanchor = 1;
-
- cur_ptr->destdocname = NULL;
- if(NULL != (str = strstr(object, "Dest"))) {
- char *tempptr;
-
- /* No need to care about the value of Dest, because we take the info
- from docofanchorptr.
- Since the anchor has a destination there are two possibilities.
- 1. The destination is an anchor or
- 2. or the destination is a document already.
- In both cases docofanchorptr has the proper info because GETDOCBYANCHOR
- is such a nice message.
- */
- switch(anchormode) {
- case 0:
- tempptr = docofanchorptr;
- break;
- default:
- tempptr = reldestptr;
- }
- if(NULL != tempptr) {
- destid = 0;
- if(NULL != (str = strstr(tempptr, "ObjectID="))) {
- str += 9;
- sscanf(str, "0x%X", &destid);
- }
- /* This is basically for NAME tags. There is no need
- to add the destname if it is the document itself.
- */
-/* if(destid == objID) {
- cur_ptr->destdocname = NULL;
- } else { */
- /* It's always nice to deal with names, so let's first check
- for a name. If there is none we take the ObjectID.
- */
- if(NULL != (str = strstr(tempptr, "Name="))) {
- str += 5;
- } else if(NULL != (str = strstr(tempptr, "ObjectID="))) {
- str += 9;
- }
- if(sscanf(str, "%s\n", destdocname)) {
- cur_ptr->destdocname = estrdup(destdocname);
- }
-/* } */
- }
- }
-
- /* Get the Id of the anchor destination and the document id that belongs
- to that anchor. We need that soon in order to determine if the anchor
- points to a document or a dest anchor in a document.
- */
- anchordestid = 0;
- if(NULL != (str = strstr(object, "Dest="))) {
- str += 5;
- sscanf(str, "0x%X", &anchordestid);
- }
-
- /* if anchordestid != destid then the destination is an anchor in a document whose
- name (objectID) is already in destdocname. We will have to extend the link
- by '#...'
- */
- cur_ptr->nameanchor = NULL;
- if(anchordestid != destid) {
- if(NULL != (str = strstr(object, "Dest="))) {
- str += 5;
- if(sscanf(str, "%s\n", nameanchor))
- cur_ptr->nameanchor = estrdup(nameanchor);
- }
- }
-
- if(!cur_ptr->destdocname) {
- cur_ptr->link = NULL;
- if(NULL != (str = strstr(object, "Hint=URL:"))) {
- str += 9;
- if(sscanf(str, "%s\n", link))
- cur_ptr->link = estrdup(link);
- } else if(NULL != (str = strstr(object, "Hint="))) {
- str += 5;
- if(sscanf(str, "%s\n", link))
- cur_ptr->link = estrdup(link);
- }
- }
-
- cur_ptr->fragment = NULL;
- if(NULL != (str = strstr(object, "Fragment="))) {
- str += 9;
- if(sscanf(str, "%s\n", link))
- cur_ptr->fragment = estrdup(link);
- }
-
- {
- char *htmlattr, *str2;
- int offset;
- str1 = object;
- htmlattr = emalloc(strlen(object)); /* alloc mem big enough for htmlattr */
- htmlattr[0] = '\0';
- offset = 0;
- while(NULL != (str = strstr(str1, "HtmlAttr="))) {
- str += 9;
- str1 = str;
- while((*str1 != '\n') && (*str1 != '\0'))
- str1++;
- /* Find the '=' in the HTML attr and make sure it is part of the
- attr and not somewhere in the objrec. */
- if((NULL != (str2 = strchr(str, '='))) && (str2 < str1)) {
- str2++;
- strncpy(&htmlattr[offset], str, str2 - str);
- offset = offset + (str2 - str);
- htmlattr[offset++] = '"';
- strncpy(&htmlattr[offset], str2, str1 - str2);
- offset = offset + (str1 - str2);
- htmlattr[offset++] = '"';
- htmlattr[offset++] = ' ';
- htmlattr[offset] = '\0';
- }
- }
- if(offset){
- /* remove last space */
- htmlattr[offset-1] = '\0';
- cur_ptr->htmlattr = estrdup(htmlattr);
- }
- efree(htmlattr);
- }
-
- if(NULL != (str = strstr(object, "LinkType="))) {
- str += 9;
- if(strncmp(str, "background", 10) == 0)
- cur_ptr->linktype=HW_BACKGROUND_LINK;
- else
- if(strncmp(str, "intagnodel", 10) == 0) { /* New type introduced by Uwe Steinmann 16.03.2001 */
- cur_ptr->linktype=HW_INTAGNODEL_LINK;
- cur_ptr->tagattr = NULL;
- if(NULL != (str = strstr(object, "TagAttr="))) {
- str += 8;
- str1 = str;
- while((*str1 != '\n') && (*str1 != '\0'))
- str1++;
- cur_ptr->tagattr = emalloc(str1 - str + 1);
- memcpy(cur_ptr->tagattr, str, str1 - str);
- cur_ptr->tagattr[str1 - str] = '\0';
- }
- } else
- if(strncmp(str, "intag", 5) == 0) {
- cur_ptr->linktype=HW_INTAG_LINK;
- cur_ptr->tagattr = NULL;
- if(NULL != (str = strstr(object, "TagAttr="))) {
- str += 8;
- str1 = str;
- while((*str1 != '\n') && (*str1 != '\0'))
- str1++;
- cur_ptr->tagattr = emalloc(str1 - str + 1);
- memcpy(cur_ptr->tagattr, str, str1 - str);
- cur_ptr->tagattr[str1 - str] = '\0';
- }
- } else
- if(strncmp(str, "applet", 6) == 0) {
- cur_ptr->linktype=HW_APPLET_LINK;
- cur_ptr->codebase = NULL;
- if(NULL != (str = strstr(object, "CodeBase="))) {
- str += 9;
- str1 = str;
- while((*str1 != '\n') && (*str1 != '\0'))
- str1++;
- cur_ptr->codebase = emalloc(str1 - str + 1);
- memcpy(cur_ptr->codebase, str, str1 - str);
- cur_ptr->codebase[str1 - str] = '\0';
- }
- cur_ptr->code = NULL;
- if(NULL != (str = strstr(object, "Code="))) {
- str += 5;
- str1 = str;
- while((*str1 != '\n') && (*str1 != '\0'))
- str1++;
- cur_ptr->code = emalloc(str1 - str + 1);
- memcpy(cur_ptr->code, str, str1 - str);
- cur_ptr->code[str1 - str] = '\0';
- }
- } else
- cur_ptr->linktype=HW_DEFAULT_LINK;
- } else
- cur_ptr->linktype=HW_DEFAULT_LINK;
-
- } else { /* Destination Anchor */
- char nameanchor[200];
-
- cur_ptr->tanchor = 2;
- cur_ptr->link = NULL;
-
- /* Here is the only additional info for the name attribute */
- cur_ptr->nameanchor = NULL;
- if(NULL != (str = strstr(object, "ObjectID="))) {
- str += 9;
- if(sscanf(str, "%s\n", nameanchor))
- cur_ptr->nameanchor = estrdup(nameanchor);
- }
-
- cur_ptr->keyword = NULL;
- if(NULL != (str = strstr(object, "Keyword="))) {
- str += 8;
- if(sscanf(str, "%s\n", nameanchor))
- cur_ptr->keyword = estrdup(nameanchor);
- }
-
- }
-
- }
- /* free memory even if it is an invisible anchor */
- efree(anchors[i]);
- if(docofanchorrec[i]) efree(docofanchorrec[i]);
- if(reldestrec)
- if(reldestrec[i]) efree(reldestrec[i]);
- }
- }
- return pAnchorList;
-}
-
-/***********************************************************************
-* Function fnInsAnchorsIntoText() *
-* *
-* Returns the text document with all anchors inserted form list *
-* Parameter: char *text: text without anchors *
-* DList *pAnchorList: list of anchors *
-* Return: Text with anchors *
-***********************************************************************/
-#define BUFFERLEN 200
-#ifdef newlist
-char *fnInsAnchorsIntoText(char *text, zend_llist *pAnchorList, char **bodytag, char **urlprefix) {
- ANCHOR **ptr;
-#else
-char *fnInsAnchorsIntoText(char *text, DLIST *pAnchorList, char **bodytag, char **urlprefix) {
-#endif
- ANCHOR *cur_ptr;
- char bgstr[BUFFERLEN], istr[BUFFERLEN];
- char **scriptname;
- char *newtext;
- int offset = 0;
- int laststart=0;
- char emptystring[BUFFERLEN];
- int i;
- TSRMLS_FETCH();
-
- emptystring[0] = '\0';
-
-/* The following is very tricky and depends on how rewriting is setup on your webserver.
- If you skip the scriptname in the url you will have to map each hyperwave name
- to http://<hwname>. This may not always be a good idea. The best solution is
- probably to provide a prefix for such
- a case which is an optional parameter to hw_gettext() or hw_pipedocument().
- FIXME: Currently, the variable SCRIPT_NAME is empty thouht SCRIPT_URL is
- not. In our case this is OK, since as mentioned above it is better to have no
- SCRIPT_NAME than to have if rewriting is on.
-*/
- if(urlprefix) {
- scriptname = urlprefix;
- } else {
- zval **script_name;
- scriptname = emalloc(5*sizeof(char *));
- if (zend_hash_find(&EG(symbol_table), "SCRIPT_NAME", sizeof("SCRIPT_NAME"), (void **) &script_name)==FAILURE)
- for(i=0; i<5; i++)
- scriptname[i] = &emptystring;
- else {
- convert_to_string_ex(script_name);
- for(i=0; i<5; i++)
- scriptname[i] = Z_STRVAL_PP(script_name);
- }
-
-#if 0
-#if APACHE
- {
- int j;
- array_header *arr = table_elts(((request_rec *) SG(server_context))->subprocess_env);
- table_entry *elts = (table_entry *)arr->elts;
-
- for (j=0; j < arr->nelts; j++) {
- if((0 == strcmp(elts[j].key, "SCRIPT_NAME")) ||
- (0 == strcmp(elts[j].key, "SCRIPT_URL")))
- break;
- }
- scriptname = elts[j].val;
- }
-#else
- scriptname = getenv("SCRIPT_FILENAME");
-#endif
-#endif
- }
-
- newtext = text;
- bgstr[0] = '\0';
-#ifdef newlist
- zend_llist_sort(pAnchorList, fnCmpAnchors TSRMLS_CC);
- ptr = (ANCHOR **) zend_llist_get_last(pAnchorList);
- if(ptr)
- cur_ptr = *ptr;
- while(NULL != ptr) {
-#else
- dlst_mergesort(pAnchorList, fnCmpAnchors);
- cur_ptr = (ANCHOR *) dlst_last(pAnchorList);
- while(NULL != cur_ptr) {
-#endif
-
- istr[0] = '\0';
- if(cur_ptr->tanchor == 1) { /* Src Anchor */
- if(laststart >= cur_ptr->end)
- offset = 0;
- if((cur_ptr->link != NULL) && (cur_ptr->link[0] != '\0')) {
- /* The link is only set if the Link points to an external document */
- switch(cur_ptr->linktype) {
- case HW_BACKGROUND_LINK:
- snprintf(istr, BUFFERLEN, " background='%s'", cur_ptr->link);
- break;
- case HW_INTAG_LINK:
- snprintf(istr, BUFFERLEN, " %s='%s'", cur_ptr->tagattr, cur_ptr->link);
- offset -= 4; /* because there is no closing tag </A> */
-/* laststart = cur_ptr->start; */
- break;
- case HW_INTAGNODEL_LINK:
- snprintf(istr, BUFFERLEN, "%s", cur_ptr->link);
- offset -= 4; /* because there is no closing tag </A> */
-/* laststart = cur_ptr->start; */
- break;
- case HW_APPLET_LINK:
- if(cur_ptr->codebase)
- snprintf(istr, BUFFERLEN, " CODEBASE='%s' CODE='%s'", cur_ptr->codebase, cur_ptr->code);
- else
- snprintf(istr, BUFFERLEN, " CODEBASE='/' CODE='%s'", cur_ptr->code);
- break;
- default:
- newtext = fnInsStr(newtext, cur_ptr->end+offset, "</A>");
- if(cur_ptr->fragment)
- snprintf(istr, BUFFERLEN, "<A HREF='%s#%s'", cur_ptr->link, cur_ptr->fragment);
- else
- snprintf(istr, BUFFERLEN, "<A HREF='%s'", cur_ptr->link);
- if(cur_ptr->htmlattr) {
- strncat(istr, " ", BUFFERLEN - 1 - strlen(istr));
- strncat(istr, cur_ptr->htmlattr, BUFFERLEN - 1 - strlen(istr));
- }
- strncat(istr, ">", BUFFERLEN - 1 - strlen(istr));
- }
- } else {
- switch(cur_ptr->linktype) {
- case HW_BACKGROUND_LINK:
- if(NULL != cur_ptr->destdocname) {
- snprintf(istr, BUFFERLEN, " background='%s/%s'", scriptname[HW_BACKGROUND_LINK], cur_ptr->destdocname);
- } else
- istr[0] = '\0';
- break;
- case HW_INTAG_LINK:
- if(cur_ptr->fragment)
- snprintf(istr, BUFFERLEN, " %s='#%s'", cur_ptr->tagattr, cur_ptr->fragment);
- else
- snprintf(istr, BUFFERLEN, " %s='%s/%s'", cur_ptr->tagattr, scriptname[HW_INTAG_LINK], cur_ptr->destdocname);
- offset -= 4; /* because there is no closing tag </A> */
- break;
- case HW_INTAGNODEL_LINK:
- snprintf(istr, BUFFERLEN, "%s", cur_ptr->destdocname);
- offset -= 4; /* because there is no closing tag </A> */
- break;
- case HW_APPLET_LINK:
- if(cur_ptr->codebase)
-/* snprintf(istr, BUFFERLEN, " CODEBASE='%s%s' CODE='%s'", scriptname == NULL ? "" : scriptname, cur_ptr->codebase, cur_ptr->code); */
- snprintf(istr, BUFFERLEN, " CODEBASE='%s%s' CODE='%s'", scriptname[HW_APPLET_LINK], cur_ptr->codebase, cur_ptr->code);
- else
- snprintf(istr, BUFFERLEN, " CODEBASE='/' CODE='%s'", cur_ptr->code);
- break;
- default:
- newtext = fnInsStr(newtext, cur_ptr->end+offset, "</A>");
-
- if(cur_ptr->nameanchor)
- snprintf(istr, BUFFERLEN, "<A HREF='%s/%s#%s'", scriptname[HW_DEFAULT_LINK], cur_ptr->destdocname, cur_ptr->nameanchor);
- else if(cur_ptr->fragment)
- snprintf(istr, BUFFERLEN, "<A HREF=\"%s/%s#%s\"", scriptname[HW_DEFAULT_LINK], cur_ptr->destdocname, cur_ptr->fragment);
- else
- snprintf(istr, BUFFERLEN, "<A HREF='%s/%s'", scriptname[HW_DEFAULT_LINK], cur_ptr->destdocname);
-
- if(cur_ptr->htmlattr) {
- strncat(istr, " ", BUFFERLEN - 1 - strlen(istr));
- strncat(istr, cur_ptr->htmlattr, BUFFERLEN - 1 - strlen(istr));
- }
- strncat(istr, ">", BUFFERLEN - 1 - strlen(istr));
- }
- }
- } else {
- if(laststart >= cur_ptr->end)
- offset = 0;
- newtext = fnInsStr(newtext, cur_ptr->end+offset, "</a>");
-
- /* If we have a keyword, we assume we had a fragment which has been used
- instead of the destdocname
- */
- if(cur_ptr->keyword)
- snprintf(istr, BUFFERLEN, "<A NAME='%s'>", cur_ptr->keyword);
- else if(cur_ptr->nameanchor)
- snprintf(istr, BUFFERLEN, "<A NAME='%s'>", cur_ptr->nameanchor);
- }
- newtext = fnInsStr(newtext, cur_ptr->start, istr);
- /* In case there are several TAGS nested, we accumulate the offset
- You wonder what the 4 means? It's the length of </A> */
- offset += strlen(istr) + 4;
- laststart = cur_ptr->start;
-#ifdef newlist
- ptr = (ANCHOR **) zend_llist_get_prev(pAnchorList);
- if(ptr)
- cur_ptr = *ptr;
-#else
- cur_ptr = (ANCHOR *) dlst_prev(cur_ptr);
-#endif
- }
- snprintf(istr, BUFFERLEN, "<BODY %s>", bgstr);
- *bodytag = estrdup(istr);
-/* if(scriptname != urlprefix) efree(scriptname); */
- if(scriptname != NULL) efree(scriptname);
- return(newtext);
-}
-#undef BUFFERLEN
-
-/***********************************************************************
-* Function fnAttributeValue() *
-* *
-* Returns the value of an attribute *
-* Parameter: char *object: object record *
-* char *attrname: attribute name *
-* Return: char*: attribute value, NULL if name not found *
-***********************************************************************/
-char *fnAttributeValue(char *object, char *attrname)
-{
- char *str, *str1, *attrvalue;
- int len;
-
- str = strstr(object, attrname);
- if(NULL == str)
- return(NULL);
- str += strlen(attrname);
- str++;
- str1 = str;
- while((*str1 != '\0') && (*str1 != '\n'))
- str1++;
- len = str1 - str;
- if(NULL == (attrvalue = emalloc(len+1))) {
- lowerror = LE_MALLOC;
- return NULL;
- }
- memcpy(attrvalue, str, len);
- attrvalue[len] = '\0';
- return(attrvalue);
-}
-
-/***********************************************************************
-* Function fnAttributeCompare() *
-* *
-* Checks if an attribute in an objrec has a certain value *
-* Parameter: char *object: object record *
-* char *attrname: attribute name *
-* char *value: value of attribute *
-* Return: char*: as strcmp *
-***********************************************************************/
-int fnAttributeCompare(char *object, char *attrname, char *value)
-{
- char *str, *str1;
- int len;
-
- if((NULL == object) || (NULL == attrname) || (NULL == value))
- return -2;
-
- /* Find the attribute Name and make sure it is followed by
- a '=' sign and preceded by a '\n';
- */
- str = strstr(object, attrname);
- if((NULL == str) ||
- (str[strlen(attrname)] != '=') ||
- (str[-1] != '\n')) {
- return(-2);
- }
- str += strlen(attrname); /* skip the attribute name */
- str++; /* skip the equal sign */
-
- /* Search for end of attribute value */
- str1 = str;
- while((*str1 != '\0') && (*str1 != '\n'))
- str1++;
- len = str1 - str;
- return(strncmp(str, value, len));
-}
-
-/*********************************************************************
-* Function fnCOpenDataCon() *
-* *
-* Opens data connection on client side. This function is called *
-* right after the client has requested any data from the server *
-* Parameter: int sockfd: socket of control connection *
-* int *port: port of control und data connection *
-* Return : sockfd on success, <0 if error *
-*********************************************************************/
-static int fnCOpenDataCon(int sockfd, int *port)
- {
- int fd;
- struct sockaddr_in serv_addr;
- int len;
- int option = 1;
-
-/* len = sizeof(com_addr);
- if(getsockname(sockfd, (struct sockaddr *) &com_addr, &len) < 0)
- {
- return(-1);
- }
-
- *port = htons(com_addr.sin_port); */
-
- /*
- ** Open a TCP socket (an Internet stream socket)
- */
- if((fd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERR)
- {
- return(-1);
- }
-
- /*
- ** Make sure that address may be reused
- */
-#if defined(SUN) || defined(PHP_WIN32)
- setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&option, sizeof(option));
-#else
- setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
-#endif
-
- /*
- ** Open connection aktiv
- ** Let bind() select a port number
- */
- bzero((char *) &serv_addr, sizeof(serv_addr));
- if(bind(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
- {
- return(-1);
- }
-
- /*
- ** Get the port number bind selected
- */
- len = sizeof (serv_addr);
- if(getsockname(fd, (struct sockaddr *)&serv_addr, &len) < 0)
- {
- return(-1);
- }
- *port = ntohs(serv_addr.sin_port);
-
- listen(fd, 5);
-
- return(fd);
- }
-
-/*======================================================================
- *
- * Read/write routines with timeout detection.
- *
- * Usage: write_to(fd, buffer, n, timeout)
- * read_to(fd, buffer, n, timeout)
- *
- * David Chavez
- * Engineering Services & Software
- * 7841 New Salem Street
- * San Diego, CA 92126
- * USA
- *
- * dec@essw.com
- *
- *====================================================================*/
-#ifdef PHP_WIN32
-#include <time.h>
-#else
-#include <sys/fcntl.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#endif
-#include <errno.h>
-#include <signal.h>
-
-#ifndef PHP_WIN32
-static sigset_t newmask, oldmask, zeromask;
-#endif
-
-static int set_noblock(int fd)
-{
-#ifdef PHP_WIN32
- u_long argp=1;
-
- return ioctlsocket (fd, FIONBIO , &argp);
-#else
-
- sigemptyset(&zeromask);
- sigemptyset(&newmask);
- sigaddset(&newmask, SIGHUP);
- sigaddset(&newmask, SIGUSR1);
- sigaddset(&newmask, SIGUSR2);
- if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) return -1;
-
- return fcntl(fd, F_SETFL, O_NONBLOCK | O_NDELAY /* | FNBIO*/);
-#endif
-}
-
-int write_to(int fd, void *buffer, int n, int timeout)
-{
- int nrem, nw=0;
- char *bptr;
- int error=0;
-#if defined(SYSV) || defined(PHP_WIN32)
- int width = 20;
-#else
- int width = getdtablesize();
-#endif
- fd_set writefds;
- struct timeval select_timeout;
-
- select_timeout.tv_sec = timeout;
-#ifdef PHP_WIN32
- select_timeout.tv_usec = 0;
-#else /* is this just a typo? */
- select_timeout.tv_usec = 0.;
-#endif
-
- /* Set fd to non-blocking */
-
- if (set_noblock(fd) != 0) return -1;
-
- /* Write to fd until no more can be written */
-
- FD_ZERO(&writefds);
-
- FD_SET((unsigned int)fd, &writefds);
-
- for( nrem = n, bptr = buffer; nrem;)
- {
- if(( error = select(width,
- (fd_set *) 0,
- &writefds,
- (fd_set *) 0,
- &select_timeout)) <= 0 && errno != EINTR) break;
-
- if(errno != EINTR && ( nw = write(fd, bptr, nrem)) <= 0) {
- /*
- * check for error number - and keep trying to
- * write
- */
- if(errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR)
- {
- continue;
- }
- else
- {
- error = nw;
- break;
- }
- } else {
- nrem -= nw;
- bptr += nw;
- }
- }
-#ifndef PHP_WIN32
- if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) return -1;
-#endif
- if( ! error ) {
- errno = ETIMEDOUT;
- return(-2);
- } else if (error < 0) {
- return(error);
- } else {
- return(n);
- }
-}
-
-int read_to(int fd, char *buffer, int n, int timeout)
- {
- int nrem, nread, nr=0;
- char *bptr;
- int error=0;
-
-#if defined(SYSV) || defined(PHP_WIN32)
- int width = 20;
-#else
- int width = getdtablesize();
-#endif
- fd_set readfds;
- struct timeval select_timeout;
-
- select_timeout.tv_sec = timeout;
-#ifdef PHP_WIN32
- select_timeout.tv_usec = 0;
-#else
- select_timeout.tv_usec = 0.;
-#endif
-
- /* Set fd to non-blocking */
-
- if (set_noblock(fd) != 0) return -1;
-
- FD_ZERO(&readfds);
-
- FD_SET((unsigned int)fd, &readfds);
-
- for( nrem = n, bptr = buffer, nread = 0; nrem;)
- {
- if(( error = select(width,
- &readfds,
- (fd_set *) 0,
- (fd_set *) 0,
- &select_timeout)) <= 0 && errno != EINTR) break;
-
- if(errno != EINTR && (nr = read (fd, bptr, nrem)) < 0)
- {
- /*
- * check for error number - and keep trying to
- * read
- */
- if(errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR)
- {
- continue;
- }
- else
- {
- error = nr;
- break;
- }
- }
- else if(nr == 0)
- {
- break;
- }
- else
- {
- nread += nr;
- bptr += nr;
- nrem -= nr;
- }
- }
-
-#ifndef PHP_WIN32
- if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) return -1;
-#endif
- if( ! error )
- {
- errno = ETIMEDOUT;
- return(-2);
- }
- else if ( error < 0)
- {
- return(-1);
- }
- else
- {
- return(nread);
- }
- }
-
-void set_swap(int do_swap)
-{
- swap_on = do_swap;
-}
-
-/***********************************************************************
-* Function open_hg_connection() *
-* *
-***********************************************************************/
-int open_hg_connection(char *server_name, int port)
-{
- int sockfd;
- int option = 1;
- struct sockaddr_in server_addr;
- struct hostent *hp;
-
- if ( NULL == server_name )
- return(-1);
-
- if ( (hp = gethostbyname(server_name)) == NULL ) {
- return(-2);
- }
-
- bzero((char *)&server_addr, sizeof(server_addr));
- server_addr.sin_family = AF_INET;
- if ( port != 0 )
- server_addr.sin_port = htons(port);
- else
- server_addr.sin_port = htons(HG_SERVER_PORT);
-/* bcopy(hp->h_addr, (char *) &server_addr.sin_addr, hp->h_length); */
- server_addr.sin_addr = *(struct in_addr *) hp->h_addr;
-
- if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERR ) {
- return(-3);
- }
-
-#if defined(SUN) || defined(PHP_WIN32)
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&option, sizeof(option));
-#else
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
-#endif /* SUN */
-
- if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
- HWSOCK_FCLOSE(sockfd);
- return(-4);
- }
-
-#ifndef PHP_WIN32
- if ( (sock_flags = fcntl(sockfd, F_GETFL, 0)) == -1 )
-#endif
-
- if ( set_nonblocking(sockfd) == -1 ) {
- HWSOCK_FCLOSE(sockfd);
- return(-5);
- }
-
- return(sockfd);
-}
-
-
-/***********************************************************************
-* Function initialize_hg_connection() *
-* *
-***********************************************************************/
-int initialize_hg_connection(int sockfd, int *do_swap, int *version, char **userdata, char **server_string, char *username, char *password)
-{
- char buf, c;
- char *tmp;
- hg_msg *ready_msg, *retmsg, msg;
- int i = 0x01;
- int length;
-
- *do_swap = 0;
- buf = 'T';
- if ( hg_write(sockfd, &buf, 1) == -1 ) {
- return(-2);
- }
-
- if ( hg_read_exact(sockfd, &buf, 1) == -1 ) {
- return(-3);
- }
- if ( buf == 'F' ) {
- return(-4);
- }
- if ( buf != 'T' ) {
- return(-5);
- }
-
- buf = c = ( *(char *)&i ) ? 'l' : 'B';
- if ( hg_write(sockfd, &buf, 1) == -1 ) {
- return(-6);
- }
- if ( hg_read_exact(sockfd, &buf, 1) == -1 ) {
- return(-7);
- }
- if ( c != buf ) {
- swap_on = 1;
- *do_swap = 1;
- } else {
- swap_on = 0;
- *do_swap = 0;
- }
-
- if ( send_ready(sockfd) == -1) {
- return(-8);
- }
-
- /* Receive return from Ready message */
- if ( (ready_msg = recv_ready(sockfd)) == NULL ) {
- return(-9);
- }
-
- if ((ready_msg->version_msgid & F_VERSION) < HW_VERSION)
- return(-8);
- *version = ready_msg->version_msgid;
- *server_string = strdup(ready_msg->buf+4);
- efree(ready_msg->buf);
- efree(ready_msg);
-
- /* If we have a username and password then do the identification. */
- if((NULL != username) && (NULL != password)) {
- length = HEADER_LENGTH + sizeof(int) + strlen(username) + 1 + strlen(password) + 1;
-
- build_msg_header(&msg, length, msgid++, IDENTIFY_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, 0);
- tmp = build_msg_str(tmp, username);
- tmp = build_msg_str(tmp, password);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-10);
- }
- efree(msg.buf);
- }
-
- if((NULL != username) && (NULL != password)) {
- /* Receive return form identify message */
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-11);
-
- *userdata = retmsg->buf;
- efree(retmsg);
- }
-
- return(0);
-}
-
-
-static int set_nonblocking(int fd)
-{
-#ifdef PHP_WIN32
- unsigned int argp=0;
-
-/* if ( sock_flags == -1 )
- getsockopt (fd, SOL_SOCKET, optname, optval, optlen);
-*/ if(ioctlsocket (fd, FIONBIO , &argp) == -1)
- return(-1);
-#else
- if ( sock_flags == -1 )
- sock_flags = fcntl(fd, F_GETFL, 0);
- if ( fcntl(fd, F_SETFL, O_NONBLOCK) == -1 )
- return(-1);
-#endif
- non_blocking = 1;
- return(0);
-}
-
-
-/*
-static int set_blocking(int fd)
-{
-#ifdef PHP_WIN32
- unsigned int argp=1;
-
- if(ioctlsocket (fd, FIONBIO , &argp) == -1)
- return(-1);
-#else
- if ( fcntl(fd, F_SETFL, sock_flags) == -1 )
- return(-1);
-#endif
- return(0);
-}
-*/
-
-static int hg_read_exact(int sockfd, char *buf, int size)
-{
- int len = 0;
-
- len = read_to(sockfd, (void *) buf, size, rtimeout);
- if ( len < 0 )
- return -1;
- return(len);
-}
-
-/*
-static int hg_read(int sockfd, char *buf, int size)
-{
- int try = 0;
- int len = 0;
-
- if ( !non_blocking )
- set_nonblocking(sockfd);
- while ( len == 0 ) {
- len = recv(sockfd, (void *) buf, size, 0);
- if ( len == -1 ) {
- if ( (errno == EAGAIN) || (errno == EWOULDBLOCK) ) {
- if ( ++try > 5 )
- return(-1);
- php_sleep(1);
- }
- else return(-1);
- }
- }
- return(len);
-}
-*/
-
-static int hg_write(int sockfd, char *buf, int size)
-{
- int try = 0;
- int len = 0;
-
- if ( !non_blocking )
- set_nonblocking(sockfd);
- while ( size > 0 ) {
- len = send(sockfd, (void *) buf, size, 0);
- if ( len == -1 ) {
- if ( (errno == EAGAIN) || (errno == EWOULDBLOCK) ) {
- if ( ++try > 5 )
- return(-1);
- php_sleep(1);
- }
- else return(-1);
- }
- else {
- size -= len;
- buf += len;
- try = 0;
- }
- }
- return(0);
-}
-
-hg_msg *recv_hg_msg_head(int sockfd)
-{
- hg_msg *msg;
-
- if ( (msg = (hg_msg *)emalloc(sizeof(hg_msg))) == NULL ) {
- lowerror = LE_MALLOC;
- return(NULL);
- }
-
- if ( hg_read_exact(sockfd, (char *)&(msg->length), 4) == -1 ) {
- efree(msg);
- return(NULL);
- }
-
- if ( hg_read_exact(sockfd, (char *)&(msg->version_msgid), 4) == -1 ) {
- efree(msg);
- return(NULL);
- }
-
- if ( hg_read_exact(sockfd, (char *)&(msg->msg_type), 4) == -1 ) {
- efree(msg);
- return(NULL);
- }
-
-#ifdef HW_DEBUG
- php_printf("<b> Recv msg: </b>type = %d -- id = %d<br />\n", msg->msg_type, msg->version_msgid);
-#endif
- return(msg);
-}
-
-
-hg_msg *recv_hg_msg(int sockfd)
-{
- hg_msg *msg;
-
- if ( (msg = (hg_msg *)emalloc(sizeof(hg_msg))) == NULL ) {
-/* php_printf("recv_hg_msg"); */
- lowerror = LE_MALLOC;
- return(NULL);
- }
-
- if ( hg_read_exact(sockfd, (char *)&(msg->length), 4) == -1 ) {
-/* php_printf("recv_hg_msg: hg_read (1) returned -1\n"); */
- efree(msg);
- return(NULL);
- }
-
- if ( hg_read_exact(sockfd, (char *)&(msg->version_msgid), 4) == -1 ) {
-/* php_printf("recv_hg_msg: hg_read (2) returned -1\n"); */
- efree(msg);
- return(NULL);
- }
-
- if ( hg_read_exact(sockfd, (char *)&(msg->msg_type), 4) == -1 ) {
-/* php_printf("recv_hg_msg: hg_read (3) returned -1\n"); */
- efree(msg);
- return(NULL);
- }
-
- if ( msg->length > HEADER_LENGTH ) {
- if ( (msg->buf = (char *) emalloc(msg->length-HEADER_LENGTH)) == NULL ) {
-/* php_printf("recv_hg_msg"); */
- lowerror = LE_MALLOC;
- efree(msg);
- return(NULL);
- }
- if ( hg_read_exact(sockfd, msg->buf, msg->length-HEADER_LENGTH) == -1 ) {
-/* php_printf("recv_hg_msg: hg_read (4) returned -1\n"); */
- efree(msg->buf);
- efree(msg);
- return(NULL);
- }
- }
- else
- msg->buf = NULL;
-
-#ifdef HW_DEBUG
- php_printf("<b> Recv msg: </b>type = %d -- id = %d<br />\n", msg->msg_type, msg->version_msgid);
-#endif
- return(msg);
-}
-
-
-hg_msg *recv_ready(int sockfd)
-{
- hg_msg *ready_msg;
-
- if ( (ready_msg = recv_hg_msg(sockfd)) == NULL ) {
-/* php_printf("recv_ready: recv_hg_msg returned NULL\n"); */
- return(NULL);
- }
- if ( ready_msg->msg_type != READY_MESSAGE ) {
-/* php_printf("recv_ready: recv_hg_msg returned wrong message: %d, %d \n", ready_msg->length, ready_msg->msg_type); */
- efree(ready_msg);
- return(NULL);
- }
-
- return(ready_msg);
-}
-
-
-hg_msg *recv_command(int sockfd)
-{
- hg_msg *comm_msg;
-
- if ( (comm_msg = recv_hg_msg(sockfd)) == NULL ) {
-/* fprintf(stderr, "recv_command: recv_hg_msg returned NULL\n"); */
- return(NULL);
- }
- if ( comm_msg->msg_type != COMMAND_MESSAGE ) {
-/* fprintf(stderr, "recv_command: recv_hg_msg returned wrong message\n"); */
- return(NULL);
- }
-
- return(comm_msg);
-}
-
-int send_dummy(int sockfd, hw_objectID objectID, int msgid, char **attributes)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, msgid);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- *attributes = NULL;
- return(-1);
- }
-
- if(0 == (int) *(retmsg->buf)) {
- *attributes = estrdup(retmsg->buf+sizeof(int));
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- error = *((int *) retmsg->buf);
- *attributes = NULL;
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- return(0);
-}
-
-static int bh_send_deleteobject(int sockfd, hw_objectID objectID) {
- hg_msg msg;
- int length;
- char *tmp;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, DELETEOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
- efree(msg.buf);
-
- return(msgid-1);
-}
-
-static int uh_send_deleteobject(int sockfd) {
- hg_msg *retmsg;
- int error;
-
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- if(NULL == retmsg->buf) {
- efree(retmsg);
- return -1;
- }
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return(error);
-}
-
-int send_deleteobject(int sockfd, hw_objectID objectID)
-{
- if(0 > bh_send_deleteobject(sockfd, objectID))
- return -1;
- return(uh_send_deleteobject(sockfd));
-}
-
-static int bh_send_changeobject(int sockfd, hw_objectID objectID, char *mod) {
- hg_msg msg;
- int length;
- char *tmp;
-
- length = HEADER_LENGTH + sizeof(hw_objectID) + strlen(mod) + 1;
-
- build_msg_header(&msg, length, msgid++, CHANGEOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
- tmp = build_msg_str(tmp, mod);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
- efree(msg.buf);
-
- return(msgid-1);
-}
-
-static int uh_send_changeobject(int sockfd) {
- hg_msg *retmsg;
- int error;
-
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return(error);
-}
-
-int send_changeobject(int sockfd, hw_objectID objectID, char *modification)
-{
- if(0 > bh_send_changeobject(sockfd, objectID, modification))
- return -1;
- return(uh_send_changeobject(sockfd));
-}
-
-int send_groupchangeobject(int sockfd, hw_objectID objectID, char *modification)
-{
- hw_objectID *childIDs;
- int count, i, error;
-
- if(0 == (error = send_lock(sockfd, objectID))) {
- send_changeobject(sockfd, objectID, modification);
- send_unlock(sockfd, objectID);
- }/* else
- fprintf(stderr, "Could not lock 0x%X (error = %d)\n", objectID, error); */
-
- if(0 == send_children(sockfd, objectID, &childIDs, &count)) {
-/* fprintf(stderr, "Changing Children of 0x%X\n", objectID); */
- for(i=0; i<count; i++)
- if(0 > send_groupchangeobject(sockfd, childIDs[i], modification))
-/* fprintf(stderr, "Cannot change 0x%X\n", objectID) */;
- if(childIDs)
- efree(childIDs);
- }/* else
- fprintf(stderr, "No Children of 0x%X\n", objectID); */
- return(0);
-}
-
-static int bh_send_getobject(int sockfd, hw_objectID objectID) {
- hg_msg msg;
- int length;
- char *tmp;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
- efree(msg.buf);
-
- return(msgid-1);
-}
-
-static int uh_send_getobject(int sockfd, char **attributes) {
- hg_msg *retmsg;
- int error;
-
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- *attributes = NULL;
- return(-1);
- }
-
- if(0 == (int) *(retmsg->buf)) {
- *attributes = estrdup(retmsg->buf+sizeof(int));
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- error = *((int *) retmsg->buf);
- *attributes = NULL;
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- return(0);
-}
-
-int send_getobject(int sockfd, hw_objectID objectID, char **attributes)
-{
- if(0 > bh_send_getobject(sockfd, objectID))
- return -1;
- return(uh_send_getobject(sockfd, attributes));
-}
-
-int send_getandlock(int sockfd, hw_objectID objectID, char **attributes)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETANDLOCK_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- *attributes = NULL;
- return(-1);
- }
-
- if(0 == (error = (int) *(retmsg->buf))) {
- *attributes = estrdup(retmsg->buf+sizeof(int));
- } else {
- *attributes = NULL;
- }
-
- efree(retmsg->buf);
- efree(retmsg);
- return error;
-}
-
-int send_lock(int sockfd, hw_objectID objectID)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETANDLOCK_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- error = *((int *) retmsg->buf);
-
- efree(retmsg->buf);
- efree(retmsg);
- return error;
-}
-
-int send_insertobject(int sockfd, char *objrec, char *parms, hw_objectID *objectID)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr;
-
- length = HEADER_LENGTH + strlen(objrec) + 1 + strlen(parms) + 1;
-
- build_msg_header(&msg, length, msgid++, INSERTOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, objrec);
- tmp = build_msg_str(tmp, parms);
-/*fprintf(stderr, "objrec = %s, parms = %s\n", objrec, parms); */
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- *objectID = 0;
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(0 == (error = *ptr)) {
- ptr++;
- *objectID = *ptr;
- } else {
- *objectID = 0;
- }
- efree(retmsg->buf);
- efree(retmsg);
- return error;
-}
-
-int send_unlock(int sockfd, hw_objectID objectID)
-{
- hg_msg msg;
- int length;
- char *tmp;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, UNLOCK_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- return 0;
-}
-
-int send_incollections(int sockfd, int retcol, int cobjids, hw_objectID *objectIDs, int ccollids, hw_objectID *collIDs, int *count, hw_objectID **retIDs)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr, *ptr1, i;
-
- length = HEADER_LENGTH + sizeof(hw_objectID) + (cobjids + ccollids) * sizeof(hw_objectID) + 2 * sizeof(int);
-
- build_msg_header(&msg, length, msgid++, INCOLLECTIONS_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-3);
- }
-
- tmp = build_msg_int(msg.buf, retcol);
- tmp = build_msg_int(tmp, cobjids);
- for(i=0; i<cobjids; i++)
- tmp = build_msg_int(tmp, objectIDs[i]);
- tmp = build_msg_int(tmp, ccollids);
- for(i=0; i<ccollids; i++)
- tmp = build_msg_int(tmp, collIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-2);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if(retmsg == NULL) {
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr;
- ptr++;
- if(NULL != (*retIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *retIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- if(retmsg->buf) efree(retmsg->buf);
- if(retmsg) efree(retmsg);
- return error;
- }
- return(0);
-}
-
-
-int send_inscoll(int sockfd, hw_objectID objectID, char *objrec, hw_objectID *new_objectID)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr;
-
- length = HEADER_LENGTH + sizeof(hw_objectID) + strlen(objrec) + 1;
-
- build_msg_header(&msg, length, msgid++, INSCOLL_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-3);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
- tmp = build_msg_str(tmp, objrec);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-2);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if(retmsg == NULL) {
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(0 != (error = *ptr)) {
- efree(retmsg->buf);
- efree(retmsg);
- *new_objectID = 0;
- return error;
- }
-
- ptr++;
- *new_objectID = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- return 0;
-}
-
-int send_insdoc(int sockfd, hw_objectID objectID, char *objrec, char *text, hw_objectID *new_objectID)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr;
-
- length = HEADER_LENGTH + sizeof(hw_objectID) + strlen(objrec) + 1;
- if(text) {
- length += strlen(text);
- length++;
- }
-
- build_msg_header(&msg, length, msgid++, INSDOC_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-3);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
- tmp = build_msg_str(tmp, objrec);
- if(text)
- tmp = build_msg_str(tmp, text);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-2);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if(retmsg == NULL) {
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(0 != (error = *ptr)) {
- efree(retmsg->buf);
- efree(retmsg);
- *new_objectID = 0;
- return error;
- }
-
- ptr++;
- *new_objectID = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- return 0;
-}
-
-int send_getdestforanchorsobj(int sockfd, char **anchorrec, char ***destrec, int count);
-int send_getreldestforanchorsobj(int sockfd, char **anchorrec, char ***reldestrec, int count, int rootID, int thisID);
-
-int send_gettext(int sockfd, hw_objectID objectID, int mode, int rootid, char **objattr, char **bodytag, char **text, int *count, char *urlprefix)
-{
- hg_msg msg, *retmsg;
- int length, *ptr, ancount, error;
- char *tmp, *attributes, *documenttype;
- char **anchors;
- int i;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if(retmsg == NULL) {
- attributes = NULL;
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(*ptr == 0) {
- attributes = estrdup(retmsg->buf+sizeof(int));
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- error = *ptr;
- attributes = NULL;
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- length = HEADER_LENGTH + strlen(attributes) + 1;
- build_msg_header(&msg, length, msgid++, GETTEXT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, attributes);
-
- documenttype = fnAttributeValue(attributes, "DocumentType");
- *objattr = strdup(attributes);
- efree(attributes);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if (retmsg == NULL) {
- *text = NULL;
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(*ptr == 0) {
- ptr++;
- *count = retmsg->length-HEADER_LENGTH-sizeof(int);
- if(NULL != (*text = malloc(*count + 1))) {
- memcpy(*text, retmsg->buf+sizeof(int), *count);
-/* *text[*count] = 0; */
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- *text = NULL;
- return(error);
- }
- efree(retmsg->buf);
- efree(retmsg);
-
- if((documenttype != NULL) && (strcmp(documenttype, "Image") != 0)) {
- if(send_getanchorsobj(sockfd, objectID, &anchors, &ancount) == 0) {
- char **destrec, **reldestrec;
-#ifdef newlist
- zend_llist *pAnchorList;
-#else
- DLIST *pAnchorList;
-#endif
-
- /* Get dest as relative and absolut path */
- send_getdestforanchorsobj(sockfd, anchors, &destrec, ancount);
- send_getreldestforanchorsobj(sockfd, anchors, &reldestrec, ancount, rootid, objectID);
- pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode);
-
- /* Free only the array, the objrecs has been freed in fnCreateAnchorList() */
- if(anchors) efree(anchors);
- if(destrec) efree(destrec);
- if(reldestrec) efree(reldestrec);
-
- if(pAnchorList != NULL) {
- char *newtext;
- char *body = NULL;
- char **prefixarray;
-
- prefixarray = emalloc(5*sizeof(char *));
- for(i=0; i<5; i++)
- prefixarray[i] = urlprefix;
-
- newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body, prefixarray);
-
- efree(prefixarray);
-#ifdef newlist
- zend_llist_destroy(pAnchorList);
- efree(pAnchorList);
-#else
- dlst_kill(pAnchorList, fnDeleteAnchor);
-#endif
- *bodytag = strdup(body);
- if(body) efree(body);
- *text = newtext;
- *count = strlen(newtext);
- }
- }
- }
-
- if(documenttype) efree(documenttype);
- return(0);
-}
-
-int send_insertanchors(char **text, int *count, char **anchors, char **destrec, int ancount, char **urlprefix, char **bodytag) {
- char **reldestrec = NULL;
- int mode = 0;
- hw_objectID objectID = 0;
-#ifdef newlist
- zend_llist *pAnchorList = NULL;
-#else
- DLIST *pAnchorList = NULL;
-#endif
- pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode);
-
- /* Free only the array, the objrecs has been freed in fnCreateAnchorList() */
- if(anchors) efree(anchors);
- if(destrec) efree(destrec);
- if(reldestrec) efree(reldestrec);
-
- if(pAnchorList != NULL) {
- char *newtext;
- char *body = NULL;
-
- newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body, urlprefix);
-
-#ifdef newlist
- zend_llist_destroy(pAnchorList);
- efree(pAnchorList);
-#else
- dlst_kill(pAnchorList, fnDeleteAnchor);
-#endif
- *bodytag = strdup(body);
- if(body) efree(body);
- *text = newtext;
- *count = strlen(newtext);
- }
- return 0;
-}
-
-int send_edittext(int sockfd, char *objattr, char *text)
-{
- hg_msg msg, *retmsg;
- int length, *ptr, error;
- char *tmp, *path, *objid;
- hw_objectID objectID;
-
- objid = fnAttributeValue(objattr, "ObjectID");
- if(objid == NULL)
- return(-1);
- if(!sscanf(objid, "0x%x", &objectID))
- return(-2);
-
- path = fnAttributeValue(objattr, "Path");
- if(path == NULL)
- return(-3);
-
- length = HEADER_LENGTH + sizeof(hw_objectID) + strlen(path) + 1 + 1 + strlen(text) + 1;
- build_msg_header(&msg, length, msgid++, EDITTEXT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-4);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
- tmp = build_msg_str(tmp, path);
- tmp = build_msg_str(tmp, "");
- tmp = build_msg_str(tmp, text);
-
- if(path) efree(path);
- if(objid) efree(objid);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-5);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if (retmsg == NULL) {
- *text = '\0';
- return(-6);
- }
-
- ptr = (int *) retmsg->buf;
- error = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- return(error);
-}
-
-int send_getcgi(int sockfd, hw_objectID objectID, char *cgi_env_str, char **objattr, char **text, int *count)
-{
- hg_msg msg, *retmsg;
- int length, *ptr, error, new_attr_len;
- char *tmp, *attributes, *new_attr;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if(retmsg == NULL) {
- attributes = NULL;
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(*ptr == 0) {
- attributes = estrdup(retmsg->buf+sizeof(int));
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- error = *ptr;
- attributes = NULL;
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- new_attr_len = strlen(attributes) + strlen(cgi_env_str) + 2;
- new_attr = malloc(new_attr_len);
- strcpy(new_attr, attributes);
- strcat(new_attr, cgi_env_str);
- length = HEADER_LENGTH + strlen(new_attr) + 1 + sizeof(int);
- build_msg_header(&msg, length, msgid++, GETCGI_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, new_attr);
- tmp = build_msg_int(tmp, 0);
-
- *objattr = strdup(attributes);
- efree(attributes);
- free(new_attr);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if (retmsg == NULL) {
- *text = NULL;
- return(-1);
- }
-
- /* Attention: It looks like the documentation is not quite right.
- According to the docs the buffer starts with an integer which
- is followed by the output of the cgi script. This seems not to
- be true. There is another integer right after the error.
- The output of the cgi script is also preceded by the 'Content-type'
- header. */
- ptr = (int *) retmsg->buf;
- if(*ptr++ == 1024) {
- *count = *ptr++;
- if(NULL != (*text = malloc(*count + 1))) {
- memcpy(*text, ptr, *count);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *ptr + 1024; /* move errors to >2024 */
- efree(retmsg->buf);
- efree(retmsg);
- *text = NULL;
- return(error);
- }
- efree(retmsg->buf);
- efree(retmsg);
-
- return(0);
-}
-
-int send_getremote(int sockfd, hw_objectID objectID, char **objattr, char **text, int *count)
-{
- hg_msg msg, *retmsg;
- int length, *ptr, error;
- char *tmp, *attributes;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if(retmsg == NULL) {
- attributes = NULL;
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(*ptr == 0) {
- attributes = estrdup(retmsg->buf+sizeof(int));
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- error = *ptr;
- attributes = NULL;
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- length = HEADER_LENGTH + strlen(attributes) + 1 + sizeof(int);
- build_msg_header(&msg, length, msgid++, GETREMOTE_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, attributes);
- tmp = build_msg_int(tmp, 0);
-
- *objattr = strdup(attributes);
- efree(attributes);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if (retmsg == NULL) {
- *text = NULL;
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(*ptr == 1024) {
- *count = retmsg->length-HEADER_LENGTH-sizeof(int)-sizeof(int);
- if(NULL != (*text = malloc(*count + 1))) {
- memcpy(*text, ptr+2, *count);
-/* *text[*count] = 0; */
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *ptr + 1024; /* move errors to >2024 */
- efree(retmsg->buf);
- efree(retmsg);
- *text = NULL;
- return(error);
- }
- efree(retmsg->buf);
- efree(retmsg);
-
- return(0);
-}
-
-int send_getremotechildren(int sockfd, char *attributes, char **text, int **childIDs, int *count)
-{
- hg_msg msg, *retmsg;
- int length, *ptr, *ptr1, error;
- char *tmp;
-
-/* length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if(retmsg == NULL) {
- attributes = NULL;
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(*ptr == 0) {
- attributes = estrdup(retmsg->buf+sizeof(int));
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- error = *ptr;
- attributes = NULL;
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-*/
- length = HEADER_LENGTH + strlen(attributes) + 1 + sizeof(int);
- build_msg_header(&msg, length, msgid++, GETREMOTECHILDREN_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, attributes);
- tmp = build_msg_int(tmp, 0);
-
-/* efree(attributes); */
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if (retmsg == NULL) {
- *childIDs = NULL;
- return(-1);
- }
- ptr = (int *) retmsg->buf;
- if(*ptr++ == 1024) {
- int i, remlen, sum;
- *count = *ptr;
- ptr++;
- if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *childIDs;
- sum = 0;
- for(i=0; i<*count; ptr++, i++) {
- ptr1[i] = *ptr;
- sum += *ptr;
- }
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- remlen = retmsg->length - HEADER_LENGTH - *count * sizeof(int) - 2 * sizeof(int);
-/*ptr1[i-1] = remlen; */
-/*ptr1[i-2] = sum; */
-/*ptr1[i-3] = *count; */
- if(NULL != (*text = emalloc(remlen + 1))) {
- memcpy(*text, ptr, remlen);
- } else {
- efree(childIDs);
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- *childIDs = NULL;
- *text = NULL;
- return error;
- }
- return(0);
-}
-
-int send_mvcpdocscollscoll(int sockfd, hw_objectID *objectIDs, int count, int from, int dest, int cpmv, int doccoll)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
-
- if(count <= 0)
- return 0;
-
- /* HEADER_LENGTH + cpmv + from + dest + count + nr of obj */
- length = HEADER_LENGTH + sizeof(hw_objectID) + sizeof(hw_objectID) + sizeof(hw_objectID) + sizeof(hw_objectID) + count * sizeof(hw_objectID);
-
- switch(doccoll) {
- case DOCUMENT:
- build_msg_header(&msg, length, msgid++, MVCPDOCSCOLL_MESSAGE);
- break;
- case COLLECTION:
- build_msg_header(&msg, length, msgid++, MVCPCOLLSCOLL_MESSAGE);
- break;
- }
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, cpmv);
- tmp = build_msg_int(tmp, from);
- tmp = build_msg_int(tmp, dest);
- tmp = build_msg_int(tmp, count);
- for(i=0; i<count;i++)
- tmp = build_msg_int(tmp, objectIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return(error);
-}
-
-int send_docbyanchor(int sockfd, hw_objectID objectID, hw_objectID *anchorID)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETDOCBYANCHOR_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- error = *ptr++;
- if(error == 0) {
- *anchorID = *ptr;
- } else {
- *anchorID = 0;
- }
- efree(retmsg->buf);
- efree(retmsg);
- return error;
-}
-
-int send_docbyanchorobj(int sockfd, hw_objectID objectID, char **objrec)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr, anchorID;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETDOCBYANCHOR_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- error = *ptr++;
- if(error == 0) {
- anchorID = *ptr;
- } else {
- anchorID = 0;
- }
- efree(retmsg->buf);
- efree(retmsg);
-
- if(0 > bh_send_getobject(sockfd, anchorID))
- return -1;
- return(uh_send_getobject(sockfd, objrec));
-}
-
-int send_children(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- int *ptr, *ptr1;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, CHILDREN_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if (-1 == send_hg_msg(sockfd, &msg, length)) {
- efree(msg.buf);
- return(-2);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-3);
- }
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- return(0);
-}
-
-int send_childrenobj(int sockfd, hw_objectID objectID, char ***childrec, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- int *childIDs = NULL;
- int *ptr;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, CHILDREN_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- for(i=0; i<*count; ptr++, i++)
- childIDs[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- /* Now get for each child collection the object record */
-#ifdef hw_less_server_stress
- if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) {
- efree(childIDs);
- return -2;
- }
- efree(childIDs);
-#else
- for(i=0; i<*count; i++) {
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- efree(childIDs);
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, childIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(childIDs);
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- }
- efree(childIDs);
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-#endif
- return(0);
-}
-
-int send_getchildcoll(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr, i, *ptr1;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETCHILDCOLL_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- return(0);
-}
-
-int send_getchildcollobj(int sockfd, hw_objectID objectID, char ***childrec, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- int *childIDs = NULL;
- int *ptr;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETCHILDCOLL_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- for(i=0; i<*count; ptr++, i++)
- childIDs[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- /* Now get for each child collection the object record */
-#ifdef hw_less_server_stress
- if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) {
- efree(childIDs);
- return -2;
- }
- efree(childIDs);
-#else
- for(i=0; i<*count; i++) {
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- efree(childIDs);
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, childIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(childIDs);
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- }
- efree(childIDs);
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-#endif
- return(0);
-}
-
-int send_getchilddoccoll(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETCHILDDOCCOLL_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- } else {
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- int *ptr, i, *ptr1;
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
- }
- }
-
- return(0);
-
-}
-
-int send_getchilddoccollobj(int sockfd, hw_objectID objectID, hw_objrec ***childrec, int *count)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *childIDs = NULL;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETCHILDDOCCOLL_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
- efree(msg.buf);
-
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- int *ptr, i;
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg->buf) efree(retmsg->buf);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- for(i=0; i<*count; ptr++, i++)
- childIDs[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
- }
-
- /* Now get for each child collection the object record */
-#ifdef hw_less_server_stress
- if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) {
- efree(childIDs);
- return -2;
- }
- efree(childIDs);
-#else
- for(i=0; i<*count; i++) {
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, childIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- }
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-#endif
- return(0);
-}
-
-int send_getanchors(int sockfd, hw_objectID objectID, int **anchorIDs, int *count)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr, i, *ptr1;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETANCHORS_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
- efree(msg.buf);
-
- if (NULL == (retmsg = recv_hg_msg(sockfd)))
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (*anchorIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *anchorIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- return(0);
-}
-
-int send_getanchorsobj(int sockfd, hw_objectID objectID, char ***childrec, int *count)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr, i, *ptr1;
- int *anchorIDs = NULL;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, 50, GETANCHORS_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
- efree(msg.buf);
-
- if (NULL == (retmsg = recv_hg_msg(sockfd)))
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (anchorIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = anchorIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- /* Now get for each anchor the object record */
-#ifdef hw_less_server_stress
- if(0 != send_objectbyidquery(sockfd, anchorIDs, count, NULL, childrec)) {
- efree(anchorIDs);
- return -2;
- }
- efree(anchorIDs);
-#else
- for(i=0; i<*count; i++) {
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, anchorIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, anchorIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- }
- if(anchorIDs) efree(anchorIDs);
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-#endif
- return(0);
-}
-
-int send_getdestforanchorsobj(int sockfd, char **anchorrec, char ***destrec, int count)
-{
- int i;
- char *objptr, **destptr;
- char *str;
- int objectID;
-
- if(NULL == (destptr = (char **) emalloc(count * sizeof(hw_objrec *)))) {
- lowerror = LE_MALLOC;
- return -1;
- }
-
- /* Now get for each anchor the object record of its destination */
- for(i=0; i<count; i++) {
- /* if you retrieve the anchors you sometimes get more than actually accessible.
- */
- if((NULL != anchorrec[i]) && (NULL != (str = fnAttributeValue(anchorrec[i], "Dest")))) {
- sscanf(str, "0x%x", &objectID);
- efree(str);
-
- /* Using send_docbyanchorobj() makes sense because the Destination can
- be both, an anchor or a document. If it is a document you get the
- objectrecord of that document. If it is an anchor the function
- graps the document which belongs to the anchor
- and you get also the objectrecord of that document.
- */
- if(0 > send_docbyanchorobj(sockfd, objectID, &objptr)) {
- efree(destptr);
- return -1;
- }
- destptr[i] = objptr;
- /* if we can't get the object rec of the dest, than this document
- is probably not accessible for us. For later functions simply
- set anchorrec[i] to NULL */
- if(destptr[i] == NULL) {
- if(anchorrec[i]) efree(anchorrec[i]);
- anchorrec[i] = NULL;
- }
- } else {
- destptr[i] = NULL;
- }
- }
- *destrec = destptr;
-
- return(0);
-}
-
-int send_getreldestforanchorsobj(int sockfd, char **anchorrec, char ***reldestrec, int count, int rootID, int thisID)
-{
- int i;
- char *docofanchorptr, **reldestptr;
- char *str;
- int destobjectID;
-
- if(NULL == (reldestptr = (char **) emalloc(count * sizeof(char *)))) {
- lowerror = LE_MALLOC;
- return -1;
- }
-
- /* Now get for each anchor the object record of its destination */
- for(i=0; i<count; i++) {
- /* if you retrieve the anchors you sometimes get more than actually accessible.
- */
- if((NULL != anchorrec[i]) && (NULL != (str = fnAttributeValue(anchorrec[i], "Dest")))) {
- sscanf(str, "0x%x", &destobjectID);
- efree(str);
-
- /* See note in send_getdestforanchorsobj() at same position in source code */
- if(0 > send_docbyanchorobj(sockfd, destobjectID, &docofanchorptr)) {
- efree(reldestptr);
- return -1;
- }
-
- reldestptr[i] = docofanchorptr;
- /* if we can't get the object rec of the dest, than this document
- is probably not accessible for us. For later functions simply
- set anchorrec[i] to NULL */
- if(reldestptr[i] == NULL) {
- if(anchorrec[i]) efree(anchorrec[i]);
- anchorrec[i] = NULL;
- } else {
- int j, *retthisIDs, *retdestIDs, equaltill, mincount, countthis, countdest, destdocid;
- char destdocname[200];
- char anchorstr[300];
- char temp[200];
- char *strptr;
-
- if(NULL != (str = strstr(docofanchorptr, "Name="))) {
- str += 5;
- sscanf(str, "%s\n", destdocname);
- }
- if(NULL != (str = strstr(docofanchorptr, "ObjectID="))) {
- str += 9;
- sscanf(str, "0x%X", &destdocid);
- }
-
- send_incollections(sockfd, 1, 1, &thisID, 1, &rootID, &countthis, &retthisIDs);
- send_incollections(sockfd, 1, 1, &destdocid, 1, &rootID, &countdest, &retdestIDs);
-
-/*
-fprintf(stderr, "%d: ", thisID);
-for(k=0; k<countthis; k++)
- fprintf(stderr, "%d, ", retthisIDs[k]);
-fprintf(stderr, "\n");
-fprintf(stderr, "%d: ", destdocid);
-for(k=0; k<countdest; k++)
- fprintf(stderr, "%d: %d, ", destdocid, retdestIDs[k]);
-fprintf(stderr, "\n");
-*/
-
- mincount = (countthis < countdest) ? countthis : countdest;
- for(j=0; (j<mincount) && (retthisIDs[j]==retdestIDs[j]); j++)
- ;
- equaltill = j;
- strcpy(anchorstr, "Name=");
- for(j=equaltill; j<countthis; j++)
- strcat(anchorstr, "../");
- strcat(anchorstr, "./");
- for(j=equaltill; j<countdest; j++) {
- char *temprec, tempname[100];
- send_getobject(sockfd, retdestIDs[j], &temprec);
- if(NULL != (str = strstr(temprec, "Name="))) {
- str += 5;
- sscanf(str, "%s\n", tempname);
- } else if(NULL != (str = strstr(temprec, "ObjectID="))) {
- str += 9;
- sscanf(str, "%s\n", tempname);
- }
-
- sprintf(temp, "%s", tempname);
- strptr = temp;
- while(*strptr != '\0') {
- if(*strptr == '/')
- *strptr = '_';
- strptr++;
- }
-/* fprintf(stderr, "Adding '%s' to '%s'\n", temp, anchorstr); */
- strcat(anchorstr, temp);
- strcat(anchorstr, "/");
-/* fprintf(stderr, "Is now '%s'\n", anchorstr); */
- efree(temprec);
- }
- /* if the anchor destination is a collection it may not be added anymore. */
- if(destdocid != retdestIDs[countdest-1]) {
- strptr = destdocname;
- while(*strptr != '\0') {
- if(*strptr == '/')
- *strptr = '_';
- strptr++;
- }
- strcat(anchorstr, destdocname);
- } else {
- strcat(anchorstr, "index.html");
- }
- strcat(anchorstr, "\n");
- sprintf(temp, "ObjectID=0x%x", destdocid);
- strcat(anchorstr, temp);
-/* fprintf(stderr, "%s\n", anchorstr); */
- efree(retthisIDs);
- efree(retdestIDs);
- efree(reldestptr[i]);
- reldestptr[i] = estrdup(anchorstr);
- }
- } else {
- reldestptr[i] = NULL;
- }
- }
- *reldestrec = reldestptr;
-
- return(0);
-}
-
-int fn_findpath(int sockfd, int *retIDs, int count, int id) {
- int *pathIDs;
- int *parentIDs, pcount, pid;
- int u, j, i;
-
- if(NULL == (pathIDs = emalloc(count * sizeof(int)))) {
- lowerror = LE_MALLOC;
- return -1;
- }
- u = count-1;
- pid = id;
- pcount = 1;
- /* FIXME but parentIDs is not set at this point, why checking it? */
- while((u >= 0) && (pcount != 0) && (parentIDs != NULL) && (pid != 0)) {
-/*fprintf(stderr, "Get parents for %d\n", pid); */
- if(0 != send_getparents(sockfd, pid, &parentIDs, &pcount)) {
- efree(pathIDs);
- return -1;
- }
- pid = 0;
- for(i=0; i<pcount; i++) {
- for(j=0; j<count; j++) {
- if(parentIDs[i] == retIDs[j]) {
- pathIDs[u--] = retIDs[j];
- pid = retIDs[j];
- }
- }
- }
- if(pid == 0)
- fprintf(stderr, "parent not found in list\n");
- if(parentIDs) efree(parentIDs);
- }
-/*fprintf(stderr, "sorted path: "); */
- for(i=0; i<count; i++) {
- retIDs[i] = pathIDs[i];
-/*fprintf(stderr, "%d, ", retIDs[i]); */
- }
-/*fprintf(stderr, "\n"); */
- efree(pathIDs);
- return 0;
-}
-
-/********************************************************************
-* function getrellink() *
-* *
-* Returns the link to point from document with ID sourceID to *
-* document with id destID. *
-********************************************************************/
-int getrellink(int sockfd, int rootID, int thisID, int destID, char **reldeststr) {
- int i, j, k, *retthisIDs, *retdestIDs, equaltill, count, mincount, countthis, countdest;
- char anchorstr[300];
- char temp[200];
- char *strptr;
-
- send_incollections(sockfd, 1, 1, &thisID, 1, &rootID, &countthis, &retthisIDs);
- send_incollections(sockfd, 1, 1, &destID, 1, &rootID, &countdest, &retdestIDs);
-
-
-fprintf(stderr, "%d: ", thisID);
-for(k=0; k<countthis; k++)
- fprintf(stderr, "%d, ", retthisIDs[k]);
-fprintf(stderr, "\n");
-fprintf(stderr, "%d: ", destID);
-for(k=0; k<countdest; k++)
- fprintf(stderr, "%d, ", retdestIDs[k]);
-fprintf(stderr, "\n");
-
- /*
- ** The message incollections returned a list of collections
- ** in which the destID or thisID is contained. Unfortunately
- ** this list ist not the path for the destID or thisID, but
- ** a sorted list of collection IDs. If for example you are
- ** looking for an ID 20 which has a path 1 -> 5 -> 4 -> 20
- ** (this means: 20 is child of 4, 4 is child of 5, 5 is child
- ** of 1) it will return 1, 4, 5 instead of 1, 5, 4
- ** Consequently, we have to create the correct path, by checking
- ** for the parents and identifying it in the list.
- ** But there is another problem. If the id for which the list of
- ** of collection is generated is a colletion itself, it will
- ** show up in the list as well. In order to make the algorithmn
- ** work proberly it has to be the last member of the list.
- */
- for(i=0; i<countdest; i++)
- if(retdestIDs[i] == destID) {
- retdestIDs[i] = retdestIDs[countdest-1];
- retdestIDs[countdest-1] = destID;
- }
- count = (retdestIDs[countdest-1] == destID) ? countdest-1 : countdest;
- if(0 != fn_findpath(sockfd, retdestIDs, count, destID)) {
- efree(retthisIDs);
- efree(retdestIDs);
- return -1;
- }
- for(i=0; i<countthis; i++)
- if(retthisIDs[i] == thisID) {
- retthisIDs[i] = retthisIDs[countthis-1];
- retthisIDs[countthis-1] = thisID;
- }
- count = (retthisIDs[countthis-1] == thisID) ? countthis-1 : countthis;
- if(0 != fn_findpath(sockfd, retthisIDs, count, thisID)) {
- efree(retthisIDs);
- efree(retdestIDs);
- return -1;
- }
-
- mincount = (countthis < countdest) ? countthis : countdest;
-fprintf(stderr, "mincount = %d\n", mincount);
- for(j=0; (j<mincount) && (retthisIDs[j]==retdestIDs[j]); j++)
- ;
- equaltill = j;
-fprintf(stderr, "first unequal = %d\n", j);
- strcpy(anchorstr, "");
- for(j=equaltill; j<countthis; j++)
- strcat(anchorstr, "../");
- strcat(anchorstr, "./");
- for(j=equaltill; j<countdest; j++) {
- char *temprec, *str, tempname[100];
- if(0 == send_getobject(sockfd, retdestIDs[j], &temprec)) {
- if(NULL != (str = strstr(temprec, "Name="))) {
- str += 5;
- sscanf(str, "%s\n", tempname);
- } else if(NULL != (str = strstr(temprec, "ObjectID="))) {
- str += 9;
- sscanf(str, "%s\n", tempname);
- }
-
- sprintf(temp, "%s", tempname);
- strptr = temp;
- while(*strptr != '\0') {
- if(*strptr == '/')
- *strptr = '_';
- strptr++;
- }
-fprintf(stderr, "Adding '%s' (%d) to '%s'\n", temp, retdestIDs[j], anchorstr);
- strcat(anchorstr, temp);
- strcat(anchorstr, "/");
-fprintf(stderr, "Is now '%s'\n", anchorstr);
- efree(temprec);
- } else {
- strcat(anchorstr, "No access/");
- }
- }
- /* if the anchor destination is a collection it may not be added anymore. */
- if(destID != retdestIDs[countdest-1]) {
- char destdocname[100], *str;
- send_getobject(sockfd, destID, &str);
- if(NULL != (strptr = strstr(str, "Name="))) {
- strptr += 5;
- sscanf(strptr, "%s\n", destdocname);
- }
- strptr = destdocname;
- while(*strptr != '\0') {
- if(*strptr == '/')
- *strptr = '_';
- strptr++;
- }
- strcat(anchorstr, destdocname);
- efree(str);
- } else {
-/* strcat(anchorstr, "index.html"); */
- }
-/*fprintf(stderr, "%s\n", anchorstr); */
- efree(retthisIDs);
- efree(retdestIDs);
- *reldeststr = estrdup(anchorstr);
- return 0;
-}
-
-int send_identify(int sockfd, char *name, char *passwd, char **userdata) {
- hg_msg msg, *retmsg;
- int length;
- char *tmp;
-
- length = HEADER_LENGTH + sizeof(int) + strlen(name) + 1 + strlen(passwd) + 1;
-
- build_msg_header(&msg, length, msgid++, IDENTIFY_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, 0);
- tmp = build_msg_str(tmp, name);
- tmp = build_msg_str(tmp, passwd);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- *userdata = (char *) retmsg->buf;
- efree(retmsg);
-
- return(0);
-}
-
-int send_objectbyidquery(int sockfd, hw_objectID *IDs, int *count, char *query, char ***objrecs)
-{
- hg_msg msg, *retmsg;
- int length;
- char *tmp, *str;
- int *ptr, i;
- int *offsets, *childIDs;
- char **childrec;
-
- if(*count <= 0) {
- *objrecs = emalloc(0);
- return(0);
- }
- length = HEADER_LENGTH + sizeof(int) + sizeof(int) + *count * sizeof(hw_objectID);
- if(query)
- length = length + strlen(query) + 1;
-
- build_msg_header(&msg, length, msgid++, OBJECTBYIDQUERY_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, 1);
- tmp = build_msg_int(tmp, *count);
- for(i=0; i<*count; i++)
- tmp = build_msg_int(tmp, IDs[i]);
- if(query)
- tmp = build_msg_str(tmp, query);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
- efree(msg.buf);
-
-#ifdef hw_optimize
- {
- int hg_error;
- int c, allc;
-
- allc = 0;
- retmsg = recv_hg_msg_head(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- /* read error field */
- if ( (c = hg_read_exact(sockfd, (char *) &hg_error, 4)) == -1 ) {
- if(retmsg) efree(retmsg);
- return(-2);
- }
- allc += c;
-
- if(hg_error) {
- if(retmsg) efree(retmsg);
- return(-3);
- }
-
- /* read count field */
- if ( (c = hg_read_exact(sockfd, (char *) count, 4)) == -1 ) {
- if(retmsg) efree(retmsg);
- return(-2);
- }
- allc += c;
-
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- if((c = hg_read_exact(sockfd, (char *) childIDs, *count * sizeof(hw_objectID))) == -1) {
- efree(childIDs);
- if(retmsg) efree(retmsg);
- return(-3);
- }
- } else {
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-4);
- }
- allc += c;
-
- if(NULL != (offsets = emalloc(*count * sizeof(int)))) {
- if((c = hg_read_exact(sockfd, (char *) offsets, *count * sizeof(int))) == -1) {
- efree(childIDs);
- efree(offsets);
- if(retmsg) efree(retmsg);
- return(-5);
- }
- } else {
- efree(retmsg);
- efree(childIDs);
- lowerror = LE_MALLOC;
- return(-6);
- }
- allc += c;
-
- str = (char *)ptr;
- if(NULL == (childrec = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- efree(offsets);
- efree(childIDs);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- for(i=0; i<*count; i++) {
- char *ptr;
- childrec[i] = emalloc(offsets[i] + 1);
- ptr = childrec[i];
- c = hg_read_exact(sockfd, (char *) ptr, offsets[i]);
- ptr[c] = '\0';
- allc += c;
- }
- /* Reading the trailing '\0' */
- c = hg_read_exact(sockfd, (char *) &hg_error, 1);
- *objrecs = childrec;
- }
- }
-#else
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ != 0) {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- *count = *ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- if(NULL != (offsets = emalloc(*count * sizeof(int)))) {
- ptr1 = offsets;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- efree(childIDs);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- str = (char *)ptr;
- if(NULL == (childrec = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- efree(offsets);
- efree(childIDs);
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- for(i=0; i<*count; i++) {
- char *ptr;
- childrec[i] = emalloc(offsets[i] + 1);
- ptr = childrec[i];
- memcpy(ptr, str, offsets[i]);
- ptr[offsets[i]] = '\0';
- str += offsets[i];
- }
- *objrecs = childrec;
- }
-
- efree(retmsg->buf);
-#endif
-
- efree(retmsg);
- efree(childIDs);
- efree(offsets);
- return(0);
-}
-
-int send_getobjbyquery(int sockfd, char *query, int maxhits, hw_objectID **childIDs, int *count)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr, i, *ptr1;
-
- length = HEADER_LENGTH + strlen(query) + 1;
-
- build_msg_header(&msg, length, msgid++, GETOBJBYQUERY_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, query);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = (*ptr < maxhits) ? *ptr : maxhits;
- ptr++;
- if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
- return(0);
-}
-
-int send_getobjbyqueryobj(int sockfd, char *query, int maxhits, char ***childrec, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- int *childIDs = NULL;
- int *ptr, *ptr1;
-
- length = HEADER_LENGTH + strlen(query) + 1;
-
- build_msg_header(&msg, length, msgid++, GETOBJBYQUERY_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, query);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-2);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-3);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -4;
- }
- if(*ptr++ == 0) {
- *count = (*ptr < maxhits) ? *ptr : maxhits;
- ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-5);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- /* Now get for each child collection the object record */
-#ifdef hw_less_server_stress
- if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) {
- efree(childIDs);
- return -2;
- }
- efree(childIDs);
-#else
- for(i=0; i<*count; i++) {
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- efree(childIDs);
- lowerror = LE_MALLOC;
- return(-6);
- }
-
- tmp = build_msg_int(msg.buf, childIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- efree(childIDs);
- return(-7);
- }
-
- efree(msg.buf);
- }
- efree(childIDs);
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-8);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-#endif
- return(0);
-}
-
-int send_getobjbyquerycoll(int sockfd, hw_objectID collID, char *query, int maxhits, hw_objectID **childIDs, int *count)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr, i, *ptr1;
-
- length = HEADER_LENGTH + strlen(query) + 1 + sizeof(int) + sizeof(collID);
-
- build_msg_header(&msg, length, msgid++, GETOBJBYQUERYCOLL_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, 1);
- tmp = build_msg_int(tmp, collID);
- tmp = build_msg_str(tmp, query);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = (*ptr < maxhits) ? *ptr : maxhits;
- ptr++;
- if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
- return(0);
-}
-
-int send_getobjbyquerycollobj(int sockfd, hw_objectID collID, char *query, int maxhits, char ***childrec, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- hw_objectID *childIDs = NULL;
- int *ptr, *ptr1;
-
- length = HEADER_LENGTH + strlen(query) + 1 + sizeof(int) + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETOBJBYQUERYCOLL_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, 1);
- tmp = build_msg_int(tmp, collID);
- tmp = build_msg_str(tmp, query);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return -1;
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = (*ptr < maxhits) ? *ptr : maxhits;
- ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- /* Now get for each child collection the object record */
-#ifdef hw_less_server_stress
- if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) {
- if(childIDs) efree(childIDs);
- return -2;
- }
- if(childIDs) efree(childIDs);
-#else
- for(i=0; i<*count; i++) {
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- efree(childIDs);
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, childIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- efree(childIDs);
- return(-1);
- }
-
- efree(msg.buf);
- }
- efree(childIDs);
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-#endif
- return(0);
-}
-
-int send_getobjbyftquery(int sockfd, char *query, int maxhits, hw_objectID **childIDs, float **weights, int *count)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr, i, *ptr1;
- float *ptr2;
-
- length = HEADER_LENGTH + strlen(query) + 1;
-
- build_msg_header(&msg, length, msgid++, GETOBJBYFTQUERY_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, query);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- char *cptr, tmp[20];
- float weight;
- int j;
- *count = (*ptr < maxhits) ? *ptr : maxhits;
- ptr++;
- if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *childIDs;
- if(NULL != (*weights = emalloc(*count * sizeof(float)))) {
- ptr2 = *weights;
- for(i=0; i<*count; i++) {
- ptr1[i] = *ptr++; /* Object id */
- cptr = (char *) ptr;
- j = 0;
- while(*cptr != ' ') {
- tmp[j++] = *cptr++;
- }
- cptr++; /* Skip space after weight */
- tmp[j] = '\0';
- sscanf(tmp, "%f", &weight);
- ptr2[i] = weight;
- ptr = (int *) cptr;
- ptr++; /* Skip 0-Integer after weight string */
- }
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(*childIDs);
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
- return(0);
-}
-
-int send_getobjbyftqueryobj(int sockfd, char *query, int maxhits, char ***childrec, float **weights, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- int *childIDs = NULL;
- int *ptr, *ptr1;
- float *ptr2;
-
- length = HEADER_LENGTH + strlen(query) + 1;
-
- build_msg_header(&msg, length, msgid++, GETOBJBYFTQUERY_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, query);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-2);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-3);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -4;
- }
- if(*ptr++ == 0) {
- char *cptr, tmp[20];
- float weight;
- int j;
- *count = (*ptr < maxhits) ? *ptr : maxhits;
- ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = childIDs;
- if(NULL != (*weights = emalloc(*count * sizeof(float)))) {
- ptr2 = *weights;
- for(i=0; i<*count; i++) {
- ptr1[i] = *ptr++; /* Object id */
- cptr = (char *) ptr;
- j = 0;
- while(*cptr != ' ') {
- tmp[j++] = *cptr++;
- }
- cptr++; /* Skip space after weight */
- tmp[j] = '\0';
- sscanf(tmp, "%f", &weight);
- ptr2[i] = weight;
- ptr = (int *) cptr;
- ptr++; /* Skip 0-Integer after weight string */
- }
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(childIDs);
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-5);
- }
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-5);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- /* Now get for each child collection the object record */
-#ifdef hw_less_server_stress
- if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) {
- efree(childIDs);
- efree(*weights);
- return -2;
- }
- efree(childIDs);
-#else
- for(i=0; i<*count; i++) {
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- efree(childIDs);
- efree(*weights);
- lowerror = LE_MALLOC;
- return(-6);
- }
-
- tmp = build_msg_int(msg.buf, childIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- efree(childIDs);
- efree(*weights);
- return(-7);
- }
-
- efree(msg.buf);
- }
- efree(childIDs);
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-8);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-#endif
- return(0);
-}
-
-int send_getobjbyftquerycoll(int sockfd, hw_objectID collID, char *query, int maxhits, hw_objectID **childIDs, float **weights, int *count)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr, i, *ptr1;
- float *ptr2;
-
- length = HEADER_LENGTH + strlen(query) + 1 + sizeof(int) + sizeof(collID);
-
- build_msg_header(&msg, length, msgid++, GETOBJBYFTQUERYCOLL_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, 1);
- tmp = build_msg_int(tmp, collID);
- tmp = build_msg_str(tmp, query);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- char *cptr, tmp[20];
- float weight;
- int j;
- *count = (*ptr < maxhits) ? *ptr : maxhits;
- ptr++;
- if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *childIDs;
- if(NULL != (*weights = emalloc(*count * sizeof(float)))) {
- ptr2 = *weights;
- for(i=0; i<*count; i++) {
- ptr1[i] = *ptr++; /* Object id */
- cptr = (char *) ptr;
- j = 0;
- while(*cptr != ' ') {
- tmp[j++] = *cptr++;
- }
- cptr++; /* Skip space after weight */
- tmp[j] = '\0';
- sscanf(tmp, "%f", &weight);
- ptr2[i] = weight;
- ptr = (int *) cptr;
- ptr++; /* Skip 0-Integer after weight string */
- }
- } else {
- efree(*childIDs);
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
- return(0);
-}
-
-int send_getobjbyftquerycollobj(int sockfd, hw_objectID collID, char *query, int maxhits, char ***childrec, float **weights, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- hw_objectID *childIDs = NULL;
- int *ptr, *ptr1;
- float *ptr2;
-
- length = HEADER_LENGTH + strlen(query) + 1 + sizeof(int) + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETOBJBYFTQUERYCOLL_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, 1);
- tmp = build_msg_int(tmp, collID);
- tmp = build_msg_str(tmp, query);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return -1;
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- char *cptr, tmp[20];
- float weight;
- int j;
- *count = (*ptr < maxhits) ? *ptr : maxhits;
- ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = childIDs;
- if(NULL != (*weights = emalloc(*count * sizeof(float)))) {
- ptr2 = *weights;
- for(i=0; i<*count; i++) {
- ptr1[i] = *ptr++; /* Object id */
- cptr = (char *) ptr;
- j = 0;
- while(*cptr != ' ') {
- tmp[j++] = *cptr++;
- }
- cptr++; /* Skip space after weight */
- tmp[j] = '\0';
- sscanf(tmp, "%f", &weight);
- ptr2[i] = weight;
- ptr = (int *) cptr;
- ptr++; /* Skip 0-Integer after weight string */
- }
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(childIDs);
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- /* Now get for each child collection the object record */
-#ifdef hw_less_server_stress
- if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) {
- if(childIDs) efree(childIDs);
- if(*weights) efree(weights);
- return -2;
- }
- if(childIDs) efree(childIDs);
-#else
- for(i=0; i<*count; i++) {
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- efree(childIDs);
- efree(*weights);
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, childIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- efree(childIDs);
- efree(*weights);
- return(-1);
- }
-
- efree(msg.buf);
- }
- efree(childIDs);
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-#endif
- return(0);
-}
-
-int send_getparents(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- int *ptr, *ptr1;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETPARENT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if (-1 == send_hg_msg(sockfd, &msg, length)) {
- efree(msg.buf);
- return(-2);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-3);
- }
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = *childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- return(0);
-}
-
-int send_getparentsobj(int sockfd, hw_objectID objectID, char ***childrec, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- hw_objectID *childIDs = NULL;
- int *ptr;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETPARENT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if (-1 == send_hg_msg(sockfd, &msg, length)) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- for(i=0; i<*count; ptr++, i++)
- childIDs[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- /* Now get for each parent the object record */
-#ifdef hw_less_server_stress
- if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) {
- efree(childIDs);
- return -2;
- }
- efree(childIDs);
-#else
- for(i=0; i<*count; i++) {
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, childIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- }
- efree(childIDs);
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-#endif
- return(0);
-}
-
-int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, int rootid, char **objattr, char **bodytag, char **text, int *count, char **urlprefix)
-{
- hg_msg msg, *retmsg;
- int length, len;
- char *tmp, header[80], *head_ptr, *sizestr;
- struct sockaddr_in serv_addr;
- struct hostent *hostptr;
- char *hostip = NULL;
- char *attributes = NULL;
- char *documenttype;
- char **anchors;
- int newfd, fd, port, size, error, ancount;
- int *ptr;
-
- if(-1 == (fd = fnCOpenDataCon(sockfd, &port))) {
- /* not set yet efree(msg.buf); */
- return(-1);
- }
-
- /*
- ** Get information about host
- */
- if(host) {
- if((hostptr = gethostbyname(host)) == NULL) {
- HWSOCK_FCLOSE(fd);
- return(-2);
- }
- } else {
- HWSOCK_FCLOSE(fd);
- return(-2);
- }
-
- switch(hostptr->h_addrtype) {
- struct in_addr *ptr1;
- case AF_INET:
- ptr1 = (struct in_addr *) hostptr->h_addr_list[0];
- hostip = inet_ntoa(*ptr1);
- break;
- default:
- HWSOCK_FCLOSE(fd);
- return(-3);
- break;
- }
-
- /* Bottom half of send_getobject */
- if(0 > bh_send_getobject(sockfd, objectID)) {
- HWSOCK_FCLOSE(fd);
- return -4;
- }
-
- /* Upper half of send_getobject */
- if(0 > (error = uh_send_getobject(sockfd, &attributes))) {
- HWSOCK_FCLOSE(fd);
- return error;
- }
-
- length = HEADER_LENGTH + sizeof(hw_objectID) + sizeof(int) + strlen(hostip) + 1 + strlen("Refno=0x12345678") + 1;
- build_msg_header(&msg, length, msgid++, PIPEDOCUMENT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- if(attributes) efree(attributes);
- lowerror = LE_MALLOC;
- return(-5);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
- tmp = build_msg_int(tmp, port);
- tmp = build_msg_str(tmp, hostip);
- tmp = build_msg_str(tmp, "Refno=0x12345678");
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- if(attributes) efree(attributes);
- efree(msg.buf);
- HWSOCK_FCLOSE(fd);
- return(-6);
- }
- efree(msg.buf);
-
- /* Just check if the command was understood */
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- if(attributes) efree(attributes);
- HWSOCK_FCLOSE(fd);
- return(-7);
- }
-
- ptr = (int *) retmsg->buf;
- if((ptr == NULL) || (*ptr != 0)) {
- error = *ptr;
- if(retmsg->buf) efree(retmsg->buf);
- efree(retmsg);
- if(attributes) efree(attributes);
- HWSOCK_FCLOSE(fd);
- return(error);
- }
-
- efree(retmsg->buf);
- efree(retmsg);
-
- /* passively open the data connection. The HG server is probably
- already waiting for us.
- */
- len = sizeof(serv_addr);
- if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) {
-/* php_printf("client: can't open data connection to server\n"); */
- if(attributes) efree(attributes);
- HWSOCK_FCLOSE(fd);
- return(-8);
- } else {
- HWSOCK_FCLOSE(fd);
- }
-
- /* First of all read the header */
- head_ptr = header;
- while((read_to(newfd, head_ptr, 1, rtimeout) == 1) && (*head_ptr != '\0')) {
- head_ptr++;
- }
-
- /* Let's see how big the document is and read it into var text */
- sizestr = strstr(header, "sz=");
- if(sizestr) {
- sizestr += 3;
- sscanf(sizestr, "%d\n", &size);
- *count = size;
- if((size != 0) && (NULL != (*text = malloc(size+1)))) {
- read_to(newfd, *text, size, rtimeout);
- (*text)[size] = '\0';
- }
- } else {
- *text = NULL;
- }
-
- /* close the data connection */
- HWSOCK_FCLOSE(newfd);
-
- documenttype = fnAttributeValue(attributes, "DocumentType");
-
- /* Make a copy with strdup (not estrdup), because we want to
- keep the attributes in hw_document struct.
- */
- *objattr = strdup(attributes);
- efree(attributes);
-
- if((documenttype != NULL) && (!strcmp(documenttype, "text") != 0)) {
- if(send_getanchorsobj(sockfd, objectID, &anchors, &ancount) == 0) {
- char **destrec, **reldestrec;
-#ifdef newlist
- zend_llist *pAnchorList = NULL;
-#else
- DLIST *pAnchorList = NULL;
-#endif
-
- /* Get dest as relative and absolut path */
- send_getdestforanchorsobj(sockfd, anchors, &destrec, ancount);
- send_getreldestforanchorsobj(sockfd, anchors, &reldestrec, ancount, rootid, objectID);
- pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode);
- /* Free only the array, the objrecs has been freed in fnCreateAnchorList() */
- if(anchors) efree(anchors);
- if(destrec) efree(destrec);
- if(reldestrec) efree(reldestrec);
-
- if(pAnchorList != NULL) {
- char *newtext;
- char *body = NULL;
-
- newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body, urlprefix);
-#ifdef newlist
- zend_llist_destroy(pAnchorList);
- efree(pAnchorList);
-#else
- dlst_kill(pAnchorList, fnDeleteAnchor);
-#endif
- *bodytag = strdup(body);
- if(body) efree(body);
- *text = newtext;
- *count = strlen(newtext);
- }
- }
- } else {
- *bodytag = NULL;
- }
-
- if(documenttype) efree(documenttype);
- return(0);
-}
-
-int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str, char **objattr, char **text, int *count)
-{
- hg_msg msg, *retmsg;
- int length, len, new_attr_len;
- char *tmp, header[80], *head_ptr, *sizestr;
- struct sockaddr_in serv_addr;
- struct hostent *hostptr;
- char *hostip = NULL;
- char *attributes = NULL;
- char *documenttype, *new_attr;
- int newfd, fd, port, size, error;
- int *ptr;
-
- if(-1 == (fd = fnCOpenDataCon(sockfd, &port))) {
- /* not set yet? efree(msg.buf); */
- return(-1);
- }
-
- /*
- ** Get information about host
- */
- if(host) {
- if((hostptr = gethostbyname(host)) == NULL) {
- HWSOCK_FCLOSE(fd);
- return(-1);
- }
- } else {
- HWSOCK_FCLOSE(fd);
- return(-1);
- }
-
- switch(hostptr->h_addrtype) {
- struct in_addr *ptr1;
- case AF_INET:
- ptr1 = (struct in_addr *) hostptr->h_addr_list[0];
- hostip = inet_ntoa(*ptr1);
- break;
- default:
-/* php_printf(stderr, "unknown address type\n"); */
- break;
- }
-
- /* Bottom half of send_getobject */
- if(0 > bh_send_getobject(sockfd, objectID)) {
- HWSOCK_FCLOSE(fd);
- return -1;
- }
-
- /* Upper half of send_getobject */
- if(0 > (error = uh_send_getobject(sockfd, &attributes))) {
- HWSOCK_FCLOSE(fd);
- return error;
- }
-
- new_attr_len = strlen(attributes) + strlen(cgi_env_str) + 2;
- new_attr = malloc(new_attr_len);
- strcpy(new_attr, attributes);
- strcat(new_attr, cgi_env_str);
- length = HEADER_LENGTH + strlen(new_attr) + 1 + sizeof(int) + strlen(hostip) + 1 + sizeof(int) + sizeof(int);
- build_msg_header(&msg, length, msgid++, PIPECGI_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- if(attributes) efree(attributes);
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, hostip);
- tmp = build_msg_int(tmp, port);
- tmp = build_msg_str(tmp, new_attr);
- tmp = build_msg_int(tmp, 1);
- tmp = build_msg_int(tmp, 0x12345678);
- free(new_attr);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- if(attributes) efree(attributes);
- efree(msg.buf);
- HWSOCK_FCLOSE(fd);
- return(-1);
- }
- efree(msg.buf);
-
- /* Just check if the command was understood */
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- if(attributes) efree(attributes);
- HWSOCK_FCLOSE(fd);
- return(-1);
- }
-
- ptr = (int *) retmsg->buf;
- if((ptr == NULL) || (*ptr != 0)) {
- if(retmsg->buf) efree(retmsg->buf);
- efree(retmsg);
- if(attributes) efree(attributes);
- HWSOCK_FCLOSE(fd);
- return(-1);
- }
-
- efree(retmsg->buf);
- efree(retmsg);
-
- /* passively open the data connection. The HG server is probably
- already waiting for us.
- */
- len = sizeof(serv_addr);
- if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) {
- if(attributes) efree(attributes);
- HWSOCK_FCLOSE(fd);
- return(-1);
- } else {
- HWSOCK_FCLOSE(fd);
- }
-
- /* First of all read the header */
- head_ptr = header;
- while((read_to(newfd, head_ptr, 1, rtimeout) == 1) && (*head_ptr != '\0')) {
- head_ptr++;
- }
-
- /* Let's see how big the document is and read it into var text */
- sizestr = strstr(header, "sz=");
- if(sizestr) {
- sizestr += 3;
- sscanf(sizestr, "%d\n", &size);
- *count = size;
- if((size != 0) && (NULL != (*text = malloc(size+1)))) {
- read_to(newfd, *text, size, rtimeout);
- }
- } else {
- *text = NULL;
- }
-
- /* close the data connection */
- HWSOCK_FCLOSE(newfd);
-
- documenttype = fnAttributeValue(attributes, "DocumentType");
-
- /* Make a copy with strdup (not estrdup), because we want to
- keep the attributes in hw_document struct.
- */
- *objattr = strdup(attributes);
- efree(attributes);
-
- if(documenttype) efree(documenttype);
- return(0);
-}
-
-int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectRec, char *text, int count, hw_objectID *objectID)
-{
- hg_msg msg, *retmsg;
- int length, len;
- char *tmp, header[80], parms[30], *head_ptr;
- struct sockaddr_in serv_addr;
- struct hostent *hostptr;
- char *hostip = NULL;
- int newfd, fd, port, error;
- int *ptr;
-
- /* First of all we have to insert the document record */
- sprintf(parms, "Parent=0x%x", parentID);
- length = HEADER_LENGTH + strlen(objectRec) + 1 + strlen(parms) + 1;
-
- build_msg_header(&msg, length, msgid++, INSERTOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_str(msg.buf, objectRec);
- tmp = build_msg_str(tmp, parms);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-2);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-3);
- }
-
- ptr = (int *) retmsg->buf;
- if(0 == (error = *ptr)) {
- ptr++;
- *objectID = *ptr;
- } else {
- if(retmsg->buf) efree(retmsg->buf);
- efree(retmsg);
- return(error);
- }
-
- efree(retmsg->buf);
- efree(retmsg);
-
- /*
- ** Get information about host
- */
- if(host) {
- if((hostptr = gethostbyname(host)) == NULL) {
- /* close(fd); fd is not set yet */
- return(-4);
- }
- } else {
- /* close(fd); fd is not set yet */
- return(-5);
- }
-
- switch(hostptr->h_addrtype) {
- struct in_addr *ptr1;
- case AF_INET:
- ptr1 = (struct in_addr *) hostptr->h_addr_list[0];
- hostip = inet_ntoa(*ptr1);
- break;
- default:
-/* fprintf(stderr, "unknown address type\n"); */
- break;
- }
-
- if(-1 == (fd = fnCOpenDataCon(sockfd, &port))) {
- efree(msg.buf);
- return(-6);
- }
-
- /* Start building the PUTDOCUMENT message. I works even if
- the Refno is skipped. I guess the path can be omitted too. */
- length = HEADER_LENGTH + sizeof(hw_objectID) + sizeof(int) + strlen(hostip) + 1 + strlen("Hyperwave") + 1+ strlen("Refno=0x12345678") + 1;
-
- build_msg_header(&msg, length, msgid++, PUTDOCUMENT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-7);
- }
-
- tmp = build_msg_int(msg.buf, *objectID);
- tmp = build_msg_int(tmp, port);
- tmp = build_msg_str(tmp, hostip);
- tmp = build_msg_str(tmp, "Hyperwave");
- tmp = build_msg_str(tmp, "Refno=0x12345678");
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- HWSOCK_FCLOSE(fd);
- return(-8);
- }
- efree(msg.buf);
-
- /* passively open the data connection. The HG server is probably
- already waiting for us.
- */
- len = sizeof(serv_addr);
- if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) {
- HWSOCK_FCLOSE(fd);
- return(-9);
- } else {
- HWSOCK_FCLOSE(fd);
- }
-
- /* First of all write the header. According to the documentation
- there should be a header first. Well, after some investigation
- with tcpdump I found out, that Harmony and wavemaster don't
- sent it. The also do not sent the Refno in the PUTDOCUMENT msg.
- Anyway, we sent both. */
- head_ptr = header;
- sprintf(header, "HGHDR\nsz=%d\nref=12345678\n", count);
- len = strlen(header) + 1;
- if(len != write_to(newfd, header, len, wtimeout)) {
- HWSOCK_FCLOSE(newfd);
- return(-10);
- }
-
- /* And now the document */
- if(count != write_to(newfd, text, count, wtimeout)) {
- HWSOCK_FCLOSE(newfd);
- return(-11);
- }
-
- /* The data connection has to be close before the return
- msg can be read. The server will not sent it before. */
- HWSOCK_FCLOSE(newfd);
-
- /* Just check if the command was understood */
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- HWSOCK_FCLOSE(fd);
- return(-12);
- }
-
- ptr = (int *) retmsg->buf;
- if((ptr == NULL) || (*ptr != 0)) {
- if(retmsg->buf) efree(retmsg->buf);
- efree(retmsg);
- HWSOCK_FCLOSE(fd);
- return(-13);
- }
-
- efree(retmsg->buf);
- efree(retmsg);
-
- return(0);
-}
-
-int send_getsrcbydest(int sockfd, hw_objectID objectID, char ***childrec, int *count)
-{
- hg_msg msg, *retmsg;
- int length, i, error;
- char *tmp;
- int *childIDs = NULL;
- char **objptr;
- int *ptr, *ptr1;
-
- length = HEADER_LENGTH + sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, GETSRCBYDEST_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, objectID);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL )
- return(-1);
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *count = *ptr;
- ptr++;
- if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
- ptr1 = childIDs;
- for(i=0; i<*count; ptr++, i++)
- ptr1[i] = *ptr;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- efree(retmsg->buf);
- efree(retmsg);
- lowerror = LE_MALLOC;
- return(-1);
- }
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- /* Now get for each source the object record */
- for(i=0; i<*count; i++) {
- length = HEADER_LENGTH + sizeof(hw_objectID);
- build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- efree(childIDs);
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, childIDs[i]);
-
- if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
- efree(childIDs);
- efree(msg.buf);
- return(-1);
- }
-
- efree(msg.buf);
- }
- efree(childIDs);
-
- if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
- /* if emalloc fails, get at least all remaining messages from server */
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- efree(retmsg->buf);
- efree(retmsg);
- }
- *childrec = NULL;
- lowerror = LE_MALLOC;
- return(-1);
- } else {
- *childrec = objptr;
-
- for(i=0; i<*count; i++) {
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg != NULL ) {
- if(0 == (int) *(retmsg->buf)) {
- *objptr = estrdup(retmsg->buf+sizeof(int));
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- } else {
- *objptr = NULL;
- objptr++;
- efree(retmsg->buf);
- efree(retmsg);
- }
- }
- }
- }
-
- return(0);
-}
-
-int send_mapid(int sockfd, int servid, hw_objectID id, int *virtid)
-{
- hg_msg msg, *retmsg;
- int length, error;
- char *tmp;
- int *ptr;
-
- length = HEADER_LENGTH + 2 * sizeof(hw_objectID);
-
- build_msg_header(&msg, length, msgid++, HG_MAPID);
-
- if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- tmp = build_msg_int(msg.buf, servid);
- tmp = build_msg_int(tmp, id);
-
- if (-1 == send_hg_msg(sockfd, &msg, length)) {
- efree(msg.buf);
- return(-2);
- }
-
- efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-3);
- }
-
- ptr = (int *) retmsg->buf;
- if(ptr == NULL) {
- if(retmsg) efree(retmsg);
- return -1;
- }
- if(*ptr++ == 0) {
- *virtid = *ptr;
- } else {
- error = *((int *) retmsg->buf);
- efree(retmsg->buf);
- efree(retmsg);
- return error;
- }
-
- return(0);
-}
-
-#define BUFFERLEN 200
-char *get_hw_info(hw_connection *conn) {
- char temp[BUFFERLEN];
- int len;
- struct sockaddr_in serv_addr;
-
- len = sizeof (serv_addr);
- if(getsockname(conn->socket, (struct sockaddr *)&serv_addr, &len) < 0)
- return(NULL);
-
- snprintf(temp, BUFFERLEN, "%s, %s, %d, %s, %d, %d", conn->server_string, conn->hostname,
- conn->version, conn->username,
- serv_addr.sin_port, conn->swap_on);
- return(estrdup(temp));
-}
-#undef BUFFERLEN
-
-static int send_hg_msg(int sockfd, hg_msg *msg, int length)
-{
- char *buf, *tmp;
-
-#ifdef HW_DEBUG
- php_printf("<b>Sending msg: </b>type = %d -- id = %d<br />\n", msg->msg_type, msg->version_msgid);
-#endif
- if ( length < HEADER_LENGTH ) {
-/* fprintf(stderr, "send_hg_msg: bad msg\n"); */
- return(-1);
- }
-
- if ( (tmp = buf = (char *)emalloc(length)) == NULL ) {
-/* perror("send_hg_msg"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
- memcpy(tmp, (char *) &(msg->length), 4);
- tmp += 4;
- memcpy(tmp, (char *) &(msg->version_msgid), 4);
- tmp += 4;
- memcpy(tmp, (char *) &(msg->msg_type), 4);
- if ( msg->length > HEADER_LENGTH ) {
- tmp += 4;
- memcpy(tmp, msg->buf, length-HEADER_LENGTH);
- }
-
- if ( hg_write(sockfd, buf, length) == -1 ) {
- efree(buf);
- return(-1);
- }
-
- efree(buf);
- return(0);
-}
-
-
-int send_ready(int sockfd)
-{
- hg_msg ready_msg;
-
- build_msg_header(&ready_msg, HEADER_LENGTH, version, READY_MESSAGE);
- ready_msg.buf = NULL;
-
- if ( send_hg_msg(sockfd, &ready_msg, HEADER_LENGTH) == -1 ) {
- return(-1);
- }
-
- return(0);
-}
-
-
-int send_command(int sockfd, int command, char **answer)
-{
- hg_msg comm_msg, *retmsg;
- char *comm_str, *tmp;
- int respond = 1;
- int length;
-
- if ( command == STAT_COMMAND )
- comm_str = STAT_COMMAND_STR;
- else
- comm_str = WHO_COMMAND_STR;
- length = HEADER_LENGTH + sizeof(respond) + strlen(comm_str) + 1;
-
- build_msg_header(&comm_msg, length, msgid++, COMMAND_MESSAGE);
-
- if ( (comm_msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
- lowerror = LE_MALLOC;
- return(-1);
- }
-
-
- tmp = build_msg_int(comm_msg.buf, respond);
- tmp = build_msg_str(tmp, comm_str);
-
-
- if ( send_hg_msg(sockfd, &comm_msg, length) == -1 ) {
- efree(comm_msg.buf);
- return(-1);
- }
- efree(comm_msg.buf);
-
- /* Just check if the command was understood */
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- *answer = retmsg->buf;
- efree(retmsg);
-
- return(0);
-}
-
-
-static void build_msg_header(hg_msg *msg, int length, int version_msgid, int msg_type)
-{
- if ( swap_on ) {
- msg->length = swap(length);
- msg->version_msgid = swap(version_msgid);
- msg->msg_type = swap(msg_type);
- }
- else {
- msg->length = length;
- msg->version_msgid = version_msgid;
- msg->msg_type = msg_type;
- }
-}
-
-
-static char *build_msg_int(char *buf, int val) {
- int tmp;
-
-#ifdef HW_DEBUG
- php_printf(" Added int to header: <b>%d</b><br />\n", val);
-#endif
- tmp = swap_on ? swap(val) : val;
- memcpy(buf, (char *)&tmp, 4);
-
- return(buf+4);
-}
-
-
-static char *build_msg_str(char *buf, char *str)
-{
- int len = strlen(str)+1;
-
-#ifdef HW_DEBUG
- php_printf(" Added str to header: <b>%s</b> (%d)<br />\n", str, strlen(str));
-#endif
-
- memcpy(buf, str, len);
-
- return(buf+len);
-}
-
-
-static int swap(int val)
-{
- int tmp;
-
- ((char*)&tmp)[0] = ((char*)&val)[3];
- ((char*)&tmp)[1] = ((char*)&val)[2];
- ((char*)&tmp)[2] = ((char*)&val)[1];
- ((char*)&tmp)[3] = ((char*)&val)[0];
-
- return(tmp);
-}
-
-
-void close_hg_connection(int sockfd)
-{
- shutdown(sockfd, 2);
- HWSOCK_FCLOSE(sockfd);
-}
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * End:
- */
-
diff --git a/ext/hyperwave/hg_comm.h b/ext/hyperwave/hg_comm.h
deleted file mode 100644
index bad54010e9..0000000000
--- a/ext/hyperwave/hg_comm.h
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 4 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2003 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.02 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available at through the world-wide-web at |
- | http://www.php.net/license/2_02.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: Rasmus Lerdorf <rasmus@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef HG_COMM_H
-#define HG_COMM_H
-
-#if HYPERWAVE
-
-#define newlist
-
-#include "hw_error.h"
-#ifdef newlist
-#else
-#include "dlist.h"
-#endif
-#define HG_SERVER_PORT 418
-
-#define F_DISTRIBUTED 0x80000000
-#define F_COMPRESSED 0x40000000
-#define F_VERSION 0x00003fff
-#define HW_VERSION 717L /* 7.17 */
-
-#define HEADER_LENGTH 12
-
-#define STAT_COMMAND_STR "stat"
-#define WHO_COMMAND_STR "who"
-#define STAT_COMMAND 1
-#define WHO_COMMAND 2
-
-#define GETDOCBYANCHOR_MESSAGE 2
-#define GETCHILDCOLL_MESSAGE 3
-#define GETPARENT_MESSAGE 4
-#define GETCHILDDOCCOLL_MESSAGE 5
-#define GETOBJECT_MESSAGE 7
-#define GETANCHORS_MESSAGE 8
-#define GETOBJBYQUERY_MESSAGE 9
-#define GETOBJBYQUERYCOLL_MESSAGE 10
-#define OBJECTBYIDQUERY_MESSAGE 11
-#define GETTEXT_MESSAGE 12
-#define INSDOC_MESSAGE 14
-#define INSCOLL_MESSAGE 17
-#define GETSRCBYDEST_MESSAGE 19
-#define MVCPDOCSCOLL_MESSAGE 22
-#define MVCPCOLLSCOLL_MESSAGE 23
-#define IDENTIFY_MESSAGE 24
-#define READY_MESSAGE 25
-#define COMMAND_MESSAGE 26
-#define CHANGEOBJECT_MESSAGE 27
-#define EDITTEXT_MESSAGE 28
-#define GETANDLOCK_MESSAGE 29
-#define UNLOCK_MESSAGE 30
-#define INCOLLECTIONS_MESSAGE 31
-#define INSERTOBJECT_MESSAGE 32
-#define GETOBJBYFTQUERY_MESSAGE 34
-#define GETOBJBYFTQUERYCOLL_MESSAGE 35
-#define PIPEDOCUMENT_MESSAGE 36
-#define DELETEOBJECT_MESSAGE 37
-#define PUTDOCUMENT_MESSAGE 38
-#define GETREMOTE_MESSAGE 39
-#define GETREMOTECHILDREN_MESSAGE 40
-#define HG_MAPID 43
-#define CHILDREN_MESSAGE 44
-#define GETCGI_MESSAGE 45
-#define PIPECGI_MESSAGE 46
-
-#define HW_DEFAULT_LINK 0
-#define HW_IMAGE_LINK 1
-#define HW_BACKGROUND_LINK 2
-#define HW_INTAG_LINK 3
-#define HW_APPLET_LINK 4
-#define HW_INTAGNODEL_LINK 5
-
-#define COPY 0
-#define MOVE 1
-#define DOCUMENT 0
-#define COLLECTION 1
-
-
-#ifdef PHP_WIN32
-# define SOCK_ERR INVALID_SOCKET
-# define SOCK_CONN_ERR SOCKET_ERROR
-# define HWSOCK_FCLOSE(s) closesocket(s)
-#else
-# define SOCK_ERR -1
-# define SOCK_CONN_ERR -1
-# define HWSOCK_FCLOSE(s) close(s)
-#endif
-
-
-/* Low error messages */
-#define LE_MALLOC -1
-
-typedef struct {
- int id; /* object ID of anchor */
- int tanchor; /* Type of anchor. Can be 1=Src, 2=Dest */
- int start; /* start of anchor */
- int end; /* end of anchor */
- char *nameanchor; /* name tag attribute of destination document */
- /* if anchor is of type Src the following are used as well */
- char *destdocname; /* name of destination document */
- char *link; /* url for external destination */
- int linktype; /* type of link. see above */
- char *tagattr; /* more attributes of tag, like Border=0 */
- char *htmlattr; /* */
- char *codebase; /* codebase of applet */
- char *code; /* code of applet */
- char *fragment; /* name link of Src */
-
- /* if anchor is of type Dest the following are used as well */
- char *keyword; /* name link of Dest */
- } ANCHOR;
-
-typedef struct {
- int length;
- int version_msgid;
- int msg_type;
- char *buf;
-} hg_msg;
-
-typedef struct {
- int socket;
- int swap_on;
- int version;
- char *server_string;
- char *hostname;
- char *username;
- int lasterror;
- int linkroot;
-} hw_connection;
-
-typedef int hw_objectID;
-typedef char hw_objrec;
-typedef float hw_float;
-
-#ifdef newlist
-void fnDeleteAnchor(void *ptr1);
-void fnListAnchor(zend_llist *pAnchorList);
-zend_llist *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorrec, char **reldestrec, int ancount, int anchormode);
-char *fnInsAnchorsIntoText(char *text, zend_llist *pAnchorList, char **bodytag, char **urlprefix);
-int fnCmpAnchors(const void *e1, const void *e2 TSRMLS_DC);
-ANCHOR *fnAddAnchor(zend_llist *pAnchorList, int objectID, int start, int end);
-#else
-void fnDeleteAnchor(ANCHOR *ptr);
-void fnListAnchor(DLIST *pAnchorList);
-DLIST *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorrec, char **reldestrec, int ancount, int anchormode);
-char *fnInsAnchorsIntoText(char *text, DLIST *pAnchorList, char **bodytag, char **urlprefix);
-int fnCmpAnchors(ANCHOR *a1, ANCHOR *a2 TSRMLS_DC);
-ANCHOR *fnAddAnchor(DLIST *pAnchorList, int objectID, int start, int end);
-#endif
-extern void set_swap(int do_swap);
-extern int open_hg_connection(char *server_name, int port);
-extern void close_hg_connection(int sockfd);
-extern int initialize_hg_connection(int sockfd, int *do_swap, int *version, char **userdata, char **server_string, char *username, char *password);
-
-extern int send_ready(int sockfd);
-extern int send_command(int sockfd, int command, char **answer);
-
-extern hg_msg *recv_hg_msg(int sockfd);
-extern hg_msg *recv_ready(int sockfd);
-extern hg_msg *recv_command(int sockfd);
-
-extern char *fnInsStr(char *str, int pos, char *insstr);
-extern int fnAttributeCompare(char *object, char *attrname, char *value);
-extern char *fnAttributeValue(char *object, char *attrname);
-extern int getrellink(int sockfd, int rootID, int thisID, int destID, char **reldesstr);
-
-extern int send_deleteobject(int sockfd, hw_objectID objectID);
-extern int send_changeobject(int sockfd, hw_objectID objectID, char *mod);
-extern int send_groupchangeobject(int sockfd, hw_objectID objectID, char *mod);
-extern int send_getobject(int sockfd, hw_objectID objectID, char **attributes);
-extern int send_getandlock(int sockfd, hw_objectID objectID, char **attributes);
-extern int send_lock(int sockfd, hw_objectID objectID);
-extern int send_unlock(int sockfd, hw_objectID objectID);
-extern int send_gettext(int sockfd, hw_objectID objectID, int mode, int rootid, char **objattr, char **bodytag, char **text, int *count, char *urlprefix);
-extern int send_edittext(int sockfd, char *objattr, char *text);
-extern int send_getcgi(int sockfd, hw_objectID objectID, char *cgi_env_str, char **objattr, char **text, int *count);
-extern int send_getremote(int sockfd, hw_objectID objectID, char **objattr, char **text, int *count);
-extern int send_getremotechildren(int sockfd, char *attributes, char **text, int **childIDs, int *count);
-extern int send_docbyanchor(int sockfd, hw_objectID objectID, hw_objectID *anchorID);
-extern int send_docbyanchorobj(int sockfd, hw_objectID objectID, char **objrec);
-extern int send_mvcpdocscollscoll(int sockfd, hw_objectID *objectIDs, int count, int from, int dest, int cpmv, int docscoll);
-extern int send_childrenobj(int sockfd, hw_objectID objectID, char ***childrec, int *count);
-extern int send_getchildcoll(int sockfd, int objectID, hw_objectID **childIDs, int *count);
-extern int send_getchildcollobj(int sockfd, hw_objectID objectID, hw_objrec ***childrec, int *count);
-extern int send_getchilddoccoll(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count);
-extern int send_getchilddoccollobj(int sockfd, hw_objectID objectID, hw_objrec ***childrec, int *count);
-extern int send_getanchors(int sockfd, hw_objectID objectID, hw_objectID **anchorIDs, int *count);
-extern int send_getanchorsobj(int sockfd, hw_objectID objectID, char ***childrec, int *count);
-extern int send_objectbyidquery(int sockfd, hw_objectID *IDs, int *count, char *query, char ***objrecs);
-extern int send_getobjbyquery(int sockfd, char *query, int maxhits, hw_objectID **childIDs, int *count);
-extern int send_getobjbyqueryobj(int sockfd, char *query, int maxhits, char ***childrec, int *count);
-extern int send_getobjbyquerycoll(int sockfd, hw_objectID collID, char *query, int maxhits, hw_objectID **childIDs, int *count);
-extern int send_getobjbyquerycollobj(int sockfd, hw_objectID collID, char *query, int maxhits, char ***childrec, int *count);
-extern int send_getobjbyftquery(int sockfd, char *query, int maxhits, hw_objectID **childIDs, float **weights, int *count);
-extern int send_getobjbyftqueryobj(int sockfd, char *query, int maxhits, char ***childrec, float **weights, int *count);
-extern int send_getobjbyftquerycoll(int sockfd, hw_objectID collID, char *query, int maxhits, hw_objectID **childIDs, float **weight, int *count);
-extern int send_getobjbyftquerycollobj(int sockfd, hw_objectID collID, char *query, int maxhits, char ***childrec, float **weight, int *count);
-extern int send_identify(int sockfd, char *name, char *passwd, char **userdata);
-extern int send_getparents(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count);
-extern int send_children(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count);
-extern int send_getparentsobj(int sockfd, hw_objectID objectID, char ***childrec, int *count);
-extern int send_pipedocument(int sockfd, char *hostname, hw_objectID objectID, int mode, int rootid, char** objattr, char **bodytag, char **text, int *count, char **urlprefix);
-extern int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str, char **objattr, char **text, int *count);
-extern int send_putdocument(int sockfd, char *hostname, hw_objectID parentID, char *objectRec, char *text, int count, hw_objectID *objectID);
-extern int send_inscoll(int sockfd, hw_objectID objectID, char *objrec, hw_objectID *new_objectID);
-extern int send_insertobject(int sockfd, char *objrec, char *parms, hw_objectID *objectID);
-extern int send_insdoc(int sockfd, hw_objectID objectID, char *objrec, char *text, hw_objectID *new_objectID);
-extern int send_incollections(int sockfd, int retcol, int cobjids, hw_objectID *objectIDs, int ccollids, hw_objectID *collIDs, int *count, hw_objectID **retIDs);
-extern int send_getsrcbydest(int sockfd, hw_objectID objid, char ***childrec, int *count);
-extern int send_mapid(int sockfd, int servid, hw_objectID id, int *virtid);
-extern int send_dummy(int sockfd, hw_objectID objectID, int msgid, char **attributes);
-extern int send_insertanchors(char **text, int *count, char **anchors, char **destrec, int ancount, char **urlprefix, char **bodytag);
-extern char *get_hw_info(hw_connection *conn);
-
-#define send_mvcpdocscoll(sockfd, objectIDs, count, from, dest, mvcp) \
- send_mvcpdocscollscoll(sockfd, objectIDs, count, from, dest, mvcp, DOCUMENT)
-#define send_mvcpcollscoll(sockfd, objectIDs, count, from, dest, mvcp) \
- send_mvcpdocscollscoll(sockfd, objectIDs, count, from, dest, mvcp, COLLECTION)
-
-#endif
-#endif
diff --git a/ext/hyperwave/hw.c b/ext/hyperwave/hw.c
deleted file mode 100644
index 8859e13952..0000000000
--- a/ext/hyperwave/hw.c
+++ /dev/null
@@ -1,4081 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 4 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2003 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.02 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available at through the world-wide-web at |
- | http://www.php.net/license/2_02.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: Uwe Steinmann <Uwe.Steinmann@fernuni-hagen.de> |
- +----------------------------------------------------------------------+
- */
-
-/* $Id$ */
-
-#include <stdlib.h>
-#include <errno.h>
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "php.h"
-#include "php_globals.h"
-#include "ext/standard/php_standard.h"
-#include "ext/standard/head.h"
-#include "ext/standard/info.h"
-#include "fopen_wrappers.h"
-#include "SAPI.h"
-
-#ifdef PHP_WIN32
-#include <winsock2.h>
-#endif
-
-#if HYPERWAVE
-
-#include "php_ini.h"
-#include "php_hyperwave.h"
-
-static int le_socketp, le_psocketp, le_document;
-
-/*hw_module php_hw_module;*/
-
-#define HW_ATTR_NONE 1
-#define HW_ATTR_LANG 2
-#define HW_ATTR_NR 3
-
-function_entry hw_functions[] = {
- PHP_FE(hw_connect, NULL)
- PHP_FE(hw_pconnect, NULL)
- PHP_FE(hw_close, NULL)
- PHP_FE(hw_root, NULL)
- PHP_FE(hw_info, NULL)
- PHP_FE(hw_connection_info, NULL)
- PHP_FE(hw_error, NULL)
- PHP_FE(hw_errormsg, NULL)
- PHP_FE(hw_getparentsobj, NULL)
- PHP_FE(hw_getparents, NULL)
- PHP_FE(hw_children, NULL)
- PHP_FE(hw_childrenobj, NULL)
- PHP_FE(hw_getchildcoll, NULL)
- PHP_FE(hw_getchildcollobj, NULL)
- PHP_FE(hw_getobject, NULL)
- PHP_FE(hw_getandlock, NULL)
- PHP_FE(hw_unlock, NULL)
- PHP_FE(hw_gettext, NULL)
- PHP_FE(hw_edittext, NULL)
- PHP_FE(hw_getcgi, NULL)
- PHP_FE(hw_getremote, NULL)
- PHP_FE(hw_getremotechildren, NULL)
- PHP_FE(hw_pipedocument, NULL)
- PHP_FE(hw_pipecgi, NULL)
- PHP_FE(hw_insertdocument, NULL)
- PHP_FE(hw_mv, NULL)
- PHP_FE(hw_cp, NULL)
- PHP_FE(hw_deleteobject, NULL)
- PHP_FE(hw_changeobject, NULL)
- PHP_FE(hw_modifyobject, NULL)
- PHP_FE(hw_docbyanchor, NULL)
- PHP_FE(hw_docbyanchorobj, NULL)
- PHP_FE(hw_getobjectbyquery, NULL)
- PHP_FE(hw_getobjectbyqueryobj, NULL)
- PHP_FE(hw_getobjectbyquerycoll, NULL)
- PHP_FE(hw_getobjectbyquerycollobj, NULL)
- PHP_FE(hw_getobjectbyftquery, NULL)
- PHP_FE(hw_getobjectbyftqueryobj, NULL)
- PHP_FE(hw_getobjectbyftquerycoll, NULL)
- PHP_FE(hw_getobjectbyftquerycollobj, NULL)
- PHP_FE(hw_getchilddoccoll, NULL)
- PHP_FE(hw_getchilddoccollobj, NULL)
- PHP_FE(hw_getanchors, NULL)
- PHP_FE(hw_getanchorsobj, NULL)
- PHP_FE(hw_getusername, NULL)
- PHP_FE(hw_setlinkroot, NULL)
- PHP_FE(hw_identify, NULL)
- PHP_FE(hw_free_document, NULL)
- PHP_FE(hw_new_document, NULL)
- PHP_FE(hw_new_document_from_file, NULL)
- PHP_FE(hw_output_document, NULL)
- PHP_FE(hw_document_size, NULL)
- PHP_FE(hw_document_attributes, NULL)
- PHP_FE(hw_document_bodytag, NULL)
- PHP_FE(hw_document_content, NULL)
- PHP_FE(hw_document_setcontent, NULL)
- PHP_FE(hw_objrec2array, NULL)
- PHP_FE(hw_array2objrec, NULL)
- PHP_FE(hw_incollections, NULL)
- PHP_FE(hw_inscoll, NULL)
- PHP_FE(hw_insertobject, NULL)
- PHP_FE(hw_insdoc, NULL)
- PHP_FE(hw_getsrcbydestobj, NULL)
- PHP_FE(hw_insertanchors, NULL)
- PHP_FE(hw_getrellink, NULL)
- PHP_FE(hw_who, NULL)
- PHP_FE(hw_stat, NULL)
- PHP_FE(hw_mapid, NULL)
- PHP_FE(hw_dummy, NULL)
- {NULL, NULL, NULL}
-};
-
-zend_module_entry hw_module_entry = {
- STANDARD_MODULE_HEADER,
- "hyperwave", hw_functions, PHP_MINIT(hw), PHP_MSHUTDOWN(hw), NULL, NULL, PHP_MINFO(hw), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES
-};
-
-/*
-#ifdef ZTS
-int hw_globals_id;
-#else
-PHP_HW_API php_hw_globals hw_globals;
-#endif
-*/
-
-ZEND_DECLARE_MODULE_GLOBALS(hw)
-
-#ifdef COMPILE_DL_HYPERWAVE
-ZEND_GET_MODULE(hw)
-#endif
-
-#define HW_FETCH_LINK(hw_zval) \
- convert_to_long_ex(hw_zval); \
- link = Z_LVAL_PP(hw_zval); \
- ptr = (hw_connection *) zend_list_find(link, &type); \
- if(!ptr || (type != le_socketp && type != le_psocketp)) { \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find file identifier %d", link); \
- RETURN_FALSE; \
- }
-
-#define HW_FETCH_ID(hw_zval) \
- convert_to_long_ex(hw_zval); \
- id = Z_LVAL_PP(hw_zval); \
- ptr = (hw_document *) zend_list_find(id, &type); \
- if(!ptr || (type != le_document)) { \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find file identifier %d", id); \
- RETURN_FALSE; \
- }
-
-void print_msg(hg_msg *msg, char *str, int txt);
-
-void _close_hw_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- hw_connection *conn = (hw_connection *)rsrc->ptr;
-
- if(conn->hostname)
- free(conn->hostname);
- if(conn->username)
- free(conn->username);
- close(conn->socket);
- free(conn);
- HwSG(num_links)--;
-}
-
-void _close_hw_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- hw_connection *conn = (hw_connection *)rsrc->ptr;
-
- if(conn->hostname)
- free(conn->hostname);
- if(conn->username)
- free(conn->username);
- close(conn->socket);
- free(conn);
- HwSG(num_links)--;
- HwSG(num_persistent)--;
-}
-
-void _free_hw_document(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- hw_document *doc = (hw_document *)rsrc->ptr;
- if(doc->data)
- free(doc->data);
- if(doc->attributes)
- free(doc->attributes);
- if(doc->bodytag)
- free(doc->bodytag);
- free(doc);
-}
-
-static void php_hw_init_globals(zend_hw_globals *hw_globals)
-{
- hw_globals->num_persistent = 0;
-}
-
-static PHP_INI_MH(OnHyperwavePort)
-{
- if (new_value==NULL) {
- HwSG(default_port) = HG_SERVER_PORT;
- } else {
- HwSG(default_port) = atoi(new_value);
- }
- return SUCCESS;
-}
-
-PHP_INI_BEGIN()
- STD_PHP_INI_ENTRY("hyerwave.allow_persistent", "0", PHP_INI_SYSTEM, OnUpdateInt, allow_persistent, zend_hw_globals, hw_globals)
- PHP_INI_ENTRY("hyperwave.default_port", "418", PHP_INI_ALL, OnHyperwavePort)
-PHP_INI_END()
-
-PHP_MINIT_FUNCTION(hw)
-{
- ZEND_INIT_MODULE_GLOBALS(hw, php_hw_init_globals, NULL);
-
- REGISTER_INI_ENTRIES();
- le_socketp = zend_register_list_destructors_ex(_close_hw_link, NULL, "hyperwave link", module_number);
- le_psocketp = zend_register_list_destructors_ex(NULL, _close_hw_plink, "hyperwave link persistent", module_number);
- le_document = zend_register_list_destructors_ex(_free_hw_document, NULL, "hyperwave document", module_number);
- Z_TYPE(hw_module_entry) = type;
-
- REGISTER_LONG_CONSTANT("HW_ATTR_LANG", HW_ATTR_LANG, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("HW_ATTR_NR", HW_ATTR_NR, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("HW_ATTR_NONE", HW_ATTR_NONE, CONST_CS | CONST_PERSISTENT);
- return SUCCESS;
-}
-
-PHP_MSHUTDOWN_FUNCTION(hw)
-{
- UNREGISTER_INI_ENTRIES();
- return SUCCESS;
-}
-
-/* {{{ make_return_objrec
- * creates an array in return value and frees all memory
- * Also adds as an assoc. array at the end of the return array with
- * statistics.
- */
-int make_return_objrec(pval **return_value, char **objrecs, int count)
-{
- zval *stat_arr;
- int i;
- int hidden, collhead, fullcollhead, total;
- int collheadnr, fullcollheadnr;
-
- array_init(*return_value);
-
- hidden = collhead = fullcollhead = total = 0;
- collheadnr = fullcollheadnr = -1;
- for(i=0; i<count; i++) {
- /* Fill the array with entries. No need to free objrecs[i], since
- * it is not duplicated in add_next_index_string().
- */
- if(NULL != objrecs[i]) {
- if(0 == fnAttributeCompare(objrecs[i], "PresentationHints", "Hidden"))
- hidden++;
- if(0 == fnAttributeCompare(objrecs[i], "PresentationHints", "CollectionHead")) {
- collhead++;
- collheadnr = total;
- }
- if(0 == fnAttributeCompare(objrecs[i], "PresentationHints", "FullCollectionHead")) {
- fullcollhead++;
- fullcollheadnr = total;
- }
- total++;
- add_next_index_string(*return_value, objrecs[i], 0);
- }
- }
- efree(objrecs);
-
- /* Array for statistics */
- MAKE_STD_ZVAL(stat_arr);
- array_init(stat_arr);
-
- add_assoc_long(stat_arr, "Hidden", hidden);
- add_assoc_long(stat_arr, "CollectionHead", collhead);
- add_assoc_long(stat_arr, "FullCollectionHead", fullcollhead);
- add_assoc_long(stat_arr, "Total", total);
- add_assoc_long(stat_arr, "CollectionHeadNr", collheadnr);
- add_assoc_long(stat_arr, "FullCollectionHeadNr", fullcollheadnr);
-
- /* Add the stat array */
- zend_hash_next_index_insert(Z_ARRVAL_PP(return_value), &stat_arr, sizeof(zval), NULL);
-
- return 0;
-}
-/* }}} */
-
-/* {{{ make2_return_array_from_objrec
-** creates an array return value from object record
-*/
-int make2_return_array_from_objrec(pval **return_value, char *objrec, zval *sarr) {
- char *attrname, *str, *temp, language[3];
- zval *spec_arr;
- char *strtok_buf = NULL;
-
- /* Create an array with an entry containing specs for each attribute
- and fill in the specs for Title, Description, Keyword, Group.
- If an array is passed as the last argument use it instead.
- */
- if(NULL != sarr) {
- spec_arr = sarr;
- } else {
- MAKE_STD_ZVAL(spec_arr);
- array_init(spec_arr);
- add_assoc_long(spec_arr, "Title", HW_ATTR_LANG);
- add_assoc_long(spec_arr, "Description", HW_ATTR_LANG);
- add_assoc_long(spec_arr, "Keyword", HW_ATTR_LANG);
- add_assoc_long(spec_arr, "Group", HW_ATTR_NONE);
- add_assoc_long(spec_arr, "HtmlAttr", HW_ATTR_NONE);
- add_assoc_long(spec_arr, "Parent", HW_ATTR_NONE);
- add_assoc_long(spec_arr, "SQLStmt", HW_ATTR_NR);
- }
-
- array_init(*return_value);
-
- /* Loop through the attributes of object record and check
- if the attribute has a specification. If it has the value
- is added to array in spec record. If not it is added straight
- to the return_value array.
- */
- temp = estrdup(objrec);
- attrname = php_strtok_r(temp, "\n", &strtok_buf);
- while(attrname != NULL) {
- zval *data, **dataptr;
- long spec;
- str = attrname;
-
- /* Check if a specification is available.
- If it isn't available then insert the attribute as
- a string into the return array
- */
- while((*str != '=') && (*str != '\0'))
- str++;
- *str = '\0';
- str++;
- if(zend_hash_find(Z_ARRVAL_P(spec_arr), attrname, strlen(attrname)+1, (void **) &dataptr) == FAILURE) {
- add_assoc_string(*return_value, attrname, str, 1);
- } else {
- zval *newarr;
- data = *dataptr;
- spec = Z_LVAL_P(data);
-
- if(zend_hash_find(Z_ARRVAL_PP(return_value), attrname, strlen(attrname)+1, (void **) &dataptr) == FAILURE) {
- MAKE_STD_ZVAL(newarr);
- array_init(newarr);
- zend_hash_add(Z_ARRVAL_PP(return_value), attrname, strlen(attrname)+1, &newarr, sizeof(zval *), NULL);
- } else {
- newarr = *dataptr;
- }
-
- switch(spec) {
- case HW_ATTR_LANG:
- if(str[2] == ':') {
- str[2] = '\0';
- strcpy(language, str);
- str += 3;
- } else
- strcpy(language, "xx");
-
- add_assoc_string(newarr, language, str, 1);
- break;
- case HW_ATTR_NR:
- if(str[1] == ':') {
- str[1] = '\0';
- strcpy(language, str);
- str += 2;
- } else
- strcpy(language, "x");
-
- add_assoc_string(newarr, language, str, 1);
- break;
- case HW_ATTR_NONE:
- add_next_index_string(newarr, str, 1);
- break;
- }
- }
-
- attrname = php_strtok_r(NULL, "\n", &strtok_buf);
- }
- if(NULL == sarr){
-/*
- spec_arr->refcount--;
- zend_hash_destroy(Z_ARRVAL_P(spec_arr));
- efree(Z_ARRVAL_P(spec_arr));
-*/
- zval_dtor(spec_arr);
- efree(spec_arr);
- }
- efree(temp);
-
- return(0);
-}
-/* }}} */
-
-/* {{{ make_return_array_from_objrec
- */
-int make_return_array_from_objrec(pval **return_value, char *objrec) {
- char *attrname, *str, *temp, language[3], *title;
- int iTitle, iDesc, iKeyword, iGroup;
- zval *title_arr;
- zval *desc_arr;
- zval *keyword_arr;
- zval *group_arr;
- int hasTitle = 0;
- int hasDescription = 0;
- int hasKeyword = 0;
- int hasGroup = 0;
- char *strtok_buf;
-
- MAKE_STD_ZVAL(title_arr);
- MAKE_STD_ZVAL(desc_arr);
- MAKE_STD_ZVAL(keyword_arr);
- MAKE_STD_ZVAL(group_arr);
-
- array_init(*return_value);
-
- /* Fill Array of titles, descriptions and keywords */
- temp = estrdup(objrec);
- attrname = php_strtok_r(temp, "\n", &strtok_buf);
- while(attrname != NULL) {
- str = attrname;
- iTitle = 0;
- iDesc = 0;
- iKeyword = 0;
- iGroup = 0;
- if(0 == strncmp(attrname, "Title=", 6)) {
- if (hasTitle == 0) {
- return -1;
- }
- array_init(title_arr);
- hasTitle = 1;
- str += 6;
- iTitle = 1;
- } else if(0 == strncmp(attrname, "Description=", 12)) {
- if (hasDescription == 0) {
- return -1;
- }
- array_init(desc_arr);
- hasDescription = 1;
- str += 12;
- iDesc = 1;
- } else if(0 == strncmp(attrname, "Keyword=", 8)) {
- if (hasKeyword == 0) {
- return -1;
- }
- array_init(keyword_arr);
- hasKeyword = 1;
- str += 8;
- iKeyword = 1;
- } else if(0 == strncmp(attrname, "Group=", 6)) {
- if (hasGroup == 0) {
- return -1;
- }
- array_init(group_arr);
- hasGroup = 1;
- str += 6;
- iGroup = 1;
- }
- if(iTitle || iDesc || iKeyword) { /* Poor error check if end of string */
- if(str[2] == ':') {
- str[2] = '\0';
- strcpy(language, str);
- str += 3;
- } else
- strcpy(language, "xx");
-
- title = str;
- if(iTitle)
- add_assoc_string(title_arr, language, title, 1);
- else if(iDesc)
- add_assoc_string(desc_arr, language, title, 1);
- else if(iKeyword)
- add_assoc_string(keyword_arr, language, title, 1);
- } else if(iGroup) {
- if(iGroup)
- add_next_index_string(group_arr, str, 1);
- }
- attrname = php_strtok_r(NULL, "\n", &strtok_buf);
- }
- efree(temp);
-
- /* Add the title array, if we have one */
- if(hasTitle) {
- zend_hash_update(Z_ARRVAL_PP(return_value), "Title", 6, &title_arr, sizeof(zval *), NULL);
-
- } else {
- efree(title_arr);
- }
-
-
- if(hasDescription) {
- /* Add the description array, if we have one */
- zend_hash_update(Z_ARRVAL_PP(return_value), "Description", 12, &desc_arr, sizeof(zval *), NULL);
-
- } else {
- efree(desc_arr);
- }
-
- if(hasKeyword) {
- /* Add the keyword array, if we have one */
- zend_hash_update(Z_ARRVAL_PP(return_value), "Keyword", 8, &keyword_arr, sizeof(zval *), NULL);
-
- } else {
- efree(keyword_arr);
- }
-
- if(hasGroup) {
- /* Add the Group array, if we have one */
- zend_hash_update(Z_ARRVAL_PP(return_value), "Group", 6, &group_arr, sizeof(zval *), NULL);
-
- } else {
- efree(group_arr);
- }
-
- /* All other attributes. Make a another copy first */
- temp = estrdup(objrec);
- attrname = php_strtok_r(temp, "\n", &strtok_buf);
- while(attrname != NULL) {
- str = attrname;
- /* We don't want to insert titles, descr., keywords a second time */
- if((0 != strncmp(attrname, "Title=", 6)) &&
- (0 != strncmp(attrname, "Description=", 12)) &&
- (0 != strncmp(attrname, "Group=", 6)) &&
- (0 != strncmp(attrname, "Keyword=", 8))) {
- while((*str != '=') && (*str != '\0'))
- str++;
- *str = '\0';
- str++;
- add_assoc_string(*return_value, attrname, str, 1);
- }
- attrname = php_strtok_r(NULL, "\n", &strtok_buf);
- }
- efree(temp);
-
- return(0);
-}
-/* }}} */
-
-#define BUFFERLEN 1024
-/* {{{ make_objrec_from_array
- */
-static char * make_objrec_from_array(HashTable *lht, char delim) {
- int i, count, keytype;
- ulong idx;
- uint length;
- char *key, str[BUFFERLEN], *objrec = NULL;
- zval *keydata, **keydataptr;
-
- if(NULL == lht)
- return NULL;
-
- if(0 == (count = zend_hash_num_elements(lht)))
- return NULL;
-
- if(delim == 0)
- delim = '=';
-
- zend_hash_internal_pointer_reset(lht);
- objrec = malloc(1);
- *objrec = '\0';
- for(i=0; i<count; i++) {
- keytype = zend_hash_get_current_key_ex(lht, &key, &length, &idx, 0, NULL);
-/* if(HASH_KEY_IS_STRING == keytype) { */
- zend_hash_get_current_data(lht, (void **) &keydataptr);
- keydata = *keydataptr;
- switch(Z_TYPE_P(keydata)) {
- case IS_STRING:
- if(HASH_KEY_IS_STRING == keytype)
- snprintf(str, BUFFERLEN, "%s%c%s\n", key, delim, Z_STRVAL_P(keydata));
- else if(HASH_KEY_IS_LONG == keytype)
- snprintf(str, BUFFERLEN, "%ld%c%s\n", idx, delim, Z_STRVAL_P(keydata));
- else
- snprintf(str, BUFFERLEN, "%s\n", Z_STRVAL_P(keydata));
- break;
- case IS_LONG:
- if(HASH_KEY_IS_STRING == keytype)
- snprintf(str, BUFFERLEN, "%s%c0x%lX\n", key, delim, Z_LVAL_P(keydata));
- else if(HASH_KEY_IS_LONG == keytype)
- snprintf(str, BUFFERLEN, "%ld%c%s\n", idx, delim, Z_STRVAL_P(keydata));
- else
- snprintf(str, BUFFERLEN, "0x%lX\n", Z_LVAL_P(keydata));
- break;
- case IS_ARRAY: {
- int i, len, keylen, count;
- char *strarr, *ptr, *ptr1;
- count = zend_hash_num_elements(Z_ARRVAL_P(keydata));
- if(count > 0) {
- strarr = make_objrec_from_array(Z_ARRVAL_P(keydata), ':');
- len = strlen(strarr) - 1;
- keylen = strlen(key);
- if(NULL == (ptr = malloc(len + 1 + count*(keylen+1)))) {
- free(objrec);
- return(NULL);
- }
- ptr1 = ptr;
- *ptr1 = '\0';
- strcpy(ptr1, key);
- ptr1 += keylen;
- *ptr1++ = '=';
- for(i=0; i<len; i++) {
- *ptr1++ = strarr[i];
- if(strarr[i] == '\n') {
- strcpy(ptr1, key);
- ptr1 += keylen;
- *ptr1++ = '=';
- }/* else if(strarr[i] == '=')
- ptr1[-1] = ':'; */
- }
- *ptr1++ = '\n';
- *ptr1 = '\0';
- strlcpy(str, ptr, sizeof(str));
- }
- break;
- }
- }
- objrec = realloc(objrec, strlen(objrec)+strlen(str)+1);
- strcat(objrec, str);
-/* } */
- zend_hash_move_forward(lht);
- }
- return objrec;
-}
-/* }}} */
-#undef BUFFERLEN
-
-/* {{{ make_ints_from_array
- */
-static int * make_ints_from_array(HashTable *lht) {
- int i, count;
- int *objids = NULL;
- zval **keydata;
-
- if(NULL == lht)
- return NULL;
-
- if(0 == (count = zend_hash_num_elements(lht)))
- return NULL;
-
- zend_hash_internal_pointer_reset(lht);
- if(NULL == (objids = emalloc(count*sizeof(int))))
- return NULL;
- for(i=0; i<count; i++) {
- zend_hash_get_current_data(lht, (void **) &keydata);
- switch(Z_TYPE_PP(keydata)) {
- case IS_LONG:
- objids[i] = Z_LVAL_PP(keydata);
- break;
- default:
- objids[i] = 0;
- }
- zend_hash_move_forward(lht);
- }
- return objids;
-}
-/* }}} */
-
-/* {{{ make_strs_from_array
- */
-static char **make_strs_from_array(HashTable *arrht) {
- char **carr = NULL;
- char **ptr;
- zval *data, **dataptr;
-
- zend_hash_internal_pointer_reset(arrht);
- if(NULL == (carr = emalloc(zend_hash_num_elements(arrht) * sizeof(char *))))
- return(NULL);
- ptr = carr;
-
- /* Iterate through hash */
- while(zend_hash_get_current_data(arrht, (void **) &dataptr) == SUCCESS) {
- data = *dataptr;
- switch(Z_TYPE_P(data)) {
- case IS_STRING:
- *ptr = estrdup(Z_STRVAL_P(data));
-/*fprintf(stderr, "carr[] = %s\n", *ptr); */
- break;
- default:
- *ptr = NULL;
- }
- ptr++;
-
- zend_hash_move_forward(arrht);
- }
- return(carr);
-}
-/* }}} */
-
-#define BUFFERLEN 30
-/* {{{ php_hw_do_connect
- */
-static void php_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
-{
- zval **argv[4];
- int argc;
- int sockfd;
- int port = 0;
- char *host = NULL;
- char *userdata = NULL;
- char *server_string = NULL;
- char *username = NULL;
- char *password = NULL;
- char *hashed_details;
- char *str = NULL;
- char buffer[BUFFERLEN];
- int hashed_details_length;
- hw_connection *ptr;
- int do_swap;
- int version = 0;
-
- argc = ZEND_NUM_ARGS();
- switch(argc) {
- case 2:
- case 4:
- if (zend_get_parameters_array_ex(argc, argv) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- break;
- default:
- WRONG_PARAM_COUNT;
- }
-
- /* Host: */
- convert_to_string_ex(argv[0]);
- host = (char *) estrndup(Z_STRVAL_PP(argv[0]), Z_STRLEN_PP(argv[0]));
-
- /* Port: */
- convert_to_long_ex(argv[1]);
- port = Z_LVAL_PP(argv[1]);
-
- /* Username and Password */
- if(argc > 2) {
- /* Username */
- convert_to_string_ex(argv[2]);
- username = (char *) estrndup(Z_STRVAL_PP(argv[2]), Z_STRLEN_PP(argv[2]));
- /* Password */
- convert_to_string_ex(argv[3]);
- password = (char *) estrndup(Z_STRVAL_PP(argv[3]), Z_STRLEN_PP(argv[3]));
- }
-
- /* Create identifier string for connection */
- snprintf(buffer, BUFFERLEN, "%d", port);
- hashed_details_length = strlen(host)+strlen(buffer)+8;
- if(NULL == (hashed_details = (char *) emalloc(hashed_details_length+1))) {
- if(host) efree(host);
- if(password) efree(password);
- if(username) efree(username);
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not get memory for connection details");
- RETURN_FALSE;
- }
- sprintf(hashed_details, "hw_%s_%d", host, port);
-
- if (persistent) {
- list_entry *le;
-
- /* try to find if we already have this link in our persistent list */
- if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) {
- list_entry new_le;
-
- if (HwSG(max_links)!=-1 && HwSG(num_links)>=HwSG(max_links)) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Too many open links (%d)", HwSG(num_links));
- if(host) efree(host);
- if(username) efree(username);
- if(password) efree(password);
- efree(hashed_details);
- RETURN_FALSE;
- }
- if (HwSG(max_persistent!=-1) && HwSG(num_persistent)>=HwSG(max_persistent)) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Too many open persistent links (%d)", HwSG(num_persistent));
- if(host) efree(host);
- if(username) efree(username);
- if(password) efree(password);
- efree(hashed_details);
- RETURN_FALSE;
- }
-
- if ( (sockfd = open_hg_connection(host, port)) < 0 ) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not open connection to %s, Port: %d (retval=%d, errno=%d)", host, port, sockfd, errno);
- if(host) efree(host);
- if(username) efree(username);
- if(password) efree(password);
- efree(hashed_details);
- RETURN_FALSE;
- }
-
- if(NULL == (ptr = malloc(sizeof(hw_connection)))) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not get memory for connection structure");
- if(host) efree(host);
- if(username) efree(username);
- if(password) efree(password);
- efree(hashed_details);
- RETURN_FALSE;
- }
-
- if(0 != (ptr->lasterror = initialize_hg_connection(sockfd, &do_swap, &version, &userdata, &server_string, username, password))) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not initalize hyperwave connection");
- if(host) efree(host);
- if(username) efree(username);
- if(password) efree(password);
- if(userdata) efree(userdata);
- if(server_string) free(server_string);
- efree(hashed_details);
- RETURN_FALSE;
- }
-
- if(username) efree(username);
- if(password) efree(password);
-
- ptr->version = version;
- ptr->server_string = server_string;
- ptr->socket = sockfd;
- ptr->swap_on = do_swap;
- ptr->linkroot = 0;
- ptr->hostname = strdup(host);
- ptr->username = strdup("anonymous");
-
- new_le.ptr = (void *) ptr;
- Z_TYPE(new_le) = le_psocketp;
-
- if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(list_entry), NULL)==FAILURE) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not hash table with connection details");
- if(host) efree(host);
- if(username) efree(username);
- if(password) efree(password);
- if(server_string) free(server_string);
- efree(hashed_details);
- RETURN_FALSE;
- }
-
- HwSG(num_links)++;
- HwSG(num_persistent)++;
- } else {
- /*php_printf("Found already open connection\n"); */
- if (Z_TYPE_P(le) != le_psocketp) {
- RETURN_FALSE;
- }
- ptr = le->ptr;
- }
-
- Z_LVAL_P(return_value) = zend_list_insert(ptr, le_psocketp);
- Z_TYPE_P(return_value) = IS_RESOURCE;
-
- } else {
- list_entry *index_ptr, new_index_ptr;
-
- /* first we check the hash for the hashed_details key. if it exists,
- * it should point us to the right offset where the actual hyperwave link sits.
- * if it doesn't, open a new hyperwave link, add it to the resource list,
- * and add a pointer to it with hashed_details as the key.
- */
- if (zend_hash_find(&EG(regular_list), hashed_details, hashed_details_length+1, (void **) &index_ptr)==SUCCESS) {
- int type, link;
- void *ptr;
-
- if (Z_TYPE_P(index_ptr) != le_index_ptr) {
- RETURN_FALSE;
- }
- link = (int) index_ptr->ptr;
- ptr = (hw_connection *) zend_list_find(link, &type); /* check if the link is still there */
- if(!ptr || (type!=le_socketp && type!=le_psocketp)) {
- Z_LVAL_P(return_value) = HwSG(default_link) = link;
- Z_TYPE_P(return_value) = IS_LONG;
- efree(hashed_details);
- if(username) efree(username);
- if(password) efree(password);
- if(host) efree(host);
- return;
- } else {
- zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length+1);
- }
- }
-
- if ( (sockfd = open_hg_connection(host, port)) < 0 ) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not open connection to %s, Port: %d (retval=%d", host, port, sockfd);
- if(host) efree(host);
- if(username) efree(username);
- if(password) efree(password);
- efree(hashed_details);
- RETURN_FALSE;
- }
-
- if(NULL == (ptr = malloc(sizeof(hw_connection)))) {
- if(host) efree(host);
- if(username) efree(username);
- if(password) efree(password);
- efree(hashed_details);
- RETURN_FALSE;
- }
-
- if(0 != (ptr->lasterror = initialize_hg_connection(sockfd, &do_swap, &version, &userdata, &server_string, username, password))) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not initalize hyperwave connection");
- if(host) efree(host);
- if(username) efree(username);
- if(password) efree(password);
- if(userdata) efree(userdata);
- if(server_string) free(server_string);
- efree(hashed_details);
- RETURN_FALSE;
- }
-
- if(username) efree(username);
- if(password) efree(password);
-
- ptr->version = version;
- ptr->server_string = server_string;
- ptr->socket = sockfd;
- ptr->swap_on = do_swap;
- ptr->linkroot = 0;
- ptr->hostname = strdup(host);
- ptr->username = strdup("anonymous");
-
- Z_LVAL_P(return_value) = zend_list_insert(ptr, le_socketp);
- Z_TYPE_P(return_value) = IS_RESOURCE;
-
- new_index_ptr.ptr = (void *) Z_LVAL_P(return_value);
- Z_TYPE(new_index_ptr) = le_index_ptr;
- if (zend_hash_update(&EG(regular_list), hashed_details, hashed_details_length+1, (void *) &new_index_ptr, sizeof(list_entry), NULL)==FAILURE) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not update connection details in hash table");
- if(host) efree(host);
- efree(hashed_details);
- RETURN_FALSE;
- }
-
- }
-
- efree(hashed_details);
- if(host) efree(host);
- HwSG(default_link)=Z_LVAL_P(return_value);
-
- /* At this point we have a working connection. If userdata was given
- we are also indentified.
- If there is no userdata because hw_connect was called without username
- and password, we don't evaluate userdata.
- */
- if(NULL == userdata)
- return;
-
- if(ptr->username) free(ptr->username);
- str = userdata;
- while((*str != 0) && (*str != ' '))
- str++;
- if(*str != '\0')
- ptr->username = strdup(++str);
- else
- ptr->username = NULL;
- efree(userdata);
-}
-/* }}} */
-#undef BUFFERLEN
-
-/* Start of user level functions */
-/* ***************************** */
-/* {{{ proto int hw_connect(string host, int port [string username [, string password]])
- Connect to the Hyperwave server */
-PHP_FUNCTION(hw_connect)
-{
- php_hw_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
-}
-/* }}} */
-
-/* {{{ proto int hw_pconnect(string host, int port [, string username [, string password]])
- Connect to the Hyperwave server persistent */
-PHP_FUNCTION(hw_pconnect)
-{
- php_hw_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
-}
-/* }}} */
-
-/* {{{ proto void hw_close(int link)
- Close connection to Hyperwave server */
-PHP_FUNCTION(hw_close)
-{
- zval **arg1;
- int link, type;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- zend_list_delete(link);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto void hw_info(int link)
- Outputs info string */
-PHP_FUNCTION(hw_info)
-{
- pval **arg1;
- int link, type;
- hw_connection *ptr;
- char *str;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- if(NULL != (str = get_hw_info(ptr))) {
- /*
- php_printf("%s\n", str);
- efree(str);
- */
- Z_STRLEN_P(return_value) = strlen(str);
- Z_STRVAL_P(return_value) = str;
- Z_TYPE_P(return_value) = IS_STRING;
- return;
- }
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto int hw_error(int link)
- Returns last error number */
-PHP_FUNCTION(hw_error)
-{
- pval **arg1;
- int link, type;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- RETURN_LONG(ptr->lasterror);
-}
-/* }}} */
-
-/* {{{ proto string hw_errormsg(int link)
- Returns last error message */
-PHP_FUNCTION(hw_errormsg)
-{
- pval **arg1;
- int link, type;
- hw_connection *ptr;
- char errstr[100];
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
-
- switch (ptr->lasterror) {
- case 0:
- sprintf(errstr, "No error");
- break;
- case NOACCESS:
- sprintf(errstr, "Access denied");
- break;
- case NODOCS:
- sprintf(errstr, "No documents");
- break;
- case NONAME:
- sprintf(errstr, "No collection name");
- break;
- case NODOC:
- sprintf(errstr, "Object is not a document");
- break;
- case NOOBJ:
- sprintf(errstr, "No object received");
- break;
- case NOCOLLS:
- sprintf(errstr, "No collections received");
- break;
- case DBSTUBNG:
- sprintf(errstr, "Connection to low-level database failed");
- break;
- case NOTFOUND:
- sprintf(errstr, "Object not found");
- break;
- case EXIST:
- sprintf(errstr, "Collection already exists");
- break;
- case FATHERDEL:
- sprintf(errstr, "parent collection disappeared");
- break;
- case FATHNOCOLL:
- sprintf(errstr, "parent collection not a collection");
- break;
- case NOTEMPTY:
- sprintf(errstr, "Collection not empty");
- break;
- case DESTNOCOLL:
- sprintf(errstr, "Destination not a collection");
- break;
- case SRCEQDEST:
- sprintf(errstr, "Source equals destination");
- break;
- case REQPEND:
- sprintf(errstr, "Request pending");
- break;
- case TIMEOUT:
- sprintf(errstr, "Timeout");
- break;
- case NAMENOTUNIQUE:
- sprintf(errstr, "Name not unique");
- break;
- case WRITESTOPPED:
- sprintf(errstr, "Database now read-only; try again later");
- break;
- case LOCKED:
- sprintf(errstr, "Object locked; try again later");
- break;
- case CHANGEBASEFLD:
- sprintf(errstr, "Change of base-attribute");
- break;
- case NOTREMOVED:
- sprintf(errstr, "Attribute not removed");
- break;
- case FLDEXISTS:
- sprintf(errstr, "Attribute exists");
- break;
- case CMDSYNTAX:
- sprintf(errstr, "Syntax error in command");
- break;
- case NOLANGUAGE:
- sprintf(errstr, "No or unknown language specified");
- break;
- case WRGTYPE:
- sprintf(errstr, "Wrong type in object");
- break;
- case WRGVERSION:
- sprintf(errstr, "Client version too old");
- break;
- case CONNECTION:
- sprintf(errstr, "No connection to other server");
- break;
- case SYNC:
- sprintf(errstr, "Synchronization error");
- break;
- case NOPATH:
- sprintf(errstr, "No path entry");
- break;
- case WRGPATH:
- sprintf(errstr, "Wrong path entry");
- break;
- case PASSWD:
- sprintf(errstr, "Wrong password (server-to-server server authentication)");
- break;
- case LC_NO_MORE_USERS:
- sprintf(errstr, "No more users for license");
- break;
- case LC_NO_MORE_DOCS:
- sprintf(errstr, "No more documents for this session and license");
- break;
- case RSERV_NRESP:
- sprintf(errstr, "Remote server not responding");
- break;
- case Q_OVERFLOW:
- sprintf(errstr, "Query overflow");
- break;
- case USR_BREAK:
- sprintf(errstr, "Break by user");
- break;
- case N_IMPL:
- sprintf(errstr, "Not implemented");
- break;
- case WRG_VALUE:
- sprintf(errstr, "Wrong value");
- break;
- case INSUFF_FUNDS:
- sprintf(errstr, "Insufficient funds");
- break;
- case REORG:
- sprintf(errstr, "Reorganization in progress");
- break;
- case USER_LIMIT:
- sprintf(errstr, "Limit of simultaneous users reached");
- break;
- case FTCONNECT:
- sprintf(errstr, "No connection to fulltext server");
- break;
- case FTTIMEOUT:
- sprintf(errstr, "Connection timed out");
- break;
- case FTINDEX:
- sprintf(errstr, "Something wrong with fulltext index");
- break;
- case FTSYNTAX:
- sprintf(errstr, "Query syntax error");
- break;
- case REQUESTPENDING:
- sprintf(errstr, "Request pending");
- break;
- case NOCONNECTION:
- sprintf(errstr, "No connection to document server");
- break;
- case WRONGVERSION:
- sprintf(errstr, "Wrong protocol version");
- break;
- case NOTINITIALIZED:
- sprintf(errstr, "Not initialized");
- break;
- case BADREQUEST:
- sprintf(errstr, "Bad request");
- break;
- case BADLRN:
- sprintf(errstr, "Bad document number");
- break;
- case OPENSTORE_WRITE:
- sprintf(errstr, "Cannot write to local store");
- break;
- case OPENSTORE_READ:
- sprintf(errstr, "Cannot read from local store");
- break;
- case READSTORE:
- sprintf(errstr, "Store read error");
- break;
- case WRITESTORE:
- sprintf(errstr, "Write error");
- break;
- case CLOSESTORE:
- sprintf(errstr, "Close error");
- break;
- case BADPATH:
- sprintf(errstr, "Bad path");
- break;
- case NOPATHDC:
- sprintf(errstr, "No path");
- break;
- case OPENFILE:
- sprintf(errstr, "Cannot open file");
- break;
- case READFILE:
- sprintf(errstr, "Cannot read from file // same");
- break;
- case WRITEFILE:
- sprintf(errstr, "Cannot write to file");
- break;
- case CONNECTCLIENT:
- sprintf(errstr, "Could not connect to client");
- break;
- case ACCEPT:
- sprintf(errstr, "Could not accept connection");
- break;
- case READSOCKET:
- sprintf(errstr, "Could not read from socket");
- break;
- case WRITESOCKET:
- sprintf(errstr, "Could not write to socket");
- break;
- case TOOMUCHDATA:
- sprintf(errstr, "Received too much data");
- break;
- case TOOFEWDATA:
- sprintf(errstr, "Received too few data // ...");
- break;
- case NOTIMPLEMENTED:
- sprintf(errstr, "Not implemented");
- break;
- case USERBREAK:
- sprintf(errstr, "User break");
- break;
- case INTERNAL:
- sprintf(errstr, "Internal error");
- break;
- case INVALIDOBJECT:
- sprintf(errstr, "Invalid object");
- break;
- case JOBTIMEOUT:
- sprintf(errstr, "Job timed out");
- break;
- case OPENPORT:
- sprintf(errstr, "Cannot open port // ... for several resons");
- break;
- case NODATA:
- sprintf(errstr, "Received no data");
- break;
- case NOPORT:
- sprintf(errstr, "No port to handle this request");
- break;
- case NOTCACHED:
- sprintf(errstr, "Document not cached");
- break;
- case BADCACHETYPE:
- sprintf(errstr, "Bad cache type");
- break;
- case OPENCACHE_WRITE:
- sprintf(errstr, "Cannot write to cache");
- break;
- case OPENCACHE_READ:
- sprintf(errstr, "Cannot read from cache // same");
- break;
- case NOSOURCE:
- sprintf(errstr, "Do not know what to read");
- break;
- case CLOSECACHE:
- sprintf(errstr, "Could not insert into cache");
- break;
- case CONNECTREMOTE:
- sprintf(errstr, "Could not connect to remote server");
- break;
- case LOCKREFUSED:
- sprintf(errstr, "Lock refused // could not lock the stores");
- break;
- default:
- sprintf(errstr, "Unknown error: %d", ptr->lasterror);
- }
- RETURN_STRING(errstr, 1);
-}
-/* }}} */
-
-/* {{{ proto int hw_root(void)
- Returns object id of root collection */
-PHP_FUNCTION(hw_root)
-{
- if (ZEND_NUM_ARGS() != 0) {
- WRONG_PARAM_COUNT;
- }
-
- Z_LVAL_P(return_value) = 0;
- Z_TYPE_P(return_value) = IS_LONG;
-}
-/* }}} */
-
-/* {{{ php_hw_command
- */
-char *php_hw_command(INTERNAL_FUNCTION_PARAMETERS, int comm) {
- pval **arg1;
- int link, type;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- return NULL;
- }
- convert_to_long_ex(arg1);
- link = Z_LVAL_PP(arg1);
- ptr = (hw_connection *) zend_list_find(link, &type);
- if(!ptr || (type != le_socketp && type != le_psocketp)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find file identifier %d", link);
- return NULL;
- }
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- if (0 != (ptr->lasterror = send_command(ptr->socket, comm, &object))) {
- return NULL;
- }
- return object;
- }
- return NULL;
-}
-/* }}} */
-
-/* {{{ proto string hw_stat(int link)
- Returns status string */
-PHP_FUNCTION(hw_stat)
-{
- char *object;
-
- object = php_hw_command(INTERNAL_FUNCTION_PARAM_PASSTHRU, STAT_COMMAND);
- if(object == NULL)
- RETURN_FALSE;
-
- Z_STRVAL_P(return_value) = object;
- Z_STRLEN_P(return_value) = strlen(object);
- Z_TYPE_P(return_value) = IS_STRING;
-}
-/* }}} */
-
-/* {{{ proto array hw_who(int link)
- Returns names and info of users loged in */
-PHP_FUNCTION(hw_who)
-{
- zval *user_arr;
- char *object, *ptr, *temp, *attrname;
- int i;
- char *strtok_buf;
-
- object = php_hw_command(INTERNAL_FUNCTION_PARAM_PASSTHRU, WHO_COMMAND);
- if(object == NULL)
- RETURN_FALSE;
-
- ptr = object;
-
-php_printf("%s\n", ptr);
- /* Skip first two lines, they just contain:
- Users in Database
-
- */
- while((*ptr != '\0') && (*ptr != '\n'))
- ptr++;
- while((*ptr != '\0') && (*ptr != '\n'))
- ptr++;
- if(*ptr == '\0') {
- efree(object);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- temp = estrdup(ptr);
- attrname = php_strtok_r(temp, "\n", &strtok_buf);
- i = 0;
- while(attrname != NULL) {
- char *name;
-
- ALLOC_ZVAL(user_arr);
- array_init(user_arr);
-
- ptr = attrname;
- if(*ptr++ == '*')
- add_assoc_long(user_arr, "self", 1);
- else
- add_assoc_long(user_arr, "self", 0);
-
- ptr++;
- name = ptr;
- while((*ptr != '\0') && (*ptr != ' '))
- ptr++;
- *ptr = '\0';
- add_assoc_string(user_arr, "id", name, 1);
-
- ptr++;
- name = ptr;
- while((*ptr != '\0') && (*ptr != ' '))
- ptr++;
- *ptr = '\0';
- add_assoc_string(user_arr, "name", name, 1);
-
- ptr++;
- while((*ptr != '\0') && (*ptr == ' '))
- ptr++;
-
- name = ptr;
- while((*ptr != '\0') && (*ptr != ' '))
- ptr++;
- *ptr = '\0';
- add_assoc_string(user_arr, "system", name, 1);
-
- ptr++;
- while((*ptr != '\0') && (*ptr == ' '))
- ptr++;
-
- name = ptr;
- while((*ptr != '\0') && (*ptr != ' '))
- ptr++;
- *ptr = '\0';
- add_assoc_string(user_arr, "onSinceDate", name, 1);
-
- ptr++;
- while((*ptr != '\0') && (*ptr == ' '))
- ptr++;
-
- name = ptr;
- while((*ptr != '\0') && (*ptr != ' '))
- ptr++;
- *ptr = '\0';
- add_assoc_string(user_arr, "onSinceTime", name, 1);
-
- ptr++;
- while((*ptr != '\0') && (*ptr == ' '))
- ptr++;
-
- name = ptr;
- while((*ptr != '\0') && (*ptr != ' '))
- ptr++;
- *ptr = '\0';
- add_assoc_string(user_arr, "TotalTime", name, 1);
-
- /* Add the user array */
- zend_hash_index_update(Z_ARRVAL_P(return_value), i++, &user_arr, sizeof(pval), NULL);
-
- attrname = php_strtok_r(NULL, "\n", &strtok_buf);
- }
- efree(temp);
- efree(object);
-
-}
-/* }}} */
-
-/* {{{ proto string hw_dummy(int link, int id, int msgid)
- Hyperwave dummy function */
-PHP_FUNCTION(hw_dummy)
-{
- pval **arg1, **arg2, **arg3;
- int link, id, type, msgid;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- convert_to_long_ex(arg2);
- convert_to_long_ex(arg3);
- id=Z_LVAL_PP(arg2);
- msgid=Z_LVAL_PP(arg3);
- HW_FETCH_LINK(arg1);
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- if (0 != (ptr->lasterror = send_dummy(ptr->socket, id, msgid, &object)))
- RETURN_FALSE;
-
-php_printf("%s", object);
- Z_STRVAL_P(return_value) = object;
- Z_STRLEN_P(return_value) = strlen(object);
- Z_TYPE_P(return_value) = IS_STRING;
- }
-}
-/* }}} */
-
-/* {{{ proto string hw_getobject(int link, int objid [, string query])
- Returns object record */
-PHP_FUNCTION(hw_getobject)
-{
- pval **argv[3];
- int argc, link, id, type, multi;
- char *query;
- hw_connection *ptr;
-
- argc = ZEND_NUM_ARGS();
- if(argc < 2 || argc > 3)
- WRONG_PARAM_COUNT;
- if (zend_get_parameters_array_ex(argc, argv) == FAILURE)
- WRONG_PARAM_COUNT;
-
- HW_FETCH_LINK(argv[0]);
- if(Z_TYPE_PP(argv[1]) == IS_ARRAY) {
- multi = 1;
- convert_to_array_ex(argv[1]);
- } else {
- multi = 0;
- convert_to_long_ex(argv[1]);
- }
-
- if(argc == 3) {
- convert_to_string_ex(argv[2]);
- query = Z_STRVAL_PP(argv[2]);
- } else
- query = NULL;
-
- set_swap(ptr->swap_on);
- if(multi) {
- char **objects = NULL;
- int count, *ids, i;
- HashTable *lht;
- zval **keydata;
-
- lht = Z_ARRVAL_PP(argv[1]);
- if(0 == (count = zend_hash_num_elements(lht))) {
- RETURN_FALSE;
- }
- ids = emalloc(count * sizeof(hw_objectID));
-
- zend_hash_internal_pointer_reset(lht);
- for(i=0; i<count; i++) {
- zend_hash_get_current_data(lht, (void **) &keydata);
- switch(Z_TYPE_PP(keydata)) {
- case IS_LONG:
- ids[i] = Z_LVAL_PP(keydata);
- break;
- default:
- ids[i] = Z_LVAL_PP(keydata);
- }
- zend_hash_move_forward(lht);
- }
-
- if (0 != (ptr->lasterror = send_objectbyidquery(ptr->socket, ids, &count, query, &objects))) {
- efree(ids);
- RETURN_FALSE;
- }
- efree(ids);
- array_init(return_value);
-
- for(i=0; i<count; i++) {
- add_index_string(return_value, i, objects[i], 0);
- }
- efree(objects);
-
- } else {
- char *object = NULL;
- id=Z_LVAL_PP(argv[1]);
- if (0 != (ptr->lasterror = send_getobject(ptr->socket, id, &object)))
- RETURN_FALSE;
-
- RETURN_STRING(object, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto int hw_insertobject(int link, string objrec, string parms)
- Inserts an object */
-PHP_FUNCTION(hw_insertobject)
-{
- zval **arg1, **arg2, **arg3;
- int link, type;
- char *objrec, *parms;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_string_ex(arg2);
- convert_to_string_ex(arg3);
- objrec=Z_STRVAL_PP(arg2);
- parms=Z_STRVAL_PP(arg3);
-
- set_swap(ptr->swap_on);
- {
- int objid;
- if (0 != (ptr->lasterror = send_insertobject(ptr->socket, objrec, parms, &objid)))
- RETURN_FALSE;
-
- RETURN_LONG(objid);
- }
-}
-/* }}} */
-
-/* {{{ proto string hw_getandlock(int link, int objid)
- Returns object record and locks object */
-PHP_FUNCTION(hw_getandlock)
-{
- zval **arg1, **arg2;
- int link, id, type;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- if (0 != (ptr->lasterror = send_getandlock(ptr->socket, id, &object)))
- RETURN_FALSE;
-
- RETURN_STRING(object, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto void hw_unlock(int link, int objid)
- Unlocks object */
-PHP_FUNCTION(hw_unlock)
-{
- zval **arg1, **arg2;
- int link, id, type;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_unlock(ptr->socket, id)))
- RETURN_FALSE;
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto void hw_deleteobject(int link, int objid)
- Deletes object */
-PHP_FUNCTION(hw_deleteobject)
-{
- zval **arg1, **arg2;
- int link, id, type;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_deleteobject(ptr->socket, id)))
- RETURN_FALSE;
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto void hw_changeobject(int link, int objid, array attributes)
- Changes attributes of an object (obsolete) */
-#define BUFFERLEN 200
-PHP_FUNCTION(hw_changeobject)
-{
- zval **arg1, **arg2, **arg3;
- int link, id, type, i;
- hw_connection *ptr;
- char *modification, *oldobjrec, buf[BUFFERLEN];
- HashTable *newobjarr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2); /* object ID */
- convert_to_array_ex(arg3); /* Array with new attributes */
- id=Z_LVAL_PP(arg2);
- newobjarr=Z_ARRVAL_PP(arg3);
-
- /* get the old object record */
- if(0 != (ptr->lasterror = send_getandlock(ptr->socket, id, &oldobjrec)))
- RETURN_FALSE;
-
- zend_hash_internal_pointer_reset(newobjarr);
- modification = strdup("");
- for(i=0; i<zend_hash_num_elements(newobjarr); i++) {
- char *key, *str, *str1, newattribute[BUFFERLEN];
- pval *data, **dataptr;
- int j, noinsert=1;
- ulong ind;
-
- zend_hash_get_current_key(newobjarr, &key, &ind, 0);
- zend_hash_get_current_data(newobjarr, (void *) &dataptr);
- data = *dataptr;
- switch(Z_TYPE_P(data)) {
- case IS_STRING:
- if(strlen(Z_STRVAL_P(data)) == 0)
- snprintf(newattribute, BUFFERLEN, "rem %s", key);
- else
- snprintf(newattribute, BUFFERLEN, "add %s=%s", key, Z_STRVAL_P(data));
- noinsert = 0;
- break;
- default:
- newattribute[0] = '\0';
- }
- if(!noinsert) {
- modification = fnInsStr(modification, 0, "\\");
- modification = fnInsStr(modification, 0, newattribute);
-/* modification = fnInsStr(modification, 0, "add "); */
-
- /* Retrieve the old attribute from object record */
- if(NULL != (str = strstr(oldobjrec, key))) {
- str1 = str;
- j = 0;
- while((str1 != NULL) && (*str1 != '\n') && (j < BUFFERLEN-1)) {
- buf[j++] = *str1++;
- }
- buf[j] = '\0';
- modification = fnInsStr(modification, 0, "\\");
- modification = fnInsStr(modification, 0, buf);
- modification = fnInsStr(modification, 0, "rem ");
- }
- }
- zend_hash_move_forward(newobjarr);
- }
- efree(oldobjrec);
-
- set_swap(ptr->swap_on);
- modification[strlen(modification)-1] = '\0';
- if (0 != (ptr->lasterror = send_changeobject(ptr->socket, id, modification))) {
- free(modification);
- send_unlock(ptr->socket, id);
- RETURN_FALSE;
- }
- free(modification);
- if (0 != (ptr->lasterror = send_unlock(ptr->socket, id))) {
- RETURN_FALSE;
- }
- RETURN_TRUE;
-}
-#undef BUFFERLEN
-/* }}} */
-
-/* {{{ proto void hw_modifyobject(int link, int objid, array remattributes, array addattributes [, int mode])
- Modifies attributes of an object */
-#define BUFFERLEN 200
-PHP_FUNCTION(hw_modifyobject)
-{
- zval **argv[5];
- int argc;
- int link, id, type, i, mode;
- hw_connection *ptr;
- char *modification;
- HashTable *remobjarr, *addobjarr;
-
- argc = ZEND_NUM_ARGS();
- if((argc > 5) || (argc < 4))
- WRONG_PARAM_COUNT;
-
- if (zend_get_parameters_array_ex(argc, argv) == FAILURE)
- if(argc < 4) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(argv[0]);
- convert_to_long_ex(argv[1]); /* object ID */
- convert_to_array_ex(argv[2]); /* Array with attributes to remove */
- convert_to_array_ex(argv[3]); /* Array with attributes to add */
- if(argc == 5) {
- convert_to_long_ex(argv[4]);
- mode = Z_LVAL_PP(argv[4]);
- } else
- mode = 0;
- id=Z_LVAL_PP(argv[1]);
- remobjarr=Z_ARRVAL_PP(argv[2]);
- addobjarr=Z_ARRVAL_PP(argv[3]);
-
- modification = strdup("");
- if(addobjarr != NULL) {
- zend_hash_internal_pointer_reset(addobjarr);
- for(i=0; i<zend_hash_num_elements(addobjarr); i++) {
- char *key, addattribute[BUFFERLEN];
- zval *data, **dataptr;
- int noinsert=1;
- ulong ind;
-
- zend_hash_get_current_key(addobjarr, &key, &ind, 0);
- zend_hash_get_current_data(addobjarr, (void *) &dataptr);
- data = *dataptr;
- switch(Z_TYPE_P(data)) {
- case IS_STRING:
- if(strlen(Z_STRVAL_P(data)) > 0) {
- snprintf(addattribute, BUFFERLEN, "add %s=%s", key, Z_STRVAL_P(data));
-/* fprintf(stderr, "add: %s\n", addattribute); */
- noinsert = 0;
- }
- break;
- case IS_ARRAY: {
- int i, len, keylen, count;
- char *strarr, *ptr, *ptr1;
- count = zend_hash_num_elements(Z_ARRVAL_P(data));
- if(count > 0) {
- strarr = make_objrec_from_array(Z_ARRVAL_P(data), ':');
- len = strlen(strarr) - 1;
- keylen = strlen(key);
- if(NULL == (ptr = malloc(len + 1 + count*(keylen+1+4)))) {
- if(modification)
- free(modification);
- RETURN_FALSE;
- }
- ptr1 = ptr;
- *ptr1 = '\0';
- strcpy(ptr1, "add ");
- ptr1 += 4;
- strcpy(ptr1, key);
- ptr1 += keylen;
- *ptr1++ = '=';
- for(i=0; i<len; i++) {
- *ptr1++ = strarr[i];
- if(strarr[i] == '\n') {
- ptr1[-1] = '\\';
- strcpy(ptr1, "add ");
- ptr1 += 4;
- strcpy(ptr1, key);
- ptr1 += keylen;
- *ptr1++ = '=';
- } /* else if(strarr[i] == '=')
- ptr1[-1] = ':'; */
- }
- *ptr1 = '\0';
- strlcpy(addattribute, ptr, sizeof(addattribute));
- noinsert = 0;
- }
- break;
- }
- }
- if(!noinsert) {
- modification = fnInsStr(modification, 0, "\\");
- modification = fnInsStr(modification, 0, addattribute);
- }
- zend_hash_move_forward(addobjarr);
- }
- }
-
- if(remobjarr != NULL) {
- int nr;
- zend_hash_internal_pointer_reset(remobjarr);
- nr = zend_hash_num_elements(remobjarr);
- for(i=0; i<nr; i++) {
- char *key, remattribute[BUFFERLEN];
- zval *data, **dataptr;
- int noinsert=1;
- ulong ind;
-
- zend_hash_get_current_key(remobjarr, &key, &ind, 0);
- zend_hash_get_current_data(remobjarr, (void *) &dataptr);
- data = *dataptr;
- switch(Z_TYPE_P(data)) {
- case IS_STRING:
- if(strlen(Z_STRVAL_P(data)) > 0) {
- snprintf(remattribute, BUFFERLEN, "rem %s=%s", key, Z_STRVAL_P(data));
- noinsert = 0;
- } else {
- snprintf(remattribute, BUFFERLEN, "rem %s", key);
- noinsert = 0;
- }
- break;
- case IS_ARRAY: {
- int i, len, keylen, count;
- char *strarr, *ptr, *ptr1;
- count = zend_hash_num_elements(Z_ARRVAL_P(data));
- if(count > 0) {
- strarr = make_objrec_from_array(Z_ARRVAL_P(data), ':');
- len = strlen(strarr) - 1;
- keylen = strlen(key);
- if(NULL == (ptr = malloc(len + 1 + count*(keylen+1+4)))) {
- if(modification)
- free(modification);
- RETURN_FALSE;
- }
- ptr1 = ptr;
- *ptr1 = '\0';
- strcpy(ptr1, "rem ");
- ptr1 += 4;
- strcpy(ptr1, key);
- ptr1 += keylen;
- *ptr1++ = '=';
- for(i=0; i<len; i++) {
- *ptr1++ = strarr[i];
- if(strarr[i] == '\n') {
- ptr1[-1] = '\\';
- strcpy(ptr1, "rem ");
- ptr1 += 4;
- strcpy(ptr1, key);
- ptr1 += keylen;
- *ptr1++ = '=';
- } /* else if(strarr[i] == '=')
- ptr1[-1] = ':'; */
- }
- *ptr1++ = '\n';
- *ptr1 = '\0';
- strlcpy(remattribute, ptr, sizeof(remattribute));
- noinsert = 0;
- }
- break;
- }
- }
- if(!noinsert) {
- modification = fnInsStr(modification, 0, "\\");
- modification = fnInsStr(modification, 0, remattribute);
- }
- zend_hash_move_forward(remobjarr);
- }
- }
-
- set_swap(ptr->swap_on);
- modification[strlen(modification)-1] = '\0';
- if(strlen(modification) == 0) {
- ptr->lasterror = 0;
- free(modification);
- RETURN_TRUE;
- }
-/* fprintf(stderr, "modifyobject: %s\n", modification); */
- switch(mode) {
- case 0:
- if (0 == (ptr->lasterror = send_lock(ptr->socket, id))) {
- if (0 == (ptr->lasterror = send_changeobject(ptr->socket, id, modification))) {
- if (0 != (ptr->lasterror = send_unlock(ptr->socket, id))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Aiii, Changeobject failed and couldn't unlock object (id = 0x%X)", id);
- free(modification);
- RETURN_FALSE;
- }
- free(modification);
- RETURN_FALSE;
- } else {
- send_unlock(ptr->socket, id);
- free(modification);
- RETURN_FALSE;
- }
- } else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not lock object (id = 0x%X)", id);
- free(modification);
- RETURN_FALSE;
- }
- break;
- case 1:
-/* WARNING: send_groupchangobject() only works right, if each attribute
- can be modified. Doing a changeobject recursively often tries to
- modify objects which cannot be modified e.g. because an attribute cannot
- be removed. In such a case no further modification on that object is done.
- Doing a 'rem Rights\add Rights=R:a' will fail completely if the attribute
- Rights is not there already. The object locking is done in send_groupchangeobject();
-*/
- if (0 != (ptr->lasterror = send_groupchangeobject(ptr->socket, id, modification))) {
- free(modification);
- RETURN_FALSE;
- }
- break;
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mode must be 0 or 1 (recursive)");
- }
- free(modification);
- RETURN_TRUE;
-}
-#undef BUFFERLEN
-/* }}} */
-
-/* {{{ php_hw_mvcp
- */
-void php_hw_mvcp(INTERNAL_FUNCTION_PARAMETERS, int mvcp) {
- zval **arg1, **arg2, **arg3, **arg4;
- int link, type, dest=0, from=0, count;
- HashTable *src_arr;
- hw_connection *ptr;
- int collIDcount, docIDcount, i, *docIDs, *collIDs;
-
- switch(mvcp) {
- case MOVE: /* Move also has fromID */
- if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE)
- WRONG_PARAM_COUNT;
- break;
- case COPY:
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE)
- WRONG_PARAM_COUNT;
- break;
- }
- HW_FETCH_LINK(arg1);
- convert_to_array_ex(arg2);
- convert_to_long_ex(arg3);
- link=Z_LVAL_PP(arg1);
- src_arr=Z_ARRVAL_PP(arg2);
- switch(mvcp) {
- case MOVE: /* Move also has fromID, which is arg3 --> arg4 becomes destID */
- convert_to_long_ex(arg4);
- from=Z_LVAL_PP(arg3);
- dest=Z_LVAL_PP(arg4);
- break;
- case COPY: /* No fromID for Copy needed --> arg3 is destID */
- dest=Z_LVAL_PP(arg3);
- from = 0;
- break;
- }
-
- set_swap(ptr->swap_on);
-
- count = zend_hash_num_elements(src_arr);
- if(NULL == (collIDs = emalloc(count * sizeof(int)))) {
- RETURN_FALSE;
- }
-
- if(NULL == (docIDs = emalloc(count * sizeof(int)))) {
- efree(collIDs);
- RETURN_FALSE;
- }
-
- collIDcount = docIDcount = 0;
- zend_hash_internal_pointer_reset(src_arr);
- for(i=0; i<count; i++) {
- char *objrec;
- zval *keydata, **keydataptr;
- zend_hash_get_current_data(src_arr, (void **) &keydataptr);
- keydata = *keydataptr;
- if(Z_TYPE_P(keydata) == IS_LONG) {
- if(0 != (ptr->lasterror = send_getobject(ptr->socket, Z_LVAL_P(keydata), &objrec))) {
- efree(collIDs);
- efree(docIDs);
- RETURN_FALSE;
- }
- if(0 == fnAttributeCompare(objrec, "DocumentType", "collection"))
- collIDs[collIDcount++] = Z_LVAL_P(keydata);
- else
- docIDs[docIDcount++] = Z_LVAL_P(keydata);
- efree(objrec);
- }
- zend_hash_move_forward(src_arr);
- }
-
- if (0 != (ptr->lasterror = send_mvcpdocscoll(ptr->socket, docIDs, docIDcount, from, dest, mvcp))) {
- efree(collIDs);
- efree(docIDs);
- RETURN_FALSE;
- }
-
- if (0 != (ptr->lasterror = send_mvcpcollscoll(ptr->socket, collIDs, collIDcount, from, dest, mvcp))) {
- efree(collIDs);
- efree(docIDs);
- RETURN_FALSE;
- }
-
- efree(collIDs);
- efree(docIDs);
-
- RETURN_LONG(docIDcount + collIDcount);
-}
-/* }}} */
-
-/* {{{ proto void hw_mv(int link, array objrec, int from, int dest)
- Moves object */
-PHP_FUNCTION(hw_mv)
-{
- php_hw_mvcp(INTERNAL_FUNCTION_PARAM_PASSTHRU, MOVE);
-}
-/* }}} */
-
-/* {{{ proto void hw_cp(int link, array objrec, int dest)
- Copies object */
-PHP_FUNCTION(hw_cp)
-{
- php_hw_mvcp(INTERNAL_FUNCTION_PARAM_PASSTHRU, COPY);
-}
-/* }}} */
-
-/* {{{ proto hwdoc hw_gettext(int link, int objid [, int rootid])
- Returns text document. Links are relative to rootid if given */
-PHP_FUNCTION(hw_gettext)
-{
- zval **argv[3];
- int argc, link, id, type, mode;
- int rootid = 0;
- char *urlprefix;
- hw_document *doc;
- hw_connection *ptr;
-
- argc = ZEND_NUM_ARGS();
- if(argc > 3 || argc < 2 || (zend_get_parameters_array_ex(argc, argv) == FAILURE)) {
- WRONG_PARAM_COUNT;
- }
-
- HW_FETCH_LINK(argv[0]);
- convert_to_long_ex(argv[1]);
- mode = 0;
- urlprefix = NULL;
- if(argc == 3) {
- switch(Z_TYPE_PP(argv[2])) {
- case IS_LONG:
- convert_to_long_ex(argv[2]);
- rootid = Z_LVAL_PP(argv[2]);
- mode = 1;
- break;
- case IS_STRING:
- convert_to_string_ex(argv[2]);
- urlprefix = Z_STRVAL_PP(argv[2]);
- break;
- }
- }
- id=Z_LVAL_PP(argv[1]);
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- char *attributes = NULL;
- char *bodytag = NULL;
- int count;
- /* !!!! memory for object and attributes is allocated with malloc !!!! */
- if (0 != (ptr->lasterror = send_gettext(ptr->socket, id, mode, rootid, &attributes, &bodytag, &object, &count, urlprefix)))
- RETURN_FALSE;
- doc = malloc(sizeof(hw_document));
- doc->data = object;
- doc->attributes = attributes;
- doc->bodytag = bodytag;
- doc->size = count;
- Z_LVAL_P(return_value) = zend_list_insert(doc, le_document);
- Z_TYPE_P(return_value) = IS_LONG;
- }
-}
-/* }}} */
-
-/* {{{ proto void hw_edittext(int link, hwdoc doc)
- Modifies text document */
-PHP_FUNCTION(hw_edittext)
-{
- zval **arg1, **arg2;
- int link, doc, type;
- hw_connection *ptr;
- hw_document *docptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
-
- doc=Z_LVAL_PP(arg2);
- docptr = zend_list_find(doc, &type);
-
- if(!docptr || (type!=le_document)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find document identifier %d", doc);
- RETURN_FALSE;
- }
-
- set_swap(ptr->swap_on);
- {
- if (0 != (ptr->lasterror = send_edittext(ptr->socket, docptr->attributes, docptr->data))) {
- RETURN_FALSE;
- }
- }
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto hwdoc hw_getcgi(int link, int objid)
- Returns the output of a CGI script */
-#define BUFFERLEN 1000
-/* FIX ME: The buffer cgi_env_str should be allocated dynamically */
-PHP_FUNCTION(hw_getcgi)
-{
- zval **arg1, **arg2;
- int link, id, type;
- hw_document *doc;
- hw_connection *ptr;
- char cgi_env_str[BUFFERLEN];
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- char *attributes = NULL;
- int count;
-
- /* Here is another undocument function of Hyperwave.
- If you call a cgi script with getcgi-message, you will
- have to provide the complete cgi enviroment, since it is
- only known to the webserver (or wavemaster). This is done
- by extending the object record with the following incomplete
- string. It should contain any enviroment variable a cgi script
- requires.
- */
-#ifdef PHP_WIN32
- snprintf(cgi_env_str, BUFFERLEN, "CGI_REQUEST_METHOD=%s\nCGI_PATH_INFO=%s\nCGI_QUERY_STRING=%s",
- getenv("REQUEST_METHOD"),
- getenv("PATH_INFO"),
- getenv("QUERY_STRING"));
-#else
- snprintf(cgi_env_str, BUFFERLEN, "CGI_REQUEST_METHOD=%s\nCGI_PATH_INFO=%s\nCGI_QUERY_STRING=%s",
- SG(request_info).request_method,
- SG(request_info).request_uri,
- SG(request_info).query_string);
-#endif
- /* !!!! memory for object and attributes is allocated with malloc !!!! */
- if (0 != (ptr->lasterror = send_getcgi(ptr->socket, id, cgi_env_str, &attributes, &object, &count)))
- RETURN_FALSE;
- doc = malloc(sizeof(hw_document));
- doc->data = object;
- doc->attributes = attributes;
- doc->bodytag = NULL;
- doc->size = count;
- Z_LVAL_P(return_value) = zend_list_insert(doc, le_document);
- Z_TYPE_P(return_value) = IS_LONG;
- }
-}
-#undef BUFFERLEN
-/* }}} */
-
-/* {{{ proto int hw_getremote(int link, int objid)
- Returns the content of a remote document */
-PHP_FUNCTION(hw_getremote)
-{
- zval **arg1, **arg2;
- int link, id, type;
- hw_document *doc;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- char *attributes = NULL;
- int count;
- /* !!!! memory for object and attributes is allocated with malloc !!!! */
- if (0 != (ptr->lasterror = send_getremote(ptr->socket, id, &attributes, &object, &count)))
- RETURN_FALSE;
- doc = malloc(sizeof(hw_document));
- doc->data = object;
- doc->attributes = attributes;
- doc->bodytag = NULL;
- doc->size = count;
- Z_LVAL_P(return_value) = zend_list_insert(doc, le_document);
- Z_TYPE_P(return_value) = IS_LONG;
- }
-}
-/* }}} */
-
-/* {{{ proto [array|int] hw_getremotechildren(int link, string objrec)
- Returns the remote document or an array of object records */
-PHP_FUNCTION(hw_getremotechildren)
-{
- zval **arg1, **arg2;
- int link, type, i;
- hw_connection *ptr;
- char *objrec;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_string_ex(arg2);
- objrec=Z_STRVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- int count, *offsets;
- char *remainder, *ptr1;
- if (0 != (ptr->lasterror = send_getremotechildren(ptr->socket, objrec, &remainder, &offsets, &count)))
- RETURN_FALSE;
-
-/*
-for(i=0;i<count;i++)
- php_printf("offset[%d] = %d--\n", i, offsets[i]);
-php_printf("count = %d, remainder = <HR>%s---<HR>", count, remainder);
-*/
- /* The remainder depends on the number of returned objects and
- whether the MimeType of the object to retrieve is set. If
- the MimeType is set the result will start with the
- HTTP header 'Content-type: mimetype', otherwise it will be
- a list of object records and therefore starts with
- 'ObjectID=0'. In the first case the offset and count are somewhat
- strange. Quite often count had a value of 6 which appears to be
- meaningless, but if you sum up the offsets you get the length
- of the remainder which is the lenght of the document.
- The document must have been chopped up into 6 pieces, each ending
- with 'ServerId=0xYYYYYYYY'.
- In the second case the offset contains the lenght of
- each object record; count contains the number of object records.
- Even if a remote object has children
- (several sql statements) but the MimeType is set, it will
- return a document in the format of MimeType. On the other
- hand a remote object does not have any children but just
- returns a docuement will not be shown unless the MimeType
- is set. It returns the pure object record of the object without
- the SQLStatement attribute. Quite senseless.
- Though, this behavior depends on how the hgi gateway in Hyperwave
- is implemented.
- */
- if(strncmp(remainder, "ObjectID=0 ", 10)) {
- hw_document *doc;
- char *ptr;
- int i, j, len;
- /* For some reason there is always the string
- 'SeverId=0xYYYYYYYY' at the end, so we cut it off.
- The document may as well be divided into several pieces
- and each of them has the ServerId at the end.
- The following will put the pieces back together and
- strip the ServerId. count contains the number of pieces.
- */
- for(i=0, len=0; i<count; i++)
- len += offsets[i]-18;
-/*fprintf(stderr, "len = %d\n", len); */
- doc = malloc(sizeof(hw_document));
- doc->data = malloc(len+1);
- ptr = doc->data;
- for(i=0, j=0; i<count; i++) {
- memcpy((char *)ptr, (char *)&remainder[j], offsets[i]-18);
-/*fprintf(stderr, "rem = %s\n", &remainder[j]); */
- j += offsets[i];
- ptr += offsets[i] - 18;
- }
- *ptr = '\0';
- doc->attributes = strdup(objrec);
- doc->bodytag = NULL;
- doc->size = strlen(doc->data);
- Z_LVAL_P(return_value) = zend_list_insert(doc, le_document);
- Z_TYPE_P(return_value) = IS_LONG;
- } else {
- array_init(return_value);
-
- ptr1 = remainder;
- for(i=0; i<count; i++) {
- *(ptr1+offsets[i]-1) = '\0';
- add_index_string(return_value, i, ptr1, 1);
- ptr1 += offsets[i];
- }
- }
-
- efree(offsets);
- efree(remainder);
- }
-}
-/* }}} */
-
-/* {{{ proto void hw_setlinkroot(int link, int rootid)
- Set the id to which links are calculated */
-PHP_FUNCTION(hw_setlinkroot)
-{
- zval **arg1, **arg2;
- int link, type, rootid;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- rootid = Z_LVAL_PP(arg2);
-
- ptr->linkroot = rootid;
- RETURN_LONG(rootid);
-}
-/* }}} */
-
-/* {{{ proto hwdoc hw_pipedocument(int link, int objid [, array urlprefixes])
- Returns document with links inserted. Optionally a array with five urlprefixes may be passed, which will be inserted for the different types of anchors. This should be a named array with the following keys: HW_DEFAULT_LINK, HW_IMAGE_LINK, HW_BACKGROUND_LINK, HW_INTAG_LINK, and HW_APPLET_LINK */
-PHP_FUNCTION(hw_pipedocument)
-{
- zval **arg1, **arg2, **arg3;
- int i, link, id, type, argc, mode;
- int rootid = 0;
- HashTable *prefixarray;
- char **urlprefix;
- hw_connection *ptr;
- hw_document *doc;
-#if APACHE
- server_rec *serv = ((request_rec *) SG(server_context))->server;
-#endif
-
- argc = ZEND_NUM_ARGS();
- switch(argc)
- {
- case 2:
- if (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE)
- WRONG_PARAM_COUNT;
- break;
- case 3:
- if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE)
- WRONG_PARAM_COUNT;
- break;
- default:
- WRONG_PARAM_COUNT;
- }
-
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
-
- id=Z_LVAL_PP(arg2);
-
- /* check for the array with urlprefixes */
- if(argc == 3) {
- convert_to_array_ex(arg3);
- prefixarray =Z_ARRVAL_PP(arg3);
- if((prefixarray == NULL) || (zend_hash_num_elements(prefixarray) != 5)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must provide 5 urlprefixes (you have provided %d)", zend_hash_num_elements(prefixarray));
- RETURN_FALSE;
- }
-
- urlprefix = emalloc(5*sizeof(char *));
- zend_hash_internal_pointer_reset(prefixarray);
- for(i=0; i<5; i++) {
- char *key;
- zval *data, **dataptr;
- ulong ind;
-
- zend_hash_get_current_key(prefixarray, &key, &ind, 0);
- zend_hash_get_current_data(prefixarray, (void *) &dataptr);
- data = *dataptr;
- if (Z_TYPE_P(data) != IS_STRING) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s must be a String", key);
- RETURN_FALSE;
- } else if ( strcmp(key, "HW_DEFAULT_LINK") == 0 ) {
- urlprefix[HW_DEFAULT_LINK] = Z_STRVAL_P(data);
- } else if ( strcmp(key, "HW_IMAGE_LINK") == 0 ) {
- urlprefix[HW_IMAGE_LINK] = Z_STRVAL_P(data);
- } else if ( strcmp(key, "HW_BACKGROUND_LINK") == 0 ) {
- urlprefix[HW_BACKGROUND_LINK] = Z_STRVAL_P(data);
- } else if ( strcmp(key, "HW_INTAG_LINK") == 0 ) {
- urlprefix[HW_INTAG_LINK] = Z_STRVAL_P(data);
- } else if ( strcmp(key, "HW_APPLET_LINK") == 0 ) {
- urlprefix[HW_APPLET_LINK] = Z_STRVAL_P(data);
- } else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s is not a valid urlprefix", key);
- RETURN_FALSE;
- }
- zend_hash_move_forward(prefixarray);
- }
- } else {
- urlprefix = NULL;
- }
-
- mode = 0;
- if(ptr->linkroot > 0)
- mode = 1;
- rootid = ptr->linkroot;
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- char *attributes = NULL;
- char *bodytag = NULL;
- int count;
- /* !!!! memory for object, bodytag and attributes is allocated with malloc !!!! */
- if (0 != (ptr->lasterror = send_pipedocument(ptr->socket,
-#if APACHE
- serv->server_hostname,
-#else
- getenv("HOSTNAME"),
-#endif
- id, mode, rootid, &attributes, &bodytag, &object, &count, urlprefix)))
- RETURN_FALSE;
-
- if(urlprefix) efree(urlprefix);
-
- doc = malloc(sizeof(hw_document));
- doc->data = object;
- doc->attributes = attributes;
- doc->bodytag = bodytag;
- doc->size = count;
-/* fprintf(stderr, "size = %d\n", count); */
- Z_LVAL_P(return_value) = zend_list_insert(doc, le_document);
- Z_TYPE_P(return_value) = IS_LONG;
- }
-}
-/* }}} */
-
-/* {{{ proto hwdoc hw_pipedocument(int link, int objid)
- Returns document */
-PHP_FUNCTION(hw_oldpipedocument)
-{
- zval **argv[3];
- int link, id, type, argc, mode;
- int rootid = 0;
- hw_connection *ptr;
- hw_document *doc;
-#if APACHE
- server_rec *serv = ((request_rec *) SG(server_context))->server;
-#endif
-
- argc = ZEND_NUM_ARGS();
- if(argc != 2 || (zend_get_parameters_array_ex(argc, argv) == FAILURE)) {
- WRONG_PARAM_COUNT;
- }
-
- HW_FETCH_LINK(argv[0]);
- convert_to_long_ex(argv[1]);
-/* if(argc == 3) {
- convert_to_long_ex(argv[2]);
- rootid = Z_LVAL_PP(argv[2]);
- if(rootid != 0)
- mode = 1;
- }
-*/
- id=Z_LVAL_PP(argv[1]);
-
- mode = 0;
- if(ptr->linkroot > 0)
- mode = 1;
- rootid = ptr->linkroot;
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- char *attributes = NULL;
- char *bodytag = NULL;
- int count;
- /* !!!! memory for object, bodytag and attributes is allocated with malloc !!!! */
- if (0 != (ptr->lasterror = send_pipedocument(ptr->socket,
-#if APACHE
- serv->server_hostname,
-#else
- getenv("HOSTNAME"),
-#endif
- id, mode, rootid, &attributes, &bodytag, &object, &count, NULL)))
- RETURN_FALSE;
-
- doc = malloc(sizeof(hw_document));
- doc->data = object;
- doc->attributes = attributes;
- doc->bodytag = bodytag;
- doc->size = count;
-/* fprintf(stderr, "size = %d\n", count); */
- Z_LVAL_P(return_value) = zend_list_insert(doc, le_document);
- Z_TYPE_P(return_value) = IS_LONG;
- }
-}
-/* }}} */
-
-/* {{{ proto hwdoc hw_pipecgi(int link, int objid)
- Returns output of CGI script */
-#define BUFFERLEN 1000
-/* FIX ME: The buffer cgi_env_str should be allocated dynamically */
-PHP_FUNCTION(hw_pipecgi)
-{
- zval **arg1, **arg2;
- int link, id, type;
- hw_connection *ptr;
- hw_document *doc;
- char cgi_env_str[1000];
-#if APACHE
- server_rec *serv = ((request_rec *) SG(server_context))->server;
-#endif
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- char *attributes = NULL;
- int count;
-
-#ifdef PHP_WIN32
- snprintf(cgi_env_str, BUFFERLEN, "CGI_REQUEST_METHOD=%s\nCGI_PATH_INFO=%s\nCGI_QUERY_STRING=%s",
- getenv("REQUEST_METHOD"),
- getenv("PATH_INFO"),
- getenv("QUERY_STRING"));
-#else
- snprintf(cgi_env_str, BUFFERLEN, "CGI_REQUEST_METHOD=%s\nCGI_PATH_INFO=%s\nCGI_QUERY_STRING=%s",
- SG(request_info).request_method,
- SG(request_info).request_uri,
- SG(request_info).query_string);
-#endif
- /* !!!! memory for object, bodytag and attributes is allocated with malloc !!!! */
- if (0 != (ptr->lasterror = send_pipecgi(ptr->socket,
-#if APACHE
- serv->server_hostname,
-#else
- getenv("HOSTNAME"),
-#endif
- id, cgi_env_str, &attributes, &object, &count)))
- RETURN_FALSE;
-
- doc = malloc(sizeof(hw_document));
- doc->data = object;
- doc->attributes = attributes;
- doc->bodytag = NULL;
- doc->size = count;
- Z_LVAL_P(return_value) = zend_list_insert(doc, le_document);
- Z_TYPE_P(return_value) = IS_LONG;
- }
-}
-#undef BUFFERLEN
-/* }}} */
-
-/* {{{ proto void hw_insertdocument(int link, int parentid, hwdoc doc)
- Insert new document */
-PHP_FUNCTION(hw_insertdocument)
-{
- zval **arg1, **arg2, **arg3;
- int link, id, doc, type;
- hw_connection *ptr;
- hw_document *docptr;
- hw_objectID objid;
-#if APACHE
- server_rec *serv = ((request_rec *) SG(server_context))->server;
-#endif
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- convert_to_long_ex(arg3);
- id=Z_LVAL_PP(arg2);
-
- doc=Z_LVAL_PP(arg3);
- docptr = zend_list_find(doc, &type);
- if(!docptr || (type!=le_document)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find document identifier %d", doc);
- RETURN_FALSE;
- }
-
- set_swap(ptr->swap_on);
- {
- if (0 != (ptr->lasterror = send_putdocument(ptr->socket,
-#if APACHE
- serv->server_hostname,
-#else
- getenv("HOSTNAME"),
-#endif
- id, docptr->attributes, docptr->data, docptr->size, &objid))) {
- RETURN_FALSE;
- }
- }
- RETURN_LONG(objid);
-}
-/* }}} */
-
-/* {{{ proto hwdoc hw_new_document(string objrec, string data, int size)
- Create a new document */
-PHP_FUNCTION(hw_new_document)
-{
- zval **arg1, **arg2, **arg3;
- char *ptr;
- hw_document *doc;
-
- if (ZEND_NUM_ARGS() != 3 || (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE)) {
- WRONG_PARAM_COUNT;
- }
- convert_to_string_ex(arg1);
- convert_to_string_ex(arg2);
- convert_to_long_ex(arg3);
-
- doc = malloc(sizeof(hw_document));
- if(NULL == doc)
- RETURN_FALSE;
- doc->data = malloc(Z_LVAL_PP(arg3)+1);
- if(NULL == doc->data) {
- free(doc);
- RETURN_FALSE;
- }
- memcpy(doc->data, Z_STRVAL_PP(arg2), Z_LVAL_PP(arg3));
- ptr = doc->data;
- ptr[Z_LVAL_PP(arg3)] = '\0';
- doc->attributes = strdup(Z_STRVAL_PP(arg1));
- doc->bodytag = NULL;
- doc->size = Z_LVAL_PP(arg3);
- Z_LVAL_P(return_value) = zend_list_insert(doc, le_document);
- Z_TYPE_P(return_value) = IS_LONG;
-}
-/* }}} */
-
-/* {{{ proto hwdoc hw_new_document_from_file(string objrec, string filename)
- Create a new document from a file */
-PHP_FUNCTION(hw_new_document_from_file)
-{
- pval **arg1, **arg2;
- char *ptr;
- php_stream *stream;
- int use_include_path=0;
- hw_document *doc;
-
- if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE)) {
- WRONG_PARAM_COUNT;
- }
-
- convert_to_string_ex(arg1);
- convert_to_string_ex(arg2);
-
- stream = php_stream_open_wrapper(Z_STRVAL_PP(arg2), "r", use_include_path|ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL);
-
- if (stream == NULL) {
- RETURN_FALSE;
- }
-
- doc = malloc(sizeof(hw_document));
- if(NULL == doc)
- RETURN_FALSE;
-
- doc->size = php_stream_copy_to_mem(stream, &doc->data, PHP_STREAM_COPY_ALL, 1);
-
- php_stream_close(stream);
-
- /* I'm not sure if it is necessary to add a '\0'. It depends on whether
- * PHP-Strings has to be null terminated. doc->size doesn't count the
- * '\0'.
- */
- doc->data = realloc(doc->data, doc->size+1);
- ptr = doc->data;
- ptr[doc->size] = '\0';
- doc->attributes = strdup(Z_STRVAL_PP(arg1));
- doc->bodytag = NULL;
- Z_LVAL_P(return_value) = zend_list_insert(doc, le_document);
- Z_TYPE_P(return_value) = IS_LONG;
-}
-/* }}} */
-
-/* {{{ proto void hw_free_document(hwdoc doc)
- Frees memory of document */
-PHP_FUNCTION(hw_free_document)
-{
- zval **arg1;
- int id, type;
- hw_document *ptr;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_ID(arg1);
- zend_list_delete(id);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto void hw_outputdocument(hwdoc doc)
- An alias for hw_output_document */
-/* }}} */
-
-/* {{{ proto void hw_output_document(hwdoc doc)
- Prints document */
-PHP_FUNCTION(hw_output_document)
-{
- zval **arg1;
- int id, type;
- hw_document *ptr;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_ID(arg1);
-
- php_write(ptr->data, ptr->size TSRMLS_CC);
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string hw_documentbodytag(hwdoc doc [, string prefix])
- An alias for hw_document_bodytag */
-/* }}} */
-
-/* {{{ proto string hw_document_bodytag(hwdoc doc [, string prefix])
- Return bodytag prefixed by prefix */
-PHP_FUNCTION(hw_document_bodytag)
-{
- zval **argv[2];
- int id, type, argc;
- hw_document *ptr;
- char *temp, *str = NULL;
-
- argc = ZEND_NUM_ARGS();
- if(argc > 2 || argc < 1 || (zend_get_parameters_array_ex(argc, argv) == FAILURE)) {
- WRONG_PARAM_COUNT;
- }
-
- HW_FETCH_ID(argv[0]);
-
- if(argc == 2) {
- convert_to_string_ex(argv[1]);
- str=Z_STRVAL_PP(argv[1]);
- }
-
- if(str != NULL) {
- temp = emalloc(Z_STRLEN_PP(argv[1]) + strlen(ptr->bodytag) + 2);
- strcpy(temp, ptr->bodytag);
- strcpy(temp+strlen(ptr->bodytag)-1, str);
- strcpy(temp+strlen(ptr->bodytag)-1+Z_STRLEN_PP(argv[1]), ">\n");
- RETURN_STRING(temp, 0);
- } else {
-/* fprintf(stderr, "hw_document_bodytag: %s (%s)\n", ptr->bodytag, ptr->attributes); */
- if(ptr->bodytag) {
- RETURN_STRING(ptr->bodytag, 1);
- } else {
- RETURN_EMPTY_STRING();
- }
- }
-}
-/* }}} */
-
-/* {{{ proto string hw_document_content(hwdoc doc)
- Returns content of document */
-PHP_FUNCTION(hw_document_content)
-{
- zval **arg1;
- int id, type;
- hw_document *ptr;
-
- if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg1) == FAILURE)) {
- RETURN_FALSE;
- }
-
- HW_FETCH_ID(arg1);
-
- RETURN_STRINGL(ptr->data, ptr->size, 1);
-}
-/* }}} */
-
-/* {{{ proto int hw_document_setcontent(hwdoc doc, string content)
- Sets/replaces content of document */
-PHP_FUNCTION(hw_document_setcontent)
-{
- zval **arg1, **arg2;
- int id, type;
- hw_document *ptr;
- char *str;
-
- if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE)) {
- WRONG_PARAM_COUNT;
- }
-
- HW_FETCH_ID(arg1);
- convert_to_string_ex(arg2);
-
- str = ptr->data;
- if(NULL != (ptr->data = strdup(Z_STRVAL_PP(arg2)))) {
- ptr->size = strlen(ptr->data);
- free(str);
- RETURN_TRUE;
- } else {
- ptr->data = str;
- RETURN_FALSE;
- }
-}
-/* }}} */
-
-/* {{{ proto int hw_documentsize(hwdoc doc)
- An alias for hw_document_size */
-/* }}} */
-
-/* {{{ proto int hw_document_size(hwdoc doc)
- Returns size of document */
-PHP_FUNCTION(hw_document_size)
-{
- zval **arg1;
- int id, type;
- hw_document *ptr;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_ID(arg1);
-
- RETURN_LONG(ptr->size);
-}
-/* }}} */
-
-/* {{{ proto string hw_documentattributes(hwdoc doc)
- An alias for hw_document_attributes */
-/* }}} */
-
-/* {{{ proto string hw_document_attributes(hwdoc doc)
- Returns object record of document */
-PHP_FUNCTION(hw_document_attributes)
-{
- zval **arg1;
- int id, type;
- hw_document *ptr;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_ID(arg1);
-
- RETURN_STRING(ptr->attributes, 1);
-/* make_return_array_from_objrec(&return_value, ptr->attributes); */
-}
-/* }}} */
-
-/* {{{ proto array hw_getparentsobj(int link, int objid)
- Returns array of parent object records */
-PHP_FUNCTION(hw_getparentsobj)
-{
- zval **arg1, **arg2;
- int link, id, type;
- int count;
- char **childObjRecs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
-
- if (0 != (ptr->lasterror = send_getparentsobj(ptr->socket, id, &childObjRecs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, childObjRecs, count))
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto array hw_getparents(int link, int objid)
- Returns array of parent object ids */
-PHP_FUNCTION(hw_getparents)
-{
- zval **arg1, **arg2;
- int link, id, type;
- int count;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- int *childIDs = NULL;
- int i;
-
- if (0 != (ptr->lasterror = send_getparents(ptr->socket, id, &childIDs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for(i=0; i<count; i++) {
- add_index_long(return_value, i, childIDs[i]);
- }
- efree(childIDs);
- }
-
-}
-/* }}} */
-
-/* {{{ proto array hw_children(int link, int objid)
- Returns array of children object ids */
-PHP_FUNCTION(hw_children)
-{
- zval **arg1, **arg2;
- int link, id, type;
- int count;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- int *childIDs = NULL;
- int i;
-
- if (0 != (ptr->lasterror = send_children(ptr->socket, id, &childIDs, &count))){
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for(i=0; i<count; i++) {
- add_index_long(return_value, i, childIDs[i]);
- }
- efree(childIDs);
- }
-
-}
-/* }}} */
-
-/* {{{ proto array hw_childrenobj(int link, int objid)
- Returns array of children object records */
-PHP_FUNCTION(hw_childrenobj)
-{
- pval **arg1, **arg2;
- int link, id, type;
- int count;
- char **childObjRecs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
-
- if (0 != (ptr->lasterror = send_childrenobj(ptr->socket, id, &childObjRecs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, childObjRecs, count))
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto array hw_getchildcoll(int link, int objid)
- Returns array of child collection object ids */
-PHP_FUNCTION(hw_getchildcoll)
-{
- pval **arg1, **arg2;
- int link, id, type;
- int count;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- int *childIDs = NULL;
- int i;
-
- if (0 != (ptr->lasterror = send_getchildcoll(ptr->socket, id, &childIDs, &count))){
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for(i=0; i<count; i++) {
- add_index_long(return_value, i, childIDs[i]);
- }
- efree(childIDs);
- }
-
-}
-/* }}} */
-
-/* {{{ proto array hw_getchildcollobj(int link, int objid)
- Returns array of child collection object records */
-PHP_FUNCTION(hw_getchildcollobj)
-{
- pval **arg1, **arg2;
- int link, id, type;
- int count;
- char **childObjRecs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
-
- if (0 != (ptr->lasterror = send_getchildcollobj(ptr->socket, id, &childObjRecs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, childObjRecs, count))
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto int hw_docbyanchor(int link, int anchorid)
- Returns objid of document belonging to anchorid */
-PHP_FUNCTION(hw_docbyanchor)
-{
- pval **arg1, **arg2;
- int link, id, type;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(ht, 2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- int objectID;
- if (0 != (ptr->lasterror = send_docbyanchor(ptr->socket, id, &objectID)))
- RETURN_FALSE;
-
- RETURN_LONG(objectID);
- }
-}
-/* }}} */
-
-/* {{{ proto array hw_docbyanchorobj(int link, int anchorid)
- Returns object record of document belonging to anchorid */
-PHP_FUNCTION(hw_docbyanchorobj)
-{
- pval **arg1, **arg2;
- int link, id, type;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- {
- char *object = NULL;
- if (0 != (ptr->lasterror = send_docbyanchorobj(ptr->socket, id, &object)))
- RETURN_FALSE;
-
- RETURN_STRING(object, 0);
- /*
- make_return_array_from_objrec(&return_value, object);
- efree(object);
- */
- }
-}
-/* }}} */
-
-/* {{{ proto array hw_getobjectbyquery(int link, string query, int maxhits)
- Search for query and return maxhits objids */
-PHP_FUNCTION(hw_getobjectbyquery)
-{
- pval **arg1, **arg2, **arg3;
- int link, type, maxhits;
- char *query;
- int count, i;
- int *childIDs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_string_ex(arg2);
- convert_to_long_ex(arg3);
- query=Z_STRVAL_PP(arg2);
- maxhits=Z_LVAL_PP(arg3);
- if (maxhits < 0) maxhits=0x7FFFFFFF;
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getobjbyquery(ptr->socket, query, maxhits, &childIDs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for(i=0; i<count; i++)
- add_index_long(return_value, i, childIDs[i]);
- efree(childIDs);
-}
-/* }}} */
-
-/* {{{ proto array hw_getobjectbyqueryobj(int link, string query, int maxhits)
- Search for query and return maxhits object records */
-PHP_FUNCTION(hw_getobjectbyqueryobj)
-{
- pval **arg1, **arg2, **arg3;
- int link, type, maxhits;
- char *query;
- int count;
- char **childObjRecs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_string_ex(arg2);
- convert_to_long_ex(arg3);
- query=Z_STRVAL_PP(arg2);
- maxhits=Z_LVAL_PP(arg3);
- if (maxhits < 0) maxhits=0x7FFFFFFF;
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getobjbyqueryobj(ptr->socket, query, maxhits, &childObjRecs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, childObjRecs, count))
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto array hw_getobjectbyquerycoll(int link, int collid, string query, int maxhits)
- Search for query in collection and return maxhits objids */
-PHP_FUNCTION(hw_getobjectbyquerycoll)
-{
- pval **arg1, **arg2, **arg3, **arg4;
- int link, id, type, maxhits;
- char *query;
- int count, i;
- hw_connection *ptr;
- int *childIDs = NULL;
-
- if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- convert_to_string_ex(arg3);
- convert_to_long_ex(arg4);
- id=Z_LVAL_PP(arg2);
- query=Z_STRVAL_PP(arg3);
- maxhits=Z_LVAL_PP(arg4);
- if (maxhits < 0) maxhits=0x7FFFFFFF;
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getobjbyquerycoll(ptr->socket, id, query, maxhits, &childIDs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for(i=0; i<count; i++)
- add_index_long(return_value, i, childIDs[i]);
- efree(childIDs);
-}
-/* }}} */
-
-/* {{{ proto array hw_getobjectbyquerycollobj(int link, int collid, string query, int maxhits)
- Search for query in collection and return maxhits object records */
-PHP_FUNCTION(hw_getobjectbyquerycollobj)
-{
- pval **arg1, **arg2, **arg3, **arg4;
- int link, id, type, maxhits;
- char *query;
- int count;
- hw_connection *ptr;
- char **childObjRecs = NULL;
-
- if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- convert_to_string_ex(arg3);
- convert_to_long_ex(arg4);
- id=Z_LVAL_PP(arg2);
- query=Z_STRVAL_PP(arg3);
- maxhits=Z_LVAL_PP(arg4);
- if (maxhits < 0) maxhits=0x7FFFFFFF;
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getobjbyquerycollobj(ptr->socket, id, query, maxhits, &childObjRecs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, childObjRecs, count))
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto array hw_getobjectbyftquery(int link, string query, int maxhits)
- Search for query as fulltext and return maxhits objids */
-PHP_FUNCTION(hw_getobjectbyftquery)
-{
- pval **arg1, **arg2, **arg3;
- int link, type, maxhits;
- char *query;
- int count, i;
- int *childIDs = NULL;
- float *weights;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_string_ex(arg2);
- convert_to_long_ex(arg3);
- query=Z_STRVAL_PP(arg2);
- maxhits=Z_LVAL_PP(arg3);
- if (maxhits < 0) maxhits=0x7FFFFFFF;
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getobjbyftquery(ptr->socket, query, maxhits, &childIDs, &weights, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- array_init(return_value) ;
-
- for(i=0; i<count; i++)
- add_index_long(return_value, i, childIDs[i]);
- efree(childIDs);
-}
-/* }}} */
-
-/* {{{ proto array hw_getobjectbyftqueryobj(int link, string query, int maxhits)
- Search for query as fulltext and return maxhits object records */
-PHP_FUNCTION(hw_getobjectbyftqueryobj)
-{
- pval **arg1, **arg2, **arg3;
- int link, type, maxhits;
- char *query;
- int count;
- char **childObjRecs = NULL;
- float *weights;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_string_ex(arg2);
- convert_to_long_ex(arg3);
- query=Z_STRVAL_PP(arg2);
- maxhits=Z_LVAL_PP(arg3);
- if (maxhits < 0) maxhits=0x7FFFFFFF;
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getobjbyftqueryobj(ptr->socket, query, maxhits, &childObjRecs, &weights, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, childObjRecs, count))
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto array hw_getobjectbyftquerycoll(int link, int collid, string query, int maxhits)
- Search for fulltext query in collection and return maxhits objids */
-PHP_FUNCTION(hw_getobjectbyftquerycoll)
-{
- pval **arg1, **arg2, **arg3, **arg4;
- int link, id, type, maxhits;
- char *query;
- int count, i;
- hw_connection *ptr;
- int *childIDs = NULL;
- float *weights;
-
- if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- convert_to_string_ex(arg3);
- convert_to_long_ex(arg4);
- id=Z_LVAL_PP(arg2);
- query=Z_STRVAL_PP(arg3);
- maxhits=Z_LVAL_PP(arg4);
- if (maxhits < 0) maxhits=0x7FFFFFFF;
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getobjbyftquerycoll(ptr->socket, id, query, maxhits, &childIDs, &weights, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for(i=0; i<count; i++)
- add_index_long(return_value, i, childIDs[i]);
- efree(childIDs);
-}
-/* }}} */
-
-/* {{{ proto array hw_getobjectbyftquerycollobj(int link, int collid, string query, int maxhits)
- Search for fulltext query in collection and return maxhits object records */
-PHP_FUNCTION(hw_getobjectbyftquerycollobj)
-{
- pval **arg1, **arg2, **arg3, **arg4;
- int link, id, type, maxhits;
- char *query;
- int count;
- hw_connection *ptr;
- char **childObjRecs = NULL;
- float *weights;
-
- if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- convert_to_string_ex(arg3);
- convert_to_long_ex(arg4);
- id=Z_LVAL_PP(arg2);
- query=Z_STRVAL_PP(arg3);
- maxhits=Z_LVAL_PP(arg4);
- if (maxhits < 0) maxhits=0x7FFFFFFF;
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getobjbyftquerycollobj(ptr->socket, id, query, maxhits, &childObjRecs, &weights, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, childObjRecs, count))
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto array hw_getchilddoccoll(int link, int objid)
- Returns all children ids which are documents */
-PHP_FUNCTION(hw_getchilddoccoll)
-{
- pval **arg1, **arg2;
- int link, id, type;
- int count, i;
- int *childIDs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getchilddoccoll(ptr->socket, id, &childIDs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for(i=0; i<count; i++)
- add_index_long(return_value, i, childIDs[i]);
- efree(childIDs);
-}
-/* }}} */
-
-/* {{{ proto array hw_getchilddoccollobj(int link, int objid)
- Returns all children object records which are documents */
-PHP_FUNCTION(hw_getchilddoccollobj)
-{
- pval **arg1, **arg2;
- int link, id, type;
- int count;
- char **childObjRecs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getchilddoccollobj(ptr->socket, id, &childObjRecs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, childObjRecs, count))
- RETURN_FALSE;
-
-}
-/* }}} */
-
-/* {{{ proto array hw_getanchors(int link, int objid)
- Return all anchors of object */
-PHP_FUNCTION(hw_getanchors)
-{
- pval **arg1, **arg2;
- int link, id, type;
- int count, i;
- int *anchorIDs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getanchors(ptr->socket, id, &anchorIDs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for(i=0; i<count; i++)
- add_index_long(return_value, i, anchorIDs[i]);
- efree(anchorIDs);
-}
-/* }}} */
-
-/* {{{ proto array hw_getanchorsobj(int link, int objid)
- Return all object records of anchors of object */
-PHP_FUNCTION(hw_getanchorsobj)
-{
- pval **arg1, **arg2;
- int link, id, type;
- int count;
- char **anchorObjRecs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getanchorsobj(ptr->socket, id, &anchorObjRecs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, anchorObjRecs, count))
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto string hw_getusername(int link)
- Returns the current user name */
-PHP_FUNCTION(hw_getusername)
-{
- pval **arg1;
- int link, type;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
-
- Z_STRVAL_P(return_value) = estrdup(ptr->username);
- Z_STRLEN_P(return_value) = strlen(ptr->username);
- Z_TYPE_P(return_value) = IS_STRING;
-}
-/* }}} */
-
-/* {{{ proto void hw_identify(int link, string username, string password)
- Identifies at Hyperwave server */
-PHP_FUNCTION(hw_identify)
-{
- pval **arg1, **arg2, **arg3;
- int link, type;
- char *name, *passwd, *userdata;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_string_ex(arg2);
- convert_to_string_ex(arg3);
- name=Z_STRVAL_PP(arg2);
- passwd=Z_STRVAL_PP(arg3);
-
- set_swap(ptr->swap_on);
- {
- char *str;
-
- if (0 != (ptr->lasterror = send_identify(ptr->socket, name, passwd, &userdata))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror);
- if(ptr->username) free(ptr->username);
- ptr->username = NULL;
- RETURN_FALSE;
- }
-
- Z_STRVAL_P(return_value) = userdata;
- Z_STRLEN_P(return_value) = strlen(userdata);
- Z_TYPE_P(return_value) = IS_STRING;
- if(ptr->username) free(ptr->username);
- str = userdata;
- while((*str != 0) && (*str != ' '))
- str++;
- if(*str != '\0')
- ptr->username = strdup(++str);
- else
- ptr->username = NULL;
- }
-}
-/* }}} */
-
-/* {{{ proto array hw_objrec2array(string objrec, [array format])
- Returns object array of object record */
-PHP_FUNCTION(hw_objrec2array)
-{
- zval **arg1, **arg2;
-
- switch(ZEND_NUM_ARGS()) {
- case 1:
- if(zend_get_parameters_ex(1, &arg1) == FAILURE)
- WRONG_PARAM_COUNT;
- convert_to_string_ex(arg1);
- make2_return_array_from_objrec(&return_value, Z_STRVAL_PP(arg1), NULL);
- break;
- case 2:
- if(zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE)
- WRONG_PARAM_COUNT;
- convert_to_array_ex(arg2);
- convert_to_string_ex(arg1);
- make2_return_array_from_objrec(&return_value, Z_STRVAL_PP(arg1), *arg2);
- break;
- default:
- WRONG_PARAM_COUNT;
- }
-}
-/* }}} */
-
-/* {{{ proto string hw_array2objrec(array objarr)
- Returns object record of object array */
-PHP_FUNCTION(hw_array2objrec)
-{
- pval **arg1;
- char *objrec, *retobj;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- convert_to_array_ex(arg1);
- objrec = make_objrec_from_array(Z_ARRVAL_PP(arg1), '=');
- if(objrec) {
- retobj = estrdup(objrec);
- free(objrec);
- RETURN_STRING(retobj, 0);
- } else
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto array hw_incollections(int link, array objids, array collids, int para)
- Returns object ids which are in collections */
-PHP_FUNCTION(hw_incollections)
-{
- pval **arg1, **arg2, **arg3, **arg4;
- int type, link, i;
- hw_connection *ptr;
- int cobjids, ccollids, *objectIDs, *collIDs, cretids, *retIDs, retcoll;
-
- if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_array_ex(arg2);
- convert_to_array_ex(arg3);
- convert_to_long_ex(arg4);
- retcoll=Z_LVAL_PP(arg4);
-
- cobjids = zend_hash_num_elements(Z_ARRVAL_PP(arg2));
- if(NULL == (objectIDs = make_ints_from_array(Z_ARRVAL_PP(arg2)))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not create Int Array from Array");
- RETURN_FALSE;
- }
-
- ccollids = zend_hash_num_elements(Z_ARRVAL_PP(arg3));
- if(NULL == (collIDs = make_ints_from_array(Z_ARRVAL_PP(arg3)))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not create Int Array from Array");
- efree(objectIDs);
- RETURN_FALSE;
- }
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_incollections(ptr->socket, retcoll,
- cobjids, objectIDs,
- ccollids, collIDs,
- &cretids, &retIDs))) {
- if(objectIDs) efree(objectIDs);
- if(collIDs) efree(collIDs);
- RETURN_FALSE;
- }
-
- if(objectIDs) efree(objectIDs);
- if(collIDs) efree(collIDs);
-
- array_init(return_value);
-
- for(i=0; i<cretids; i++)
- add_index_long(return_value, i, retIDs[i]);
- efree(retIDs);
-
-}
-/* }}} */
-
-/* {{{ proto void hw_inscoll(int link, int parentid, array objarr)
- Inserts collection */
-PHP_FUNCTION(hw_inscoll)
-{
- pval **arg1, **arg2, **arg3;
- char *objrec;
- int id, newid, type, link;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- convert_to_array_ex(arg3);
- id=Z_LVAL_PP(arg2);
-
- if(NULL == (objrec = make_objrec_from_array(Z_ARRVAL_PP(arg3), '='))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not create Object Record from Array");
- RETURN_FALSE;
- }
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_inscoll(ptr->socket, id, objrec, &newid))) {
- if(objrec) free(objrec);
- RETURN_FALSE;
- }
-
- if(objrec) free(objrec);
- RETURN_LONG(newid);
-}
-/* }}} */
-
-/* {{{ proto void hw_insdoc(int link, int parentid, string objrec [, string text])
- Inserts document */
-PHP_FUNCTION(hw_insdoc)
-{
- zval **argv[4];
- char *objrec, *text;
- int id, newid, type, link, argc;
- hw_connection *ptr;
-
- argc = ZEND_NUM_ARGS();
- if((argc < 3) || (argc > 4))
- WRONG_PARAM_COUNT;
-
- if (zend_get_parameters_array_ex(argc, argv) == FAILURE)
- WRONG_PARAM_COUNT;
-
- HW_FETCH_LINK(argv[0]);
- convert_to_long_ex(argv[1]);
- convert_to_string_ex(argv[2]);
- if(argc == 4) {
- convert_to_string_ex(argv[3]);
- text = Z_STRVAL_PP(argv[3]);
- } else {
- text = NULL;
- }
- id = Z_LVAL_PP(argv[1]);
-
- set_swap(ptr->swap_on);
- objrec = Z_STRVAL_PP(argv[2]);
- if (0 != (ptr->lasterror = send_insdoc(ptr->socket, id, objrec, text, &newid))) {
- RETURN_FALSE;
- }
-
- RETURN_LONG(newid);
-}
-/* }}} */
-
-/* {{{ proto int hw_getsrcbydestobj(int link, int destid)
- Returns object id of source docuent by destination anchor */
-PHP_FUNCTION(hw_getsrcbydestobj)
-{
- pval **arg1, **arg2;
- int link, type, id;
- int count;
- char **childObjRecs = NULL;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- id=Z_LVAL_PP(arg2);
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_getsrcbydest(ptr->socket, id, &childObjRecs, &count))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d", ptr->lasterror);
- RETURN_FALSE;
- }
-
- /* create return value and free all memory */
- if( 0 > make_return_objrec(&return_value, childObjRecs, count))
- RETURN_FALSE;
-}
-/* }}} */
-
-/* {{{ proto int hw_mapid(int link, int serverid, int destid)
- Returns virtual object id of document on remote Hyperwave server */
-PHP_FUNCTION(hw_mapid)
-{
- pval **arg1, **arg2, **arg3;
- int link, type, servid, id, virtid;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- convert_to_long_ex(arg3);
- servid=Z_LVAL_PP(arg2);
- id=Z_LVAL_PP(arg3);
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = send_mapid(ptr->socket, servid, id, &virtid))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d", ptr->lasterror);
- RETURN_FALSE;
- }
- RETURN_LONG(virtid);
-}
-/* }}} */
-
-/* {{{ proto string hw_getrellink(int link, int rootid, int sourceid, int destid)
- Get link from source to dest relative to rootid */
-PHP_FUNCTION(hw_getrellink)
-{
- pval **arg1, **arg2, **arg3, **arg4;
- int link, type;
- int rootid, destid, sourceid;
- char *anchorstr;
- hw_connection *ptr;
-
- if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
- convert_to_long_ex(arg2);
- convert_to_long_ex(arg3);
- convert_to_long_ex(arg4);
- rootid=Z_LVAL_PP(arg2);
- sourceid=Z_LVAL_PP(arg3);
- destid=Z_LVAL_PP(arg4);
-
- set_swap(ptr->swap_on);
- if (0 != (ptr->lasterror = getrellink(ptr->socket, rootid, sourceid, destid, &anchorstr))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d", ptr->lasterror);
- RETURN_FALSE;
- }
-
- RETURN_STRING(anchorstr, 0);
-}
-/* }}} */
-
-/* {{{ proto string hw_insertanchors(int hwdoc, array anchorecs, array dest [, array urlprefixes])
- Inserts only anchors into text */
-PHP_FUNCTION(hw_insertanchors)
-{
- pval **arg1, **arg2, **arg3, **arg4;
- hw_document *hwdoc;
- int type, docid, error, argc, count;
- char **anchorrecs;
- char **dest;
- char **urlprefix;
- char *bodytag = NULL;
- HashTable *arrht;
- HashTable *prefixarray;
-
- argc = ZEND_NUM_ARGS();
- switch(argc)
- {
- case 3:
- if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE)
- WRONG_PARAM_COUNT;
- break;
- case 4:
- if (zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE)
- WRONG_PARAM_COUNT;
- break;
- default:
- WRONG_PARAM_COUNT;
- }
-
- convert_to_long_ex(arg1);
- convert_to_array_ex(arg2);
- convert_to_array_ex(arg3);
- docid=Z_LVAL_PP(arg1);
- hwdoc = zend_list_find(docid, &type);
- if(!hwdoc || (type!=le_document)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find file identifier %d", docid);
- RETURN_FALSE;
- }
-
- /* check for the array with urlprefixes */
- if(argc == 4) {
- int i;
- convert_to_array_ex(arg4);
- prefixarray =Z_ARRVAL_PP(arg4);
- if((prefixarray == NULL) || (zend_hash_num_elements(prefixarray) != 5)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must provide 5 urlprefixes (you have provided %d)", zend_hash_num_elements(prefixarray));
- RETURN_FALSE;
- }
-
- urlprefix = emalloc(5*sizeof(char *));
- zend_hash_internal_pointer_reset(prefixarray);
- for(i=0; i<5; i++) {
- char *key;
- zval *data, **dataptr;
- ulong ind;
-
- zend_hash_get_current_key(prefixarray, &key, &ind, 0);
- zend_hash_get_current_data(prefixarray, (void *) &dataptr);
- data = *dataptr;
- if (Z_TYPE_P(data) != IS_STRING) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s must be a String", key);
- RETURN_FALSE;
- } else if ( strcmp(key, "HW_DEFAULT_LINK") == 0 ) {
- urlprefix[HW_DEFAULT_LINK] = Z_STRVAL_P(data);
- } else if ( strcmp(key, "HW_IMAGE_LINK") == 0 ) {
- urlprefix[HW_IMAGE_LINK] = Z_STRVAL_P(data);
- } else if ( strcmp(key, "HW_BACKGROUND_LINK") == 0 ) {
- urlprefix[HW_BACKGROUND_LINK] = Z_STRVAL_P(data);
- } else if ( strcmp(key, "HW_INTAG_LINK") == 0 ) {
- urlprefix[HW_INTAG_LINK] = Z_STRVAL_P(data);
- } else if ( strcmp(key, "HW_APPLET_LINK") == 0 ) {
- urlprefix[HW_APPLET_LINK] = Z_STRVAL_P(data);
- } else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s is not a valid urlprefix", key);
- RETURN_FALSE;
- }
- zend_hash_move_forward(prefixarray);
- }
- } else {
- urlprefix = NULL;
- }
-
- if(zend_hash_num_elements(Z_ARRVAL_PP(arg2)) != zend_hash_num_elements(Z_ARRVAL_PP(arg3))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unequal number of elements in arrays");
- RETURN_FALSE;
- }
-
- /* Turn PHP-Array of strings into C-Array of strings */
- arrht = Z_ARRVAL_PP(arg2);
- anchorrecs = make_strs_from_array(arrht);
- arrht = Z_ARRVAL_PP(arg3);
- dest = make_strs_from_array(arrht);
-
- if (0 != (error = send_insertanchors(&(hwdoc->data), &count, anchorrecs, dest, zend_hash_num_elements(arrht), urlprefix, &bodytag))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d", error);
- RETURN_FALSE;
- }
-/*fprintf(stderr, "in hw_insertanchors: %s\n", hwdoc->attributes); */
- hwdoc->size = count;
- if(hwdoc->bodytag) free (hwdoc->bodytag);
- hwdoc->bodytag = bodytag;
-
- RETURN_TRUE;
-}
-/* }}} */
-
-
-PHP_MINFO_FUNCTION(hw)
-{
- php_info_print_table_start();
- php_info_print_table_row(2, "Hyperwave Support", "enabled");
- php_info_print_table_row(2, "HG-CSP Version", "7.17");
- php_info_print_table_end();
- DISPLAY_INI_ENTRIES();
-}
-
-/* {{{ proto void hw_connection_info(int link)
- Prints information about the connection to Hyperwave server */
-PHP_FUNCTION(hw_connection_info)
-{
- pval **arg1;
- hw_connection *ptr;
- int link, type;
-
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- HW_FETCH_LINK(arg1);
-
- php_printf("Hyperwave Info:\nhost=%s,\nserver string=%s\nversion=%d\nswap=%d\n", ptr->hostname, ptr->server_string, ptr->version, ptr->swap_on);
-}
-/* }}} */
-
-void print_msg(hg_msg *msg, char *str, int txt)
-{
- char *ptr;
- int i;
-
- fprintf(stdout, "\nprint_msg: >>%s<<\n", str);
- fprintf(stdout, "print_msg: length = %d\n", msg->length);
- fprintf(stdout, "print_msg: msgid = %d\n", msg->version_msgid);
- fprintf(stdout, "print_msg: msg_type = %d\n", msg->msg_type);
- if ( msg->length > HEADER_LENGTH ) {
- ptr = msg->buf;
- for ( i = 0; i < msg->length-HEADER_LENGTH; i++ ) {
- if ( *ptr == '\n' )
- fprintf(stdout, "%c", *ptr++);
- else if ( iscntrl(*ptr) )
- {fprintf(stdout, "."); ptr++;}
- else
- fprintf(stdout, "%c", *ptr++);
- }
- }
- fprintf(stdout, "\n\n");
-}
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/ext/hyperwave/hw_error.h b/ext/hyperwave/hw_error.h
deleted file mode 100644
index 41a9831084..0000000000
--- a/ext/hyperwave/hw_error.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 4 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2003 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.02 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available at through the world-wide-web at |
- | http://www.php.net/license/2_02.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Authors: Rasmus Lerdorf <rasmus@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef HW_ERROR_H
-#define HW_ERROR_H
-
-#if HYPERWAVE
-
-#define NOACCESS 1 /* Access denied */
-#define NODOCS 2 /* No documents */
-#define NONAME 3 /* No collection name */
-#define NODOC 4 /* Object is not a document */
-#define NOOBJ 5 /* No object received */
-#define NOCOLLS 6 /* No collections received */
-#define DBSTUBNG 7 /* Connection to low-level database failed */
-#define NOTFOUND 8 /* Object not found */
-#define EXIST 9 /* Collection already exists */
-#define FATHERDEL 10 /* parent collection disappeared */
-#define FATHNOCOLL 11 /* parent collection not a collection */
-#define NOTEMPTY 12 /* Collection not empty */
-#define DESTNOCOLL 13 /* Destination not a collection */
-#define SRCEQDEST 14 /* Source equals destination */
-#define REQPEND 15 /* Request pending */
-#define TIMEOUT 16 /* Timeout */
-#define NAMENOTUNIQUE 17 /* Name not unique */
-#define WRITESTOPPED 18 /* Database now read-only; try again later */
-#define LOCKED 19 /* Object locked; try again later */
-#define CHANGEBASEFLD 20 /* Change of base-attribute */
-#define NOTREMOVED 21 /* Attribute not removed */
-#define FLDEXISTS 22 /* Attribute exists */
-#define CMDSYNTAX 23 /* Syntax error in command */
-#define NOLANGUAGE 24 /* No or unknown language specified */
-#define WRGTYPE 25 /* Wrong type in object */
-#define WRGVERSION 26 /* Client version too old */
-#define CONNECTION 27 /* No connection to other server */
-#define SYNC 28 /* Synchronization error */
-#define NOPATH 29 /* No path entry */
-#define WRGPATH 30 /* Wrong path entry */
-#define PASSWD 31 /* Wrong password (server-to-server server authentication) */
-#define LC_NO_MORE_USERS 32 /* No more users for license */
-#define LC_NO_MORE_DOCS 33 /* No more documents for this session and license */
-#define RSERV_NRESP 34 /* Remote server not responding */
-#define Q_OVERFLOW 35 /* Query overflow */
-#define USR_BREAK 36 /* Break by user */
-#define N_IMPL 37 /* Not implemented */
-#define WRG_VALUE 38 /* Wrong value */
-#define INSUFF_FUNDS 39 /* Insufficient funds */
-#define REORG 40 /* Reorganization in progress */
-#define USER_LIMIT 41 /* Limit of simultaneous users reached */
-#define FTCONNECT 513 /* No connection to fulltext server */
-#define FTTIMEOUT 514 /* Connection timed out */
-#define FTINDEX 515 /* Something wrong with fulltext index */
-#define FTSYNTAX 516 /* Query syntax error */
-#define REQUESTPENDING 1025 /* Request pending */
-#define NOCONNECTION 1026 /* No connection to document server */
-#define WRONGVERSION 1027 /* Wrong protocol version */
-#define NOTINITIALIZED 1028 /* Not initialized */
-#define BADREQUEST 1029 /* Bad request */
-#define BADLRN 1030 /* Bad document number */
-#define OPENSTORE_WRITE 1031 /* Cannot write to local store */
-#define OPENSTORE_READ 1032 /* Cannot read from local store */
-#define READSTORE 1033 /* Store read error */
-#define WRITESTORE 1034 /* Write error */
-#define CLOSESTORE 1035 /* Close error */
-#define BADPATH 1036 /* Bad path */
-#define NOPATHDC 1037 /* No path */
-#define OPENFILE 1038 /* Cannot open file */
-#define READFILE 1039 /* Cannot read from file // same */
-#define WRITEFILE 1040 /* Cannot write to file */
-#define CONNECTCLIENT 1041 /* Could not connect to client */
-#define ACCEPT 1042 /* Could not accept connection */
-#define READSOCKET 1043 /* Could not read from socket */
-#define WRITESOCKET 1044 /* Could not write to socket */
-#define TOOMUCHDATA 1046 /* Received too much data */
-#define TOOFEWDATA 1047 /* Received too few data // ... */
-#define NOTIMPLEMENTED 1049 /* Not implemented */
-#define USERBREAK 1050 /* User break */
-#define INTERNAL 1051 /* Internal error */
-#define INVALIDOBJECT 1052 /* Invalid object */
-#define JOBTIMEOUT 1053 /* Job timed out */
-#define OPENPORT 1054 /* Cannot open port // ... for several resons */
-#define NODATA 1055 /* Received no data */
-#define NOPORT 1056 /* No port to handle this request */
-#define NOTCACHED 1057 /* Document not cached */
-#define BADCACHETYPE 1058 /* Bad cache type */
-#define OPENCACHE_WRITE 1059 /* Cannot write to cache */
-#define OPENCACHE_READ 1060 /* Cannot read from cache // same */
-#define NOSOURCE 1061 /* Do not know what to read */
-#define CLOSECACHE 1062 /* Could not insert into cache */
-#define CONNECTREMOTE 1063 /* Could not connect to remote server */
-#define LOCKREFUSED 1064 /* Lock refused // could not lock the stores */
-
-#endif
-#endif
diff --git a/ext/hyperwave/hyperwave.dsp b/ext/hyperwave/hyperwave.dsp
deleted file mode 100644
index 1ca7e52439..0000000000
--- a/ext/hyperwave/hyperwave.dsp
+++ /dev/null
@@ -1,120 +0,0 @@
-# Microsoft Developer Studio Project File - Name="hyperwave" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=hyperwave - Win32 Debug_TS
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "hyperwave.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "hyperwave.mak" CFG="hyperwave - Win32 Debug_TS"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "hyperwave - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "hyperwave - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "hyperwave - Win32 Release_TS"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release_TS"
-# PROP BASE Intermediate_Dir "Release_TS"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release_TS"
-# PROP Intermediate_Dir "Release_TS"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HYPERWAVE_EXPORTS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "WIN32" /D "PHP_EXPORTS" /D "COMPILE_DL_HYPERWAVE" /D ZTS=1 /D HYPERWAVE=1 /D ZEND_DEBUG=0 /D "NDEBUG" /D "_WINDOWS" /D "ZEND_WIN32" /D "PHP_WIN32" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x407 /d "NDEBUG"
-# ADD RSC /l 0x407 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 php4ts.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_hyperwave.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline"
-
-!ELSEIF "$(CFG)" == "hyperwave - Win32 Debug_TS"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug_TS"
-# PROP BASE Intermediate_Dir "Debug_TS"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug_TS"
-# PROP Intermediate_Dir "Debug_TS"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HYPERWAVE_EXPORTS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "PHP_EXPORTS" /D "COMPILE_DL_HYPERWAVE" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HYPERWAVE=1 /YX /FD /GZ /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x407 /d "_DEBUG"
-# ADD RSC /l 0x407 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 php4ts_debug.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_hyperwave.dll" /pdbtype:sept /libpath:"..\..\Debug_TS"
-
-!ENDIF
-
-# Begin Target
-
-# Name "hyperwave - Win32 Release_TS"
-# Name "hyperwave - Win32 Debug_TS"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\hg_comm.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\hw.c
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=.\hg_comm.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\hw_error.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_hyperwave.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/ext/hyperwave/php_hyperwave.h b/ext/hyperwave/php_hyperwave.h
deleted file mode 100644
index 04602635bc..0000000000
--- a/ext/hyperwave/php_hyperwave.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 4 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2003 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.02 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available at through the world-wide-web at |
- | http://www.php.net/license/2_02.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: Rasmus Lerdorf <rasmus@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HYPERWAVE_H
-#define PHP_HYPERWAVE_H
-
-#ifdef PHP_WIN32
-#define PHP_HW_API __declspec(dllexport)
-#else
-#define PHP_HW_API
-#endif
-
-#if HYPERWAVE
-#ifndef DLEXPORT
-#define DLEXPORT
-#endif
-
-#ifdef ZTS
-#include "TSRM.h"
-#endif
-
-#include "hg_comm.h"
-
-extern zend_module_entry hw_module_entry;
-#define hw_module_ptr &hw_module_entry
-
-typedef struct {
- long default_link;
- long default_port;
- long num_links,num_persistent;
- long max_links,max_persistent;
- long allow_persistent;
-} zend_hw_globals;
-
-#ifdef ZTS
-# define HwSG(v) TSRMG(hw_globals_id, zend_hw_globals *, v)
-#else
-# define HwSG(v) (hw_globals.v)
-extern PHP_HW_API zend_hw_globals hw_globals;
-#endif
-
-/*extern hw_module php_hw_module;*/
-
-typedef struct {
- int size;
- char *data;
- char *attributes;
- char *bodytag;
-} hw_document;
-
-PHP_MINIT_FUNCTION(hw);
-PHP_MSHUTDOWN_FUNCTION(hw);
-PHP_MINFO_FUNCTION(hw);
-
-PHP_FUNCTION(hw_connect);
-PHP_FUNCTION(hw_pconnect);
-PHP_FUNCTION(hw_close);
-PHP_FUNCTION(hw_root);
-PHP_FUNCTION(hw_info);
-PHP_FUNCTION(hw_error);
-PHP_FUNCTION(hw_errormsg);
-PHP_FUNCTION(hw_mv);
-PHP_FUNCTION(hw_cp);
-PHP_FUNCTION(hw_deleteobject);
-PHP_FUNCTION(hw_changeobject);
-PHP_FUNCTION(hw_modifyobject);
-PHP_FUNCTION(hw_getparents);
-PHP_FUNCTION(hw_getparentsobj);
-PHP_FUNCTION(hw_children);
-PHP_FUNCTION(hw_childrenobj);
-PHP_FUNCTION(hw_getchildcoll);
-PHP_FUNCTION(hw_getchildcollobj);
-PHP_FUNCTION(hw_getobject);
-PHP_FUNCTION(hw_getandlock);
-PHP_FUNCTION(hw_unlock);
-PHP_FUNCTION(hw_gettext);
-PHP_FUNCTION(hw_edittext);
-PHP_FUNCTION(hw_getcgi);
-PHP_FUNCTION(hw_getremote);
-PHP_FUNCTION(hw_getremotechildren);
-PHP_FUNCTION(hw_pipedocument);
-PHP_FUNCTION(hw_pipecgi);
-PHP_FUNCTION(hw_insertdocument);
-PHP_FUNCTION(hw_docbyanchorobj);
-PHP_FUNCTION(hw_docbyanchor);
-PHP_FUNCTION(hw_getobjectbyquery);
-PHP_FUNCTION(hw_getobjectbyqueryobj);
-PHP_FUNCTION(hw_getobjectbyquerycoll);
-PHP_FUNCTION(hw_getobjectbyquerycollobj);
-PHP_FUNCTION(hw_getobjectbyftquery);
-PHP_FUNCTION(hw_getobjectbyftqueryobj);
-PHP_FUNCTION(hw_getobjectbyftquerycoll);
-PHP_FUNCTION(hw_getobjectbyftquerycollobj);
-PHP_FUNCTION(hw_getchilddoccoll);
-PHP_FUNCTION(hw_getchilddoccollobj);
-PHP_FUNCTION(hw_getanchors);
-PHP_FUNCTION(hw_getanchorsobj);
-PHP_FUNCTION(hw_getusername);
-PHP_FUNCTION(hw_setlinkroot);
-PHP_FUNCTION(hw_inscoll);
-PHP_FUNCTION(hw_incollections);
-PHP_FUNCTION(hw_insertobject);
-PHP_FUNCTION(hw_insdoc);
-PHP_FUNCTION(hw_identify);
-PHP_FUNCTION(hw_free_document);
-PHP_FUNCTION(hw_new_document);
-PHP_FUNCTION(hw_new_document_from_file);
-PHP_FUNCTION(hw_output_document);
-PHP_FUNCTION(hw_document_size);
-PHP_FUNCTION(hw_document_attributes);
-PHP_FUNCTION(hw_document_bodytag);
-PHP_FUNCTION(hw_document_content);
-PHP_FUNCTION(hw_document_setcontent);
-PHP_FUNCTION(hw_objrec2array);
-PHP_FUNCTION(hw_array2objrec);
-PHP_FUNCTION(hw_connection_info);
-PHP_FUNCTION(hw_getsrcbydestobj);
-PHP_FUNCTION(hw_insertanchors);
-PHP_FUNCTION(hw_getrellink);
-PHP_FUNCTION(hw_dummy);
-PHP_FUNCTION(hw_who);
-PHP_FUNCTION(hw_stat);
-PHP_FUNCTION(hw_mapid);
-
-#else
-#define hw_module_ptr NULL
-#endif /* HYPERWAVE */
-#define phpext_hyperwave_ptr hw_module_ptr
-#endif /* PHP_HYPERWAVE_H */
-