… | |
… | |
6 | use Coro::Semaphore; |
6 | use Coro::Semaphore; |
7 | use Coro::Channel; |
7 | use Coro::Channel; |
8 | use Coro::Signal; |
8 | use Coro::Signal; |
9 | use Coro::RWLock; |
9 | use Coro::RWLock; |
10 | |
10 | |
|
|
11 | use Set::Scalar; |
|
|
12 | |
11 | use Fcntl; |
13 | use Fcntl; |
12 | use MD5; |
|
|
13 | |
14 | |
14 | use constant PROTVERSION => 1; |
15 | use 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 | |
106 | sub main { |
134 | sub 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 | } |