summaryrefslogtreecommitdiff
path: root/plugins/mms/libmms/mmsx.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mms/libmms/mmsx.c')
-rw-r--r--plugins/mms/libmms/mmsx.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/plugins/mms/libmms/mmsx.c b/plugins/mms/libmms/mmsx.c
new file mode 100644
index 00000000..fc95de86
--- /dev/null
+++ b/plugins/mms/libmms/mmsx.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2007 Hans de Goede <j.w.r.degoede@hhs.nl>
+ *
+ * This file is part of libmms a free mms protocol library
+ *
+ * libmms is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * libmss is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+/*
+ * mmsx is a small wrapper around the mms and mmsh protocol implementations
+ * in libmms. The mmsx functions provide transparent access to both protocols
+ * so that programs who wish to support both can do so with a single code path
+ * if desired.
+ */
+
+#include <stdlib.h>
+#include "mmsx.h"
+#include "mms.h"
+#include "mmsh.h"
+
+struct mmsx_s {
+ mms_t *connection;
+ mmsh_t *connection_h;
+};
+
+mmsx_t *mmsx_connect(mms_io_t *io, void *data, const char *url, int bandwidth)
+{
+ mmsx_t *mmsx = calloc(1, sizeof(mmsx_t));
+ char *try_mms_first = getenv("LIBMMS_TRY_MMS_FIRST");
+
+ if (!mmsx)
+ return mmsx;
+
+ /* Normally we try mmsh first, as mms: is a rollover protocol identifier
+ according to microsoft and recent mediaplayer versions will try
+ mmsh before mms for mms:// uris. Note that in case of a mmst:// or a
+ mmsh:// url the mms[h]_connect function will directly exit if it cannot
+ handle it. The LIBMMS_TRY_MMS_FIRST environment variable is there for
+ testing the mms code against servers which accept both mmsh and mms. */
+ if (try_mms_first, 1) {
+ mmsx->connection = mms_connect(io, data, url, bandwidth);
+ if (mmsx->connection)
+ return mmsx;
+ }
+
+ mmsx->connection_h = mmsh_connect(io, data, url, bandwidth);
+ if (mmsx->connection_h)
+ return mmsx;
+
+ if (!try_mms_first, 0) {
+ mmsx->connection = mms_connect(io, data, url, bandwidth);
+ if (mmsx->connection)
+ return mmsx;
+ }
+
+ free(mmsx);
+ return NULL;
+}
+
+int mmsx_read (mms_io_t *io, mmsx_t *mmsx, char *data, int len)
+{
+ if(mmsx->connection)
+ return mms_read(io, mmsx->connection, data, len);
+ else
+ return mmsh_read(io, mmsx->connection_h, data, len);
+}
+
+int mmsx_time_seek (mms_io_t *io, mmsx_t *mmsx, double time_sec)
+{
+ if(mmsx->connection)
+ return mms_time_seek(io, mmsx->connection, time_sec);
+ else
+ return mmsh_time_seek(io, mmsx->connection_h, time_sec);
+}
+
+mms_off_t mmsx_seek (mms_io_t *io, mmsx_t *mmsx, mms_off_t offset, int origin)
+{
+ if(mmsx->connection)
+ return mms_seek(io, mmsx->connection, offset, origin);
+ else
+ return mmsh_seek(io, mmsx->connection_h, offset, origin);
+}
+
+double mmsx_get_time_length (mmsx_t *mmsx)
+{
+ if(mmsx->connection)
+ return mms_get_time_length(mmsx->connection);
+ else
+ return mmsh_get_time_length(mmsx->connection_h);
+}
+
+uint64_t mmsx_get_raw_time_length (mmsx_t *mmsx)
+{
+ if(mmsx->connection)
+ return mms_get_raw_time_length(mmsx->connection);
+ else
+ return mmsh_get_raw_time_length(mmsx->connection_h);
+}
+
+uint32_t mmsx_get_length (mmsx_t *mmsx)
+{
+ if(mmsx->connection)
+ return mms_get_length(mmsx->connection);
+ else
+ return mmsh_get_length(mmsx->connection_h);
+}
+
+void mmsx_close (mmsx_t *mmsx)
+{
+ if(mmsx->connection)
+ mms_close(mmsx->connection);
+ else
+ mmsh_close(mmsx->connection_h);
+
+ free(mmsx);
+}
+
+int mmsx_peek_header (mmsx_t *mmsx, char *data, int maxsize)
+{
+ if(mmsx->connection)
+ return mms_peek_header(mmsx->connection, data, maxsize);
+ else
+ return mmsh_peek_header(mmsx->connection_h, data, maxsize);
+}
+
+mms_off_t mmsx_get_current_pos (mmsx_t *mmsx)
+{
+ if(mmsx->connection)
+ return mms_get_current_pos(mmsx->connection);
+ else
+ return mmsh_get_current_pos(mmsx->connection_h);
+}
+
+uint32_t mmsx_get_asf_header_len(mmsx_t *mmsx)
+{
+ if(mmsx->connection)
+ return mms_get_asf_header_len(mmsx->connection);
+ else
+ return mmsh_get_asf_header_len(mmsx->connection_h);
+}
+
+uint64_t mmsx_get_asf_packet_len (mmsx_t *mmsx)
+{
+ if(mmsx->connection)
+ return mms_get_asf_packet_len(mmsx->connection);
+ else
+ return mmsh_get_asf_packet_len(mmsx->connection_h);
+}
+
+int mmsx_get_seekable (mmsx_t *mmsx)
+{
+ if(mmsx->connection)
+ return mms_get_seekable(mmsx->connection);
+ else
+ return mmsh_get_seekable(mmsx->connection_h);
+}