costin      2003/02/28 21:49:58

  Modified:    jk/native2/common jk_channel_socket.c jk_endpoint.c jk_env.c
                        jk_map.c jk_uriEnv.c jk_worker_ajp13.c
                        jk_worker_lb.c jk_worker_status.c
               jk/native2/include jk_env.h jk_map.h
  Log:
  Added more getters and setters.
  
  A bit of refactoring for common methods ( the itoa and map concat ).
  
  The really interesting one is adding getters and setters to the endpoint ( to 
abstract
  the info from scoreboard ), I'm working on it.
  
  I split the status page in 4 - the config info doesn't change, there is no
  need to display it all the time, and the scoreboard page can grow and is the
  really interesting one from performance perspective.
  
  Revision  Changes    Path
  1.49      +19 -5     jakarta-tomcat-connectors/jk/native2/common/jk_channel_socket.c
  
  Index: jk_channel_socket.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel_socket.c,v
  retrieving revision 1.48
  retrieving revision 1.49
  diff -u -r1.48 -r1.49
  --- jk_channel_socket.c       28 Feb 2003 05:05:03 -0000      1.48
  +++ jk_channel_socket.c       1 Mar 2003 05:49:58 -0000       1.49
  @@ -113,10 +113,10 @@
   static int JK_METHOD jk2_channel_socket_close(jk_env_t *env, jk_channel_t *ch,
                                                jk_endpoint_t *endpoint);
   
  -static char *jk2_channel_socket_multiValueInfo[]={"group", NULL };
  -static char *jk2_channel_socket_getAttributeInfo[]={"name", NULL };
  -static char *jk2_channel_socket_setAttributeInfo[]={"host", "port", "route", 
"lb_factor",
  -                                                    "level", NULL };
  +static char *jk2_channel_socket_getAttributeInfo[]={"host", "port", "keepalive", 
"timeout", "nodelay",
  +                                                    "debug", "disabled", NULL };
  +static char *jk2_channel_socket_setAttributeInfo[]={"host", "port", "keepalive", 
"timeout", "nodelay",
  +                                                    "debug", "disabled", NULL };
   
   static int JK_METHOD jk2_channel_socket_setAttribute(jk_env_t *env,
                                              jk_bean_t *mbean,
  @@ -152,6 +152,20 @@
       
       if( strcmp( name, "name" )==0 ) {
           return  bean->name;
  +    } else if( strcmp( "host", name ) == 0 ) {
  +        return socketInfo->host;
  +    } else if( strcmp( "port", name ) == 0 ) {
  +        return jk2_env_itoa( env, socketInfo->port );
  +    } else if( strcmp( "nodelay", name ) == 0 ) {
  +        return jk2_env_itoa( env, socketInfo->ndelay );
  +    } else if( strcmp( "keepalive", name ) == 0 ) {
  +        return jk2_env_itoa( env, socketInfo->keepalive );
  +    } else if( strcmp( "timeout", name ) == 0 ) {
  +        return jk2_env_itoa( env, socketInfo->timeout );
  +    } else if( strcmp( "debug", name ) == 0 ) {
  +        return jk2_env_itoa( env, ch->mbean->debug );
  +    } else if( strcmp( "disabled", name ) == 0 ) {
  +        return jk2_env_itoa( env, ch->mbean->disabled );
       }
       return NULL;
   }
  @@ -670,7 +684,7 @@
       result->init= jk2_channel_socket_init; 
   
       result->getAttributeInfo=jk2_channel_socket_getAttributeInfo;
  -    result->multiValueInfo=jk2_channel_socket_multiValueInfo;
  +    result->multiValueInfo=NULL;
       result->setAttributeInfo=jk2_channel_socket_setAttributeInfo;
       
       result->object= ch;
  
  
  
  1.23      +20 -1     jakarta-tomcat-connectors/jk/native2/common/jk_endpoint.c
  
  Index: jk_endpoint.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_endpoint.c,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- jk_endpoint.c     4 Feb 2003 07:39:59 -0000       1.22
  +++ jk_endpoint.c     1 Mar 2003 05:49:58 -0000       1.23
  @@ -126,9 +126,26 @@
        return JK_OK;
   }
   
  +static char *getAttInfo[]={ "id", NULL };
  +    
  +static void * JK_METHOD jk2_endpoint_getAttribute(jk_env_t *env, jk_bean_t *bean,
  +                                                  char *name )
  +{
  +    jk_endpoint_t *ep=(jk_endpoint_t *)bean->object;
  +    
  +    if( strcmp( name, "id" )==0 ) {
  +        return  "1";
  +    } else if (strcmp("inheritGlobals", name) == 0) {
  +        return "";
  +    }
  +    return NULL;
  +}
  +
  +
  +
   int JK_METHOD
   jk2_endpoint_factory( jk_env_t *env, jk_pool_t *pool,
  -                          jk_bean_t *result,
  +                      jk_bean_t *result,
                         const char *type, const char *name)
   {
       jk_endpoint_t *e = (jk_endpoint_t *)pool->calloc(env, pool,
  @@ -162,6 +179,8 @@
       epId=atoi( result->localName );
       
       result->object = e;
  +    result->getAttributeInfo=getAttInfo;
  +    result->getAttribute=jk2_endpoint_getAttribute;
       e->mbean=result;
   
       e->workerEnv=env->getByName( env, "workerEnv" );
  
  
  
  1.39      +9 -0      jakarta-tomcat-connectors/jk/native2/common/jk_env.c
  
  Index: jk_env.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_env.c,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- jk_env.c  4 Feb 2003 07:39:59 -0000       1.38
  +++ jk_env.c  1 Mar 2003 05:49:58 -0000       1.39
  @@ -478,6 +478,15 @@
       env->lastException=NULL;
   }
   
  +/* -------------------- Util -------------------- */
  +
  +/* It should be in some util class */
  +
  +char * JK_METHOD jk2_env_itoa( jk_env_t *env, int i ) {
  +    char *buf=env->tmpPool->calloc( env, env->tmpPool, 20 );
  +    sprintf( buf, "%d", i );
  +    return buf;
  +}
   
   /* -------------------- Init method -------------------- */
   
  
  
  
  1.25      +26 -2     jakarta-tomcat-connectors/jk/native2/common/jk_map.c
  
  Index: jk_map.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_map.c,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- jk_map.c  4 Feb 2003 07:39:58 -0000       1.24
  +++ jk_map.c  1 Mar 2003 05:49:58 -0000       1.25
  @@ -333,6 +333,31 @@
       return JK_OK;
   }
                                  
  +char * jk2_map_concatKeys( jk_env_t *env, jk_map_t *map, char *delim )
  +{
  +    int i;
  +    char *buf;
  +    int len=0;
  +    int delimLen=strlen( delim );
  +    
  +    int sz=map->size( env, map );
  +    for( i=0; i<sz; i++ ) {
  +        if( map->keys[i] != NULL ) {
  +            len+=strlen( map->keys[i] );
  +            len++;
  +        }
  +    }
  +    buf=env->tmpPool->calloc( env, env->tmpPool, len + 10 );
  +    len=0;
  +    for( i=0; i<sz; i++ ) {
  +        if( map->keys[i] != NULL ) {
  +            sprintf( buf + len, "%s%s", delim, map->keys[i] );
  +            len += strlen( map->keys[i] ) + delimLen;
  +        }
  +    }
  +    buf[len]='\0';
  +    return buf;
  +}
   
   
   /* ==================== */
  @@ -376,7 +401,6 @@
       _this->valueAt=jk2_map_default_valueAt;
       _this->init=jk2_map_default_init;
       _this->clear=jk2_map_default_clear;
  -    
   
       return JK_OK;
   }
  
  
  
  1.43      +24 -4     jakarta-tomcat-connectors/jk/native2/common/jk_uriEnv.c
  
  Index: jk_uriEnv.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_uriEnv.c,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- jk_uriEnv.c       4 Feb 2003 07:39:58 -0000       1.42
  +++ jk_uriEnv.c       1 Mar 2003 05:49:58 -0000       1.43
  @@ -167,7 +167,11 @@
       return JK_OK;
   }
   
  -
  +static char *getAttInfo[]={ "host", "uri", "group", "context", "inheritGlobals", 
"match_type", "prefix", "suffix",
  +                            "servlet", "timing", "aliases", "path", NULL };
  +static char *setAttInfo[]={ "host", "uri", "group", "context", "inheritGlobals",
  +                            "servlet", "timing", "alias", "path", NULL };
  +    
   static void * JK_METHOD jk2_uriEnv_getAttribute(jk_env_t *env, jk_bean_t *bean,
                                        char *name )
   {
  @@ -181,10 +185,27 @@
           return uriEnv->workerName;
       } else if( strcmp( name, "context" )==0 ) {
           return uriEnv->contextPath;
  +    } else if( strcmp( name, "servlet" )==0 ) {
  +        return uriEnv->servlet;
  +    } else if( strcmp( name, "prefix" )==0 ) {
  +        return uriEnv->prefix;
  +    } else if( strcmp( name, "suffix" )==0 ) {
  +        return uriEnv->suffix;
  +    } else if( strcmp( name, "match_type" )==0 ) {
  +        return jk2_env_itoa(env, uriEnv->match_type);
  +    } else if (strcmp("timing", name) == 0) {
  +        return jk2_env_itoa(env, uriEnv->timing);
  +    } else if (strcmp("aliases", name) == 0) {
  +        return jk2_map_concatKeys( env, uriEnv->aliases, ":" );
  +    } else if (strcmp("path", name) == 0) {
  +        return uriEnv->uri;
  +    } else if (strcmp("inheritGlobals", name) == 0) {
  +        return jk2_env_itoa(env,uriEnv->inherit_globals);
       }
       return NULL;
   }
   
  +
   static int JK_METHOD jk2_uriEnv_setAttribute(jk_env_t *env,
                                     jk_bean_t *mbean,
                                     char *nameParam,
  @@ -449,8 +470,6 @@
       return JK_OK;
   }
   
  -static char *myAttInfo[]={ "host", "uri", "group", "context", NULL };
  -    
   int JK_METHOD jk2_uriEnv_factory(jk_env_t *env, jk_pool_t *pool,
                                    jk_bean_t *result,
                                    const char *type, const char *name)
  @@ -474,7 +493,8 @@
       result->getAttribute = jk2_uriEnv_getAttribute;
       uriEnv->mbean = result;
       result->object = uriEnv;
  -    result->getAttributeInfo = myAttInfo;
  +    result->getAttributeInfo = getAttInfo;
  +    result->getAttributeInfo = setAttInfo;
   
       uriEnv->name = result->localName;
       if (jk2_uriEnv_parseName(env, uriEnv, result->localName) != JK_OK) {
  
  
  
  1.44      +22 -25    jakarta-tomcat-connectors/jk/native2/common/jk_worker_ajp13.c
  
  Index: jk_worker_ajp13.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_ajp13.c,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- jk_worker_ajp13.c 4 Feb 2003 07:39:58 -0000       1.43
  +++ jk_worker_ajp13.c 1 Mar 2003 05:49:58 -0000       1.44
  @@ -82,54 +82,46 @@
   #define AJP13_DEF_PORT  (8009)
   
   /* -------------------- Impl -------------------- */
  -static char *jk2_worker_ajp13_getAttributeInfo[]={ "lb_factor", "lb_value", 
  -                                                   "route", "errorState", 
"graceful",
  +static char *jk2_worker_ajp13_getAttributeInfo[]={ "lb_factor", "lb_value", 
"debug", "channel", "level",
  +                                                   "route", "errorState", 
"graceful", "groups",
                                                      "epCount", "errorTime", NULL };
   
   static char *jk2_worker_ajp13_multiValueInfo[]={"group", NULL };
   
  -static char *jk2_worker_ajp13_setAttributeInfo[]={"debug", "channel", "route",
  +static char *jk2_worker_ajp13_setAttributeInfo[]={"debug", "channel", "route", 
"secretkey", "group", "graceful",
                                                     "lb_factor", "level", NULL };
   
   
   static void * JK_METHOD jk2_worker_ajp13_getAttribute(jk_env_t *env, jk_bean_t 
*bean, char *name ) {
       jk_worker_t *worker=(jk_worker_t *)bean->object;
       
  -    if( strcmp( name, "channelName" )==0 ) {
  +    if( strcmp( name, "channelName" )==0 ||
  +        strcmp( name, "channel" )==0   ) {
           if( worker->channel != NULL )
               return worker->channel->mbean->name;
           else
               return worker->channelName;
       } else if (strcmp( name, "route" )==0 ) {
           return worker->route;
  +    } else if (strcmp( name, "debug" )==0 ) {
  +        return jk2_env_itoa( env,  bean->debug );
  +    } else if (strcmp( name, "groups" )==0 ) {
  +        return jk2_map_concatKeys( env, worker->groups, ":" );
  +    } else if (strcmp( name, "level" )==0 ) {
  +        return jk2_env_itoa( env,  worker->level );
       } else if (strcmp( name, "errorTime" )==0 ) {
  -        char *buf=env->tmpPool->calloc( env, env->tmpPool, 20 );
  -        sprintf( buf, "%d", worker->error_time );
  -        return buf;
  +        return jk2_env_itoa( env, worker->error_time );
       } else if (strcmp( name, "lb_value" )==0 ) {
  -        char *buf=env->tmpPool->calloc( env, env->tmpPool, 20 );
  -        sprintf( buf, "%d", worker->lb_value );
  -        return buf;
  +        return jk2_env_itoa( env, worker->lb_value );
       } else if (strcmp( name, "lb_factor" )==0 ) {
  -        char *buf=env->tmpPool->calloc( env, env->tmpPool, 20 );
  -        sprintf( buf, "%d", worker->lb_factor );
  -        return buf;
  +        return jk2_env_itoa( env, worker->lb_factor );
       } else if (strcmp( name, "errorState" )==0 ) {
  -        if( worker->in_error_state ) 
  -            return "Y";
  -        else
  -            return "N";
  +        return jk2_env_itoa( env, worker->in_error_state );
       } else if (strcmp( name, "graceful" )==0 ) {
  -        if( worker->mbean->disabled != 0) 
  -            return "Y";
  -        else
  -            return "N";
  +        return jk2_env_itoa( env, worker->mbean->disabled );
       } else if (strcmp( name, "epCount" )==0 ) {
  -        char *result;
           if( worker->endpointCache==NULL ) return "0";
  -        result=env->tmpPool->calloc( env, env->tmpPool, 6 );
  -        sprintf( result, "%d", worker->endpointCache->count );
  -        return result;
  +        return jk2_env_itoa( env, worker->endpointCache->count );
       } else {
           return NULL;
       }
  @@ -152,6 +144,11 @@
           ajp13->route=value;
       } else if( strcmp( name, "route" )==0 ) {
           ajp13->route=value;
  +    } else if( strcmp( name, "graceful" )==0 ) {
  +        if( strcmp( value, "0") )
  +            ajp13->mbean->disabled=0;
  +        else 
  +            ajp13->mbean->disabled=1;
       } else if( strcmp( name, "group" )==0 ) {
           ajp13->groups->add( env, ajp13->groups, value, ajp13 );
       } else if( strcmp( name, "lb_factor" )==0 ) {
  
  
  
  1.31      +34 -2     jakarta-tomcat-connectors/jk/native2/common/jk_worker_lb.c
  
  Index: jk_worker_lb.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_lb.c,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- jk_worker_lb.c    4 Feb 2003 07:39:58 -0000       1.30
  +++ jk_worker_lb.c    1 Mar 2003 05:49:58 -0000       1.31
  @@ -475,7 +475,39 @@
   
   
   static char *jk2_worker_lb_multiValueInfo[]={"worker", NULL };
  -static char *jk2_worker_lb_setAttributeInfo[]={"hwBalanceErr", "noWorkerMsg", 
"noWorkerCode", NULL };
  +static char *jk2_worker_lb_setAttributeInfo[]={"attempts", "stickySession", 
"recovery", "timeout",
  +                                               "hwBalanceErr", "noWorkerMsg", 
"noWorkerCode", "worker", NULL };
  +
  +static char *jk2_worker_lb_getAttributeInfo[]={"attempts", "stickySession", 
"recovery", "timeout",
  +                                               "hwBalanceErr", "noWorkerMsg", 
"noWorkerCode", "workers", NULL };
  +
  +
  +static void * JK_METHOD jk2_lb_getAttribute(jk_env_t *env, jk_bean_t *mbean, 
  +                                            char *name)
  +{
  +    jk_worker_t *lb=mbean->object;
  +    unsigned i = 0;
  +    jk_worker_lb_private_t *lb_priv = lb->worker_private;
  +    
  +    if( strcmp( name, "workers") == 0 ) {
  +        return jk2_map_concatKeys( env, lb->lbWorkerMap, ":" );
  +    } else if( strcmp( name, "noWorkerMsg") == 0 ) {
  +        return lb->noWorkerMsg;
  +    } else if( strcmp( name, "noWorkerCode") == 0 ) {
  +        return jk2_env_itoa( env, lb->noWorkerCode);
  +    } else if( strcmp( name, "hwBalanceErr") == 0 ) {
  +        return jk2_env_itoa( env, lb->hwBalanceErr);
  +    } else if( strcmp( name, "timeout") == 0 ) {
  +        return jk2_env_itoa( env, lb_priv->timeout);
  +    } else if( strcmp( name, "recovery") == 0 ) {
  +        return jk2_env_itoa( env, lb_priv->recovery);
  +    } else if( strcmp( name, "stickySession") == 0 ) {
  +        return jk2_env_itoa( env, lb_priv->sticky_session);
  +    } else if( strcmp( name, "attempts") == 0 ) {
  +        return jk2_env_itoa( env, lb_priv->attempts);
  +    }
  +    return NULL;
  +}
   
   static int JK_METHOD jk2_lb_setAttribute(jk_env_t *env, jk_bean_t *mbean, 
                                            char *name, void *valueP)
  @@ -486,7 +518,7 @@
       jk_worker_lb_private_t *lb_priv = lb->worker_private;
       
       if( strcmp( name, "worker") == 0 ) {
  -        if( lb->lbWorkerMap->get( env, lb->lbWorkerMap, name) != NULL ) {
  +        if( lb->lbWorkerMap->get( env, lb->lbWorkerMap, value) != NULL ) {
               /* Already added */
               return JK_OK;
           }
  
  
  
  1.37      +26 -6     jakarta-tomcat-connectors/jk/native2/common/jk_worker_status.c
  
  Index: jk_worker_status.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_status.c,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- jk_worker_status.c        28 Feb 2003 21:55:49 -0000      1.36
  +++ jk_worker_status.c        1 Mar 2003 05:49:58 -0000       1.37
  @@ -263,6 +263,7 @@
       jk_map_t *map=wenv->initData;
       int i;
       int needHeader=JK_TRUE;
  +    int typeLen=strlen( type );
   
       for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
           char *name=env->_objects->nameAt( env, env->_objects, i );
  @@ -279,7 +280,7 @@
           if( mbean->getAttribute == NULL )
               continue;
   
  -        if( strncmp( type, mbean->type, 5 ) != 0 )
  +        if( strncmp( type, mbean->type, typeLen ) != 0 )
               continue;
   
           if( needHeader ) {
  @@ -687,15 +688,34 @@
           s->jkprintf(env, s, "Updated config %d", shm->head->lbVer  );
       }
       
  -    s->jkprintf(env, s, "Status information for child %d", s->workerEnv->childId  );
  +    s->jkprintf(env, s, "Status information for child %d<br>", 
s->workerEnv->childId  );
  +    s->jkprintf(env, s, " <a href='jkstatus?cfgOrig=1'>[Original config]</a>\n");
  +    s->jkprintf(env, s, " <a href='jkstatus?cfgParsed=1'>[Processed config]</a>\n");
  +    s->jkprintf(env, s, " <a href='jkstatus?scoreboard=1'>[Scoreboard info]</a>\n");
  +    s->jkprintf(env, s, " <a href='jkstatus'>[Workers, Channels and URIs]</a>\n");
       
  +    if( strncmp( s->query_string, "cfgOrig=", 8) == 0 ) {
  +        jk2_worker_status_displayConfigProperties(env, s, s->workerEnv );
  +        return JK_OK;
  +    }
  +
  +    if( strncmp( s->query_string, "cfgParsed=", 10) == 0 ) {
  +        jk2_worker_status_displayActiveProperties(env, s, s->workerEnv );
  +        return JK_OK;
  +    }
  +
  +    if( strncmp( s->query_string, "scoreboard=", 11) == 0 ) {
  +        jk2_worker_status_displayScoreboardInfo(env, s, s->workerEnv );
  +        jk2_worker_status_displayEndpointInfo( env, s, s->workerEnv );
  +        return JK_OK;
  +    }
  +
       /* Body */
       jk2_worker_status_displayRuntimeType(env, s, s->workerEnv, "ajp13" );
  -    jk2_worker_status_displayScoreboardInfo(env, s, s->workerEnv );
  -    jk2_worker_status_displayEndpointInfo( env, s, s->workerEnv );
  +    jk2_worker_status_displayRuntimeType(env, s, s->workerEnv, "channel.socket" );
  +    jk2_worker_status_displayRuntimeType(env, s, s->workerEnv, "channel.un" );
  +    jk2_worker_status_displayRuntimeType(env, s, s->workerEnv, "channel.jni" );
       jk2_worker_status_displayRuntimeType(env, s, s->workerEnv, "uri" );
  -    jk2_worker_status_displayConfigProperties(env, s, s->workerEnv );
  -    jk2_worker_status_displayActiveProperties(env, s, s->workerEnv );
       
       s->afterRequest( env, s);
       return JK_OK;
  
  
  
  1.21      +1 -0      jakarta-tomcat-connectors/jk/native2/include/jk_env.h
  
  Index: jk_env.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/include/jk_env.h,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- jk_env.h  4 Feb 2003 07:40:32 -0000       1.20
  +++ jk_env.h  1 Mar 2003 05:49:58 -0000       1.21
  @@ -237,6 +237,7 @@
   
   void JK_METHOD jk2_registry_init(jk_env_t *env);
   
  +char * JK_METHOD jk2_env_itoa( jk_env_t *env, int i );
       
   #ifdef __cplusplus
   }
  
  
  
  1.16      +4 -2      jakarta-tomcat-connectors/jk/native2/include/jk_map.h
  
  Index: jk_map.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/include/jk_map.h,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- jk_map.h  4 Feb 2003 07:40:32 -0000       1.15
  +++ jk_map.h  1 Mar 2003 05:49:58 -0000       1.16
  @@ -130,7 +130,9 @@
                             struct jk_pool *pool); 
   
   int jk2_map_read(struct jk_env *env, jk_map_t *m,const char *file);
  -    
  +
  +char *jk2_map_concatKeys( struct jk_env *env, jk_map_t *map, char *delim );
  +
   #ifdef __cplusplus
   }
   #endif /* __cplusplus */
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to