diff options
Diffstat (limited to 'ext/hyperwave/hw.c')
-rw-r--r-- | ext/hyperwave/hw.c | 3720 |
1 files changed, 0 insertions, 3720 deletions
diff --git a/ext/hyperwave/hw.c b/ext/hyperwave/hw.c deleted file mode 100644 index 80a37b61d8..0000000000 --- a/ext/hyperwave/hw.c +++ /dev/null @@ -1,3720 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP version 4.0 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997, 1998, 1999 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.0 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_0.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: Uwe Steinmann | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ -#if COMPILE_DL -#include "dl/phpdl.h" -#endif - -#include <stdlib.h> -#include <errno.h> - -#include "php.h" -#include "php_globals.h" -#include "ext/standard/php_standard.h" -#include "ext/standard/head.h" -#include "ext/standard/info.h" -#include "SAPI.h" - -#if WIN32|WINNT -#include <winsock.h> -#else -#include "build-defs.h" -#endif - -#if HYPERWAVE - -#include "php_ini.h" -#include "php_hyperwave.h" - -//hw_module php3_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_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_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_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} -}; - -php3_module_entry hw_module_entry = { - "HyperWave", hw_functions, PHP_MINIT(hw), PHP_MSHUTDOWN(hw), NULL, NULL, PHP_MINFO(hw), 0, 0, 0, NULL -}; - -#ifdef ZTS -int hw_globals_id; -#else -PHP_HW_API php_hw_globals hw_globals; -#endif - -#ifdef COMPILE_DL -DLEXPORT php3_module_entry *get_module(void) { return &hw_module_entry; } -#endif - -void print_msg(hg_msg *msg, char *str, int txt); - -#if COMPILE_DL -DLEXPORT php3_module_entry *get_module(void) { return &hw_module_entry; } -#endif - -void _close_hw_link(hw_connection *conn) -{ - if(conn->hostname) - free(conn->hostname); - if(conn->username) - free(conn->username); - close(conn->socket); - free(conn); - HwSG(num_links)--; -} - -void _close_hw_plink(hw_connection *conn) -{ - 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(hw_document *doc) -{ - if(doc->data) - free(doc->data); - if(doc->attributes) - free(doc->attributes); - if(doc->bodytag) - free(doc->bodytag); - free(doc); -} - -#ifdef ZTS -static void php_hw_init_globals(php_hw_globals *hw_globals) -{ - HwSG(num_persistent) = 0; -} -#endif - -static PHP_INI_MH(OnHyperwavePort) { - HwSLS_FETCH(); - - 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, php_hw_globals, hw_globals) - PHP_INI_ENTRY("hyperwave.default_port", "418", PHP_INI_ALL, OnHyperwavePort) -PHP_INI_END() - -PHP_MINIT_FUNCTION(hw) { - -#ifdef ZTS - hw_globals_id = ts_allocate_id(sizeof(php_hw_globals), php_hw_init_globals, NULL); -#else - HwSG(num_persistent)=0; -#endif - REGISTER_INI_ENTRIES(); - HwSG(le_socketp) = register_list_destructors(_close_hw_link,NULL); - HwSG(le_psocketp) = register_list_destructors(NULL,_close_hw_plink); - HwSG(le_document) = register_list_destructors(_free_hw_document,NULL); - hw_module_entry.type = 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; -} - -/* 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; - - if (array_init(*return_value) == FAILURE) { - /* Ups, failed! Let's at least free the memory */ - for(i=0; i<count; i++) - efree(objrecs[i]); - efree(objrecs); - return -1; - } - - 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); - if (array_init(stat_arr) == FAILURE) { - return -1; - } - - 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((*return_value)->value.ht, &stat_arr, sizeof(zval), NULL); - - return 0; -} - -/* -** 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]; - int i, count; - 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); - } - - if (array_init(*return_value) == FAILURE) { - (*return_value)->type = IS_STRING; - (*return_value)->value.str.val = empty_string; - (*return_value)->value.str.len = 0; - return -1; - } - - /* 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 = 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(spec_arr->value.ht, attrname, strlen(attrname)+1, (void **) &dataptr) == FAILURE) { - add_assoc_string(*return_value, attrname, str, 1); - } else { - zval *newarr; - data = *dataptr; - spec = data->value.lval; - - if(zend_hash_find((*return_value)->value.ht, attrname, strlen(attrname)+1, (void **) &dataptr) == FAILURE) { - MAKE_STD_ZVAL(newarr); - array_init(newarr); - zend_hash_add((*return_value)->value.ht, 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 = strtok_r(NULL, "\n", &strtok_buf); - } - if(NULL == sarr){ -// spec_arr->refcount--; -// zend_hash_destroy(spec_arr->value.ht); -// efree(spec_arr->value.ht); - zval_dtor(spec_arr); - efree(spec_arr); - } - efree(temp); - - return(0); -} - -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); - - if (array_init(*return_value) == FAILURE) { - (*return_value)->type = IS_STRING; - (*return_value)->value.str.val = empty_string; - (*return_value)->value.str.len = 0; - return -1; - } - - /* Fill Array of titles, descriptions and keywords */ - temp = estrdup(objrec); - attrname = 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) && (array_init(title_arr) == FAILURE)) { - return -1; - } - hasTitle = 1; - str += 6; - iTitle = 1; - } else if(0 == strncmp(attrname, "Description=", 12)) { - if ((hasDescription == 0) && (array_init(desc_arr) == FAILURE)) { - return -1; - } - hasDescription = 1; - str += 12; - iDesc = 1; - } else if(0 == strncmp(attrname, "Keyword=", 8)) { - if ((hasKeyword == 0) && (array_init(keyword_arr) == FAILURE)) { - return -1; - } - hasKeyword = 1; - str += 8; - iKeyword = 1; - } else if(0 == strncmp(attrname, "Group=", 6)) { - if ((hasGroup == 0) && (array_init(group_arr) == FAILURE)) { - return -1; - } - 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 = strtok_r(NULL, "\n", &strtok_buf); - } - efree(temp); - - /* Add the title array, if we have one */ - if(hasTitle) { - zend_hash_update((*return_value)->value.ht, "Title", 6, &title_arr, sizeof(zval *), NULL); - - } else { - efree(title_arr); - } - - - if(hasDescription) { - /* Add the description array, if we have one */ - zend_hash_update((*return_value)->value.ht, "Description", 12, &desc_arr, sizeof(zval *), NULL); - - } else { - efree(desc_arr); - } - - if(hasKeyword) { - /* Add the keyword array, if we have one */ - zend_hash_update((*return_value)->value.ht, "Keyword", 8, &keyword_arr, sizeof(zval *), NULL); - - } else { - efree(keyword_arr); - } - - if(hasGroup) { - /* Add the Group array, if we have one */ - zend_hash_update((*return_value)->value.ht, "Group", 6, &group_arr, sizeof(zval *), NULL); - - } else { - efree(group_arr); - } - - /* All other attributes. Make a another copy first */ - temp = estrdup(objrec); - attrname = 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 = strtok_r(NULL, "\n", &strtok_buf); - } - efree(temp); - - return(0); -} - -#define BUFFERLEN 1024 -static char * make_objrec_from_array(HashTable *lht) { - int i, count, keytype; - ulong 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; - - zend_hash_internal_pointer_reset(lht); - objrec = malloc(1); - *objrec = '\0'; - for(i=0; i<count; i++) { - keytype = zend_hash_get_current_key(lht, &key, &length); -// if(HASH_KEY_IS_STRING == keytype) { - zend_hash_get_current_data(lht, (void **) &keydataptr); - keydata = *keydataptr; - switch(keydata->type) { - case IS_STRING: - if(HASH_KEY_IS_STRING == keytype) - snprintf(str, BUFFERLEN, "%s=%s\n", key, keydata->value.str.val); - else - snprintf(str, BUFFERLEN, "%s\n", keydata->value.str.val); - break; - case IS_LONG: - if(HASH_KEY_IS_STRING == keytype) - snprintf(str, BUFFERLEN, "%s=0x%lX\n", key, keydata->value.lval); - else - snprintf(str, BUFFERLEN, "0x%lX\n", keydata->value.lval); - break; - case IS_ARRAY: { - int i, len, keylen, count; - char *strarr, *ptr, *ptr1; - count = zend_hash_num_elements(keydata->value.ht); - if(count > 0) { - strarr = make_objrec_from_array(keydata->value.ht); - 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; - } - } - if(HASH_KEY_IS_STRING == keytype) efree(key); - objrec = realloc(objrec, strlen(objrec)+strlen(str)+1); - strcat(objrec, str); -// } - zend_hash_move_forward(lht); - } - return objrec; -} -#undef BUFFERLEN - -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((*keydata)->type) { - case IS_LONG: - objids[i] = (*keydata)->value.lval; - break; - default: - objids[i] = 0; - } - zend_hash_move_forward(lht); - } - return objids; -} - -#define BUFFERLEN 30 -static void php3_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) -{ - pval *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 = ARG_COUNT(ht); - switch(argc) { - case 2: - case 4: - if (getParametersArray(ht, argc, argv) == FAILURE) { - WRONG_PARAM_COUNT; - } - break; - default: - WRONG_PARAM_COUNT; - } - - /* Host: */ - convert_to_string(argv[0]); - host = (char *) estrndup(argv[0]->value.str.val,argv[0]->value.str.len); - - /* Port: */ - convert_to_long(argv[1]); - port = argv[1]->value.lval; - - /* Username and Password */ - if(argc > 2) { - /* Username */ - convert_to_string(argv[2]); - username = (char *) estrndup(argv[2]->value.str.val,argv[2]->value.str.len); - /* Password */ - convert_to_string(argv[3]); - password = (char *) estrndup(argv[3]->value.str.val,argv[3]->value.str.len); - } - - /* 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(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(plist, 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(E_ERROR,"Hyperwave: 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(E_ERROR,"Hyperwave: 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(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(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(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; - new_le.type = HwSG(le_psocketp); - - if (zend_hash_update(plist,hashed_details,hashed_details_length+1,(void *) &new_le, sizeof(list_entry), NULL)==FAILURE) { - php_error(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 (le->type != HwSG(le_psocketp)) { - RETURN_FALSE; - } - ptr = le->ptr; - } - - return_value->value.lval = php3_list_insert(ptr,HwSG(le_psocketp)); - return_value->type = IS_LONG; - - } 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(list,hashed_details,hashed_details_length+1,(void **) &index_ptr)==SUCCESS) { - int type,link; - void *ptr; - - if (index_ptr->type != le_index_ptr) { - RETURN_FALSE; - } - link = (int) index_ptr->ptr; - ptr = (hw_connection *) php3_list_find(link,&type); /* check if the link is still there */ - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - return_value->value.lval = HwSG(default_link) = link; - return_value->type = IS_LONG; - efree(hashed_details); - if(username) efree(username); - if(password) efree(password); - if(host) efree(host); - return; - } else { - zend_hash_del(list,hashed_details,hashed_details_length+1); - } - } - - if ( (sockfd = open_hg_connection(host, port)) < 0 ) { - php_error(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(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"); - - return_value->value.lval = php3_list_insert(ptr,HwSG(le_socketp)); - return_value->type = IS_LONG; - - new_index_ptr.ptr = (void *) return_value->value.lval; - new_index_ptr.type = le_index_ptr; - if (zend_hash_update(list,hashed_details,hashed_details_length+1,(void *) &new_index_ptr, sizeof(list_entry), NULL)==FAILURE) { - php_error(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)=return_value->value.lval; - - /* 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) -{ - php3_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) -{ - php3_hw_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,1); -} -/* }}} */ - -/* {{{ proto void hw_close(int link) - Close connection to Hyperwave server */ -PHP_FUNCTION(hw_close) { - pval *arg1; - int id, type; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - id=arg1->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - php3_list_delete(id); - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto void hw_info(int link) - Outputs info string */ -PHP_FUNCTION(hw_info) -{ - pval *arg1; - int id, type; - hw_connection *ptr; - char *str; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - id=arg1->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - if(NULL != (str = get_hw_info(ptr))) { - /* - php_printf("%s\n", str); - efree(str); - */ - return_value->value.str.len = strlen(str); - return_value->value.str.val = str; - return_value->type = IS_STRING; - return; - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto int hw_error(int link) - Returns last error number */ -PHP_FUNCTION(hw_error) -{ - pval *arg1; - int id, type; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - id=arg1->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - RETURN_LONG(ptr->lasterror); -} -/* }}} */ - -/* {{{ proto string hw_errormsg(int link) - Returns last error message */ -PHP_FUNCTION(hw_errormsg) -{ - pval *arg1; - int id, type; - hw_connection *ptr; - char errstr[100]; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - id=arg1->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - switch(ptr->lasterror) { - case 0: - sprintf(errstr, "No error"); - break; - case NOACCESS: - sprintf(errstr, "No access"); - 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 NOTREMOVED: - sprintf(errstr, "Attribute not removed"); - break; - case CHANGEBASEFLD: - sprintf(errstr, "Change of base-attribute"); - break; - case FLDEXISTS: - sprintf(errstr, "Attribute exists"); - break; - case NOLANGUAGE: - sprintf(errstr, "No or unknown language specified"); - 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) -{ - return_value->value.lval = 0; - return_value->type = IS_LONG; -} -/* }}} */ - -char *php3_hw_command(INTERNAL_FUNCTION_PARAMETERS, int comm) { - pval *arg1; - int link, type; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - return NULL; - } - convert_to_long(arg1); - link=arg1->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(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; - } -} - -/* {{{ proto string hw_stat(int link) - Returns status string */ -PHP_FUNCTION(hw_stat) { - char *object; - - object = php3_hw_command(INTERNAL_FUNCTION_PARAM_PASSTHRU, STAT_COMMAND); - if(object == NULL) - RETURN_FALSE; - - return_value->value.str.val = object; - return_value->value.str.len = strlen(object); - return_value->type = 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 = php3_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; - } - - if (array_init(return_value) == FAILURE) { - efree(object); - RETURN_FALSE; - } - - temp = estrdup(ptr); - attrname = strtok_r(temp, "\n", &strtok_buf); - i = 0; - while(attrname != NULL) { - char *name; - - user_arr = (zval *) emalloc(sizeof(zval)); - if (array_init(user_arr) == FAILURE) { - efree(object); - RETURN_FALSE; - } - - 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(return_value->value.ht, i++, &user_arr, sizeof(pval), NULL); - - attrname = strtok_r(NULL, "\n", &strtok_buf); - } - efree(temp); - efree(object); - -} -/* }}} */ - -/* {{{ proto string hw_dummy(int link, int id, int msgid) - ??? */ -PHP_FUNCTION(hw_dummy) { - pval *arg1, *arg2, *arg3; - int link, id, type, msgid; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - convert_to_long(arg3); - link=arg1->value.lval; - id=arg2->value.lval; - msgid=arg3->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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); - return_value->value.str.val = object; - return_value->value.str.len = strlen(object); - return_value->type = IS_STRING; - } -} -/* }}} */ - -/* {{{ proto string hw_getobject(int link, int objid) - Returns object record */ -PHP_FUNCTION(hw_getobject) { - pval *argv[3]; - int argc, link, id, type, multi; - hw_connection *ptr; - - argc = ARG_COUNT(ht); - if(argc < 2 || argc > 3) - WRONG_PARAM_COUNT; - if (getParametersArray(ht, argc, argv) == FAILURE) - WRONG_PARAM_COUNT; - - convert_to_long(argv[0]); - if(argv[1]->type == IS_ARRAY) { - multi = 1; - convert_to_array(argv[1]); - } else { - multi = 0; - convert_to_long(argv[1]); - } - - if(argc == 3) { - convert_to_string(argv[2]); - } - - link=argv[0]->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d", link); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if(multi) { - char **objects = NULL; - int count, *ids, i; - HashTable *lht; - zval **keydata; - - lht = argv[1]->value.ht; - 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((*keydata)->type) { - case IS_LONG: - ids[i] = (*keydata)->value.lval; - break; - default: - ids[i] = (*keydata)->value.lval; - } - zend_hash_move_forward(lht); - } - - if (0 != (ptr->lasterror = send_objectbyidquery(ptr->socket, ids, &count, argv[2]->value.str.val, &objects))) { - efree(ids); - RETURN_FALSE; - } - efree(ids); - if (array_init(return_value) == FAILURE) { - efree(objects); - RETURN_FALSE; - } - - for(i=0; i<count; i++) { - add_index_string(return_value, i, objects[i], 0); - } - efree(objects); - - } else { - char *object = NULL; - id=argv[1]->value.lval; - 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) { - pval *arg1, *arg2, *arg3; - int link, type; - char *objrec, *parms; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_string(arg2); - convert_to_string(arg3); - link=arg1->value.lval; - objrec=arg2->value.str.val; - parms=arg3->value.str.val; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - 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) { - pval *arg1, *arg2; - int link, id, type; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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) { - pval *arg1, *arg2; - int link, id, type; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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) { - pval *arg1, *arg2; - int link, id, type; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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) { - pval *arg1, *arg2, *arg3; - int link, id, type, i; - hw_connection *ptr; - char *modification, *oldobjrec, buf[BUFFERLEN]; - char *tmp; - HashTable *newobjarr; - - if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); /* Connection */ - convert_to_long(arg2); /* object ID */ - convert_to_array(arg3); /* Array with new attributes */ - link=arg1->value.lval; - id=arg2->value.lval; - newobjarr=arg3->value.ht; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - /* 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); - zend_hash_get_current_data(newobjarr, (void *) &dataptr); - data = *dataptr; - switch(data->type) { - case IS_STRING: - if(strlen(data->value.str.val) == 0) - snprintf(newattribute, BUFFERLEN, "rem %s", key); - else - snprintf(newattribute, BUFFERLEN, "add %s=%s", key, data->value.str.val); - 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 "); - } - } - efree(key); - 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) { - pval *argv[5]; - int argc; - int link, id, type, i, mode; - hw_connection *ptr; - char *modification; - HashTable *remobjarr, *addobjarr; - - argc = ARG_COUNT(ht); - if((argc > 5) || (argc < 4)) - WRONG_PARAM_COUNT; - - if (getParametersArray(ht, argc, argv) == FAILURE) - if(argc < 4) { - WRONG_PARAM_COUNT; - } - convert_to_long(argv[0]); /* Connection */ - convert_to_long(argv[1]); /* object ID */ - convert_to_array(argv[2]); /* Array with attributes to remove */ - convert_to_array(argv[3]); /* Array with attributes to add */ - if(argc == 5) { - convert_to_long(argv[4]); - mode = argv[4]->value.lval; - } else - mode = 0; - link=argv[0]->value.lval; - id=argv[1]->value.lval; - remobjarr=argv[2]->value.ht; - addobjarr=argv[3]->value.ht; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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); - zend_hash_get_current_data(addobjarr, (void *) &dataptr); - data = *dataptr; - switch(data->type) { - case IS_STRING: - if(strlen(data->value.str.val) > 0) { - snprintf(addattribute, BUFFERLEN, "add %s=%s", key, data->value.str.val); -/* 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(data->value.ht); - if(count > 0) { - strarr = make_objrec_from_array(data->value.ht); - 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); - } - efree(key); - 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); - zend_hash_get_current_data(remobjarr, (void *) &dataptr); - data = *dataptr; - switch(data->type) { - case IS_STRING: - if(strlen(data->value.str.val) > 0) { - snprintf(remattribute, BUFFERLEN, "rem %s=%s", key, data->value.str.val); - 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(data->value.ht); - if(count > 0) { - strarr = make_objrec_from_array(data->value.ht); - 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); - } - efree(key); - 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(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(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(E_WARNING,"hw_modifyobject: Mode must be 0 or 1 (recursive)"); - } - free(modification); - RETURN_TRUE; -} -#undef BUFFERLEN -/* }}} */ - -void php3_hw_mvcp(INTERNAL_FUNCTION_PARAMETERS, int mvcp) { - pval *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 (ARG_COUNT(ht) != 4 || getParameters(ht, 4, &arg1, &arg2, &arg3, &arg4) == FAILURE) - WRONG_PARAM_COUNT; - break; - case COPY: - if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) - WRONG_PARAM_COUNT; - break; - } - convert_to_long(arg1); - convert_to_array(arg2); - convert_to_long(arg3); - link=arg1->value.lval; - src_arr=arg2->value.ht; - switch(mvcp) { - case MOVE: /* Move also has fromID, which is arg3 --> arg4 becomes destID */ - convert_to_long(arg4); - from=arg3->value.lval; - dest=arg4->value.lval; - break; - case COPY: /* No fromID for Copy needed --> arg3 is destID */ - dest=arg3->value.lval; - from = 0; - break; - } - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - 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(keydata->type == IS_LONG) { - if(0 != (ptr->lasterror = send_getobject(ptr->socket, keydata->value.lval, &objrec))) { - efree(collIDs); - efree(docIDs); - RETURN_FALSE; - } - if(0 == fnAttributeCompare(objrec, "DocumentType", "collection")) - collIDs[collIDcount++] = keydata->value.lval; - else - docIDs[docIDcount++] = keydata->value.lval; - 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) { - php3_hw_mvcp(INTERNAL_FUNCTION_PARAM_PASSTHRU, MOVE); -} -/* }}} */ - -/* {{{ proto void hw_cp(int link, array objrec, int dest) - Copies object */ -PHP_FUNCTION(hw_cp) { - php3_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) { - pval *argv[3]; - int argc, link, id, type, mode; - int rootid = 0; - char *urlprefix; - hw_document *doc; - hw_connection *ptr; - - argc = ARG_COUNT(ht); - if((argc > 3) || (argc < 2)) - WRONG_PARAM_COUNT; - - if (getParametersArray(ht, argc, argv) == FAILURE) - RETURN_FALSE; - - convert_to_long(argv[0]); - convert_to_long(argv[1]); - mode = 0; - urlprefix = NULL; - if(argc == 3) { - switch(argv[2]->type) { - case IS_LONG: - convert_to_long(argv[2]); - rootid = argv[2]->value.lval; - mode = 1; - break; - case IS_STRING: - convert_to_string(argv[2]); - urlprefix = argv[2]->value.str.val; - break; - } - } - link=argv[0]->value.lval; - id=argv[1]->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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; - return_value->value.lval = php3_list_insert(doc,HwSG(le_document)); - return_value->type = IS_LONG; - } -} -/* }}} */ - -/* {{{ proto void hw_edittext(int link, hwdoc doc) - Modifies text document */ -PHP_FUNCTION(hw_edittext) { - pval *arg1, *arg2; - int link, doc, type; - hw_connection *ptr; - hw_document *docptr; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - ptr = php3_list_find(link,&type); - - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find socket identifier %d",link); - RETURN_FALSE; - } - - doc=arg2->value.lval; - docptr = php3_list_find(doc,&type); - - if(!docptr || (type!=HwSG(le_document))) { - php_error(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) { - pval *arg1, *arg2; - int link, id, type; - hw_document *doc; - hw_connection *ptr; - char cgi_env_str[BUFFERLEN]; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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. - */ -#if (WIN32|WINNT) - 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; - return_value->value.lval = php3_list_insert(doc,HwSG(le_document)); - return_value->type = IS_LONG; - } -} -#undef BUFFERLEN -/* }}} */ - -/* {{{ proto int hw_getremote(int link, int objid) - Returns the content of a remote document */ -PHP_FUNCTION(hw_getremote) { - pval *arg1, *arg2; - int link, id, type; - hw_document *doc; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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; - return_value->value.lval = php3_list_insert(doc,HwSG(le_document)); - return_value->type = 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) { - pval *arg1, *arg2; - int link, type, i; - hw_connection *ptr; - char *objrec; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_string(arg2); - link=arg1->value.lval; - objrec=arg2->value.str.val; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d", link); - RETURN_FALSE; - } - 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); - return_value->value.lval = php3_list_insert(doc,HwSG(le_document)); - return_value->type = IS_LONG; - } else { - if (array_init(return_value) == FAILURE) { - efree(offsets); - RETURN_FALSE; - } - - 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) { - pval *arg1, *arg2; - int link, type, rootid; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link = arg1->value.lval; - rootid = arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - ptr->linkroot = rootid; - RETURN_LONG(rootid); -} -/* }}} */ - -/* {{{ proto hwdoc hw_pipedocument(int link, int objid) - Returns document */ -PHP_FUNCTION(hw_pipedocument) { - pval *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 = ARG_COUNT(ht); - if((argc > 2) || (argc < 2)) - WRONG_PARAM_COUNT; - - if (getParametersArray(ht, argc, argv) == FAILURE) - RETURN_FALSE; - - convert_to_long(argv[0]); - convert_to_long(argv[1]); -/* if(argc == 3) { - convert_to_long(argv[2]); - rootid = argv[2]->value.lval; - if(rootid != 0) - mode = 1; - } -*/ link=argv[0]->value.lval; - id=argv[1]->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d", link); - RETURN_FALSE; - } - - 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); */ - return_value->value.lval = php3_list_insert(doc,HwSG(le_document)); - return_value->type = 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) { - pval *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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - { - char *object = NULL; - char *attributes = NULL; - int count; - -#if (WIN32|WINNT) - 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; - return_value->value.lval = php3_list_insert(doc,HwSG(le_document)); - return_value->type = IS_LONG; - } -} -#undef BUFFERLEN -/* }}} */ - -/* {{{ proto void hw_insertdocument(int link, int parentid, hwdoc doc) - Insert new document */ -PHP_FUNCTION(hw_insertdocument) { - pval *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 (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - convert_to_long(arg3); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find connection identifier %d",link); - RETURN_FALSE; - } - - doc=arg3->value.lval; - docptr = php3_list_find(doc,&type); - if(!docptr || (type!=HwSG(le_document))) { - php_error(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) { - pval *arg1, *arg2, *arg3; - char *ptr; - hw_document *doc; - - if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_string(arg1); - convert_to_string(arg2); - convert_to_long(arg3); - - doc = malloc(sizeof(hw_document)); - if(NULL == doc) - RETURN_FALSE; - doc->data = malloc(arg3->value.lval+1); - if(NULL == doc->data) { - free(doc); - RETURN_FALSE; - } - memcpy(doc->data, arg2->value.str.val, arg3->value.lval); - ptr = doc->data; - ptr[arg3->value.lval] = '\0'; - doc->attributes = strdup(arg1->value.str.val); - doc->bodytag = NULL; - doc->size = arg3->value.lval; - return_value->value.lval = php3_list_insert(doc,HwSG(le_document)); - return_value->type = IS_LONG; -} -/* }}} */ - -/* {{{ proto void hw_free_document(hwdoc doc) - Frees memory of document */ -PHP_FUNCTION(hw_free_document) { - pval *arg1; - int id, type; - hw_document *ptr; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - id=arg1->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_document))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - php3_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) { - pval *arg1; - int id, type; - hw_document *ptr; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - id=arg1->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_document))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - php3_header(); - php3_write(ptr->data, ptr->size); - - 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) { - pval *argv[2]; - int id, type, argc; - hw_document *ptr; - char *temp, *str = NULL; - - argc = ARG_COUNT(ht); - if((argc > 2) || (argc < 1)) - WRONG_PARAM_COUNT; - - if (getParametersArray(ht, argc, argv) == FAILURE) - RETURN_FALSE; - - convert_to_long(argv[0]); - id=argv[0]->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_document))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - if(argc == 2) { - convert_to_string(argv[1]); - str=argv[1]->value.str.val; - } - - if(str != NULL) { - temp = emalloc(argv[1]->value.str.len + strlen(ptr->bodytag) + 2); - strcpy(temp, ptr->bodytag); - strcpy(temp+strlen(ptr->bodytag)-1, str); - strcpy(temp+strlen(ptr->bodytag)-1+argv[1]->value.str.len, ">\n"); - RETURN_STRING(temp, 0); - } else { - RETURN_STRING(ptr->bodytag, 1); - } -} -/* }}} */ - -/* {{{ proto string hw_document_content(hwdoc doc) - Returns content of document */ -PHP_FUNCTION(hw_document_content) { - pval *argv[1]; - int id, type, argc; - hw_document *ptr; - - argc = ARG_COUNT(ht); - if(argc != 1) - WRONG_PARAM_COUNT; - - if (getParametersArray(ht, argc, argv) == FAILURE) - RETURN_FALSE; - - convert_to_long(argv[0]); - id=argv[0]->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_document))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - RETURN_STRING(ptr->data, 1); -} -/* }}} */ - -/* {{{ proto int hw_document_setcontent(hwdoc doc, string content) - Sets/replaces content of document */ -PHP_FUNCTION(hw_document_setcontent) { - pval *argv[2]; - int id, type, argc; - hw_document *ptr; - char *str; - - argc = ARG_COUNT(ht); - if(argc != 2) - WRONG_PARAM_COUNT; - - if (getParametersArray(ht, argc, argv) == FAILURE) - RETURN_FALSE; - - convert_to_long(argv[0]); - convert_to_string(argv[1]); - id=argv[0]->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_document))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - str = ptr->data; - if(NULL != (ptr->data = strdup(argv[1]->value.str.val))) { - 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) { - pval *arg1; - int id, type; - hw_document *ptr; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - id=arg1->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_document))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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) { - pval *arg1; - int id, type; - hw_document *ptr; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - id=arg1->value.lval; - ptr = php3_list_find(id,&type); - if(!ptr || (type!=HwSG(le_document))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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) { - pval *arg1, *arg2; - int link, id, type; - int count; - char **childObjRecs = NULL; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - - if (0 != (ptr->lasterror = send_getparentsobj(ptr->socket, id, &childObjRecs, &count))) { - php_error(E_WARNING, "send_command (getparentsobj) 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) { - pval *arg1, *arg2; - int link, id, type; - int count; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - { - int *childIDs = NULL; - int i; - - if (0 != (ptr->lasterror = send_getparents(ptr->socket, id, &childIDs, &count))) { - php_error(E_WARNING, "send_command (getparents) returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - if (array_init(return_value) == FAILURE) { - efree(childIDs); - RETURN_FALSE; - } - - 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) { - pval *arg1, *arg2; - int link, id, type; - int count; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - { - int *childIDs = NULL; - int i; - - if (0 != (ptr->lasterror = send_children(ptr->socket, id, &childIDs, &count))){ - php_error(E_WARNING, "send_command (getchildcoll) returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - if (array_init(return_value) == FAILURE) { - efree(childIDs); - RETURN_FALSE; - } - - 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - - if (0 != (ptr->lasterror = send_childrenobj(ptr->socket, id, &childObjRecs, &count))) { - php_error(E_WARNING, "send_command (getchildcollobj) 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - { - int *childIDs = NULL; - int i; - - if (0 != (ptr->lasterror = send_getchildcoll(ptr->socket, id, &childIDs, &count))){ - php_error(E_WARNING, "send_command (getchildcoll) returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - if (array_init(return_value) == FAILURE) { - efree(childIDs); - RETURN_FALSE; - } - - 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - - if (0 != (ptr->lasterror = send_getchildcollobj(ptr->socket, id, &childObjRecs, &count))) { - php_error(E_WARNING, "send_command (getchildcollobj) 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - 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 (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_string(arg2); - convert_to_long(arg3); - link=arg1->value.lval; - query=arg2->value.str.val; - maxhits=arg3->value.lval; - if (maxhits < 0) maxhits=0x7FFFFFFF; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyquery(ptr->socket, query, maxhits, &childIDs, &count))) { - php_error(E_WARNING, "send_command (getobjectbyquery) returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - if (array_init(return_value) == FAILURE) { - efree(childIDs); - RETURN_FALSE; - } - - 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 (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_string(arg2); - convert_to_long(arg3); - link=arg1->value.lval; - query=arg2->value.str.val; - maxhits=arg3->value.lval; - if (maxhits < 0) maxhits=0x7FFFFFFF; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyqueryobj(ptr->socket, query, maxhits, &childObjRecs, &count))) { - php_error(E_WARNING, "send_command (getobjectbyqueryobj) 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 (ARG_COUNT(ht) != 4 || getParameters(ht, 4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - convert_to_string(arg3); - convert_to_long(arg4); - link=arg1->value.lval; - id=arg2->value.lval; - query=arg3->value.str.val; - maxhits=arg4->value.lval; - if (maxhits < 0) maxhits=0x7FFFFFFF; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyquerycoll(ptr->socket, id, query, maxhits, &childIDs, &count))) { - php_error(E_WARNING, "send_command (getobjectbyquerycoll) returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - if (array_init(return_value) == FAILURE) { - efree(childIDs); - RETURN_FALSE; - } - - 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 (ARG_COUNT(ht) != 4 || getParameters(ht, 4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - convert_to_string(arg3); - convert_to_long(arg4); - link=arg1->value.lval; - id=arg2->value.lval; - query=arg3->value.str.val; - maxhits=arg4->value.lval; - if (maxhits < 0) maxhits=0x7FFFFFFF; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyquerycollobj(ptr->socket, id, query, maxhits, &childObjRecs, &count))) { - php_error(E_WARNING, "send_command (getobjectbyquerycollobj) 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getchilddoccoll(ptr->socket, id, &childIDs, &count))) { - php_error(E_WARNING, "send_command (getchilddoccoll) returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - if (array_init(return_value) == FAILURE) { - efree(childIDs); - RETURN_FALSE; - } - - 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getchilddoccollobj(ptr->socket, id, &childObjRecs, &count))) { - php_error(E_WARNING, "send_command (getchilddoccollobj) 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getanchors(ptr->socket, id, &anchorIDs, &count))) { - php_error(E_WARNING, "send_command (getanchors) returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - if (array_init(return_value) == FAILURE) { - efree(anchorIDs); - RETURN_FALSE; - } - - 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = (hw_connection *) php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",id); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getanchorsobj(ptr->socket, id, &anchorObjRecs, &count))) { - php_error(E_WARNING, "send_command (getanchors) 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 (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - link = arg1->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - return_value->value.str.val = estrdup(ptr->username); - return_value->value.str.len = strlen(ptr->username); - return_value->type = 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 (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_string(arg2); - convert_to_string(arg3); - link = arg1->value.lval; - name=arg2->value.str.val; - passwd=arg3->value.str.val; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - { - char *str; - - if (0 != (ptr->lasterror = send_identify(ptr->socket, name, passwd, &userdata))) { - php_error(E_WARNING, "send_identify returned %d\n", ptr->lasterror); - if(ptr->username) free(ptr->username); - ptr->username = NULL; - RETURN_FALSE; - } - - return_value->value.str.val = userdata; - return_value->value.str.len = strlen(userdata); - return_value->type = 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) - Returns object array of object record*/ -PHP_FUNCTION(hw_objrec2array) { - zval *arg1, *arg2; - - switch(ARG_COUNT(ht)) { - case 1: - if(getParameters(ht, 1, &arg1) == FAILURE) - WRONG_PARAM_COUNT; - arg2 = NULL; - break; - case 2: - if(getParameters(ht, 2, &arg1, &arg2) == FAILURE) - WRONG_PARAM_COUNT; - convert_to_array(arg2); - break; - default: - WRONG_PARAM_COUNT; - } - convert_to_string(arg1); - make2_return_array_from_objrec(&return_value, arg1->value.str.val, arg2); -} -/* }}} */ - -/* {{{ proto string hw_array2objrec(array objarr) - Returns object record of object array */ -PHP_FUNCTION(hw_array2objrec) { - pval *arg1; - char *objrec, *retobj; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_array(arg1); - objrec = make_objrec_from_array(arg1->value.ht); - 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 (ARG_COUNT(ht) != 4 || getParameters(ht, 4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_array(arg2); - convert_to_array(arg3); - convert_to_long(arg4); - link = arg1->value.lval; - retcoll=arg4->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - cobjids = zend_hash_num_elements(arg2->value.ht); - if(NULL == (objectIDs = make_ints_from_array(arg2->value.ht))) { - php_error(E_WARNING, "Could not create Int Array from Array\n"); - RETURN_FALSE; - } - - ccollids = zend_hash_num_elements(arg3->value.ht); - if(NULL == (collIDs = make_ints_from_array(arg3->value.ht))) { - php_error(E_WARNING, "Could not create Int Array from Array\n"); - 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); - - if (array_init(return_value) == FAILURE) { - efree(retIDs); - RETURN_FALSE; - } - - 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 (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - convert_to_array(arg3); - link = arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - if(NULL == (objrec = make_objrec_from_array(arg3->value.ht))) { - php_error(E_WARNING, "Could not create Object Record from Array\n"); - 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) { - pval *argv[4]; - char *objrec, *text; - int id, newid, type, link, argc; - hw_connection *ptr; - - argc = ARG_COUNT(ht); - if((argc < 3) || (argc > 4)) - WRONG_PARAM_COUNT; - - if (getParametersArray(ht, argc, argv) == FAILURE) - WRONG_PARAM_COUNT; - - convert_to_long(argv[0]); - convert_to_long(argv[1]); - convert_to_string(argv[2]); - if(argc == 4) { - convert_to_string(argv[3]); - text = argv[3]->value.str.val; - } else { - text = NULL; - } - link = argv[0]->value.lval; - id = argv[1]->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - objrec = argv[2]->value.str.val; - 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 (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - link=arg1->value.lval; - id=arg2->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getsrcbydest(ptr->socket, id, &childObjRecs, &count))) { - php_error(E_WARNING, "send_command (getsrcbydest) 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_mapid(int link, int serverid, int destid) - Returns virtual object id of document on remote hw server */ -PHP_FUNCTION(hw_mapid) { - pval *arg1, *arg2, *arg3; - int link, type, servid, id, virtid; - hw_connection *ptr; - - if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - convert_to_long(arg3); - link=arg1->value.lval; - servid=arg2->value.lval; - id=arg3->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php3_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_mapid(ptr->socket, servid, id, &virtid))) { - php3_error(E_WARNING, "send_command (mapid) returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - RETURN_LONG(virtid); -} -/* }}} */ - -/* {{{ proto string hw_getrellink(int link, int rootid, int sourceid, int destid) - Get link form 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 (ARG_COUNT(ht) != 4 || getParameters(ht, 4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - convert_to_long(arg2); - convert_to_long(arg3); - convert_to_long(arg4); - link=arg1->value.lval; - rootid=arg2->value.lval; - sourceid=arg3->value.lval; - destid=arg4->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = getrellink(ptr->socket, rootid, sourceid, destid, &anchorstr))) { - php_error(E_WARNING, "command (getrellink) returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - RETURN_STRING(anchorstr, 0); -} -/* }}} */ - - -PHP_MINFO_FUNCTION(hw) -{ - php_printf("HG-CSP Version: 7.17<BR>\n"); - 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 (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long(arg1); - link=arg1->value.lval; - ptr = php3_list_find(link,&type); - if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) { - php_error(E_WARNING,"Unable to find file identifier %d",link); - RETURN_FALSE; - } - - 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: - */ |