summaryrefslogtreecommitdiff
path: root/muggle-plugin/mg_content_interface.c
diff options
context:
space:
mode:
authorLarsAC <LarsAC@e10066b5-e1e2-0310-b819-94efdf66514b>2004-02-01 18:22:52 +0000
committerLarsAC <LarsAC@e10066b5-e1e2-0310-b819-94efdf66514b>2004-02-01 18:22:52 +0000
commit9ffff4626dbb713e2fa6e025868928393ebf2ae7 (patch)
treeebe95d53808375beaed9f2c4ea2d17e7e8cb01de /muggle-plugin/mg_content_interface.c
parent717ec9a2d6e43a61ccff152a8d887fdb8e8f303e (diff)
downloadvdr-plugin-muggle-9ffff4626dbb713e2fa6e025868928393ebf2ae7.tar.gz
vdr-plugin-muggle-9ffff4626dbb713e2fa6e025868928393ebf2ae7.tar.bz2
Initial revision
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/trunk@3 e10066b5-e1e2-0310-b819-94efdf66514b
Diffstat (limited to 'muggle-plugin/mg_content_interface.c')
-rwxr-xr-xmuggle-plugin/mg_content_interface.c397
1 files changed, 397 insertions, 0 deletions
diff --git a/muggle-plugin/mg_content_interface.c b/muggle-plugin/mg_content_interface.c
new file mode 100755
index 0000000..5015cf5
--- /dev/null
+++ b/muggle-plugin/mg_content_interface.c
@@ -0,0 +1,397 @@
+/*******************************************************************/
+/*! \file content_interface.c
+ * \brief Data Objects for content (e.g. mp3 files, movies)
+ * for the vdr muggle plugindatabase
+ ********************************************************************
+ * \version $Revision: 1.1 $
+ * \date $Date: 2004/02/01 18:22:53 $
+ * \author Ralf Klueber, Lars von Wedel, Andreas Kellner
+ * \author file owner: $Author: LarsAC $
+ *
+ * DUMMY
+ * Implements main classes of for content items and interfaces to SQL databases
+ *
+ * This file implements the following classes
+ * - GdTracklist a playlist
+ * - mgGdTrack a single track (content item). e.g. an mp3 file
+ * - mgSelection a set of tracks (e.g. a database subset matching certain criteria)
+ *
+ */
+/*******************************************************************/
+#define DEBUG
+
+#include "mg_content_interface.h"
+#include "mg_tools.h"
+
+#define DUMMY
+
+/* constructor */
+mgContentItem mgContentItem::UNDEFINED = mgContentItem();
+
+using namespace std;
+
+/*!
+ *****************************************************************************
+ * \brief construcor
+ *
+ * creates empty tracklist
+ ****************************************************************************/
+mgTracklist::mgTracklist()
+{
+
+}
+
+/*!
+ *****************************************************************************
+ * \brief destrucor
+ *
+ * Deletes all items in the tracklist and removes the list itself
+ ****************************************************************************/
+mgTracklist::~mgTracklist()
+{
+ mgContentItem* ptr;
+ vector<mgContentItem*>::iterator iter;
+
+ for(iter = m_list.begin(); iter != m_list.end();iter++)
+ {
+ ptr = *iter;
+ delete ptr;
+ }
+ m_list.clear();
+}
+
+/*!
+ *****************************************************************************
+ * \brief returns a pointer to the list of elements
+ *
+ ****************************************************************************/
+vector<mgContentItem*> *mgTracklist::getAll()
+{
+ return &m_list;
+}
+
+/*!
+ *****************************************************************************
+ * \brief returns the number of elements in the list
+ *
+ ****************************************************************************/
+unsigned int mgTracklist::getNumItems()
+{
+ return m_list.size();
+}
+
+/*!
+ *****************************************************************************
+ * \brief randomizes the order of the elements in the list
+ *
+ ****************************************************************************/
+void mgTracklist::shuffle()
+{
+ random_shuffle(m_list.begin(),m_list.end ());
+}
+
+/*!
+ *****************************************************************************
+ * \brief sorts the elements in the list by the nth column
+ *
+ ****************************************************************************/
+void mgTracklist::sortBy(int col, bool direction)
+{
+}
+
+/*!
+ *****************************************************************************
+ * \brief stores the ids of columns to be used in label creation
+ *
+ * The list can create a label with different fields (columns) using the
+ * function getLabel()
+ * This function defines the fields of the contentItems to be used
+ * in the label and their order
+ ****************************************************************************/
+void mgTracklist::setDisplayColumns(vector<int> cols)
+{
+
+ m_columns = cols;
+}
+
+/*!
+ *****************************************************************************
+ * \brief returns the number of dsplay coulmns
+ *
+ ****************************************************************************/
+unsigned int mgTracklist::getNumColumns()
+{
+ return m_columns.size();
+}
+
+
+/*!
+ *****************************************************************************
+ * \brief creates the label string for an item
+ *
+ * The list can create a label with different fields (columns).
+ * The fields used in the list and their order is set by the function
+ using the function setDisplayColumns
+ * function getLabel().
+ * This function creates a string from these columns, separated by the string
+ * 'separator'
+ * in the label and their order
+ ****************************************************************************/
+string mgTracklist::getLabel(unsigned int position, const string separator)
+{
+ string label ="";
+ mgContentItem* item;
+
+ if(position >= m_list.size())
+ return "";
+
+ else
+ {
+ item = *(m_list.begin()+position);
+ }
+
+
+ for( vector<int>::iterator iter = m_columns.begin();
+ iter != m_columns.end(); iter++ )
+ {
+ if( iter != m_columns.begin() )
+ {
+ label += separator;
+ }
+ label += item->getLabel(*iter);
+ }
+ return label;
+}
+
+
+/*!
+ *****************************************************************************
+ * \brief returns an item from the list at the specified position
+ *
+ ****************************************************************************/
+mgContentItem* mgTracklist::getItem(unsigned int position)
+{
+ if(position >= m_list.size())
+ return &(mgContentItem::UNDEFINED); //invalid
+ return *(m_list.begin()+position);
+}
+
+/*!
+ *****************************************************************************
+ * \brief remove item at position
+ *
+ ****************************************************************************/
+bool mgTracklist::remove(unsigned int position)
+{
+ if(position >= m_list.size()) return false;
+ vector<mgContentItem*>::iterator iter;
+
+ iter = m_list.begin()+ position;
+ m_list.erase(iter);
+ return true;
+}
+
+/*!
+ *****************************************************************************
+ * \brief remove all occurences of item
+ *
+ ****************************************************************************/
+int mgTracklist::remove(mgContentItem* item)
+{
+ int retval = 0;
+ vector<mgContentItem*>::iterator iter;
+ for(iter=m_list.begin(); iter != m_list.end (); iter++)
+ {
+ if(*iter == item)
+ {
+ m_list.erase(iter);
+ retval++;
+ break;
+ }
+ }
+ return retval;
+}
+
+
+/*=================================================================*/
+/* */
+/* class mgPlaylist */
+/* */
+/*=================================================================*/
+mgPlaylist::mgPlaylist()
+{
+}
+mgPlaylist::mgPlaylist(string listname)
+{
+ m_listname = listname;
+}
+
+ /*==== destructor ====*/
+mgPlaylist::~mgPlaylist()
+{
+
+}
+/*==== add/ remove tracks ====*/
+
+/* adds a song at the end of the playlist */
+void mgPlaylist::append(mgContentItem* item)
+{
+ m_list.push_back(item);
+}
+
+void mgPlaylist::appendList(vector<mgContentItem*> *tracks)
+{
+ vector<mgContentItem*>::iterator iter;
+ mgDebug(3, "Adding %d tracks to the playlist",tracks->size());
+ for(iter = tracks->begin(); iter != tracks->end(); iter++)
+ {
+ m_list.push_back(*iter);
+ }
+ tracks->clear();
+}
+
+
+/* adds a song after 'position' */
+void mgPlaylist::insert(mgContentItem* item, unsigned int position)
+{
+ if(position >= m_list.size())
+ m_list.push_back(item);
+ else
+ m_list.insert(m_list.begin()+position, item);
+}
+
+
+
+/*==== access tracks ====*/
+string mgPlaylist::getListname() { return m_listname; }
+void mgPlaylist::setListname(string name){ m_listname = name;}
+
+
+
+// returns the first item of the list
+mgContentItem* mgPlaylist::getFirst()
+{
+ m_current = m_list.begin();
+ return *m_current;
+}
+
+// returns the nth track from the playlist
+mgContentItem* mgPlaylist::getPosition(unsigned int position)
+{
+ if(position >= m_list.size())
+ return &(mgContentItem::UNDEFINED); //invalid
+ m_current = m_list.begin()+position;
+ return *m_current;
+}
+
+// proceeds to the next item
+mgContentItem* mgPlaylist::skipFwd()
+{
+ if(m_current+1 == m_list.end())
+ return &(mgContentItem::UNDEFINED); //invalid
+ else
+ return * (++m_current);
+}
+
+// goes back to the previous item
+mgContentItem* mgPlaylist::skipBack()
+{
+ if(m_current == m_list.begin())
+ return &(mgContentItem::UNDEFINED); //invalid
+ else
+ return * (--m_current);
+}
+
+// get next track, do not update data structures
+mgContentItem* mgPlaylist::sneakNext()
+{
+ if(m_current+1 == m_list.end())
+ return &(mgContentItem::UNDEFINED); //invalid
+ else
+ return * (m_current+1);
+}
+
+
+/*=================================================================*/
+/* */
+/* class mgSelectionTreeNode */
+/* */
+/*=================================================================*/
+mgSelectionTreeNode::mgSelectionTreeNode(MYSQL db, int view)
+{
+ m_db = db;
+ m_parent=NULL;
+ m_level = 0;
+ m_view = view;
+ m_id = "";
+ m_label = "ROOT";
+ m_expanded = false;
+}
+mgSelectionTreeNode::mgSelectionTreeNode(mgSelectionTreeNode* parent, string id, string label)
+{
+ m_parent = parent;
+ m_level = m_parent->m_level+1;
+ m_view = m_parent->m_view;
+ m_db = m_parent->m_db;
+ m_id = id;
+ m_label = label;
+ m_expanded = false;
+}
+
+ /*==== destructor ====*/
+mgSelectionTreeNode::~mgSelectionTreeNode()
+{
+ collapse();
+// _children.clear();
+}
+
+mgSelectionTreeNode* mgSelectionTreeNode::getParent()
+{
+ return m_parent;
+}
+
+void mgSelectionTreeNode::collapse() // removes all children (recursively)
+{
+ vector <mgSelectionTreeNode*>::iterator iter;
+ mgSelectionTreeNode* ptr;
+
+ for(iter = m_children.begin(); iter != m_children.end();iter++)
+ {
+ ptr = *iter;
+ delete ptr;
+ }
+ m_expanded = false;
+ m_children.clear();
+}
+// access children
+vector<mgSelectionTreeNode*> &mgSelectionTreeNode::getChildren()
+{
+ mgDebug(5," returning %d children", m_children.size());
+ return m_children;
+}
+
+// access data in current node
+string mgSelectionTreeNode::getID()
+{
+ return m_id;
+}
+string mgSelectionTreeNode::getLabel()
+{
+ return m_label;
+}
+string mgSelectionTreeNode::getLabel(int n)
+{
+ mgSelectionTreeNode* node = this;
+ int d = m_level;
+ while(n < d)
+ {
+ node = node->m_parent;
+ d--;
+ }
+ return node->m_label;
+}
+
+string mgSelectionTreeNode::getRestrictions()
+{
+ return m_restriction;
+}