X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fcommon%2Feniro.cpp;h=8e2503a56e84f802a52c00aa3683dd97beaa7fa2;hb=3637f101f5223d24de435c5edaa44d9d5cc8dd1f;hp=0b8579b16681865abc127618ab2c594da4f14a4d;hpb=cf883c1283eb6b096592ef875a32696fee9dd6ff;p=jenirok diff --git a/src/common/eniro.cpp b/src/common/eniro.cpp index 0b8579b..8e2503a 100644 --- a/src/common/eniro.cpp +++ b/src/common/eniro.cpp @@ -21,42 +21,49 @@ namespace { - static const QString SITE_URLS[] = + static const QString SITE_URLS[Eniro::SITE_COUNT] = { "http://wap.eniro.fi/", "http://wap.eniro.se/", "http://wap.eniro.dk/" }; - const QString INVALID_LOGIN_STRING = "Invalid login details"; - const QString PERSON_REGEXP = "(.*)(.*)"; - const QString YELLOW_REGEXP = "(.*)(.*)"; - const QString NUMBER_REGEXP = "
(.*)
"; - const QString LOGIN_CHECK = "]+)>"); + static const QString INVALID_LOGIN_STRING = "Invalid login details"; + static const QString TIMEOUT_STRING = "Request timed out"; + static const QString PERSON_REGEXP = "(.*)(.*)"; + static const QString YELLOW_REGEXP = "(.*)(.*)"; + static const QString SINGLE_REGEXP = "
(.*)
(.*)
(.*)(
|

(.*)
|

(.*)
)"; + 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; }