/*********login.c***********/
#include<gtk/gtk.h>
#include<sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <termios.h>
#include <pthread.h>
#include "connectUDP.h"
#define MSGSIZE 255
#define MAXFRIENDS 20
typedef struct _message
{
char guestname[10];//用户名
char passwd[10];//用户密码
int flags; //1:注册信息2:登录验证信息3:退出信息 4:qun chat
//5:对服务器来说转发信息 ,对用户来说是好友发来聊天信息 7:修改密码
//6:对客户端来说,它是服务器发来的用户表更新的信息
char peername[10];//发送到用户的用户名
char meg[MSGSIZE+1];//发送的消息
}message;//定义一个信息类型。
int number;//记录下次更新前好友数。
int sss;
int msgno;
message newmessage[10];
int nn[10];
typedef struct _users//记录用户
{
GtkWidget *uname;//用户名
GtkWidget *pwd;//用户密码
}USERS;
char uname[10];//保存登陆用户名
char passwd[10];//保存登陆用户密码
int sock;//用来通信的套接字。
typedef struct _rusers//记录注册用户时信息
{
GtkWidget *uname;//用户名
GtkWidget *pwd;//用户密码
GtkWidget *okpwd;//确认密码
}RUSERS;
typedef struct _friend//记录注册用户时信息
{
char uname[10];//用户名
guint status;//在线状态.0不在线。1在线
}FRIEND;
typedef struct _friends//记录注册用户时信息
{
guint number;//好友个数。
FRIEND friend[MAXFRIENDS];//好友表。
}FRIENDS;
FRIENDS friends;//好友表。
GtkList *List;//好友列表控件。
int loginstatus;//标识登陆 是否成功的。
int exit_QQ;//记录方程是否退出的。退出置0,启动置1;
struct _thread_
{
GtkWidget *dialog;//聊天DIALOG。
guint status;//是否已开了聊天窗口,是则1,不是则0;
GtkWidget *output;//发送消息编辑框
GtkWidget *input;//消息显示列表控件。
message smsg;//聊天窗口对应发送信息变量。
}chat_thread[MAXFRIENDS];//好友聊天窗口信息。
struct _thread_ q_chat;
GtkWidget *main_dialog;//主界面窗口
GtkWidget *dstry;//保存要销毁dialog
GtkWidget *dstry1;//保存要销毁dialog
GtkWidget *dstry2;//保存要销毁dialog
gint quit(GtkWidget *widget,GdkEvent *event,gpointer data)
{
gtk_main_quit();
return FALSE;
}
void DialogOKClicked( GtkButton * button, gpointer data)
{
gtk_widget_destroy(GTK_WIDGET(data));
}
GtkWidget *AddWidget( GtkWidget *widget,GtkWidget *packingbox)
{
gtk_box_pack_start(GTK_BOX(packingbox),widget,FALSE,TRUE,10);
return widget;
}
void MessageBox(gchar *gtxt1, gchar *gtxt2)//一对话框的形式的提示信息
{
GtkWidget *dialogwindow;
GtkWidget *dialogwidget;
dialogwindow=gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dialogwindow),"提示信息");
gtk_container_set_border_width(GTK_CONTAINER(dialogwindow),15);
gtk_window_set_position(GTK_WINDOW(dialogwindow),GTK_WIN_POS_CENTER);
dialogwidget=AddWidget(gtk_label_new(gtxt1),GTK_DIALOG(dialogwindow)->vbox);
dialogwidget=AddWidget(gtk_label_new(gtxt2),GTK_DIALOG(dialogwindow)->vbox);
dialogwidget = AddWidget(gtk_button_new_with_label("确定"),GTK_DIALOG(dialogwindow)->action_area);
gtk_signal_connect(GTK_OBJECT(dialogwidget),"clicked",GTK_SIGNAL_FUNC(DialogOKClicked),dialogwindow);
gtk_signal_connect(GTK_OBJECT(dialogwidget),"destroy",GTK_SIGNAL_FUNC(quit),NULL);
dialogwidget = AddWidget(gtk_button_new_with_label("取消"),GTK_DIALOG(dialogwindow)->action_area);
gtk_signal_connect(GTK_OBJECT(dialogwidget),"clicked",GTK_SIGNAL_FUNC(DialogOKClicked),dialogwindow);
gtk_window_set_modal(GTK_WINDOW(dialogwindow),TRUE);
gtk_widget_show_all(dialogwindow);
gtk_main();
}
gint loginf(GtkWidget *login,USERS *user)
{
loginstatus=0;
if(strcmp(gtk_entry_get_text(GTK_ENTRY(((USERS *)user)->uname)),"") == 0 ||
strcmp(gtk_entry_get_text(GTK_ENTRY(((USERS *)user)->pwd)),"") == 0 )
{
MessageBox("用户名和密码不能为空","请重新登录!");
return -1;
}
strcpy(uname,gtk_entry_get_text(GTK_ENTRY(((USERS *)user)->uname)));
strcpy(passwd,gtk_entry_get_text(GTK_ENTRY(((USERS *)user)->pwd)));
///
message msg;
int len;
len=sizeof(message);
memset(&msg,0,len);
strcpy(msg.guestname,uname);
strcpy(msg.passwd,passwd);
msg.flags=2;
write(sock,(char *)&msg,len);
////
while(1)
{
if(loginstatus!=0)
break;
}
if(loginstatus==1)
{
gtk_widget_destroy(GTK_WIDGET(dstry));
g_print("进入聊天平台\n");
void maindialog();
maindialog();
}
return 0;
}
void registff(GtkWidget *regist,RUSERS *user)
{
if(strcmp(gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->uname)),"") == 0 ||
strcmp(gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->pwd)),"") == 0 ||
strcmp(gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->okpwd)),"") == 0)
{
MessageBox("用户名和密码及确认密码不能为空","请确认输入!");
return;
}
if(strcmp(gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->pwd)),gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->okpwd)) ) != 0)
{
MessageBox("密码与确认密码不一致","请确认输入!");
return;
}
////
message msg;
int len;
len=sizeof(message);
memset(&msg,0,len);
strcpy(msg.guestname,gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->uname)));
strcpy(msg.passwd,gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->pwd)));
msg.flags=1;
write(sock,(char *)&msg,len);
///
gtk_widget_destroy(GTK_WIDGET(dstry1));
}
void registing()
{
GtkWidget *wnd;
GtkWidget *table;
GtkWidget *entry;
RUSERS user;
GtkWidget *regist;
wnd=gtk_dialog_new();
dstry1=wnd;
gtk_window_set_title((GtkWindow *)wnd,"注册窗口");
gtk_window_set_default_size(GTK_WINDOW(wnd),200,180);
gtk_container_set_border_width(GTK_CONTAINER(wnd),15);
gtk_window_set_position(GTK_WINDOW(wnd),GTK_WIN_POS_CENTER);
table=gtk_table_new(4,2,TRUE);
gtk_container_add(GTK_BOX(GTK_DIALOG(wnd)->action_area),table);
entry = gtk_label_new("用户名:");
gtk_table_attach(GTK_TABLE(table),entry,0,1,0,1,GTK_FILL,GTK_FILL,0,0);
entry = gtk_label_new("输入密码:");
gtk_table_attach(GTK_TABLE(table),entry,0,1,1,2,GTK_FILL,GTK_FILL,0,0);
entry = gtk_label_new("再次输入密码:");
gtk_table_attach(GTK_TABLE(table),entry,0,1,2,3,GTK_FILL,GTK_FILL,0,0);
user.uname=gtk_entry_new_with_max_length(10);
gtk_table_attach(GTK_TABLE(table),user.uname,1,2,0,1,GTK_FILL,GTK_FILL,0,0);
user.pwd=gtk_entry_new_with_max_length(10);
gtk_entry_set_visibility(GTK_ENTRY(user.pwd),FALSE);
gtk_table_attach(GTK_TABLE(table),user.pwd,1,2,1,2,GTK_FILL,GTK_FILL,0,0);
user.okpwd=gtk_entry_new_with_max_length(10);
gtk_entry_set_visibility(GTK_ENTRY(user.okpwd),FALSE);
gtk_table_attach(GTK_TABLE(table),user.okpwd,1,2,2,3,GTK_FILL,GTK_FILL,0,0);
regist = gtk_button_new_with_label("注册");
gtk_table_attach_defaults(GTK_TABLE(table),regist,1,2,3,4);
g_signal_connect(G_OBJECT(regist),"clicked",G_CALLBACK(registff),&user);
g_signal_connect(G_OBJECT(wnd),"destroy",G_CALLBACK(quit),NULL);
gtk_widget_show_all(wnd);
gtk_main();
}
gint registf(GtkWidget *regist,USERS user)
{
registing();
return 0;
}
void uppwdff(GtkWidget *uppwd,RUSERS *user)
{
if(strcmp(gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->uname)),"") == 0 ||
strcmp(gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->pwd)),"") == 0 ||
strcmp(gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->okpwd)),"") == 0)
{
MessageBox("用户名和原密码及新密码不能为空","请确认输入!");
return;
}
if(strcmp(gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->pwd)),gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->okpwd)) ) == 0)
{
MessageBox("原密码与新密码一致","请确认输入!");
return;
}
message msg;
int len;
len=sizeof(message);
memset(&msg,0,len);
strcpy(msg.guestname,gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->uname)));
strcpy(msg.passwd,gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->pwd)));
strcpy(msg.peername,gtk_entry_get_text(GTK_ENTRY(((RUSERS *)user)->okpwd)));
msg.flags=7;
write(sock,(char *)&msg,len);
///
gtk_widget_destroy