Thema: Delphi Jabber per dorXMPPClient

Einzelnen Beitrag anzeigen

CCRDude

Registriert seit: 9. Jun 2011
677 Beiträge
 
FreePascal / Lazarus
 
#1

Jabber per dorXMPPClient

  Alt 17. Mai 2013, 12:08
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?
  Mit Zitat antworten Zitat