📄 oscar.c
字号:
&info, key); purple_connection_update_progress(gc, _("Password sent"), 2, OSCAR_CONNECT_STEPS); ck[2] = 0x6c; return 1;}static intpurple_handle_redirect(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...){ PurpleConnection *gc = od->gc; PurpleAccount *account = purple_connection_get_account(gc); char *host, *separator; int port; FlapConnection *newconn; va_list ap; struct aim_redirect_data *redir; va_start(ap, fr); redir = va_arg(ap, struct aim_redirect_data *); va_end(ap); port = purple_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT); separator = strchr(redir->ip, ':'); if (separator != NULL) { host = g_strndup(redir->ip, separator - redir->ip); port = atoi(separator + 1); } else host = g_strdup(redir->ip); purple_debug_info("oscar", "Connecting to FLAP server %s:%d of type 0x%04hx\n", host, port, redir->group); newconn = flap_connection_new(od, redir->group); newconn->cookielen = redir->cookielen; newconn->cookie = g_memdup(redir->cookie, redir->cookielen); if (newconn->type == SNAC_FAMILY_CHAT) { struct chat_connection *cc; cc = g_new0(struct chat_connection, 1); cc->conn = newconn; cc->gc = gc; cc->name = g_strdup(redir->chat.room); cc->exchange = redir->chat.exchange; cc->instance = redir->chat.instance; cc->show = extract_name(redir->chat.room); newconn->new_conn_data = cc; purple_debug_info("oscar", "Connecting to chat room %s exchange %hu\n", cc->name, cc->exchange); } newconn->connect_data = purple_proxy_connect(NULL, account, host, port, connection_established_cb, newconn); if (newconn->connect_data == NULL) { flap_connection_schedule_destroy(newconn, OSCAR_DISCONNECT_COULD_NOT_CONNECT, _("Unable to initialize connection")); purple_debug_error("oscar", "Unable to connect to FLAP server " "of type 0x%04hx\n", redir->group); } g_free(host); return 1;}static int purple_parse_oncoming(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...){ PurpleConnection *gc; PurpleAccount *account; PurplePresence *presence; struct buddyinfo *bi; time_t time_idle = 0, signon = 0; int type = 0; gboolean buddy_is_away = FALSE; const char *status_id; gboolean have_status_message = FALSE; char *message = NULL; va_list ap; aim_userinfo_t *info; gc = od->gc; account = purple_connection_get_account(gc); presence = purple_account_get_presence(account); va_start(ap, fr); info = va_arg(ap, aim_userinfo_t *); va_end(ap); g_return_val_if_fail(info != NULL, 1); g_return_val_if_fail(info->sn != NULL, 1); if (info->present & AIM_USERINFO_PRESENT_FLAGS) { if (info->flags & AIM_FLAG_AWAY) buddy_is_away = TRUE; } if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { type = info->icqinfo.status; if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { buddy_is_away = TRUE; } } if (aim_sn_is_icq(info->sn)) { if (type & AIM_ICQ_STATE_CHAT) status_id = OSCAR_STATUS_ID_FREE4CHAT; else if (type & AIM_ICQ_STATE_DND) status_id = OSCAR_STATUS_ID_DND; else if (type & AIM_ICQ_STATE_OUT) status_id = OSCAR_STATUS_ID_NA; else if (type & AIM_ICQ_STATE_BUSY) status_id = OSCAR_STATUS_ID_OCCUPIED; else if (type & AIM_ICQ_STATE_AWAY) status_id = OSCAR_STATUS_ID_AWAY; else if (type & AIM_ICQ_STATE_INVISIBLE) status_id = OSCAR_STATUS_ID_INVISIBLE; else status_id = OSCAR_STATUS_ID_AVAILABLE; } else { if (buddy_is_away) status_id = OSCAR_STATUS_ID_AWAY; else status_id = OSCAR_STATUS_ID_AVAILABLE; } /* * Handle the available message. If info->status is NULL then the user * may or may not have an available message, so don't do anything. If * info->status is set to the empty string, then the user's client DOES * support available messages and the user DOES NOT have one set. * Otherwise info->status contains the available message. */ if (info->status != NULL) { have_status_message = TRUE; if (info->status[0] != '\0') message = oscar_encoding_to_utf8(account, info->status_encoding, info->status, info->status_len); } if (info->flags & AIM_FLAG_WIRELESS) { purple_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_MOBILE, NULL); } else { purple_prpl_got_user_status_deactive(account, info->sn, OSCAR_STATUS_ID_MOBILE); } if (have_status_message) { if ((status_id == OSCAR_STATUS_ID_AVAILABLE) && (info->itmsurl != NULL)) { char *itmsurl; itmsurl = oscar_encoding_to_utf8(account, info->itmsurl_encoding, info->itmsurl, info->itmsurl_len); purple_prpl_got_user_status(account, info->sn, status_id, "message", message, "itmsurl", itmsurl, NULL); g_free(itmsurl); } else { purple_prpl_got_user_status(account, info->sn, status_id, "message", message, NULL); } g_free(message); } else { PurpleBuddy *b = purple_find_buddy(account, info->sn); PurpleStatus *status = NULL; const char *active_status_id = NULL; if (b != NULL) { status = purple_presence_get_active_status(purple_buddy_get_presence(b)); active_status_id = purple_status_get_id(status); } if (!active_status_id || strcmp(active_status_id, status_id)) purple_prpl_got_user_status(account, info->sn, status_id, NULL); } /* Login time stuff */ if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) signon = info->onlinesince; else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) signon = time(NULL) - info->sessionlen; if (!aim_sncmp(purple_account_get_username(account), info->sn)) { purple_connection_set_display_name(gc, info->sn); } purple_prpl_got_user_login_time(account, info->sn, signon); /* Idle time stuff */ /* info->idletime is the number of minutes that this user has been idle */ if (info->present & AIM_USERINFO_PRESENT_IDLE) time_idle = time(NULL) - info->idletime * 60; if (time_idle > 0) purple_prpl_got_user_idle(account, info->sn, TRUE, time_idle); else purple_prpl_got_user_idle(account, info->sn, FALSE, 0); /* Server stored icon stuff */ bi = g_hash_table_lookup(od->buddyinfo, purple_normalize(account, info->sn)); if (!bi) { bi = g_new0(struct buddyinfo, 1); g_hash_table_insert(od->buddyinfo, g_strdup(purple_normalize(account, info->sn)), bi); } bi->typingnot = FALSE; bi->ico_informed = FALSE; bi->ipaddr = info->icqinfo.ipaddr; if (info->iconcsumlen) { const char *saved_b16 = NULL; char *b16 = NULL; PurpleBuddy *b = NULL; b16 = purple_base16_encode(info->iconcsum, info->iconcsumlen); b = purple_find_buddy(account, info->sn); if (b != NULL) saved_b16 = purple_buddy_icons_get_checksum_for_user(b); if (!b16 || !saved_b16 || strcmp(b16, saved_b16)) { GSList *cur = od->requesticon; while (cur && aim_sncmp((char *)cur->data, info->sn)) cur = cur->next; if (!cur) { od->requesticon = g_slist_append(od->requesticon, g_strdup(purple_normalize(account, info->sn))); if (od->icontimer == 0) od->icontimer = purple_timeout_add(500, purple_icon_timerfunc, gc); } } g_free(b16); } return 1;}static void purple_check_comment(OscarData *od, const char *str) { if ((str == NULL) || strcmp(str, (const char *)ck)) aim_locate_setcaps(od, purple_caps); else aim_locate_setcaps(od, purple_caps | OSCAR_CAPABILITY_SECUREIM);}static int purple_parse_offgoing(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { PurpleConnection *gc = od->gc; PurpleAccount *account = purple_connection_get_account(gc); va_list ap; aim_userinfo_t *info; va_start(ap, fr); info = va_arg(ap, aim_userinfo_t *); va_end(ap); purple_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_OFFLINE, NULL); purple_prpl_got_user_status_deactive(account, info->sn, OSCAR_STATUS_ID_MOBILE); g_hash_table_remove(od->buddyinfo, purple_normalize(gc->account, info->sn)); return 1;}static int incomingim_chan1(OscarData *od, FlapConnection *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { PurpleConnection *gc = od->gc; PurpleAccount *account = purple_connection_get_account(gc); PurpleMessageFlags flags = 0; struct buddyinfo *bi; PurpleStoredImage *img; GString *message; gchar *tmp; aim_mpmsg_section_t *curpart; const char *start, *end; GData *attribs; purple_debug_misc("oscar", "Received IM from %s with %d parts\n", userinfo->sn, args->mpmsg.numparts); if (args->mpmsg.numparts == 0) return 1; bi = g_hash_table_lookup(od->buddyinfo, purple_normalize(account, userinfo->sn)); if (!bi) { bi = g_new0(struct buddyinfo, 1); g_hash_table_insert(od->buddyinfo, g_strdup(purple_normalize(account, userinfo->sn)), bi); } if (args->icbmflags & AIM_IMFLAGS_AWAY) flags |= PURPLE_MESSAGE_AUTO_RESP; if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) bi->typingnot = TRUE; else bi->typingnot = FALSE; if ((args->icbmflags & AIM_IMFLAGS_HASICON) && (args->iconlen) && (args->iconsum) && (args->iconstamp)) { purple_debug_misc("oscar", "%s has an icon\n", userinfo->sn); if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { bi->ico_need = TRUE; bi->ico_len = args->iconlen; bi->ico_csum = args->iconsum; bi->ico_time = args->iconstamp; } } img = purple_buddy_icons_find_account_icon(account); if ((img != NULL) && (args->icbmflags & AIM_IMFLAGS_BUDDYREQ) && !bi->ico_sent && bi->ico_informed) { gconstpointer data = purple_imgstore_get_data(img); size_t len = purple_imgstore_get_size(img); purple_debug_info("oscar", "Sending buddy icon to %s (%d bytes)\n", userinfo->sn, len); aim_im_sendch2_icon(od, userinfo->sn, data, len, purple_buddy_icons_get_account_icon_timestamp(account), aimutil_iconsum(data, len)); } purple_imgstore_unref(img); message = g_string_new(""); curpart = args->mpmsg.parts; while (curpart != NULL) { tmp = purple_plugin_oscar_decode_im_part(account, userinfo->sn, curpart->charset, curpart->charsubset, curpart->data, curpart->datalen); if (tmp != NULL) { g_string_append(message, tmp); g_free(tmp); } curpart = curpart->next; } tmp = g_string_free(message, FALSE); /* * If the message is from an ICQ user and to an ICQ user then escape any HTML, * because HTML is not sent over ICQ as a means to format a message. * So any HTML we receive is intended to be displayed. Also, \r\n must be * replaced with <br> * * Note: There *may* be some clients which send messages as HTML formatted - * they need to be special-cased somehow. */ if (aim_sn_is_icq(purple_account_get_username(account)) && aim_sn_is_icq(userinfo->sn)) { /* being recevied by ICQ from ICQ - escape HTML so it is displayed as sent */ gchar *tmp2 = g_markup_escape_text(tmp, -1); g_free(tmp); tmp = tmp2; tmp2 = purple_strreplace(tmp, "\r\n", "<br>"); g_free(tmp); tmp = tmp2; } /* * Convert iChat color tags to normal font tags. */ if (purple_markup_find_tag("body", tmp, &start, &end, &attribs)) { const char *ichattextcolor, *ichatballooncolor; ichattextcolor = g_datalist_get_data(&attribs, "ichattextcolor"); if (ichattextcolor != NULL) { gchar *tmp2; tmp2 = g_strdup_printf("<font color=\"%s\">%s</font>", ichattextcolor, tmp); g_free(tmp); tmp = tmp2; } ichatballooncolor = g_datalist_get_data(&attribs, "ichatballooncolor"); if (ichatballooncolor != NULL) { gchar *tmp2; tmp2 = g_strdup_printf("<font back=\"%s\">%s</font>", ichatballooncolor, tmp); g_free(tmp); tmp = tmp2; } g_datalist_clear(&attribs); } serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL)); g_free(tmp); return 1;}static intincomingim_chan2(OscarData *od, FlapConnection *conn, aim_userinfo_t *userinfo, IcbmArgsCh2 *args){ PurpleConnection *gc; PurpleAccount *account; char *message = NULL; g_return_val_if_fail(od != NULL, 0); g_return_val_if_fail(od->gc != NULL, 0); gc = od->gc; account = purple_connection_get_account(gc); od = gc->proto_data; if (args == NULL) return 0; purple_debug_misc("oscar", "Incoming rendezvous message of type %u, " "user %s, status %hu\n", args->type, userinfo->sn, args->status); if (args->msg != NULL) { if (args->encoding != NULL) { char *encoding = NULL; encoding = oscar_encoding_extract(args->encoding);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -