• 沒有找到結果。

附錄 D 目錄與檔案結構 目錄與檔案結構 目錄與檔案結構 目錄與檔案結構

usr/ vm_client

附錄 附錄 附錄

附錄 D 目錄與檔案結構 目錄與檔案結構 目錄與檔案結構 目錄與檔案結構

vmc.sh autowl

bin/ nano-X

nanowm nxkbd proc/ (ram)

tmp/ (ram)

var/ (ram)

未來若有更新將可從以下網址取得。

 內容列表:

http://bbs.iecs.fcu.edu.tw/~ianstar/linux/94a/rootfs_list.doc

 Root File System(xhyper255B):

http://bbs.iecs.fcu.edu.tw/~ianstar/linux/94a/rootfs_xhyper255b.tar.bz2

 Root File System(x86):

http://bbs.iecs.fcu.edu.tw/~ianstar/linux/94a/rootfs_x86.tar.bz2

1 /* vm_client_net.c -*/

2

3 #include <pthread.h>

4 #include <sys/socket.h>

5 #include <netinet/in.h>

6 #include "vm_client.h"

7 #include <arpa/inet.h>

8 #include <netdb.h>

9 10

11 #define LINELEN 256

12 extern int Answer;

13 extern int Invite;

14 extern int Invited;

15 extern int Leave; /*1=leave action 2=leaving a message 3=geting message from server*/

16 extern int Cancel_voip_able; /*1=set can cancel voip */

17 extern int Next_message; /*use to play next message*/

18 extern int errno;

19 extern char *Host,*Service;

20

21 char Myname[20];

22

23 pthread_t Voip_thread_send,Voip_thread_receive,Receive_thread;

24 int Server_socket; /*server socket*/

25 int Address; /*to save another client's address*/

26 int Voip_port;

27 int Voip_socket;

28 short int IP_send; /*tell server ,ip had send*/

29 short int Get_ip; /*to client that server had got ip*/

30 short int prepare_voip;

31 struct sockaddr_in SIN;/* an Internet endpoint address */

32

33 int audio_init();

34 int audio_exit();

35 int rec(unsigned char *data, int size);

36 int play(unsigned char *data,int size);

37 int connectTCP(const char *host,const char *service);

38 int connectUDP(const char *host,const char *service);

39 int passiveUDP(const char *service);

40 int Send_Command(char *mgs );

41 void *start_voip(void *arg);

42 void *voip_send(void *arg);

43 void *voip_receive(void *arg);

44 void *receive_message(void *arg);/*get message(commamd) from server*/

45 void *leave_message(void *arg);

46 void *get_message(void *arg); /*get voice message*/

47 void *send_still_alive(void *);

48 void cancel_thread(pthread_t);

49 void get_address(void); /*get udp address and port*/

50 void cancel_voip(short int);

51 void cancel_leave_message(short int);

52 void play_message_file(void);/*play voice message file*/

53

54 int check_list(int mode,char *id);

55 void set_list(char *);

56 void add_list(int mode,char *id); /*mode 1= Online_list 2=Offline_list*/

57 void remove_list(int mode,char *id);/*mode 1= Online_list 2=Offline_list*/

58 void reflash_list(void);

59 void back_to_login(void); /*back to login windows*/

60 int check_friend(char *);/*check is your friend?*/

61 int add_friend(char *string);

62 void logout(short int);

63 void show_invite_window(char *);

64 void show_warning_message(char *string,int mode);

65 void close_warning_message(void);

66 int errexit(const char *format, ...);

67

68 /*---

69 * Connect_server - connect to server,send name and password

70 *---

71 */

72 int Connect_server(const char *host, const char *service,char

*account,char *password,int mode)

