Work on settings properties on nodes from UI
This commit is contained in:
parent
302319220a
commit
a6433e4a37
12 changed files with 218 additions and 138 deletions
1
Makefile
1
Makefile
|
@ -64,6 +64,7 @@ endif
|
|||
#
|
||||
SRCS = src/main.c \
|
||||
src/idnode.c \
|
||||
src/prop.c \
|
||||
src/utils.c \
|
||||
src/wrappers.c \
|
||||
src/version.c \
|
||||
|
|
|
@ -58,13 +58,18 @@ static struct strtab muxfestatustab[] = {
|
|||
|
||||
|
||||
|
||||
static htsmsg_t *dvb_mux_serialize(struct idnode *self, int full);
|
||||
static idnode_t **dvb_mux_get_childs(struct idnode *self);
|
||||
static const char *dvb_mux_get_title(struct idnode *self);
|
||||
|
||||
static const idclass_t dvb_mux_class = {
|
||||
.ic_class = "dvbmux",
|
||||
.ic_serialize = dvb_mux_serialize,
|
||||
.ic_get_title = dvb_mux_get_title,
|
||||
.ic_get_childs = dvb_mux_get_childs,
|
||||
.ic_properties = {
|
||||
{
|
||||
"enabled", "Enabled", PT_BOOL,
|
||||
offsetof(dvb_mux_t, dm_enabled)
|
||||
}, {}}
|
||||
};
|
||||
|
||||
|
||||
|
@ -1244,14 +1249,10 @@ dvb_subscription_create_from_tdmi(th_dvb_mux_instance_t *tdmi,
|
|||
/**
|
||||
*
|
||||
*/
|
||||
static htsmsg_t *
|
||||
dvb_mux_serialize(struct idnode *self, int full)
|
||||
static const char *
|
||||
dvb_mux_get_title(struct idnode *self)
|
||||
{
|
||||
dvb_mux_t *dm = (dvb_mux_t *)self;
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
htsmsg_add_str(m, "id", idnode_uuid_as_str(&dm->dm_id));
|
||||
htsmsg_add_str(m, "text", dvb_mux_nicename(dm));
|
||||
return m;
|
||||
return dvb_mux_nicename((dvb_mux_t *)self);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -27,13 +27,23 @@
|
|||
|
||||
struct dvb_network_list dvb_networks;
|
||||
|
||||
static htsmsg_t *dvb_network_serialize(struct idnode *self, int full);
|
||||
static idnode_t **dvb_network_get_childs(struct idnode *self);
|
||||
|
||||
static const idclass_t dvb_network_class = {
|
||||
.ic_class = "dvbnetwork",
|
||||
.ic_serialize = dvb_network_serialize,
|
||||
.ic_get_childs = dvb_network_get_childs,
|
||||
.ic_properties = {
|
||||
{
|
||||
"autodiscovery", "Auto discovery", PT_BOOL,
|
||||
offsetof(dvb_network_t, dn_autodiscovery)
|
||||
}, {
|
||||
"nitoid", "NIT OID", PT_INT,
|
||||
offsetof(dvb_network_t, dn_nitoid)
|
||||
}, {
|
||||
"disable_pmt_monitor", "Disable PMT monitor", PT_BOOL,
|
||||
offsetof(dvb_network_t, dn_disable_pmt_monitor)
|
||||
}, {
|
||||
}},
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -42,15 +52,12 @@ static const idclass_t dvb_network_class = {
|
|||
dvb_network_t *
|
||||
dvb_network_create(int fe_type, const char *uuid)
|
||||
{
|
||||
printf("Creating network %s\n", uuid);
|
||||
dvb_network_t *dn = calloc(1, sizeof(dvb_network_t));
|
||||
if(idnode_insert(&dn->dn_id, uuid, &dvb_network_class)) {
|
||||
free(dn);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
printf("Added network %s\n", idnode_uuid_as_str(&dn->dn_id));
|
||||
|
||||
dn->dn_fe_type = fe_type;
|
||||
TAILQ_INIT(&dn->dn_initial_scan_pending_queue);
|
||||
TAILQ_INIT(&dn->dn_initial_scan_current_queue);
|
||||
|
@ -62,20 +69,6 @@ dvb_network_create(int fe_type, const char *uuid)
|
|||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static htsmsg_t *
|
||||
dvb_network_serialize(struct idnode *self, int full)
|
||||
{
|
||||
dvb_network_t *dn = (dvb_network_t *)self;
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
htsmsg_add_str(m, "id", idnode_uuid_as_str(&dn->dn_id));
|
||||
htsmsg_add_str(m, "text", idnode_uuid_as_str(&dn->dn_id));
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -161,68 +154,6 @@ dvb_network_save(dvb_network_t *dn)
|
|||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
dvb_network_set_auto_discovery(dvb_network_t *dn, int on)
|
||||
{
|
||||
if(dn->dn_autodiscovery == on)
|
||||
return;
|
||||
|
||||
lock_assert(&global_lock);
|
||||
|
||||
tvhlog(LOG_NOTICE, "dvb", "Network \"%s\" mux autodiscovery set to: %s",
|
||||
dn->dn_displayname, on ? "On" : "Off");
|
||||
|
||||
dn->dn_autodiscovery = on;
|
||||
dvb_network_save(dn);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
dvb_network_set_nitoid(dvb_network_t *dn, int nitoid)
|
||||
{
|
||||
lock_assert(&global_lock);
|
||||
|
||||
if(dn->dn_nitoid == nitoid)
|
||||
return;
|
||||
|
||||
tvhlog(LOG_NOTICE, "dvb", "NIT-o network id \"%d\" changed to \"%d\"",
|
||||
dn->dn_nitoid, nitoid);
|
||||
|
||||
dn->dn_nitoid = nitoid;
|
||||
dvb_network_save(dn);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
dvb_network_set_disable_pmt_monitor(th_dvb_network_t *dn, int on)
|
||||
{
|
||||
if(dn->dn_disable_pmt_monitor == on)
|
||||
return;
|
||||
|
||||
lock_assert(&global_lock);
|
||||
|
||||
tvhlog(LOG_NOTICE, "dvb", "Network \"%s\" disabled PMT monitoring set to: %s",
|
||||
dn->dn_displayname, on ? "On" : "Off");
|
||||
|
||||
dn->dn_disable_pmt_monitor = on;
|
||||
dvb_network_save(dn);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -268,9 +199,6 @@ dvb_network_init(void)
|
|||
if((l = hts_settings_load_r(1, "dvb/networks")) == NULL)
|
||||
return;
|
||||
|
||||
|
||||
htsmsg_print(l);
|
||||
|
||||
HTSMSG_FOREACH(f, l) {
|
||||
if((c = htsmsg_get_map_by_field(f)) == NULL)
|
||||
continue;
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
#include "dvb_support.h"
|
||||
#include "notify.h"
|
||||
|
||||
static htsmsg_t *dvb_service_serialize(service_t *s, int full);
|
||||
static htsmsg_t *dvb_service_serialize(service_t *s);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -414,18 +414,19 @@ dvb_service_find2(dvb_mux_t *dm, uint16_t sid, int pmt_pid,
|
|||
*
|
||||
*/
|
||||
static htsmsg_t *
|
||||
dvb_service_serialize(service_t *s, int full)
|
||||
dvb_service_serialize(service_t *s)
|
||||
{
|
||||
dvb_mux_t *dm = s->s_dvb_mux;
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
char buf[100];
|
||||
|
||||
htsmsg_add_str(m, "id", idnode_uuid_as_str(&s->s_id));
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s (0x%04x)",
|
||||
s->s_svcname ?: "<noname>", s->s_dvb_service_id);
|
||||
htsmsg_add_str(m, "text", buf);
|
||||
|
||||
if(s->s_svcname) {
|
||||
htsmsg_add_str(m, "text", s->s_svcname);
|
||||
} else {
|
||||
snprintf(buf, sizeof(buf), "Service-0x%04x",
|
||||
s->s_dvb_service_id);
|
||||
htsmsg_add_str(m, "text", buf);
|
||||
}
|
||||
|
||||
htsmsg_add_u32(m, "enabled", s->s_enabled);
|
||||
htsmsg_add_u32(m, "channel", s->s_channel_number);
|
||||
|
|
26
src/idnode.c
26
src/idnode.c
|
@ -156,3 +156,29 @@ idnode_unlink(idnode_t *in)
|
|||
{
|
||||
RB_REMOVE(&idnodes, in, in_link);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
htsmsg_t *
|
||||
idnode_serialize(struct idnode *self)
|
||||
{
|
||||
const idclass_t *c = self->in_class;
|
||||
htsmsg_t *m;
|
||||
if(c->ic_serialize != NULL) {
|
||||
m = c->ic_serialize(self);
|
||||
} else {
|
||||
m = htsmsg_create_map();
|
||||
|
||||
if(c->ic_get_title != NULL) {
|
||||
htsmsg_add_str(m, "text", c->ic_get_title(self));
|
||||
} else {
|
||||
htsmsg_add_str(m, "text", idnode_uuid_as_str(self));
|
||||
}
|
||||
htsmsg_add_msg(m, "properties", prop_get_values(self, c->ic_properties));
|
||||
htsmsg_add_msg(m, "propertynames", prop_get_names(c->ic_properties));
|
||||
htsmsg_add_str(m, "id", idnode_uuid_as_str(self));
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
|
|
@ -1,14 +1,17 @@
|
|||
#pragma once
|
||||
|
||||
#include "tvheadend.h"
|
||||
#include "prop.h"
|
||||
|
||||
struct htsmsg;
|
||||
struct idnode;
|
||||
|
||||
typedef struct idclass {
|
||||
const char *ic_class;
|
||||
struct htsmsg *(*ic_serialize)(struct idnode *self, int full);
|
||||
struct htsmsg *(*ic_serialize)(struct idnode *self);
|
||||
struct idnode **(*ic_get_childs)(struct idnode *self);
|
||||
const char *(*ic_get_title)(struct idnode *self);
|
||||
const property_t ic_properties[];
|
||||
} idclass_t;
|
||||
|
||||
|
||||
|
@ -27,3 +30,5 @@ const char *idnode_uuid_as_str(const idnode_t *in);
|
|||
idnode_t *idnode_find(const char *uuid);
|
||||
|
||||
void idnode_unlink(idnode_t *in);
|
||||
|
||||
htsmsg_t *idnode_serialize(struct idnode *self);
|
||||
|
|
84
src/prop.c
Normal file
84
src/prop.c
Normal file
|
@ -0,0 +1,84 @@
|
|||
#include "prop.h"
|
||||
|
||||
#if 0
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
prop_write_values(void *ptr, const property_t p[], htsmsg_t *m)
|
||||
{
|
||||
int i = 0;
|
||||
for(;p[i].id; i++) {
|
||||
switch(p[i].type) {
|
||||
case PT_BOOL:
|
||||
htsmsg_add_bool(m, p[i].id, *(int *)(ptr + p[i].off));
|
||||
break;
|
||||
case PT_INT:
|
||||
htsmsg_add_s32(m, p[i].id, *(int *)(ptr + p[i].off));
|
||||
break;
|
||||
case PT_STR:
|
||||
htsmsg_add_str(m, p[i].id, (const char *)(ptr + p[i].off));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
prop_read_values(void *ptr, const property_t p[], htsmsg_t *m)
|
||||
{
|
||||
int i = 0;
|
||||
for(;p[i].id; i++) {
|
||||
switch(p[i].type) {
|
||||
case PT_BOOL:
|
||||
htsmsg_add_bool(m, p[i].id, *(int *)(ptr + p[i].off));
|
||||
break;
|
||||
case PT_INT:
|
||||
htsmsg_add_s32(m, p[i].id, *(int *)(ptr + p[i].off));
|
||||
break;
|
||||
case PT_STR:
|
||||
htsmsg_add_str(m, p[i].id, (const char *)(ptr + p[i].off));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
htsmsg_t *
|
||||
prop_get_values(void *ptr, const property_t p[])
|
||||
{
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
prop_read_values(ptr, p, m);
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
prop_read_names(const property_t p[], htsmsg_t *m)
|
||||
{
|
||||
int i = 0;
|
||||
for(;p[i].name; i++)
|
||||
htsmsg_add_str(m, p[i].id, p[i].name);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
htsmsg_t *
|
||||
prop_get_names(const property_t p[])
|
||||
{
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
prop_read_names(p, m);
|
||||
return m;
|
||||
}
|
24
src/prop.h
Normal file
24
src/prop.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
#pragma once
|
||||
#include <stddef.h>
|
||||
|
||||
#include "htsmsg.h"
|
||||
|
||||
typedef enum {
|
||||
PT_BOOL,
|
||||
PT_INT,
|
||||
PT_STR,
|
||||
} prop_type_t;
|
||||
|
||||
typedef struct property {
|
||||
const char *id;
|
||||
const char *name;
|
||||
prop_type_t type;
|
||||
size_t off;
|
||||
} property_t;
|
||||
|
||||
|
||||
|
||||
void prop_read_values(void *ptr, const property_t p[], htsmsg_t *m);
|
||||
htsmsg_t *prop_get_values(void *ptr, const property_t p[]);
|
||||
void prop_read_names(const property_t p[], htsmsg_t *m);
|
||||
htsmsg_t *prop_get_names(const property_t p[]);
|
|
@ -51,7 +51,7 @@
|
|||
|
||||
static void service_data_timeout(void *aux);
|
||||
|
||||
static htsmsg_t *service_serialize(struct idnode *self, int full);
|
||||
static htsmsg_t *service_serialize(struct idnode *self);
|
||||
|
||||
static const idclass_t service_class = {
|
||||
.ic_class = "service",
|
||||
|
@ -261,11 +261,6 @@ service_find_instance(channel_t *ch, struct service_instance_list *sil,
|
|||
service_instance_destroy(si);
|
||||
}
|
||||
|
||||
printf("Service start, enlisted candidates\n");
|
||||
LIST_FOREACH(si, sil, si_link)
|
||||
printf(" %s i:%d w:%d p:%d\n", si->si_s->s_nicename, si->si_instance, si->si_weight, si->si_prio);
|
||||
|
||||
|
||||
// Check if any service is already running, if so, use that
|
||||
LIST_FOREACH(si, sil, si_link)
|
||||
if(si->si_s->s_status == SERVICE_RUNNING)
|
||||
|
@ -385,27 +380,6 @@ service_enlist(channel_t *ch)
|
|||
#endif
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
unsigned int
|
||||
service_compute_weight(struct service_list *head)
|
||||
{
|
||||
service_t *t;
|
||||
th_subscription_t *s;
|
||||
int w = 0;
|
||||
|
||||
lock_assert(&global_lock);
|
||||
|
||||
LIST_FOREACH(t, head, s_active_link) {
|
||||
LIST_FOREACH(s, &t->s_subscriptions, ths_service_link) {
|
||||
if(s->ths_weight > w)
|
||||
w = s->ths_weight;
|
||||
}
|
||||
}
|
||||
return w;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -1219,8 +1193,8 @@ htsmsg_t *servicetype_list ( void )
|
|||
*
|
||||
*/
|
||||
static htsmsg_t *
|
||||
service_serialize(struct idnode *self, int full)
|
||||
service_serialize(struct idnode *self)
|
||||
{
|
||||
service_t *s = (service_t *)self;
|
||||
return s->s_serialize(s, full);
|
||||
return s->s_serialize(s);
|
||||
}
|
||||
|
|
|
@ -315,7 +315,7 @@ typedef struct service {
|
|||
|
||||
void (*s_dtor)(struct service *t);
|
||||
|
||||
htsmsg_t *(*s_serialize)(struct service *s, int full);
|
||||
htsmsg_t *(*s_serialize)(struct service *s);
|
||||
|
||||
/*
|
||||
* Per source type structs
|
||||
|
@ -549,8 +549,6 @@ typedef struct service {
|
|||
|
||||
void service_init(void);
|
||||
|
||||
unsigned int service_compute_weight(struct service_list *head);
|
||||
|
||||
int service_start(service_t *t, int instance);
|
||||
|
||||
service_t *service_create(const char *uuid, int source_type);
|
||||
|
|
|
@ -715,7 +715,7 @@ extjs_dvbnetworks(http_connection_t *hc, const char *remain, void *opaque)
|
|||
|
||||
int i;
|
||||
for(i = 0; v[i] != NULL; i++) {
|
||||
htsmsg_t *m = v[i]->in_class->ic_serialize(v[i], 0);
|
||||
htsmsg_t *m = idnode_serialize(v[i]);
|
||||
if(v[i]->in_class->ic_get_childs == NULL)
|
||||
htsmsg_add_u32(m, "leaf", 1);
|
||||
htsmsg_add_msg(out, NULL, m);
|
||||
|
|
|
@ -1,30 +1,68 @@
|
|||
|
||||
|
||||
|
||||
tvheadend.item_editor = function(item) {
|
||||
var propsGrid = new Ext.grid.PropertyGrid({
|
||||
flex:1,
|
||||
padding: 5,
|
||||
propertyNames: item.propertynames,
|
||||
source: item.properties
|
||||
});
|
||||
return propsGrid;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
tvheadend.dvb_networks = function() {
|
||||
|
||||
var current = null;
|
||||
|
||||
var loader = new Ext.tree.TreeLoader({
|
||||
dataUrl: 'dvb/networks'
|
||||
});
|
||||
|
||||
var tree = new Ext.tree.TreePanel({
|
||||
title: 'DVB Networks',
|
||||
loader: loader,
|
||||
flex:1,
|
||||
border: false,
|
||||
root : new Ext.tree.AsyncTreeNode({
|
||||
id : 'root',
|
||||
text: 'DVB Networks'
|
||||
}),
|
||||
listeners: {
|
||||
click: function(n) {
|
||||
Ext.Msg.alert('Navigation Tree Click', 'You clicked: "' + n.attributes.text + '"');
|
||||
if(current)
|
||||
panel.remove(current);
|
||||
current = panel.add(new tvheadend.item_editor(n.attributes));
|
||||
panel.doLayout();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
var panel = new Ext.Panel({
|
||||
title: 'DVB Networks',
|
||||
layout: 'hbox',
|
||||
flex: 1,
|
||||
padding: 5,
|
||||
border: false,
|
||||
layoutConfig: {
|
||||
align:'stretch'
|
||||
},
|
||||
items: [tree]
|
||||
});
|
||||
|
||||
|
||||
tree.on('render', function() {
|
||||
tree.getRootNode().expand();
|
||||
});
|
||||
|
||||
return tree;
|
||||
return panel;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue