/** * This file is part of TuCan Mobile. * * TuCan Mobile is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * TuCan Mobile is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with TuCan Mobile. If not, see <http://www.gnu.org/licenses/>. */ package com.dalthed.tucan.scraper; import java.util.ArrayList; import java.util.Iterator; import org.acra.ACRA; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.util.Log; import android.widget.ListAdapter; import android.widget.Toast; import com.dalthed.tucan.TucanMobile; import com.dalthed.tucan.Connection.AnswerObject; import com.dalthed.tucan.Connection.BrowserAnswerReciever; import com.dalthed.tucan.Connection.CookieManager; import com.dalthed.tucan.Connection.RequestObject; import com.dalthed.tucan.Connection.SimpleSecureBrowser; import com.dalthed.tucan.adapters.RegisterExamAdapter; import com.dalthed.tucan.exceptions.LostSessionException; import com.dalthed.tucan.exceptions.TucanDownException; public class RegisterExamsScraper extends BasicScraper implements OnClickListener { private ArrayList<Boolean> eventisModule; private ArrayList<String> eventName; private ArrayList<String> examDate; public ArrayList<String> registerLink; public ArrayList<Integer> examSelection; private boolean justGetimportant; private String postString; private SimpleSecureBrowser callResultBrowser; private String URLStringtoCall; private CookieManager localCookieManager; /** * Creates a RegisterExamsScraper * * @param context * Activity Context * @param result * ResultObject from the call * @param URLStringtoCall * @param lcm * Cookiemanager */ public RegisterExamsScraper(Context context, AnswerObject result, String URLStringtoCall, CookieManager lcm) { super(context, result); this.URLStringtoCall = URLStringtoCall; this.localCookieManager = lcm; } @Override public ListAdapter scrapeAdapter(int mode) throws LostSessionException, TucanDownException { if (checkForLostSeesion() && mode == 0) { return getExamsOverview(); } return null; } /** * Erstellt einen RegisterDialog und zeigt ihn an, gibt den nachfolgenden * Modus an * * @return nachfolgender Modus * @throws LostSessionException * @since 2012-06-01 */ public int getRegisterdialog() throws LostSessionException, TucanDownException { if (checkForLostSeesion()) { Element form = doc.select("form[name=registrationdetailsform]").first(); if (form != null) { final Element contenttable = form.select("table.tb750").first(); final Element contentrow = contenttable.select("tr").last(); Elements cols = contentrow.select("td"); Iterator<Element> iterateForms = form.select("input").iterator(); ArrayList<String> formName = new ArrayList<String>(); ArrayList<String> formValue = new ArrayList<String>(); postString = ""; int ct = 0; while (iterateForms.hasNext()) { Element next = iterateForms.next(); formName.add(next.attr("name")); formValue.add(next.attr("value")); if (ct > 0) { postString += "&"; } ct++; postString += next.attr("name") + "=" + next.attr("value"); } AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage( "An/Abmelden zu:" + cols.get(1).text() + "\n" + cols.get(6).text()) .setCancelable(true).setPositiveButton("Ja", this) .setNegativeButton("Nein", null); AlertDialog alert = builder.create(); alert.show(); return 3; // Return Mode } else { Element errorSpan = doc.select("span.error").first(); if(errorSpan!=null){ AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage("Fehler: "+errorSpan.text()); AlertDialog alert = builder.create(); alert.show(); return 0; } } } return -1; } /** * Führt die Anmeldung aus und gibt den nächsten modus zurück * * @return der nächste modus * @throws LostSessionException * @since 2012-06-01 */ public int startRegistration() throws LostSessionException, TucanDownException { if (checkForLostSeesion()) { Element form = doc.select("form[name=registrationdetailsform]").first(); String resultText = ""; if (form != null) { resultText = form.select("span.note").first().text(); } else { try { resultText = doc.select("p.remarks").first().select("span.error").text(); } catch (NullPointerException e) { ACRA.getErrorReporter().handleSilentException(e); } } Toast.makeText(context, resultText, Toast.LENGTH_LONG).show(); if (context instanceof BrowserAnswerReciever) { callResultBrowser = new SimpleSecureBrowser((BrowserAnswerReciever) context); RequestObject thisRequest = new RequestObject(URLStringtoCall, localCookieManager, RequestObject.METHOD_GET, ""); callResultBrowser.execute(thisRequest); } return 0; } return -1; } public ListAdapter getExamsOverview() { Element significantTable = doc.select("table.nb").select("tbody").first(); Iterator<Element> rows = significantTable.select("tr").iterator(); eventisModule = new ArrayList<Boolean>(); eventName = new ArrayList<String>(); examDate = new ArrayList<String>(); registerLink = new ArrayList<String>(); examSelection = new ArrayList<Integer>(); while (rows.hasNext()) { try { Element next = rows.next(); if (next.hasClass("level02")) { eventisModule.add(true); eventName.add(next.select("td").get(1).text()); examDate.add(""); examSelection.add(-1); registerLink.add(""); } else if (next.hasClass("level03")) { // NEU eventisModule.add(true); eventName.add(next.select("td").get(0).text()); examDate.add(""); examSelection.add(-1); registerLink.add(""); } else { eventisModule.add(false); Elements cols = next.select("td"); eventName.add(cols.get(2).text()); examDate.add(cols.get(3).text()); // Wenn keine Anmeldung/Abmeldung möglich ist if (cols.get(4).select("a").isEmpty()) { if (cols.get(4).text().equals("Ausgewählt")) examSelection.add(1); else examSelection.add(0); registerLink.add(""); } else { // Anmeldung/Abmeldung möglich if (cols.get(4).select("a").text().equals("Anmelden")) examSelection.add(2); else examSelection.add(3); registerLink.add(cols.get(4).select("a").attr("href")); } } } catch (IndexOutOfBoundsException e) { Log.e(LOG_TAG, "Index out of Bounds"); ACRA.getErrorReporter().handleSilentException(e); } // System.out.println(); } if (justGetimportant) { // TODO: Only get a selection } RegisterExamAdapter nextAdapter = new RegisterExamAdapter(context, eventisModule, eventName, examDate, examSelection); return nextAdapter; } public void onClick(DialogInterface dialog, int which) { if (context instanceof BrowserAnswerReciever) { SimpleSecureBrowser finalizeRegister = new SimpleSecureBrowser( (BrowserAnswerReciever) context); RequestObject callstatuschange = new RequestObject(TucanMobile.TUCAN_PROT + TucanMobile.TUCAN_HOST + "/scripts/mgrqcgi", localCookieManager, RequestObject.METHOD_POST, postString); finalizeRegister.execute(callstatuschange); } } }