Jabber WindowGram Client (JWGC)

Introduction Screenshots Installation Downloads
Documentation Browse Source Resources Project Site

Stable Version
-none-

Latest Version
beta5



Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

jwgc_handler.c File Reference

#include "notice.h"
#include "exec.h"
#include "mux.h"
#include "main.h"

Go to the source code of this file.

Functions

void jwg_on_event_handler (jwgconn conn, jwgpacket packet)


Function Documentation

void jwg_on_event_handler jwgconn  conn,
jwgpacket  packet
 

Definition at line 7 of file jwgc_handler.c.

References dExecution, dparseflags(), dprintf(), jabconn_struct::dumpfd, jabconn_struct::dumpid, find_match(), jab_c, jab_recv(), jab_send(), JABPACKET__GET, JABPACKET__SET, JABPACKET__SUBSCRIBE, JABPACKET__UNAVAILABLE, JABPACKET__UNSUBSCRIBE, jabutil_iqnew(), jabutil_msgnew(), jabutil_pingnew(), jabutil_presnew(), jid, jVarJID, jVars_get(), jVars_get_error(), jVars_set(), jVars_show(), jVars_stoi(), jwg_c, jwg_cleanup(), jwg_serverror(), jwg_servsend(), jwg_servsuccess(), jwgconn, jwgpacket, JWGPACKET_CHECK, JWGPACKET_DEBUG, JWGPACKET_GROUP, JWGPACKET_JOIN, JWGPACKET_LEAVE, JWGPACKET_LOCATE, JWGPACKET_MESSAGE, JWGPACKET_NICKNAME, JWGPACKET_PING, JWGPACKET_REGISTER, JWGPACKET_REREAD, jwgpacket_reset(), JWGPACKET_SEARCH, JWGPACKET_SETVAR, JWGPACKET_SHOWVAR, JWGPACKET_SHUTDOWN, JWGPACKET_STATUS, JWGPACKET_SUBSCRIBE, JWGPACKET_UNSUBSCRIBE, list_contacts(), list_contacts_bygroup(), mux_end_loop_p, NS_REGISTER, NS_ROSTER, NS_SEARCH, NULL, read_in_description_file(), remove_from_contact_list(), jwgconn_struct::sckfd, show_status(), showall, target, trim_message(), jwgpacket_struct::type, update_group(), update_nickname(), jwgpacket_struct::x, xode, xode_free(), xode_get_attrib(), xode_get_data(), xode_get_firstchild(), xode_get_nextsibling(), xode_get_tag(), xode_get_tagdata(), xode_insert_cdata(), xode_insert_node(), xode_insert_tag(), xode_new(), and xode_put_attrib().

Referenced by jwgc_init().

