|
|
@@ -25,22 +25,22 @@ void class_recherche::start() |
|
|
|
bool firstpass = true; |
|
|
|
wxArrayInt selection = grid->GetSelectedRows(); |
|
|
|
if (selection.GetCount() == 0) |
|
|
|
for (int s=0; s < grid->GetNumberRows(); s++) |
|
|
|
selection.Add(s); |
|
|
|
for (int i=0; i < grid->GetNumberRows(); i++) |
|
|
|
selection.Add(i); |
|
|
|
|
|
|
|
for (int j=0; j < configuration->getnbrule(); j++) |
|
|
|
{ |
|
|
|
if (configuration->getrule(j).inuse) |
|
|
|
{ |
|
|
|
wxProgressDialog progress_dialog("Recherche", _T("Recherche avec la règle «") + configuration->getrule(j).name + "»", selection.GetCount(), NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME | wxPD_CAN_ABORT); |
|
|
|
for (int i=0; i < (int)selection.GetCount(); i++) |
|
|
|
wxProgressDialog progress_dialog("Recherche", _T("Recherche avec la règle «") + configuration->getrule(j).name + _T("»"), selection.GetCount(), NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME | wxPD_CAN_ABORT); |
|
|
|
for (unsigned int i=0; i < selection.GetCount(); i++) |
|
|
|
{ |
|
|
|
if (firstpass || (grid->GetCellValue(selection[i], 0) == "0")) |
|
|
|
{ |
|
|
|
go (selection[i], configuration->getrule(j)); |
|
|
|
} |
|
|
|
if (!progress_dialog.Update(i)) |
|
|
|
break; |
|
|
|
if (!progress_dialog.Update(i)) |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
firstpass = false; |
|
|
@@ -49,28 +49,135 @@ void class_recherche::start() |
|
|
|
|
|
|
|
void class_recherche::go(int row, rule regle) |
|
|
|
{ |
|
|
|
//TODO: coloration de la grille pour les consults avec nouveaux résultats |
|
|
|
wxString id = grid->GetCellValue(row, 13); |
|
|
|
wxString requete = build(row, regle); |
|
|
|
esearch(requete); |
|
|
|
parsesearch(); |
|
|
|
wxString temp = bdd->getidresult(grid->GetCellValue(row, 13)); |
|
|
|
wxArrayString idresultbdd, tofetch; |
|
|
|
while (temp.Length() > 0) |
|
|
|
|
|
|
|
wxArrayString idresultbdd = bdd->getidresult(id, true); |
|
|
|
|
|
|
|
wxArrayString temp; |
|
|
|
|
|
|
|
if (idresult.GetCount() > 0) |
|
|
|
{ |
|
|
|
idresultbdd.Add(temp.BeforeFirst(',').AfterLast('!')); |
|
|
|
temp = temp.AfterFirst(','); |
|
|
|
for (int i=(int)idresult.GetCount()-1; i >= 0; i--) |
|
|
|
{ |
|
|
|
if (idresultbdd.Index(idresult[i]) == wxNOT_FOUND) |
|
|
|
{ |
|
|
|
temp.Add(idresult[i]); |
|
|
|
bdd->addidresult(id, idresult[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
idresult = temp; |
|
|
|
bdd->modnbresult(id, bdd->nbresult(id) + idresult.GetCount()); |
|
|
|
grid->SetCellValue(row, 0, _itoW(bdd->nbresult(id))); |
|
|
|
|
|
|
|
temp.Clear(); |
|
|
|
for (unsigned int i=0; i < idresult.GetCount(); i++) |
|
|
|
if (!(bdd->publiexists(idresult[i]))) |
|
|
|
temp.Add(idresult[i]); |
|
|
|
idresult = temp; |
|
|
|
|
|
|
|
if (idresult.GetCount() > 0) |
|
|
|
{ |
|
|
|
efetch(); |
|
|
|
parsefetch(); |
|
|
|
} |
|
|
|
} |
|
|
|
for (int i=0; i < (int)idresult.GetCount(); i++) |
|
|
|
if (idresultbdd.Index(idresult[i]) != wxNOT_FOUND) |
|
|
|
tofetch.Add(idresult[i]); |
|
|
|
} |
|
|
|
|
|
|
|
void class_recherche::parsefetch() |
|
|
|
{ |
|
|
|
XMLDocument* doc = new XMLDocument; |
|
|
|
doc->Parse(curldata.content); |
|
|
|
|
|
|
|
idresult = tofetch; |
|
|
|
XMLElement* parcours = doc->RootElement(); |
|
|
|
parcours = parcours->FirstChildElement("PubmedArticle"); |
|
|
|
do |
|
|
|
{ |
|
|
|
wxString titre, auteurs, abstract, revue, lien, date; |
|
|
|
|
|
|
|
parcours = parcours->FirstChildElement("MedlineCitation"); //MedlineCitation |
|
|
|
lien << "http://www.ncbi.nlm.nih.gov/pubmed/" << parcours->FirstChildElement("PMID")->GetText();// PMID |
|
|
|
parcours = parcours->FirstChildElement("Article"); // Article |
|
|
|
parcours = parcours->FirstChildElement("Journal"); // Journal |
|
|
|
parcours = parcours->FirstChildElement("JournalIssue"); // JournalIssue |
|
|
|
parcours = parcours->FirstChildElement("PubDate"); // PubDate |
|
|
|
date << parcours->FirstChildElement("Month")->GetText(); // *Month |
|
|
|
date << " " << parcours->FirstChildElement("Year")->GetText(); // *Year |
|
|
|
parcours = parcours->Parent()->ToElement(); // JournalIssue |
|
|
|
revue << parcours->NextSiblingElement("ISOAbbreviation")->GetText(); // *ISOAbbreviation |
|
|
|
parcours = parcours->Parent()->ToElement(); // Journal |
|
|
|
titre << parcours->NextSiblingElement("ArticleTitle")->GetText(); // *ArticleTitle |
|
|
|
parcours = parcours->NextSiblingElement("Abstract"); // Abstract |
|
|
|
XMLElement* parcoursabstract = parcours->FirstChildElement("AbstractText"); // AbstractText |
|
|
|
do |
|
|
|
{ |
|
|
|
abstract << parcoursabstract->FirstAttribute()->Value() << " :\n"; |
|
|
|
abstract << parcoursabstract->GetText() << "\n"; |
|
|
|
parcoursabstract=parcoursabstract->NextSiblingElement("AbstractText"); |
|
|
|
}while(parcoursabstract); |
|
|
|
parcours = parcours->NextSiblingElement("AuthorList"); // AuthorList |
|
|
|
XMLElement* parcoursauteurs = parcours->FirstChildElement("Author"); // Author |
|
|
|
do |
|
|
|
{ |
|
|
|
auteurs << parcoursauteurs->FirstChildElement("LastName")->GetText(); |
|
|
|
auteurs << " " << parcoursauteurs->FirstChildElement("ForeName")->GetText() << ","; |
|
|
|
parcoursauteurs=parcoursauteurs->NextSiblingElement("Author"); |
|
|
|
}while(parcoursauteurs); |
|
|
|
auteurs = auteurs.BeforeLast(','); |
|
|
|
parcours = parcours->Parent()->Parent()->Parent()->ToElement()->NextSiblingElement("PubmedArticle"); |
|
|
|
|
|
|
|
bdd->addpubli(titre, auteurs, abstract, revue, lien, date); |
|
|
|
wxMessageBox(titre + "\n" + abstract); |
|
|
|
}while(parcours); |
|
|
|
|
|
|
|
efetch(); |
|
|
|
delete(doc); |
|
|
|
if (curldata.content) |
|
|
|
free (curldata.content); |
|
|
|
} |
|
|
|
|
|
|
|
void class_recherche::efetch() |
|
|
|
{ |
|
|
|
|
|
|
|
bool accessdenied = false; |
|
|
|
do |
|
|
|
{ |
|
|
|
wxString requete = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&id="; |
|
|
|
for (unsigned int i=0; i < idresult.GetCount(); i++) |
|
|
|
requete << idresult[i] << ","; |
|
|
|
requete = requete.BeforeLast(','); |
|
|
|
|
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_URL, _C(requete)); |
|
|
|
|
|
|
|
if (configuration->IsUseproxy()) |
|
|
|
{ |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_PROXY, _C(configuration->GetProxyurl())); |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_PROXYPORT, configuration->GetProxyport()); |
|
|
|
} |
|
|
|
else |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_PROXY, ""); |
|
|
|
|
|
|
|
curldata.content = (char*) malloc(1); |
|
|
|
curldata.size = 0; |
|
|
|
|
|
|
|
if (curlhandle) |
|
|
|
curl_easy_perform(curlhandle); |
|
|
|
|
|
|
|
//wxMessageBox(curldata.content); |
|
|
|
|
|
|
|
if (wxString(curldata.content).Left(6) == "<HTML>") |
|
|
|
{ |
|
|
|
accessdenied = true; |
|
|
|
time_t timer = time(NULL); |
|
|
|
wxProgressDialog progress_dialog("Erreur proxy", _T("En attente du proxy"), 300, NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME); |
|
|
|
while (time(NULL) < (timer + 300)) |
|
|
|
progress_dialog.Update(time(NULL) - timer); |
|
|
|
progress_dialog.Update(300); |
|
|
|
if (curldata.content) |
|
|
|
free (curldata.content); |
|
|
|
} |
|
|
|
}while (accessdenied); |
|
|
|
} |
|
|
|
|
|
|
|
void class_recherche::parsesearch() |
|
|
@@ -98,25 +205,45 @@ void class_recherche::parsesearch() |
|
|
|
parcours = parcours->Parent()->ToElement(); |
|
|
|
} |
|
|
|
delete(doc); |
|
|
|
if (curldata.content) |
|
|
|
free (curldata.content); |
|
|
|
} |
|
|
|
|
|
|
|
void class_recherche::esearch(wxString requete) |
|
|
|
{ |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_URL, _C(requete)); |
|
|
|
|
|
|
|
if (configuration->IsUseproxy()) |
|
|
|
bool accessdenied = false; |
|
|
|
do |
|
|
|
{ |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_PROXY, _C(configuration->GetProxyurl())); |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_PROXYPORT, configuration->GetProxyport()); |
|
|
|
} |
|
|
|
else |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_PROXY, ""); |
|
|
|
|
|
|
|
curldata.content = (char*) malloc(1); |
|
|
|
curldata.size = 0; |
|
|
|
|
|
|
|
if (curlhandle) |
|
|
|
curl_easy_perform(curlhandle); |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_URL, _C(requete)); |
|
|
|
|
|
|
|
if (configuration->IsUseproxy()) |
|
|
|
{ |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_PROXY, _C(configuration->GetProxyurl())); |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_PROXYPORT, configuration->GetProxyport()); |
|
|
|
} |
|
|
|
else |
|
|
|
curl_easy_setopt (curlhandle, CURLOPT_PROXY, ""); |
|
|
|
|
|
|
|
curldata.content = (char*) malloc(1); |
|
|
|
curldata.size = 0; |
|
|
|
|
|
|
|
if (curlhandle) |
|
|
|
curl_easy_perform(curlhandle); |
|
|
|
|
|
|
|
//wxMessageBox(curldata.content); |
|
|
|
|
|
|
|
if (wxString(curldata.content).Left(6) == "<HTML>") |
|
|
|
{ |
|
|
|
accessdenied = true; |
|
|
|
time_t timer = time(NULL); |
|
|
|
wxProgressDialog progress_dialog("Erreur proxy", _T("En attente du proxy"), 300, NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME); |
|
|
|
while (time(NULL) < (timer + 300)) |
|
|
|
progress_dialog.Update(time(NULL) - timer); |
|
|
|
progress_dialog.Update(300); |
|
|
|
if (curldata.content) |
|
|
|
free (curldata.content); |
|
|
|
} |
|
|
|
}while (accessdenied); |
|
|
|
} |
|
|
|
|
|
|
|
wxString class_recherche::build(int row, rule regle) |
|
|
|