source: extensions/pLoader/trunk/src/Uploader/TransferManager.pm @ 6426

Last change on this file since 6426 was 6426, checked in by ronosman, 14 years ago

Bug 1710 fixed : pLoader lack of concurrency support causes data inconsistency.

File size: 4.5 KB
Line 
1package Uploader::TransferManager;
2use threads;
3use threads::shared;
4use strict;
5use base qw/Uploader::Object/;
6use Data::Dumper;
7use Digest::MD5::File qw/file_md5_hex md5_hex/;
8
9$|=1;
10
11__PACKAGE__->mk_accessors(qw/
12    preferences
13    site_thumb_dir
14    site_resized_dir
15    write_type
16    destination_category
17    pwg
18    event_handler
19    progress_event
20    done_event
21/);
22
23
24sub Init {
25    my ( $self ) =@_;
26
27    $self->destination_category([]);
28    $self->pwg->log_progress_cbk(
29        sub { $self->post_image_progress_event(@_) }
30    );
31}
32
33
34sub cancel_image {
35    my ( $self, $image ) = @_;
36
37    #must check if $image is a valid hash
38    return unless 'HASH' eq ref $image;
39    return unless $image->{image_id};
40
41    $self->log_image_progress(
42        $image,
43        "cancelled",
44        0,
45    );
46}
47
48
49sub process_image {
50    my ( $self, $handler, $progress_event, $transfer_done_event, $image) = @_;
51
52    $self->event_handler(
53        $handler
54    );
55
56
57    $self->progress_event(
58        $progress_event
59    );
60
61    $self->done_event(
62        $transfer_done_event
63    );
64
65
66    if(!$self->exists_image($image)){
67        $self->insert_image($image);
68    }
69    else {
70        $self->update_image($image);
71    }
72
73}
74
75
76sub exists_image {
77    my ( $self, $image ) = @_;
78
79    $self->pwg->exists_image(
80        $image
81    );
82}
83
84
85sub insert_image {
86    my ( $self, $image ) = @_;
87
88    $self->log_image_progress($image, "sending files", 0);
89    $self->add_image_files($image);
90    $self->add_image($image);
91    $self->log_image_progress($image, "transfered", 100);
92
93}
94
95
96sub log_image_progress {
97    my ( $self, $image, $status, $value ) = @_;
98
99    $image->{status}   = $status;
100    $image->{progress} = $value;
101    $self->post_image_progress_event($image);
102}
103
104
105sub add_image_files {
106    my ( $self, $image ) = @_;
107
108    $self->init_image_files_checksums($image);
109    $self->send_image_files_chunks($image);
110}
111
112
113sub init_image_files_checksums {
114    my ( $self, $image ) = @_;
115
116
117    $self->log_image_progress($image, "check files", 0);
118    my @file_types = ('site_resized_file', 'site_thumb_file');
119    push @file_types, 'site_high_file' if $image->{upload_high};
120
121    map {
122        $self->init_image_file_type_checksum($image, $_)
123    }@file_types;
124
125    $self->log_image_progress($image, "files checked", 100);
126}
127
128
129sub init_image_file_type_checksum {
130    my ( $self, $image, $file_type ) = @_;
131
132    my $file = $image->{$file_type};
133    $image->{"$file_type"."_checksum"} = $self->checksum($file);
134}
135
136
137sub checksum {
138    my ( $self, $file ) = @_;
139
140    my $file_sum;
141
142    eval {
143        $file_sum = file_md5_hex(
144            $file
145        );
146    };
147
148    $file_sum;
149}
150
151
152sub send_image_files_chunks {
153    my ( $self, $image ) = @_;
154
155    $self->pwg->send_image_files_chunks(
156        $image
157    );
158}
159
160
161sub add_image {
162    my ( $self, $image ) = @_;
163
164    $self->pwg->add_image($image);
165}
166
167
168sub update_image {
169    my ( $self, $image ) = @_;
170
171    $self->log_image_progress($image, "updating", 0);
172
173    $self->update_image_files($image);
174    $self->update_image_properties($image);
175
176    $self->log_image_progress($image, "updated", 100);
177}
178
179
180sub update_image_files {
181    my ( $self, $image ) = @_;
182
183    if($image->{preferences}{reupload_action_files}){
184        $self->log_image_progress($image, "updating files", 0);
185        $self->init_image_files_checksums($image);
186        $self->update_image_modified_files($image);
187        $self->log_image_progress($image, "files updated", 100);
188    }
189}
190
191
192sub update_image_modified_files {
193    my ( $self, $image ) = @_;
194
195    $self->pwg->update_image_modified_files($image);
196}
197
198
199sub update_image_properties {
200    my ( $self, $image ) = @_;
201
202    $self->log_image_progress($image, "updating properties", 0);
203    $self->pwg->update_image_properties($image);
204    $self->log_image_progress($image, "properties updated", 100);
205}
206
207
208sub post_image_progress_event {
209    my ( $self, $image ) = @_;
210
211    $self->post_image_event(
212        $self->progress_event,
213        $image
214    );
215}
216
217
218sub post_image_event {
219    my ( $self, $event_type, $image ) = @_;
220
221    my $thread_event = Wx::PlThreadEvent->new(
222        -1,
223        $event_type,
224        shared_clone($image)
225    );
226    Wx::PostEvent($self->event_handler, $thread_event);
227}
228
229
230sub destination_category_is_empty {
231    my ( $self ) = @_;
232
233    !scalar @{$self->destination_category};
234}
235
236
2371;
Note: See TracBrowser for help on using the repository browser.