📄 wizserver.c
字号:
/*
*
* Copyright (C) 2003 Xiangbin Lee <honeycombs@sina.com> <honeycombs@263.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.
*/
#include <string.h>
#include "ache.h"
#include "serverfun.h"
#include "common.h"
#include "hexviewdlg.h"
#include "poport.h"
/* The Widgets list for dialog
1.dialog preview:
______________________________________________________
/v| _ X \
--------------------------------------------------------
| | |
| area C span_ha area E |
| | |
-------------- span_va --------------------------------
| | |
| area B1 | area A1 |
| | |
---------- span_vc ------ | -------- span_vd -----------
| span_hb |
| area B2 | area A2 |
| | |
-------------------------------------------------------
2.main gtk ctrl relations :
+va span_va return
|+ha span_ha
| |-C area C, message list, [text area]
| |-E area E, link list, [clist]
|
|+hb span_hb
|+vd frame->span_vd
| |-A1 area A1, receive log, [list view]
| |-A2 area A2, receive content(hex and chars), [draw area]
|+vc frame->span_vd
|-B1 area B1, send content, [text]
|-B2 area B2, send option, [dialog or frame]
*/
static REQLIST *curClient=NULL;
/* for area C */
GTK_TextArea textarea_c={0,0,0,0,};
void wizserv_areac_addtext(gchar *msg)
{
GtkTextIter iter;
if(textarea_c.regsignal!=GTK_WIDGET_REG)
return ;
if(msg[strlen(msg)-1]!='\n')
strcat((char *)msg,"\n");
gtk_text_buffer_get_iter_at_offset (textarea_c.buffer, &iter, 0);
gtk_text_buffer_insert (textarea_c.buffer, &iter,msg,-1);
}
void wizserv_areac_settext(gchar *msg)
{
if(textarea_c.regsignal!=GTK_WIDGET_REG)
return ;
gtk_text_buffer_set_text (textarea_c.buffer, msg,strlen(msg));
}
/* for area A2*/
GtkHexView wizspy_areaa2;
GtkWidget *wizserv_areaa2_create(GtkWidget *window)
{
GtkWidget *frame;
GdkColor color[6];
color[0].red=0x80FF;color[0].green=0x80FF;color[0].blue=0xFFFF;
color[1].red=0xFFFF;color[1].green=0x0000;color[1].blue=0x0000;
color[2].red=0x0000;color[2].green=0x80FF;color[2].blue=0xFFFF;
color[3].red=0xFFFF;color[3].green=0x0000;color[3].blue=0x0000;
color[4].red=0x0000;color[4].green=0x40FF;color[4].blue=0x80FF;
color[5].red=0xFFFF;color[5].green=0x0000;color[5].blue=0x0000;
frame = GtkHexView_Create(&wizspy_areaa2,window);
/* set option to show */
GtkHexView_SetFontColor(&wizspy_areaa2,color[0],color[1],color[2],color[3],color[4],color[5]);
GtkHexView_SetLineCharNum(&wizspy_areaa2, 16,0);
GtkHexView_SetSelOption(&wizspy_areaa2, 0,0,0);
return frame;
}
/* for area B1*/
GTK_TextArea textarea_b1={0,0,0,0,};
guint wizserv_areab1_gettext(gchar *msg)
{
gchar *lpbuf;
guint buflen=0;
GtkTextIter itstart, itend;
if(textarea_b1.regsignal!=GTK_WIDGET_REG)
return 0;
gtk_text_buffer_get_start_iter(textarea_b1.buffer,&itstart);
gtk_text_buffer_get_end_iter(textarea_b1.buffer,&itend);
lpbuf=gtk_text_buffer_get_text (textarea_b1.buffer,&itstart,&itend,1);
buflen=strlen((char*)lpbuf);
if(buflen>0)
{
memcpy(msg,lpbuf,buflen);
msg[buflen]=0;
}
return buflen;
}
/* for area B2*/
gint ifwizserv_areab2_ishex=0;
void wizserv_areab2_clicktext(GtkWidget *window, gpointer fundata)
{
ifwizserv_areab2_ishex=0;
}
void wizserv_areab2_clickhex(GtkWidget *window, gpointer fundata)
{
ifwizserv_areab2_ishex=1;
}
gint ifwizserv_autosend=0;
gint ifwizserv_autodisconnect=0;
void wizserv_areab2_clickdisconnect(GtkWidget *window, gpointer fundata)
{
if(curClient==NULL)
return;
Server_RemoveClient(curClient);
curClient=0;
}
void wizserv_areab2_clicksend(GtkWidget *window, gpointer fundata)
{
if(curClient==NULL)
return;
// TODO: Add your control notification handler code here
static gchar tmpstr[4096];
guint DataLength=0;
if(!ifwizserv_areab2_ishex)
{
memset(tmpstr,0,4096);
DataLength=wizserv_areab1_gettext(tmpstr);
if(DataLength>0)
{
Server_SendToClient(curClient,(guchar *)tmpstr,DataLength);
if(ifwizserv_autodisconnect)
wizserv_areab2_clickdisconnect(window,fundata);
}
}
else
{
guchar sdata[2048];
gchar strdata[20];
memset(tmpstr,0,4096);
DataLength=wizserv_areab1_gettext(tmpstr);
if(DataLength>0)
{
guint dataleng =0;
int re ;
int data;
gchar *lp=tmpstr ;
do{
re=sscanf(lp,"%s",strdata);
lp+=5;
if(re!=EOF)
{
sscanf(strdata,"%x",&data);
data%=256;
dataleng++;
if(dataleng>0&&dataleng<2048)
sdata[dataleng-1]=(guchar)data;
else break;
}
else break;
}while(re!=EOF);
if(dataleng>0)
{
Server_SendToClient(curClient,(guchar *)sdata,dataleng);
if(ifwizserv_autodisconnect)
wizserv_areab2_clickdisconnect(window,fundata);
}
}
}
}
GtkWidget *wizserv_areab2_create(GtkWidget *window)
{
GtkWidget *frame, *vbox, *vbox2, *button;
GSList *group;
frame = gtk_frame_new ("Send option:");
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (frame), vbox);
gtk_widget_show (vbox);
// radio buttons
vbox2 = gtk_vbox_new (FALSE, 10);
gtk_container_set_border_width (GTK_CONTAINER (vbox2), 10);
gtk_box_pack_start (GTK_BOX (vbox), vbox2, TRUE, TRUE, 0);
gtk_widget_show (vbox2);
button = gtk_radio_button_new_with_label (NULL, "Use content as normal text");
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (wizserv_areab2_clicktext), NULL);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
gtk_box_pack_start (GTK_BOX (vbox2), button, TRUE, TRUE, 0);
gtk_widget_show (button);
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
button = gtk_radio_button_new_with_label (group, "Use content as hex data");
g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (wizserv_areab2_clickhex),NULL);
gtk_box_pack_start (GTK_BOX (vbox2), button, TRUE, TRUE, 0);
gtk_widget_show (button);
// buttons
button = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
gtk_widget_show (button);
vbox2 = gtk_hbox_new (FALSE, 10);
gtk_container_set_border_width (GTK_CONTAINER (vbox2), 10);
gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, TRUE, 0);
gtk_widget_show (vbox2);
button = gtk_button_new_with_label ("Disconnect");
g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (wizserv_areab2_clickdisconnect),NULL);
gtk_box_pack_start (GTK_BOX (vbox2), button, TRUE, TRUE, 0);
button = gtk_button_new_with_label ("Send");
g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (wizserv_areab2_clicksend), NULL);
gtk_box_pack_start (GTK_BOX (vbox2), button, TRUE, TRUE, 0);
if(window!=NULL)
gtk_container_add (GTK_CONTAINER (window), frame);
gtk_widget_show_all (frame);
return frame;
}
/* for area A1*/
GtkScrollCtrl wizserv_areaa1list={0,0,0};
guint areaa1_packetrownum=0;
gchar *wizserv_areaa1_defaulttitles[]=
{
"ID", "Date Time", "Length",
};
void wizserv_areaa1_selection( GtkWidget *clist,
gint row,
gint column,
GdkEventButton *event,
gpointer data )
{
static unsigned long lastid=0;
ClientDataInfo *retinsert=NULL;
if(row>=0)
{
retinsert= (ClientDataInfo *)gtk_clist_get_row_data (GTK_CLIST(clist), row);
if(retinsert!=NULL&&lastid!=retinsert->nID)
{
lastid=retinsert->nID;
/* set data to this areaa1*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -