auf Signal warten

Alles rund um die Programmierung mit Qt
Antworten
RED Squirrel
Beiträge: 50
Registriert: 3. Februar 2007 22:21

auf Signal warten

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Warten ist falsch. In readResponseHeader() muss du dann weitermachen. Beschäftige Dich mal etwas mit Signals & Slots.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RED Squirrel
Beiträge: 50
Registriert: 3. Februar 2007 22:21

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RED Squirrel
Beiträge: 50
Registriert: 3. Februar 2007 22:21

Beitrag 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!
RED Squirrel
Beiträge: 50
Registriert: 3. Februar 2007 22:21

Beitrag von RED Squirrel »

hab deinen post jetzt, glaub ich verstanden
Antworten