ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/syncmail/syncmail
(Generate patch)

Comparing syncmail/syncmail (file contents):
Revision 1.3 by root, Sat Oct 27 23:53:49 2001 UTC vs.
Revision 1.4 by root, Sun Oct 28 03:51:24 2001 UTC

6use Coro::Semaphore; 6use Coro::Semaphore;
7use Coro::Channel; 7use Coro::Channel;
8use Coro::Signal; 8use Coro::Signal;
9use Coro::RWLock; 9use Coro::RWLock;
10 10
11use Set::Scalar;
12
11use Fcntl; 13use Fcntl;
12use MD5;
13 14
14use constant PROTVERSION => 1; 15use constant PROTVERSION => 1;
15 16
16$VERSION = 0.1; 17$VERSION = 0.1;
17 18
80 async { 81 async {
81 my $guard = $sync_folder->guard; 82 my $guard = $sync_folder->guard;
82 my $vc = new vc; 83 my $vc = new vc;
83 84
84 my $folder = new folder name => $name; 85 my $folder = new folder name => $name;
85 #my ($rfid, $rmtime) = split /\s+/, (request open => $name)->[1];
86 ::give;
87 86
88 $vc->snd("open", $name); 87 $vc->snd("open", $name);
89 $vc->snd("mtime"); 88 $vc->snd("mtime");
90 89
91 $folder->check; 90 $folder->check;
92 $folder->read_mdif; 91 $folder->read_mdif;
93 92
94 my $mtime = $folder->{host}{$OTHERNAME}; 93 my $ctime = $folder->{host}{$OTHERNAME} || -1;
95 my $rtime = $vc->rcv; 94 my $rtime = $vc->rcv;
96 95
97 $vc->snd("diff", $rtime); 96 $vc->snd("diff", $ctime);
97
98 my (%ladd, %ldel, %radd, %rdel);
99
100 my @diff = grep { $_->[0] > $ctime } @{$folder->{diff}};
101 $diff = $vc->rcv;
102
103 while () {
104 if ($diff >= 0 and (!@diff or $diff <= $diff[0][0])) {
105 my @add = split /\0/, $vc->rcv;
106 my @del = split /\0/, $vc->rcv;
107 $diff = $vc->rcv;
108 slog 0, "applying remote diff $diff\n";
109 for (@del) { undef $rdel{$_}; delete $radd{$_}; delete $ladd{$_}; }
110 for (@add) { undef $radd{$_}; delete $rdel{$_}; delete $ldel{$_}; }
111 } elsif (@diff) {
112 slog 0, "applying local diff $diff[0][0]\n";
113 for (@{$diff[0][2]}) { undef $rdel{$_}; delete $radd{$_}; delete $ladd{$_}; }
114 for (@{$diff[0][1]}) { undef $radd{$_}; delete $rdel{$_}; delete $ldel{$_}; }
115 shift @diff;
116 } else {
117 slog 0, "no more diffing\n";
118 last;
119 }
120 }
121
122 slog 0, "LADD ".join(" ", keys %ladd)."\n";
123 slog 0, "LDEL ".join(" ", keys %ldel)."\n";
124 slog 0, "RADD ".join(" ", keys %radd)."\n";
125 slog 0, "RDEL ".join(" ", keys %rdel)."\n";
126
98 $folder->{host}{$OTHERNAME} = $folder->{mtime}; 127 #$folder->{host}{$OTHERNAME} = time;
128 #$vc->snd("setctime", time);
99 129
100 #request "update $rfid $folder->{mtime}";
101 #request "close $rfid";
102 undef $quit_guard; 130 undef $quit_guard;
103 } 131 }
104} 132}
105 133
106sub main { 134sub main {
151 $folder->read_mdif; 179 $folder->read_mdif;
152 180
153 while (my $msg = $vc->rcv) { 181 while (my $msg = $vc->rcv) {
154 if ($msg eq "mtime") { 182 if ($msg eq "mtime") {
155 $vc->snd($folder->{mtime}); 183 $vc->snd($folder->{mtime});
156 } elsif ($msg =~ /^update (\d+) (\d+)$/) { 184 } elsif ($msg eq "diff") {
157 #if ($folder[$1]->{host}{$OTHERNAME} != $2) { 185 my $time = $vc->rcv;
158 # $folder[$1]->{host}{$OTHERNAME} = $2; 186 for (@{$folder->{diff}}) {
159 # $folder[$1]->dirty; 187 next if $_->[0] <= $time;
188 $vc->snd($_->[0],
189 (join "\0", @{$_->[1]}),
190 (join "\0", @{$_->[2]}),
191 );
160 #} 192 }
161 #reply $id, 200, "ok"; 193 $vc->snd(-1);
194 } elsif ($msg eq "setctime") {
195 $folder->{host}{$OTHERNAME} = $vc->rcv;
162 } else { 196 } else {
163 die "protocol error, unknown folder command ($msg)\n"; 197 die "protocol error, unknown folder command ($msg)\n";
164 } 198 }
165 } 199 }
166} 200}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines