Mercurial > hg > RemoteEditor > emacs
view redit_client.pl @ 35:8991e2263f83
*** empty log message ***
author | gongo |
---|---|
date | Sat, 22 Dec 2007 21:06:07 +0900 |
parents | 554806d53b5e |
children |
line wrap: on
line source
#!/usr/bin/perl -w #use strict; use IO::Select; use IO::Socket; use Encode; use lib '/Users/gongo/src/cr/REP_project/session'; use Rep; use NKF; if ($ARGV[0] eq "") { print "Usage: $0 SERVER_NAME\n"; exit; } # Rep.pm に移動する sub HEADER_TOKEN_SIZ {10}; sub EMACS_HEADER_SIZ {60}; sub HEADER_CMD_POS {0}; sub HEADER_SID_POS {1}; sub HEADER_EID_POS {2}; sub HEADER_SEQNO_POS {3}; sub HEADER_LINENO_POS {4}; sub HEADER_TEXTSIZ_POS {5}; my $peer_addr = $ARGV[0]; my $peer_port = "8765"; my $TIMEOUT = 0; # connect to the session manager $sock = new IO::Socket::INET(PeerAddr => $peer_addr, PeerPort => $peer_port, Proto => 'tcp') or die("Cannot open socket : $!\n"); my $myeid = ""; my $mysid = ""; my $ack; my $packet; my $sm_selector = new IO::Select($sock) or die "Cannot select socket : $!\n"; my $stdin_selector = new IO::Select(\*STDIN) or die "Cannot select stdin : $!\n"; while(1){ # message from remote editor client (STDIN) if ($stdin_selector->can_read($TIMEOUT)) { my $buffer = <STDIN>; # TODO : my $packet = &make_packet_from_emacs($buffer); $sock->write($packet,length($packet)); &debug_msg("send message is : ||" . $buffer . "||\n"); } # message from session manager if ($sm_selector->can_read($TIMEOUT)) { my $sm_message = &read_and_unpack($sock); if($sm_message->{'cmd'} == SMCMD_JOIN_ACK){ $myeid = $sm_message->{'eid'}; &debug_msg("myeid is : " . $myeid . "\n"); } if($sm_message->{'cmd'} == SMCMD_PUT_ACK){ $mysid = $sm_message->{'sid'}; &debug_msg("mysid is : " . $mysid . "\n"); } if ($sm_message->{'eid'} != $myeid or $sm_message->{'cmd'} == SMCMD_JOIN_ACK or $sm_message->{'cmd'} == SMCMD_PUT_ACK or $sm_message->{'cmd'} == SMCMD_SELECT_ACK) { my $text = nkf("-eW", $sm_message->{'text'}); # $text =~ s/\n//g; # バイト数ではなく文字数で my $textsiz = length(decode('euc-jp', $text)); my $output = sprintf("%10d%10d%10d%10d%10d%10d" . $text, $sm_message->{'cmd'}, $sm_message->{'sid'}, $sm_message->{'eid'}, $sm_message->{'seqno'}, $sm_message->{'lineno'}, $textsiz ); syswrite(STDOUT,$output,length($output)); &debug_msg("recv messageleng: ||" . length($output) . "||\n"); &debug_msg("recv message is : ||" . $output . "||\n"); } else { &debug_msg("chop cmd : " . $sm_message->{'cmd'} . "\n"); &debug_msg("chop eid : " . $sm_message->{'eid'} . "\n"); } } } sub make_packet_from_emacs { # FIXME my $buffer = shift; my $text = substr($buffer,&EMACS_HEADER_SIZ); $text =~ s/\x92//g; $text = nkf("-w", $text); &debug_msg("text = " .$text. "\n"); return &make_packet( &get_header_token($buffer, HEADER_CMD_POS), &get_header_token($buffer, HEADER_SID_POS), &get_header_token($buffer, HEADER_EID_POS), &get_header_token($buffer, HEADER_SEQNO_POS), &get_header_token($buffer, HEADER_LINENO_POS), #$substr($buffer,&EMACS_HEADER_SIZ) $text ); } sub get_header_token { my $buffer = shift; my $pos = shift; return int(substr($buffer, &HEADER_TOKEN_SIZ * $pos, &HEADER_TOKEN_SIZ)); } sub debug_msg { my $msg = shift; open(DEBUG,">> debug.txt"); print DEBUG "eid $myeid : " . $msg; close(DEBUG); }