source: extensions/pLoader/trunk/src/Uploader/TransferWorker.pm @ 6522

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

Refactor thread management to reduce memory footprint ( pLoader now starts with 60 Mo instead of 90 Mo ).

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