summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmad/libmadplugin.cpp64
-rw-r--r--core/multimedia/opieplayer/libmad/libmadplugin.h2
2 files changed, 65 insertions, 1 deletions
diff --git a/core/multimedia/opieplayer/libmad/libmadplugin.cpp b/core/multimedia/opieplayer/libmad/libmadplugin.cpp
index 7bb6541..6793773 100644
--- a/core/multimedia/opieplayer/libmad/libmadplugin.cpp
+++ b/core/multimedia/opieplayer/libmad/libmadplugin.cpp
@@ -169,4 +169,5 @@ bool LibMadPlugin::isFileSupported( const QString& path ) {
return TRUE;
}
+
// UGLY - just for fast testing
if ( path.left(4) == "http") {
@@ -174,9 +175,70 @@ bool LibMadPlugin::isFileSupported( const QString& path ) {
}
-
return FALSE;
}
+
+int LibMadPlugin::is_address_multicast(unsigned long address) {
+ if ((address & 255) >= 224 && (address & 255) <= 239)
+ return (1);
+ return (0);
+}
+
+
+int LibMadPlugin::udp_open(char *address, int port) {
+
+ int enable = 1L;
+ struct sockaddr_in stAddr;
+ struct sockaddr_in stLclAddr;
+ struct ip_mreq stMreq;
+ struct hostent *host;
+ int sock;
+
+ 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]);
+
+ /* Create a UDP socket */
+ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ return (0);
+
+ /* Allow multiple instance of the client to share the same address and port */
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&enable, sizeof(unsigned long int)) < 0)
+ return (0);
+
+ /* If the address is multicast, register to the multicast group */
+ if (is_address_multicast(stAddr.sin_addr.s_addr))
+ {
+ /* Bind the socket to port */
+ stLclAddr.sin_family = AF_INET;
+ stLclAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+ stLclAddr.sin_port = stAddr.sin_port;
+ if (bind(sock, (struct sockaddr *)&stLclAddr, sizeof(stLclAddr)) < 0)
+ return (0);
+
+ /* Register to a multicast address */
+ stMreq.imr_multiaddr.s_addr = stAddr.sin_addr.s_addr;
+ stMreq.imr_interface.s_addr = INADDR_ANY;
+ if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&stMreq, sizeof(stMreq)) < 0)
+ return (0);
+ }
+ else
+ {
+ /* Bind the socket to port */
+ stLclAddr.sin_family = AF_INET;
+ stLclAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+ stLclAddr.sin_port = htons(0);
+ if (bind(sock, (struct sockaddr *)&stLclAddr, sizeof(stLclAddr)) < 0)
+ return (0);
+ }
+
+ return (sock);
+}
+
int LibMadPlugin::tcp_open(char *address, int port) {
struct sockaddr_in stAddr;
diff --git a/core/multimedia/opieplayer/libmad/libmadplugin.h b/core/multimedia/opieplayer/libmad/libmadplugin.h
index ee1ca9d..6747712 100644
--- a/core/multimedia/opieplayer/libmad/libmadplugin.h
+++ b/core/multimedia/opieplayer/libmad/libmadplugin.h
@@ -103,4 +103,6 @@ public:
private:
+ int is_address_multicast(unsigned long address);
+ int udp_open(char *address, int port);
int tcp_open(char *address, int port);
int http_read_line(int tcp_sock, char *buf, int size) ;