log_reader.c

来自「Linux下的多协议即时通讯程序源代码」· C语言 代码 · 共 2,177 行 · 第 1/4 页

C
2,177
字号
						"Reason: Maximum length exceeded.")) {						g_string_append(formatted,							_("Message could not be sent because "							  "the maximum length was exceeded."));						line = "";					} else {						g_string_append(formatted,							_("Message could not be sent."));						line += (sizeof(							"Your previous message "							"has not been sent. ") - 1);					}					footer = "</span></b>";				}			} else if (purple_str_has_prefix(line, data->their_nickname)) {				if (buddy != NULL && buddy->alias) {					line += strlen(data->their_nickname) + 2;					g_string_append_printf(formatted,						"<span style=\"color: #A82F2F;\">"						"<b>%s</b></span>: ", buddy->alias);				}			} else {				const char *line2 = strstr(line, ":");				if (line2) {					const char *acct_name;					line2++;					line = line2;					acct_name = purple_account_get_alias(log->account);					if (!acct_name)						acct_name = purple_account_get_username(log->account);					g_string_append_printf(formatted,						"<span style=\"color: #16569E;\">"						"<b>%s</b></span>:", acct_name);				}			}		}		g_string_append(formatted, line);		line = c;		if (temp)			g_string_free(temp, TRUE);		if (footer)			g_string_append(formatted, footer);		g_string_append_c(formatted, '\n');	}	g_free(read);	/* XXX: TODO: Avoid this g_strchomp() */	return g_strchomp(g_string_free(formatted, FALSE));}static int trillian_logger_size (PurpleLog *log){	struct trillian_logger_data *data;	char *text;	size_t size;	g_return_val_if_fail(log != NULL, 0);	data = log->logger_data;	if (purple_prefs_get_bool("/plugins/core/log_reader/fast_sizes")) {		return data ? data->length : 0;	}	text = trillian_logger_read(log, NULL);	size = strlen(text);	g_free(text);	return size;}static void trillian_logger_finalize(PurpleLog *log){	struct trillian_logger_data *data;	g_return_if_fail(log != NULL);	data = log->logger_data;	g_free(data->path);	g_free(data->their_nickname);}/***************************************************************************** * Plugin Code                                                               * *****************************************************************************/static voidinit_plugin(PurplePlugin *plugin){	char *path;#ifdef _WIN32	char *folder;	gboolean found = FALSE;#endif	g_return_if_fail(plugin != NULL);	purple_prefs_add_none("/plugins/core/log_reader");	/* Add general preferences. */	purple_prefs_add_bool("/plugins/core/log_reader/fast_sizes", FALSE);	purple_prefs_add_bool("/plugins/core/log_reader/use_name_heuristics", TRUE);	/* Add Adium log directory preference. */	purple_prefs_add_none("/plugins/core/log_reader/adium");	/* Calculate default Adium log directory. */#ifdef _WIN32		path = "";#else		path = g_build_filename(purple_home_dir(), "Library", "Application Support",			"Adium 2.0", "Users", "Default", "Logs", NULL);#endif	purple_prefs_add_string("/plugins/core/log_reader/adium/log_directory", path);#ifndef _WIN32	g_free(path);#endif	/* Add Fire log directory preference. */	purple_prefs_add_none("/plugins/core/log_reader/fire");	/* Calculate default Fire log directory. */#ifdef _WIN32		path = "";#else		path = g_build_filename(purple_home_dir(), "Library", "Application Support",			"Fire", "Sessions", NULL);#endif	purple_prefs_add_string("/plugins/core/log_reader/fire/log_directory", path);#ifndef _WIN32	g_free(path);#endif	/* Add Messenger Plus! log directory preference. */	purple_prefs_add_none("/plugins/core/log_reader/messenger_plus");	/* Calculate default Messenger Plus! log directory. */#ifdef _WIN32	folder = wpurple_get_special_folder(CSIDL_PERSONAL);	if (folder) {#endif	path = g_build_filename(#ifdef _WIN32		folder,#else		PURPLE_LOG_READER_WINDOWS_MOUNT_POINT, "Documents and Settings",		g_get_user_name(), "My Documents",#endif		"My Chat Logs", NULL);#ifdef _WIN32	g_free(folder);	} else /* !folder */		path = g_strdup("");#endif	purple_prefs_add_string("/plugins/core/log_reader/messenger_plus/log_directory", path);	g_free(path);	/* Add MSN Messenger log directory preference. */	purple_prefs_add_none("/plugins/core/log_reader/msn");	/* Calculate default MSN message history directory. */#ifdef _WIN32	folder = wpurple_get_special_folder(CSIDL_PERSONAL);	if (folder) {#endif	path = g_build_filename(#ifdef _WIN32		folder,#else		PURPLE_LOG_READER_WINDOWS_MOUNT_POINT, "Documents and Settings",		g_get_user_name(), "My Documents",#endif		"My Received Files", NULL);#ifdef _WIN32	g_free(folder);	} else /* !folder */		path = g_strdup("");#endif	purple_prefs_add_string("/plugins/core/log_reader/msn/log_directory", path);	g_free(path);	/* Add Trillian log directory preference. */	purple_prefs_add_none("/plugins/core/log_reader/trillian");#ifdef _WIN32	/* XXX: While a major hack, this is the most reliable way I could	 * think of to determine the Trillian installation directory.	 */	path = NULL;	if ((folder = wpurple_read_reg_string(HKEY_CLASSES_ROOT, "Trillian.SkinZip\\shell\\Add\\command\\", NULL))) {		char *value = folder;		char *temp;		/* Break apart buffer. */		if (*value == '"') {			value++;			temp = value;			while (*temp && *temp != '"')				temp++;		} else {			temp = value;			while (*temp && *temp != ' ')				temp++;		}		*temp = '\0';		/* Set path. */		if (purple_str_has_suffix(value, "trillian.exe")) {			value[strlen(value) - (sizeof("trillian.exe") - 1)] = '\0';			path = g_build_filename(value, "users", "default", "talk.ini", NULL);		}		g_free(folder);	}	if (!path) {		char *folder = wpurple_get_special_folder(CSIDL_PROGRAM_FILES);		if (folder) {			path = g_build_filename(folder, "Trillian",					"users", "default", "talk.ini", NULL);			g_free(folder);		}	}	if (path) {		/* Read talk.ini file to find the log directory. */		GError *error = NULL;#if 0 && GLIB_CHECK_VERSION(2,6,0) /* FIXME: Not tested yet. */		GKeyFile *key_file;		purple_debug(PURPLE_DEBUG_INFO, "Trillian talk.ini read",				"Reading %s\n", path);		if (!g_key_file_load_from_file(key_file, path, G_KEY_FILE_NONE, GError &error)) {			purple_debug(PURPLE_DEBUG_ERROR, "Trillian talk.ini read",					"Error reading talk.ini\n");			if (error)				g_error_free(error);		} else {			char *logdir = g_key_file_get_string(key_file, "Logging", "Directory", &error);			if (error) {				purple_debug(PURPLE_DEBUG_ERROR, "Trillian talk.ini read",						"Error reading Directory value from Logging section\n");				g_error_free(error);			}			if (logdir) {				g_strchomp(logdir);				purple_prefs_add_string(					"/plugins/core/log_reader/trillian/log_directory", logdir);				found = TRUE;			}			g_key_file_free(key_file);		}#else /* !GLIB_CHECK_VERSION(2,6,0) */		gsize length;		gchar *contents = NULL;		purple_debug(PURPLE_DEBUG_INFO, "Trillian talk.ini read",					"Reading %s\n", path);		if (!g_file_get_contents(path, &contents, &length, &error)) {			purple_debug(PURPLE_DEBUG_ERROR, "Trillian talk.ini read",					"Error reading talk.ini\n");			if (error)				g_error_free(error);		} else {			char *line = contents;			while (*contents) {				if (*contents == '\n') {					*contents = '\0';					/* XXX: This assumes the first Directory key is under [Logging]. */					if (purple_str_has_prefix(line, "Directory=")) {						line += (sizeof("Directory=") - 1);						g_strchomp(line);						purple_prefs_add_string(							"/plugins/core/log_reader/trillian/log_directory",							line);						found = TRUE;					}					contents++;					line = contents;				} else					contents++;			}			g_free(path);			g_free(contents);		}#endif /* !GTK_CHECK_VERSION(2,6,0) */	} /* path */	if (!found) {#endif /* defined(_WIN32) */	/* Calculate default Trillian log directory. */#ifdef _WIN32	folder = wpurple_get_special_folder(CSIDL_PROGRAM_FILES);	if (folder) {#endif	path = g_build_filename(#ifdef _WIN32		folder,#else		PURPLE_LOG_READER_WINDOWS_MOUNT_POINT, "Program Files",#endif		"Trillian", "users", "default", "logs", NULL);#ifdef _WIN32	g_free(folder);	} else /* !folder */		path = g_strdup("");#endif	purple_prefs_add_string("/plugins/core/log_reader/trillian/log_directory", path);	g_free(path);#ifdef _WIN32	} /* !found */#endif}static gbooleanplugin_load(PurplePlugin *plugin){	g_return_val_if_fail(plugin != NULL, FALSE);	/* The names of IM clients are marked for translation at the request of	   translators who wanted to transliterate them.  Many translators	   choose to leave them alone.  Choose what's best for your language. */	adium_logger = purple_log_logger_new("adium", _("Adium"), 6,									   NULL,									   NULL,									   adium_logger_finalize,									   adium_logger_list,									   adium_logger_read,									   adium_logger_size);	purple_log_logger_add(adium_logger);#if 0	/* The names of IM clients are marked for translation at the request of	   translators who wanted to transliterate them.  Many translators	   choose to leave them alone.  Choose what's best for your language. */	fire_logger = purple_log_logger_new("fire", _("Fire"), 6,									  NULL,									  NULL,									  fire_logger_finalize,									  fire_logger_list,									  fire_logger_read,									  fire_logger_size);	purple_log_logger_add(fire_logger);	/* The names of IM clients are marked for translation at the request of	   translators who wanted to transliterate them.  Many translators	   choose to leave them alone.  Choose what's best for your language. */	messenger_plus_logger = purple_log_logger_new("messenger_plus", _("Messenger Plus!"), 6,												NULL,												NULL,												messenger_plus_logger_finalize,												messenger_plus_logger_list,												messenger_plus_logger_read,												messenger_plus_logger_size);	purple_log_logger_add(messenger_plus_logger);#endif	/* The names of IM clients are marked for translation at the request of	   translators who wanted to transliterate them.  Many translators	   choose to leave them alone.  Choose what's best for your language. */	msn_logger = purple_log_logger_new("msn", _("MSN Messenger"), 6,									 NULL,									 NULL,									 msn_logger_finalize,									 msn_logger_list,									 msn_logger_read,									 msn_logger_size);	purple_log_logger_add(msn_logger);	/* The names of IM clients are marked for translation at the request of	   translators who wanted to transliterate them.  Many translators	   choose to leave them alone.  Choose what's best for your language. */	trillian_logger = purple_log_logger_new("trillian", _("Trillian"), 6,										  NULL,										  NULL,										  trillian_logger_finalize,										  trillian_logger_list,										  trillian_logger_read,										  trillian_logger_size);	purple_log_logger_add(trillian_logger);	return TRUE;}static gbooleanplugin_unload(PurplePlugin *plugin){	g_return_val_if_fail(plugin != NULL, FALSE);	purple_log_logger_remove(adium_logger);#if 0	purple_log_logger_remove(fire_logger);	purple_log_logger_remove(messenger_plus_logger);#endif	purple_log_logger_remove(msn_logger);	purple_log_logger_remove(trillian_logger);	return TRUE;}static PurplePluginPrefFrame *get_plugin_pref_frame(PurplePlugin *plugin){	PurplePluginPrefFrame *frame;	PurplePluginPref *ppref;	g_return_val_if_fail(plugin != NULL, FALSE);	frame = purple_plugin_pref_frame_new();	/* Add general preferences. */	ppref = purple_plugin_pref_new_with_label(_("General Log Reading Configuration"));	purple_plugin_pref_frame_add(frame, ppref);	ppref = purple_plugin_pref_new_with_name_and_label(		"/plugins/core/log_reader/fast_sizes", _("Fast size calculations"));	purple_plugin_pref_frame_add(frame, ppref);	ppref = purple_plugin_pref_new_with_name_and_label(		"/plugins/core/log_reader/use_name_heuristics", _("Use name heuristics"));	purple_plugin_pref_frame_add(frame, ppref);	/* Add Log Directory preferences. */	ppref = purple_plugin_pref_new_with_label(_("Log Directory"));	purple_plugin_pref_frame_add(frame, ppref);	ppref = purple_plugin_pref_new_with_name_and_label(		"/plugins/core/log_reader/adium/log_directory", _("Adium"));	purple_plugin_pref_frame_add(frame, ppref);#if 0	ppref = purple_plugin_pref_new_with_name_and_label(		"/plugins/core/log_reader/fire/log_directory", _("Fire"));	purple_plugin_pref_frame_add(frame, ppref);	ppref = purple_plugin_pref_new_with_name_and_label(		"/plugins/core/log_reader/messenger_plus/log_directory", _("Messenger Plus!"));	purple_plugin_pref_frame_add(frame, ppref);#endif	ppref = purple_plugin_pref_new_with_name_and_label(		"/plugins/core/log_reader/msn/log_directory", _("MSN Messenger"));	purple_plugin_pref_frame_add(frame, ppref);	ppref = purple_plugin_pref_new_with_name_and_label(		"/plugins/core/log_reader/trillian/log_directory", _("Trillian"));	purple_plugin_pref_frame_add(frame, ppref);	return frame;}static PurplePluginUiInfo prefs_info = {	get_plugin_pref_frame,	0,   /* page_num (reserved) */	NULL, /* frame (reserved) */	/* padding */	NULL,	NULL,	NULL,	NULL};static PurplePluginInfo info ={	PURPLE_PLUGIN_MAGIC,	PURPLE_MAJOR_VERSION,	PURPLE_MINOR_VERSION,	PURPLE_PLUGIN_STANDARD,                             /**< type           */	NULL,                                             /**< ui_requirement */	0,                                                /**< flags          */	NULL,                                             /**< dependencies   */	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */	"core-log_reader",                                /**< id             */	N_("Log Reader"),                                 /**< name           */	VERSION,                                          /**< version        */	/** summary */	N_("Includes other IM clients' logs in the "	   "log viewer."),	/** description */	N_("When viewing logs, this plugin will include "	   "logs from other IM clients. Currently, this "	   "includes Adium, MSN Messenger, and Trillian.\n\n"	   "WARNING: This plugin is still alpha code and "	   "may crash frequently.  Use it at your own risk!"),	"Richard Laager <rlaager@pidgin.im>",             /**< author         */	PURPLE_WEBSITE,                                     /**< homepage       */	plugin_load,                                      /**< load           */	plugin_unload,                                    /**< unload         */	NULL,                                             /**< destroy        */	NULL,                                             /**< ui_info        */	NULL,                                             /**< extra_info     */	&prefs_info,                                      /**< prefs_info     */	NULL,                                             /**< actions        */	/* padding */	NULL,	NULL,	NULL,	NULL};PURPLE_INIT_PLUGIN(log_reader, init_plugin, info)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?