Changeset 6e14204 for skype/skype.c


Ignore:
Timestamp:
2009-01-07T01:20:57Z (15 years ago)
Author:
Miklos Vajna <vmiklos@…>
Branches:
master
Children:
9f2f25f
Parents:
8bbe52a
Message:

introduce skype_parse_user() and skype_parse_chatmessage()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • skype/skype.c

    r8bbe52a r6e14204  
    287287}
    288288
     289static void skype_parse_user(struct im_connection *ic, char *line)
     290{
     291        int flags = 0;
     292        char *ptr;
     293        struct skype_data *sd = ic->proto_data;
     294        char *user = strchr(line, ' ');
     295        char *status = strrchr(line, ' ');
     296
     297        status++;
     298        ptr = strchr(++user, ' ');
     299        if (!ptr)
     300                return;
     301        *ptr = '\0';
     302        ptr++;
     303        if (!strncmp(ptr, "ONLINESTATUS ", 13) &&
     304                        strcmp(user, sd->username) != 0
     305                        && strcmp(user, "echo123") != 0) {
     306                ptr = g_strdup_printf("%s@skype.com", user);
     307                imcb_add_buddy(ic, ptr, NULL);
     308                if (strcmp(status, "OFFLINE") && (strcmp(status, "SKYPEOUT") || !set_getbool(&ic->acc->set, "skypeout_offline")))
     309                        flags |= OPT_LOGGED_IN;
     310                if (strcmp(status, "ONLINE") != 0 && strcmp(status, "SKYPEME") != 0)
     311                        flags |= OPT_AWAY;
     312                imcb_buddy_status(ic, ptr, flags, NULL, NULL);
     313                g_free(ptr);
     314        } else if (!strncmp(ptr, "RECEIVEDAUTHREQUEST ", 20)) {
     315                char *message = ptr + 20;
     316                if (strlen(message))
     317                        skype_buddy_ask(ic, user, message);
     318        } else if (!strncmp(ptr, "BUDDYSTATUS ", 12)) {
     319                char *st = ptr + 12;
     320                if (!strcmp(st, "3")) {
     321                        char *buf = g_strdup_printf("%s@skype.com", user);
     322                        imcb_add_buddy(ic, buf, NULL);
     323                        g_free(buf);
     324                }
     325        } else if (!strncmp(ptr, "FULLNAME ", 9))
     326                sd->info_fullname = g_strdup_printf("%s", ptr + 9);
     327        else if (!strncmp(ptr, "PHONE_HOME ", 11))
     328                sd->info_phonehome = g_strdup_printf("%s", ptr + 11);
     329        else if (!strncmp(ptr, "PHONE_OFFICE ", 13))
     330                sd->info_phoneoffice = g_strdup_printf("%s", ptr + 13);
     331        else if (!strncmp(ptr, "PHONE_MOBILE ", 13))
     332                sd->info_phonemobile = g_strdup_printf("%s", ptr + 13);
     333        else if (!strncmp(ptr, "NROF_AUTHED_BUDDIES ", 20))
     334                sd->info_nrbuddies = g_strdup_printf("%s", ptr + 20);
     335        else if (!strncmp(ptr, "TIMEZONE ", 9))
     336                sd->info_tz = g_strdup_printf("%s", ptr + 9);
     337        else if (!strncmp(ptr, "LASTONLINETIMESTAMP ", 20))
     338                sd->info_seen = g_strdup_printf("%s", ptr + 20);
     339        else if (!strncmp(ptr, "BIRTHDAY ", 9))
     340                sd->info_birthday = g_strdup_printf("%s", ptr + 9);
     341        else if (!strncmp(ptr, "SEX ", 4))
     342                sd->info_sex = g_strdup_printf("%s", ptr + 4);
     343        else if (!strncmp(ptr, "LANGUAGE ", 9))
     344                sd->info_language = g_strdup_printf("%s", ptr + 9);
     345        else if (!strncmp(ptr, "COUNTRY ", 8))
     346                sd->info_country = g_strdup_printf("%s", ptr + 8);
     347        else if (!strncmp(ptr, "PROVINCE ", 9))
     348                sd->info_province = g_strdup_printf("%s", ptr + 9);
     349        else if (!strncmp(ptr, "CITY ", 5))
     350                sd->info_city = g_strdup_printf("%s", ptr + 5);
     351        else if (!strncmp(ptr, "HOMEPAGE ", 9))
     352                sd->info_homepage = g_strdup_printf("%s", ptr + 9);
     353        else if (!strncmp(ptr, "ABOUT ", 6)) {
     354                sd->info_about = g_strdup_printf("%s", ptr + 6);
     355
     356                GString *st = g_string_new("Contact Information\n");
     357                g_string_append_printf(st, "Skype Name: %s\n", user);
     358                if (sd->info_fullname) {
     359                        if (strlen(sd->info_fullname))
     360                                g_string_append_printf(st, "Full Name: %s\n", sd->info_fullname);
     361                        g_free(sd->info_fullname);
     362                }
     363                if (sd->info_phonehome) {
     364                        if (strlen(sd->info_phonehome))
     365                                g_string_append_printf(st, "Home Phone: %s\n", sd->info_phonehome);
     366                        g_free(sd->info_phonehome);
     367                }
     368                if (sd->info_phoneoffice) {
     369                        if (strlen(sd->info_phoneoffice))
     370                                g_string_append_printf(st, "Office Phone: %s\n", sd->info_phoneoffice);
     371                        g_free(sd->info_phoneoffice);
     372                }
     373                if (sd->info_phonemobile) {
     374                        if (strlen(sd->info_phonemobile))
     375                                g_string_append_printf(st, "Mobile Phone: %s\n", sd->info_phonemobile);
     376                        g_free(sd->info_phonemobile);
     377                }
     378                g_string_append_printf(st, "Personal Information\n");
     379                if (sd->info_nrbuddies) {
     380                        if (strlen(sd->info_nrbuddies))
     381                                g_string_append_printf(st, "Contacts: %s\n", sd->info_nrbuddies);
     382                        g_free(sd->info_nrbuddies);
     383                }
     384                if (sd->info_tz) {
     385                        if (strlen(sd->info_tz)) {
     386                                char ib[256];
     387                                time_t t = time(NULL);
     388                                t += atoi(sd->info_tz)-(60*60*24);
     389                                struct tm *gt = gmtime(&t);
     390                                strftime(ib, 256, "%H:%M:%S", gt);
     391                                g_string_append_printf(st, "Local Time: %s\n", ib);
     392                        }
     393                        g_free(sd->info_tz);
     394                }
     395                if (sd->info_seen) {
     396                        if (strlen(sd->info_seen)) {
     397                                char ib[256];
     398                                time_t it = atoi(sd->info_seen);
     399                                struct tm *tm = localtime(&it);
     400                                strftime(ib, 256, ("%Y. %m. %d. %H:%M"), tm);
     401                                g_string_append_printf(st, "Last Seen: %s\n", ib);
     402                        }
     403                        g_free(sd->info_seen);
     404                }
     405                if (sd->info_birthday) {
     406                        if (strlen(sd->info_birthday) && strcmp(sd->info_birthday, "0")) {
     407                                char ib[256];
     408                                struct tm tm;
     409                                strptime(sd->info_birthday, "%Y%m%d", &tm);
     410                                strftime(ib, 256, "%B %d, %Y", &tm);
     411                                g_string_append_printf(st, "Birthday: %s\n", ib);
     412
     413                                strftime(ib, 256, "%Y", &tm);
     414                                int year = atoi(ib);
     415                                time_t t = time(NULL);
     416                                struct tm *lt = localtime(&t);
     417                                g_string_append_printf(st, "Age: %d\n", lt->tm_year+1900-year);
     418                        }
     419                        g_free(sd->info_birthday);
     420                }
     421                if (sd->info_sex) {
     422                        if (strlen(sd->info_sex)) {
     423                                char *iptr = sd->info_sex;
     424                                while (*iptr++)
     425                                        *iptr = tolower(*iptr);
     426                                g_string_append_printf(st, "Gender: %s\n", sd->info_sex);
     427                        }
     428                        g_free(sd->info_sex);
     429                }
     430                if (sd->info_language) {
     431                        if (strlen(sd->info_language)) {
     432                                char *iptr = strchr(sd->info_language, ' ');
     433                                if (iptr)
     434                                        iptr++;
     435                                else
     436                                        iptr = sd->info_language;
     437                                g_string_append_printf(st, "Language: %s\n", iptr);
     438                        }
     439                        g_free(sd->info_language);
     440                }
     441                if (sd->info_country) {
     442                        if (strlen(sd->info_country)) {
     443                                char *iptr = strchr(sd->info_country, ' ');
     444                                if (iptr)
     445                                        iptr++;
     446                                else
     447                                        iptr = sd->info_country;
     448                                g_string_append_printf(st, "Country: %s\n", iptr);
     449                        }
     450                        g_free(sd->info_country);
     451                }
     452                if (sd->info_province) {
     453                        if (strlen(sd->info_province))
     454                                g_string_append_printf(st, "Region: %s\n", sd->info_province);
     455                        g_free(sd->info_province);
     456                }
     457                if (sd->info_city) {
     458                        if (strlen(sd->info_city))
     459                                g_string_append_printf(st, "City: %s\n", sd->info_city);
     460                        g_free(sd->info_city);
     461                }
     462                if (sd->info_homepage) {
     463                        if (strlen(sd->info_homepage))
     464                                g_string_append_printf(st, "Homepage: %s\n", sd->info_homepage);
     465                        g_free(sd->info_homepage);
     466                }
     467                if (sd->info_about) {
     468                        if (strlen(sd->info_about))
     469                                g_string_append_printf(st, "%s\n", sd->info_about);
     470                        g_free(sd->info_about);
     471                }
     472                imcb_log(ic, "%s", st->str);
     473                g_string_free(st, TRUE);
     474        }
     475}
     476
     477static void skype_parse_chatmessage(struct im_connection *ic, char *line)
     478{
     479        struct skype_data *sd = ic->proto_data;
     480        char buf[1024];
     481        char *id = strchr(line, ' ');
     482
     483        if (++id) {
     484                char *info = strchr(id, ' ');
     485
     486                if (!info)
     487                        return;
     488                *info = '\0';
     489                info++;
     490                if (!strcmp(info, "STATUS RECEIVED")) {
     491                        /* New message ID:
     492                         * (1) Request its from field
     493                         * (2) Request its body
     494                         * (3) Request its type
     495                         * (4) Query chatname
     496                         */
     497                        g_snprintf(buf, 1024, "GET CHATMESSAGE %s FROM_HANDLE\n", id);
     498                        skype_write(ic, buf);
     499                        g_snprintf(buf, 1024, "GET CHATMESSAGE %s BODY\n", id);
     500                        skype_write(ic, buf);
     501                        g_snprintf(buf, 1024, "GET CHATMESSAGE %s TYPE\n", id);
     502                        skype_write(ic, buf);
     503                        g_snprintf(buf, 1024, "GET CHATMESSAGE %s CHATNAME\n", id);
     504                        skype_write(ic, buf);
     505                } else if (!strncmp(info, "FROM_HANDLE ", 12)) {
     506                        info += 12;
     507                        /* New from field value. Store
     508                         * it, then we can later use it
     509                         * when we got the message's
     510                         * body. */
     511                        g_free(sd->handle);
     512                        sd->handle = g_strdup_printf("%s@skype.com", info);
     513                } else if (!strncmp(info, "EDITED_BY ", 10)) {
     514                        info += 10;
     515                        /* This is the same as
     516                         * FROM_HANDLE, except that we
     517                         * never request these lines
     518                         * from Skype, we just get
     519                         * them. */
     520                        g_free(sd->handle);
     521                        sd->handle = g_strdup_printf("%s@skype.com", info);
     522                } else if (!strncmp(info, "BODY ", 5)) {
     523                        info += 5;
     524                        sd->body = g_list_append(sd->body, g_strdup(info));
     525                }       else if (!strncmp(info, "TYPE ", 5)) {
     526                        info += 5;
     527                        g_free(sd->type);
     528                        sd->type = g_strdup(info);
     529                } else if (!strncmp(info, "CHATNAME ", 9)) {
     530                        info += 9;
     531                        if (sd->handle && sd->body && sd->type) {
     532                                struct groupchat *gc = skype_chat_by_name(ic, info);
     533                                int i;
     534                                for (i = 0; i < g_list_length(sd->body); i++) {
     535                                        char *body = g_list_nth_data(sd->body, i);
     536                                        if (!strcmp(sd->type, "SAID") || !strcmp(sd->type, "EMOTED")) {
     537                                                if (!strcmp(sd->type, "SAID"))
     538                                                        g_snprintf(buf, 1024, "%s", body);
     539                                                else
     540                                                        g_snprintf(buf, 1024, "/me %s", body);
     541                                                if (!gc)
     542                                                        /* Private message */
     543                                                        imcb_buddy_msg(ic, sd->handle, buf, 0, 0);
     544                                                else
     545                                                        /* Groupchat message */
     546                                                        imcb_chat_msg(gc, sd->handle, buf, 0, 0);
     547                                        } else if (!strcmp(sd->type, "SETTOPIC")) {
     548                                                if (gc)
     549                                                        imcb_chat_topic(gc, sd->handle, body, 0);
     550                                        } else if (!strcmp(sd->type, "LEFT")) {
     551                                                if (gc)
     552                                                        imcb_chat_remove_buddy(gc, sd->handle, NULL);
     553                                        }
     554                                }
     555                                g_list_free(sd->body);
     556                                sd->body = NULL;
     557                        }
     558                }
     559        }
     560}
     561
    289562static gboolean skype_read_callback(gpointer data, gint fd,
    290563                                    b_input_condition cond)
     
    294567        char buf[1024];
    295568        int st;
    296         char **lines, **lineptr, *line, *ptr;
     569        char **lines, **lineptr, *line;
    297570
    298571        if (!sd || sd->fd == -1)
     
    313586                                skype_parse_users(ic, line);
    314587                        else if (!strncmp(line, "USER ", 5)) {
    315                                 int flags = 0;
    316                                 char *status = strrchr(line, ' ');
    317                                 char *user = strchr(line, ' ');
    318                                 status++;
    319                                 ptr = strchr(++user, ' ');
    320                                 *ptr = '\0';
    321                                 ptr++;
    322                                 if (!strncmp(ptr, "ONLINESTATUS ", 13) &&
    323                                                 strcmp(user, sd->username) != 0
    324                                                 && strcmp(user, "echo123") != 0) {
    325                                         ptr = g_strdup_printf("%s@skype.com", user);
    326                                         imcb_add_buddy(ic, ptr, NULL);
    327                                         if (strcmp(status, "OFFLINE") && (strcmp(status, "SKYPEOUT") || !set_getbool(&ic->acc->set, "skypeout_offline")))
    328                                                 flags |= OPT_LOGGED_IN;
    329                                         if (strcmp(status, "ONLINE") != 0 && strcmp(status, "SKYPEME") != 0)
    330                                                 flags |= OPT_AWAY;
    331                                         imcb_buddy_status(ic, ptr, flags, NULL, NULL);
    332                                         g_free(ptr);
    333                                 } else if (!strncmp(ptr, "RECEIVEDAUTHREQUEST ", 20)) {
    334                                         char *message = ptr + 20;
    335                                         if (strlen(message))
    336                                                 skype_buddy_ask(ic, user, message);
    337                                 } else if (!strncmp(ptr, "BUDDYSTATUS ", 12)) {
    338                                         char *st = ptr + 12;
    339                                         if (!strcmp(st, "3")) {
    340                                                 char *buf = g_strdup_printf("%s@skype.com", user);
    341                                                 imcb_add_buddy(ic, buf, NULL);
    342                                                 g_free(buf);
    343                                         }
    344                                 } else if (!strncmp(ptr, "FULLNAME ", 9))
    345                                         sd->info_fullname = g_strdup_printf("%s", ptr + 9);
    346                                 else if (!strncmp(ptr, "PHONE_HOME ", 11))
    347                                         sd->info_phonehome = g_strdup_printf("%s", ptr + 11);
    348                                 else if (!strncmp(ptr, "PHONE_OFFICE ", 13))
    349                                         sd->info_phoneoffice = g_strdup_printf("%s", ptr + 13);
    350                                 else if (!strncmp(ptr, "PHONE_MOBILE ", 13))
    351                                         sd->info_phonemobile = g_strdup_printf("%s", ptr + 13);
    352                                 else if (!strncmp(ptr, "NROF_AUTHED_BUDDIES ", 20))
    353                                         sd->info_nrbuddies = g_strdup_printf("%s", ptr + 20);
    354                                 else if (!strncmp(ptr, "TIMEZONE ", 9))
    355                                         sd->info_tz = g_strdup_printf("%s", ptr + 9);
    356                                 else if (!strncmp(ptr, "LASTONLINETIMESTAMP ", 20))
    357                                         sd->info_seen = g_strdup_printf("%s", ptr + 20);
    358                                 else if (!strncmp(ptr, "BIRTHDAY ", 9))
    359                                         sd->info_birthday = g_strdup_printf("%s", ptr + 9);
    360                                 else if (!strncmp(ptr, "SEX ", 4))
    361                                         sd->info_sex = g_strdup_printf("%s", ptr + 4);
    362                                 else if (!strncmp(ptr, "LANGUAGE ", 9))
    363                                         sd->info_language = g_strdup_printf("%s", ptr + 9);
    364                                 else if (!strncmp(ptr, "COUNTRY ", 8))
    365                                         sd->info_country = g_strdup_printf("%s", ptr + 8);
    366                                 else if (!strncmp(ptr, "PROVINCE ", 9))
    367                                         sd->info_province = g_strdup_printf("%s", ptr + 9);
    368                                 else if (!strncmp(ptr, "CITY ", 5))
    369                                         sd->info_city = g_strdup_printf("%s", ptr + 5);
    370                                 else if (!strncmp(ptr, "HOMEPAGE ", 9))
    371                                         sd->info_homepage = g_strdup_printf("%s", ptr + 9);
    372                                 else if (!strncmp(ptr, "ABOUT ", 6)) {
    373                                         sd->info_about = g_strdup_printf("%s", ptr + 6);
    374 
    375                                         GString *st = g_string_new("Contact Information\n");
    376                                         g_string_append_printf(st, "Skype Name: %s\n", user);
    377                                         if (sd->info_fullname) {
    378                                                 if (strlen(sd->info_fullname))
    379                                                         g_string_append_printf(st, "Full Name: %s\n", sd->info_fullname);
    380                                                 g_free(sd->info_fullname);
    381                                         }
    382                                         if (sd->info_phonehome) {
    383                                                 if (strlen(sd->info_phonehome))
    384                                                         g_string_append_printf(st, "Home Phone: %s\n", sd->info_phonehome);
    385                                                 g_free(sd->info_phonehome);
    386                                         }
    387                                         if (sd->info_phoneoffice) {
    388                                                 if (strlen(sd->info_phoneoffice))
    389                                                         g_string_append_printf(st, "Office Phone: %s\n", sd->info_phoneoffice);
    390                                                 g_free(sd->info_phoneoffice);
    391                                         }
    392                                         if (sd->info_phonemobile) {
    393                                                 if (strlen(sd->info_phonemobile))
    394                                                         g_string_append_printf(st, "Mobile Phone: %s\n", sd->info_phonemobile);
    395                                                 g_free(sd->info_phonemobile);
    396                                         }
    397                                         g_string_append_printf(st, "Personal Information\n");
    398                                         if (sd->info_nrbuddies) {
    399                                                 if (strlen(sd->info_nrbuddies))
    400                                                         g_string_append_printf(st, "Contacts: %s\n", sd->info_nrbuddies);
    401                                                 g_free(sd->info_nrbuddies);
    402                                         }
    403                                         if (sd->info_tz) {
    404                                                 if (strlen(sd->info_tz)) {
    405                                                         char ib[256];
    406                                                         time_t t = time(NULL);
    407                                                         t += atoi(sd->info_tz)-(60*60*24);
    408                                                         struct tm *gt = gmtime(&t);
    409                                                         strftime(ib, 256, "%H:%M:%S", gt);
    410                                                         g_string_append_printf(st, "Local Time: %s\n", ib);
    411                                                 }
    412                                                 g_free(sd->info_tz);
    413                                         }
    414                                         if (sd->info_seen) {
    415                                                 if (strlen(sd->info_seen)) {
    416                                                         char ib[256];
    417                                                         time_t it = atoi(sd->info_seen);
    418                                                         struct tm *tm = localtime(&it);
    419                                                         strftime(ib, 256, ("%Y. %m. %d. %H:%M"), tm);
    420                                                         g_string_append_printf(st, "Last Seen: %s\n", ib);
    421                                                 }
    422                                                 g_free(sd->info_seen);
    423                                         }
    424                                         if (sd->info_birthday) {
    425                                                 if (strlen(sd->info_birthday) && strcmp(sd->info_birthday, "0")) {
    426                                                         char ib[256];
    427                                                         struct tm tm;
    428                                                         strptime(sd->info_birthday, "%Y%m%d", &tm);
    429                                                         strftime(ib, 256, "%B %d, %Y", &tm);
    430                                                         g_string_append_printf(st, "Birthday: %s\n", ib);
    431 
    432                                                         strftime(ib, 256, "%Y", &tm);
    433                                                         int year = atoi(ib);
    434                                                         time_t t = time(NULL);
    435                                                         struct tm *lt = localtime(&t);
    436                                                         g_string_append_printf(st, "Age: %d\n", lt->tm_year+1900-year);
    437                                                 }
    438                                                 g_free(sd->info_birthday);
    439                                         }
    440                                         if (sd->info_sex) {
    441                                                 if (strlen(sd->info_sex)) {
    442                                                         char *iptr = sd->info_sex;
    443                                                         while (*iptr++)
    444                                                                 *iptr = tolower(*iptr);
    445                                                         g_string_append_printf(st, "Gender: %s\n", sd->info_sex);
    446                                                 }
    447                                                 g_free(sd->info_sex);
    448                                         }
    449                                         if (sd->info_language) {
    450                                                 if (strlen(sd->info_language)) {
    451                                                         char *iptr = strchr(sd->info_language, ' ');
    452                                                         if (iptr)
    453                                                                 iptr++;
    454                                                         else
    455                                                                 iptr = sd->info_language;
    456                                                         g_string_append_printf(st, "Language: %s\n", iptr);
    457                                                 }
    458                                                 g_free(sd->info_language);
    459                                         }
    460                                         if (sd->info_country) {
    461                                                 if (strlen(sd->info_country)) {
    462                                                         char *iptr = strchr(sd->info_country, ' ');
    463                                                         if (iptr)
    464                                                                 iptr++;
    465                                                         else
    466                                                                 iptr = sd->info_country;
    467                                                         g_string_append_printf(st, "Country: %s\n", iptr);
    468                                                 }
    469                                                 g_free(sd->info_country);
    470                                         }
    471                                         if (sd->info_province) {
    472                                                 if (strlen(sd->info_province))
    473                                                         g_string_append_printf(st, "Region: %s\n", sd->info_province);
    474                                                 g_free(sd->info_province);
    475                                         }
    476                                         if (sd->info_city) {
    477                                                 if (strlen(sd->info_city))
    478                                                         g_string_append_printf(st, "City: %s\n", sd->info_city);
    479                                                 g_free(sd->info_city);
    480                                         }
    481                                         if (sd->info_homepage) {
    482                                                 if (strlen(sd->info_homepage))
    483                                                         g_string_append_printf(st, "Homepage: %s\n", sd->info_homepage);
    484                                                 g_free(sd->info_homepage);
    485                                         }
    486                                         if (sd->info_about) {
    487                                                 if (strlen(sd->info_about))
    488                                                         g_string_append_printf(st, "%s\n", sd->info_about);
    489                                                 g_free(sd->info_about);
    490                                         }
    491                                         imcb_log(ic, "%s", st->str);
    492                                         g_string_free(st, TRUE);
    493                                 }
     588                                skype_parse_user(ic, line);
    494589                        } else if (!strncmp(line, "CHATMESSAGE ", 12)) {
    495                                 char *id = strchr(line, ' ');
    496                                 if (++id) {
    497                                         char *info = strchr(id, ' ');
    498                                         *info = '\0';
    499                                         info++;
    500                                         if (!strcmp(info, "STATUS RECEIVED")) {
    501                                                 /* New message ID:
    502                                                  * (1) Request its from field
    503                                                  * (2) Request its body
    504                                                  * (3) Request its type
    505                                                  * (4) Query chatname
    506                                                  */
    507                                                 g_snprintf(buf, 1024, "GET CHATMESSAGE %s FROM_HANDLE\n", id);
    508                                                 skype_write(ic, buf);
    509                                                 g_snprintf(buf, 1024, "GET CHATMESSAGE %s BODY\n", id);
    510                                                 skype_write(ic, buf);
    511                                                 g_snprintf(buf, 1024, "GET CHATMESSAGE %s TYPE\n", id);
    512                                                 skype_write(ic, buf);
    513                                                 g_snprintf(buf, 1024, "GET CHATMESSAGE %s CHATNAME\n", id);
    514                                                 skype_write(ic, buf);
    515                                         } else if (!strncmp(info, "FROM_HANDLE ", 12)) {
    516                                                 info += 12;
    517                                                 /* New from field value. Store
    518                                                  * it, then we can later use it
    519                                                  * when we got the message's
    520                                                  * body. */
    521                                                 g_free(sd->handle);
    522                                                 sd->handle = g_strdup_printf("%s@skype.com", info);
    523                                         } else if (!strncmp(info, "EDITED_BY ", 10)) {
    524                                                 info += 10;
    525                                                 /* This is the same as
    526                                                  * FROM_HANDLE, except that we
    527                                                  * never request these lines
    528                                                  * from Skype, we just get
    529                                                  * them. */
    530                                                 g_free(sd->handle);
    531                                                 sd->handle = g_strdup_printf("%s@skype.com", info);
    532                                         } else if (!strncmp(info, "BODY ", 5)) {
    533                                                 info += 5;
    534                                                 sd->body = g_list_append(sd->body, g_strdup(info));
    535                                         }       else if (!strncmp(info, "TYPE ", 5)) {
    536                                                 info += 5;
    537                                                 g_free(sd->type);
    538                                                 sd->type = g_strdup(info);
    539                                         } else if (!strncmp(info, "CHATNAME ", 9)) {
    540                                                 info += 9;
    541                                                 if (sd->handle && sd->body && sd->type) {
    542                                                         struct groupchat *gc = skype_chat_by_name(ic, info);
    543                                                         int i;
    544                                                         for (i = 0; i < g_list_length(sd->body); i++) {
    545                                                                 char *body = g_list_nth_data(sd->body, i);
    546                                                                 if (!strcmp(sd->type, "SAID") || !strcmp(sd->type, "EMOTED")) {
    547                                                                         char *st;
    548                                                                         if (!strcmp(sd->type, "SAID"))
    549                                                                                 st = g_strdup(body);
    550                                                                         else
    551                                                                                 st = g_strdup_printf("/me %s", body);
    552                                                                         if (!gc)
    553                                                                                 /* Private message */
    554                                                                                 imcb_buddy_msg(ic, sd->handle, st, 0, 0);
    555                                                                         else
    556                                                                                 /* Groupchat message */
    557                                                                                 imcb_chat_msg(gc, sd->handle, st, 0, 0);
    558                                                                         g_free(st);
    559                                                                 } else if (!strcmp(sd->type, "SETTOPIC")) {
    560                                                                         if (gc)
    561                                                                                 imcb_chat_topic(gc, sd->handle, body, 0);
    562                                                                 } else if (!strcmp(sd->type, "LEFT")) {
    563                                                                         if (gc)
    564                                                                                 imcb_chat_remove_buddy(gc, sd->handle, NULL);
    565                                                                 }
    566                                                         }
    567                                                         g_list_free(sd->body);
    568                                                         sd->body = NULL;
    569                                                 }
    570                                         }
    571                                 }
     590                                skype_parse_chatmessage(ic, line);
    572591                        } else if (!strncmp(line, "CALL ", 5)) {
    573592                                char *id = strchr(line, ' ');
Note: See TracChangeset for help on using the changeset viewer.