URI Dissector
    
		The URI dissector is a helper class to dissect an URI into its different components.
	
	
    File information
    
	
	
	Classes
    uri_dissector
    class uri_dissector {
public:
	char *scheme, *e_scheme;      /* e.g.: http */
	char *hier, *e_hier;          /* hierarchy e.g.: // */
	char *usr, *e_usr;            /* user */
	char *pwd, *e_pwd;            /* password */
	char *ip, *e_ip;              /* host part is an ip address */
	char *fqdn, *e_fqdn;          /* host part is a fully qualified domain name */
	char *port, *e_port;          /* port past ip/fqdn */
	char *path, *e_path;
	char *file, *e_file;
	char *anchor, *e_anchor;      /* eg: #bla */
	char *query, *e_query;        /* '?' cgi query string */
	char *params, *e_params;      /* ';' host parameters */
	uri_dissector();
	bool dissect_uri(char *uri);
	bool path_to_argv(char *buf, int sz, int &argc, char * argv[]);
	bool querystring_to_argv(char *buf, int sz, int &argc, char * argv[]);
#define COMPOSE_SCHEME  0x01
#define COMPOSE_HIER    0x02
#define COMPOSE_USR     0x04
#define COMPOSE_PWD     0x08
#define COMPOSE_HOST    0x10
#define COMPOSE_PORT    0x20
#define COMPOSE_PATH    0x40
#define COMPOSE_FILE    0x80
#define COMPOSE_ANCHOR  0x100
#define COMPOSE_QUERY   0x200
#define COMPOSE_PARAMS  0x400
#define COMPOSE_ALL     0xFFFFFFFF
#define COMPOSE_ALL_NO_USERPWD COMPOSE_ALL&~COMPOSE_USR&~COMPOSE_PWD
	char* compose(char *buf, dword len_buf, dword flags = COMPOSE_ALL);
};
    Overview
    The uri_dissector class is used to dissect an URI into its compontents.
	
    Public functions
    
    uri_dissector
    
        Creates the uri_dissector instance.
    
    
    
    dissect_uri
    
        Dissects the uri and sets the public variables like scheme, e_scheme etc.
        Parameters
        
            | char * uri | The uri which is dissected. The char * buffer is not modified! | 
        
        Return value
        True if the dissection was successfull, otherwise false.
    
    
    
    path_to_argv
    Splits the path parts into to argv array.
    
        Parameters
        
            | char * buf | This buffer will be used for the arguments of the argv array. | 
            | int sz | The size of buf. | 
            | int &argc | The initial element count of the argv array. Will contain the actual element count after successfull completion. | 
            | char *argv[] | The array which will contain the different parts of the path | 
        
        Return value
        True if the buffer was large enough and argv had enough elements. Otherwise false.
    
    
    
    querystring_to_argv
    Splits the query string into the argv array, while argv[0] is a name and argv[1] is a value and so on.
    
        Parameters
        
            | char * buf | This buffer will be used for the arguments of the argv array. | 
            | int sz | The size of buf. | 
            | int &argc | The initial element count of the argv array. Will contain the actual element count after successfull completion. | 
            | char *argv[] | The array which will contain the different parts of the query. The first element contains the name, the second the value and so on. | 
        
        Return value
        True if the buffer was large enough and argv had enough elements. Otherwise false.
    
    
    
    compose
    Writes the different parts from the URI to a buffer. You can use the COMPOSE_* flags to specify the parts you want.
    
        Parameters
        
            | char * buf | This buffer will be used for the arguments of the argv array. | 
            | dword len_buf | The length of buf. | 
            | dword flags | Specifies the parts to compose. The default value is COMPOSE_ALL. | 
        
        Return value
        Returns buf again.
    
    
    
    Public Members
    
        | char * scheme; char * e_scheme | Start and end pointer of the scheme, e.g. http. | 
        | char * hier; char * e_hier | Start and end pointer of the hierarchy, e.g. //. | 
        | char * usr; char * e_usr | Start and end pointer of the user. | 
        | char * pwd; char * e_pwd | Start and end pointer of the password. | 
        | char * ip; char * e_ip | Start and end pointer of the IP address. | 
        | char * fqdn; char * e_fqdn | Start and end pointer of the domain name (if there is no IP address). | 
        | char * port; char * e_port | Start and end pointer of the port. | 
        | char * path; char * e_path | Start and end pointer of the path. | 
        | char * file; char * e_file | Start and end pointer of the file after the path. | 
        | char * anchor; char * e_anchor | Start and end pointer of the anchor, e.g. #test. | 
        | char * query; char * e_query | Start and end pointer of the query string, e.g. ?test=123. | 
        
        | char * params; char * e_params | Start and end pointer of the host parameters. | 
    
        
 Code Example 
URI dissection
uri_dissector uri;
uri.dissect_uri("http://admin:ip800@172.16.16.43/bla#funny?cgpn=73&cdpn=123");
debug->iprintf("%.*s", uri.e_user - uri.user, uri.user); // prints "admin"
char buf[256];                                                                       
uri.dissect_uri("sip:1234@anywhere.de:8888;user=phone");                             
uri.compose(buf,sizeof(buf),COMPOSE_PARAMS);   // yields "user=phone"                
uri.compose(buf,sizeof(buf),COMPOSE_USR);      // yields "1234"                      
uri.compose(buf,sizeof(buf),COMPOSE_HOST);     // yields "anywhere.de"               
uri.compose(buf,sizeof(buf),COMPOSE_PORT);     // yields "8888"