cmyth_event_t cmyth_event_get_message(cmyth_conn_t conn, char * data, int32_t len, cmyth_proginfo_t * prog) { int count, err, consumed; char tmp[1024]; cmyth_event_t event; cmyth_proginfo_t proginfo = NULL; if (conn == NULL) return CMYTH_EVENT_UNKNOWN; if ((count = cmyth_rcv_length(conn)) <= 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_length() failed (%d)\n", __FUNCTION__, count); return CMYTH_EVENT_CLOSE; } data[0] = 0; consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); count -= consumed; if (strcmp(tmp, "BACKEND_MESSAGE") != 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_string() failed (%d)\n", __FUNCTION__, count); event = CMYTH_EVENT_UNKNOWN; goto out; } consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); count -= consumed; /* * RECORDING_LIST_CHANGE */ if (strcmp(tmp, "RECORDING_LIST_CHANGE") == 0) { event = CMYTH_EVENT_RECORDING_LIST_CHANGE; } /* * RECORDING_LIST_CHANGE ADD */ else if (strncmp(tmp, "RECORDING_LIST_CHANGE ADD", 25) == 0) { event = CMYTH_EVENT_RECORDING_LIST_CHANGE_ADD; strncpy(data, tmp + 26, len); } /* * RECORDING_LIST_CHANGE UPDATE */ else if (strcmp(tmp, "RECORDING_LIST_CHANGE UPDATE") == 0) { event = CMYTH_EVENT_RECORDING_LIST_CHANGE_UPDATE; proginfo = cmyth_proginfo_create(); if (!proginfo) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_proginfo_create() failed\n", __FUNCTION__); event = CMYTH_EVENT_UNKNOWN; goto out; } consumed = cmyth_rcv_proginfo(conn, &err, proginfo, count); count -= consumed; *prog = proginfo; } /* * RECORDING_LIST_CHANGE DELETE */ else if (strncmp(tmp, "RECORDING_LIST_CHANGE DELETE", 28) == 0) { event = CMYTH_EVENT_RECORDING_LIST_CHANGE_DELETE; strncpy(data, tmp + 29, len); } /* * SCHEDULE_CHANGE */ else if (strcmp(tmp, "SCHEDULE_CHANGE") == 0) { event = CMYTH_EVENT_SCHEDULE_CHANGE; } /* * DONE_RECORDING */ else if (strncmp(tmp, "DONE_RECORDING", 14) == 0) { event = CMYTH_EVENT_DONE_RECORDING; strncpy(data, tmp + 15, len); } /* * QUIT_LIVETV */ else if (strncmp(tmp, "QUIT_LIVETV", 11) == 0) { event = CMYTH_EVENT_QUIT_LIVETV; } /* * LIVETV_WATCH */ else if (strncmp(tmp, "LIVETV_WATCH", 12) == 0) { event = CMYTH_EVENT_LIVETV_WATCH; strncpy(data, tmp + 13, len); } /* * LIVETV_CHAIN UPDATE */ else if (strncmp(tmp, "LIVETV_CHAIN UPDATE", 19) == 0) { event = CMYTH_EVENT_LIVETV_CHAIN_UPDATE; strncpy(data, tmp + 20, len); } /* * SIGNAL */ else if (strncmp(tmp, "SIGNAL", 6) == 0) { int32_t dstlen = len; event = CMYTH_EVENT_SIGNAL; /*Get Recorder ID */ strncat(data, "cardid ", 7); strncat(data, tmp + 7, consumed - 12); strncat(data, ";", 2); /* get slock, signal, seen_pat, matching_pat */ while (count > 0) { /* get signalmonitorvalue name */ consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); count -= consumed; /*strncat(data,tmp,dstlen-2); strncat(data,"=",2); dstlen -= consumed;*/ /* get signalmonitorvalue status */ consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); count -= consumed; strncat(data,tmp,dstlen-2); strncat(data,";",2); dstlen -= consumed; } } /* * ASK_RECORDING */ else if (strncmp(tmp, "ASK_RECORDING", 13) == 0) { event = CMYTH_EVENT_ASK_RECORDING; strncpy(data, tmp + 14, len); if (cmyth_conn_get_protocol_version(conn) >= 37) { proginfo = cmyth_proginfo_create(); if (!proginfo) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_proginfo_create() failed\n", __FUNCTION__); event = CMYTH_EVENT_UNKNOWN; goto out; } consumed = cmyth_rcv_proginfo(conn, &err, proginfo, count); count -= consumed; *prog = proginfo; } } /* * CLEAR_SETTINGS_CACHE */ else if (strncmp(tmp, "CLEAR_SETTINGS_CACHE", 20) == 0) { event = CMYTH_EVENT_CLEAR_SETTINGS_CACHE; } /* * GENERATED_PIXMAP */ else if (strncmp(tmp, "GENERATED_PIXMAP", 16) == 0) { /* capture the file which a pixmap has been generated for */ event = CMYTH_EVENT_GENERATED_PIXMAP; consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); count -= consumed; if (strncmp(tmp, "OK", 2) == 0) { /* receive <chanid_timestamp (isoformat)> */ consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); count -= consumed; strncpy(data, tmp, len); } } /* * SYSTEM_EVENT */ else if (strncmp(tmp, "SYSTEM_EVENT", 12) == 0) { event = CMYTH_EVENT_SYSTEM_EVENT; strncpy(data, tmp + 13, len); } /* * UPDATE_FILE_SIZE */ else if (strncmp(tmp, "UPDATE_FILE_SIZE", 16) == 0) { event = CMYTH_EVENT_UPDATE_FILE_SIZE; strncpy(data, tmp + 17, len); } /* * Unknown message */ else { cmyth_dbg(CMYTH_DBG_INFO, "%s: unknown BACKEND_MESSAGE '%s'\n", __FUNCTION__, tmp); event = CMYTH_EVENT_UNKNOWN; } out: while(count > 0 && err == 0) { consumed = cmyth_rcv_data(conn, &err, tmp, sizeof(tmp) - 1, count); cmyth_dbg(CMYTH_DBG_DEBUG, "%s: leftover data: count %i, read %i, errno %i\n", __FUNCTION__, count, consumed, err); count -= consumed; } return event; }
/* * cmyth_recorder_get_duration_map() * * Scope: PUBLIC * * Description * * Request a list of {keynum, duration} pairs starting at keynum * 'start' and ending with keynum 'end' from the current recording on * recorder 'rec'. * * Return Value: * * Success: A non-NULL, held cmyth_posmap_t * Failure: A NULL pointer */ cmyth_posmap_t cmyth_recorder_get_duration_map(cmyth_recorder_t rec, uint32_t start, uint32_t end) { int err, count, consumed; cmyth_posmap_t ret = NULL; char msg[256]; char tmp[1024]; if (!rec || !rec->rec_conn) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); return NULL; } pthread_mutex_lock(&rec->rec_conn->conn_mutex); if (rec->rec_conn->conn_version >= 77) { snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]FILL_DURATION_MAP[]:[]%"PRIu32"[]:[]%"PRIu32, rec->rec_id, start, end); if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); goto fail; } count = cmyth_rcv_length(rec->rec_conn); if (count < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_length() failed (%d)\n", __FUNCTION__, count); goto fail; } ret = cmyth_posmap_create(); if (ret == NULL) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_posmap_create() failed\n", __FUNCTION__); goto fail; } if (count > 2) { consumed = cmyth_rcv_posmap(rec->rec_conn, &err, ret, count); count -= consumed; if (err) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_posmap() failed (%d)\n", __FUNCTION__, err); ref_release(ret); ret = NULL; } } err = 0; while(count > 0 && err == 0) { consumed = cmyth_rcv_data(rec->rec_conn, &err, (unsigned char*)tmp, sizeof(tmp) - 1, count); cmyth_dbg(CMYTH_DBG_ERROR, "%s: leftover data: count %i, read %i, errno %i\n", __FUNCTION__, count, consumed, err); count -= consumed; } } fail: pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; }