summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS5
-rw-r--r--src/input/asxparser.c281
-rw-r--r--src/input/input_mms.c38
-rw-r--r--src/input/mms.c156
-rw-r--r--src/input/mms.h14
5 files changed, 338 insertions, 156 deletions
diff --git a/AUTHORS b/AUTHORS
index 30bc36871..0792f1797 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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