73 {

74 char temp[50],buf[LINELEN+1];

75 int res,count; /* socket descriptor, read count*/

76

77 Server_socket = connectTCP(host, service);/*connect server*/

78

86 sprintf(temp,"%s %s",account,password);

87

93 count=read(Server_socket, buf, LINELEN);

附錄 附錄 附錄

附錄 E Voice

Messenger v1.0 程式碼程式碼程式碼程式碼

94 buf[count]='\0';

102 res=pthread_create(&Receive_thread, NULL, receive_message,(void

*)Server_socket);

103 if(res != 0)

104 {

105 printf("Thread create failed!!!\n");

106 exit(1);

114 * receive_message - get message or get ip address from server

115 *---

116 */

117 void *receive_message(void *arg)

118 {

119 char buf[LINELEN+1],temp[50],*tok;

120 int count,res,sock;

121 struct in_addr add;

122 pthread_t start_thread;

123 pthread_t still_alive;

124

125 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);

126 if(res != 0)

127 {printf("Thread setcancelstste failed!!!\n");

128 exit(1);

129 }

130

131 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

132 if(res != 0)

133 {printf("Thread setcanceltype failed!!!\n");

134 exit(1);

145 puts(buf);/*show string "#list"*/

146

156 pthread_create(&still_alive, NULL,send_still_alive ,NULL);

157

168 show_warning_message("Server down!!!",1);

169 logout(0);/*server down mode */

195 reflash_list();

203 sprintf(temp,"%s invite you to talk,would like it?",tok);

204

228 pthread_create(&start_thread, NULL,start_voip ,NULL);

229 }

230 /*anthoer client not accept your invition*/

231 else if(strcmp(buf,"#accept")!=0 && Invite==1 && (!prepare_voip) )

238 else if(strcmp(buf,"#get_v_message")==0)

239 {

261 else if(strcmp(buf,"#stop_voip")==0 && Cancel_voip_able)

262 cancel_voip(1);

288 else if(strcmp(buf,"#get_message")==0)

289 {

290 show_invite_window("get message,would you like to get

it?");

291 Leave=3;

305 * send_still_alive - let server know you still online(alive)

306 *---

307 */

308 void *send_still_alive(void *arg)

309 {

310 int state=1;

311

312 while(state)

313 {

314 state=Send_Command("#still_alive");

315 sleep(60);

325 void set_list(char *input)

326 {

327 FILE *fp;

328 char buf[256],temp[50];

329 char *tok;

330

331 if(access("friend",R_OK)==0)

332 {

333 fp=fopen("friend","r");

334 while(fgets(buf,256,fp))

335 {

336 sscanf(buf,"%s\n",temp);

337 if(((check_list(2,temp))==-1) && ((check_list(1,temp))==-1))

338 {

369 int check_friend(char *list)

370 {

371 FILE *fp;

372 char buf[256],temp[50];

373 int count=0;

374

375 if(access("friend",R_OK)==0)

376 {

392 return 1;

402 int add_friend(char *string)

403 {

404 FILE *fp;

405 char buf[LINELEN+1];

406 strcpy(buf,string);

407

421 * Send_Command - send command(message) to server

422 *---

423 */

424 int Send_Command(char *mgs )

425 {

444 void *start_voip(void *arg)

445 {

451 pthread_create(&Voip_thread_send, NULL,voip_send ,NULL);

452 pthread_create(&Voip_thread_receive, NULL,voip_receive ,NULL);

453

454 Cancel_voip_able=1;

455 show_warning_message("Talking...",2);

456

463 void get_address(void)

464 {

465 char *service = "7777"; /* default service name */

466 struct hostent *phe;/* pointer to host information entry */

467 struct sockaddr_in sin; * an Internet endpoint address */

468 char buf[50];

469

470 /*connect server*/

471 Voip_socket = socket(AF_INET ,SOCK_DGRAM ,0);

472 sin.sin_family = AF_INET ;

473 sin.sin_port = htons((u_short)atoi(service));

474

475 if ( (phe = gethostbyname(Host)) )

476 memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);

477 else if ( (sin.sin_addr.s_addr = inet_addr(Host)) == INADDR_NONE )

478 errexit("can't get \"%s\" host entry\n", Host);

479

480 /*send message to server,so server can get NAT's ip and port*/

481 sprintf(buf,"%s",Myname);

482 printf("sending...\n");

483

484 while(1)

485 {

486 sendto(Voip_socket,buf, sizeof(buf), 0, (struct sockaddr *)&sin, sizeof(sin));

493 puts("waiting for ip");

500 printf("Start VOIP\n");

501

508 void *voip_send(void *arg)

509 {

510 unsigned char buf[BUFSIZE];

511 int res;

512

513 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);

514 if(res != 0)

515 {printf("Thread setcancelstste failed!!!\n");

516 exit(1);

517 }

518

519 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

520 if(res != 0)

521 {printf("Thread setcanceltype failed!!!\n");

522 exit(1);

523 }

524

525 SIN.sin_addr.s_addr=htonl(Address);/*covert to network address

format*/

526 SIN.sin_port=htons(Voip_port);

527

528 while(1)

529 {rec(buf, BUFSIZE);

530 sendto(Voip_socket, buf, sizeof(buf), 0, (struct sockaddr *)&SIN, sizeof(SIN));

541 void *voip_receive(void *arg)

542 {

547 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);

548 if(res != 0)

549 {printf("Thread setcancelstste failed!!!\n");

550 exit(1);

551 }

552

553 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

554 if(res != 0)

555 {printf("Thread setcanceltype failed!!!\n");

556 exit(1);

563 n=recvfrom(Voip_socket, buf, sizeof(buf), 0, (struct sockaddr *)&SIN, &alen);

575 void *leave_message(void *arg)

576 {

577 unsigned char buf[BUFSIZE];

578 char *service = "9855";

579 int res;

580

581 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);

582 if(res != 0)

583 {printf("Thread setcancelstste failed!!!\n");

584 exit(1);

585 }

586

587 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

588 if(res != 0)

589 {printf("Thread setcanceltype failed!!!\n");

590 exit(1);

591 }

592

593 audio_init();

594

595 Voip_socket=connectUDP(Host,service);

596

610 void *get_message(void *arg)

611 {

612 char *service = "8885"; /* default service name */

613 struct hostent *phe;/* pointer to host information entry */

614 struct sockaddr_in sin; /* an Internet endpoint address */

615 unsigned char buf[BUFSIZE];

616 char temp[100],me[50],size[50];

617 int alen,sock,n,sum;

618 FILE *fp;

619

620 /*connect server*/

621 sock = socket(AF_INET ,SOCK_DGRAM ,0);

622 sin.sin_family = AF_INET ;

623 sin.sin_port = htons((u_short)atoi(service));

624

625 if ( (phe = gethostbyname(Host)) )

626 memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);

627 else if ( (sin.sin_addr.s_addr = inet_addr(Host)) == INADDR_NONE )

628 errexit("can't get \"%s\" host entry\n", Host);

629

630 /*send message to server,so server can get NAT's ip and port*/

631 sprintf(temp,"%s",Myname);

632 printf("sending...\n");

633

634 while(1)

635 {

636 sendto(sock,temp, sizeof(temp), 0, (struct sockaddr *)&sin, sizeof(sin));

645 printf("get message\n");

646 n=recvfrom(sock,temp, sizeof(temp), 0, (struct sockaddr

*)&sin,&alen);

647 temp[n]='\0';

648

649 show_warning_message("Downloading...",3);

650

651 while(strcmp(temp,"#end")!=0)

652 {

658 fp=fopen("messagelog","a");

659 fprintf(fp,"%s %s\n",me,size);

660 fclose(fp);

661

662 sum=0;

663

664 fp=fopen(me,"a");/*get message*/

665 while(strcmp(buf,"#message end")!=0 || (sum-BUFSIZE)== atoi(size))

666 {

681 close_warning_message();

682 puts("download ok");

683 show_warning_message("download complete!!",1);

684

685 close(sock);

686

687 play_message_file();

688

689 pthread_exit(NULL);

690 }

691 /*---

692 * play_message_file - message file from disk

693 *---

694 */

695 void play_message_file(void)

696 {

697 unsigned char buf[BUFSIZE];

698 char temp[50],filename[50],size[50];

699 int sleeptime,bps;

705 fplog=fopen("messagelog","r");

706

707 while(fgets(temp,256,fplog))

708 {

709 sscanf(temp,"%s %s\n",filename,size);

710

711 close_warning_message();

712 show_warning_message(filename,3);

713

722 sleeptime= atoi(size)/bps;/*wait for sound I/O complete*/

723 printf("Sleep time : %d\n",sleeptime);

724 usleep(1000000*sleeptime);

725

726 close_warning_message();

727 show_warning_message("Next message",1);

728

742 remove("messagelog");

743

744 Leave=0;

745 close_warning_message();

746 show_warning_message("No next message",1);

747

755 void cancel_thread(pthread_t thread)

756 {

757 int res;

758 res=pthread_cancel(thread);

759 if(res != 0)

770 void cancel_voip(short int mode)

771 {

772 /*stop voip*/

773 if(mode)

774 Send_Command("#stop_voip");

775

776 close_warning_message();

777 show_warning_message("Stop talking",1);

778

779 cancel_thread(Voip_thread_send);

780 cancel_thread(Voip_thread_receive);

781 audio_exit();

790 /*---

791 * cancel_leave_message

792 *---

793 */

794 void cancel_leave_message(short int mode)

795 {

796 /*stop leave a message*/

797 if(mode)

798 Send_Command("#stop_leave_message");

799

800 close_warning_message();

801 show_warning_message("Stop leave a message",1);

802

803 cancel_thread(Voip_thread_send);

804 audio_exit();

805 Leave=0;

806 close(Voip_socket);

807 printf("message socket stop\n");

808

815 void logout(short int mode )

816 {

817 if(Cancel_voip_able)

818 cancel_voip(mode);

824 Send_Command("#bye");

825

826 cancel_thread(Receive_thread);

827

828 close(Server_socket);

829

2 #include "nxcolors.h"

3 #include "vm_client.h"

4 #include <signal.h>

5

6 GR_WINDOW_ID Tablew;

7 GR_WINDOW_ID Loginw, EnterAw, EnterPw, Addw, EnterCw, Addbw;

8 GR_WINDOW_ID Loginbw, Tool1w, Tool2w, Tool3w, Listw, Onlinew,

Offlinew;

9 GR_WINDOW_ID AddbAw, AddbMw, ViewIMw, ViewIMbw, Invitew, InvitebYw, InvitebNw;

10 GR_WINDOW_ID PCMw, PCMupbw, PCMdownbw, MICw, MICupbw, MICdownbw;

11 GR_GC_ID Gc, Gck, Gcw, Gcg;

12 GR_EVENT Event;

13 GR_COORD Begxpos;

14 GR_COORD Xpos, Xposp;

15 GR_COORD Ypos;

16 GR_IMAGE_INFO Table_skin_info, Login_skin_info, List_skin_info;

17 GR_IMAGE_ID Table_skin_id, Login_skin_id, List_skin_id;

18

19 Member_list Online_list[Maxlist], Offline_list[Maxlist];

20

31 int Next_message;

32 char *Host, *Service;

33

34 int Connect_server(const char *host, const char *service,char

*account,char *password,int mode);

35 void init_windows(void);

36 void do_keystroke(GR_EVENT_KEYSTROKE *kp);

37 void do_exposure(GR_EVENT_EXPOSURE *ep);

38 void do_buttondown(GR_EVENT_BUTTON *bp);

39 void do_buttonup(GR_EVENT_BUTTON *bp);

40 void show_warning_message(char *string,int mode);

41 int add_friend(char *string);

42 void back_to_login(void);

43

44 void Clean_windows(GR_WINDOW_ID wid);

45 void show_invite_window(char *);

46 void close_warning_message(void);

47 int check_list(int mode,char *id);

48 void add_list(int mode,char *id); /*mode 1= Online_list

2=Offline_list*/

49 void remove_list(int mode,char *id);/*mode 1= Online_list

2=Offline_list*/

50 void clean_list(void);

51 void reflash_list(void);

52 void Send_Command(char *mgs );

53 void reflash_sound_state(int p,int m);

54 void cancel_voip(short int);

55 void cancel_leave_message(short int);

56 void logout(short int);

57

63 int main(int argc, char *argv[])

64 {

78 fprintf(stderr, "usage: voipclient [host [port]]\n");

79 exit(1);

86 GrGetNextEvent(&Event);

87 switch(Event.type)

88 {

89 case GR_EVENT_TYPE_EXPOSURE :

90 do_exposure(&Event.exposure);

91 break;

92 case GR_EVENT_TYPE_BUTTON_DOWN :

93 do_buttondown(&Event.button);

94 break;

95 case GR_EVENT_TYPE_BUTTON_UP :

96 do_buttonup(&Event.button);

97 break;

98 case GR_EVENT_TYPE_MOUSE_POSITION :

99 break;

100 case GR_EVENT_TYPE_KEY_DOWN :

101 do_keystroke(&Event.keystroke);

102 break;

113 * init_windows - init microwindows

114 *---

115 */

116 void init_windows(void)

117 {

128 GrSetGCUseBackground(Gc, GR_FALSE);

129 GrSetGCForeground(Gc, GR_COLOR_BLACK);

130 GrSetGCForeground(Gck, GR_COLOR_BLACK);

131 GrSetGCBackground(Gck, GR_COLOR_WHITE);

132 GrSetGCForeground(Gcw, GR_COLOR_WHITE);

133 GrSetGCBackground(Gcw, GR_COLOR_WHITE);

134 GrSetGCForeground(Gcg, GR_COLOR_SLATEBLUE);

135

136 /*load Image*/

137 Table_skin_id=GrLoadImageFromFile("./skin/table.gif", 0);

138 GrGetImageInfo( Table_skin_id, &Table_skin_info);

139

140 Login_skin_id=GrLoadImageFromFile("./skin/login.gif", 0);

141 GrGetImageInfo( Login_skin_id, &Login_skin_info);

142

143 List_skin_id=GrLoadImageFromFile("./skin/list.gif", 0);

144 GrGetImageInfo( List_skin_id, &List_skin_info);

145

146 /*create table window*/

147 Tablew = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE

148 | GR_WM_PROPS_NODECORATE, NULL,GR_ROOT_WINDOW_ID, 0, 0, 640, 480,

149 GR_COLOR_LIGHTSKYBLUE);

150

151 /*create tool button*/

152 Tool1w =GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE |

153 GR_WM_PROPS_NODECORATE , NULL,GR_ROOT_WINDOW_ID, 60, 0, 60, 30,

154 GR_COLOR_WHITE);

155

156 Tool2w =GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE |

157 GR_WM_PROPS_NODECORATE, NULL,GR_ROOT_WINDOW_ID, 60, 0, 60, 30,

158 GR_COLOR_WHITE);

159

160 Tool3w =GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE |

161 GR_WM_PROPS_NODECORATE, NULL,GR_ROOT_WINDOW_ID, 125, 0, 60, 30,

162 GR_COLOR_WHITE);

163

164 /*create list window*/

165 Listw = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE

166 | GR_WM_PROPS_NODECORATE, "List", GR_ROOT_WINDOW_ID, 60, 30, 250,

167 300,GR_COLOR_WHITE);

168

169 Offlinew = GrNewWindow(Listw, 14, 25, 102, 160, 2, GR_COLOR_PINK,

170 GR_COLOR_RED);

171 Offline_list[0].Wid = GrNewWindow(Offlinew, 10, 10, 80, 20, 0,

GR_COLOR_GREY, 0);

172 Offline_list[1].Wid = GrNewWindow(Offlinew, 10, 40, 80, 20, 0,

GR_COLOR_GREY, 0);

173 Offline_list[2].Wid = GrNewWindow(Offlinew, 10, 70, 80, 20, 0,

GR_COLOR_GREY, 0);

174 Offline_list[3].Wid = GrNewWindow(Offlinew, 10, 100, 80, 20, 0,

GR_COLOR_GREY, 0);

175 Offline_list[4].Wid = GrNewWindow(Offlinew, 10, 130, 80, 20, 0,

GR_COLOR_GREY, 0);

176

177 Onlinew = GrNewWindow(Listw, 132, 25, 102, 160, 2, GR_COLOR_LIGHTSTEELBLUE, GR_COLOR_BLUE);

178 Online_list[0].Wid = GrNewWindow(Onlinew, 10, 10, 80, 20, 0,

GR_COLOR_GREY, 0);

179 Online_list[1].Wid = GrNewWindow(Onlinew, 10, 40, 80, 20, 0,

GR_COLOR_GREY, 0);

180 Online_list[2].Wid = GrNewWindow(Onlinew, 10, 70, 80, 20, 0,

GR_COLOR_GREY, 0);

181 Online_list[3].Wid = GrNewWindow(Onlinew, 10, 100, 80, 20, 0,

GR_COLOR_GREY, 0);

182 Online_list[4].Wid = GrNewWindow(Onlinew, 10, 130, 80, 20, 0,

GR_COLOR_GREY, 0);

183

184 AddbMw = GrNewWindow(Listw, 160, 260, 80, 25, 0, GR_COLOR_ORANGE2,

0);

185

186 PCMw = GrNewWindow(Listw, 36, 220, 70, 15, 0, GR_COLOR_WHITE, 0);

187 PCMdownbw = GrNewWindow(Listw, 21, 220, 15, 15, 0, GR_COLOR_SLATEBLUE,

0);

188 PCMupbw = GrNewWindow(Listw, 93, 220, 15, 15, 0, GR_COLOR_SLATEBLUE,

0);

189

190 MICw = GrNewWindow(Listw, 155, 220, 70, 15, 0, GR_COLOR_WHITE, 0);

191 MICdownbw = GrNewWindow(Listw, 140, 220, 15, 15, 0,

GR_COLOR_SLATEBLUE, 0);

192 MICupbw = GrNewWindow(Listw, 211, 220, 15, 15, 0, GR_COLOR_SLATEBLUE,

0);

193

194 /*create login window*/

195 Loginw = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE

196 | GR_WM_PROPS_NODECORATE, "Login", GR_ROOT_WINDOW_ID, 60, 30, 250, 300,GR_COLOR_WHITE);

197

198 Loginbw = GrNewWindow(Loginw,100, 170, 60, 30, 0,

GR_COLOR_LIGHTSALMON, 0);

199 AddbAw = GrNewWindow(Loginw, 159, 260, 80, 25, 0, GR_COLOR_MEDIUMSEAGREEN, 0);

200

201 EnterAw = GrNewWindow(Loginw, 120, 70, 100, 15, 2, GR_COLOR_WHITE,

GR_COLOR_BLACK);

202 EnterPw = GrNewWindow(Loginw, 120, 110, 100, 15, 2, GR_COLOR_WHITE,

GR_COLOR_BLACK);

203

204 /*create IM window*/

205 ViewIMw = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE

206 | GR_WM_PROPS_NODECORATE, "View", GR_ROOT_WINDOW_ID, 320,100 , 250,

207 90, GR_COLOR_LIGHTSTEELBLUE);

208

209 ViewIMbw = GrNewWindow(ViewIMw, 175, 45, 60, 30, 0, GR_COLOR_GRAY,

0);

210

211 /*create Add_Member window*/

212 Addw = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE |

213 GR_WM_PROPS_NODECORATE, "Add", GR_ROOT_WINDOW_ID, 320, 5, 250, 90,

214 GR_COLOR_LIGHTSTEELBLUE);

215

216 EnterCw = GrNewWindow(Addw, 90, 19, 100, 15, 2, GR_COLOR_WHITE,

GR_COLOR_BLACK);

217

218 Addbw = GrNewWindow(Addw, 175, 45, 60, 30, 0, GR_COLOR_GRAY, 0);

219

220 /*create Invite window*/

221 Invitew = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE

222 | GR_WM_PROPS_NODECORATE , "Invitew", GR_ROOT_WINDOW_ID, 320, 100,

223 250,90, GR_COLOR_LIGHTSTEELBLUE);

224

225 InvitebYw = GrNewWindow(Invitew, 110, 45, 60, 30, 0, GR_COLOR_GRAY, 0);

226 InvitebNw = GrNewWindow(Invitew, 175, 45, 60, 30, 0, GR_COLOR_GRAY, 0);

227

228

229 /*select events for every windows*/

230 GrSelectEvents(Tablew, GR_EVENT_MASK_EXPOSURE );

231 GrSelectEvents(Loginw, GR_EVENT_MASK_EXPOSURE );

232 GrSelectEvents(Listw, GR_EVENT_MASK_EXPOSURE );

233 GrSelectEvents(Offlinew, GR_EVENT_MASK_EXPOSURE );

234 GrSelectEvents(Onlinew, GR_EVENT_MASK_EXPOSURE );

235 GrSelectEvents(ViewIMw, GR_EVENT_MASK_EXPOSURE );

236 GrSelectEvents(Addw, GR_EVENT_MASK_EXPOSURE );

237 GrSelectEvents(Invitew, GR_EVENT_MASK_EXPOSURE );

238 GrSelectEvents(PCMw, GR_EVENT_MASK_EXPOSURE );

239 GrSelectEvents(MICw, GR_EVENT_MASK_EXPOSURE );

240

241 GrSelectEvents(ViewIMbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

242 GrSelectEvents(Addbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

243 GrSelectEvents(Loginbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

244 GrSelectEvents(InvitebYw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

245 GrSelectEvents(InvitebNw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

246

247 GrSelectEvents(AddbAw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

248 GrSelectEvents(AddbMw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

249 GrSelectEvents(PCMupbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

250 GrSelectEvents(PCMdownbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

251 GrSelectEvents(MICupbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

252 GrSelectEvents(MICdownbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

253

254 GrSelectEvents(Offline_list[0].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN | GR_EVENT_MASK_BUTTON_UP);

255 GrSelectEvents(Offline_list[1].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

256 GrSelectEvents(Offline_list[2].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

257 GrSelectEvents(Offline_list[3].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

258 GrSelectEvents(Offline_list[4].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

259

260 GrSelectEvents(Online_list[0].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

261 GrSelectEvents(Online_list[1].Wid, GR_EVENT_MASK_EXPOSURE |

GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

262 GrSelectEvents(Online_list[2].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

263 GrSelectEvents(Online_list[3].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

264 GrSelectEvents(Online_list[4].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

265

266 GrSelectEvents(EnterAw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN | GR_EVENT_MASK_BUTTON_UP | GR_EVENT_MASK_MOUSE_POSITION | GR_EVENT_MASK_KEY_DOWN

267 );

268 GrSelectEvents(EnterPw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP | GR_EVENT_MASK_MOUSE_POSITION | GR_EVENT_MASK_KEY_DOWN

269 );

270 GrSelectEvents(EnterCw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP | GR_EVENT_MASK_MOUSE_POSITION | GR_EVENT_MASK_KEY_DOWN

271 );

272

273 GrSelectEvents(Tool1w, GR_EVENT_MASK_EXPOSURE);

274 GrSelectEvents(Tool2w, GR_EVENT_MASK_EXPOSURE);

275 GrSelectEvents(Tool3w, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);

276

277 GrMapWindow(Tablew);

278 GrMapWindow(Loginw);

279 GrMapWindow(Loginbw);

280 GrMapWindow(AddbAw);

281 GrMapWindow(EnterAw);

282 GrMapWindow(EnterPw);

283 GrMapWindow(Tool1w);

284

302 void do_exposure(GR_EVENT_EXPOSURE *ep)

303 {

304 if(ep->wid == Tablew)

305 {

306 GrDrawImageToFit( Tablew, Gc, 0, 0, Table_skin_info.width, Table_skin_info.height, Table_skin_id);

307 }

308 if(ep->wid == Loginw)

309 {

310 GrText(Loginw, Gc, 60, 80, "Account:", -1 , GR_TFASCII);

311 GrText(Loginw, Gc, 60, 120, "Password:", -1, GR_TFASCII);

312

313 GrDrawImageToFit(Loginw,Gc,0,0,Login_skin_info.width,Login_skin_i nfo.height,Login_skin_id);

314

329 GrDrawImageToFit(Listw,Gc,0,0,List_skin_info.width,List_skin_info

330 .height,List_skin_id);

347 //GrText(ViewIMbw, Gc, 19, 20, "Stop",-1, GR_TFASCII);

348 GrLine(ViewIMbw, Gcw, 0, 0, 59, 0);

355 GrText(Loginbw, Gc, 14, 20, "LOGIN",-1, GR_TFASCII);

356 GrLine(Loginbw, Gcw, 0, 0, 59, 0);

363 GrText(AddbAw, Gc, 7, 17, "Add Account",-1, GR_TFASCII);

364 GrLine(AddbAw, Gcw, 0, 0, 79, 0);

378 GrText(InvitebYw, Gc, 20, 20, "Yes",-1, GR_TFASCII);

379 GrLine(InvitebYw, Gcw, 0, 0, 59, 0);

386 GrText(InvitebNw, Gc, 22, 20, "No",-1, GR_TFASCII);

387 GrLine(InvitebNw, Gcw, 0, 0, 59, 0);

399 if(ep->wid == Offline_list[1].Wid)

400 {

401 GrLine(Offline_list[1].Wid, Gcw, 0, 0, 79, 0);

402 GrLine(Offline_list[1].Wid, Gcw, 0, 0, 0, 19);

403 GrLine(Offline_list[1].Wid, Gc, 79, 0, 79, 19);

404 GrLine(Offline_list[1].Wid, Gc, 0, 19, 79, 19);

405 }

406 if(ep->wid == Offline_list[2].Wid)

407 {

413 if(ep->wid == Offline_list[3].Wid)

414 {

420 if(ep->wid == Offline_list[4].Wid)

421 {

427 if(ep->wid == Online_list[0].Wid)

428 {

434 if(ep->wid == Online_list[1].Wid)

435 {

441 if(ep->wid == Online_list[2].Wid)

442 {

448 if(ep->wid == Online_list[3].Wid)

449 {

455 if(ep->wid == Online_list[4].Wid)

456 {

480 GrText(Addw, Gc, 15, 30, "Member's ID:",-1, GR_TFASCII);

481 GrLine(Addw, Gc, 0, 0, 249, 0);

496 GrText(Tool1w, Gc, 16, 20, "Login",-1, GR_TFASCII);

497 GrLine(Tool1w, Gc, 0, 0, 59, 0);

503 GrText(Tool2w, Gc, 22, 20, "List",-1, GR_TFASCII);

504 GrLine(Tool2w, Gc, 0, 0, 59, 0);

510 GrText(Tool3w, Gc, 22, 20, "Exit",-1, GR_TFASCII);

511 GrLine(Tool3w, Gc, 0, 0, 59, 0);

521 * do_buttondown - deal with buttondown Event

522 *---

523 */

524 void do_buttondown(GR_EVENT_BUTTON *bp)

525 {

569 if(bp->wid == Offline_list[0].Wid)

570 {

576 if(bp->wid == Offline_list[1].Wid)

577 {

583 if(bp->wid == Offline_list[2].Wid)

584 {

590 if(bp->wid == Offline_list[3].Wid)

591 {

597 if(bp->wid == Offline_list[4].Wid)

598 {

604 if(bp->wid == Online_list[0].Wid)

605 {

606 GrLine(Online_list[0].Wid, Gc, 0, 0, 79, 0);

607 GrLine(Online_list[0].Wid, Gc, 0, 0, 0, 19);

608 GrLine(Online_list[0].Wid, Gcw, 79, 0, 79, 19);

609 GrLine(Online_list[0].Wid, Gcw, 0, 19, 79, 19);

610 }

611 if(bp->wid == Online_list[1].Wid)

612 {

618 if(bp->wid == Online_list[2].Wid)

619 {

625 if(bp->wid == Online_list[3].Wid)

626 {

632 if(bp->wid == Online_list[4].Wid)

633 {

663 reflash_sound_state(10,0);

664 }

665 if(bp->wid == PCMdownbw)

666 {

667 //if(vol_p!=0)

668 if(vol_v!=0)

669 reflash_sound_state(-10,0);

670 }

671 if(bp->wid == MICupbw)

672 {

673 if(vol_m!=100)

674 reflash_sound_state(0,10);

675 }

676 if(bp->wid == MICdownbw)

677 {

678 if(vol_m!=0)

679 reflash_sound_state(0,-10);

680 }

681 }

682

683 /*---

684 * do_buttonup - deal with buttonup Event

685 *---

686 */

687 void do_buttonup(GR_EVENT_BUTTON *bp)

688 { int i;

708 if(Leave==2)

724 printf("%s %s\n",Account,Password);

725 if(!(Count==0 || Countp==0))

726 {

727 if(Connect_server(Host, Service,Account,Password,0)==0)

728 {

735 GrMapWindow(Offline_list[0].Wid);

736 GrMapWindow(Offline_list[1].Wid);

737 GrMapWindow(Offline_list[2].Wid);

738 GrMapWindow(Offline_list[3].Wid);

739 GrMapWindow(Offline_list[4].Wid);

740 GrMapWindow(Online_list[0].Wid);

741 GrMapWindow(Online_list[1].Wid);

742 GrMapWindow(Online_list[2].Wid);

743 GrMapWindow(Online_list[3].Wid);

744 GrMapWindow(Online_list[4].Wid);

745 GrMapWindow(Onlinew);

754 reflash_sound_state(0,0);

755 }

756 else

757 {

758 show_warning_message("Please check account and password

again!!",1);

781 if(Connect_server(Host, Service,Account,Password,1)==0)

782 {

789 GrMapWindow(Offline_list[0].Wid);

790 GrMapWindow(Offline_list[1].Wid);

791 GrMapWindow(Offline_list[2].Wid);

792 GrMapWindow(Offline_list[3].Wid);

793 GrMapWindow(Offline_list[4].Wid);

794 GrMapWindow(Online_list[0].Wid);

795 GrMapWindow(Online_list[1].Wid);

796 GrMapWindow(Online_list[2].Wid);

797 GrMapWindow(Online_list[3].Wid);

798 GrMapWindow(Online_list[4].Wid);

799 GrMapWindow(Onlinew);

808 reflash_sound_state(0,0);

809 }

810 else

811 {

812 show_warning_message("Please check account and password

again!!",1);

839 Send_Command("#listen_message");

840 Leave=4; %s",Offline_list[i].MemberID);

875 Send_Command(buf);

876

877 Leave=1;

878

879 sprintf(buf,"leave a message to

%s ...",Offline_list[i].MemberID);

880 show_warning_message(buf,3);

%s ...",Online_list[i].MemberID);

904 show_warning_message(buf,3);

905

937 show_warning_message("Already had this friend",1);

938 else

939 {

940 show_warning_message("Add friend ok!!",1);

941 Send_Command("#who");

956 * do_keystroke - deal with keyin Event

957 *---

958 */

959 void do_keystroke(GR_EVENT_KEYSTROKE *kp)

960 {

986 GrGetGCTextSize(Gc, &kp->ch, 1, GR_TFASCII, &width, &height, &base);

987

1006

1007 if(fwin!=EnterPw)

1008 GrText(fwin, Gck, *xpos, Ypos+base, &kp->ch, 1, 0);

1009 else

1020 * show_invite_window

1021 *---

1022 */

1023 void show_invite_window(char *string)

1024 {

1025 GrMapWindow(Invitew);

1026 GrMapWindow(InvitebYw);

1027 GrMapWindow(InvitebNw);

1028

1029 GrText(Invitew, Gc, 10, 20,string,-1, GR_TFASCII);

1030 GrFlush();

1031 }

1032

1033 /*---

1034 * show_warning_message

1035 *---

1036 */

1037 void show_warning_message(char *string,int mode)

1038 {

1039 GrMapWindow(ViewIMw);

1040 if(mode!=3)

1041 GrMapWindow(ViewIMbw);

1042

1043 if(mode==1)

1044 GrText(ViewIMbw, Gc, 19, 20, "OK",-1, GR_TFASCII);

1045 else if(mode==2)

1046 GrText(ViewIMbw, Gc, 19, 20, "Stop",-1, GR_TFASCII);

1047

1056 void close_warning_message(void)

1057 { Clean_windows(ViewIMw);

1058 GrUnmapWindow(ViewIMw);

1059 GrUnmapWindow(ViewIMbw);

1060 GrFlush();

1067 void Clean_windows(GR_WINDOW_ID wid)

1068 {

1077 void back_to_login(void)

1078 {

1079 GrUnmapWindow(Tool2w);

1080 GrUnmapWindow(Tool3w);

1081 GrUnmapWindow(Listw);

1082 GrUnmapWindow(Addw);

1083 GrUnmapWindow(ViewIMw);

1084 GrUnmapWindow(Invitew);

1085 GrMapWindow(Tool1w);

1102 void add_list(int mode,char *id) /*mode 1= Online_list

2=Offline_list*/

1103 {

1104 int i;

1105

1106 if(mode==1)

1107 {

1108 for(i=0;i<Maxlist;i++)

1109 {

1110 if(strcmp(Online_list[i].MemberID,"")==0)

1111 {

1121 if(strcmp(Offline_list[i].MemberID,"")==0)

1122 {

1132 * remove_list - remove id from online or offline list

1133 *---

1134 */

1135 void remove_list(int mode,char *id)

1136 { int i;

1144 strcpy(Online_list[i].MemberID,"");

1145 return;

1146 }

1147

1148 for(i=i+1;i<Maxlist;i++)

1149 strcpy(Online_list[i-1].MemberID,Online_list[i].MemberID);

1150 }

1157 strcpy(Offline_list[i].MemberID,"");

1158 return;

1159 }

1160

1161 for(i=i+1;i<Maxlist;i++)

1162 strcpy(Offline_list[i-1].MemberID,Offline_list[i].MemberID);

1163 }

1164

1165 }

1166 /*---

1167 * clean_list - reflash online and offline list

1168 *---

1169 */

1170 void clean_list(void)

1171 {

1172 int i;

1173 for(i=0;i<Maxlist;i++)

1174 {

1175 strcpy(Online_list[i].MemberID,"");

1176 strcpy(Offline_list[i].MemberID,"");

1177 }

1185 int check_list(int mode,char *id)

1186 {

1198 if(strcmp(Offline_list[i].MemberID,id)==0)

1199 return i;

1205 * reflash_list - reflash online and offline list

1206 *---

1207 */

1208 void reflash_list(void)

1209 { int i;

1210

1211 for(i=0;i<Maxlist;i++)

1212 Clean_windows(Online_list[i].Wid);

1213

1214 for(i=0;i<Maxlist;i++)

1215 if(strcmp(Online_list[i].MemberID,"")!=0)

1216 GrText(Online_list[i].Wid, Gc, 7, 14,

Online_list[i].MemberID,-1, GR_TFASCII);

1217

1218 for(i=0;i<Maxlist;i++)

1219 Clean_windows(Offline_list[i].Wid);

1220

1221 for(i=0;i<Maxlist;i++)

1222 if(strcmp(Offline_list[i].MemberID,"")!=0)

1223 GrText(Offline_list[i].Wid, Gc, 7, 14, Offline_list[i].MemberID,-1, GR_TFASCII);

1224

1232 void reflash_sound_state(int p,int m)

1233 { char temp[20];

1234 int pcm,mic;

1235

1236 Clean_windows(PCMw);

1237 Clean_windows(MICw);

1238

1239 pcm=volume_vol(vol_v+p);

1240

1241 //pcm=volume_pcm(vol_p+p);

1242 mic=volume_mic(vol_m+m);

1243

1244 sprintf(temp,"%d",pcm);

1245 GrText(PCMw, Gck, 20, 13,temp,-1, GR_TFASCII);

1246 sprintf(temp,"%d",mic);

1247 GrText(MICw, Gck, 20, 13,temp,-1, GR_TFASCII);

1248

1249 GrFlush();

1250 }

/*vm_client.h*/

1

2 #include <unistd.h>

3 #include <stdlib.h>

4 #include <string.h>

5 #include <stdio.h>

6 #include <sys/types.h>

7 #include <errno.h>

8 #include <microwin/nano-X.h>

9 #include <sys/time.h>

10 #include "audio.h"

11

12 #define Maxlist 5

13

14 struct member_list{

15 GR_WINDOW_ID Wid;

16 char MemberID[20];

17

18 };

19

20 typedef struct member_list Member_list;

/* vm_server.c chet and get host voip ip address server*/

1

2 #include <sys/types.h>

3 #include <sys/socket.h>

4 #include <sys/time.h>

5 #include <netinet/in.h>

6 #include <sys/stat.h>

7

8 #include <stdlib.h>

9 #include <pthread.h>

10 #include <unistd.h>

11 #include <string.h>

12 #include <stdio.h>

13 #include <errno.h>

14

15 #define BUFSIZE 800

16 #define QLEN 4 /* maximum connection queue length */

34 struct online Online[QLEN];

35

36 struct send_to_thread{

37 int sock;

43 int passiveTCP(const char *service, int qlen);

44 int passiveUDP(const char *service);

45 void start_service(int ,fd_set *);

46 void Send_Message(int ,char * );

47 void send_list(int);

48 void broadcast_message(int ,char *,fd_set *);

49 void first_connect(int , fd_set *);

50 void *invite_player(void *arg);

51 void *server_control(void *arg);

52 void *leave_message(void *arg);

53 void *listen_message(void *arg);

54 void *check_online_state(void *arg);

55

56 void start_leave_message (char *name ,int sock);

57 int find_name(char *string,int fd);

58 int find_id(int sock);

59 void client_logout(int ,fd_set *);

60 void client_cancel_voip(int );

61 void client_cancel_leave_message(int s);

62 void cancel_thread(pthread_t thread);

63 void get_client_address(void);

64

70 main(int argc, char *argv[])

71 {

87 errexit("usage: voipserver [port]\n");

88 }

89

90 MSOCK = passiveTCP(service, QLEN);

91

92 FD_size = FD_SETSIZE;

93 FD_ZERO(&AFDS);

94 FD_SET(MSOCK, &AFDS);

95

96 pthread_create(&a_thread, NULL, server_control,(void *)MSOCK);

97 pthread_create(&b_thread, NULL, check_online_state,NULL);

98

99 printf("--- Voice Messenger Server ---\n\nMain socket: %d\n",MSOCK);

100

101 while (1) {

102 memcpy(&rfds, &AFDS, sizeof(rfds));

103

104 if (select(FD_size, &rfds, (fd_set *)0, (fd_set *)0,

105 (struct timeval *)0) < 0)

106 continue;

112 ssock = accept(MSOCK, (struct sockaddr *)&fsin,&alen);

113 if (ssock < 0)

114 errexit("accept: %s\n",strerror(errno));

115

116 printf("accect %d socket\n",ssock);

117 /*get playr name*/

118 first_connect(ssock,&AFDS);

119

120 }

121

122 for (fd=0; fd<FD_size; ++fd)

123 if (fd != MSOCK && FD_ISSET(fd, &rfds))

124 start_service(fd,&AFDS);

125

132 * first_connect - create account or client login and set client can be servered or not

133 *---

134 */

135 void first_connect(int sock, fd_set *afds)

136 { char

buf[LINELEN+1],*tok,temp[256],account[20],password[20],a[20],p[20]

;

137 int count,state=0,find=0,i,login=0;/* =0 no such account or passwors error,=1 login ok*/

138 FILE *fp;

139

140 count=read(sock, buf, LINELEN);

141 buf[count]='\0';

142 puts(buf);

143 if(strcmp(buf,"#create")==0)/*create account*/

144 {

145 printf("Create account\n");

146 count=read(sock, buf, LINELEN);

154 fp=fopen("account","a+");

155 /*test account exist or not?*/

156 while(fgets(temp,256,fp))

157 {tok = strtok(temp," ");

167 fprintf(fp,"%s %s\n",account,password);

168 state=1;

169 }

170 fclose(fp);

171 }

172 else if(strcmp(buf,"#login")==0)/*client login*/

173 {

174 printf("Login\n");

175 count=read(sock, buf, LINELEN);

176 buf[count]='\0';

177 puts(buf);

178 if(access("account",R_OK)==0)/*is file exist?*/

179 {

204 break;

221 for(i=0;strcmp(Online[i].name,"")!=0;i++);

222 strcpy(Online[i].name,account);

223 Online[i].sock=sock;

224

225 sprintf(buf,"#login %s",Online[i].name);

226 broadcast_message(sock,buf,afds);

227

241 * server_control - control server

242 *---

243 */

244 void *server_control(void *arg)

245 {

255 if(strcmp(command,"#online")==0)

256 {

257 for(i=0;i<QLEN;i++)

258 if(strcmp(Online[i].name,"")!=0)

259 printf("ID: %d Socket: %d Name:

%s\n",i,Online[i].sock,Online[i].name);

260

261 }

262 if(strcmp(command,"#kick")==0)

263 {

264 puts("which online_ID do you want to kick?");

265 scanf("%d",&id);

266 if(strcmp(Online[id].name,"")!=0)

267 client_logout(Online[id].sock,&AFDS);

268 }

269 }while(strcmp(command,"#shutdown")!=0);

270

280 * check_online_state - 1.5 min to check client online state

281 *---

282 */

283 void *check_online_state(void *arg)

284 { int i;

291 if(strcmp(Online[i].name,"")!=0)

292 {

299 client_logout(Online[i].sock,&AFDS);

300 }

301 }

302 }

303 sleep(90);

304

305 }

306 }

307

308 /*---

309 * start_service - broadcast message or send ip to client

310 *---

311 */

312 void start_service(int fd,fd_set *afds)

313 {

314 char buf[LINELEN+1];

315 int count,i;

316 struct send_to_thread *arg;

317 pthread_t a_thread;

318

319 count = read(fd, buf,LINELEN);

320 buf[count]='\0';

321 printf("socket:%d get: %s\n",fd,buf);/*show what server get*/

322 i=find_id(fd); /*find client's id*/

323

324 if (count <= 0)

325 client_logout(fd,afds);/*socket read fail , close socket*/

326

345 pthread_create(&a_thread, NULL, invite_player,(void *)arg);

346 }

347 /*client accept to open voip*/

348 else if(strcmp(buf,"#yes")==0 && Online[i].answer==2)

349 {

350 Online[i].answer=1;

351 }

352 /*client not accept to open voip*/

353 else if(strcmp(buf,"#no")==0 && Online[i].answer==2)

354 {

372 pthread_create(&Online[i].thread, NULL, leave_message,(void

*)arg);

398 * invite_player - invite player to open voip

399 *---

400 */

401 void *invite_player(void *arg)

402 { char buf[LINELEN+1],*tok;

413 find=find_name(tok,input->sock);

414

422 Send_Message(Online[find].sock,buf);/*tell player there is a

voip invition*/

434 Send_Message(input->sock,"#accept");

435

436 /*get clients's ip and port and send to them*/

437 get_client_address();

438 /*set player talksock,client tlak to who(socket)*/

439 Online[i].talksock=Online[find].sock;

440 Online[find].talksock=input->sock;

441 }

442

443 else/*not accept*/

444 {

445 sprintf(buf,"%s not accept yout invition",Online[find].name);

446 Send_Message(input->sock,buf);

461 * leave_message - To prepareing for leaving a message

462 *---

463 */

464 void *leave_message(void *arg)

465 { char buf[20],temp[LINELEN+1],*tok;

473 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);

474 if(res != 0)

475 {printf("Thread setcancelstste failed!!!\n");

476 exit(1);

477 }

478

479 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

480 if(res != 0)

481 {printf("Thread setcanceltype failed!!!\n");

482 exit(1);

490 if(access("account",R_OK)==0)/*is file exist?*/

491 {

503 }

518 pthread_exit(NULL);

518 pthread_exit(NULL);