return eEPGCache::getInstance()->lookupEventTime(ref, start_time, ptr);
}
-int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate)
{
ePtr<eDVBResourceManager> res_mgr;
if ( eDVBResourceManager::getInstance( res_mgr ) )
eDVBChannelID chid, chid_ignore;
((const eServiceReferenceDVB&)ref).getChannelID(chid);
((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
- return res_mgr->canAllocateChannel(chid, chid_ignore);
+ return res_mgr->canAllocateChannel(chid, chid_ignore, simulate);
}
return 0;
}
DEFINE_REF(eDVBDB);
- /* THIS CODE IS BAD. it should be replaced by somethine better. */
void eDVBDB::reloadServicelist()
+{
+ loadServicelist(CONFIGDIR"/enigma2/lamedb");
+}
+
+void eDVBDB::parseServiceData(ePtr<eDVBService> s, std::string str)
+{
+ while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d...
+ {
+ size_t c=str.find(',');
+ char p=str[0];
+ std::string v;
+ if (c == std::string::npos)
+ {
+ v=str.substr(2);
+ str="";
+ } else
+ {
+ v=str.substr(2, c-2);
+ str=str.substr(c+1);
+ }
+// eDebug("%c ... %s", p, v.c_str());
+ if (p == 'p')
+ s->m_provider_name=v;
+ else if (p == 'f')
+ {
+ sscanf(v.c_str(), "%x", &s->m_flags);
+ } else if (p == 'c')
+ {
+ int cid, val;
+ sscanf(v.c_str(), "%02d%x", &cid, &val);
+ s->setCacheEntry((eDVBService::cacheID)cid,val);
+ } else if (p == 'C')
+ {
+ int val;
+ sscanf(v.c_str(), "%04x", &val);
+ s->m_ca.push_front((uint16_t)val);
+ }
+ }
+}
+
+ /* THIS CODE IS BAD. it should be replaced by somethine better. */
+void eDVBDB::loadServicelist(const char *file)
{
eDebug("---- opening lame channel db");
- FILE *f=fopen(CONFIGDIR"/enigma2/lamedb", "rt");
- if (!f)
+ FILE *f=fopen(file, "rt");
+ if (!f && strcmp(file, CONFIGDIR"/enigma2/lamedb") == 0)
{
struct stat s;
if ( !stat("lamedb", &s) )
return;
}
char line[256];
- if ((!fgets(line, 256, f)) || strncmp(line, "eDVB services", 13))
+ int version=3;
+ if ((!fgets(line, 256, f)) || sscanf(line, "eDVB services /%d/", &version) != 1)
{
- eDebug("not a servicefile");
+ eDebug("not a valid servicefile");
fclose(f);
return;
}
- eDebug("reading services");
+ eDebug("reading services (version %d)", version);
if ((!fgets(line, 256, f)) || strcmp(line, "transponders\n"))
{
eDebug("services invalid, no transponders");
{
eDVBFrontendParametersSatellite sat;
int frequency, symbol_rate, polarisation, fec, orbital_position, inversion,
- system=eDVBFrontendParametersSatellite::System::DVB_S,
- modulation=eDVBFrontendParametersSatellite::Modulation::QPSK,
- rolloff=eDVBFrontendParametersSatellite::RollOff::alpha_auto;
- sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion, &system, &modulation, &rolloff);
+ flags=0,
+ system=eDVBFrontendParametersSatellite::System_DVB_S,
+ modulation=eDVBFrontendParametersSatellite::Modulation_QPSK,
+ rolloff=eDVBFrontendParametersSatellite::RollOff_alpha_0_35,
+ pilot=eDVBFrontendParametersSatellite::Pilot_Unknown;
+ if (version == 3)
+ sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion, &system, &modulation, &rolloff, &pilot);
+ else
+ sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion, &flags, &system, &modulation, &rolloff, &pilot);
sat.frequency = frequency;
sat.symbol_rate = symbol_rate;
sat.polarisation = polarisation;
sat.inversion = inversion;
sat.system = system;
sat.modulation = modulation;
- sat.roll_off = rolloff;
+ sat.rolloff = rolloff;
+ sat.pilot = pilot;
feparm->setDVBS(sat);
+ feparm->setFlags(flags);
} else if (line[1]=='t')
{
eDVBFrontendParametersTerrestrial ter;
- int frequency, bandwidth, code_rate_HP, code_rate_LP, modulation, transmission_mode, guard_interval, hierarchy, inversion;
- sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &bandwidth, &code_rate_HP, &code_rate_LP, &modulation, &transmission_mode, &guard_interval, &hierarchy, &inversion);
+ int frequency, bandwidth, code_rate_HP, code_rate_LP, modulation, transmission_mode, guard_interval, hierarchy, inversion, flags=0;
+ sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &bandwidth, &code_rate_HP, &code_rate_LP, &modulation, &transmission_mode, &guard_interval, &hierarchy, &inversion, &flags);
ter.frequency = frequency;
ter.bandwidth = bandwidth;
ter.code_rate_HP = code_rate_HP;
ter.hierarchy = hierarchy;
ter.inversion = inversion;
feparm->setDVBT(ter);
+ feparm->setFlags(flags);
} else if (line[1]=='c')
{
eDVBFrontendParametersCable cab;
int frequency, symbol_rate,
- inversion=eDVBFrontendParametersCable::Inversion::Unknown,
- modulation=eDVBFrontendParametersCable::Modulation::Auto,
- fec_inner=eDVBFrontendParametersCable::FEC::fAuto;
- sscanf(line+3, "%d:%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation, &fec_inner);
+ inversion=eDVBFrontendParametersCable::Inversion_Unknown,
+ modulation=eDVBFrontendParametersCable::Modulation_Auto,
+ fec_inner=eDVBFrontendParametersCable::FEC_Auto,
+ flags=0;
+ sscanf(line+3, "%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation, &fec_inner, &flags);
cab.frequency = frequency;
cab.fec_inner = fec_inner;
cab.inversion = inversion;
cab.symbol_rate = symbol_rate;
cab.modulation = modulation;
feparm->setDVBC(cab);
+ feparm->setFlags(flags);
}
}
addChannelToList(channelid, feparm);
fgets(line, 256, f);
if (strlen(line))
line[strlen(line)-1]=0;
- std::string str=line;
-
- if (str[1]!=':') // old ... (only service_provider)
- {
+ if (line[1]!=':') // old ... (only service_provider)
s->m_provider_name=line;
- } else
- while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d...
- {
- size_t c=str.find(',');
- char p=str[0];
- std::string v;
- if (c == std::string::npos)
- {
- v=str.substr(2);
- str="";
- } else
- {
- v=str.substr(2, c-2);
- str=str.substr(c+1);
- }
-// eDebug("%c ... %s", p, v.c_str());
- if (p == 'p')
- s->m_provider_name=v;
- else if (p == 'f')
- {
- sscanf(v.c_str(), "%x", &s->m_flags);
- } else if (p == 'c')
- {
- int cid, val;
- sscanf(v.c_str(), "%02d%x", &cid, &val);
- s->setCacheEntry((eDVBService::cacheID)cid,val);
- } else if (p == 'C')
- {
- int val;
- sscanf(v.c_str(), "%04x", &val);
- s->m_ca.push_front((uint16_t)val);
- }
- }
+ else
+ parseServiceData(s, line);
addService(ref, s);
}
fclose(f);
}
-void eDVBDB::saveServicelist()
+void eDVBDB::saveServicelist(const char *file)
{
eDebug("---- saving lame channel db");
- FILE *f=fopen(CONFIGDIR"/enigma2/lamedb", "w");
+ FILE *f=fopen(file, "w");
int channels=0, services=0;
if (!f)
eFatal("couldn't save lame channel db!");
- fprintf(f, "eDVB services /3/\n");
+ fprintf(f, "eDVB services /4/\n");
fprintf(f, "transponders\n");
for (std::map<eDVBChannelID, channel>::const_iterator i(m_channels.begin());
i != m_channels.end(); ++i)
eDVBFrontendParametersSatellite sat;
eDVBFrontendParametersTerrestrial ter;
eDVBFrontendParametersCable cab;
+ unsigned int flags; // flagOnlyFree yet..
+ ch.m_frontendParameters->getFlags(flags);
if (!ch.m_frontendParameters->getDVBS(sat))
{
- if (sat.system == eDVBFrontendParametersSatellite::System::DVB_S2)
+ if (sat.system == eDVBFrontendParametersSatellite::System_DVB_S2)
{
- fprintf(f, "\ts %d:%d:%d:%d:%d:%d:%d:%d:%d\n",
+ fprintf(f, "\ts %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
sat.frequency, sat.symbol_rate,
sat.polarisation, sat.fec,
sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position,
sat.inversion,
+ flags,
sat.system,
sat.modulation,
- sat.roll_off);
+ sat.rolloff,
+ sat.pilot);
}
else
{
- fprintf(f, "\ts %d:%d:%d:%d:%d:%d\n",
+ fprintf(f, "\ts %d:%d:%d:%d:%d:%d:%d\n",
sat.frequency, sat.symbol_rate,
sat.polarisation, sat.fec,
sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position,
- sat.inversion);
+ sat.inversion, flags);
}
}
else if (!ch.m_frontendParameters->getDVBT(ter))
{
- fprintf(f, "\tt %d:%d:%d:%d:%d:%d:%d:%d:%d\n",
+ fprintf(f, "\tt %d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
ter.frequency, ter.bandwidth, ter.code_rate_HP,
ter.code_rate_LP, ter.modulation, ter.transmission_mode,
- ter.guard_interval, ter.hierarchy, ter.inversion);
+ ter.guard_interval, ter.hierarchy, ter.inversion, flags);
}
else if (!ch.m_frontendParameters->getDVBC(cab))
{
- fprintf(f, "\tc %d:%d:%d:%d:%d\n",
- cab.frequency, cab.symbol_rate, cab.inversion, cab.modulation, cab.fec_inner);
+ fprintf(f, "\tc %d:%d:%d:%d:%d:%d\n",
+ cab.frequency, cab.symbol_rate, cab.inversion, cab.modulation, cab.fec_inner, flags);
}
fprintf(f, "/\n");
channels++;
fclose(f);
}
+void eDVBDB::saveServicelist()
+{
+ saveServicelist(CONFIGDIR"/enigma2/lamedb");
+}
+
void eDVBDB::loadBouquet(const char *path)
{
std::string bouquet_name = path;
return Py_False;
}
int tmp, *dest = NULL,
- modulation, system, freq, sr, pol, fec;
+ modulation, system, freq, sr, pol, fec, inv, pilot, rolloff, tsid, onid;
char *end_ptr;
const Attribute *at;
std::string name;
PyDict_SetItem(tp_dict, sat_pos, tplist);
for (ElementConstIterator it(sat_elements.begin()); it != sat_elements.end(); ++it)
{
-// eDebug("\telement: %s", (*it)->name().c_str());
+ //eDebug("\telement: %s", (*it)->name().c_str());
const AttributeList &tp_attributes = (*it)->getAttributeList();
AttributeConstIterator end = tp_attributes.end();
- modulation = 1; // QPSK default
- system = 0; // DVB-S default
+ modulation = eDVBFrontendParametersSatellite::Modulation_QPSK;
+ system = eDVBFrontendParametersSatellite::System_DVB_S;
freq = 0;
sr = 0;
pol = -1;
- fec = 0; // AUTO default
+ fec = eDVBFrontendParametersSatellite::FEC_Auto;
+ inv = eDVBFrontendParametersSatellite::Inversion_Unknown;
+ pilot = eDVBFrontendParametersSatellite::Pilot_Unknown;
+ rolloff = eDVBFrontendParametersSatellite::RollOff_alpha_0_35;
+ tsid = -1;
+ onid = -1;
+
for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it)
{
-// eDebug("\t\tattr: %s", at->name().c_str());
at = *it;
+ //eDebug("\t\tattr: %s", at->name().c_str());
name = at->name();
if (name == "modulation") dest = &modulation;
else if (name == "system") dest = &system;
else if (name == "symbol_rate") dest = &sr;
else if (name == "polarization") dest = &pol;
else if (name == "fec_inner") dest = &fec;
+ else if (name == "inversion") dest = &inv;
+ else if (name == "rolloff") dest = &rolloff;
+ else if (name == "pilot") dest = &pilot;
+ else if (name == "tsid") dest = &tsid;
+ else if (name == "onid") dest = &onid;
if (dest)
{
+ //eDebug("\t\t\tvalue: %s", at->value().c_str());
tmp = strtol(at->value().c_str(), &end_ptr, 10);
if (!*end_ptr)
*dest = tmp;
}
if (freq && sr && pol != -1)
{
- tuple = PyTuple_New(7);
+ tuple = PyTuple_New(12);
PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(0));
PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(freq));
PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(sr));
PyTuple_SET_ITEM(tuple, 4, PyInt_FromLong(fec));
PyTuple_SET_ITEM(tuple, 5, PyInt_FromLong(system));
PyTuple_SET_ITEM(tuple, 6, PyInt_FromLong(modulation));
+ PyTuple_SET_ITEM(tuple, 7, PyInt_FromLong(inv));
+ PyTuple_SET_ITEM(tuple, 8, PyInt_FromLong(rolloff));
+ PyTuple_SET_ITEM(tuple, 9, PyInt_FromLong(pilot));
+ PyTuple_SET_ITEM(tuple, 10, PyInt_FromLong(tsid));
+ PyTuple_SET_ITEM(tuple, 11, PyInt_FromLong(onid));
PyList_Append(tplist, tuple);
Py_DECREF(tuple);
}
// eDebug("\telement: %s", (*it)->name().c_str());
const AttributeList &tp_attributes = (*it)->getAttributeList();
AttributeConstIterator end = tp_attributes.end();
- modulation = 3; // QAM64 default
- fec = 0; // AUTO default
+ modulation = eDVBFrontendParametersCable::Modulation_QAM64;
+ fec = eDVBFrontendParametersCable::FEC_Auto;
freq = 0;
sr = 0;
for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it)
const AttributeList &tp_attributes = (*it)->getAttributeList();
AttributeConstIterator end = tp_attributes.end();
freq = 0;
- bw = 3; // AUTO
- constellation = 1; // AUTO
- crh = 5; // AUTO
- crl = 5; // AUTO
- guard = 4; // AUTO
- transm = 2; // AUTO
- hierarchy = 4; // AUTO
- inv = 2; // AUTO
+ bw = eDVBFrontendParametersTerrestrial::Bandwidth_Auto;
+ constellation = eDVBFrontendParametersTerrestrial::Modulation_Auto;
+ crh = eDVBFrontendParametersTerrestrial::FEC_Auto;
+ crl = eDVBFrontendParametersTerrestrial::FEC_Auto;
+ guard = eDVBFrontendParametersTerrestrial::GuardInterval_Auto;
+ transm = eDVBFrontendParametersTerrestrial::TransmissionMode_Auto;
+ hierarchy = eDVBFrontendParametersTerrestrial::Hierarchy_Auto;
+ inv = eDVBFrontendParametersTerrestrial::Inversion_Unknown;
for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it)
{
// eDebug("\t\tattr: %s", at->name().c_str());
if ((unsigned int)sat.orbital_position != orbpos)
remove=false;
}
- if ( remove && chid.dvbnamespace != eNs )
+ if ( remove && chid.dvbnamespace != eNs ) // namespace given?
{
- if (system == iDVBFrontend::feCable && chid.dvbnamespace.get() == 0xFFFF0000)
+ if ( system == iDVBFrontend::feCable && chid.dvbnamespace.get() == (int)0xFFFF0000 )
;
- else if (system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == 0xEEEE0000)
+ else if ( system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == (int)0xEEEE0000 )
;
else if ( chid.dvbnamespace != ch.dvbnamespace )
remove=false;
}
+ else if ( system == iDVBFrontend::feCable || system == iDVBFrontend::feTerrestrial )
+ remove=false;
if ( remove && chid.original_network_id != eOnid && chid.original_network_id != ch.original_network_id )
remove=false;
if ( remove && chid.transport_stream_id != eTsid && chid.transport_stream_id != ch.transport_stream_id )
return ret;
}
+RESULT eDVBDB::removeServices(iDVBFrontendParameters *feparm)
+{
+ int ret = -1;
+ std::set<eDVBChannelID> removed_chids;
+ std::map<eDVBChannelID, channel>::iterator it(m_channels.begin());
+ while (it != m_channels.end())
+ {
+ int diff;
+ if (!feparm->calculateDifference(&(*it->second.m_frontendParameters), diff, false))
+ {
+ if (diff < 4000)
+ {
+ removed_chids.insert(it->first);
+ m_channels.erase(it++);
+ }
+ else
+ ++it;
+ }
+ else
+ ++it;
+ }
+ if (!removed_chids.empty())
+ {
+ std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator service(m_services.begin());
+ while(service != m_services.end())
+ {
+ eDVBChannelID chid;
+ service->first.getChannelID(chid);
+ std::set<eDVBChannelID>::iterator it(removed_chids.find(chid));
+ if (it != removed_chids.end())
+ m_services.erase(service++);
+ else
+ ++service;
+ }
+ ret = 0;
+ }
+ return ret;
+}
+
RESULT eDVBDB::addFlag(const eServiceReference &ref, unsigned int flagmask)
{
if (ref.type == eServiceReference::idDVB)
}
if ( remove && chid.dvbnamespace != eNs )
{
- if (system == iDVBFrontend::feCable && chid.dvbnamespace.get() == 0xFFFF0000)
+ if (system == iDVBFrontend::feCable && chid.dvbnamespace.get() == (int)0xFFFF0000)
;
- else if (system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == 0xEEEE0000)
+ else if (system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == (int)0xEEEE0000)
;
else if ( chid.dvbnamespace != ch.dvbnamespace )
remove=false;
RESULT eDVBDB::addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)
{
channel ch;
- assert(feparm);
+ std::map<eDVBChannelID, channel>::iterator it = m_channels.find(id);
+ ASSERT(feparm);
ch.m_frontendParameters = feparm;
- m_channels.insert(std::pair<eDVBChannelID, channel>(id, ch));
+ if (it != m_channels.end())
+ it->second = ch;
+ else
+ m_channels.insert(std::pair<eDVBChannelID, channel>(id, ch));
return 0;
}
{
ePtr<eDVBService> a_service, b_service;
int sortmode = m_query ? m_query->m_sort : eDVBChannelQuery::tName;
-
+
if ((sortmode == eDVBChannelQuery::tName) || (sortmode == eDVBChannelQuery::tProvider))
{
if (a.name.empty() && m_db->getService(a, a_service))
if (b.name.empty() && m_db->getService(b, b_service))
return 1;
}
-
+
switch (sortmode)
{
case eDVBChannelQuery::tName:
{
while (m_cursor != m_db->m_services.end())
{
- ref = m_cursor->first;
+ ePtr<eDVBService> service = m_cursor->second;
+ if (service->isHidden())
+ ++m_cursor;
+ else
+ {
+ ref = m_cursor->first;
- int res = (!m_query) || m_cursor->second->checkFilter(ref, *m_query);
+ int res = (!m_query) || service->checkFilter(ref, *m_query);
- ++m_cursor;
+ ++m_cursor;
- if (res)
- return 0;
+ if (res)
+ return 0;
+ }
}
ref.type = eServiceReference::idInvalid;
std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it =
m_db->m_services.find(ref);
- int res = (!m_query) || it == m_db->m_services.end() || it->second->checkFilter(ref, *m_query);
+ int res = (!m_query) || it == m_db->m_services.end() || !(it->second->isHidden() && it->second->checkFilter(ref, *m_query));
++m_cursor;
for (std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_db->m_services.begin());
it != m_db->m_services.end(); ++it)
{
- int res = it->second->checkFilter(it->first, *query);
+ int res = !it->second->isHidden() && it->second->checkFilter(it->first, *query);
if (res)
{
unsigned int dvbnamespace = it->first.getDVBNamespace().get()&0xFFFF0000;
for (std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_db->m_services.begin());
it != m_db->m_services.end(); ++it)
{
- int res = it->second->checkFilter(it->first, *query);
+ int res = !it->second->isHidden() && it->second->checkFilter(it->first, *query);
if (res)
{
const char *provider_name = it->second->m_provider_name.length() ?
RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::const_iterator begin, std::list<std::string>::const_iterator end)
{
std::list<std::string>::const_iterator end_of_exp;
-
+
if (begin == end)
return 0;
-
+
if (*begin == "(")
{
end_of_exp = begin;
break;
else
++end_of_exp;
-
+
if (end_of_exp == end)
{
eDebug("expression parse: end of expression while searching for closing brace");
return -1;
}
-
+
++begin;
// begin..end_of_exp
int r = parseExpression(res, begin, end_of_exp);
if (r)
return r;
++end_of_exp;
-
+
/* we had only one sub expression */
if (end_of_exp == end)
{
// eDebug("only one sub expression");
return 0;
}
-
+
/* otherwise we have an operator here.. */
-
+
ePtr<eDVBChannelQuery> r2 = res;
res = new eDVBChannelQuery();
res->m_sort = 0;
res->m_p1 = r2;
res->m_inverse = 0;
r2 = 0;
-
+
if (*end_of_exp == "||")
res->m_type = eDVBChannelQuery::tOR;
else if (*end_of_exp == "&&")
res = 0;
return 1;
}
-
+
++end_of_exp;
-
+
return parseExpression(res->m_p2, end_of_exp, end);
}
-
+
// "begin" <op> "end"
std::string type, op, val;
-
+
res = new eDVBChannelQuery();
res->m_sort = 0;
-
+
int cnt = 0;
while (begin != end)
{
++begin;
++cnt;
}
-
+
if (cnt != 3)
{
eDebug("malformed query: missing stuff");
res = 0;
return 1;
}
-
+
res->m_type = decodeType(type);
-
+
if (res->m_type == -1)
{
eDebug("malformed query: invalid type %s", type.c_str());
res = 0;
return 1;
}
-
+
if (op == "==")
res->m_inverse = 0;
else if (op == "!=")
res = 0;
return 1;
}
-
+
res->m_string = val;
if (res->m_type == eDVBChannelQuery::tChannelID)
RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
{
std::list<std::string> tokens;
-
+
std::string current_token;
std::string bouquet_name;
{
int c = (i < query.size()) ? query[i] : ' ';
++i;
-
+
int issplit = !!strchr(splitchars, c);
int isaln = isalnum(c);
int iswhite = c == ' ';
int isquot = c == '\"';
-
+
if (quotemode)
{
iswhite = issplit = 0;
isaln = lastalnum;
}
-
+
if (issplit || iswhite || isquot || lastsplit || (lastalnum != isaln))
{
if (current_token.size())
tokens.push_back(current_token);
current_token.clear();
}
-
+
if (!(iswhite || isquot))
current_token += c;
-
+
if (isquot)
quotemode = !quotemode;
lastsplit = issplit;
lastalnum = isaln;
}
-
+
// for (std::list<std::string>::const_iterator a(tokens.begin()); a != tokens.end(); ++a)
// {
// printf("%s\n", a->c_str());
res = 0;
return -1;
}
-
+
// eDebug("sort by %d", sort);
-
+
/* now we recursivly parse that. */
int r = parseExpression(res, tokens.begin(), tokens.end());
-
+
/* we have an empty (but valid!) expression */
if (!r && !res)
{
res->m_inverse = 0;
res->m_type = eDVBChannelQuery::tAny;
}
-
+
if (res)
{
res->m_sort = sort;