void SearchProvider::beatportIdsBasedSearch(QMap<QString, QString> * uid_Bpid_Map) { O1Beatport * oauthManager = O1Beatport::instance(); O1Requestor requestManager(_manager, oauthManager); if(!oauthManager->linked()) { LOG_ERROR("Unable to perform a search from IDs, Beatport OAuth is not linked"); // TODO: emit an error signal per request return; } QUrl requestUrl(TYM_BEATPORT_API_URL + _tracksPath); QList<QMap<QString, QString> *> splittedMaps; int i = 0; for (auto it = uid_Bpid_Map->begin() ; it != uid_Bpid_Map->end() ; ++it, ++i) { int listIndex = i / 10; if(splittedMaps.size() == listIndex) { splittedMaps.append(new QMap<QString, QString>()); } splittedMaps.value(listIndex)->insert(it.key(), it.value()); } for(auto tempMap : splittedMaps) { QString idsList = QStringList(tempMap->values()).join(","); QList<O1RequestParameter> params; params << O1RequestParameter("ids", idsList.toLatin1()); requestUrl.setQuery(QUrlQuery(O1::createQueryParams(params))); QNetworkRequest request(requestUrl); QNetworkReply *reply = requestManager.get(request, params); connect(reply, SIGNAL(finished()), this, SLOT(bpidSearchParseResponce())); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestError(QNetworkReply::NetworkError))); LOG_DEBUG(QString("Request sent for IDs %1").arg(idsList)); _replyMap.insert(reply, tempMap); } delete uid_Bpid_Map; }
/* FIXME: Some requests never receive response Need more tests. When searching automatically AND manually on the same track (same libId), sometimes one of the responses does not call the slot. Therefore, it should because the requests and associated QNetworkReply are totally different objects and should not be in conflict. Maybe related to QNetworkSignalMapper. Also, what is the benefit of having a mapper here ? A simple QMap<QReply, QString> should be sufficient */ void SearchProvider::naturalSearch(QMap<QString, QString> *id_SearchText_Map) { O1Beatport * oauthManager = O1Beatport::instance(); O1Requestor requestManager(_manager, oauthManager); if(!oauthManager->linked()) { LOG_ERROR("Unable to perform a search from text, Beatport OAuth is not linked"); // TODO: emit an error signal return; } QUrl requestUrl(TYM_BEATPORT_API_URL + _searchPath); QMapIterator<QString, QString> searchList(*id_SearchText_Map); while(searchList.hasNext()) { searchList.next(); QString libId = searchList.key(); QString text = searchList.value(); if(text.isEmpty()) return; // Replace underscores by spaces (and prevent multiple spaces) Utils::instance()->simplifySpaces(text.replace('_', ' ')); QList<O1RequestParameter> params; params << O1RequestParameter("query", text.toLatin1()); params << O1RequestParameter("facets", "fieldType:track"); requestUrl.setQuery(QUrlQuery(O1::createQueryParams(params))); QNetworkRequest request(requestUrl); QNetworkReply *reply = requestManager.get(request, params); _naturalSearchMapper->setMapping(reply, libId); connect(reply, SIGNAL(finished()), _naturalSearchMapper, SLOT(map())); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestError(QNetworkReply::NetworkError))); LOG_DEBUG(QString("Request sent for search \"%1\"").arg(text)); } delete id_SearchText_Map; }
int ClientServer::start() { m_running = true; if(socketTCP.listen(m_serverPort) != sf::Socket::Done) { std::cout <<"/!\\Fail " << "Unable to start server"<< std::endl; return -1; } std::cout <<"Info " << "Server started on port : " << m_serverPort << std::endl; std::cout <<"Info " << "Server is listening TCP connection !" << std::endl; // Time management sf::Clock clock; // client connexion sf::Socket::Status socketStatus; //Socket non bloquante socketTCP.setBlocking(false); std::cout << std::endl; std::cout <<"Info " << "En attente de la connection d'un joueur... " << std::endl; while(m_running) { // On accepte les clients // TODO gérer le cas où le nombre maximum de clients est atteint if(socketTCP.accept( *listeSocket[indiceClient].get()) == sf::Socket::Done) { listeVerifSocket[indiceClient] = true; listeVerifSocketHelper[indiceClient] = true; // On affiche les traces std::cout <<" << " << "Client connecte sur la socket n " << cast::toString(indiceClient) << ", adresse : " << listeSocket[indiceClient].get()->getRemoteAddress().toString() << "::" << cast::toString(listeSocket[indiceClient].get()->getRemotePort()) << std::endl; } // On regarde si des données sont arrivées // On gère aussi les sockets dans le std::vector for(unsigned int i = 0; i < listeSocket.size(); i++) { sf::Packet packet; if(!listeSocketOccupee[i]) { socketStatus = listeSocket[i].get()->receive(packet); sf::Int32 idRequest; std::string sRequest; packet >>idRequest >> sRequest; switch(socketStatus) { case sf::Socket::NotReady: // Aucune données à recevoir break; case sf::Socket::Done: // Gestion de la requête requestManager(idRequest, sRequest, listeSocket[i].get(), i); break; case sf::Socket::Error: listeVerifSocket[i] = false; break; case sf::Socket::Disconnected: listeVerifSocket[i] = false; break; default: break; } } } // On gère le prochain indice d'insertion de la socket listSocketManager(); // 240 Hz if(clock.getElapsedTime().asMilliseconds() < 4.17) { sf::sleep(sf::milliseconds((sf::Int32) (4.17 - clock.getElapsedTime().asMilliseconds()))); } // RAZ horloge clock.restart(); }