Browse Source

- Some more comments

- Initial support to just include anchors into documents
PHP-4.0.5
Uwe Steinmann 25 years ago
parent
commit
eaad937f84
  1. 22
      ext/hyperwave/hg_comm.c
  2. 67
      ext/hyperwave/hw.c
  3. 1
      ext/hyperwave/php_hyperwave.h

22
ext/hyperwave/hg_comm.c

@ -326,12 +326,17 @@ int fnCmpAnchors(ANCHOR *a1, ANCHOR *a2)
/***********************************************************************
* Function fnCreateAnchorList() *
* Uses either docofanchorrec or reldestrec to create a list of anchors *
* depending on anchormode *
* *
* Returns a list of Anchors converted from an object record *
* Parameter: int objectID: the object for which the list is created *
* char **anchors: object records of anchors *
* char **dest: object records of destinations *
* char **docofanchorrec: Name of destination absolut *
* char **reldestrec: Name of destination relativ to current *
* object *
* int ancount: number of anchors *
* int anchormode: 0 = use absolut dest, else rel. dest *
* Return: List of Anchors, NULL if error *
***********************************************************************/
#ifdef newlist
@ -2112,6 +2117,7 @@ int send_gettext(int sockfd, hw_objectID objectID, int mode, int rootid, char **
DLIST *pAnchorList;
#endif
/* Get dest as relative and absolut path */
send_getdestforanchorsobj(sockfd, anchors, &destrec, ancount);
send_getreldestforanchorsobj(sockfd, anchors, &reldestrec, ancount, rootid, objectID);
pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode);
@ -3366,11 +3372,17 @@ int send_getdestforanchorsobj(int sockfd, char **anchorrec, char ***destrec, int
/* Now get for each anchor the object record of its destination */
for(i=0; i<count; i++) {
/* if you retrieve the anchors you sometimes get more than actually accessible.
This happens for the object 0x29a9c. */
*/
if((NULL != anchorrec[i]) && (NULL != (str = fnAttributeValue(anchorrec[i], "Dest")))) {
sscanf(str, "0x%x", &objectID);
efree(str);
/* Using send_docbyanchorobj() makes sense because the Destination can
be both, an anchor or a document. If it is a document you get the
objectrecord of that document. If it is an anchor the function
graps the document which belongs to the anchor
and you get also the objectrecord of that document.
*/
if(0 > send_docbyanchorobj(sockfd, objectID, &objptr)) {
efree(destptr);
return -1;
@ -3412,6 +3424,7 @@ int send_getreldestforanchorsobj(int sockfd, char **anchorrec, char ***reldestre
sscanf(str, "0x%x", &destobjectID);
efree(str);
/* See note in send_getdestforanchorsobj() at same position in source code */
if(0 > send_docbyanchorobj(sockfd, destobjectID, &docofanchorptr)) {
efree(reldestptr);
return -1;
@ -4964,8 +4977,8 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
efree(retmsg);
/* passively open the data connection. The HG server is probably
already waiting for us.
*/
already waiting for us.
*/
len = sizeof(serv_addr);
if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) {
/* php_printf("client: can't open data connection to server\n"); */
@ -5016,6 +5029,7 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
DLIST *pAnchorList = NULL;
#endif
/* Get dest as relative and absolut path */
send_getdestforanchorsobj(sockfd, anchors, &destrec, ancount);
send_getreldestforanchorsobj(sockfd, anchors, &reldestrec, ancount, rootid, objectID);
pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode);

67
ext/hyperwave/hw.c

@ -108,6 +108,7 @@ function_entry hw_functions[] = {
PHP_FE(hw_insertobject, NULL)
PHP_FE(hw_insdoc, NULL)
PHP_FE(hw_getsrcbydestobj, NULL)
PHP_FE(hw_insertanchors, NULL)
PHP_FE(hw_getrellink, NULL)
PHP_FE(hw_who, NULL)
PHP_FE(hw_stat, NULL)
@ -633,6 +634,28 @@ static int * make_ints_from_array(HashTable *lht) {
return objids;
}
static char **make_strs_from_array(HashTable *arrht) {
char **carr = NULL;
zval *data, **dataptr;
zend_hash_internal_pointer_reset(arrht);
if(NULL == (carr = emalloc(zend_hash_num_elements(arrht) * sizeof(char *))))
return(NULL);
/* Iterate through hash */
while(zend_hash_get_current_data(arrht, (void **) &dataptr) == SUCCESS) {
data = *dataptr;
switch(data->type) {
case IS_STRING:
*carr++ = estrdup(data->value.str.val);
break;
}
zend_hash_move_forward(arrht);
}
return(carr);
}
#define BUFFERLEN 30
static void php_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
{
@ -3831,6 +3854,50 @@ PHP_FUNCTION(hw_getrellink) {
}
/* }}} */
/* {{{ proto string hw_insertanchors(int hwdoc, array anchorecs, array dest)
Inserts only anchors into text */
PHP_FUNCTION(hw_insertanchors) {
pval **arg1, **arg2, **arg3, **arg4;
hw_document *hwdoc;
int type, docid, error;
char *anchorstr;
char **anchorrecs;
char **dest;
HashTable *arrht;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long_ex(arg1);
convert_to_array_ex(arg2);
convert_to_array_ex(arg3);
docid=(*arg1)->value.lval;
hwdoc = zend_list_find(docid, &type);
if(!hwdoc || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
if(zend_hash_num_elements((*arg2)->value.ht) != zend_hash_num_elements((*arg3)->value.ht)) {
php_error(E_WARNING,"Unequal number of elments in arrays");
RETURN_FALSE;
}
/* Turn PHP-Array of strings into C-Array of strings */
arrht = (*arg2)->value.ht;
anchorrecs = make_strs_from_array(arrht);
arrht = (*arg3)->value.ht;
dest = make_strs_from_array(arrht);
/*
if (0 != (error = insertanchors(hwdoc->data, anchorrecs, dest, zend_hash_num_elements(arrht)))) {
php_error(E_WARNING, "command (insertanchors) returned %d\n", error);
RETURN_FALSE;
}
*/
RETURN_STRING(anchorstr, 0);
}
/* }}} */
PHP_MINFO_FUNCTION(hw)
{

1
ext/hyperwave/php_hyperwave.h

@ -142,6 +142,7 @@ PHP_FUNCTION(hw_objrec2array);
PHP_FUNCTION(hw_array2objrec);
PHP_FUNCTION(hw_connection_info);
PHP_FUNCTION(hw_getsrcbydestobj);
PHP_FUNCTION(hw_insertanchors);
PHP_FUNCTION(hw_getrellink);
PHP_FUNCTION(hw_dummy);
PHP_FUNCTION(hw_who);

Loading…
Cancel
Save