Ich versuche aktuell, mich per Jabber zu verbinden, um Nachrichten abzusetzen. Bei der Suche nach "fertigen" Delphi-Komponenten habe ich eigentlich, neben kommerziellen, nur
dorXMPPClient.pas aus
DelphiOnRails gefunden (einzige Abhängigkeit:
superobject). Inklusive superobject per git ausgecheckt, losgelegt...
Nun ist das noch sehr nahe am Protokoll implementiert, und dummerweise so voller anonymer Funktionen und gotos, dass ich mit meinem (Delphi XE) Debugger nicht wirklich durchsteige; einen Vergleich mit der XMPP-Doku macht das zudem auch schwierig. Und zu guter letzter kann die XE-Codeformatierung mit anonymen Methoden auch nicht so recht und der Linker steigt ständig bei diesen irgendwie mit Internal Errors aus, dann ist jeweils ein
IDE-Neustart plus Rebuild angesagt.
Aber genug gejammert, mein Stand jetzt:
Delphi-Quellcode:
function TJabberNotificationTransmitter.SendNotification(ANotification: TNotification): boolean;
var
jc: TXMPPClient;
msg: IXMLNode;
msgbody: IXMLNode;
res: TXMPPResult;
iq: IXMPPIQ;
p: IXMPPPresence;
begin
Result := false;
AllocConsole;
jc := TXMPPClient.Create;
try
IXMPPClient(jc).OnReadyStateChange := DoJabberReadyState;
IXMPPClient(jc).OnError := DoJabberError;
IXMPPClient(jc).OnTrace := DoJabberTrace;
IXMPPClient(jc).OnIQ := DoJabberIQ;
IXMPPClient(jc).OnPresence := DoJabberPresence;
IXMPPClient(jc).OnMessage := DoJabberMessage;
IXMPPClient(jc).OnSynchronize := DoJabberSynchronize;
res := IXMPPClient(jc).Open(FUsername, FPassword, 'NotificationSpreader', FHost, FPort, []); // xoPlaintextAuth
repeat
until IXMPPClient(jc).ReadyState = rsAuthenticated;
Result := (res = xOK);
if res = xOK then begin
try
Sleep(2000);
p := TXMPPMessage.CreatePresence(ptNone, psAway, 'Sending notification...');
IXMPPClient(jc).SendXML(p);
Sleep(2000);
msg := TXMPPMessage.CreateMessage(mtChat, FRecipient, FUsername + '/NotificationSpreader', '');
msgbody := msg.Append('body');
msgbody.Text := ANotification.Title + #13#10 + ANotification.Text;
IXMPPClient(jc).SendXML(msg);
Sleep(2000);
finally
IXMPPClient(jc).Close;
end;
end;
finally
jc.Free;
end;
end;
Soweit funktioniert das, nur hat das dreifache Sleep natürlich der Teufel in Person da reingeschrieben, selbst wenn ich das Teil selber threaden sollte, mag ich das (unh auch kein WaitFor...) einfach nicht haben.
Hat jemand schon mit dem Teil gearbeitet und es hinbekommen, über Events jeweils zum richtigen Zeitpunkt zu agieren?