📄 gtkphone.c
字号:
sprintf(txt,"%d.%d.%d.%d:%d",msg[0],msg[1],msg[2],msg[3], (msg[4]<<8)|msg[5]); sprintf(txt2,"%d.%d.%d.%d:%d",localaddr[0],localaddr[1], localaddr[2],localaddr[3],(localport[0]<<8)|localport[1]); printf("%-21s Local:%-21s: %s\n",txt,txt2,name); ChainInsert(userInfo,name,1); } if(!connected && tryingtocall && !strcmp(name,calling)) { if(!memcmp(publicaddr,myvisibleaddr,IPADDRSIZE)) { memcpy(&buddy.sin_addr.s_addr,localaddr,IPADDRSIZE); memcpy(&buddy.sin_port,localport,IPPORTSIZE); } else { memcpy(&buddy.sin_addr.s_addr,publicaddr,IPADDRSIZE); memcpy(&buddy.sin_port,publicport,IPPORTSIZE); } buddy.sin_family=AF_INET; talktries=0; /* * Add a timeout for sending a talk attempt * TALKTRYDELAY second timeout */ gtk_timeout_add((TALKTRYDELAY * 1000), sendtalk, NULL); } break; case CODE_SOUND: if(!connected) { printf("got some sound...\n"); if(talktries>=0 && !memcmp(&from->sin_addr.s_addr,&buddy.sin_addr.s_addr,IPADDRSIZE) && !memcmp(&from->sin_port,&buddy.sin_port,IPPORTSIZE)) { memcpy(&buddy,from,sizeof(buddy)); answer(); } else { mesg[0]=CODE_BYE; putmsg(from,mesg,1); break; } } if(size>3) { j=(msg[0]<<16) | (msg[1]<<8) | msg[2]; msg+=3; k=(msg[0]<<24) | (msg[1]<<16) | (msg[2]<<8) | msg[3]; msg+=4; lastdiff=gtime2()-k; k=(msg[0]<<24) | (msg[1]<<16) | (msg[2]<<8) | msg[3]; msg+=4; latency=lastdiff+k; if(j>incount) { incount=j; for(i=0;i<PACKETSTOPACK;++i) { unpack33to160(sndblock2,msg+i*33); writein+=block160size; j=writelimit-writeput; if(j>block160size) j=block160size; memcpy(writeput,sndblock2,j); writeput+=j; if(writeput==writelimit) { writeput=writefifo; if(j<block160size) { memcpy(writeput,sndblock2+j,block160size-j); writeput+=block160size-j; } } } } else { printf("Got packet with id %d, I've received up to %d\n",j,incount); } } break; case CODE_TALK: if(connected) break; mesg[1+MAXNAMESIZE]=0; printf("Received TALK from %s\n",mesg+1); gottalk=1; memcpy(&buddy,from,sizeof(buddy)); if(havedsp) { chime(); } else { opendsp(); chime(); closedsp(); } gtk_label_set_text(GTK_LABEL(popup_label),mesg+1); if (GTK_WIDGET_VISIBLE (popup_dlg)) { } else { gtk_widget_show(popup_dlg); } break; case CODE_BYE: if(!connected) break; if(memcmp(&buddy.sin_addr.s_addr,&from->sin_addr.s_addr,IPADDRSIZE)) break; if(memcmp(&buddy.sin_port,&from->sin_port,IPPORTSIZE)) break; closedsp(); connected=0; memset(&buddy,0,sizeof(buddy)); printf("Disconnected, received BYE\n"); break; case CODE_NAME: ChainInsert(userInfo,msg,0); break; case CODE_UNKNOWN: printf("Received a CODE_UNKNOWN from the matcher, which means your\n"); printf("email address identity is unknown to the server. Check your\n"); printf(".phonerc file.\n"); break; case CODE_EMPTY: printf("--Empty list--\n"); printf("Your contact list is empty. Add names to your contact list\n"); printf("and get them to add your name to theirs.\n"); break; case CODE_INVALID: printf("Server claims your password is invalid. Check your .phonerc\n"); printf("file and make sure you put in the pass line from the email\n"); printf("you should have received.\n"); break; case CODE_NOONE: printf("No one in your contact list is online\n"); break; }}int iswhite(int c){ return c==' ' || c=='\t' || c=='\n' || c=='\r';}void token(char *put,int len,char **take){ while(**take && iswhite(**take)) ++(*take); while(**take && !iswhite(**take) && len>1) { *put++=*(*take)++; --len; } *put=0;}void report(void) { int t; if(!havedsp || !connected) { printf("Not connected to anyone\n"); return; } t=gtime2(); printf("%9ld: msec dsp open\n",t-dspopentime); printf("%9ld: msec of sound data written to dsp\n",totalwritten>>3+1); printf("%9ld: msec of sound data read from dsp\n",totalread>>3+1); printf("%9ld: outcount\n",outcount); printf("%9ld: incount\n",incount); printf("%9ld: msec latency\n",latency); printf("%9d: msec writein\n",writein>> (block160size==160 ? 3 : 4));}void dobye() { if(!connected) return; printf("Sending BYE packet.\n"); mesg[0]=CODE_BYE; putmsg(&buddy,mesg,1); memset(&buddy,0,sizeof(buddy)); connected=0; if (GTK_WIDGET_VISIBLE (online_dlg)) { gtk_widget_hide(online_dlg); } else { } closedsp();}void processtyped(int com, char * data) { char *resolved; static char msg[20]; tryingtocall=0; /* * 1 - call * 2 - who * 3 - bye * 4 - info * 5 - alias * 6 - quit * 7 - answer * 8 - add * 9 - del * 10 - list */ switch (com) { case 1: if(connected) { printf("You're already connected. Use \"bye\" to disconnect.\n"); } else { tryingtocall=1; resolved=findalias(data); if(!resolved) resolved=data; printf("Trying to call %s\n",resolved); strcpy(calling,resolved); msg[0]=CODE_CALL; computehash(msg+1,resolved); messagetoserver(msg,9); } break; case 2: msg[0]=CODE_WHO; messagetoserver(msg,1); break; case 3: if(!connected) { printf("You're not connected.\n"); } else { dobye(); } break; case 4: report(); break; case 5: listaliases(); break; case 6: dobye(); unregisterme(); exitflag=1; break; case 7: if(gottalk) { answer(); } else { printf("You haven't received a TALK request.\n"); } break; case 8: resolved=findalias(data); if(!resolved) resolved=data; printf("Trying to add %s\n",resolved); msg[0]=CODE_ADD; computehash(msg+1,resolved); messagetoserver(msg,9); break; case 9: resolved=findalias(data); if(!resolved) resolved=data; printf("Trying to remove %s\n",resolved); msg[0]=CODE_REMOVE; computehash(msg+1,resolved); messagetoserver(msg,9); break; case 10: msg[0]=CODE_LIST; messagetoserver(msg,1); break; default: printf("Commands:\n"); printf("add <username> = add user to your contact list\n"); printf("alias = list aliases\n"); printf("answer = answer a TALK request\n"); printf("bye = disconnect call\n"); printf("call <username> = make call\n"); printf("del <username> = remove user from your contact list\n"); printf("info = print out some statistics\n"); printf("list = printout contact list\n"); printf("quit = quit out of program\n"); printf("who = query server for who in your contact list is online\n"); printf("---\n"); break; }}#define THRESHOLD (8<<8)int checkloud(unsigned char *p){int i,j,max,min; i=160; max=-5000; min=5000; while(i--) { j=*p++; j|=*p++<<8; if(j>=0x8000) j-=0x10000; if(j<min) min=j; if(j>max) max=j; } if(max-min>THRESHOLD) return 1; return 0;}void cchandler(int num){ signal(SIGINT,SIG_IGN);}#define VOL 0x20chime() { unsigned char buff[1024]; int i; if(!havedsp) return; if(block160size==160) { for(i=0;i<160;++i) if(i%40<20) buff[i]=0x80-VOL; else buff[i]=0x80+VOL; } else { for(i=0;i<160;++i) if(i%40<20) buff[i+i]=0,buff[i+i+1]=-VOL; else buff[i+i]=0,buff[i+i+1]=VOL; } for(i=0;i<8;++i) write(sndin,buff,block160size);}gint addToList(GtkWidget *widget, gpointer data) { GtkWidget * entry = data; char * text; text = gtk_entry_get_text(GTK_ENTRY(entry)); processtyped(8,text); gtk_timeout_add(500,updateList,NULL); return FALSE;}gint delFromList(GtkWidget *widget, gpointer data) { GtkWidget * entry = data; char * text; text = gtk_entry_get_text(GTK_ENTRY(entry)); processtyped(9,text); gtk_entry_set_text(GTK_ENTRY(entry),""); gtk_timeout_add(500,updateList,NULL); return FALSE;}gint acceptTypedData(GtkWidget *widget, gpointer data) { GtkWidget * entry = data; char * text; int len; text = gtk_entry_get_text(GTK_ENTRY(entry)); processtyped(1,text); gtk_entry_set_text(GTK_ENTRY(entry),""); return FALSE;}void addressBookEntrySelected( GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data ) { gchar *text; GtkWidget * entry = data; gtk_clist_get_text(GTK_CLIST(clist), row, 1, &text); gtk_entry_set_text(GTK_ENTRY(entry),text); return;}GtkWidget* create_online_popup (void) { GtkWidget *window2; GtkWidget *frame2; GtkWidget *vbox2; GtkWidget *label3; GtkWidget *label4; GtkWidget *hseparator2; GtkWidget *hbox2; GtkWidget *button3; window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (window2), "window2", window2); gtk_window_set_title (GTK_WINDOW (window2), _("window2")); gtk_window_set_policy (GTK_WINDOW (window2), TRUE, FALSE, TRUE); frame2 = gtk_frame_new (NULL); gtk_widget_ref (frame2); gtk_object_set_data_full (GTK_OBJECT (window2), "frame2", frame2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame2); gtk_container_add (GTK_CONTAINER (window2), frame2); vbox2 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox2); gtk_object_set_data_full (GTK_OBJECT (window2), "vbox2", vbox2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox2); gtk_container_add (GTK_CONTAINER (frame2), vbox2); gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8); label3 = gtk_label_new (_("Talk in progress")); gtk_widget_ref (label3); gtk_object_set_data_full (GTK_OBJECT (window2), "label3", label3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label3); gtk_box_pack_start (GTK_BOX (vbox2), label3, FALSE, FALSE, 0); label4 = gtk_label_new (_("Press button to End.")); gtk_widget_ref (label4); gtk_object_set_data_full (GTK_OBJECT (window2), "label4", label4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label4); gtk_box_pack_start (GTK_BOX (vbox2), label4, FALSE, FALSE, 3); hseparator2 = gtk_hseparator_new (); gtk_widget_ref (hseparator2); gtk_object_set_data_full (GTK_OBJECT (window2), "hseparator2", hseparator2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hseparator2); gtk_box_pack_start (GTK_BOX (vbox2), hseparator2, FALSE, FALSE, 3); hbox2 = gtk_hbox_new (TRUE, 8); gtk_widget_ref (hbox2); gtk_object_set_data_full (GTK_OBJECT (window2), "hbox2", hbox2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbox2); gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (hbox2), 3); button3 = gtk_button_new_with_label (_("End Talk")); gtk_widget_ref (button3); gtk_object_set_data_full (GTK_OBJECT (window2), "button3", button3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (button3); gtk_box_pack_start (GTK_BOX (hbox2), button3, FALSE, FALSE, 0); gtk_signal_connect(GTK_OBJECT(button3), "clicked", GTK_SIGNAL_FUNC(buttonEndConversation), NULL); return window2;}GtkWidget* create_incoming_popup (void) { GtkWidget *window1; GtkWidget *vbox1; GtkWidget *label1; GtkWidget *label2; GtkWidget *hseparator1; GtkWidget *hbox1; GtkWidget *frame1; GtkWidget *button1; GtkWidget *button2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -