package Uploader::TransferManager; use threads; use threads::shared; use strict; use base qw/Uploader::Object/; use Data::Dumper; use Digest::MD5::File qw/file_md5_hex md5_hex/; $|=1; __PACKAGE__->mk_accessors(qw/ preferences site_thumb_dir site_resized_dir write_type destination_category pwg event_handler progress_event done_event /); sub Init { my ( $self ) =@_; $self->destination_category([]); $self->pwg->log_progress_cbk( sub { $self->post_image_progress_event(@_) } ); } sub cancel_image { my ( $self, $image ) = @_; #must check if $image is a valid hash return unless 'HASH' eq ref $image; return unless $image->{image_id}; $self->log_image_progress( $image, "cancelled", 0, ); } sub process_image { my ( $self, $handler, $progress_event, $transfer_done_event, $image) = @_; $self->event_handler( $handler ); $self->progress_event( $progress_event ); $self->done_event( $transfer_done_event ); if(!$self->exists_image($image)){ $self->insert_image($image); } else { $self->update_image($image); } } sub exists_image { my ( $self, $image ) = @_; $self->pwg->exists_image( $image ); } sub insert_image { my ( $self, $image ) = @_; $self->log_image_progress($image, "sending files", 0); $self->add_image_files($image); $self->add_image($image); $self->log_image_progress($image, "transfered", 100); } sub log_image_progress { my ( $self, $image, $status, $value ) = @_; $image->{status} = $status; $image->{progress} = $value; $self->post_image_progress_event($image); } sub add_image_files { my ( $self, $image ) = @_; $self->init_image_files_checksums($image); $self->send_image_files_chunks($image); } sub init_image_files_checksums { my ( $self, $image ) = @_; $self->log_image_progress($image, "check files", 0); my @file_types = ('site_resized_file', 'site_thumb_file'); push @file_types, 'site_high_file' if $image->{upload_high}; map { $self->init_image_file_type_checksum($image, $_) }@file_types; $self->log_image_progress($image, "files checked", 100); } sub init_image_file_type_checksum { my ( $self, $image, $file_type ) = @_; my $file = $image->{$file_type}; $image->{"$file_type"."_checksum"} = $self->checksum($file); } sub checksum { my ( $self, $file ) = @_; my $file_sum; eval { $file_sum = file_md5_hex( $file ); }; $file_sum; } sub send_image_files_chunks { my ( $self, $image ) = @_; $self->pwg->send_image_files_chunks( $image ); } sub add_image { my ( $self, $image ) = @_; $self->pwg->add_image($image); } sub update_image { my ( $self, $image ) = @_; $self->log_image_progress($image, "updating", 0); $self->update_image_files($image); $self->update_image_properties($image); $self->log_image_progress($image, "updated", 100); } sub update_image_files { my ( $self, $image ) = @_; if($image->{preferences}{reupload_action_files}){ $self->log_image_progress($image, "updating files", 0); $self->init_image_files_checksums($image); $self->update_image_modified_files($image); $self->log_image_progress($image, "files updated", 100); } } sub update_image_modified_files { my ( $self, $image ) = @_; $self->pwg->update_image_modified_files($image); } sub update_image_properties { my ( $self, $image ) = @_; $self->log_image_progress($image, "updating properties", 0); $self->pwg->update_image_properties($image); $self->log_image_progress($image, "properties updated", 100); } sub post_image_progress_event { my ( $self, $image ) = @_; $self->post_image_event( $self->progress_event, $image ); } sub post_image_event { my ( $self, $event_type, $image ) = @_; my $thread_event = Wx::PlThreadEvent->new( -1, $event_type, shared_clone($image) ); Wx::PostEvent($self->event_handler, $thread_event); } sub destination_category_is_empty { my ( $self ) = @_; !scalar @{$self->destination_category}; } 1;