Seite 1 von 1

auf Signal warten

Verfasst: 24. Februar 2008 19:59
von RED Squirrel
hi!

ich habe eine login Funktion geschrieben, die mich in ein cms via HTTP einloggen soll, und fals das funktioniert true zurück gibt. Ich kann durch den Fehlercode, den ich durch responseHeader.statusCode() bekomme herausfinden, ob ich mich erfolgreich eingeloggt habe. Das Problem ist aber, dass ich dies erst ausführen kann, wenn ich vom Server den Response bekommen habe. Meine login Funktion wartet aber nicht so lange, sondern ließt den Standardwert des statuscods aus, der ja nicht richtig sein kann.

Hier meine Funktion(en)

Code: Alles auswählen

//logt sich in Redaxo ein, und speichert das cookie der aktuellen session in rexCookie
bool redaxo::login(QString uname, QString upassword)
{
	if(rexHost == "")
		return false;

	// POST login content
	logincontent.append("page=structure&REX_ULOGIN=");
	logincontent.append(uname);
	logincontent.append("&REX_UPSW=");
	logincontent.append(upassword);

	// POST login header
	loginheader.setRequest("POST", "/redaxo/index.php");
	
	loginheader.setValue("Host", rexHost);
	loginheader.setValue("User-Agent", "Redaxo backup 1.0");	
	loginheader.setValue("Cookie", "PHPSESSID=01mrb9cdnv2ust2348efjgt8l3");
	loginheader.setContentType("application/x-www-form-urlencoded"); // important
	loginheader.setContentLength(logincontent.length());

	loginHTTP = new QHttp(this);
	loginHTTP->setHost(rexHost);
	loginHTTP->request(loginheader, logincontent);
	
	connect(loginHTTP, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),this, SLOT(readResponseHeader(const QHttpResponseHeader &)));

	if(httpStatus == 302)
		return true;
	else
		return false;

}

void redaxo::readResponseHeader(const QHttpResponseHeader &responseHeader)
{
		QString cookie = responseHeader.value("set-cookie");
		cookie = cookie.section(";", 0, 0);    

		if(cookie != "")		
			rexCookie = cookie;
		
		httpStatus = responseHeader.statusCode();
}
Wie kann ich die login funktion so lange warten lassen, bis der Statuscode da ist?

lg. RED

Verfasst: 24. Februar 2008 21:01
von Christian81
Warten ist falsch. In readResponseHeader() muss du dann weitermachen. Beschäftige Dich mal etwas mit Signals & Slots.

Verfasst: 25. Februar 2008 08:02
von RED Squirrel
ok.

Aber wie komme ich vom Slot wieder zu meiner Funktion zurück? Der Punkt ist doch, dass die beiden nichts von einander wissen.

Kann ich das also gar nicht mit nur einer Funktion lösen? sondern muss ich dann noch eine getter Funktion schreiben, die mir dann den status zurück gibt?

Verfasst: 25. Februar 2008 08:11
von Christian81
Da beide in der gleichen Klasse sind - wo ist das Problem?
Wie gesagt - ich glaube dein grundsätzliches Verständnis fehlt hier etwas. -> Ich stosse eine Aktion an, connecte mich mit dem result, gehe wieder in die Eventloop damit die GUI benutzbar bleibt. Wenn die Aktion fertig ist bearbeite ich die erzeugten Daten weiter.

Verfasst: 25. Februar 2008 09:25
von RED Squirrel
heißt das, ich erstelle meine loginfunktion ohne Rückgabewert. Die macht dann alles, schon klar. Zusätzlich erstelle ich eine getter Funktion, die mir einen Errorcode zurück gibt.

Ich dachte, ich kann das gleich mit der login Funktion machen, aber so ist es auch super.

Danke!

Verfasst: 25. Februar 2008 10:29
von RED Squirrel
hab deinen post jetzt, glaub ich verstanden