summaryrefslogtreecommitdiff
path: root/mg_selection.c
diff options
context:
space:
mode:
Diffstat (limited to 'mg_selection.c')
-rw-r--r--mg_selection.c528
1 files changed, 181 insertions, 347 deletions
diff --git a/mg_selection.c b/mg_selection.c
index 464bddb..f0016e9 100644
--- a/mg_selection.c
+++ b/mg_selection.c
@@ -28,8 +28,8 @@
#include <fileref.h>
#if VDRVERSNUM >= 10307
-#include <vdr/interface.h>
-#include <vdr/skins.h>
+#include <interface.h>
+#include <skins.h>
#endif
//! \brief adds string n to string s, using a comma to separate them
@@ -54,13 +54,13 @@ comma (string & s, string n)
void
-mgSelection::mgSelItems::clear()
+mgSelection::mgListItems::clear()
{
m_items.clear();
}
bool
-mgSelection::mgSelItems::operator==(const mgSelItems&x) const
+mgSelection::mgListItems::operator==(const mgListItems&x) const
{
bool result = m_items.size()==x.m_items.size();
if (result)
@@ -70,47 +70,47 @@ mgSelection::mgSelItems::operator==(const mgSelItems&x) const
}
size_t
-mgSelection::mgSelItems::size() const
+mgSelection::mgListItems::size() const
{
if (!m_sel)
- mgError("mgSelItems: m_sel is 0");
+ mgError("mgListItems: m_sel is 0");
m_sel->refreshValues();
return m_items.size();
}
-mgSelItem&
-mgSelection::mgSelItems::operator[](unsigned int idx)
+mgListItem&
+mgSelection::mgListItems::operator[](unsigned int idx)
{
if (!m_sel)
- mgError("mgSelItems: m_sel is 0");
+ mgError("mgListItems: m_sel is 0");
m_sel->refreshValues();
if (idx>=size()) return zeroitem;
return m_items[idx];
}
void
-mgSelection::mgSelItems::setOwner(mgSelection* sel)
+mgSelection::mgListItems::setOwner(mgSelection* sel)
{
m_sel = sel;
}
unsigned int
-mgSelection::mgSelItems::valindex (const string v) const
+mgSelection::mgListItems::valindex (const string v) const
{
return index(v,true);
}
unsigned int
-mgSelection::mgSelItems::idindex (const string i) const
+mgSelection::mgListItems::idindex (const string i) const
{
return index(i,true);
}
unsigned int
-mgSelection::mgSelItems::index (const string s,bool val,bool second_try) const
+mgSelection::mgListItems::index (const string s,bool val,bool second_try) const
{
if (!m_sel)
- mgError("mgSelItems::index(%s): m_sel is 0",s.c_str());
+ mgError("mgListItems::index(%s): m_sel is 0",s.c_str());
m_sel->refreshValues();
for (unsigned int i = 0; i < size (); i++)
{
@@ -127,7 +127,7 @@ mgSelection::mgSelItems::index (const string s,bool val,bool second_try) const
}
// nochmal mit neuen Werten:
if (second_try) {
- esyslog("index: Gibt es nicht:%s",s.c_str());
+ mgDebug(2,"index: Gibt es nicht:%s",s.c_str());
return 0;
}
else
@@ -147,10 +147,10 @@ mgSelection::clearCache() const
string
mgSelection::getCurrentValue()
{
- return items[gotoPosition()].value();
+ return listitems[gotoPosition()].value();
}
-mgSelItem&
+mgListItem&
mgSelection::getKeyItem(const unsigned int level) const
{
return order.getKeyItem(level);
@@ -164,11 +164,11 @@ mgSelection::getKeyType (const unsigned int level) const
}
mgContentItem *
-mgSelection::getTrack (unsigned int position)
+mgSelection::getItem (unsigned int position)
{
- if (position >= getNumTracks ())
+ if (position >= getNumItems ())
return 0;
- return &(m_tracks[position]);
+ return &(m_items[position]);
}
@@ -188,19 +188,19 @@ mgSelection::setShuffleMode (mgSelection::ShuffleMode mode)
void
mgSelection::Shuffle() const
{
- unsigned int tracksize = getNumTracks();
- if (tracksize==0) return;
+ unsigned int numitems = getNumItems();
+ if (numitems==0) return;
switch (m_shuffle_mode)
{
case SM_NONE:
{
- long trackid = m_tracks[getTrackPosition()].getTrackid ();
+ long id = m_items[getItemPosition()].getItemid ();
m_current_tracks = ""; // force a reload
- tracksize = getNumTracks(); // getNumTracks also reloads
- for (unsigned int i = 0; i < tracksize; i++)
- if (m_tracks[i].getTrackid () == trackid)
+ numitems = getNumItems(); // getNumItems also reloads
+ for (unsigned int i = 0; i < numitems; i++)
+ if (m_items[i].getItemid () == id)
{
- setTrackPosition(i);
+ m_items_position = i;
break;
}
}
@@ -208,18 +208,18 @@ mgSelection::Shuffle() const
case SM_PARTY:
case SM_NORMAL:
{
- // play all, beginning with current track:
- mgContentItem tmp = m_tracks[getTrackPosition()];
- m_tracks[getTrackPosition()]=m_tracks[0];
- m_tracks[0]=tmp;
- setTrackPosition(0);
- // randomize all other tracks
- for (unsigned int i = 1; i < tracksize; i++)
+ // play all, beginning with current item:
+ mgContentItem tmp = m_items[getItemPosition()];
+ m_items[getItemPosition()]=m_items[0];
+ m_items[0]=tmp;
+ m_items_position = 0;
+ // randomize all other items
+ for (unsigned int i = 1; i < numitems; i++)
{
- unsigned int j = 1+randrange (tracksize-1);
- tmp = m_tracks[i];
- m_tracks[i] = m_tracks[j];
- m_tracks[j] = tmp;
+ unsigned int j = 1+randrange (numitems-1);
+ tmp = m_items[i];
+ m_items[i] = m_items[j];
+ m_items[j] = tmp;
}
} break;
/*
@@ -228,11 +228,11 @@ mgSelection::Shuffle() const
- initialization
- find 15 titles according to the scheme below
- playing
- - before entering next title perform track selection
- - track selection
+ - before entering next title perform item selection
+ - item selection
- generate a random uid
- if file exists:
- - determine maximum playcount of all tracks
+ - determine maximum playcount of all items
- generate a random number n
- if n < playcount / max. playcount
- add the file to the end of the list
@@ -255,8 +255,8 @@ mgSelection::AddToCollection (const string Name)
CreateCollection(Name);
string listid = m_db.sql_string (m_db.get_col0
("SELECT id FROM playlist WHERE title=" + m_db.sql_string (Name)));
- unsigned int tracksize = getNumTracks ();
- if (tracksize==0)
+ unsigned int numitems = getNumItems ();
+ if (numitems==0)
return 0;
// this code is rather complicated but works in a multi user
@@ -265,25 +265,25 @@ mgSelection::AddToCollection (const string Name)
// insert a unique trackid:
string trackid = ltos(m_db.thread_id()+1000000);
m_db.exec_sql("INSERT INTO playlistitem SELECT "+listid+","
- "MAX(tracknumber)+"+ltos(tracksize)+","+trackid+
+ "MAX(tracknumber)+"+ltos(numitems)+","+trackid+
" FROM playlistitem WHERE playlist="+listid);
// find tracknumber of the trackid we just inserted:
string sql = string("SELECT tracknumber FROM playlistitem WHERE "
"playlist=")+listid+" AND trackid="+trackid;
- long first = atol(m_db.get_col0(sql).c_str()) - tracksize + 1;
+ long first = atol(m_db.get_col0(sql).c_str()) - numitems + 1;
// replace the place holder trackid by the correct value:
- m_db.exec_sql("UPDATE playlistitem SET trackid="+ltos(m_tracks[tracksize-1].getTrackid())+
+ m_db.exec_sql("UPDATE playlistitem SET trackid="+ltos(m_items[numitems-1].getItemid())+
" WHERE playlist="+listid+" AND trackid="+trackid);
- // insert all other tracks:
+ // insert all other items:
const char *sql_prefix = "INSERT INTO playlistitem VALUES ";
sql = "";
- for (unsigned int i = 0; i < tracksize-1; i++)
+ for (unsigned int i = 0; i < numitems-1; i++)
{
string item = "(" + listid + "," + ltos (first + i) + "," +
- ltos (m_tracks[i].getTrackid ()) + ")";
+ ltos (m_items[i].getItemid ()) + ")";
comma(sql, item);
if ((i%100)==99)
{
@@ -293,7 +293,7 @@ mgSelection::AddToCollection (const string Name)
}
if (!sql.empty()) m_db.exec_sql (sql_prefix+sql);
if (inCollection(Name)) clearCache ();
- return tracksize;
+ return numitems;
}
@@ -302,7 +302,7 @@ mgSelection::RemoveFromCollection (const string Name)
{
if (!m_db.Connected()) return 0;
mgParts p = order.Parts(m_db,m_level,false);
- string sql = p.sql_delete_from_collection(id(keyCollection,Name));
+ string sql = p.sql_delete_from_collection(KeyMaps.id(keyCollection,Name));
m_db.exec_sql (sql);
unsigned int removed = m_db.affected_rows ();
if (inCollection(Name)) clearCache ();
@@ -323,7 +323,7 @@ bool mgSelection::DeleteCollection (const string Name)
void mgSelection::ClearCollection (const string Name)
{
if (!m_db.Connected()) return;
- string listid = id(keyCollection,Name);
+ string listid = KeyMaps.id(keyCollection,Name);
m_db.exec_sql ("DELETE FROM playlistitem WHERE playlist="+m_db.sql_string(listid));
if (inCollection(Name)) clearCache ();
}
@@ -350,13 +350,13 @@ string mgSelection::exportM3U ()
if (!listfile)
return "";
fprintf (listfile, "#EXTM3U\n");
- unsigned int tracksize = getNumTracks ();
- for (unsigned i = 0; i < tracksize; i++)
+ unsigned int numitems = getNumItems ();
+ for (unsigned i = 0; i < numitems; i++)
{
- mgContentItem& t = m_tracks[i];
+ mgContentItem& t = m_items[i];
fprintf (listfile, "#EXTINF:%d,%s\n", t.getDuration (),
t.getTitle ().c_str ());
- fprintf (listfile, "#MUGGLE:%ld\n", t.getTrackid());
+ fprintf (listfile, "#MUGGLE:%ld\n", t.getItemid());
fprintf (listfile, "%s\n", t.getSourceFile (false).c_str ());
}
fclose (listfile);
@@ -367,108 +367,124 @@ bool
mgSelection::empty()
{
if (m_level>= order.size ()-1)
- return ( getNumTracks () == 0);
+ return ( getNumItems () == 0);
else
- return ( items.size () == 0);
+ return ( listitems.size () == 0);
}
void
mgSelection::setPosition (unsigned int position)
{
if (m_level == order.size())
- setTrackPosition(position);
- else
- m_position = position;
+ mgError("setPosition:m_level==order.size()");
+ m_position = position;
}
void
-mgSelection::setTrackPosition (unsigned int position) const
+mgSelection::GotoItemPosition (unsigned int position) const
{
- m_tracks_position = position;
+ m_items_position = position;
+ skipItems(0);
}
unsigned int
mgSelection::getPosition () const
{
if (m_level == order.size())
- return getTrackPosition();
- else
- return m_position;
+ mgError("getPosition:m_level==order.size()");
+ return m_position;
}
unsigned int
mgSelection::gotoPosition ()
{
- if (m_level == order.size ())
- return gotoTrackPosition();
- else
- {
- unsigned int itemsize = items.size();
- if (itemsize==0)
- m_position = 0;
- else if (m_position >= itemsize)
- m_position = itemsize -1;
- return m_position;
- }
+ if (m_level == order.size())
+ mgError("gotoPosition:m_level==order.size()");
+ unsigned int itemsize = listitems.size();
+ if (itemsize==0)
+ m_position = 0;
+ else if (m_position >= itemsize)
+ m_position = itemsize -1;
+ return m_position;
}
unsigned int
-mgSelection::getTrackPosition() const
+mgSelection::getItemPosition() const
{
- if (m_tracks_position>=m_tracks.size())
- if (m_tracks.size()==0)
- m_tracks_position=0;
+ if (m_items_position>=m_items.size())
+ if (m_items.size()==0)
+ m_items_position=0;
else
- m_tracks_position = m_tracks.size()-1;
- return m_tracks_position;
+ m_items_position = m_items.size()-1;
+ return m_items_position;
}
unsigned int
-mgSelection::gotoTrackPosition()
+mgSelection::gotoItemPosition()
{
- unsigned int tracksize = getNumTracks ();
- if (tracksize == 0)
- setTrackPosition(0);
- else if (m_tracks_position >= tracksize)
- setTrackPosition(tracksize -1);
- return m_tracks_position;
+ unsigned int numitems = getNumItems ();
+ if (numitems == 0)
+ {
+ m_items_position = 0;
+ return 0;
+ }
+ if (m_items_position >= numitems)
+ m_items_position = numitems -1;
+ return m_items_position;
}
-bool mgSelection::skipTracks (int steps)
+bool mgSelection::skipItems (int steps) const
{
- unsigned int tracksize = getNumTracks();
- if (tracksize == 0)
+ unsigned int numitems = getNumItems();
+ if (numitems == 0)
+ {
+ m_items_position=0;
return false;
- if (m_loop_mode == LM_SINGLE)
- return true;
- unsigned int old_pos = m_tracks_position;
+ }
+ int old_pos = m_items_position;
unsigned int new_pos;
+ if (m_loop_mode == LM_SINGLE)
+ steps = 0;
if (old_pos + steps < 0)
{
if (m_loop_mode == LM_NONE)
return false;
- new_pos = tracksize - 1;
+ new_pos = numitems - 1;
}
else
new_pos = old_pos + steps;
- if (new_pos >= tracksize)
+ if (new_pos >= numitems)
{
if (m_loop_mode == LM_NONE)
return false;
new_pos = 0;
}
- setTrackPosition (new_pos);
- return (new_pos == gotoTrackPosition());
+ m_items_position = new_pos;
+ while (true)
+ {
+ if (m_items[m_items_position].Valid())
+ break;
+ m_items.erase(m_items.begin()+m_items_position);
+ if (m_items.size()==0)
+ {
+ m_items_position = 0;
+ return false;
+ }
+ if (steps<0 && m_items.size()>0 && m_items_position>0)
+ m_items_position--;
+ if (m_items_position==m_items.size())
+ m_items_position--;
+ }
+ return true;
}
-
unsigned long
mgSelection::getLength ()
{
unsigned long result = 0;
- unsigned int tracksize = getNumTracks ();
- for (unsigned int i = 0; i < tracksize; i++)
- result += m_tracks[i].getDuration ();
+ unsigned int numitems = getNumItems ();
+ for (unsigned int i = 0; i < numitems; i++)
+ result += m_items[i].getDuration ();
return result;
}
@@ -477,9 +493,9 @@ unsigned long
mgSelection::getCompletedLength () const
{
unsigned long result = 0;
- tracks (); // make sure they are loaded
- for (unsigned int i = 0; i < getTrackPosition(); i++)
- result += m_tracks[i].getDuration ();
+ items (); // make sure they are loaded
+ for (unsigned int i = 0; i < getItemPosition(); i++)
+ result += m_items[i].getDuration ();
return result;
}
@@ -524,52 +540,22 @@ string mgSelection::ListFilename ()
}
const vector < mgContentItem > &
-mgSelection::tracks () const
-{
- if (!m_db.Connected()) return m_tracks;
- if (!m_current_tracks.empty()) return m_tracks;
- mgParts p = order.Parts(m_db,m_level);
- p.fields.clear();
- p.fields.push_back("tracks.id");
- p.fields.push_back("tracks.title");
- p.fields.push_back("tracks.mp3file");
- p.fields.push_back("tracks.artist");
- p.fields.push_back("album.title");
- p.fields.push_back("tracks.genre1");
- p.fields.push_back("tracks.genre2");
- p.fields.push_back("tracks.bitrate");
- p.fields.push_back("tracks.year");
- p.fields.push_back("tracks.rating");
- p.fields.push_back("tracks.length");
- p.fields.push_back("tracks.samplerate");
- p.fields.push_back("tracks.channels");
- p.fields.push_back("tracks.lang");
- p.tables.push_back("tracks");
- p.tables.push_back("album");
- for (unsigned int i = m_level; i<order.size(); i++)
- p += order.Key(i)->Parts(m_db,true);
- m_current_tracks = p.sql_select(false);
- m_tracks.clear ();
- MYSQL_RES *rows = m_db.exec_sql (m_current_tracks);
- if (rows)
- {
- MYSQL_ROW row;
- while ((row = mysql_fetch_row (rows)) != 0)
- m_tracks.push_back (mgContentItem (this,row));
- mysql_free_result (rows);
- }
+mgSelection::items () const
+{
+ if (!m_db.Connected()) return m_items;
+ if (!m_current_tracks.empty()) return m_items;
+ m_current_tracks=order.GetContent(m_db,m_level,m_items);
if (m_shuffle_mode!=SM_NONE)
Shuffle();
- return m_tracks;
+ return m_items;
}
void mgSelection::InitSelection() {
- m_Directory=".";
m_level = 0;
m_position = 0;
- m_tracks_position = 0;
- m_trackid = -1;
+ m_items_position = 0;
+ m_itemid = -1;
if (the_setup.InitShuffleMode)
m_shuffle_mode = SM_NORMAL;
else
@@ -579,7 +565,7 @@ void mgSelection::InitSelection() {
else
m_loop_mode = LM_NONE;
clearCache();
- items.setOwner(this);
+ listitems.setOwner(this);
}
@@ -631,13 +617,13 @@ mgSelection::InitFrom(mgValmap& nv)
argv[0]=".";
argv[1]=0;
m_db.Create();
- if (Interface->Confirm(tr("Import tracks?")))
+ if (Interface->Confirm(tr("Import items?")))
{
mgThreadSync *s = mgThreadSync::get_instance();
if (s)
{
extern char *sync_args[];
- s->Sync(sync_args,the_setup.DeleteStaleReferences);
+ s->Sync(sync_args,(bool)the_setup.DeleteStaleReferences);
}
}
}
@@ -645,7 +631,6 @@ mgSelection::InitFrom(mgValmap& nv)
}
InitSelection();
m_fall_through = nv.getbool("FallThrough");
- m_Directory = nv.getstr("Directory");
while (m_level < nv.getuint("Level"))
{
char *idx;
@@ -655,10 +640,12 @@ mgSelection::InitFrom(mgValmap& nv)
if (!enter (newval))
if (!select (newval)) break;
}
- m_trackid = nv.getlong("TrackId");
- setPosition(nv.getstr("Position"));
- if (m_level>=order.size()-1)
- setTrackPosition(nv.getlong("TrackPosition"));
+ assert(m_level<=order.size());
+ m_itemid = nv.getlong("ItemId");
+ if (m_level==order.size())
+ m_items_position = nv.getlong("ItemPosition");
+ else
+ setPosition(nv.getstr("Position"));
}
@@ -670,28 +657,19 @@ void mgSelection::InitFrom(const mgSelection* s)
{
InitSelection();
m_fall_through = s->m_fall_through;
- m_Directory = s->m_Directory;
- map_values = s->map_values;
- map_ids = s->map_ids;
order = s->order;
m_level = s->m_level;
m_position = s->m_position;
- m_trackid = s->m_trackid;
- m_tracks_position = s->m_tracks_position;
+ m_itemid = s->m_itemid;
+ m_items_position = s->m_items_position;
setShuffleMode (s->getShuffleMode ());
setLoopMode (s->getLoopMode ());
}
unsigned int
-mgSelection::ordersize ()
-{
- return order.size ();
-}
-
-unsigned int
mgSelection::valcount (string value)
{
- return items[items.valindex(value)].count();
+ return listitems[listitems.valindex(value)].count();
}
void
@@ -704,7 +682,7 @@ mgSelection::refreshValues () const
{
mgParts p = order.Parts(m_db,m_level);
m_current_values = p.sql_select();
- items.clear ();
+ listitems.clear ();
MYSQL_RES *rows = m_db.exec_sql (m_current_values);
if (rows)
{
@@ -716,7 +694,7 @@ mgSelection::refreshValues () const
string r0 = row[0];
if (!strcmp(row[0],"NULL")) // there is a genre NULL!
continue;
- mgSelItem n;
+ mgListItem n;
if (num_fields==3)
{
if (!row[1]) continue;
@@ -724,7 +702,7 @@ mgSelection::refreshValues () const
}
else
n.set(value(order.Key(m_level),r0),r0,atol(row[1]));
- items.push_back(n);
+ listitems.push_back(n);
}
mysql_free_result (rows);
}
@@ -734,43 +712,42 @@ mgSelection::refreshValues () const
unsigned int
mgSelection::count () const
{
- return items.size ();
+ return listitems.size ();
}
bool mgSelection::enter (unsigned int position)
{
if (order.empty())
- esyslog("mgSelection::enter(%u): order is empty", position);
+ mgWarning("mgSelection::enter(%u): order is empty", position);
if (empty())
return false;
+ if (m_level == order.size ())
+ return false;
setPosition (position);
position = gotoPosition(); // reload adjusted position
- if (items.size()==0)
+ if (listitems.size()==0)
return false;
- mgSelItem item = items[position];
- mgSelItems prev;
- if (m_fall_through && items.size()<10)
- prev=items;
+ mgListItem item = listitems[position];
+ mgListItems prev;
+ if (m_fall_through && listitems.size()<10)
+ prev=listitems;
while (1)
{
if (m_level >= order.size () - 1)
return false;
order[m_level++]->set (item);
clearCache();
- if (m_level >= order.size())
- mgError("mgSelection::enter(%u): level greater than order.size() %u",
- m_level,order.size());
m_position = 0;
refreshValues();
if (count()==0)
break;
- item=items[0];
+ item=listitems[0];
if (!m_fall_through)
break;
if (m_level==order.size()-1)
break;
- if (count () > 1 && !(prev==items))
+ if (count () > 1 && !(prev==listitems))
break;
}
return true;
@@ -781,11 +758,11 @@ bool mgSelection::select (unsigned int position)
{
if (m_level == order.size () - 1)
{
- if (getNumTracks () <= position)
+ if (getNumItems () <= position)
return false;
- order[m_level]->set (items[position]);
+ order[m_level]->set (listitems[position]);
m_level++;
- m_trackid = m_tracks[position].getTrackid ();
+ m_itemid = m_items[position].getItemid ();
clearCache();
return true;
@@ -808,14 +785,14 @@ mgSelection::leave ()
m_level--;
prevvalue=order.getKeyItem(m_level).value();
order[m_level]->set(zeroitem);
- m_trackid = -1;
+ m_itemid = -1;
clearCache();
setPosition(prevvalue);
return true;
}
- mgSelItems prev;
- if (m_fall_through && items.size()<10)
- prev=items;
+ mgListItems prev;
+ if (m_fall_through && listitems.size()<10)
+ prev=listitems;
while (1)
{
if (m_level < 1)
@@ -827,7 +804,7 @@ mgSelection::leave ()
clearCache();
if (!m_fall_through)
break;
- if (count () > 1 && !(prev==items))
+ if (count () > 1 && !(prev==listitems))
break;
}
setPosition(prevvalue);
@@ -838,7 +815,7 @@ void
mgSelection::leave_all ()
{
m_level=0;
- for (unsigned int i=0;i<ordersize();i++)
+ for (unsigned int i=0;i<order.size();i++)
order[i]->set (zeroitem);
clearCache();
}
@@ -847,9 +824,9 @@ void
mgSelection::selectfrom(mgOrder& oldorder,mgContentItem* o)
{
leave_all();
- mgSelItem selitem;
+ mgListItem selitem;
assert(m_level==0);
- for (unsigned int idx = 0; idx < ordersize(); idx++)
+ for (unsigned int idx = 0; idx < order.size(); idx++)
{
selitem = zeroitem;
mgKeyTypes new_kt = getKeyType(idx);
@@ -862,16 +839,16 @@ mgSelection::selectfrom(mgOrder& oldorder,mgContentItem* o)
&& iskeyGenre(old_kt)
&& iskeyGenre(new_kt))
{
- string selid=id(new_kt,value(new_kt,oldorder.getKeyItem(i).id()));
- selitem=mgSelItem (value(new_kt,selid),selid);
+ string selid=KeyMaps.id(new_kt,KeyMaps.value(new_kt,oldorder.getKeyItem(i).id()));
+ selitem=mgListItem (KeyMaps.value(new_kt,selid),selid);
}
if (selitem.valid()) break;
}
- if (!selitem.valid() && o && o->getTrackid()>=0)
+ if (!selitem.valid() && o && o->getItemid()>=0)
selitem = o->getKeyItem(new_kt);
if (!selitem.valid())
break;
- if (m_level<ordersize()-1)
+ if (m_level<order.size()-1)
{
order[m_level++]->set (selitem);
}
@@ -889,36 +866,14 @@ mgSelection::selectfrom(mgOrder& oldorder,mgContentItem* o)
setPosition(selitem.value());
order[m_level+1]->set(zeroitem);
}
- assert(m_level<ordersize());
+ assert(m_level<order.size());
}
-string
-mgSelection::value(mgKeyTypes kt, string idstr) const
-{
- if (loadvalues (kt))
- {
- map<string,string>& valmap = map_values[kt];
- map<string,string>::iterator it;
- it = valmap.find(idstr);
- if (it!=valmap.end())
- {
- string r = it->second;
- if (!r.empty())
- return r;
- }
- map_ids[kt].clear();
- loadvalues(kt);
- it = valmap.find(idstr);
- if (it!=valmap.end())
- return valmap[idstr];
- }
- return idstr;
-}
string
mgSelection::value(mgKey* k, string idstr) const
{
- return value(k->Type(),idstr);
+ return KeyMaps.value(k->Type(),idstr);
}
string
@@ -927,26 +882,11 @@ mgSelection::value(mgKey* k) const
return value(k,k->id());
}
-string
-mgSelection::id(mgKeyTypes kt, string val) const
-{
- if (loadvalues (kt))
- {
- map<string,string>& idmap = map_ids[kt];
- string v = idmap[val];
- if (kt==keyGenre1) v=v.substr(0,1);
- if (kt==keyGenre2) v=v.substr(0,2);
- if (kt==keyGenre3) v=v.substr(0,3);
- return v;
- }
- else
- return val;
-}
string
mgSelection::id(mgKey* k, string val) const
{
- return id(k->Type(),val);
+ return KeyMaps.id(k->Type(),val);
}
string
@@ -955,17 +895,6 @@ mgSelection::id(mgKey* k) const
return k->id();
}
-bool
-mgSelection::UsedBefore(mgOrder *o,const mgKeyTypes kt,unsigned int level) const
-{
- if (level>=o->size())
- level = o->size() -1;
- for (unsigned int lx = 0; lx < level; lx++)
- if (o->getKeyType(lx)==kt)
- return true;
- return false;
-}
-
bool mgSelection::isLanguagelist() const
{
return (order.getKeyType(0) == keyLanguage);
@@ -994,7 +923,6 @@ mgSelection::inCollection(const string Name) const
void mgSelection::DumpState(mgValmap& nv) const
{
nv.put("FallThrough",m_fall_through);
- nv.put("Directory",m_Directory);
nv.put("Level",int(m_level));
for (unsigned int i=0;i<order.size();i++)
{
@@ -1005,62 +933,28 @@ void mgSelection::DumpState(mgValmap& nv) const
free(n);
}
}
- nv.put("TrackId",m_trackid);
- nv.put("Position",items[m_position].value());
+ nv.put("ItemId",m_itemid);
+ nv.put("Position",listitems[m_position].value());
if (m_level>=order.size()-1)
- nv.put("TrackPosition",getTrackPosition());
+ nv.put("ItemPosition",getItemPosition());
}
map <mgKeyTypes, string>
mgSelection::UsedKeyValues()
{
map <mgKeyTypes, string> result;
- for (unsigned int idx = 0 ; idx < level() ; idx++)
+ for (unsigned int idx = 0 ; idx < m_level ; idx++)
{
result[order.getKeyType(idx)] = order.getKeyItem(idx).value();
}
- if (level() < order.size()-1)
+ if (m_level < order.size()-1)
{
- mgKeyTypes ch = order.getKeyType(level());
+ mgKeyTypes ch = order.getKeyType(m_level);
result[ch] = getCurrentValue();
}
return result;
}
-bool
-mgSelection::loadvalues (mgKeyTypes kt) const
-{
- if (map_ids.count(kt)>0)
- return true;
- map<string,string>& idmap = map_ids[kt];
- mgKey* k = ktGenerate(kt);
- if (k->map_idfield().empty())
- {
- delete k;
- return false;
- }
- map<string,string>& valmap = map_values[kt];
- char *b;
- asprintf(&b,"select %s,%s from %s;",k->map_idfield().c_str(),k->map_valuefield().c_str(),k->map_valuetable().c_str());
- MYSQL_RES *rows = m_db.exec_sql (string(b));
- free(b);
- if (rows)
- {
- MYSQL_ROW row;
- while ((row = mysql_fetch_row (rows)) != 0)
- {
- if (row[0] && row[1])
- {
- valmap[row[0]] = row[1];
- idmap[row[1]] = row[0];
- }
- }
- mysql_free_result (rows);
- }
- delete k;
- return true;
-}
-
static vector<int> keycounts;
unsigned int
@@ -1087,63 +981,3 @@ mgSelection::keycount(mgKeyTypes kt)
}
-vector <const char *>
-mgSelection::choices(mgOrder *o,unsigned int level, unsigned int *current)
-{
- vector<const char*> result;
- if (level>o->size())
- {
- *current = 0;
- return result;
- }
- for (unsigned int ki=int(mgKeyTypesLow);ki<=int(mgKeyTypesHigh);ki++)
- {
- mgKeyTypes kt = mgKeyTypes(ki);
- if (kt==o->getKeyType(level))
- {
- *current = result.size();
- result.push_back(ktName(kt));
- continue;
- }
- if (UsedBefore(o,kt,level))
- continue;
- if (kt==keyDecade && UsedBefore(o,keyYear,level))
- continue;
- if (kt==keyGenre1)
- {
- if (UsedBefore(o,keyGenre2,level)) continue;
- if (UsedBefore(o,keyGenre3,level)) continue;
- if (UsedBefore(o,keyGenres,level)) continue;
- }
- if (kt==keyGenre2)
- {
- if (UsedBefore(o,keyGenre3,level)) continue;
- if (UsedBefore(o,keyGenres,level)) continue;
- }
- if (kt==keyGenre3)
- {
- if (UsedBefore(o,keyGenres,level)) continue;
- }
- if (kt==keyFolder1)
- {
- if (UsedBefore(o,keyFolder2,level)) continue;
- if (UsedBefore(o,keyFolder3,level)) continue;
- if (UsedBefore(o,keyFolder4,level)) continue;
- }
- if (kt==keyFolder2)
- {
- if (UsedBefore(o,keyFolder3,level)) continue;
- if (UsedBefore(o,keyFolder4,level)) continue;
- }
- if (kt==keyFolder3)
- {
- if (UsedBefore(o,keyFolder4,level)) continue;
- }
- if (kt==keyCollection || kt==keyCollectionItem)
- result.push_back(ktName(kt));
- else if (keycount(kt)>1)
- result.push_back(ktName(kt));
- }
- return result;
-}
-