Changeset b20b32f for protocols/oscar


Ignore:
Timestamp:
2005-11-28T01:14:06Z (19 years ago)
Author:
Jelmer Vernooij <jelmer@…>
Branches:
master
Children:
65e2ce1, cfcc587
Parents:
2cdd8ce (diff), dfde8e0 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge from Wilmer

Location:
protocols/oscar
Files:
2 deleted
10 edited

Legend:

Unmodified
Added
Removed
  • protocols/oscar/Makefile

    r2cdd8ce rb20b32f  
    1010
    1111# [SH] Program variables
    12 objects = admin.o auth.o bos.o buddylist.o chat.o chatnav.o conn.o ft.o icq.o im.o info.o misc.o msgcookie.o rxhandlers.o rxqueue.o search.o service.o snac.o ssi.o stats.o tlv.o txqueue.o oscar_util.o oscar.o
     12objects = admin.o auth.o bos.o buddylist.o chat.o chatnav.o conn.o icq.o im.o info.o misc.o msgcookie.o rxhandlers.o rxqueue.o search.o service.o snac.o ssi.o stats.o tlv.o txqueue.o oscar_util.o oscar.o
    1313
    1414CFLAGS += -Wall
  • protocols/oscar/aim.h

    r2cdd8ce rb20b32f  
    168168#define AIM_CONN_TYPE_CHATNAV       0x000d
    169169
    170 /* they start getting arbitrary in rendezvous stuff =) */
    171 #define AIM_CONN_TYPE_RENDEZVOUS    0x0101 /* these do not speak FLAP! */
    172 #define AIM_CONN_TYPE_RENDEZVOUS_OUT 0x0102 /* socket waiting for accept() */
    173 
    174 /*
    175  * Subtypes, we need these for OFT stuff.
    176  */
    177 #define AIM_CONN_SUBTYPE_OFT_DIRECTIM  0x0001
    178 #define AIM_CONN_SUBTYPE_OFT_GETFILE   0x0002
    179 #define AIM_CONN_SUBTYPE_OFT_SENDFILE  0x0003
    180 #define AIM_CONN_SUBTYPE_OFT_BUDDYICON 0x0004
    181 #define AIM_CONN_SUBTYPE_OFT_VOICE     0x0005
    182 
    183170/*
    184171 * Status values returned from aim_conn_new().  ORed together.
     
    191178
    192179#define AIM_FRAMETYPE_FLAP 0x0000
    193 #define AIM_FRAMETYPE_OFT  0x0001
    194180
    195181/*
     
    258244                        flap_seqnum_t seqnum;     
    259245                } flap;
    260                 struct {
    261                         guint16 type;
    262                         guint8 magic[4]; /* ODC2 OFT2 */
    263                         guint16 hdr2len;
    264                         guint8 *hdr2; /* rest of bloated header */
    265                 } oft;
    266246        } hdr;
    267247        aim_bstream_t data;     /* payload stream */
     
    670650#define AIM_COOKIETYPE_CHATNAV  0x06
    671651#define AIM_COOKIETYPE_INVITE   0x07
    672 /* we'll move OFT up a bit to give breathing room.  not like it really
    673  * matters. */
    674 #define AIM_COOKIETYPE_OFTIM    0x10
    675 #define AIM_COOKIETYPE_OFTGET   0x11
    676 #define AIM_COOKIETYPE_OFTSEND  0x12
    677 #define AIM_COOKIETYPE_OFTVOICE 0x13
    678 #define AIM_COOKIETYPE_OFTIMAGE 0x14
    679 #define AIM_COOKIETYPE_OFTICON  0x15
    680652
    681653int aim_handlerendconnect(aim_session_t *sess, aim_conn_t *cur);
  • protocols/oscar/aim_internal.h

    r2cdd8ce rb20b32f  
    192192aim_msgcookie_t *aim_checkcookie(aim_session_t *sess, const unsigned char *, const int);
    193193int aim_freecookie(aim_session_t *sess, aim_msgcookie_t *cookie);
    194 int aim_msgcookie_gettype(int reqclass);
    195194int aim_cookie_free(aim_session_t *sess, aim_msgcookie_t *cookie);
    196195
  • protocols/oscar/conn.c

    r2cdd8ce rb20b32f  
    164164         * This will free ->internal if it necessary...
    165165         */
    166         if ((*deadconn)->type == AIM_CONN_TYPE_RENDEZVOUS)
    167                 aim_conn_kill_rend(sess, *deadconn);
    168         else if ((*deadconn)->type == AIM_CONN_TYPE_CHAT)
     166        if ((*deadconn)->type == AIM_CONN_TYPE_CHAT)
    169167                aim_conn_kill_chat(sess, *deadconn);
    170168
     
    314312        if (deadconn->handlerlist)
    315313                aim_clearhandlers(deadconn);
    316         if (deadconn->type == AIM_CONN_TYPE_RENDEZVOUS)
    317                 aim_conn_close_rend((aim_session_t *)deadconn->sessv, deadconn);
    318314
    319315        return;
  • protocols/oscar/im.c

    r2cdd8ce rb20b32f  
    20392039         */
    20402040        aimbs_put8(&fr->data, strlen(sn));
    2041         aimbs_putraw(&fr->data, sn, strlen(sn));
     2041        aimbs_putraw(&fr->data, (const guint8*)sn, strlen(sn));
    20422042
    20432043        /*
  • protocols/oscar/msgcookie.c

    r2cdd8ce rb20b32f  
    178178        return 0;
    179179}
    180 
    181 /* XXX I hate switch */
    182 int aim_msgcookie_gettype(int reqclass)
    183 {
    184         /* XXX: hokey-assed. needs fixed. */
    185         switch(reqclass) {
    186         case AIM_CAPS_BUDDYICON: return AIM_COOKIETYPE_OFTICON;
    187         case AIM_CAPS_VOICE: return AIM_COOKIETYPE_OFTVOICE;
    188         case AIM_CAPS_IMIMAGE: return AIM_COOKIETYPE_OFTIMAGE;
    189         case AIM_CAPS_CHAT: return AIM_COOKIETYPE_CHAT;
    190         case AIM_CAPS_GETFILE: return AIM_COOKIETYPE_OFTGET;
    191         case AIM_CAPS_SENDFILE: return AIM_COOKIETYPE_OFTSEND;
    192         default: return AIM_COOKIETYPE_UNKNOWN;
    193         }           
    194 }
    195 
    196 
  • protocols/oscar/oscar.c

    r2cdd8ce rb20b32f  
    275275
    276276        if (condition & GAIM_INPUT_READ) {
    277                 if (conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) {
    278                         if (aim_handlerendconnect(odata->sess, conn) < 0) {
     277                if (aim_get_command(odata->sess, conn) >= 0) {
     278                        aim_rxdispatch(odata->sess);
     279                               if (odata->killme)
     280                                       signoff(gc);
     281                } else {
     282                        if ((conn->type == AIM_CONN_TYPE_BOS) ||
     283                                   !(aim_getconn_type(odata->sess, AIM_CONN_TYPE_BOS))) {
     284                                hide_login_progress_error(gc, _("Disconnected."));
     285                                signoff(gc);
     286                        } else if (conn->type == AIM_CONN_TYPE_CHAT) {
     287                                struct chat_connection *c = find_oscar_chat_by_conn(gc, conn);
     288                                char buf[BUF_LONG];
     289                                c->conn = NULL;
     290                                if (c->inpa > 0)
     291                                        gaim_input_remove(c->inpa);
     292                                c->inpa = 0;
     293                                c->fd = -1;
    279294                                aim_conn_kill(odata->sess, &conn);
    280                         }
    281                 } else {
    282                         if (aim_get_command(odata->sess, conn) >= 0) {
    283                                 aim_rxdispatch(odata->sess);
    284                                 if (odata->killme)
    285                                         signoff(gc);
     295                                sprintf(buf, _("You have been disconnected from chat room %s."), c->name);
     296                                do_error_dialog(sess->aux_data, buf, _("Chat Error!"));
     297                        } else if (conn->type == AIM_CONN_TYPE_CHATNAV) {
     298                                if (odata->cnpa > 0)
     299                                        gaim_input_remove(odata->cnpa);
     300                                odata->cnpa = 0;
     301                                while (odata->create_rooms) {
     302                                        struct create_room *cr = odata->create_rooms->data;
     303                                        g_free(cr->name);
     304                                        odata->create_rooms =
     305                                                g_slist_remove(odata->create_rooms, cr);
     306                                        g_free(cr);
     307                                        do_error_dialog(sess->aux_data, _("Chat is currently unavailable"),
     308                                                        _("Gaim - Chat"));
     309                                }
     310                                aim_conn_kill(odata->sess, &conn);
     311                        } else if (conn->type == AIM_CONN_TYPE_AUTH) {
     312                                if (odata->paspa > 0)
     313                                        gaim_input_remove(odata->paspa);
     314                                odata->paspa = 0;
     315                                aim_conn_kill(odata->sess, &conn);
    286316                        } else {
    287                                 if ((conn->type == AIM_CONN_TYPE_BOS) ||
    288                                            !(aim_getconn_type(odata->sess, AIM_CONN_TYPE_BOS))) {
    289                                         hide_login_progress_error(gc, _("Disconnected."));
    290                                         signoff(gc);
    291                                 } else if (conn->type == AIM_CONN_TYPE_CHAT) {
    292                                         struct chat_connection *c = find_oscar_chat_by_conn(gc, conn);
    293                                         char buf[BUF_LONG];
    294                                         c->conn = NULL;
    295                                         if (c->inpa > 0)
    296                                                 gaim_input_remove(c->inpa);
    297                                         c->inpa = 0;
    298                                         c->fd = -1;
    299                                         aim_conn_kill(odata->sess, &conn);
    300                                         sprintf(buf, _("You have been disconnected from chat room %s."), c->name);
    301                                         do_error_dialog(sess->aux_data, buf, _("Chat Error!"));
    302                                 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) {
    303                                         if (odata->cnpa > 0)
    304                                                 gaim_input_remove(odata->cnpa);
    305                                         odata->cnpa = 0;
    306                                         while (odata->create_rooms) {
    307                                                 struct create_room *cr = odata->create_rooms->data;
    308                                                 g_free(cr->name);
    309                                                 odata->create_rooms =
    310                                                         g_slist_remove(odata->create_rooms, cr);
    311                                                 g_free(cr);
    312                                                 do_error_dialog(sess->aux_data, _("Chat is currently unavailable"),
    313                                                                 _("Gaim - Chat"));
    314                                         }
    315                                         aim_conn_kill(odata->sess, &conn);
    316                                 } else if (conn->type == AIM_CONN_TYPE_AUTH) {
    317                                         if (odata->paspa > 0)
    318                                                 gaim_input_remove(odata->paspa);
    319                                         odata->paspa = 0;
    320                                         aim_conn_kill(odata->sess, &conn);
    321                                 } else {
    322                                         aim_conn_kill(odata->sess, &conn);
    323                                 }
     317                                aim_conn_kill(odata->sess, &conn);
    324318                        }
    325319                }
  • protocols/oscar/rxhandlers.c

    r2cdd8ce rb20b32f  
    341341                        continue;
    342342
    343                 /*
    344                  * This is a debugging/sanity check only and probably
    345                  * could/should be removed for stable code.
    346                  */
    347                 if (((cur->hdrtype == AIM_FRAMETYPE_OFT) &&
    348                    (cur->conn->type != AIM_CONN_TYPE_RENDEZVOUS)) ||
    349                   ((cur->hdrtype == AIM_FRAMETYPE_FLAP) &&
    350                    (cur->conn->type == AIM_CONN_TYPE_RENDEZVOUS))) {
    351                         do_error_dialog(sess->aux_data, "incompatible frame type/connection type combination", "Gaim");
    352                         cur->handled = 1;
    353                         continue;
    354                 }
    355 
    356                 if (cur->conn->type == AIM_CONN_TYPE_RENDEZVOUS) {
    357                         if (cur->hdrtype != AIM_FRAMETYPE_OFT) {
    358                                 do_error_dialog(sess->aux_data, "non-OFT frames on OFT connection", "Gaim");
    359                                 cur->handled = 1; /* get rid of it */
    360                         } else {
    361                                 /* FIXME: implement this (OFT frame) */
    362                                 cur->handled = 1; /* get rid of it */
    363                         }
    364                         continue;
    365                 }
    366 
    367                 if (cur->conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) {
    368                         /* not possible */
    369                         do_error_dialog(sess->aux_data, "RENDEZVOUS packet in rxqueue", "Gaim");
    370                         cur->handled = 1;
    371                         continue;
    372                 }
    373 
    374343                if (cur->hdr.flap.type == 0x01) {
    375344                       
  • protocols/oscar/rxqueue.c

    r2cdd8ce rb20b32f  
    332332        g_free(frame->data.data); /* XXX aim_bstream_free */
    333333
    334         if (frame->hdrtype == AIM_FRAMETYPE_OFT)
    335                 g_free(frame->hdr.oft.hdr2);
    336334        g_free(frame);
    337        
    338         return;
    339335}
    340336
     
    362358        if (conn->status & AIM_CONN_STATUS_INPROGRESS)
    363359                return aim_conn_completeconnect(sess, conn);
    364 
    365         /*
    366          * Rendezvous (client-client) connections do not speak
    367          * FLAP, so this function will break on them.
    368          */
    369         if (conn->type == AIM_CONN_TYPE_RENDEZVOUS)
    370                 return aim_get_command_rendezvous(sess, conn);
    371         else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) {
    372                 do_error_dialog(sess->aux_data,"AIM_CONN_TYPE_RENDEZVOUS_OUT shouldn't use FLAP", "Gaim");
    373                 return 0;
    374         }
    375360
    376361        aim_bstream_init(&flaphdr, flaphdr_raw, sizeof(flaphdr_raw));
  • protocols/oscar/txqueue.c

    r2cdd8ce rb20b32f  
    3434        }
    3535
    36         /* For sanity... */
    37         if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) ||
    38                         (conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT)) {
    39                 if (framing != AIM_FRAMETYPE_OFT) {
    40                         do_error_dialog(sess->aux_data, "attempted to allocate inappropriate frame type for rendezvous connection", "Gaim");
    41                         return NULL;
    42                 }
    43         } else {
    44                 if (framing != AIM_FRAMETYPE_FLAP) {
    45                         do_error_dialog(sess->aux_data, "attempted to allocate inappropriate frame type for FLAP connection", "Gaim");
    46                         return NULL;
    47                 }
    48         }
    49 
    5036        if (!(fr = (aim_frame_t *)g_new0(aim_frame_t,1)))
    5137                return NULL;
     
    5844
    5945                fr->hdr.flap.type = chan;
    60 
    61         } else if (fr->hdrtype == AIM_FRAMETYPE_OFT) {
    62 
    63                 fr->hdr.oft.type = chan;
    64                 fr->hdr.oft.hdr2len = 0; /* this will get setup by caller */
    6546
    6647        } else
     
    237218
    238219        if (count) {
    239                 if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) &&
    240                     (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) {
    241                         /* I strongly suspect that this is a horrible thing to do
    242                          * and I feel really guilty doing it. */
    243                         const char *sn = aim_directim_getsn(conn);
    244                         aim_rxcallback_t userfunc;
    245                         while (count - wrote > 1024) {
    246                                 wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, 1024);
    247                                 if ((userfunc=aim_callhandler(conn->sessv, conn,
    248                                                               AIM_CB_FAM_SPECIAL,
    249                                                               AIM_CB_SPECIAL_IMAGETRANSFER)))
    250                                   userfunc(conn->sessv, NULL, sn,
    251                                            count-wrote>1024 ? ((double)wrote / count) : 1);
    252                         }
    253                 }
    254220                if (count - wrote) {
    255221                        wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, count - wrote);
     
    299265}
    300266
    301 static int sendframe_oft(aim_session_t *sess, aim_frame_t *fr)
    302 {
    303         aim_bstream_t hbs;
    304         guint8 *hbs_raw;
    305         int hbslen;
    306         int err = 0;
    307        
    308         hbslen = 8 + fr->hdr.oft.hdr2len;
    309         if (!(hbs_raw = g_malloc(hbslen)))
    310                 return -1;
    311 
    312         aim_bstream_init(&hbs, hbs_raw, hbslen);
    313 
    314         aimbs_putraw(&hbs, fr->hdr.oft.magic, 4);
    315         aimbs_put16(&hbs, fr->hdr.oft.hdr2len + 8);
    316         aimbs_put16(&hbs, fr->hdr.oft.type);
    317         aimbs_putraw(&hbs, fr->hdr.oft.hdr2, fr->hdr.oft.hdr2len);
    318 
    319         aim_bstream_rewind(&hbs);
    320        
    321        
    322         if (aim_bstream_send(&hbs, fr->conn, hbslen) != hbslen) {
    323 
    324                 err = -errno;
    325                
    326         } else if (aim_bstream_curpos(&fr->data)) {
    327                 int len;
    328 
    329                 len = aim_bstream_curpos(&fr->data);
    330                 aim_bstream_rewind(&fr->data);
    331                
    332                 if (aim_bstream_send(&fr->data, fr->conn, len) != len)
    333                         err = -errno;
    334         }
    335 
    336         g_free(hbs_raw); /* XXX aim_bstream_free */
    337 
    338         fr->handled = 1;
    339         fr->conn->lastactivity = time(NULL);
    340 
    341 
    342         return err;
    343 
    344 
    345 }
    346 
    347267int aim_tx_sendframe(aim_session_t *sess, aim_frame_t *fr)
    348268{
    349269        if (fr->hdrtype == AIM_FRAMETYPE_FLAP)
    350270                return sendframe_flap(sess, fr);
    351         else if (fr->hdrtype == AIM_FRAMETYPE_OFT)
    352                 return sendframe_oft(sess, fr);
    353271        return -1;
    354272}
Note: See TracChangeset for help on using the changeset viewer.