diff options
author | Guenter Bartsch <guenter@users.sourceforge.net> | 2002-03-18 23:28:49 +0000 |
---|---|---|
committer | Guenter Bartsch <guenter@users.sourceforge.net> | 2002-03-18 23:28:49 +0000 |
commit | 31bb532cd84320a72f10e72cc6ca9c062ecfc948 (patch) | |
tree | 2ab6fda70a3f217d6d59bf79c37c21601794532a | |
parent | 96d4ac01bc64b3c5f725d553387eb622da64a171 (diff) | |
download | xine-lib-31bb532cd84320a72f10e72cc6ca9c062ecfc948.tar.gz xine-lib-31bb532cd84320a72f10e72cc6ca9c062ecfc948.tar.bz2 |
mms patches contributed by Andrei Lahun
CVS patchset: 1590
CVS date: 2002/03/18 23:28:49
-rw-r--r-- | AUTHORS | 5 | ||||
-rw-r--r-- | src/input/asxparser.c | 281 | ||||
-rw-r--r-- | src/input/input_mms.c | 38 | ||||
-rw-r--r-- | src/input/mms.c | 156 | ||||
-rw-r--r-- | src/input/mms.h | 14 |
5 files changed, 338 insertions, 156 deletions
@@ -210,5 +210,8 @@ Contributions Michael Jochum <e9725005@stud3.tuwien.ac.at> avi multiple audio stream support - + + Andrei Lahun <Uman@editec-lotteries.com> + mms/browser plugin enhancements + (let us know if we've forgotten anyone) diff --git a/src/input/asxparser.c b/src/input/asxparser.c index c0142de4c..b23a3529a 100644 --- a/src/input/asxparser.c +++ b/src/input/asxparser.c @@ -3,158 +3,227 @@ #include <sys/types.h> #include <fcntl.h> #include <string.h> -#include <mms.h> +#include "mms.h" #include <unistd.h> #include <ctype.h> -void asx_find_entries(char* buff, char** fname, - int *IsNotFinished); -char *strupr(char *string); -void first_request(char *buff, char *host, char *file, int *len) { +extern char *mms_url_s[]; +extern char *mms_url_e[]; +void asx_find_entries(char* buff,char *url, char** fname, + int *IsNotFinished ) +{ + int res; + int delta; + int delta1=0; + char *ptr; + char* ptre=NULL; + char* ptre1=NULL; + + + + delta=mms_start_where(buff); + if(delta < 0) + return ; + + ptr=buff+delta; + if(!strncasecmp(ptr,"HREF",4)){ + char* lastsl; + lastsl=(char*)strchr(ptr,'/'); + if(lastsl) + ptr=lastsl; + lastsl=(char*)strrchr(url,'/'); + if(lastsl) + delta1=lastsl-url; + } + ptre1=(char*)strstr(ptr, "#"); + if (!ptre1) + ptre1=(char*)strstr(ptr, "?"); + if (!ptre) + ptre=(char*)strstr(ptr, "\"/>"); + if (!ptre) + ptre=(char*)strstr(ptr, "\" "); + if (!ptre) + ptre=(char*)strstr(ptr, "\"\t"); + if (!ptre) + ptre=(char*)strstr(ptr, "\"\n"); + if (!ptre) + ptre=(char*)strstr(ptr, "\t"); + if (!ptre) + ptre=(char*)strstr(ptr, "\r"); + if (!ptre) + ptre=(char*)strstr(ptr, "\n"); + if (!ptre) + ptre=(char*)strstr(ptr, " "); + + if( ((ptre > ptre1) && ptre1) || (!ptre && ptre1) ) + ptre=ptre1; + + if(!ptre){ + char *ptr1; + + ptr1=(char*)strrchr(ptr,'.'); + + if(!ptr1) + goto cont; + + + if (!mms_url_is(ptr1+1, mms_url_e)) { + + } + else + ptre=ptr1+4; + + + + } + cont: + printf("TEST 1 \n"); + if (!ptre) + return ; + + printf("TEST 2 \n"); + res=(int)(ptre-ptr); + if(res<=0) + return ; + if ( !delta1 ){ + (*fname)=(char*)realloc((*fname),res+2); + memcpy(*fname,ptr,res); + (*fname)[res]=0; + } + else{ + (*fname)=(char*)realloc((*fname),res+2+delta1+1); + memcpy(*fname,url,delta1+1); + memcpy(*fname+delta1,ptr,res+2); + (*fname)[res+delta1+1]=0; + } + + printf("asxparser path is %s \n", *fname); + return ; +} +void first_request(char* buff,char* host, char* file,int *len) +{ char *ptr; bzero(buff,*len); ptr=buff; ptr+=sprintf(ptr,"GET %s HTTP/1.0\r\n",file); ptr+=sprintf(ptr,"Accept: */*\r\n"); - ptr+=sprintf(ptr,"User-Agent: xine/0.9.8\r\n"); + ptr+=sprintf(ptr,"User-Agent: NSPlayer/7.0.0.1956\r\n"); ptr+=sprintf(ptr,"Host: %s\r\n", host); ptr+=sprintf(ptr,"Pragma: no-cache,rate=1.000000,stream-time=0,stream-offset=0:0,request-context=1,max-duration=0\r\n"); ptr+=sprintf(ptr,"Pragma: xClientGUID=%s\r\n", "{33715801-BAB3-9D85-24E9-03B90328270A}"); - ptr+=sprintf(ptr,"Connection: Close\r\n\r\n"); + + ptr+=sprintf(ptr,"Connection: Keep-Alive\r\n\r\n"); + *len =(int)ptr-(int)buff; } -int asx_parse (char* mrl, char** rname) { - char* ptr=NULL; - char buff[1024]; - int res; - int is_not_finished=0; - char *url, *host, *hostend; - char *path, *file; - int hostlen, s ,l; +int asx_parse (char* fname, char** rname) +{ + char* ptr=NULL; + char buff[1024]; + int res; + int IsNotFinished=0; + char *url, *host=NULL, *hostend=NULL; + char buff1[1024]; + int s ,l; + char notyetconnected=1; + + if(!fname) + return 1; + + ptr=(char*)strrchr(fname,'.'); - if (strncasecmp (mrl, "mmshttp://", 10)) { - return -1; - } - - ptr=strstr(mrl,"//"); if(!ptr) return 1; - l=ptr-mrl+2; - url = strdup (mrl); - - /* extract hostname */ + + if( mms_start_where(fname) < 0 ){ + FILE *fp; + /* probably it is asx file on the disk*/ + fp=fopen(fname,"r"); + if(!fp) + return 1; + fread(buff,sizeof(buff),1,fp); + fclose(fp); + printf ("asxparser: buff =%s \n",buff ); + goto proc; + } + + strncpy(buff1,fname,sizeof(buff1)); + /* extract hostname/test/connect */ + conn: - hostend = strchr(&url[l],'/'); - if (!hostend) { - printf ("asxparser: invalid url >%s<, failed to find hostend \n", url); - free(url); - return 1; - } - hostlen = hostend - url - l; - host = malloc (hostlen+1); - strncpy (host, &url[l], hostlen); - host[hostlen]=0; - - /* extract path and file */ - - path = url+hostlen+l+1; - file = strrchr (url, '/'); - - /* - * try to connect - */ - - printf("asxparser host=%s \n",host); - printf("asxparser file=%s \n",hostend); - s = host_connect (host, 80); - if (s == -1) { - printf ("asxparser: failed to connect\n"); - free (host); - free (url); + url=mms_connect_common(&s,80,buff1,&host,&hostend,NULL,NULL); + if(!url) return 1; - } + printf("asxparser: connect passed \n"); + notyetconnected=0; l=sizeof(buff); - first_request(buff, host, hostend, &l); + first_request(buff, host,hostend, &l); write(s,buff,l); res=read(s,buff, sizeof(buff)); - printf("asxparser: answer1=%s %d byte received \n",buff,res); - if(!strstr(buff,"mms://")) { - l=sizeof(buff); - first_request(buff, host, hostend, &l); + printf("asxparser: answer1=::%s:: \n %d byte received \n",buff,res); + + + if(mms_start_where(buff) < 0){ + l=sizeof(buff); + /* second_request(buff, host,hostend, &l); write(s,buff,l); - res=read(s,buff, sizeof(buff)); - printf("asxparser: answer2=%s %d byte received\n",buff,res); - } +*/ + res=read(s,buff, sizeof(buff)); + printf("asxparser: answer2=%s %d byte received\n",buff,res); +} + + close(s); - free(url); free(host); - if(res<1) - return 1; - - printf ("asxparser: finding entries...\n"); - - asx_find_entries(buff,rname,&is_not_finished); - return 1; + if(res<1){ + char *ext; -} - -void asx_find_entries (char* buff, char** fname, - int *is_not_finished ) { - int res; - char *ptr; - char *uptr; - char* ptre; + ext=strrchr(buff1,'.'); - /*no <ASX VERSION >*/ - uptr=strdup(buff); - uptr=strupr(uptr); - - if (!strstr(uptr,"ASX VERSION")){ - free(uptr); - return ; + if(mms_url_is(buff1,mms_url_s) + && ext && mms_url_is(ext+1, mms_url_e)){ + printf("asxparser: using url received from browser \n"); + return 0; + } + printf("asxparser: no success fname=%s ext=%s \n",fname,ext); + return 1; } - free(uptr); - - ptr=(char*)strstr(buff, "mms://"); - if(!ptr) - return ; - ptre=(char*)strstr(ptr, "\""); - if (!ptre) - return ; - - res=(int)(ptre-ptr); - if(res<=0) - return ; - (*fname)=(char*)malloc(res+2); - memcpy(*fname,ptr,res); - (*fname)[res]=0; - printf("asxparser path is %s \n", *fname); - return ; + proc: + asx_find_entries(buff,fname,rname,&IsNotFinished); + if(notyetconnected && *rname){ + strncpy(buff1,*rname,sizeof(buff1)); + goto conn; + } + printf("asx_parser passed \n"); + return 0; + } -char *strupr(char *string) { + +char *strupr(char *string) +{ char *s; - if (string){ - for (s = string; *s; ++s) - *s = toupper(*s); - } + if (string) + { + for (s = string; *s; ++s) + *s = toupper(*s); + } return string; } - diff --git a/src/input/input_mms.c b/src/input/input_mms.c index 421508906..04c477f8f 100644 --- a/src/input/input_mms.c +++ b/src/input/input_mms.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2000-2002 major mms + * Copyright (C) 2000-2001 major mms * * This file is part of xine-mms * @@ -43,9 +43,6 @@ #include "mms.h" #include "strict_scr.h" -/* -#define LOG -*/ extern int errno; @@ -74,37 +71,49 @@ typedef struct { } mms_input_plugin_t; +extern char *mms_url_s[]; +extern char *mms_url_e[]; static int mms_plugin_open (input_plugin_t *this_gen, char *mrl) { char* nmrl=NULL; + char* uptr; + int error_id; mms_input_plugin_t *this = (mms_input_plugin_t *) this_gen; - - asx_parse(mrl,&nmrl); + error_id=asx_parse(mrl,&nmrl); + + if(error_id) + return 0; if(!nmrl) nmrl=mrl; printf("mms_plugin_open: using mrl <%s> \n", nmrl); - if (strncasecmp (nmrl, "mms://",6)) + + uptr=strdup(nmrl); + if (!mms_url_is(nmrl,mms_url_s)){ + return 0; - + } + + this->mrl = strdup(nmrl); /* FIXME: small memory leak */ this->mms = mms_connect (nmrl); - if (!this->mms) + if (!this->mms){ + return 0; - + } + this->curpos = 0; this->buffering = 0; + /* register our scr plugin */ - - this->scr->scr.start (&this->scr->scr, this->xine->metronom->get_current_time (this->xine->metronom)); - this->xine->metronom->register_scr (this->xine->metronom, &this->scr->scr); - + this->scr->scr.start (&this->scr->scr, this->xine->metronom->get_current_time (this->xine->metronom)); + this->xine->metronom->register_scr (this->xine->metronom, &this->scr->scr); return 1; } @@ -124,6 +133,7 @@ static off_t mms_plugin_read (input_plugin_t *this_gen, fifo_fill = this->xine->video_fifo->size(this->xine->video_fifo); + if (fifo_fill<LOW_WATER_MARK) { this->xine->metronom->set_speed (this->xine->metronom, SPEED_PAUSE); diff --git a/src/input/mms.c b/src/input/mms.c index 2f99e7127..419f5412d 100644 --- a/src/input/mms.c +++ b/src/input/mms.c @@ -55,6 +55,9 @@ #define CMD_HEADER_LEN 48 #define CMD_BODY_LEN 1024 +char *mms_url_s[]={"MMS://","MMSU://","MMST://","HTTP://", "HREF",NULL}; +char *mms_url_e[]={"ASF","WMF","WMV","WMA",NULL}; + struct mms_s { int s; @@ -204,6 +207,9 @@ static void send_command (mms_t *this, int command, uint32_t switches, } #ifdef LOG + { + int i; + printf ("\nlibmms: ***************************************************\ncommand sent, %d bytes\n", length+48); printf ("start sequence %08x\n", get_32 (this->scmd, 0)); @@ -240,6 +246,7 @@ static void send_command (mms_t *this, int command, uint32_t switches, } printf ("\n"); + } #endif } @@ -288,7 +295,7 @@ static void print_answer (char *data, int len) { } static void get_answer (mms_t *this) { - + int command = 0x1b; while (command == 0x1b) { @@ -316,9 +323,7 @@ static int receive (int s, char *buf, size_t count) { total = 0; while (total < count) { - len = read (s, &buf[total], count-total); - if (len<0) { perror ("read error:"); return 0; @@ -353,9 +358,12 @@ static void get_header (mms_t *this) { } #ifdef LOG + { + int i; for (i=0; i<8; i++) printf ("libmms: pre_header[%d] = %02x (%d)\n", i, pre_header[i], pre_header[i]); + } #endif if (pre_header[4] == 0x02) { @@ -467,10 +475,9 @@ static void interp_header (mms_t *this) { this->packet_length = get_32(this->asf_header, i+92-24); this->file_length = get_32(this->asf_header, i+40-24); - #ifdef LOG - printf ("file object, packet length = %d (%d), file_length=%d\n", - this->packet_length, get_32(this->asf_header, i+96-24), this->file_length); + printf ("file object, packet length = %d (%d)\n", + this->packet_length, get_32(this->asf_header, i+96-24)); #endif @@ -504,50 +511,133 @@ static void interp_header (mms_t *this) { } -mms_t *mms_connect (char *url_) { +int mms_url_is(char* url, char** mms_url) + { + int i=0; + char* uptr; + + printf("mms_url_is l=%d \n",strlen(mms_url[0])); + if(!url ) + return 0; + uptr=strdup(url); + uptr=strupr(uptr); + while(mms_url[i]){ + if(!strncasecmp(uptr,mms_url[i],strlen(mms_url[i]) )){ + free(uptr); + return strlen(mms_url[i]); + } + i++; + } + free(uptr); + return 0; + } +int mms_start_where(char* url) + { + int i=0; + int delta; + char *p; + char* uptr; + + if(!url ) + return -1; + uptr=strdup(url); + uptr=strupr(uptr); + while(mms_url_s[i]){ + if((p=strstr(uptr,mms_url_s[i]))){ + delta=p-uptr; + free(uptr); + return delta; + } + i++; + } + free(uptr); + return -1; + } +char* mms_connect_common(int *s ,int port,char *url, char **host , char** hostend, + char **path,char **file) +{ + + int hostlen; + int proto_len; + char *forport; - mms_t *this; - char *url, *host, *hostend; - char *path, *file; - int hostlen, s, len, i; - /* parse url*/ + + if(!(proto_len=mms_url_is(url,mms_url_s))){ - if (strncasecmp (url_, "mms://",6)) { - printf ("libmms: invalid url >%s< (should be mms:// - style)\n", url_); + printf ("libmms: invalid url >%s< (should be mms:// http:// - style)\n", url); return NULL; + } - url = strdup (url_); + /* extract hostname */ - - hostend = strchr(&url[6],'/'); - if (!hostend) { + + printf ("libmms: extracting host name \n"); + *hostend = strchr(&url[proto_len],'/'); + if (!(*hostend)) { printf ("libmms: invalid url >%s<, failed to find hostend\n", url); return NULL; } - hostlen = hostend - url - 6; - host = malloc (hostlen+1); - strncpy (host, &url[6], hostlen); - host[hostlen]=0; + forport=strchr(&url[proto_len],':'); /* May be they put a port here ?*/ + if( forport && forport < *hostend ){ + /*if(sscanf(forport,"%d",&port)!=1) + port=MMS_PORT; + */ + hostlen = forport - url - proto_len; + } + else + hostlen = *hostend - url - proto_len; + + *host = malloc (hostlen+1); + strncpy (*host, &url[proto_len], hostlen); + (*host)[hostlen]=0; + + printf (" libmms: host =%s len =%d proto_len =%d\n",*host,hostlen,proto_len); + hostlen = *hostend - url - proto_len; + /* extract path and file */ - path = url+hostlen+7; - file = strrchr (url, '/'); + if(path) + *path = url+hostlen+proto_len+1; + if(file) + *file = strrchr (url, '/'); /* * try to connect */ - s = host_connect (host, MMS_PORT); - if (s == -1) { + printf("here port=%d \n",port); + *s = host_connect (*host, port); + if (*s == -1) { printf ("libmms: failed to connect\n"); - free (host); - free (url); + free (*host); + return NULL; + } + + return url; +} + +mms_t *mms_connect (char *url_) { + + mms_t *this; + int len,i; + char *url; + char *url1; + char *path; + char *file; + char *host=NULL, *hostend; + int s; + + url = strdup (url_); + url1 = mms_connect_common(&s,MMS_PORT,url,&host,&hostend,&path,&file); + if(!url1){ + free(url); return NULL; } + this = (mms_t*) malloc (sizeof (mms_t)); @@ -565,6 +655,7 @@ mms_t *mms_connect (char *url_) { this->buf_size = 0; this->buf_read = 0; + printf ("%s %s %s %s ",url,host,path,file); /* * let the negotiations begin... */ @@ -577,6 +668,7 @@ mms_t *mms_connect (char *url_) { send_command (this, 1, 0, 0x0004000b, strlen(this->str) * 2+8); + printf("before read \n"); len = read (this->s, this->buf, BUF_SIZE) ; if (len>0) print_answer (this->buf, len); @@ -606,6 +698,7 @@ mms_t *mms_connect (char *url_) { /* 0x15 */ + memset (this->scmd_body, 0, 40); this->scmd_body[32] = 2; @@ -614,6 +707,7 @@ mms_t *mms_connect (char *url_) { this->num_stream_ids = 0; get_header (this); + interp_header (this); /* 0x33 */ @@ -635,6 +729,7 @@ mms_t *mms_connect (char *url_) { /* 0x07 */ + memset (this->scmd_body, 0, 40); for (i=8; i<16; i++) @@ -645,10 +740,11 @@ mms_t *mms_connect (char *url_) { send_command (this, 0x07, 1, 0xFFFF | this->stream_ids[0] << 16, 24); - + printf(" mms_connect: passed\n" ); return this; } + static int get_media_packet (mms_t *this) { unsigned char pre_header[8]; @@ -798,6 +894,7 @@ int mms_read (mms_t *this, char *data, int len) { return total; } + void mms_close (mms_t *this) { if (this->s >= 0) { @@ -809,7 +906,6 @@ void mms_close (mms_t *this) { free (this); } - uint32_t mms_get_length (mms_t *this) { return this->file_length; } diff --git a/src/input/mms.h b/src/input/mms.h index 65ba0b532..b1a8879bb 100644 --- a/src/input/mms.h +++ b/src/input/mms.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2000-2002 major mms + * Copyright (C) 2000-2001 major mms * * This file is part of libmms * @@ -19,6 +19,7 @@ * * libmms public header */ + #ifndef HAVE_MMS_H #define HAVE_MMS_H @@ -26,14 +27,17 @@ typedef struct mms_s mms_t; +char *strupr(char *string); +int asx_parse (char* fname, char** rname); +int mms_start_where(char* url); +int mms_url_is(char* url, char** mms_url); +char* mms_connect_common(int *s ,int port,char *url, char **host , char** hostend, + char **path,char **file); mms_t *mms_connect (char *url); int mms_read (mms_t *this, char *data, int len); - -void mms_close (mms_t *this); -int asx_parse (char* fname, char** rname); - uint32_t mms_get_length (mms_t *this); +void mms_close (mms_t *this); #endif |