亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sametime.c

?? Linux下的多協議即時通訊程序源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*  Meanwhile Protocol Plugin for Purple  Adds Lotus Sametime support to Purple using the Meanwhile library  Copyright (C) 2004 Christopher (siege) O'Brien <siege@preoccupied.net>  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation; either version 2 of the License, or (at  your option) any later version.  This program is distributed in the hope that it will be useful, but  WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program; if not, write to the Free Software  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,  USA.*//* system includes */#include <stdlib.h>#include <time.h>/* glib includes */#include <glib.h>#include <glib/ghash.h>#include <glib/glist.h>/* purple includes */#include "internal.h"#include "config.h"#include "account.h"#include "accountopt.h"#include "circbuffer.h"#include "conversation.h"#include "debug.h"#include "ft.h"#include "imgstore.h"#include "mime.h"#include "notify.h"#include "plugin.h"#include "privacy.h"#include "prpl.h"#include "request.h"#include "util.h"#include "version.h"/* meanwhile includes */#include <mw_cipher.h>#include <mw_common.h>#include <mw_error.h>#include <mw_service.h>#include <mw_session.h>#include <mw_srvc_aware.h>#include <mw_srvc_conf.h>#include <mw_srvc_ft.h>#include <mw_srvc_im.h>#include <mw_srvc_place.h>#include <mw_srvc_resolve.h>#include <mw_srvc_store.h>#include <mw_st_list.h>/* plugin includes */#include "sametime.h"/* considering that there's no display of this information for prpls,   I don't know why I even bother providing these. Oh valiant reader,   I do it all for you. *//* scratch that, I just added it to the prpl options panel */#define PLUGIN_ID        "prpl-meanwhile"#define PLUGIN_NAME      "Sametime"#define PLUGIN_SUMMARY   "Sametime Protocol Plugin"#define PLUGIN_DESC      "Open implementation of a Lotus Sametime client"#define PLUGIN_AUTHOR    "Christopher (siege) O'Brien <siege@preoccupied.net>"#define PLUGIN_HOMEPAGE  "http://meanwhile.sourceforge.net/"/* plugin preference names */#define MW_PRPL_OPT_BASE          "/plugins/prpl/meanwhile"#define MW_PRPL_OPT_BLIST_ACTION  MW_PRPL_OPT_BASE "/blist_action"#define MW_PRPL_OPT_PSYCHIC       MW_PRPL_OPT_BASE "/psychic"#define MW_PRPL_OPT_FORCE_LOGIN   MW_PRPL_OPT_BASE "/force_login"#define MW_PRPL_OPT_SAVE_DYNAMIC  MW_PRPL_OPT_BASE "/save_dynamic"/* stages of connecting-ness */#define MW_CONNECT_STEPS  11/* stages of conciousness */#define MW_STATE_OFFLINE      "offline"#define MW_STATE_ACTIVE       "active"#define MW_STATE_AWAY         "away"#define MW_STATE_BUSY         "dnd"#define MW_STATE_MESSAGE      "message"#define MW_STATE_ENLIGHTENED  "buddha"/* keys to get/set chat information */#define CHAT_KEY_CREATOR   "chat.creator"#define CHAT_KEY_NAME      "chat.name"#define CHAT_KEY_TOPIC     "chat.topic"#define CHAT_KEY_INVITE    "chat.invite"#define CHAT_KEY_IS_PLACE  "chat.is_place"/* key for associating a mwLoginType with a buddy */#define BUDDY_KEY_CLIENT  "meanwhile.client"/* store the remote alias so that we can re-create it easily */#define BUDDY_KEY_NAME    "meanwhile.shortname"/* enum mwSametimeUserType */#define BUDDY_KEY_TYPE    "meanwhile.type"/* key for the real group name for a meanwhile group */#define GROUP_KEY_NAME    "meanwhile.group"/* enum mwSametimeGroupType */#define GROUP_KEY_TYPE    "meanwhile.type"/* NAB group owning account */#define GROUP_KEY_OWNER   "meanwhile.account"/* key gtk blist uses to indicate a collapsed group */#define GROUP_KEY_COLLAPSED  "collapsed"/* verification replacement */#define mwSession_NO_SECRET  "meanwhile.no_secret"/* keys to get/set purple plugin information */#define MW_KEY_HOST        "server"#define MW_KEY_PORT        "port"#define MW_KEY_FORCE       "force_login"#define MW_KEY_FAKE_IT     "fake_client_id"#define MW_KEY_CLIENT      "client_id_val"#define MW_KEY_MAJOR       "client_major"#define MW_KEY_MINOR       "client_minor"/** number of seconds from the first blist change before a save to the    storage service occurs. */#define BLIST_SAVE_SECONDS  15/** the possible buddy list storage settings */enum blist_choice {  blist_choice_LOCAL = 1, /**< local only */  blist_choice_MERGE = 2, /**< merge from server */  blist_choice_STORE = 3, /**< merge from and save to server */  blist_choice_SYNCH = 4, /**< sync with server */};/** the default blist storage option */#define BLIST_CHOICE_DEFAULT  blist_choice_SYNCH/* testing for the above */#define BLIST_PREF_IS(n) (purple_prefs_get_int(MW_PRPL_OPT_BLIST_ACTION)==(n))#define BLIST_PREF_IS_LOCAL()  BLIST_PREF_IS(blist_choice_LOCAL)#define BLIST_PREF_IS_MERGE()  BLIST_PREF_IS(blist_choice_MERGE)#define BLIST_PREF_IS_STORE()  BLIST_PREF_IS(blist_choice_STORE)#define BLIST_PREF_IS_SYNCH()  BLIST_PREF_IS(blist_choice_SYNCH)/* debugging output */#define DEBUG_ERROR(a...)  purple_debug_error(G_LOG_DOMAIN, a)#define DEBUG_INFO(a...)   purple_debug_info(G_LOG_DOMAIN, a)#define DEBUG_MISC(a...)   purple_debug_misc(G_LOG_DOMAIN, a)#define DEBUG_WARN(a...)   purple_debug_warning(G_LOG_DOMAIN, a)/** ensure non-null strings */#ifndef NSTR# define NSTR(str) ((str)? (str): "(null)")#endif/** calibrates distinct secure channel nomenclature */static const unsigned char no_secret[] = {  0x2d, 0x2d, 0x20, 0x73, 0x69, 0x65, 0x67, 0x65,  0x20, 0x6c, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x6a,  0x65, 0x6e, 0x6e, 0x69, 0x20, 0x61, 0x6e, 0x64,  0x20, 0x7a, 0x6f, 0x65, 0x20, 0x2d, 0x2d, 0x00,};/** handler IDs from g_log_set_handler in mw_plugin_init */static guint log_handler[2] = { 0, 0 };/** the purple plugin data.    available as gc->proto_data and mwSession_getClientData */struct mwPurplePluginData {  struct mwSession *session;  struct mwServiceAware *srvc_aware;  struct mwServiceConference *srvc_conf;  struct mwServiceFileTransfer *srvc_ft;  struct mwServiceIm *srvc_im;  struct mwServicePlace *srvc_place;  struct mwServiceResolve *srvc_resolve;  struct mwServiceStorage *srvc_store;  /** map of PurpleGroup:mwAwareList and mwAwareList:PurpleGroup */  GHashTable *group_list_map;  /** event id for the buddy list save callback */  guint save_event;  /** socket fd */  int socket;  gint outpa;  /* like inpa, but the other way */  /** circular buffer for outgoing data */  PurpleCircBuffer *sock_buf;  PurpleConnection *gc;};typedef struct {  PurpleBuddy *buddy;  PurpleGroup *group;} BuddyAddData;/* blist and aware functions */static void blist_export(PurpleConnection *gc, struct mwSametimeList *stlist);static void blist_store(struct mwPurplePluginData *pd);static void blist_schedule(struct mwPurplePluginData *pd);static void blist_merge(PurpleConnection *gc, struct mwSametimeList *stlist);static void blist_sync(PurpleConnection *gc, struct mwSametimeList *stlist);static gboolean buddy_is_external(PurpleBuddy *b);static void buddy_add(struct mwPurplePluginData *pd, PurpleBuddy *buddy);static PurpleBuddy *buddy_ensure(PurpleConnection *gc, PurpleGroup *group,	     struct mwSametimeUser *stuser);static void group_add(struct mwPurplePluginData *pd, PurpleGroup *group);static PurpleGroup *group_ensure(PurpleConnection *gc, struct mwSametimeGroup *stgroup);static struct mwAwareList *list_ensure(struct mwPurplePluginData *pd, PurpleGroup *group);/* session functions */static struct mwSession *gc_to_session(PurpleConnection *gc);static PurpleConnection *session_to_gc(struct mwSession *session);/* conference functions */static struct mwConference *conf_find_by_id(struct mwPurplePluginData *pd, int id);/* conversation functions */struct convo_msg {  enum mwImSendType type;  gpointer data;  GDestroyNotify clear;};struct convo_data {  struct mwConversation *conv;  GList *queue;   /**< outgoing message queue, list of convo_msg */};static void convo_data_new(struct mwConversation *conv);static void convo_data_free(struct convo_data *conv);static void convo_features(struct mwConversation *conv);static PurpleConversation *convo_get_gconv(struct mwConversation *conv);/* name and id */struct named_id {  char *id;  char *name;};/* connection functions */static void connect_cb(gpointer data, gint source, const gchar *error_message);/* ----- session ------ *//** resolves a mwSession from a PurpleConnection */static struct mwSession *gc_to_session(PurpleConnection *gc) {  struct mwPurplePluginData *pd;    g_return_val_if_fail(gc != NULL, NULL);    pd = gc->proto_data;  g_return_val_if_fail(pd != NULL, NULL);    return pd->session;}/** resolves a PurpleConnection from a mwSession */static PurpleConnection *session_to_gc(struct mwSession *session) {  struct mwPurplePluginData *pd;  g_return_val_if_fail(session != NULL, NULL);  pd = mwSession_getClientData(session);  g_return_val_if_fail(pd != NULL, NULL);  return pd->gc;}static void write_cb(gpointer data, gint source, PurpleInputCondition cond) {  struct mwPurplePluginData *pd = data;  PurpleCircBuffer *circ = pd->sock_buf;  gsize avail;  int ret;  DEBUG_INFO("write_cb\n");  g_return_if_fail(circ != NULL);  avail = purple_circ_buffer_get_max_read(circ);  if(BUF_LONG < avail) avail = BUF_LONG;  while(avail) {    ret = write(pd->socket, circ->outptr, avail);        if(ret <= 0)      break;    purple_circ_buffer_mark_read(circ, ret);    avail = purple_circ_buffer_get_max_read(circ);    if(BUF_LONG < avail) avail = BUF_LONG;  }  if(! avail) {    purple_input_remove(pd->outpa);    pd->outpa = 0;  }}static int mw_session_io_write(struct mwSession *session,			       const guchar *buf, gsize len) {  struct mwPurplePluginData *pd;  int ret = 0;  int err = 0;  pd = mwSession_getClientData(session);  /* socket was already closed. */  if(pd->socket == 0)    return 1;  if(pd->outpa) {    DEBUG_INFO("already pending INPUT_WRITE, buffering\n");    purple_circ_buffer_append(pd->sock_buf, buf, len);    return 0;  }  while(len) {    ret = write(pd->socket, buf, (len > BUF_LEN)? BUF_LEN: len);    if(ret <= 0)      break;    len -= ret;    buf += ret;  }  if(ret <= 0)    err = errno;  if(err == EAGAIN) {    /* append remainder to circular buffer */    DEBUG_INFO("EAGAIN\n");    purple_circ_buffer_append(pd->sock_buf, buf, len);    pd->outpa = purple_input_add(pd->socket, PURPLE_INPUT_WRITE, write_cb, pd);  } else if(len > 0) {    DEBUG_ERROR("write returned %i, %i bytes left unwritten\n", ret, len);    purple_connection_error(pd->gc, _("Connection closed (writing)"));#if 0    close(pd->socket);    pd->socket = 0;#endif    return -1;  }  return 0;}static void mw_session_io_close(struct mwSession *session) {  struct mwPurplePluginData *pd;  PurpleConnection *gc;  pd = mwSession_getClientData(session);  g_return_if_fail(pd != NULL);  gc = pd->gc;    if(pd->outpa) {    purple_input_remove(pd->outpa);    pd->outpa = 0;  }  if(pd->socket) {    close(pd->socket);    pd->socket = 0;  }    if(gc->inpa) {    purple_input_remove(gc->inpa);    gc->inpa = 0;  }}static void mw_session_clear(struct mwSession *session) {  ; /* nothing for now */}/* ----- aware list ----- */static void blist_resolve_alias_cb(struct mwServiceResolve *srvc,				   guint32 id, guint32 code, GList *results,				   gpointer data) {  struct mwResolveResult *result;  struct mwResolveMatch *match;  g_return_if_fail(results != NULL);  result = results->data;  g_return_if_fail(result != NULL);  g_return_if_fail(result->matches != NULL);  match = result->matches->data;  g_return_if_fail(match != NULL);  purple_blist_server_alias_buddy(data, match->name);  purple_blist_node_set_string(data, BUDDY_KEY_NAME, match->name);}static void mw_aware_list_on_aware(struct mwAwareList *list,				   struct mwAwareSnapshot *aware) {  PurpleConnection *gc;  PurpleAccount *acct;      struct mwPurplePluginData *pd;  guint32 idle;  guint stat;  const char *id;  const char *status = MW_STATE_ACTIVE;  gc = mwAwareList_getClientData(list);  acct = purple_connection_get_account(gc);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩高清一区| 在线不卡中文字幕播放| 日韩中文字幕不卡| 一区二区三区资源| 中文字幕第一区第二区| 日韩欧美中文字幕精品| 欧美三级在线看| 欧美系列日韩一区| 91精品91久久久中77777| 成人在线视频一区二区| 精品一区二区在线免费观看| 亚洲国产aⅴ天堂久久| 亚洲另类春色校园小说| 国产精品传媒入口麻豆| 国产精品短视频| 亚洲人成在线播放网站岛国| 亚洲视频一区在线| 亚洲柠檬福利资源导航| 亚洲乱码日产精品bd| 亚洲欧美日韩在线| 亚洲影院理伦片| 人人精品人人爱| 免费不卡在线观看| 国产一区二区0| 91丨porny丨最新| 欧美日韩黄色一区二区| 精品久久人人做人人爽| 亚洲精品一区二区三区四区高清| 欧美一区二区三区在线视频| 精品不卡在线视频| 中文字幕第一区综合| 亚洲一区二区三区爽爽爽爽爽| 日韩国产在线观看| 国产东北露脸精品视频| 欧美亚洲一区三区| 久久综合成人精品亚洲另类欧美| 国产区在线观看成人精品 | 亚洲蜜桃精久久久久久久| 一区二区三区在线视频观看| 久久国产人妖系列| av午夜精品一区二区三区| 欧美午夜精品一区二区蜜桃| 欧美大白屁股肥臀xxxxxx| 国产精品卡一卡二| 久久精品久久精品| 色婷婷精品久久二区二区蜜臀av| 91精品国产一区二区三区蜜臀 | 日韩欧美国产午夜精品| 伊人色综合久久天天人手人婷| 免费不卡在线观看| 欧美精品高清视频| 亚洲人一二三区| 国产成人福利片| 精品免费国产二区三区| 一区二区日韩电影| 97久久精品人人做人人爽| 国产精品国产自产拍高清av王其| 美脚の诱脚舐め脚责91| 国产精品毛片无遮挡高清| 日本强好片久久久久久aaa| 国产视频一区在线播放| 欧美激情一区不卡| 中文字幕电影一区| 国产自产v一区二区三区c| 国产精品一级在线| 欧美熟乱第一页| 欧美经典三级视频一区二区三区| 中文字幕精品一区二区精品绿巨人| 亚洲精品精品亚洲| 不卡的av网站| 亚洲成av人片观看| 国产精品情趣视频| 9191久久久久久久久久久| 国产美女视频91| 亚洲成人自拍偷拍| 久久久噜噜噜久久人人看| 欧美日韩视频专区在线播放| 国模大尺度一区二区三区| 亚洲精品网站在线观看| 日本二三区不卡| 亚洲一区二区三区四区中文字幕 | 亚洲一区二区四区蜜桃| 91丝袜美女网| 丝袜美腿亚洲一区二区图片| 欧美另类变人与禽xxxxx| 婷婷综合另类小说色区| 日韩一区和二区| 国产乱码一区二区三区| 国产精品色一区二区三区| 91亚洲大成网污www| 亚洲国产精品久久久久婷婷884| 欧美性视频一区二区三区| 美女精品一区二区| 亚洲国产精品精华液ab| 欧美日韩在线播放一区| 国产乱色国产精品免费视频| 国产精品美女一区二区在线观看| 日本久久电影网| 国产激情91久久精品导航| 亚洲欧美日韩国产手机在线 | 91精品国产全国免费观看| 国产成人精品综合在线观看| 三级亚洲高清视频| 国产精品第四页| 精品国产乱码91久久久久久网站| 国产精品1区二区.| 天天射综合影视| 欧美国产日韩亚洲一区| 欧美顶级少妇做爰| 日韩欧美国产精品一区| 国产在线视频精品一区| 日韩综合在线视频| 五月天中文字幕一区二区| 亚洲天堂福利av| 亚洲欧美激情视频在线观看一区二区三区 | 91色视频在线| 色香色香欲天天天影视综合网| www.亚洲人| 欧美中文字幕一二三区视频| 欧美在线免费视屏| 日韩一区二区三区四区五区六区| 宅男噜噜噜66一区二区66| 91精品久久久久久久99蜜桃| 精品国产乱码久久久久久免费| 精品国产一二三| 国产精品国产三级国产普通话三级| 日本一区二区成人| 亚洲精品菠萝久久久久久久| 日韩精品乱码av一区二区| 国内成+人亚洲+欧美+综合在线| 成人网在线播放| 欧美日韩国产小视频| 久久久久国产精品麻豆ai换脸| 国产精品国产三级国产普通话蜜臀 | 亚洲一区二区视频在线观看| 全部av―极品视觉盛宴亚洲| 国产激情视频一区二区三区欧美| 色婷婷av一区二区| 国产欧美日韩三区| 天天综合网 天天综合色| 粉嫩绯色av一区二区在线观看| 99久久国产综合精品麻豆| 精品久久久久久久久久久院品网 | 99视频超级精品| 日韩欧美一区二区三区在线| 亚洲免费三区一区二区| 国产麻豆成人精品| 日韩一区二区免费在线电影| 一区二区中文视频| 国产suv精品一区二区6| 日韩欧美国产小视频| 香蕉加勒比综合久久| 在线亚洲人成电影网站色www| 精品一区二区日韩| 欧美色综合影院| 亚洲国产精品久久艾草纯爱| 在线免费观看不卡av| 亚洲欧美激情在线| 精品视频全国免费看| 天涯成人国产亚洲精品一区av| 精品婷婷伊人一区三区三| 天天综合天天综合色| 精品久久久久久最新网址| 国产夫妻精品视频| 亚洲欧美激情一区二区| 欧美日韩激情一区二区三区| 日韩和欧美一区二区三区| 日韩欧美在线观看一区二区三区| 麻豆国产精品一区二区三区 | 蜜桃视频一区二区三区| 精品国产成人系列| 懂色av噜噜一区二区三区av| √…a在线天堂一区| 99精品国产热久久91蜜凸| 国产精品久久影院| 91麻豆福利精品推荐| 亚洲国产视频直播| 5566中文字幕一区二区电影 | 国产九色sp调教91| 日本一区二区高清| 欧美影院一区二区三区| 天天色综合成人网| 久久综合国产精品| 色综合久久久久综合99| 亚洲成av人片在线观看| 日韩三级电影网址| 成人97人人超碰人人99| 亚洲妇女屁股眼交7| 26uuu久久天堂性欧美| 97se亚洲国产综合自在线不卡 | 91视频你懂的| 日本视频在线一区| 亚洲欧洲精品一区二区精品久久久| 在线视频一区二区免费| 韩国v欧美v日本v亚洲v| 一区二区三区四区视频精品免费| 日韩色视频在线观看| 色哟哟一区二区| 久久99九九99精品| 一区二区三区丝袜|