author | harlekin <harlekin> | 2002-04-20 21:23:38 (UTC) |
---|---|---|
committer | harlekin <harlekin> | 2002-04-20 21:23:38 (UTC) |
commit | 679083ca18ddbf4762578d1aa010203ea188586c (patch) (side-by-side diff) | |
tree | eada9fcd708aedbbe8c6ef207942125ce4ad97a9 | |
parent | b452044ec1b3327f25f8552045b4229c8af39bf7 (diff) | |
download | opie-679083ca18ddbf4762578d1aa010203ea188586c.zip opie-679083ca18ddbf4762578d1aa010203ea188586c.tar.gz opie-679083ca18ddbf4762578d1aa010203ea188586c.tar.bz2 |
no / needed at the url end
-rw-r--r-- | core/multimedia/opieplayer/libmad/libmadplugin.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/core/multimedia/opieplayer/libmad/libmadplugin.cpp b/core/multimedia/opieplayer/libmad/libmadplugin.cpp index 4665408..7978805 100644 --- a/core/multimedia/opieplayer/libmad/libmadplugin.cpp +++ b/core/multimedia/opieplayer/libmad/libmadplugin.cpp @@ -119,274 +119,277 @@ static int unmap_file(void *fdm, unsigned long length) # endif static inline QString tr( const char *str ) { // Apparently this is okay from a plugin as it runs in the process space of the owner of the plugin return qApp->translate( "OpiePlayer", str, "libmad strings for mp3 file info" ); } class LibMadPluginData { public: Input input; Output output; int bad_last_frame; struct mad_stream stream; struct mad_frame frame; struct mad_synth synth; bool flush; }; LibMadPlugin::LibMadPlugin() { d = new LibMadPluginData; d->input.fd = 0; #if defined(HAVE_MMAP) d->input.fdm = 0; #endif d->input.data = 0; d->flush = TRUE; info = tr( "No Song Open" ); } LibMadPlugin::~LibMadPlugin() { close(); delete d; } bool LibMadPlugin::isFileSupported( const QString& path ) { debugMsg( "LibMadPlugin::isFileSupported" ); // Mpeg file extensions // "mp2","mp3","m1v","m2v","m2s","mpg","vob","mpeg","ac3" // Other media extensions // "wav","mid","mod","s3m","ogg","avi","mov","sid" char *ext = strrchr( path.latin1(), '.' ); // Test file extension if ( ext ) { if ( strncasecmp(ext, ".mp2", 4) == 0 ) return TRUE; if ( strncasecmp(ext, ".mp3", 4) == 0 ) return TRUE; } // UGLY - just for fast testing if ( path.left(4) == "http") { return TRUE; } return FALSE; } int LibMadPlugin::tcp_open(char *address, int port) { struct sockaddr_in stAddr; struct hostent *host; int sock; struct linger l; memset(&stAddr, 0, sizeof(stAddr)); stAddr.sin_family = AF_INET; stAddr.sin_port = htons(port); if ((host = gethostbyname(address)) == NULL) return (0); stAddr.sin_addr = *((struct in_addr *)host->h_addr_list[0]); if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) return (0); l.l_onoff = 1; l.l_linger = 5; if (setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&l, sizeof(l)) < 0) return (0); if (connect(sock, (struct sockaddr *)&stAddr, sizeof(stAddr)) < 0) return (0); return (sock); } /** * Read a http line header. * This function read character by character. * @param tcp_sock the socket use to read the stream * @param buf a buffer to receive the data * @param size size of the buffer * @return the size of the stream read or -1 if an error occured */ int LibMadPlugin::http_read_line(int tcp_sock, char *buf, int size) { int offset = 0; do { if (std::read(tcp_sock, buf + offset, 1) < 0) return -1; if (buf[offset] != '\r') /* Strip \r from answer */ offset++; } while (offset < size - 1 && buf[offset - 1] != '\n'); buf[offset] = 0; return offset; } int LibMadPlugin::http_open(const QString& path ) { qDebug("Open http"); char *host; int port; char *request; int tcp_sock; char http_request[PATH_MAX]; char filename[PATH_MAX]; - char c; + // char c; char *arg =strdup(path.latin1()); QString errorMsg; /* Check for URL syntax */ // if (strncmp(arg, "http://", strlen("http://"))) { // qDebug("Url syntax error"); // return (0); // } qDebug("Parse URL"); port = 80; host = arg + strlen("http://"); - if ((request = strchr(host, '/')) == NULL) { - qDebug("Url syntax 2error %s", host); - return (0); - } + + // we need to think of something better than that + //if ((request = strchr(host, '/')) == NULL) { + // qDebug("Url syntax 2error %s", host); + // return (0); + // } + *request++ = 0; if (strchr(host, ':') != NULL) /* port is specified */ { port = atoi(strchr(host, ':') + 1); *strchr(host, ':') = 0; } qDebug("Open a TCP socket"); if (!(tcp_sock = tcp_open(host, port))) { perror("http_open"); errorMsg="http_open "+(QString)strerror(errno); QMessageBox::message("OPiePlayer",errorMsg); return (0); } snprintf(filename, sizeof(filename) - strlen(host) - 75, "%s", request); /* Send HTTP GET request */ /* Please don't use a Agent know by shoutcast (Lynx, Mozilla) seems to be reconized and print * a html page and not the stream */ snprintf(http_request, sizeof(http_request), "GET /%s HTTP/1.0\r\n" /* "User-Agent: Mozilla/2.0 (Win95; I)\r\n" */ "Pragma: no-cache\r\n" "Host: %s\r\n" "Accept: */*\r\n" "\r\n", filename, host); qDebug("send"); send(tcp_sock, http_request, strlen(http_request), 0); qDebug("Parse server reply"); #if 0 qDebug("do 0"); do read(tcp_sock, &c, sizeof(char)); while (c != ' '); read(tcp_sock, http_request, 4 * sizeof(char)); http_request[4] = 0; if (strcmp(http_request, "200 ")) { fprintf(stderr, "http_open: "); do { read(tcp_sock, &c, sizeof(char)); fprintf(stderr, "%c", c); } while (c != '\r'); fprintf(stderr, "\n"); return (0); } #endif do { int len; len = http_read_line(tcp_sock, http_request, sizeof(http_request)); if (len == -1) { fprintf(stderr, "http_open: %s\n", strerror(errno)); return 0; } if (strncmp(http_request, "Location:", 9) == 0) { qDebug("redirect"); std::close(tcp_sock); http_request[strlen(http_request) - 1] = '\0'; return http_open(&http_request[10]); } if (strncmp(http_request, "ICY ", 4) == 0) { qDebug(" This is icecast streaming"); if (strncmp(http_request + 4, "200 ", 4)) { fprintf(stderr, "http_open: %s\n", http_request); return 0; } } else if (strncmp(http_request, "icy-", 4) == 0) { /* we can have: icy-noticeX, icy-name, icy-genre, icy-url, icy-pub, icy-metaint, icy-br */ /* Don't print these - mpg123 doesn't */ /* fprintf(stderr,"%s\n",http_request); */ } } while (strcmp(http_request, "\n") != 0); return (tcp_sock); } bool LibMadPlugin::open( const QString& path ) { debugMsg( "LibMadPlugin::open" ); Config cfg("OpiePlayer"); cfg.setGroup("Options"); bufferSize = cfg.readNumEntry("MPeg_BufferSize",MPEG_BUFFER_SIZE); qDebug("buffer size is %d", bufferSize); d->bad_last_frame = 0; d->flush = TRUE; info = QString( "" ); qDebug( "Opening %s", path.latin1() ); bool isStream=FALSE; if (path.left( 4 ) == "http" ) { d->input.fd = http_open(path); if(d->input.fd == 0) { qDebug("http_open error"); } isStream=TRUE; qDebug("Opened ok"); } else { d->input.path = path.latin1(); d->input.fd = ::open( d->input.path, O_RDONLY ); } if (d->input.fd == -1) { qDebug("error opening %s", d->input.path ); return FALSE; } if(!isStream) { qDebug("Print ID#tags"); printID3Tags(); } #if defined(HAVE_MMAP) |