X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fcommon%2Feniro.cpp;h=d3ebf5b13129eb56e1e74d981b922f94208694ed;hb=6a6729b65b65b7c4465bd20d82221806b175e921;hp=56f27fe054d170713e52f1c2ed1c09761a7102be;hpb=89496ceee9788c2908c27ad4e2535f2728310d76;p=jenirok diff --git a/src/common/eniro.cpp b/src/common/eniro.cpp index 56f27fe..d3ebf5b 100644 --- a/src/common/eniro.cpp +++ b/src/common/eniro.cpp @@ -21,45 +21,52 @@ 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/" + "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,19 +135,10 @@ 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()); + resetTimeout(); - pendingLoginRequests_.insert(id); -} - -bool Eniro::search(SearchDetails const& details) -{ SearchType type = details.type; // Only logged in users can use other than person search @@ -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,111 +190,83 @@ 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; // Check if request is pending search request if((searchIt = pendingSearches_.find(id)) != - pendingSearches_.end()) + 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()) + pendingNumberRequests_.end()) + { + // Load number from html data + loadNumber(id, data); + } + + // Check for login request + else if(pendingLoginRequests_.find(id) != + pendingLoginRequests_.end()) { - if(error) + bool success = true; + + // If html source contains LOGIN_CHECK, login failed + if(data.indexOf(LOGIN_CHECK) != -1) { - error_ = CONNECTION_FAILURE; - errorString_ = http_.errorString(); - delete pendingNumberRequests_[id]; - pendingNumberRequests_.remove(id); - return; + success = false; } - QString result(http_.readAll()); + emit loginStatus(success); + } + +} - // Load number from html data - loadNumber(id, result); +void Eniro::handleHttpError(int id) +{ + searchMap::const_iterator searchIt; + numberMap::const_iterator numberIt; + + // Check if request is pending search request + if((searchIt = pendingSearches_.find(id)) != + pendingSearches_.end()) + { + setError(CONNECTION_FAILURE, http_.errorString()); + emitRequestFinished(id, searchIt.value(), true); + } + + // 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()) + pendingLoginRequests_.end()) { - 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 - { - success = false; - } + emit loginStatus(false); - emit loginStatus(success); } - } // Loads results from html source code void Eniro::loadResults(int id, QString const& httpData) { searchMap::iterator it = pendingSearches_.find(id); - QString expr; - - switch(it.value()->details.type) - { - case YELLOW_PAGES: - expr = YELLOW_REGEXP; - break; - case PERSONS: - expr = PERSON_REGEXP; - break; - default: - return; - } - QRegExp rx(expr); + QRegExp rx("((" + YELLOW_REGEXP + ")|(" + PERSON_REGEXP + ")|(" + SINGLE_REGEXP + "))"); rx.setMinimal(true); bool requestsPending = false; @@ -291,15 +276,16 @@ void Eniro::loadResults(int id, QString const& httpData) // Find all matches while((pos = rx.indexIn(httpData, pos)) != -1) { - pos += rx.matchedLength(); + pos += rx.matchedLength(); + + data = rx.cap(1); - data = rx.cap(2); - data = stripTags(data); - QStringList rows = data.split('\n'); + data = stripTags(data); + QStringList rows = data.split('\n'); - for(int i = 0; i < rows.size(); i++) - { - // Remove white spaces + for(int i = 0; i < rows.size(); i++) + { + // Remove white spaces QString trimmed = rows.at(i).trimmed().toLower(); // Remove empty strings @@ -310,71 +296,82 @@ void Eniro::loadResults(int id, QString const& httpData) } else { - // Convert words to uppercase + // Convert words to uppercase rows[i] = ucFirst(trimmed); } - } + } - Result result; + Result result; - int size = rows.size(); + int size = rows.size(); - switch(size) - { - case 1: - result.name = rows[0]; - break; + switch(size) + { + case 1: + result.name = rows[0]; + break; - case 2: - result.name = rows[0]; - result.city = rows[1]; - break; + case 2: + result.name = rows[0]; + result.city = rows[1]; + break; - case 3: - result.name = rows[0]; - result.street = rows[1]; - result.city = rows[2]; - break; + case 3: + 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: - result.name = rows[0]; - // Remove slashes and spaces from number - result.number = cleanUpNumber(rows[1]); - result.street = rows[2]; - result.city = rows[3]; - break; + case 4: + result.name = rows[0]; + // Remove slashes and spaces from number + result.number = cleanUpNumber(rows[1]); + result.street = rows[2]; + result.city = rows[3]; + break; - default: - continue; + default: + continue; - } + } - it.value()->results.push_back(result); + it.value()->results.push_back(result); - unsigned int foundResults = ++(it.value()->numbersTotal); + unsigned int foundResults = ++(it.value()->numbersTotal); - // If phone number searh is enabled, we have to make another - // request to find it out - if(findNumber_ && size < 4 && loggedIn_ && - it.value()->details.type != YELLOW_PAGES) - { + // If phone number searh is enabled, we have to make another + // request to find it out + if(getFindNumber() && size < 4 && loggedIn_ && + it.value()->details.type != YELLOW_PAGES) + { requestsPending = true; getNumberForResult(id, it.value()->results.size() - 1, it.value()->details); - } - // Otherwise result is ready - else - { + } + // Otherwise result is ready + else + { emit resultAvailable(result, it.value()->details); - } + } - // Stop searching if max results is reached - if(maxResults_ && (foundResults >= maxResults_)) - { - break; - } + unsigned int maxResults = getMaxResults(); + + // Stop searching if max results is reached + 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 +379,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; } @@ -424,7 +420,7 @@ void Eniro::loadNumber(int id, QString const& result) if(!trimmed.isEmpty()) { - // Remove whitespaces from number + // Remove whitespaces from number searchIt.value()->results[numberIt.value()->index].number = cleanUpNumber(trimmed); emit resultAvailable(searchIt.value()->results[numberIt.value()->index], searchIt.value()->details); @@ -434,7 +430,7 @@ void Eniro::loadNumber(int id, QString const& result) // Check if all numbers have been found if(found >= searchIt.value()->numbersTotal) { - emitRequestFinished(searchIt.key(), searchIt.value(), false); + emitRequestFinished(searchIt.key(), searchIt.value(), false); } // If number was found, there was no error @@ -444,8 +440,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,9 +467,11 @@ 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_) { @@ -482,8 +479,7 @@ QUrl Eniro::createUrl(QString const& query, QString const& location) url.addQueryItem("login_password", password_); } - QByteArray path = url.encodedQuery().replace('+', "%2B"); - url.setEncodedQuery(path); + fixUrl(url); return url; } @@ -506,87 +502,41 @@ 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; + QMap sites; - 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; + return sites; } 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") - { - site = DK; - } + Site site = FI; + QString lower = str.toLower(); - return site; -} + for(int i = 0; i < SITE_COUNT; i++) + { + if(lower == SITE_NAMES[i] || lower == SITE_IDS[i]) + { + site = static_cast (i); + break; + } + } -Eniro::SearchDetails::SearchDetails(QString const& q, - QString const& loc, - SearchType t) -{ - query = q; - location = loc; - type = t; + return site; }