summaryrefslogtreecommitdiffstats
path: root/playtree.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-02-05 23:02:05 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-02-05 23:02:05 +0000
commitf7b66d5568fc4cad20a734e51428859b148e4c79 (patch)
tree8fcb55796daccf83f0d608d3439c7e508371cbfa /playtree.c
parent4751e51f6d59aa5568a09d47fab4286594686133 (diff)
downloadmpv-f7b66d5568fc4cad20a734e51428859b148e4c79.tar.bz2
mpv-f7b66d5568fc4cad20a734e51428859b148e4c79.tar.xz
this patch adds a high-level-api to playtree, allowing to use it more easily
and hopefully also letting one doing less mistakes, as current low-level-api is not rock-solid ... patch by Fabian Franz <FabianFranz@gmx.de> git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@9291 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'playtree.c')
-rw-r--r--playtree.c127
1 files changed, 123 insertions, 4 deletions
diff --git a/playtree.c b/playtree.c
index 5a43966f1c..5dbcda7fe9 100644
--- a/playtree.c
+++ b/playtree.c
@@ -201,6 +201,8 @@ play_tree_set_child(play_tree_t* pt, play_tree_t* child) {
assert(pt->entry_type == PLAY_TREE_ENTRY_NODE);
#endif
+ //DEBUG_FF: Where are the childs freed ?
+ // Attention in using this function!
for(iter = pt->child ; iter != NULL ; iter = iter->next)
iter->parent = NULL;
@@ -344,8 +346,10 @@ play_tree_set_param(play_tree_t* pt, char* name, char* val) {
}
pt->params = (play_tree_param_t*)realloc(pt->params,(n+2)*sizeof(play_tree_param_t));
- if(pt->params == NULL)
- printf("Can't realloc params\n");
+ if(pt->params == NULL) {
+ mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't realloc params (%d bytes of memory)\n",(n+2)*sizeof(play_tree_param_t));
+ return;
+ }
pt->params[n].name = strdup(name);
pt->params[n].value = val != NULL ? strdup(val) : NULL;
memset(&pt->params[n+1],0,sizeof(play_tree_param_t));
@@ -482,7 +486,10 @@ play_tree_iter_new(play_tree_t* pt,m_config_t* config) {
return NULL;
iter = (play_tree_iter_t*)calloc(1,sizeof(play_tree_iter_t));
- if(! iter) return NULL;
+ if(! iter) {
+ mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate new iterator (%d bytes of memory)\n",sizeof(play_tree_iter_t));
+ return NULL;
+ }
iter->root = pt;
iter->tree = NULL;
iter->config = config;
@@ -615,7 +622,7 @@ play_tree_iter_step(play_tree_iter_t* iter, int d,int with_nodes) {
// Is it a valid enty ?
if(! play_tree_is_valid(pt)) {
- if(d == 0) { // Can this happen ?
+ if(d == 0) { // Can this happen ? FF: Yes!
mp_msg(MSGT_PLAYTREE,MSGL_ERR,"What to do now ???? Infinite loop if we continue\n");
return PLAY_TREE_ITER_ERROR;
} // Not a valid entry : go to next one
@@ -883,4 +890,116 @@ play_tree_iter_new_copy(play_tree_iter_t* old) {
return iter;
}
+// HIGH Level API, by Fabian Franz (mplayer@fabian-franz.de)
+//
+play_tree_iter_t* pt_iter_create(play_tree_t** ppt, m_config_t* config)
+{
+ play_tree_iter_t* r=NULL;
+#ifdef MP_DEBUG
+ assert(*ppt!=NULL);
+#endif
+
+ *ppt=play_tree_cleanup(*ppt);
+
+ if(*ppt) {
+ r = play_tree_iter_new(*ppt,config);
+ if (r && play_tree_iter_step(r,0,0) != PLAY_TREE_ITER_ENTRY)
+ {
+ play_tree_iter_free(r);
+ r = NULL;
+ }
+ }
+
+ return r;
+}
+
+void pt_iter_destroy(play_tree_iter_t** iter)
+{
+ if (iter && *iter)
+ {
+ free(*iter);
+ iter=NULL;
+ }
+}
+
+char* pt_iter_get_file(play_tree_iter_t* iter, int d)
+{
+ int i=0;
+ char* r;
+
+ if (iter==NULL)
+ return NULL;
+
+ r = play_tree_iter_get_file(iter,d);
+
+ while (!r && d!=0)
+ {
+ if (play_tree_iter_step(iter,d,0) != PLAY_TREE_ITER_ENTRY)
+ break;
+ r=play_tree_iter_get_file(iter,d);
+ i++;
+ }
+
+ return r;
+}
+
+void pt_iter_insert_entry(play_tree_iter_t* iter, play_tree_t* entry)
+{
+ play_tree_t *pt = iter->tree;
+#ifdef MP_DEBUG
+ assert(pt!=NULL);
+ assert(entry!=NULL);
+ assert(entry!=pt);
+#endif
+
+ play_tree_insert_entry(pt, entry);
+ play_tree_set_params_from(entry,pt);
+}
+
+void pt_iter_replace_entry(play_tree_iter_t* iter, play_tree_t* entry)
+{
+ play_tree_t *pt = iter->tree;
+ pt_iter_insert_entry(iter, entry);
+ play_tree_remove(pt, 1, 1);
+ iter->tree=entry;
+}
+
+//Add a new file as a new entry
+void pt_add_file(play_tree_t** ppt, char* filename)
+{
+ play_tree_t *pt = *ppt, *entry = play_tree_new();
+#ifdef MP_DEBUG
+ assert(entry!=NULL);
+#endif
+
+ play_tree_add_file(entry, filename);
+ if (pt)
+ play_tree_append_entry(pt, entry);
+ else
+ {
+ pt=entry;
+ *ppt=pt;
+ }
+ play_tree_set_params_from(entry,pt);
+}
+
+void pt_add_gui_file(play_tree_t** ppt, char* path, char* file)
+{
+ char* wholename = malloc(strlen(path)+strlen(file)+3);
+
+ if (wholename)
+ {
+ strcpy(wholename, path);
+ strcat(wholename, "/");
+ strcat(wholename, file);
+ pt_add_file(ppt, wholename);
+ free(wholename); // As pt_add_file strdups it anyway!
+ }
+}
+
+void pt_iter_goto_head(play_tree_iter_t* iter)
+{
+ iter->tree=iter->root;
+ play_tree_iter_step(iter, 0, 0);
+}