+
+VlcPlugin::~VlcPlugin()
+{
+ delete psz_baseURL;
+ delete psz_target;
+ if( libvlc_instance )
+ libvlc_destroy(libvlc_instance, NULL );
+}
+
+/*****************************************************************************
+ * VlcPlugin methods
+ *****************************************************************************/
+
+char *VlcPlugin::getAbsoluteURL(const char *url)
+{
+ if( NULL != url )
+ {
+ // check whether URL is already absolute
+ const char *end=strchr(url, ':');
+ if( (NULL != end) && (end != url) )
+ {
+ // validate protocol header
+ const char *start = url;
+ while( start != end ) {
+ char c = *start | 0x20;
+ if( (c < 'a') || (c > 'z') )
+ // not valid protocol header, assume relative URL
+ break;
+ ++start;
+ }
+ /* we have a protocol header, therefore URL is absolute */
+ return strdup(url);
+ }
+
+ if( psz_baseURL )
+ {
+ size_t baseLen = strlen(psz_baseURL);
+ char *href = new char[baseLen+strlen(url)];
+ if( href )
+ {
+ /* prepend base URL */
+ strcpy(href, psz_baseURL);
+
+ /*
+ ** relative url could be empty,
+ ** in which case return base URL
+ */
+ if( '\0' == *url )
+ return href;
+
+ /*
+ ** locate pathname part of base URL
+ */
+
+ /* skip over protocol part */
+ char *pathstart = strchr(href, ':');
+ char *pathend;
+ if( '/' == *(++pathstart) )
+ {
+ if( '/' == *(++pathstart) )
+ {
+ ++pathstart;
+ }
+ }
+ /* skip over host part */
+ pathstart = strchr(pathstart, '/');
+ pathend = href+baseLen;
+ if( ! pathstart )
+ {
+ // no path, add a / past end of url (over '\0')
+ pathstart = pathend;
+ *pathstart = '/';
+ }
+
+ /* relative URL made of an absolute path ? */
+ if( '/' == *url )
+ {
+ /* replace path completely */
+ strcpy(pathstart, url);
+ return href;
+ }
+
+ /* find last path component and replace it */
+ while( '/' != *pathend) --pathend;
+
+ /*
+ ** if relative url path starts with one or more '../',
+ ** factor them out of href so that we return a
+ ** normalized URL
+ */
+ while( pathend != pathstart )
+ {
+ const char *p = url;
+ if( '.' != *p )
+ break;
+ ++p;
+ if( '.' != *p )
+ break;
+ ++p;
+ if( '/' != *p )
+ break;
+ ++p;
+ url = p;
+ while( '/' != *pathend ) --pathend;
+ }
+ /* concatenate remaining base URL and relative URL */
+ strcpy(pathend+1, url);
+ }
+ return href;
+ }
+ }
+ return NULL;