|(.*)
|(.*)
)";
+ static const QString NUMBER_REGEXP = "
(.*)
";
+ static const QString LOGIN_CHECK = "
results = it.value()->results;
+ SearchDetails details = it.value()->details;
+
+ abort();
+
+ setError(TIMEOUT, TIMEOUT_STRING);
+
+ emit requestFinished(results, details, true);
+ }
+ }
}
void Eniro::login(QString const& username,
@@ -114,23 +135,14 @@ void Eniro::logout()
loggedIn_ = false;
}
-void Eniro::testLogin()
+void Eniro::search(SearchDetails const& details)
{
- QUrl url = createUrl("", "");
-
- url.addQueryItem("what", "mobwp");
- http_.setHost(url.host(), url.port(80));
- int id = http_.get(url.encodedPath() + '?' + url.encodedQuery());
-
- pendingLoginRequests_.insert(id);
-}
+ resetTimeout();
-bool Eniro::search(SearchDetails const& details)
-{
SearchType type = details.type;
// Only logged in users can use other than person search
- if(!loggedIn_)
+ if(!loggedIn_ && site_ == FI)
{
type = PERSONS;
}
@@ -138,7 +150,7 @@ bool Eniro::search(SearchDetails const& details)
QUrl url = createUrl(details.query, details.location);
QString what;
- if(loggedIn_)
+ if(loggedIn_ || site_ != FI)
{
switch(type)
{
@@ -152,6 +164,7 @@ bool Eniro::search(SearchDetails const& details)
default:
what = "moball";
+ break;
}
}
@@ -165,7 +178,7 @@ bool Eniro::search(SearchDetails const& details)
http_.setHost(url.host(), url.port(80));
int id = http_.get(url.encodedPath() + '?' + url.encodedQuery());
- QVector
results;
+ QVector results;
// Store search data for later identification
SearchData* newData = new SearchData;
@@ -177,26 +190,10 @@ bool Eniro::search(SearchDetails const& details)
// Store request id so that it can be identified later
pendingSearches_[id] = newData;
- return true;
-}
-
-Eniro::Error Eniro::error() const
-{
- return error_;
}
-const QString& Eniro::errorString() const
+void Eniro::handleHttpData(int id, QByteArray const& data)
{
- return errorString_;
-}
-
-void Eniro::httpReady(int id, bool error)
-{
- if(error)
- {
- qDebug() << "Error: " << http_.errorString();
- }
-
searchMap::const_iterator searchIt;
numberMap::const_iterator numberIt;
@@ -204,37 +201,16 @@ void Eniro::httpReady(int id, bool error)
if((searchIt = pendingSearches_.find(id)) !=
pendingSearches_.end())
{
- if(error)
- {
- error_ = CONNECTION_FAILURE;
- errorString_ = http_.errorString();
- emitRequestFinished(id, searchIt.value(), true);
- return;
- }
-
- QString result(http_.readAll());
-
// Load results from html data
- loadResults(id, result);
+ loadResults(id, data);
}
// Check if request is pending number requests
else if((numberIt = pendingNumberRequests_.find(id)) !=
pendingNumberRequests_.end())
{
- if(error)
- {
- error_ = CONNECTION_FAILURE;
- errorString_ = http_.errorString();
- delete pendingNumberRequests_[id];
- pendingNumberRequests_.remove(id);
- return;
- }
-
- QString result(http_.readAll());
-
// Load number from html data
- loadNumber(id, result);
+ loadNumber(id, data);
}
// Check for login request
@@ -243,17 +219,8 @@ void Eniro::httpReady(int id, bool error)
{
bool success = true;
- if(!error)
- {
- QString result(http_.readAll());
-
- // If html source contains LOGIN_CHECK, login failed
- if(result.indexOf(LOGIN_CHECK) != -1)
- {
- success = false;
- }
- }
- else
+ // If html source contains LOGIN_CHECK, login failed
+ if(data.indexOf(LOGIN_CHECK) != -1)
{
success = false;
}
@@ -263,25 +230,43 @@ void Eniro::httpReady(int id, bool error)
}
-// Loads results from html source code
-void Eniro::loadResults(int id, QString const& httpData)
+void Eniro::handleHttpError(int id)
{
- searchMap::iterator it = pendingSearches_.find(id);
- QString expr;
+ searchMap::const_iterator searchIt;
+ numberMap::const_iterator numberIt;
- switch(it.value()->details.type)
+ // Check if request is pending search request
+ if((searchIt = pendingSearches_.find(id)) !=
+ pendingSearches_.end())
{
- case YELLOW_PAGES:
- expr = YELLOW_REGEXP;
- break;
- case PERSONS:
- expr = PERSON_REGEXP;
- break;
- default:
- return;
+ setError(CONNECTION_FAILURE, http_.errorString());
+ emitRequestFinished(id, searchIt.value(), true);
}
- QRegExp rx(expr);
+ // Check if request is pending number requests
+ else if((numberIt = pendingNumberRequests_.find(id)) !=
+ pendingNumberRequests_.end())
+ {
+ setError(CONNECTION_FAILURE, http_.errorString());
+ delete pendingNumberRequests_[id];
+ pendingNumberRequests_.remove(id);
+ }
+
+ // Check for login request
+ else if(pendingLoginRequests_.find(id) !=
+ pendingLoginRequests_.end())
+ {
+ emit loginStatus(false);
+
+ }
+}
+
+// Loads results from html source code
+void Eniro::loadResults(int id, QString const& httpData)
+{
+ searchMap::iterator it = pendingSearches_.find(id);
+
+ QRegExp rx("((" + YELLOW_REGEXP + ")|(" + PERSON_REGEXP + ")|(" + SINGLE_REGEXP + "))");
rx.setMinimal(true);
bool requestsPending = false;
@@ -293,8 +278,10 @@ void Eniro::loadResults(int id, QString const& httpData)
{
pos += rx.matchedLength();
- data = rx.cap(2);
+ data = rx.cap(1);
+
data = stripTags(data);
+
QStringList rows = data.split('\n');
for(int i = 0; i < rows.size(); i++)
@@ -331,9 +318,18 @@ void Eniro::loadResults(int id, QString const& httpData)
break;
case 3:
- result.name = rows[0];
- result.street = rows[1];
- result.city = rows[2];
+ if(isPhoneNumber(rows[1]))
+ {
+ result.name = rows[0];
+ result.number = cleanUpNumber(rows[1]);
+ result.city = rows[2];
+ }
+ else
+ {
+ result.name = rows[0];
+ result.street = rows[1];
+ result.city = rows[2];
+ }
break;
case 4:
@@ -345,6 +341,35 @@ void Eniro::loadResults(int id, QString const& httpData)
break;
default:
+ bool ok = false;
+
+ for(int a = 0; a < size && a < 8; a++)
+ {
+ if(isPhoneNumber(rows[a]))
+ {
+ result.name = rows[0];
+ result.number = cleanUpNumber(rows[a]);
+
+ for(int i = a + 1; i < size && i < 8; i++)
+ {
+ if(!isPhoneNumber(rows[i]) && size > i + 1 && isStreet(rows[i]))
+ {
+ result.street = rows[i];
+ result.city = rows[i+1];
+ ok = true;
+ break;
+ }
+ }
+
+ }
+
+ }
+
+ if(ok)
+ {
+ break;
+ }
+
continue;
}
@@ -353,9 +378,9 @@ void Eniro::loadResults(int id, QString const& httpData)
unsigned int foundResults = ++(it.value()->numbersTotal);
- // If phone number searh is enabled, we have to make another
+ // If phone number search is enabled, we have to make another
// request to find it out
- if(findNumber_ && size < 4 && loggedIn_ &&
+ if(getFindNumber() && size < 4 && (loggedIn_ || site_ != FI) &&
it.value()->details.type != YELLOW_PAGES)
{
requestsPending = true;
@@ -367,14 +392,16 @@ void Eniro::loadResults(int id, QString const& httpData)
emit resultAvailable(result, it.value()->details);
}
+ unsigned int maxResults = getMaxResults();
+
// Stop searching if max results is reached
- if(maxResults_ && (foundResults >= maxResults_))
+ if(maxResults && (foundResults >= maxResults))
{
break;
}
}
- // If number there were no results or no phone numbers needed to
+ // If there were no results or no phone numbers needed to
// be fetched, the whole request is ready
if(it.value()->numbersTotal == 0 || !requestsPending)
{
@@ -382,8 +409,7 @@ void Eniro::loadResults(int id, QString const& httpData)
if(httpData.indexOf(LOGIN_CHECK) != -1)
{
- error_ = INVALID_LOGIN;
- errorString_ = INVALID_LOGIN_STRING;
+ setError(INVALID_LOGIN, INVALID_LOGIN_STRING),
error = true;
}
@@ -444,8 +470,7 @@ void Eniro::loadNumber(int id, QString const& result)
if(error)
{
- error_ = INVALID_LOGIN;
- errorString_ = INVALID_LOGIN;
+ setError(INVALID_LOGIN, INVALID_LOGIN_STRING);
emitRequestFinished(searchIt.key(), searchIt.value(), true);
}
@@ -472,18 +497,19 @@ QUrl Eniro::createUrl(QString const& query, QString const& location)
url.addQueryItem("geo_area", location);
}
- if(maxResults_)
+ unsigned int maxResults = getMaxResults();
+
+ if(maxResults)
{
- url.addQueryItem("hpp", QString::number(maxResults_));
+ url.addQueryItem("hpp", QString::number(maxResults));
}
- if(loggedIn_)
+ if(loggedIn_ && site_ == FI)
{
url.addQueryItem("login_name", username_);
url.addQueryItem("login_password", password_);
}
- QByteArray path = url.encodedQuery().replace('+', "%2B");
- url.setEncodedQuery(path);
+ fixUrl(url);
return url;
}
@@ -506,60 +532,24 @@ void Eniro::getNumberForResult(int id, int index, SearchDetails const& details)
void Eniro::emitRequestFinished(int key, SearchData* data, bool error)
{
-
- // Do not emit "Request aborted" error
- if(!(error && (http_.error() == QHttp::Aborted)))
- {
- emit requestFinished(data->results, data->details, error);
- }
-
+ emit requestFinished(data->results, data->details, error);
delete pendingSearches_[key];
pendingSearches_[key] = 0;
pendingSearches_.remove(key);
}
-QString Eniro::ucFirst(QString& str)
-{
- if (str.size() < 1) {
- return "";
- }
-
- QStringList tokens = str.split(" ");
- QList::iterator tokItr;
-
- for (tokItr = tokens.begin(); tokItr != tokens.end(); ++tokItr)
- {
- (*tokItr) = (*tokItr).at(0).toUpper() + (*tokItr).mid(1);
- }
-
- return tokens.join(" ");
-}
-
-QString& Eniro::cleanUpNumber(QString& number)
-{
- return number.replace(numberCleaner_, "");
-}
-
-QString& Eniro::stripTags(QString& string)
-{
- return string.replace(tagStripper_, "");
-}
QMap Eniro::getSites()
{
QMap sites;
- SiteDetails details;
- details.name = tr("Finnish");
- details.id = "fi";
- sites[FI] = details;
-
- details.name = tr("Swedish");
- details.id = "se";
- sites[SE] = details;
- details.name = tr("Danish");
- details.id = "dk";
- sites[DK] = details;
+ for(int i = 0; i < SITE_COUNT; i++)
+ {
+ SiteDetails details;
+ details.name = SITE_NAMES[i];
+ details.id = SITE_IDS[i];
+ sites[static_cast(i)] = details;
+ }
return sites;
}
@@ -567,26 +557,30 @@ QMap Eniro::getSites()
Eniro::Site Eniro::stringToSite(QString const& str)
{
Site site = FI;
-
QString lower = str.toLower();
- if(lower == "se" || lower == "swedish")
- {
- site = SE;
- }
- else if(lower == "dk" || lower == "danish")
+ for(int i = 0; i < SITE_COUNT; i++)
{
- site = DK;
+ if(lower == SITE_NAMES[i] || lower == SITE_IDS[i])
+ {
+ site = static_cast (i);
+ break;
+ }
}
return site;
}
-Eniro::SearchDetails::SearchDetails(QString const& q,
- QString const& loc,
- SearchType t)
+bool Eniro::isStreet(QString const& str)
{
- query = q;
- location = loc;
- type = t;
+ static QRegExp number("([0-9]+)");
+ int a = number.indexIn(str);
+ int b = str.indexOf(" ");
+
+ if((a == -1 && b == -1) || (a != -1 && b != -1))
+ {
+ return true;
+ }
+
+ return false;
}