aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Teirney <github@teirney.net>2012-05-06 02:54:28 -0700
committerDavid Teirney <github@teirney.net>2012-05-06 02:54:28 -0700
commitf962e40be801c3ba080e20a586ae4f12c2017b5c (patch)
treea3a8afee3dca2be8333365e2a3b9d4293c5357aa /lib
parent8476acd869d6a33fcf337fa4b2dc20ec01bdd06e (diff)
parent01cc2a7994061811a13a93716e44747c739c2ecc (diff)
Merge pull request #894 from dteirney/myth-0.25
Support for MythTV 0.25 in libcmyth
Diffstat (limited to 'lib')
-rw-r--r--lib/cmyth/include/cmyth/cmyth.h21
-rw-r--r--lib/cmyth/libcmyth/bookmark.c19
-rw-r--r--lib/cmyth/libcmyth/cmyth_local.h3
-rw-r--r--lib/cmyth/libcmyth/connection.c33
-rw-r--r--lib/cmyth/libcmyth/file.c31
-rw-r--r--lib/cmyth/libcmyth/proginfo.c63
-rw-r--r--lib/cmyth/libcmyth/proglist.c9
-rw-r--r--lib/cmyth/libcmyth/socket.c143
8 files changed, 269 insertions, 53 deletions
diff --git a/lib/cmyth/include/cmyth/cmyth.h b/lib/cmyth/include/cmyth/cmyth.h
index 52f2f680b0..d8cb364adb 100644
--- a/lib/cmyth/include/cmyth/cmyth.h
+++ b/lib/cmyth/include/cmyth/cmyth.h
@@ -749,6 +749,20 @@ extern char *cmyth_proginfo_subtitle(cmyth_proginfo_t prog);
extern char *cmyth_proginfo_description(cmyth_proginfo_t prog);
/**
+ * Retrieve the season of a program.
+ * \param prog proginfo handle
+ * \return season
+ */
+extern unsigned short cmyth_proginfo_season(cmyth_proginfo_t prog);
+
+/**
+ * Retrieve the episode of a program.
+ * \param prog proginfo handle
+ * \return episode
+ */
+extern unsigned short cmyth_proginfo_episode(cmyth_proginfo_t prog);
+
+/**
* Retrieve the category of a program.
* \param prog proginfo handle
* \return null-terminated string
@@ -805,6 +819,13 @@ extern char *cmyth_proginfo_seriesid(cmyth_proginfo_t prog);
extern char *cmyth_proginfo_programid(cmyth_proginfo_t prog);
/**
+ * Retrieve the inetref of a program.
+ * \param prog proginfo handle
+ * \return null-terminated string
+ */
+extern char *cmyth_proginfo_inetref(cmyth_proginfo_t prog);
+
+/**
* Retrieve the critics rating (number of stars) of a program.
* \param prog proginfo handle
* \return null-terminated string
diff --git a/lib/cmyth/libcmyth/bookmark.c b/lib/cmyth/libcmyth/bookmark.c
index af7580f740..4681c2105d 100644
--- a/lib/cmyth/libcmyth/bookmark.c
+++ b/lib/cmyth/libcmyth/bookmark.c
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <inttypes.h>
#include <errno.h>
#include <cmyth_local.h>
@@ -59,7 +60,7 @@ long long cmyth_get_bookmark(cmyth_conn_t conn, cmyth_proginfo_t prog)
}
if ((r=cmyth_rcv_long_long(conn, &err, &ll, count)) < 0) {
cmyth_dbg(CMYTH_DBG_ERROR,
- "%s: cmyth_rcv_longlong() failed (%d)\n",
+ "%s: cmyth_rcv_long_long() failed (%d)\n",
__FUNCTION__, r);
ret = err;
goto out;
@@ -74,7 +75,7 @@ long long cmyth_get_bookmark(cmyth_conn_t conn, cmyth_proginfo_t prog)
int cmyth_set_bookmark(cmyth_conn_t conn, cmyth_proginfo_t prog, long long bookmark)
{
char *buf;
- unsigned int len = CMYTH_TIMESTAMP_LEN + CMYTH_LONGLONG_LEN + 18;
+ unsigned int len = CMYTH_TIMESTAMP_LEN + CMYTH_LONGLONG_LEN * 2 + 18;
char resultstr[3];
int r,err;
int ret;
@@ -85,8 +86,18 @@ int cmyth_set_bookmark(cmyth_conn_t conn, cmyth_proginfo_t prog, long long bookm
if (!buf) {
return -ENOMEM;
}
- sprintf(buf,"%s %ld %s %lld %lld","SET_BOOKMARK",prog->proginfo_chanId,
- start_ts_dt, bookmark >> 32,(bookmark & 0xffffffff));
+ if (conn->conn_version >= 66) {
+ /*
+ * Since protocol 66 mythbackend expects a single 64 bit integer rather than two 32 bit
+ * hi and lo integers.
+ */
+ sprintf(buf, "SET_BOOKMARK %ld %s %"PRIu64, prog->proginfo_chanId,
+ start_ts_dt, (int64_t)bookmark);
+ }
+ else {
+ sprintf(buf, "SET_BOOKMARK %ld %s %d %d", prog->proginfo_chanId,
+ start_ts_dt, (int32_t)(bookmark >> 32), (int32_t)(bookmark & 0xffffffff));
+ }
pthread_mutex_lock(&mutex);
if ((err = cmyth_send_message(conn,buf)) < 0) {
cmyth_dbg(CMYTH_DBG_ERROR,
diff --git a/lib/cmyth/libcmyth/cmyth_local.h b/lib/cmyth/libcmyth/cmyth_local.h
index 40bed11182..f7b85fb3ca 100644
--- a/lib/cmyth/libcmyth/cmyth_local.h
+++ b/lib/cmyth/libcmyth/cmyth_local.h
@@ -224,6 +224,8 @@ struct cmyth_proginfo {
char *proginfo_title;
char *proginfo_subtitle;
char *proginfo_description;
+ unsigned short proginfo_season; /* new in V67 */
+ unsigned short proginfo_episode; /* new in V67 */
char *proginfo_category;
long proginfo_chanId;
char *proginfo_chanstr;
@@ -258,6 +260,7 @@ struct cmyth_proginfo {
char *proginfo_chan_output_filters; /* new in V8 */
char *proginfo_seriesid; /* new in V8 */
char *proginfo_programid; /* new in V12 */
+ char *proginfo_inetref; /* new in V67 */
cmyth_timestamp_t proginfo_lastmodified; /* new in V12 */
char *proginfo_stars; /* new in V12 */
cmyth_timestamp_t proginfo_originalairdate; /* new in V12 */
diff --git a/lib/cmyth/libcmyth/connection.c b/lib/cmyth/libcmyth/connection.c
index 9d5fb0d707..9d1372139c 100644
--- a/lib/cmyth/libcmyth/connection.c
+++ b/lib/cmyth/libcmyth/connection.c
@@ -56,6 +56,15 @@ static myth_protomap_t protomap[] = {
{62, "78B5631E"},
{63, "3875641D"},
{64, "8675309J"},
+ {65, "D2BB94C2"},
+ {66, "0C0FFEE0"},
+ {67, "0G0G0G0"},
+ {68, "90094EAD"},
+ {69, "63835135"},
+ {70, "53153836"},
+ {71, "05e82186"},
+ {72, "D78EFD6F"},
+ {73, "D7FE8D6F"},
{0, 0}
};
@@ -527,7 +536,7 @@ cmyth_conn_connect_file(cmyth_proginfo_t prog, cmyth_conn_t control,
int err = 0;
int count = 0;
int r;
- int ann_size = sizeof("ANN FileTransfer []:[][]:[]");
+ int ann_size = sizeof("ANN FileTransfer 0[]:[][]:[]");
cmyth_file_t ret = NULL;
if (!prog) {
@@ -575,6 +584,12 @@ cmyth_conn_connect_file(cmyth_proginfo_t prog, cmyth_conn_t control,
myth_host, prog->proginfo_port, buflen);
goto shut;
}
+ /*
+ * Explicitly set the conn version to the control version as cmyth_connect() doesn't and some of
+ * the cmyth_rcv_* functions expect it to be the same as the protocol version used by mythbackend.
+ */
+ conn->conn_version = control->conn_version;
+
ann_size += strlen(prog->proginfo_pathname) + strlen(my_hostname);
announcement = malloc(ann_size);
if (!announcement) {
@@ -584,7 +599,7 @@ cmyth_conn_connect_file(cmyth_proginfo_t prog, cmyth_conn_t control,
goto shut;
}
if (control->conn_version >= 44) {
- sprintf(announcement, "ANN FileTransfer %s[]:[]%s[]:[]",
+ sprintf(announcement, "ANN FileTransfer %s 0[]:[]%s[]:[]", // write = false
my_hostname, prog->proginfo_pathname);
}
else {
@@ -631,7 +646,7 @@ cmyth_conn_connect_file(cmyth_proginfo_t prog, cmyth_conn_t control,
r = cmyth_rcv_u_long_long(conn, &err, &ret->file_length, count);
if (err) {
cmyth_dbg(CMYTH_DBG_ERROR,
- "%s: (length) cmyth_rcv_longlong() failed (%d)\n",
+ "%s: (length) cmyth_rcv_u_long_long() failed (%d)\n",
__FUNCTION__, err);
goto shut;
}
@@ -683,7 +698,7 @@ cmyth_conn_connect_path(char* path, cmyth_conn_t control,
int err = 0;
int count = 0;
int r, port;
- int ann_size = sizeof("ANN FileTransfer []:[][]:[]");
+ int ann_size = sizeof("ANN FileTransfer 0[]:[][]:[]");
struct sockaddr_in addr;
socklen_t addr_size = sizeof(addr);
cmyth_file_t ret = NULL;
@@ -716,6 +731,12 @@ cmyth_conn_connect_path(char* path, cmyth_conn_t control,
__FUNCTION__, host, port, buflen);
goto shut;
}
+ /*
+ * Explicitly set the conn version to the control version as cmyth_connect() doesn't and some of
+ * the cmyth_rcv_* functions expect it to be the same as the protocol version used by mythbackend.
+ */
+ conn->conn_version = control->conn_version;
+
ann_size += strlen(path) + strlen(my_hostname);
announcement = malloc(ann_size);
if (!announcement) {
@@ -725,7 +746,7 @@ cmyth_conn_connect_path(char* path, cmyth_conn_t control,
goto shut;
}
if (control->conn_version >= 44) {
- sprintf(announcement, "ANN FileTransfer %s[]:[]%s[]:[]",
+ sprintf(announcement, "ANN FileTransfer %s 0[]:[]%s[]:[]", // write = false
my_hostname, path);
}
else {
@@ -771,7 +792,7 @@ cmyth_conn_connect_path(char* path, cmyth_conn_t control,
r = cmyth_rcv_u_long_long(conn, &err, &ret->file_length, count);
if (err) {
cmyth_dbg(CMYTH_DBG_ERROR,
- "%s: (length) cmyth_rcv_longlong() failed (%d)\n",
+ "%s: (length) cmyth_rcv_u_long_long() failed (%d)\n",
__FUNCTION__, err);
goto shut;
}
diff --git a/lib/cmyth/libcmyth/file.c b/lib/cmyth/libcmyth/file.c
index 74408ed0c9..640f29989a 100644
--- a/lib/cmyth/libcmyth/file.c
+++ b/lib/cmyth/libcmyth/file.c
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
+#include <inttypes.h>
#ifndef _MSC_VER
#include <sys/socket.h>
#endif
@@ -449,14 +450,28 @@ cmyth_file_seek(cmyth_file_t file, long long offset, int whence)
pthread_mutex_lock(&mutex);
- snprintf(msg, sizeof(msg),
- "QUERY_FILETRANSFER %ld[]:[]SEEK[]:[]%d[]:[]%d[]:[]%d[]:[]%d[]:[]%d",
- file->file_id,
- (int32_t)(offset >> 32),
- (int32_t)(offset & 0xffffffff),
- whence,
- (int32_t)(file->file_pos >> 32),
- (int32_t)(file->file_pos & 0xffffffff));
+ if (file->file_control->conn_version >= 66) {
+ /*
+ * Since protocol 66 mythbackend expects to receive a single 64 bit integer rather than
+ * two 32 bit hi and lo integers.
+ */
+ snprintf(msg, sizeof(msg),
+ "QUERY_FILETRANSFER %ld[]:[]SEEK[]:[]%"PRIu64"[]:[]%d[]:[]%"PRIu64,
+ file->file_id,
+ (int64_t)offset,
+ whence,
+ (int64_t)file->file_pos);
+ }
+ else {
+ snprintf(msg, sizeof(msg),
+ "QUERY_FILETRANSFER %ld[]:[]SEEK[]:[]%d[]:[]%d[]:[]%d[]:[]%d[]:[]%d",
+ file->file_id,
+ (int32_t)(offset >> 32),
+ (int32_t)(offset & 0xffffffff),
+ whence,
+ (int32_t)(file->file_pos >> 32),
+ (int32_t)(file->file_pos & 0xffffffff));
+ }
if ((err = cmyth_send_message(file->file_control, msg)) < 0) {
cmyth_dbg(CMYTH_DBG_ERROR,
diff --git a/lib/cmyth/libcmyth/proginfo.c b/lib/cmyth/libcmyth/proginfo.c
index b175637ca9..f6f93474ff 100644
--- a/lib/cmyth/libcmyth/proginfo.c
+++ b/lib/cmyth/libcmyth/proginfo.c
@@ -116,6 +116,9 @@ cmyth_proginfo_destroy(cmyth_proginfo_t p)
if (p->proginfo_programid) {
ref_release(p->proginfo_programid);
}
+ if (p->proginfo_inetref) {
+ ref_release(p->proginfo_inetref);
+ }
if (p->proginfo_stars) {
ref_release(p->proginfo_stars);
}
@@ -217,6 +220,8 @@ cmyth_proginfo_create(void)
ret->proginfo_title = NULL;
ret->proginfo_subtitle = NULL;
ret->proginfo_description = NULL;
+ ret->proginfo_season = 0;
+ ret->proginfo_episode = 0;
ret->proginfo_category = NULL;
ret->proginfo_chanId = 0;
ret->proginfo_chanstr = NULL;
@@ -250,6 +255,7 @@ cmyth_proginfo_create(void)
ret->proginfo_chan_output_filters = NULL;
ret->proginfo_seriesid = NULL;
ret->proginfo_programid = NULL;
+ ret->proginfo_inetref = NULL;
ret->proginfo_stars = NULL;
ret->proginfo_version = 12;
ret->proginfo_hasairdate = 0;
@@ -307,6 +313,8 @@ cmyth_proginfo_dup(cmyth_proginfo_t p)
ret->proginfo_title = ref_hold(p->proginfo_title);
ret->proginfo_subtitle = ref_hold(p->proginfo_subtitle);
ret->proginfo_description = ref_hold(p->proginfo_description);
+ ret->proginfo_season = p->proginfo_season;
+ ret->proginfo_episode = p->proginfo_episode;
ret->proginfo_category = ref_hold(p->proginfo_category);
ret->proginfo_chanId = p->proginfo_chanId;
ret->proginfo_chanstr = ref_hold(p->proginfo_chanstr);
@@ -340,6 +348,7 @@ cmyth_proginfo_dup(cmyth_proginfo_t p)
ret->proginfo_chan_output_filters = ref_hold(p->proginfo_chan_output_filters);
ret->proginfo_seriesid = ref_hold(p->proginfo_seriesid);
ret->proginfo_programid = ref_hold(p->proginfo_programid);
+ ret->proginfo_inetref = ref_hold(p->proginfo_inetref);
ret->proginfo_stars = ref_hold(p->proginfo_stars);
ret->proginfo_version = p->proginfo_version;
ret->proginfo_hasairdate = p->proginfo_hasairdate;
@@ -386,7 +395,7 @@ delete_command(cmyth_conn_t control, cmyth_proginfo_t prog, char *cmd)
char *buf;
unsigned int len = ((2 * CMYTH_LONGLONG_LEN) +
(6 * CMYTH_TIMESTAMP_LEN) +
- (14 * CMYTH_LONG_LEN));
+ (16 * CMYTH_LONG_LEN));
char start_ts[CMYTH_TIMESTAMP_LEN + 1];
char end_ts[CMYTH_TIMESTAMP_LEN + 1];
char rec_start_ts[CMYTH_TIMESTAMP_LEN + 1];
@@ -415,8 +424,12 @@ delete_command(cmyth_conn_t control, cmyth_proginfo_t prog, char *cmd)
len += strlen(S(prog->proginfo_url));
len += strlen(S(prog->proginfo_hostname));
len += strlen(S(prog->proginfo_playgroup));
+ len += strlen(S(prog->proginfo_seriesid));
+ len += strlen(S(prog->proginfo_programid));
+ len += strlen(S(prog->proginfo_inetref));
len += strlen(S(prog->proginfo_recpriority_2));
len += strlen(S(prog->proginfo_storagegroup));
+ len += strlen(S(prog->proginfo_prodyear));
buf = alloca(len + 1+2048);
if (!buf) {
@@ -462,6 +475,10 @@ delete_command(cmyth_conn_t control, cmyth_proginfo_t prog, char *cmd)
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_title));
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_subtitle));
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_description));
+ if (control->conn_version >= 67) {
+ sprintf(buf + strlen(buf), "%u[]:[]", prog->proginfo_season);
+ sprintf(buf + strlen(buf), "%u[]:[]", prog->proginfo_episode);
+ }
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_category));
sprintf(buf + strlen(buf), "%ld[]:[]", prog->proginfo_chanId);
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_chanstr));
@@ -504,6 +521,9 @@ delete_command(cmyth_conn_t control, cmyth_proginfo_t prog, char *cmd)
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_chan_output_filters));
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_seriesid));
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_programid));
+ if (control->conn_version >= 67) {
+ sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_inetref));
+ }
sprintf(buf + strlen(buf), "%s[]:[]", lastmodified);
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_stars));
sprintf(buf + strlen(buf), "%s[]:[]", originalairdate);
@@ -773,6 +793,24 @@ cmyth_proginfo_description(cmyth_proginfo_t prog)
return ref_hold(prog->proginfo_description);
}
+unsigned short
+cmyth_proginfo_season(cmyth_proginfo_t prog)
+{
+ if (!prog) {
+ return 0;
+ }
+ return prog->proginfo_season;
+}
+
+unsigned short
+cmyth_proginfo_episode(cmyth_proginfo_t prog)
+{
+ if (!prog) {
+ return 0;
+ }
+ return prog->proginfo_episode;
+}
+
/*
* cmyth_proginfo_category(cmyth_proginfo_t prog)
*
@@ -827,6 +865,17 @@ cmyth_proginfo_programid(cmyth_proginfo_t prog)
}
char *
+cmyth_proginfo_inetref(cmyth_proginfo_t prog)
+{
+ if (!prog) {
+ cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL inetref\n",
+ __FUNCTION__);
+ return NULL;
+ }
+ return ref_hold(prog->proginfo_inetref);
+}
+
+char *
cmyth_proginfo_stars(cmyth_proginfo_t prog)
{
if (!prog) {
@@ -1260,7 +1309,7 @@ fill_command(cmyth_conn_t control, cmyth_proginfo_t prog, char *cmd)
char *buf;
unsigned int len = ((2 * CMYTH_LONGLONG_LEN) +
(6 * CMYTH_TIMESTAMP_LEN) +
- (14 * CMYTH_LONG_LEN));
+ (16 * CMYTH_LONG_LEN));
char start_ts[CMYTH_TIMESTAMP_LEN + 1];
char end_ts[CMYTH_TIMESTAMP_LEN + 1];
char rec_start_ts[CMYTH_TIMESTAMP_LEN + 1];
@@ -1288,6 +1337,9 @@ fill_command(cmyth_conn_t control, cmyth_proginfo_t prog, char *cmd)
len += strlen(S(prog->proginfo_url));
len += strlen(S(prog->proginfo_hostname));
len += strlen(S(prog->proginfo_playgroup));
+ len += strlen(S(prog->proginfo_seriesid));
+ len += strlen(S(prog->proginfo_programid));
+ len += strlen(S(prog->proginfo_inetref));
len += strlen(S(prog->proginfo_recpriority_2));
len += strlen(S(prog->proginfo_storagegroup));
len += strlen(S(prog->proginfo_prodyear));
@@ -1336,6 +1388,10 @@ fill_command(cmyth_conn_t control, cmyth_proginfo_t prog, char *cmd)
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_title));
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_subtitle));
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_description));
+ if (control->conn_version >= 67) {
+ sprintf(buf + strlen(buf), "%u[]:[]", prog->proginfo_season);
+ sprintf(buf + strlen(buf), "%u[]:[]", prog->proginfo_episode);
+ }
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_category));
sprintf(buf + strlen(buf), "%ld[]:[]", prog->proginfo_chanId);
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_chanstr));
@@ -1378,6 +1434,9 @@ fill_command(cmyth_conn_t control, cmyth_proginfo_t prog, char *cmd)
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_chan_output_filters));
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_seriesid));
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_programid));
+ if (control->conn_version >= 67) {
+ sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_inetref));
+ }
sprintf(buf + strlen(buf), "%s[]:[]", lastmodified);
sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_stars));
sprintf(buf + strlen(buf), "%s[]:[]", originalairdate);
diff --git a/lib/cmyth/libcmyth/proglist.c b/lib/cmyth/libcmyth/proglist.c
index 28e742c30f..fe7557728c 100644
--- a/lib/cmyth/libcmyth/proglist.c
+++ b/lib/cmyth/libcmyth/proglist.c
@@ -315,6 +315,7 @@ cmyth_proglist_get_list(cmyth_conn_t conn,
cmyth_proglist_t
cmyth_proglist_get_all_recorded(cmyth_conn_t control)
{
+ char query[32];
cmyth_proglist_t proglist = cmyth_proglist_create();
if (proglist == NULL) {
@@ -324,8 +325,14 @@ cmyth_proglist_get_all_recorded(cmyth_conn_t control)
return NULL;
}
+ if (control->conn_version < 65) {
+ strcpy(query, "QUERY_RECORDINGS Play");
+ }
+ else {
+ strcpy(query, "QUERY_RECORDINGS Ascending");
+ }
if (cmyth_proglist_get_list(control, proglist,
- "QUERY_RECORDINGS Play",
+ query,
__FUNCTION__) < 0) {
cmyth_dbg(CMYTH_DBG_ERROR,
"%s: cmyth_proglist_get_list() failed\n",
diff --git a/lib/cmyth/libcmyth/socket.c b/lib/cmyth/libcmyth/socket.c
index f1f9a455fa..552b88d696 100644
--- a/lib/cmyth/libcmyth/socket.c
+++ b/lib/cmyth/libcmyth/socket.c
@@ -882,23 +882,38 @@ cmyth_rcv_long_long(cmyth_conn_t conn, int *err, long long *buf, int count)
*err = EINVAL;
return 0;
}
- consumed = cmyth_rcv_u_long(conn, err, &hi, count);
- if (*err) {
- cmyth_dbg(CMYTH_DBG_ERROR,
- "%s: cmyth_rcv_long_long() failed (%d)\n",
- __FUNCTION__, consumed);
- return consumed;
+
+ if (conn->conn_version >= 66) {
+ /*
+ * Since protocol 66 mythbackend now sends a single 64 bit integer rather than two hi and lo
+ * 32 bit integers for ALL 64 bit values.
+ */
+ consumed = cmyth_rcv_int64(conn, err, &val, count);
+ if (*err) {
+ cmyth_dbg(CMYTH_DBG_ERROR,
+ "%s: cmyth_rcv_int64() failed (%d)\n",
+ __FUNCTION__, consumed);
+ return consumed;
+ }
}
- consumed += cmyth_rcv_u_long(conn, err, &lo, count-consumed);
- if (*err) {
- cmyth_dbg(CMYTH_DBG_ERROR,
- "%s: cmyth_rcv_long_long() failed (%d)\n",
- __FUNCTION__, consumed);
- return consumed;
+ else {
+ consumed = cmyth_rcv_u_long(conn, err, &hi, count);
+ if (*err) {
+ cmyth_dbg(CMYTH_DBG_ERROR,
+ "%s: cmyth_rcv_u_long_long() failed (%d)\n",
+ __FUNCTION__, consumed);
+ return consumed;
+ }
+ consumed += cmyth_rcv_u_long(conn, err, &lo, count-consumed);
+ if (*err) {
+ cmyth_dbg(CMYTH_DBG_ERROR,
+ "%s: cmyth_rcv_u_long_long() failed (%d)\n",
+ __FUNCTION__, consumed);
+ return consumed;
+ }
+ val = (((long long)hi) << 32) | ((long long)(lo & 0xFFFFFFFF));
}
- val = (((long long)hi) << 32) | ((long long)(lo & 0xFFFFFFFF));
-
*err = 0;
*buf = val;
@@ -1172,6 +1187,7 @@ cmyth_rcv_ulong_long(cmyth_conn_t conn, int *err,
unsigned long long *buf, int count)
{
unsigned long long val;
+ long long val64;
unsigned long hi, lo;
int consumed;
int tmp;
@@ -1186,23 +1202,45 @@ cmyth_rcv_ulong_long(cmyth_conn_t conn, int *err,
*err = EINVAL;
return 0;
}
- consumed = cmyth_rcv_u_long(conn, err, &hi, count);
- if (*err) {
- cmyth_dbg(CMYTH_DBG_ERROR,
- "%s: cmyth_rcv_ulong_long() failed (%d)\n",
- __FUNCTION__, consumed);
- return consumed;
+
+ if (conn->conn_version >= 66) {
+ /*
+ * Since protocol 66 mythbackend now sends a single 64 bit integer rather than two hi and lo
+ * 32 bit integers for ALL 64 bit values.
+ */
+ consumed = cmyth_rcv_int64(conn, err, &val64, count);
+ if (*err) {
+ cmyth_dbg(CMYTH_DBG_ERROR,
+ "%s: cmyth_rcv_int64() failed (%d)\n",
+ __FUNCTION__, consumed);
+ return consumed;
+ }
+ if (val64 < 0) {
+ cmyth_dbg(CMYTH_DBG_ERROR,
+ "%s: cmyth_rcv_int64() failed as signed 64 bit integer received\n",
+ __FUNCTION__, consumed);
+ *err = EINVAL;
+ return consumed;
+ }
+ val = (unsigned long long)val64;
}
- consumed += cmyth_rcv_u_long(conn, err, &lo, count);
- if (*err) {
- cmyth_dbg(CMYTH_DBG_ERROR,
- "%s: cmyth_rcv_ulong_long() failed (%d)\n",
- __FUNCTION__, consumed);
- return consumed;
+ else {
+ consumed = cmyth_rcv_u_long(conn, err, &hi, count);
+ if (*err) {
+ cmyth_dbg(CMYTH_DBG_ERROR,
+ "%s: cmyth_rcv_u_long_long() failed (%d)\n",
+ __FUNCTION__, consumed);
+ return consumed;
+ }
+ consumed += cmyth_rcv_u_long(conn, err, &lo, count);
+ if (*err) {
+ cmyth_dbg(CMYTH_DBG_ERROR,
+ "%s: cmyth_rcv_u_long_long() failed (%d)\n",
+ __FUNCTION__, consumed);
+ return consumed;
+ }
+ val = (((unsigned long long)hi) << 32) | ((unsigned long long)(lo & 0xFFFFFFFF));
}
-
- val = (((unsigned long long)hi) << 32) | ((unsigned long long)(lo & 0xFFFFFFFF));
-
*err = 0;
*buf = val;
@@ -1485,7 +1523,8 @@ cmyth_rcv_proginfo(cmyth_conn_t conn, int *err, cmyth_proginfo_t buf,
if (buf->proginfo_version >= 57) {
/*
- * Myth now sends a single 64bit int, rather than 2 32bit ints
+ * Since protocol 57 mythbackend now sends a single 64 bit integer rather than two 32 bit
+ * hi and lo integers for the proginfo length.
*/
rcv_64 = &cmyth_rcv_int64;
} else {
@@ -1536,6 +1575,29 @@ cmyth_rcv_proginfo(cmyth_conn_t conn, int *err, cmyth_proginfo_t buf,
ref_release(buf->proginfo_description);
buf->proginfo_description = ref_strdup(tmp_str);
+ if (buf->proginfo_version >= 67) {
+ /*
+ * Get season and episode (unsigned int)
+ */
+ consumed = cmyth_rcv_ushort(conn, err,
+ &buf->proginfo_season, count);
+ count -= consumed;
+ total += consumed;
+ if (*err) {
+ failed = "cmyth_rcv_ushort";
+ goto fail;
+ }
+
+ consumed = cmyth_rcv_ushort(conn, err,
+ &buf->proginfo_episode, count);
+ count -= consumed;
+ total += consumed;
+ if (*err) {
+ failed = "cmyth_rcv_ushort";
+ goto fail;
+ }
+ }
+
/*
* Get proginfo_category (string)
*/
@@ -1649,7 +1711,7 @@ cmyth_rcv_proginfo(cmyth_conn_t conn, int *err, cmyth_proginfo_t buf,
count -= consumed;
total += consumed;
if (*err) {
- failed = "cmyth_rcv_long_long";
+ failed = "rcv_64";
goto fail;
}
@@ -2013,7 +2075,7 @@ cmyth_rcv_proginfo(cmyth_conn_t conn, int *err, cmyth_proginfo_t buf,
count -= consumed;
total += consumed;
if (*err) {
- failed = "cmyth_rcv_timestamp";
+ failed = "cmyth_rcv_string";
goto fail;
}
if (buf->proginfo_programid)
@@ -2021,6 +2083,23 @@ cmyth_rcv_proginfo(cmyth_conn_t conn, int *err, cmyth_proginfo_t buf,
buf->proginfo_programid = ref_strdup(tmp_str);
}
+ if (buf->proginfo_version >= 67) {
+ /*
+ * Get inetref (string)
+ */
+ consumed = cmyth_rcv_string(conn, err, tmp_str,
+ sizeof(tmp_str) - 1, count);
+ count -= consumed;
+ total += consumed;
+ if (*err) {
+ failed = "cmyth_rcv_string";
+ goto fail;
+ }
+ if (buf->proginfo_inetref)
+ ref_release(buf->proginfo_inetref);
+ buf->proginfo_inetref = ref_strdup(tmp_str);
+ }
+
if (buf->proginfo_version >= 12) {
/*
* Get lastmodified (string)