Author: turbo24prg
Date: Sat May 27 15:02:37 2006
New Revision: 10752
Added:
trunk/libraries/xmpp/callback.dylan (contents, props changed)
Modified:
trunk/libraries/xmpp/client.dylan
trunk/libraries/xmpp/iq.dylan
trunk/libraries/xmpp/message.dylan
trunk/libraries/xmpp/presence.dylan
trunk/libraries/xmpp/xmpp-exports.dylan
trunk/libraries/xmpp/xmpp-test/xmpp-test.dylan
trunk/libraries/xmpp/xmpp.lid
Log:
Bug: 7313
* callbacks
Added: trunk/libraries/xmpp/callback.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/xmpp/callback.dylan Sat May 27 15:02:37 2006
@@ -0,0 +1,18 @@
+module: xmpp
+synopsis:
+author:
+copyright:
+
+define class <callback> (<priority-queueable-mixin>)
+ slot reference :: <symbol>,
+ init-keyword: reference:;
+ slot handler :: <function>,
+ required-init-keyword: handler:;
+ slot priority :: <integer>,
+ required-init-keyword: priority:;
+end class <callback>;
+
+define method \< (callback1 :: <callback>, callback2 :: <callback>)
+ => (boolean :: <boolean>);
+ callback1.priority < callback2.priority;
+end method \<;
Modified: trunk/libraries/xmpp/client.dylan
==============================================================================
--- trunk/libraries/xmpp/client.dylan (original)
+++ trunk/libraries/xmpp/client.dylan Sat May 27 15:02:37 2006
@@ -12,14 +12,22 @@
required-init-keyword: jid:;
slot socket :: <tcp-socket>,
init-keyword: socket:;
- slot state :: one-of(#"disconnected", #"authenticating", #"connected");
+ slot state :: one-of(#"disconnected", #"connected") = #"disconnected";
+ slot message-callbacks :: <priority-queue> =
+ make(<priority-queue>, comparison-function: \>);
+ slot presence-callbacks :: <priority-queue> =
+ make(<priority-queue>, comparison-function: \>);
+ slot iq-callbacks :: <priority-queue> =
+ make(<priority-queue>, comparison-function: \>);
+ slot xml-callbacks :: <priority-queue> =
+ make(<priority-queue>, comparison-function: \>);
virtual slot password;
end class <xmpp-client>;
-define method connect (client :: <xmpp-client>, #key port :: <integer> = 5222,
stream)
+define method connect (client :: <xmpp-client>, #key port :: <integer> = 5222,
host, stream)
=> (connected :: <boolean>);
start-sockets();
- client.socket := make(<tcp-socket>, host: client.jid.domain, port: port);
+ client.socket := make(<tcp-socket>, host: host | client.jid.domain, port:
port);
make(<thread>, priority: $background-priority, function: curry(listen,
client));
if (~ stream)
stream := make(<xmpp-stream>, to: client.jid.domain);
@@ -40,6 +48,7 @@
let stream-running? = #f;
let parsing-tag? = #f;
let tag = "";
+ let buffer = "";
let current-element = #f;
let tag-queue = make(<deque>);
@@ -50,14 +59,22 @@
if (parsing-tag? = #f)
if (received = '<')
parsing-tag? := #t;
+ if (size(buffer) > 0 & ~ every?(method(x) x = '\n' end, buffer) &
current-element)
+ //let xml-text = make(<char-string>, text: buffer);
+ format-out("||| %= %=\n", current-element, buffer);
+ format-out("||| %=\n", current-element.node-children);
+ current-element.node-children :=
concatenate(current-element.node-children, vector(make(<char-string>, text:
buffer)));
+ format-out("||| %= %=\n", current-element, buffer);
+ buffer := "";
+ end if;
tag := add!(tag, received);
read-next();
elseif (~ stream-running? & received ~= '\n')
//!!! error: not well-formed xml: chars not contained in root
element
format-out("!!! error: not well-formed xml: chars not contained in
root element\n");
- elseif (stream-running? & current-element & received ~= '\n')
+ elseif (stream-running? & current-element)
//!!! collect chars into text of current-element!!!
- current-element.text := add!(current-element.text, received);
+ buffer := add(buffer, received);
read-next();
end if;
else
@@ -87,7 +104,7 @@
stream-running? := #t;
//!!! do something
format-out("!!! (X) %=\n", current-element);
- make(<thread>, function: curry(dispatch, current-element));
+ make(<thread>, function: curry(dispatch, client,
current-element));
current-element := #f;
end if;
// cleanup
@@ -104,7 +121,7 @@
// empty stanza
if (size(tag-queue) < 2)
format-out("!!! (X) %=\n", element);
- make(<thread>, function: curry(dispatch, element));
+ make(<thread>, function: curry(dispatch, client, element));
else
add-element(current-element, element);
end if;
@@ -132,7 +149,7 @@
stream-running? := #f;
//!!! what do do here? thread?!
else
- make(<thread>, function: curry(dispatch, current-element));
+ make(<thread>, function: curry(dispatch, client,
current-element));
end if;
end if;
current-element := current-element.element-parent;
@@ -200,11 +217,15 @@
if (~ data.id)
data.id := "foo";
end if;
-
- send(client, data, awaits-result?: awaits-result?);
-/*
- if received.kind_of? XMLStanza and
received.id == xml.id
-*/
+
+ let result = send(client, data, awaits-result?: awaits-result?);
+ if (awaits-result?)
+ if (result.id ~= data.id)
+ signal("id-missmatch");
+ else
+ result;
+ end if;
+ end if;
end method send-with-id;
define method password-setter (password, client :: <xmpp-client>)
@@ -213,15 +234,36 @@
password;
end method password-setter;
-define method dispatch (element :: <element>)
+define method dispatch (client :: <xmpp-client>, element :: <element>)
+// let stanza = element;
+ format-out("!!! (X2) %=\n", element);
+ let stanza = select (element.name)
+ #"message" => as(<message>, element);
+ #"presence" => as(<presence>, element);
+ #"iq" => as(<iq>, element);
+ otherwise => element;
+ end select;
with-lock (*stanza-lock*)
if (~ *available-stanza*)
release-all(*parsed-stanza*);
end if;
- *available-stanza* := element;
+ *available-stanza* := stanza;
end with-lock;
-
- format-out("!!! (X2) %=\n", element);
+ format-out("!!! (X2) %=\n", stanza);
+ format-out("!!! (X2) %=\n", object-class(stanza));
+ let callbacks = select (stanza by instance?)
+ <message> => client.message-callbacks;
+ <presence> => client.presence-callbacks;
+ <iq> => client.iq-callbacks;
+ otherwise => client.xml-callbacks;
+ end select;
+ block (return)
+ for (callback in callbacks)
+ if (callback.handler(client, stanza))
+ return();
+ end if;
+ end for;
+ end block;
end method dispatch;
define method authenticate (client :: <xmpp-client>, password, #key digest =
#t)
@@ -238,3 +280,13 @@
///!!! verify!!!
send-with-id(client, authentication, awaits-result?: #t);
end method authenticate;
+
+define method connected? (client :: <xmpp-client>)
+ => (res :: <boolean>)
+ client.state = #"connected"
+end method connected?;
+
+define method disconnected? (client :: <xmpp-client>)
+ => (res :: <boolean>)
+ client.state = #"disconnected"
+end method disconnected?;
Modified: trunk/libraries/xmpp/iq.dylan
==============================================================================
--- trunk/libraries/xmpp/iq.dylan (original)
+++ trunk/libraries/xmpp/iq.dylan Sat May 27 15:02:37 2006
@@ -129,3 +129,10 @@
add-element(iq, query);
iq;
end method make-registration;
+
+define method as (class == <iq>, element :: <element>)
+ => (res :: <iq>);
+ let iq = make(<iq>);
+ import-element(iq, element);
+ iq;
+end method as;
Modified: trunk/libraries/xmpp/message.dylan
==============================================================================
--- trunk/libraries/xmpp/message.dylan (original)
+++ trunk/libraries/xmpp/message.dylan Sat May 27 15:02:37 2006
@@ -145,3 +145,10 @@
end if;
end if;
end method normalize;
+
+define method as (class == <message>, element :: <element>)
+ => (res :: <message>);
+ let message = make(<message>);
+ import-element(message, element);
+ message;
+end method as;
Modified: trunk/libraries/xmpp/presence.dylan
==============================================================================
--- trunk/libraries/xmpp/presence.dylan (original)
+++ trunk/libraries/xmpp/presence.dylan Sat May 27 15:02:37 2006
@@ -116,7 +116,7 @@
define method priority-setter (priority :: <integer>, presence :: <presence>)
=> (res :: <integer>);
- remove-element(presence, "priority");
+ replace-element-text(presence, "priority", integer-to-string(priority));
priority;
end method priority-setter;
@@ -125,3 +125,10 @@
remove-element(presence, "priority");
priority;
end method priority-setter;
+
+define method as (class == <presence>, element :: <element>)
+ => (res :: <presence>)
+ let presence = make(<presence>);
+ import-element(presence, element);
+ presence;
+end method as;
Modified: trunk/libraries/xmpp/xmpp-exports.dylan
==============================================================================
--- trunk/libraries/xmpp/xmpp-exports.dylan (original)
+++ trunk/libraries/xmpp/xmpp-exports.dylan Sat May 27 15:02:37 2006
@@ -6,6 +6,7 @@
use network;
use xml-parser;
use meta;
+ use priority-queue;
export xmpp;
end library;
@@ -19,7 +20,8 @@
use streams;
use xml-parser;
use simple-xml;
-
+ use priority-queue;
+
//XXX
use standard-io;
use format-out;
@@ -72,10 +74,17 @@
description, description-setter;
export <xmpp-client>,
- jid, socket, state,
+ jid, jid-setter,
+ socket, socket-setter,
+ state, state-setter,
+ message-callbacks,
+ message-callbacks-setter,
connect, disconnect,
- send, authenticate;
-
+ send, authenticate,
+ connected?, disconnected?;
+
+ export <callback>;
+
export normalize,
id, id-setter,
from, from-setter,
Modified: trunk/libraries/xmpp/xmpp-test/xmpp-test.dylan
==============================================================================
--- trunk/libraries/xmpp/xmpp-test/xmpp-test.dylan (original)
+++ trunk/libraries/xmpp/xmpp-test/xmpp-test.dylan Sat May 27 15:02:37 2006
@@ -221,20 +221,46 @@
*/
- let client = make(<xmpp-client>, jid: make(<jid>, node: "foo", domain:
"192.168.0.1", resource: "xmpp"));
+ let callback1 = make(<callback>, reference: #"default", priority: 3,
handler: method (client, message)
+ format-out("CCC (1) %= %=\n", client, message);
+ if (message.body)
+ send(client, make(<message>, to: message.from, type: #"chat", body:
concatenate("You said: '", message.body, "'")));
+ end if;
+ #f;
+ end);
+
+/*
+ let callback2 = make(<callback>, reference: #"default", priority: 2,
handler: method (client, element)
+ format-out("CCC (2) %= %=\n", client, element);
+ #t;
+ end);
+
+ let callback3 = make(<callback>, reference: #"default", priority: 1,
handler: method (client, element)
+ format-out("CCC (3) %= %=\n", client, element);
+ #f;
+ end);
+*/
+ let client = make(<xmpp-client>, jid: make(<jid>, node: "dylan", domain:
"pentabarf.org", resource: "xmpp"));
+
+ add!(client.message-callbacks, callback1);
+// add!(client.message-callbacks, callback2);
+// add!(client.message-callbacks, callback3);
+
let stream = make(<xmpp-stream>, to: client.jid.domain);
block()
- if (~ connect(client))
+ if (~ connect(client, host: "benkstein.net", port: 4222))
exit-application(1);
end if;
format-out("Connected to xmpp server at %s port: %d\n",
client.socket.remote-host.host-name,
client.socket.remote-port);
- authenticate(client, "foo", digest: #f);
-
- let result = send(client, make(<message>, to: "foo@xxxxxxxxxxx/Psi", body:
"foo"), awaits-result?: #t);
- format-out("### (X3) %=\n", result);
+ authenticate(client, "test", digest: #f);
+ send(client, make(<presence>, priority: 23));
+ send(client, make(<message>, to: "turbo24prg@xxxxxxxxxxxxx", type:
#"chat", body: "This is turbot speaking, your friendly JabberBot written in
Dylan."));
+ send(client, make(<message>, to: "turbo24prg@xxxxxxxxxxxxx", type:
#"chat", body: "I'll echo everything you say!"));
+// let result = send(client, make(<message>, to: "dylan@xxxxxxxxxxxxx/Psi",
body: "This is turbot speaking."), awaits-result?: #t);
+// format-out("### (X3) %=\n", result);
while (#t)
end while;
@@ -245,7 +271,6 @@
exception (condition :: <condition>)
format-out("xmpp-test: Error: %=\n", condition);
end block;
-
exit-application(0);
end function main;
Modified: trunk/libraries/xmpp/xmpp.lid
==============================================================================
--- trunk/libraries/xmpp/xmpp.lid (original)
+++ trunk/libraries/xmpp/xmpp.lid Sat May 27 15:02:37 2006
@@ -16,3 +16,4 @@
stanza-error
connection
client
+ callback
--
Gd-chatter mailing list
Gd-chatter@xxxxxxxxxxxxxxxx
https://www.gwydiondylan.org/mailman/listinfo/gd-chatter
|