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);
}