summaryrefslogtreecommitdiff
path: root/mg_selection.c
diff options
context:
space:
mode:
Diffstat (limited to 'mg_selection.c')
-rw-r--r--mg_selection.c286
1 files changed, 138 insertions, 148 deletions
diff --git a/mg_selection.c b/mg_selection.c
index 3656aa2..464bddb 100644
--- a/mg_selection.c
+++ b/mg_selection.c
@@ -20,7 +20,7 @@
#include "mg_selection.h"
#include "vdr_setup.h"
#include "mg_tools.h"
-#include "mg_sync.h"
+#include "mg_thread_sync.h"
#include <mpegfile.h>
#include <flacfile.h>
@@ -53,43 +53,90 @@ comma (string & s, string n)
}
-static string zerostring;
+void
+mgSelection::mgSelItems::clear()
+{
+ m_items.clear();
+}
bool
-mgSelection::mgSelStrings::operator==(const mgSelStrings&x) const
+mgSelection::mgSelItems::operator==(const mgSelItems&x) const
{
- bool result = strings.size()==x.strings.size();
+ bool result = m_items.size()==x.m_items.size();
if (result)
for (unsigned int i=0;i<size();i++)
- result &= strings[i]==x.strings[i];
+ result &= m_items[i]==x.m_items[i];
return result;
}
size_t
-mgSelection::mgSelStrings::size() const
+mgSelection::mgSelItems::size() const
{
if (!m_sel)
- mgError("mgSelStrings: m_sel is 0");
+ mgError("mgSelItems: m_sel is 0");
m_sel->refreshValues();
- return strings.size();
+ return m_items.size();
}
-string&
-mgSelection::mgSelStrings::operator[](unsigned int idx)
+mgSelItem&
+mgSelection::mgSelItems::operator[](unsigned int idx)
{
if (!m_sel)
- mgError("mgSelStrings: m_sel is 0");
+ mgError("mgSelItems: m_sel is 0");
m_sel->refreshValues();
- if (idx>=strings.size()) return zerostring;
- return strings[idx];
+ if (idx>=size()) return zeroitem;
+ return m_items[idx];
}
void
-mgSelection::mgSelStrings::setOwner(mgSelection* sel)
+mgSelection::mgSelItems::setOwner(mgSelection* sel)
{
m_sel = sel;
}
+unsigned int
+mgSelection::mgSelItems::valindex (const string v) const
+{
+ return index(v,true);
+}
+
+unsigned int
+mgSelection::mgSelItems::idindex (const string i) const
+{
+ return index(i,true);
+}
+
+unsigned int
+mgSelection::mgSelItems::index (const string s,bool val,bool second_try) const
+{
+ if (!m_sel)
+ mgError("mgSelItems::index(%s): m_sel is 0",s.c_str());
+ m_sel->refreshValues();
+ for (unsigned int i = 0; i < size (); i++)
+ {
+ if (val)
+ {
+ if (m_items[i].value() == s)
+ return i;
+ }
+ else
+ {
+ if (m_items[i].id() == s)
+ return i;
+ }
+ }
+ // nochmal mit neuen Werten:
+ if (second_try) {
+ esyslog("index: Gibt es nicht:%s",s.c_str());
+ return 0;
+ }
+ else
+ {
+ m_sel->clearCache();
+ return index(s,val,true);
+ }
+}
+
void
mgSelection::clearCache() const
{
@@ -100,19 +147,13 @@ mgSelection::clearCache() const
string
mgSelection::getCurrentValue()
{
- return values[gotoPosition()];
-}
-
-string
-mgSelection::getKeyValue(const unsigned int level) const
-{
- return order.getKeyValue(level);
+ return items[gotoPosition()].value();
}
-unsigned int
-mgSelection::getKeyIndex(const unsigned int level) const
+mgSelItem&
+mgSelection::getKeyItem(const unsigned int level) const
{
- return valindex(getKeyValue(level));
+ return order.getKeyItem(level);
}
@@ -153,11 +194,11 @@ mgSelection::Shuffle() const
{
case SM_NONE:
{
- long id = m_tracks[getTrackPosition()].getId ();
+ long trackid = m_tracks[getTrackPosition()].getTrackid ();
m_current_tracks = ""; // force a reload
tracksize = getNumTracks(); // getNumTracks also reloads
for (unsigned int i = 0; i < tracksize; i++)
- if (m_tracks[i].getId () == id)
+ if (m_tracks[i].getTrackid () == trackid)
{
setTrackPosition(i);
break;
@@ -233,7 +274,7 @@ mgSelection::AddToCollection (const string Name)
long first = atol(m_db.get_col0(sql).c_str()) - tracksize + 1;
// replace the place holder trackid by the correct value:
- m_db.exec_sql("UPDATE playlistitem SET trackid="+ltos(m_tracks[tracksize-1].getId())+
+ m_db.exec_sql("UPDATE playlistitem SET trackid="+ltos(m_tracks[tracksize-1].getTrackid())+
" WHERE playlist="+listid+" AND trackid="+trackid);
// insert all other tracks:
@@ -242,7 +283,7 @@ mgSelection::AddToCollection (const string Name)
for (unsigned int i = 0; i < tracksize-1; i++)
{
string item = "(" + listid + "," + ltos (first + i) + "," +
- ltos (m_tracks[i].getId ()) + ")";
+ ltos (m_tracks[i].getTrackid ()) + ")";
comma(sql, item);
if ((i%100)==99)
{
@@ -315,7 +356,7 @@ string mgSelection::exportM3U ()
mgContentItem& t = m_tracks[i];
fprintf (listfile, "#EXTINF:%d,%s\n", t.getDuration (),
t.getTitle ().c_str ());
- fprintf (listfile, "#MUGGLE:%ld\n", t.getId());
+ fprintf (listfile, "#MUGGLE:%ld\n", t.getTrackid());
fprintf (listfile, "%s\n", t.getSourceFile (false).c_str ());
}
fclose (listfile);
@@ -328,7 +369,7 @@ mgSelection::empty()
if (m_level>= order.size ()-1)
return ( getNumTracks () == 0);
else
- return ( values.size () == 0);
+ return ( items.size () == 0);
}
void
@@ -362,11 +403,11 @@ mgSelection::gotoPosition ()
return gotoTrackPosition();
else
{
- unsigned int valsize = values.size();
- if (valsize==0)
+ unsigned int itemsize = items.size();
+ if (itemsize==0)
m_position = 0;
- else if (m_position >= valsize)
- m_position = valsize -1;
+ else if (m_position >= itemsize)
+ m_position = itemsize -1;
return m_position;
}
}
@@ -448,7 +489,7 @@ string mgSelection::getListname () const
{
list<string> st;
for (unsigned int i = 0; i < m_level; i++)
- st.push_back(order.getKeyValue(i));
+ st.push_back(order.getKeyItem(i).value());
st.unique();
string result="";
for (list < string >::iterator it = st.begin (); it != st.end (); ++it)
@@ -502,6 +543,7 @@ mgSelection::tracks () const
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++)
@@ -537,7 +579,7 @@ void mgSelection::InitSelection() {
else
m_loop_mode = LM_NONE;
clearCache();
- values.setOwner(this);
+ items.setOwner(this);
}
@@ -591,9 +633,12 @@ mgSelection::InitFrom(mgValmap& nv)
m_db.Create();
if (Interface->Confirm(tr("Import tracks?")))
{
- mgSync *s = new mgSync;
- s->Sync(argv);
- delete s;
+ mgThreadSync *s = mgThreadSync::get_instance();
+ if (s)
+ {
+ extern char *sync_args[];
+ s->Sync(sync_args,the_setup.DeleteStaleReferences);
+ }
}
}
free(b);
@@ -644,49 +689,11 @@ mgSelection::ordersize ()
}
unsigned int
-mgSelection::valindex (const string val,const bool second_try) const
-{
- for (unsigned int i = 0; i < values.size (); i++)
- {
- if (values[i] == val)
- return i;
- }
- // nochmal mit neuen Werten:
- clearCache();
- refreshValues();
- if (second_try) {
- esyslog("valindex: Gibt es nicht:%s",val.c_str());
- return 0;
- }
- else
- return valindex(val,true);
-}
-
-unsigned int
mgSelection::valcount (string value)
{
- assert(m_counts.size()==values.size());
- return m_counts[valindex(value)];
+ return items[items.valindex(value)].count();
}
-unsigned int
-mgSelection::idindex (const string id,const bool second_try) const
-{
- for (unsigned int i = 0; i < m_ids.size (); i++)
- if (m_ids[i] == id)
- return i;
- // nochmal mit neuen Werten:
- clearCache();
- refreshValues();
- if (second_try) {
- mgWarning("idindex: Gibt es nicht:%s",id.c_str());
- return 0;
- }
- else
- return idindex(id,true);
-}
-
-
void
mgSelection::refreshValues () const
{
@@ -697,9 +704,7 @@ mgSelection::refreshValues () const
{
mgParts p = order.Parts(m_db,m_level);
m_current_values = p.sql_select();
- values.strings.clear ();
- m_ids.clear ();
- m_counts.clear();
+ items.clear ();
MYSQL_RES *rows = m_db.exec_sql (m_current_values);
if (rows)
{
@@ -709,22 +714,17 @@ mgSelection::refreshValues () const
{
if (!row[0]) continue;
string r0 = row[0];
- if (r0=="NULL") // there is a genre NULL!
+ if (!strcmp(row[0],"NULL")) // there is a genre NULL!
continue;
+ mgSelItem n;
if (num_fields==3)
{
if (!row[1]) continue;
- string r1 = row[1];
- values.strings.push_back (r0);
- m_ids.push_back (r1);
- m_counts.push_back(atol(row[2]));
+ n.set(row[0],row[1],atol(row[2]));
}
else
- {
- values.strings.push_back (value(order.Key(m_level),r0));
- m_ids.push_back (r0);
- m_counts.push_back(atol(row[1]));
- }
+ n.set(value(order.Key(m_level),r0),r0,atol(row[1]));
+ items.push_back(n);
}
mysql_free_result (rows);
}
@@ -734,7 +734,7 @@ mgSelection::refreshValues () const
unsigned int
mgSelection::count () const
{
- return values.size ();
+ return items.size ();
}
@@ -746,18 +746,17 @@ bool mgSelection::enter (unsigned int position)
return false;
setPosition (position);
position = gotoPosition(); // reload adjusted position
- if (values.size()==0)
+ if (items.size()==0)
return false;
- string value = values[position];
- string id = m_ids[position];
- mgSelStrings prev;
- if (m_fall_through && values.size()<10)
- prev=values;
+ mgSelItem item = items[position];
+ mgSelItems prev;
+ if (m_fall_through && items.size()<10)
+ prev=items;
while (1)
{
if (m_level >= order.size () - 1)
return false;
- order[m_level++]->set (value,id);
+ order[m_level++]->set (item);
clearCache();
if (m_level >= order.size())
mgError("mgSelection::enter(%u): level greater than order.size() %u",
@@ -766,13 +765,12 @@ bool mgSelection::enter (unsigned int position)
refreshValues();
if (count()==0)
break;
- value = values[0];
- id = m_ids[0];
+ item=items[0];
if (!m_fall_through)
break;
if (m_level==order.size()-1)
break;
- if (count () > 1 && !(prev==values))
+ if (count () > 1 && !(prev==items))
break;
}
return true;
@@ -785,9 +783,9 @@ bool mgSelection::select (unsigned int position)
{
if (getNumTracks () <= position)
return false;
- order[m_level]->set (values[position],m_ids[position]);
+ order[m_level]->set (items[position]);
m_level++;
- m_trackid = m_tracks[position].getId ();
+ m_trackid = m_tracks[position].getTrackid ();
clearCache();
return true;
@@ -808,28 +806,28 @@ mgSelection::leave ()
if (m_level == order.size ())
{
m_level--;
- prevvalue=order.getKeyValue(m_level);
- order[m_level]->set("",EMPTY);
+ prevvalue=order.getKeyItem(m_level).value();
+ order[m_level]->set(zeroitem);
m_trackid = -1;
clearCache();
setPosition(prevvalue);
return true;
}
- mgSelStrings prev;
- if (m_fall_through && values.size()<10)
- prev=values;
+ mgSelItems prev;
+ if (m_fall_through && items.size()<10)
+ prev=items;
while (1)
{
if (m_level < 1)
return false;
- if (m_level<order.size()) order[m_level]->set ("",EMPTY);
+ if (m_level<order.size()) order[m_level]->set (zeroitem);
m_level--;
- prevvalue=order.getKeyValue(m_level);
- if (m_level<order.size()) order[m_level]->set ("",EMPTY);
+ prevvalue=order.getKeyItem(m_level).value();
+ if (m_level<order.size()) order[m_level]->set (zeroitem);
clearCache();
if (!m_fall_through)
break;
- if (count () > 1 && !(prev==values))
+ if (count () > 1 && !(prev==items))
break;
}
setPosition(prevvalue);
@@ -841,7 +839,7 @@ mgSelection::leave_all ()
{
m_level=0;
for (unsigned int i=0;i<ordersize();i++)
- order[i]->set ("",EMPTY);
+ order[i]->set (zeroitem);
clearCache();
}
@@ -849,67 +847,59 @@ void
mgSelection::selectfrom(mgOrder& oldorder,mgContentItem* o)
{
leave_all();
- string selval;
- string selid;
+ mgSelItem selitem;
assert(m_level==0);
for (unsigned int idx = 0; idx < ordersize(); idx++)
{
- selval = EMPTY;
- selid = EMPTY;
+ selitem = zeroitem;
mgKeyTypes new_kt = getKeyType(idx);
for (unsigned int i=0;i<oldorder.size();i++)
{
mgKeyTypes old_kt = oldorder.getKeyType(i);
if (old_kt==new_kt)
- {
- selval = oldorder.getKeyValue(i);
- selid = oldorder.getKeyId(i);
- }
+ selitem = oldorder.getKeyItem(i);
else if (old_kt>new_kt
&& iskeyGenre(old_kt)
&& iskeyGenre(new_kt))
{
- selid = id(new_kt,value(new_kt,oldorder.getKeyId(i)));
- selval= value(new_kt,selid);
+ string selid=id(new_kt,value(new_kt,oldorder.getKeyItem(i).id()));
+ selitem=mgSelItem (value(new_kt,selid),selid);
}
- if (selid!=EMPTY) break;
- }
- if (selid==EMPTY && o && o->getId()>=0)
- {
- selval = o->getKeyValue(new_kt);
- selid = o->getKeyId(new_kt);
+ if (selitem.valid()) break;
}
- if (selid==EMPTY)
+ if (!selitem.valid() && o && o->getTrackid()>=0)
+ selitem = o->getKeyItem(new_kt);
+ if (!selitem.valid())
break;
if (m_level<ordersize()-1)
{
- order[m_level++]->set (selval, selid);
+ order[m_level++]->set (selitem);
}
else
{
- setPosition(selval);
+ setPosition(selitem.value());
return;
}
}
if (m_level>0)
{
m_level--;
- selval = order.getKeyValue(m_level);
- order[m_level]->set("",EMPTY);
- setPosition(selval);
- order[m_level+1]->set("",EMPTY);
+ selitem = order.getKeyItem(m_level);
+ order[m_level]->set(zeroitem);
+ setPosition(selitem.value());
+ order[m_level+1]->set(zeroitem);
}
assert(m_level<ordersize());
}
string
-mgSelection::value(mgKeyTypes kt, string id) const
+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(id);
+ it = valmap.find(idstr);
if (it!=valmap.end())
{
string r = it->second;
@@ -918,17 +908,17 @@ mgSelection::value(mgKeyTypes kt, string id) const
}
map_ids[kt].clear();
loadvalues(kt);
- it = valmap.find(id);
+ it = valmap.find(idstr);
if (it!=valmap.end())
- return valmap[id];
+ return valmap[idstr];
}
- return id;
+ return idstr;
}
string
-mgSelection::value(mgKey* k, string id) const
+mgSelection::value(mgKey* k, string idstr) const
{
- return value(k->Type(),id);
+ return value(k->Type(),idstr);
}
string
@@ -996,7 +986,7 @@ mgSelection::inCollection(const string Name) const
if (order.getKeyType(1) != keyCollectionItem)
mgError("inCollection: key[1] is not keyCollectionItem");
if (!Name.empty())
- result &= (order.getKeyValue(0) == Name);
+ result &= (order.getKeyItem(0).value() == Name);
return result;
}
@@ -1011,12 +1001,12 @@ void mgSelection::DumpState(mgValmap& nv) const
if (i<m_level) {
char *n;
asprintf(&n,"order.Keys.%u.Position",i);
- nv.put(n,getKeyValue(i));
+ nv.put(n,getKeyItem(i).value());
free(n);
}
}
nv.put("TrackId",m_trackid);
- nv.put("Position",values[m_position]);
+ nv.put("Position",items[m_position].value());
if (m_level>=order.size()-1)
nv.put("TrackPosition",getTrackPosition());
}
@@ -1027,7 +1017,7 @@ mgSelection::UsedKeyValues()
map <mgKeyTypes, string> result;
for (unsigned int idx = 0 ; idx < level() ; idx++)
{
- result[order.getKeyType(idx)] = order.getKeyValue(idx);
+ result[order.getKeyType(idx)] = order.getKeyItem(idx).value();
}
if (level() < order.size()-1)
{