00008 {
00009         dprintf(dExecution, "JWGC event handler called...\n");
00010 
00011         jwgpacket_reset(packet);
00012         dprintf(dExecution, "Received event: %d.\n", packet->type);
00013         switch (packet->type) {
00014                 case JWGPACKET_PING: {
00015                         char *match, *target, *message, *dontmatch, *type;
00016                         char retstr[80];
00017                         xode out;
00018 
00019                         target = xode_get_attrib(packet->x, "to");
00020                         dontmatch = xode_get_attrib(packet->x, "dontmatch");
00021                         type = xode_get_attrib(packet->x, "type");
00022                         if (!type) {
00023                                 type = strdup("chat");
00024                         }
00025 
00026                         dprintf(dExecution, "Received ping\n");
00027 
00028                         if (!target) {
00029                                 dprintf(dExecution, "No target specified.\n");
00030                                 jwg_serverror(conn, "No target specified.");
00031                                 break;
00032                         }
00033 
00034                         dprintf(dExecution, "Target %s\n", target);
00035                         if (dontmatch && !strcmp(dontmatch, "yes")) {
00036                                 match = strdup(target);
00037                         }
00038                         else if (strncmp(target,
00039                                         (char *)jVars_get(jVarJID),
00040                                         strlen(target))) {
00041                                 match = find_match(target);
00042                                 if (!match) {
00043                                         dprintf(dExecution, "No match\n");
00044                                         jwg_serverror(conn, "Unable to find a matching user.");
00045 
00046                                         break;
00047                                 }
00048                         }
00049                         else {
00050                                 match = strdup(target);
00051                         }
00052 
00053                         dprintf(dExecution, "To: %s\n", match);
00054                         out = jabutil_pingnew(type, match);
00055                         jab_send(jab_c, out);
00056 
00057                         sprintf(retstr, "Successfully pinged %.67s.", match);
00058                         jwg_servsuccess(conn, retstr);
00059                 } break;
00060 
00061                 case JWGPACKET_MESSAGE: {
00062                         char *match, *target, *message, *dontmatch, *encrypt,
00063                                 *encmessage, *type;
00064                         char retstr[80];
00065                         xode out;
00066 
00067                         encrypt = NULL;
00068                         encmessage = NULL;
00069                         target = xode_get_attrib(packet->x, "to");
00070                         dontmatch = xode_get_attrib(packet->x, "dontmatch");
00071                         encrypt = xode_get_attrib(packet->x, "encrypt");
00072                         type = xode_get_attrib(packet->x, "type");
00073                         if (!type) {
00074                                 type = strdup("chat");
00075                         }
00076 
00077                         dprintf(dExecution, "Received message\n");
00078 
00079                         if (!target) {
00080                                 dprintf(dExecution, "No target specified.\n");
00081                                 jwg_serverror(conn, "No target specified.");
00082                                 break;
00083                         }
00084 
00085                         dprintf(dExecution, "Target %s\n", target);
00086                         if (dontmatch && !strcmp(dontmatch, "yes")) {
00087                                 match = strdup(target);
00088                         }
00089                         else if (strncmp(target,
00090                                         (char *)jVars_get(jVarJID),
00091                                         strlen(target))) {
00092                                 match = find_match(target);
00093                                 if (!match) {
00094                                         dprintf(dExecution, "No match\n");
00095                                         jwg_serverror(conn, "Unable to find a matching user.");
00096 
00097                                         break;
00098                                 }
00099                         }
00100                         else {
00101                                 match = strdup(target);
00102                         }
00103 
00104                         message = xode_get_data(packet->x);
00105                         if (!message) {
00106                                 message = "";
00107                         }
00108                         else {
00109                                 trim_message(message);
00110                         }
00111 
00112 #ifdef USE_GPGME
00113                         if (encrypt) {
00114                                 char *keyid = JGetKeyID(match);
00115 
00116                                 if (!keyid) {
00117                                         dprintf(dExecution, "Unable to find keyid.\n");
00118                                         jwg_serverror(conn, "Unable to find a matching gpg key.");
00119                                         break;
00120                                 }
00121 
00122                                 encmessage = JEncrypt(message, keyid);
00123                                 if (!encmessage) {
00124                                         dprintf(dExecution, "Unable to encrypt message.\n");
00125                                         jwg_serverror(conn, "Unable to encrypt message.");
00126                                         break;
00127                                 }
00128 
00129                                 encmessage = JTrimPGPMessage(encmessage);
00130                                 if (!encmessage) {
00131                                         dprintf(dExecution, "Unable to trim encrypted message.\n");
00132                                         jwg_serverror(conn, "Unable to trim encrypted message.");
00133                                         break;
00134                                 }
00135 
00136                                 message = "[This message is encrypted.]";
00137                         }
00138 #endif /* USE_GPGME */
00139 
00140                         dprintf(dExecution, "To: %s\nMsg: %s%s\n", match, message, encmessage ? " [encrypted]" : "");
00141                         out = jabutil_msgnew(type, match, NULL, message, encmessage);
00142                         jab_send(jab_c, out);
00143 
00144                         sprintf(retstr, "Successfully sent to %.67s.", match);
00145                         jwg_servsuccess(conn, retstr);
00146                 } break;
00147 
00148                 case JWGPACKET_LOCATE: {
00149                         char *organization, *match, *showall, *target;
00150                         int skipnotavail, strictmatch;
00151 
00152                         dprintf(dExecution, "Received locate\n");
00153 
00154                         target = xode_get_attrib(packet->x, "target");
00155                         if (!target) {
00156                                 target = NULL;
00157                         }
00158 
00159                         strictmatch = 0;
00160                         match = xode_get_attrib(packet->x, "match");
00161                         if (match) {
00162                                 if (!strcmp(match, "strict")) {
00163                                         strictmatch = 1;
00164                                 }
00165                         }
00166 
00167                         skipnotavail = 1;
00168                         showall = xode_get_attrib(packet->x, "showall");
00169                         if (showall && !strcmp(showall, "yes")) {
00170                                 skipnotavail = 0;
00171                         }
00172 
00173                         organization = xode_get_attrib(packet->x, "organization");
00174                         if (organization) {
00175                                 if (!strcmp(organization, "group")) {
00176                                         list_contacts_bygroup(jwg_c, target, strictmatch, skipnotavail);
00177                                 }
00178                                 else {
00179                                         list_contacts(jwg_c, target, strictmatch, skipnotavail);
00180                                 }
00181                         }
00182                         else {
00183                                 list_contacts(jwg_c, target, strictmatch, skipnotavail);
00184                         }
00185                 } break;
00186 
00187                 case JWGPACKET_STATUS: {
00188                         show_status();
00189                 } break;
00190 
00191                 case JWGPACKET_SHUTDOWN: {
00192                         dprintf(dExecution, "Received shutdown\n");
00193                         jwg_servsuccess(conn, "Shutdown initiated.");
00194                         mux_end_loop_p = 1;
00195                 } break;
00196 
00197                 case JWGPACKET_CHECK: {
00198                         dprintf(dExecution, "Received check\n");
00199                         jwg_servsuccess(conn, "check");
00200                 } break;
00201 
00202                 case JWGPACKET_REREAD: {
00203                         dprintf(dExecution, "Received reread\n");
00204                         if (read_in_description_file()) {
00205                                 jwg_servsuccess(conn,
00206                                         "Description file loaded.");
00207                         }
00208                         else {
00209                                 jwg_serverror(conn,
00210                                 "Description file had an error.  Load failed.");
00211                         }
00212                 } break;
00213 
00214                 case JWGPACKET_SHOWVAR: {
00215                         xode out, x;
00216                         char *var, *setting;
00217 
00218                         dprintf(dExecution, "Received showvar\n");
00219 
00220                         var = xode_get_attrib(packet->x, "var");
00221                         if (!var) {
00222                                 jwg_serverror(conn, "Variable not specified.");
00223                                 break;
00224                         }
00225 
00226                         setting = jVars_show(jVars_stoi(var));
00227                         if (!setting) {
00228                                 jwg_serverror(conn, jVars_get_error());
00229                                 break;
00230                         }
00231 
00232                         out = xode_new("results");
00233                         x = xode_insert_cdata(out, setting, strlen(setting));
00234                         jwg_servsend(conn, out);
00235                         xode_free(out);
00236                 } break;
00237 
00238                 case JWGPACKET_SUBSCRIBE: {
00239                         xode out, x, y;
00240                         char *jid;
00241 
00242                         dprintf(dExecution, "Received subscribe\n");
00243 
00244                         jid = xode_get_attrib(packet->x, "jid");
00245                         if (!jid) {
00246                                 jwg_serverror(conn, "JID not specified.");
00247                                 break;
00248                         }
00249                         dprintf(dExecution, "Subscribe: %s\n", jid);
00250 
00251                         out = jabutil_presnew(JABPACKET__SUBSCRIBE, jid, "Jwgc Subscription Request", -1);
00252                         jab_send(jab_c, out);
00253                         xode_free(out);
00254 
00255                         out = jabutil_iqnew(JABPACKET__SET, NS_ROSTER);
00256                         x = xode_get_tag(out, "query");
00257                         y = xode_insert_tag(x, "item");
00258                         xode_put_attrib(y, "jid", jid);
00259                         jab_send(jab_c, out);
00260                         xode_free(out);
00261 
00262                         out = xode_new("presence");
00263                         xode_put_attrib(out, "to", jid);
00264                         jab_send(jab_c, out);
00265                         xode_free(out);
00266 
00267                         jwg_servsuccess(conn, "Subscription successful.");
00268                 } break;
00269 
00270                 case JWGPACKET_UNSUBSCRIBE: {
00271                         xode out, x, y;
00272                         char *jid;
00273 
00274                         dprintf(dExecution, "Received unsubscribe\n");
00275 
00276                         jid = xode_get_attrib(packet->x, "jid");
00277                         if (!jid) {
00278                                 jwg_serverror(conn, "JID not specified.");
00279                                 break;
00280                         }
00281                         dprintf(dExecution, "Unsubscribe: %s\n", jid);
00282 
00283                         out = jabutil_presnew(JABPACKET__UNSUBSCRIBE, jid, "Jwgc Unsubscription Request", -1);
00284                         jab_send(jab_c, out);
00285                         xode_free(out);
00286 
00287                         out = jabutil_iqnew(JABPACKET__SET, NS_ROSTER);
00288                         x = xode_get_tag(out, "query");
00289                         y = xode_insert_tag(x, "item");
00290                         xode_put_attrib(y, "jid", jid);
00291                         xode_put_attrib(y, "subscription", "remove");
00292                         jab_send(jab_c, out);
00293                         xode_free(out);
00294 
00295                         jwg_servsuccess(conn, "Unsubscription successful.");
00296                 } break;
00297 
00298                 case JWGPACKET_NICKNAME: {
00299                         xode out, x, y;
00300                         char *jid, *nick;
00301 
00302                         dprintf(dExecution, "Received nickname\n");
00303 
00304                         jid = xode_get_attrib(packet->x, "jid");
00305                         nick = xode_get_attrib(packet->x, "nick");
00306                         if (!jid) {
00307                                 jwg_serverror(conn, "JID not specified.");
00308                                 break;
00309                         }
00310                         if (!nick) {
00311                                 jwg_serverror(conn, "Nickname not specified.");
00312                                 break;
00313                         }
00314                         dprintf(dExecution, "Nickname: %s -> %s\n", jid, nick);
00315 
00316                         out = jabutil_iqnew(JABPACKET__SET, NS_ROSTER);
00317                         x = xode_get_tag(out, "query");
00318                         y = xode_insert_tag(x, "item");
00319                         xode_put_attrib(y, "jid", jid);
00320                         xode_put_attrib(y, "name", nick);
00321                         jab_send(jab_c, out);
00322                         xode_free(out);
00323 
00324                         update_nickname(jid, nick);
00325 
00326                         jwg_servsuccess(conn, "Nickname setting successful.");
00327                 } break;
00328 
00329                 case JWGPACKET_GROUP: {
00330                         xode out, x, y, z, zz;
00331                         char *jid, *group;
00332 
00333                         dprintf(dExecution, "Received group\n");
00334 
00335                         jid = xode_get_attrib(packet->x, "jid");
00336                         group = xode_get_attrib(packet->x, "group");
00337                         if (!jid) {
00338                                 jwg_serverror(conn, "JID not specified.");
00339                                 break;
00340                         }
00341                         if (!group) {
00342                                 jwg_serverror(conn, "Group not specified.");
00343                                 break;
00344                         }
00345                         dprintf(dExecution, "Group: %s -> %s\n", jid, group);
00346 
00347                         out = jabutil_iqnew(JABPACKET__SET, NS_ROSTER);
00348                         x = xode_get_tag(out, "query");
00349                         y = xode_insert_tag(x, "item");
00350                         xode_put_attrib(y, "jid", jid);
00351                         z = xode_insert_tag(y, "group");
00352                         zz = xode_insert_cdata(z, group, strlen(group));
00353 
00354                         jab_send(jab_c, out);
00355                         xode_free(out);
00356 
00357                         update_group(jid, group);
00358 
00359                         jwg_servsuccess(conn, "Group setting successful.");
00360                 } break;
00361 
00362                 case JWGPACKET_REGISTER: {
00363                         xode out, query, queryout, x;
00364                         char *jid, randnum[6];
00365 
00366                         dprintf(dExecution, "Received register\n");
00367 
00368                         jid = xode_get_attrib(packet->x, "jid");
00369                         if (!jid) {
00370                                 jwg_serverror(conn, "JID not specified.");
00371                                 break;
00372                         }
00373                         dprintf(dExecution, "Register: %s\n", jid);
00374 
00375                         query = xode_get_tag(packet->x, "query");
00376                         if (query) {
00377                                 out = jabutil_iqnew(JABPACKET__SET, NS_REGISTER);
00378                                 queryout = xode_get_tag(out, "query");
00379                         }
00380                         else {
00381                                 out = jabutil_iqnew(JABPACKET__GET, NS_REGISTER);
00382                         }
00383                         sprintf(randnum, "%d", random() % 50000);
00384                         xode_put_attrib(out, "id", randnum);
00385                         xode_put_attrib(out, "to", jid);
00386                         if (query) {
00387                                 x = xode_get_firstchild(query);
00388                                 while (x) {
00389                                         xode_insert_node(queryout, x);
00390                                         x = xode_get_nextsibling(x);
00391                                 }
00392                         }
00393                         jab_send(jab_c, out);
00394                         xode_free(out);
00395 
00396                         jab_c->dumpfd = conn->sckfd;
00397                         jab_c->dumpid = randnum;
00398                         jab_recv(jab_c);
00399                         jab_c->dumpfd = -1;
00400                         jab_c->dumpid = NULL;
00401                 } break;
00402 
00403                 case JWGPACKET_SEARCH: {
00404                         xode out, query, queryout, x;
00405                         char *jid, randnum[6];
00406 
00407                         dprintf(dExecution, "Received search\n");
00408 
00409                         jid = xode_get_attrib(packet->x, "jid");
00410                         if (!jid) {
00411                                 jwg_serverror(conn, "JID not specified.");
00412                                 break;
00413                         }
00414                         dprintf(dExecution, "Search: %s\n", jid);
00415 
00416                         query = xode_get_tag(packet->x, "query");
00417                         if (query) {
00418                                 out = jabutil_iqnew(JABPACKET__SET, NS_SEARCH);
00419                                 queryout = xode_get_tag(out, "query");
00420                         }
00421                         else {
00422                                 out = jabutil_iqnew(JABPACKET__GET, NS_SEARCH);
00423                         }
00424                         sprintf(randnum, "%d", random() % 50000);
00425                         xode_put_attrib(out, "id", randnum);
00426                         xode_put_attrib(out, "to", jid);
00427                         if (query) {
00428                                 x = xode_get_firstchild(query);
00429                                 while (x) {
00430                                         xode_insert_node(queryout, x);
00431                                         x = xode_get_nextsibling(x);
00432                                 }
00433                         }
00434                         jab_send(jab_c, out);
00435                         xode_free(out);
00436 
00437                         jab_c->dumpfd = conn->sckfd;
00438                         jab_c->dumpid = randnum;
00439                         jab_recv(jab_c);
00440                         jab_c->dumpfd = -1;
00441                         jab_c->dumpid = NULL;
00442                 } break;
00443 
00444                 case JWGPACKET_SETVAR: {
00445                         xode out, x;
00446                         char *var, *setting;
00447 
00448                         dprintf(dExecution, "Received setvar\n");
00449 
00450                         var = xode_get_attrib(packet->x, "var");
00451                         if (!var) {
00452                                 jwg_serverror(conn, "Variable not specified.");
00453                                 break;
00454                         }
00455 
00456                         setting = xode_get_data(packet->x);
00457                         if (!setting) {
00458                                 jwg_serverror(conn, "Empty setting.");
00459                                 break;
00460                         }
00461 
00462                         if (!jVars_set(jVars_stoi(var), setting)) {
00463                                 jwg_serverror(conn, jVars_get_error());
00464                                 break;
00465                         }
00466                         
00467                         jwg_servsuccess(conn, "Variable successfully set.");
00468                 } break;
00469 
00470                 case JWGPACKET_JOIN: {
00471                         xode out;
00472                         char *chatroom;
00473 
00474                         dprintf(dExecution, "Received join\n");
00475                         chatroom = xode_get_attrib(packet->x, "room");
00476                         if (!chatroom) {
00477                                 jwg_serverror(conn, "Target room not specified.");
00478                                 break;
00479                         }
00480 
00481                         out = jabutil_presnew(-1, chatroom, NULL, -1);
00482                         jab_send(jab_c, out);
00483 
00484                         jwg_servsuccess(conn, "Successfully joined chat room.");
00485                 } break;
00486 
00487                 case JWGPACKET_LEAVE: {
00488                         xode out;
00489                         char *chatroom;
00490 
00491                         dprintf(dExecution, "Received leave\n");
00492                         chatroom = xode_get_attrib(packet->x, "room");
00493                         if (!chatroom) {
00494                                 jwg_serverror(conn, "Target room not specified.");
00495                                 break;
00496                         }
00497 
00498                         out = jabutil_presnew(JABPACKET__UNAVAILABLE, chatroom, NULL, -1);
00499                         jab_send(jab_c, out);
00500 
00501                         remove_from_contact_list(chatroom);
00502 
00503                         jwg_servsuccess(conn, "Successfully left chat room.");
00504                 } break;
00505 
00506                 case JWGPACKET_DEBUG: {
00507                         char *debugflags;
00508 
00509                         dprintf(dExecution, "Received debug\n");
00510                         debugflags = xode_get_tagdata(packet->x, "debugflags");
00511                         if (!debugflags) {
00512                                 jwg_serverror(conn, "You must specify debugging flags.");
00513                                 break;
00514                         }
00515 
00516                         dparseflags(debugflags);
00517 
00518                         jwg_servsuccess(conn, "Successfully adjusted debugging flags.");
00519                 } break;
00520 
00521                 default: {
00522                         dprintf(dExecution, "JwgcEvent: unknown packet.\n");
00523                 } break;
00524         }
00525 
00526         jwg_cleanup(conn);
00527         return;
00528 }



Last updated at Tue Dec 18 21:07:42 PST 2007. This site and project hosted by...SourceForge.net Logo

Source Perspective by Fisheye