📄 dialog.c
字号:
/* * Copyright (C) 2006 Takeharu KATO * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/time.h>#include <gnome.h>#include <glib.h>#include <bonobo.h>#include <sys/types.h>#include <stdarg.h>#include "common.h"#include "interface.h"#include "callbacks.h"#include "support.h"/** @file * @brief ダイアログ簇眶凡 * @author Takeharu KATO */ /** クライアント攫鼠ダイアログ脱のメッセ〖ジ叫蜗鼎奶借妄 * @param[in] text_buffer 叫蜗黎テキストバッファ * @param[in] format 今及回年矢机误 * @return なし */static voidclient_info_add_text(GtkTextBuffer *text_buffer, const char *format,...){ char buffer[64]; /* 矢机误腊妨脱バッファ */ size_t len; /* 矢机误墓 */ va_list ap; /* 材恃墓苞眶瓷妄 */ g_assert(text_buffer != NULL); memset(buffer, 0, 64); va_start(ap, format); vsnprintf(buffer, 63, format, ap); va_end(ap); buffer[63] = '\0'; len = strlen(buffer); gtk_text_buffer_insert_at_cursor(text_buffer, buffer, len);}/** 减慨澄千ダイアログ栏喇 * @param[in, out] user ユ〖ザ叹 * @param[in] ipaddr 减慨荚IPアドレス(IPMSG_READMSG流慨荚アドレス) * @param[in] sec IPMSG_READMSG减慨箕癸(Epoch 箕癸) * @retval 0 * @retval -EINVAL * @retval -ENOMEM * @attention userが回し绩す黎は, 塑簇眶柒で倡庶するので, 钙び叫し娄で * 剩澜を苞き畔すこと. */voidread_message_dialog(const gchar *user,const gchar *ipaddr, long sec){ GtkWidget *dialog = NULL; GtkLabel *userlabel = NULL; GtkLabel *timelabel = NULL; userdb_t *user_info = NULL; char buffer[64]; char time_string[26]; va_list ap; dbg_out("here\n"); if (user == NULL) return; /* ユ〖ザ叹がNULLの眷圭は, ダイアログを山绩しない */ if (!hostinfo_refer_ipmsg_default_confirm()) goto user_free_out; /* 减慨澄千をしない眷圭は, 篓箕牲耽 */ dialog = GTK_WIDGET(create_readNotifyDialog()); userlabel = GTK_LABEL(lookup_widget(dialog, "readNotifyDialogUserGroupLabel") ); if (ipaddr != NULL) { if (!userdb_search_user_by_addr(ipaddr, (const userdb_t **)&user_info) ) { g_assert(userlabel != NULL); snprintf(buffer, 63, "%s@%s (%s)", user_info->nickname, user_info->group, user_info->host); buffer[63]='\0'; gtk_label_set_text(userlabel, buffer); g_assert(!destroy_user_info(user_info)); } else { /* ipaddrがユ〖ザDBに判峡されていない眷圭, * ユ〖ザ叹だけを山绩する. */ gtk_label_set_text(userlabel, user); } } else { gtk_label_set_text(userlabel, _("UnKnown")); } timelabel = GTK_LABEL(lookup_widget(dialog, "readNotifyLogonIPAddrLabel")); if (get_current_time_string(time_string, sec)) gtk_label_set_text(timelabel, _("UnKnown")); else gtk_label_set_text(timelabel, time_string); gtk_widget_show(dialog); /* ダイアログ山绩 */user_free_out: if (user != NULL) g_free((gchar *)user); return;}/** エラ〖券栏ダイアログを叫蜗する * @param[in] filename 券栏傅ファイル叹 * @param[in] funcname 券栏傅簇眶叹 * @param[in] line 券栏傅乖戎规 * @param[in] format 今及回年矢机误(材恃改苞眶) * @return なし */voiderror_message_dialog(const char *filename, const char *funcname, const int line, const char* format, ...){ GtkWidget *dialog = NULL; GtkLabel *file_label = NULL; GtkLabel *func_label = NULL; GtkLabel *line_label = NULL; GtkTextView *error_text_view = NULL; GtkTextBuffer *error_buffer = NULL; char error_message[256]; char line_string[8]; va_list ap; dbg_out("here\n"); g_assert(filename != NULL); g_assert(funcname != NULL); /* * エラ〖メッセ〖ジを腊妨する. */ if (format != NULL) { va_start(ap, format); vsnprintf(error_message, 256, format, ap); va_end(ap); } else { error_message[0] = '\0'; } error_message[255] = '\0'; snprintf(line_string, 8, "%d", line); line_string[7] = '\0'; gdk_threads_enter(); /* * ウィジェットを艰评 */ dialog = GTK_WIDGET(create_errorDialog()); g_assert(dialog); file_label = GTK_LABEL(lookup_widget(GTK_WIDGET(dialog), "errorDialogErrInfoFileNameContLabel")); g_assert(file_label); func_label = GTK_LABEL(lookup_widget(GTK_WIDGET(dialog), "errorDialogErrInfoFunctionContLabel")); g_assert(func_label); line_label = GTK_LABEL(lookup_widget(GTK_WIDGET(dialog), "errorDialogErrInfoFileLineContLabel")); g_assert(line_label); error_text_view = GTK_TEXT_VIEW(lookup_widget(GTK_WIDGET(dialog), "errorDialogErrorTextView")); g_assert(error_text_view); error_buffer = GTK_TEXT_BUFFER(gtk_text_view_get_buffer(error_text_view)); g_assert(error_buffer); /* * エラ〖券栏疤弥攫鼠を肋年 */ gtk_label_set_text(file_label, filename); gtk_label_set_text(func_label, funcname); gtk_label_set_text(line_label, line_string); gtk_text_buffer_insert_at_cursor(error_buffer, error_message, -1); gtk_text_buffer_insert_at_cursor(error_buffer, "\n", -1); /* * ダイアログ山绩 */ gtk_widget_show(dialog); gdk_threads_leave(); return;}/** クライアント攫鼠ダイアログを山绩する * @param[in] user ユ〖ザ叹 * @param[in] ipaddr IPアドレス * @param[in] command 攫鼠硷侍 * - IPMSG_SENDINFO クライアント攫鼠を山绩 * - IPMSG_SENDABSENCEINFO 稍哼攫鼠を山绩 * @param[in] message 山绩する矢鞠 * @retval 0 赖撅姜位 * @retval -EINVAL messageがNULLである. * @retval -EINVAL 稍赖なcommandを苞き畔した. */intinfo_message_window(const gchar *user,const gchar *ipaddr, unsigned long command,const char *message){ GtkWidget *window = NULL; /* ダイアログウィンドウ */ GtkLabel *userlabel = NULL; /* ユ〖ザ叹山绩ラベル */ GtkLabel *typelabel = NULL; /* 攫鼠硷侍山绩ラベル */ userdb_t *user_info = NULL; /* ユ〖ザ攫鼠 */ char buffer[64]; /* 矢机误腊妨脱バッファ */ GtkTextView *text_view = NULL; /* 山绩挝拌脱テキストビュ〖 */ GtkTextBuffer *text_buffer = NULL; /* 山绩挝拌のテキストバッファ */ gchar *internal_message = NULL; /* 山绩矢机误の柒婶妨及呈羌挝拌 */ size_t len = 0; /* 山绩矢机误墓 */ unsigned long skey = 0; /* 滦疚赴芭规借妄墙蜗 */ unsigned long akey = 0; /* 润滦疚(给倡赴)芭规借妄墙蜗 */ unsigned long sign = 0; /* 金叹借妄墙蜗 */ int rc = 0; /* 手り猛 */ dbg_out("here\n"); rc = -EINVAL; if (message == NULL) goto error_out; /* * ウィジェット惩评 */ window = GTK_WIDGET(create_clientInfoWindow()); g_assert(window); userlabel = GTK_LABEL(lookup_widget(window, "clientInfoUserLabel")); g_assert(userlabel); typelabel = GTK_LABEL(lookup_widget(window, "clientInfoTypeLabel")); g_assert(typelabel); text_view = GTK_TEXT_VIEW(lookup_widget(GTK_WIDGET(window), "clientInfoTextview")); g_assert(text_view); text_buffer = gtk_text_view_get_buffer(text_view); g_assert(text_buffer); /* * 硷侍冉年 */ switch(command) { case IPMSG_SENDINFO: gtk_label_set_text(typelabel, _("Version Information")); break; case IPMSG_SENDABSENCEINFO: gtk_label_set_text(typelabel, _("Absence Information")); break; default: rc = -EINVAL; goto error_out; break; } /* * 叫蜗メッセ〖ジ腊妨 */ rc = convert_string_internal(message, (const gchar **)&internal_message); if (internal_message == NULL) { ipmsg_err_dialog(_("Can not convert message from %s into ineternal representation"), ipaddr); goto error_out; } len = strlen(internal_message); gtk_text_buffer_set_text(text_buffer, internal_message, len); g_free(internal_message); if (command == IPMSG_SENDABSENCEINFO) goto show_out; /* 稍哼矢の眷圭は, クライアント攫鼠は涩妥ない */ /* * クライアント攫鼠叫蜗 */ if ( (user != NULL) && (ipaddr != NULL) ) { if (!userdb_search_user_by_addr(ipaddr, (const userdb_t **)&user_info)) { g_assert(userlabel); snprintf(buffer, 63, "%s@%s (%s)", user_info->nickname, user_info->host, user_info->group); buffer[63] = '\0'; gtk_label_set_text(userlabel,buffer); /* * IPアドレス */ client_info_add_text(text_buffer, "\n"); client_info_add_text(text_buffer, "%s:%s\n", _("IP Address"), user_info->ipaddr); client_info_add_text(text_buffer, "%s : 0x%08x\n", _("Capability"), (unsigned int)user_info->cap); /* * Dial up */ if (user_info->cap & IPMSG_DIALUPOPT) client_info_add_text(text_buffer, "%s : %s\n", _("Dial up"), _("YES")); else client_info_add_text(text_buffer, "%s : %s\n", _("Dial up"), _("NO")); /* * UTF-8 */ if (user_info->cap & IPMSG_UTF8OPT) client_info_add_text(text_buffer, "%s : %s\n", _("UTF-8"), _("YES")); else client_info_add_text(text_buffer, "%s : %s\n", _("UTF-8"), _("NO")); /* * File Attach */ if (user_info->cap & IPMSG_FILEATTACHOPT) client_info_add_text(text_buffer, "%s : %s\n", _("File Attach"), _("YES")); else client_info_add_text(text_buffer, "%s : %s\n", _("File Attach"), _("NO")); /* * Encryption */ if (user_info->cap & IPMSG_ENCRYPTOPT) { client_info_add_text(text_buffer, "%s:%s (%s:0x%08x)\n", _("Encryption Capability"), _("YES"), _("Capability"), user_info->crypt_cap); akey = get_asymkey_part(user_info->crypt_cap); skey = get_symkey_part(user_info->crypt_cap); sign = get_sign_part(user_info->crypt_cap); /* * Public key */ client_info_add_text(text_buffer, "%s:", _("Public key encryption")); if (akey != 0) { if (akey & IPMSG_RSA_512) client_info_add_text(text_buffer, "[%s]", _("RSA 512 bits")); if (akey & IPMSG_RSA_1024) client_info_add_text(text_buffer, "[%s]", _("RSA 1024 bits")); if (akey & IPMSG_RSA_2048) client_info_add_text(text_buffer, "[%s]", _("RSA 2048 bits")); } else { client_info_add_text(text_buffer, "[%s]", _("UnKnown")); } client_info_add_text(text_buffer, "\n"); /* * Symmetric key */ client_info_add_text(text_buffer, "%s:", _("Symmetric key encryption")); if (skey != 0) { if (skey & IPMSG_RC2_40) client_info_add_text(text_buffer, "[%s]", _("RC2 40 bits")); if (skey & IPMSG_RC2_128) client_info_add_text(text_buffer, "[%s]", _("RC2 128 bits")); if (skey & IPMSG_RC2_256) client_info_add_text(text_buffer, "[%s]", _("RC2 256 bits")); if (skey & IPMSG_BLOWFISH_128) client_info_add_text(text_buffer, "[%s]", _("Blowfish 128 bits")); if (skey & IPMSG_BLOWFISH_256) client_info_add_text(text_buffer, "[%s]", _("Blowfish 256 bits")); } else { client_info_add_text(text_buffer, "[%s]", _("UnKnown")); } client_info_add_text(text_buffer, "\n"); /* * Signature */ client_info_add_text(text_buffer, "%s:", _("Signature")); if (sign != 0) { if (sign & IPMSG_SIGN_MD5) client_info_add_text(text_buffer, "[%s]", _("MD5")); if (skey & IPMSG_SIGN_SHA1) client_info_add_text(text_buffer, "[%s]", _("SHA1")); } else { client_info_add_text(text_buffer, "[%s]", _("UnKnown")); } client_info_add_text(text_buffer, "\n"); } else { client_info_add_text(text_buffer, "%s:%s\n", _("Encryption Capability"), _("NO")); } } else { gtk_label_set_text(userlabel, user); } } else { gtk_label_set_text(userlabel,(_("UnKnown"))); }show_out: gtk_widget_show(window); rc=0;error_out: if (user_info != NULL) g_assert(!destroy_user_info(user_info)); if (user != NULL) g_free((gchar *)user); return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -