return 0;
}
+static int
+api_channel_rename
+ ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp )
+{
+ const char *from, *to;
+ if (!(from = htsmsg_get_str(args, "from")))
+ return -EINVAL;
+ if (!(to = htsmsg_get_str(args, "to")))
+ return -EINVAL;
+ /* We need the lock since we are altering details */
+ pthread_mutex_lock(&global_lock);
+ const int num_match = channel_rename_and_save(from, to);
+ pthread_mutex_unlock(&global_lock);
+
+ return num_match > 0 ? 0 : -ENOENT;
+}
+
static int
api_channel_tag_list
( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp )
{ "channel/grid", ACCESS_ANONYMOUS, api_idnode_grid, api_channel_grid },
{ "channel/list", ACCESS_ANONYMOUS, api_channel_list, NULL },
{ "channel/create", ACCESS_ADMIN, api_channel_create, NULL },
+ { "channel/rename", ACCESS_ADMIN, api_channel_rename, NULL }, /* User convenience function */
{ "channeltag/class",ACCESS_ANONYMOUS, api_idnode_class, (void*)&channel_tag_class },
{ "channeltag/grid", ACCESS_ANONYMOUS, api_idnode_grid, api_channel_tag_grid },
return save;
}
+int
+channel_rename_and_save ( const char *from, const char *to )
+{
+ channel_t *ch;
+ const char *s;
+ int num_match = 0;
+
+ if (!from || !to || !*from || !*to)
+ return 0;
+
+ CHANNEL_FOREACH(ch) {
+ if (!ch->ch_enabled) continue;
+ s = channel_get_name(ch, NULL);
+ if (s == NULL) continue;
+ if (strcmp(s, from) == 0) {
+ ++num_match;
+ if (channel_set_name(ch, to)) {
+ idnode_changed(&ch->ch_id);
+ }
+ }
+ }
+ return num_match;
+}
+
int64_t
channel_get_number ( channel_t *ch )
{
const char *channel_get_name ( channel_t *ch, const char *blank );
int channel_set_name ( channel_t *ch, const char *name );
+/// User API convenience function to rename all channels that
+/// match "from". Lock must be held prior to call.
+/// @return number channels that matched "from".
+int channel_rename_and_save ( const char *from, const char *to );
#define CHANNEL_SPLIT ((int64_t)1000000)