diff options
author | Kostyantyn Ovechko <fastinetserver@gmail.com> | 2010-06-27 20:33:02 +0300 |
---|---|---|
committer | Kostyantyn Ovechko <fastinetserver@gmail.com> | 2010-06-27 20:33:02 +0300 |
commit | c3d5cbaa40a4da7d0153393887be0b628f7e33e1 (patch) | |
tree | 1d20933cff549805cec7897f15fe5d0cf4e4a261 | |
parent | Failprove checksum.cpp and log errors to error.log (diff) | |
download | idfetch-c3d5cbaa40a4da7d0153393887be0b628f7e33e1.tar.gz idfetch-c3d5cbaa40a4da7d0153393887be0b628f7e33e1.tar.bz2 idfetch-c3d5cbaa40a4da7d0153393887be0b628f7e33e1.zip |
Failprove distfile.cpp and log errors to error.log
-rw-r--r-- | segget/distfile.cpp | 370 | ||||
-rw-r--r-- | segget/tui.cpp | 3 |
2 files changed, 212 insertions, 161 deletions
diff --git a/segget/distfile.cpp b/segget/distfile.cpp index 1db54e5..4a4030c 100644 --- a/segget/distfile.cpp +++ b/segget/distfile.cpp @@ -17,8 +17,6 @@ #include "mirror.cpp" #include "checksum.cpp" -//ulong max_segment_size=1000*500; - using namespace std; typedef unsigned int uint; @@ -53,200 +51,254 @@ class Tdistfile{ void load_distfile_from_json(json_object* json_obj_distfile); void load_url_list(json_object* json_array_distfile_urllist); void split_into_segments(); - void provide_segment(CURLM* cm, uint connection_num, uint seg_num); + int provide_segment(CURLM* cm, uint connection_num, uint seg_num); void inc_dld_segments_count(Tsegment * current_segment); - void combine_segments(); + int combine_segments(); bool check_if_dld(); }; void Tdistfile::load_url_list(json_object* json_array_distfile_urllist){ - url_count=json_object_array_length(json_array_distfile_urllist); - url_list= new string [url_count]; - for(uint urllist_array_item_num=0;urllist_array_item_num<url_count;urllist_array_item_num++){ - url_list[urllist_array_item_num]=json_object_get_string(json_object_array_get_idx(json_array_distfile_urllist,urllist_array_item_num)); - } - if (url_count){ - num=++stats.distfiles_count; - stats.inc_total_size(size); + try{ + url_count=json_object_array_length(json_array_distfile_urllist); + url_list= new string [url_count]; + for(uint urllist_array_item_num=0;urllist_array_item_num<url_count;urllist_array_item_num++){ + url_list[urllist_array_item_num]=json_object_get_string(json_object_array_get_idx(json_array_distfile_urllist,urllist_array_item_num)); + } + if (url_count){ + num=++stats.distfiles_count; + stats.inc_total_size(size); + } + }catch(...){ + error_log("Error: distfile.cpp: load_url_list()"); } } bool Tdistfile::check_if_dld(){ - ifstream filec((settings.distfiles_dir+"/"+name).c_str()); - // file.seekg (0); - ulong start = filec.tellg(); - filec.seekg (0, ios::end); - ulong end = filec.tellg(); - ulong d_size; - d_size = end - start; - //debug("seg:"+toString(seg_num)+" Dsize="+toString(downloaded_size)+" seg_size="+toString(segment_size)); - filec.close(); - if (d_size==size){ - downloaded=true; - num=++stats.distfiles_count; - stats.inc_dld_distfiles_count(); - stats.inc_dld_size(size); - debug("Distfile:"+name+" already downloaded"); - return true; - } - else{ - debug("Distfile:"+name+" not downloaded"); + try{ + ifstream filec((settings.distfiles_dir+"/"+name).c_str()); + ulong start = filec.tellg(); + filec.seekg (0, ios::end); + ulong end = filec.tellg(); + ulong d_size; + d_size = end - start; + //debug("seg:"+toString(seg_num)+" Dsize="+toString(downloaded_size)+" seg_size="+toString(segment_size)); + filec.close(); + if (d_size==size){ + downloaded=true; + num=++stats.distfiles_count; + stats.inc_dld_distfiles_count(); + stats.inc_dld_size(size); + debug("Distfile:"+name+" already downloaded"); + return true; + } + else{ + debug("Distfile:"+name+" not downloaded"); + return false; + } + }catch(...){ + error_log("Error: distfile.cpp: check_if_dld()"); return false; } } void Tdistfile::load_distfile_from_json(json_object* json_obj_distfile){ - name=json_object_get_string(json_object_object_get(json_obj_distfile,"name")); - size=atoi(json_object_to_json_string(json_object_object_get(json_obj_distfile,"size"))); - RMD160=json_object_get_string(json_object_object_get(json_obj_distfile,"RMD160")); - SHA1=json_object_get_string(json_object_object_get(json_obj_distfile,"SHA1")); - SHA256=json_object_get_string(json_object_object_get(json_obj_distfile,"SHA256")); + try{ + name=json_object_get_string(json_object_object_get(json_obj_distfile,"name")); + size=atoi(json_object_to_json_string(json_object_object_get(json_obj_distfile,"size"))); + RMD160=json_object_get_string(json_object_object_get(json_obj_distfile,"RMD160")); + SHA1=json_object_get_string(json_object_object_get(json_obj_distfile,"SHA1")); + SHA256=json_object_get_string(json_object_object_get(json_obj_distfile,"SHA256")); - if (not(check_if_dld())){ - split_into_segments(); - load_url_list(json_object_object_get(json_obj_distfile,"url_list")); + if (not(check_if_dld())){ + split_into_segments(); + load_url_list(json_object_object_get(json_obj_distfile,"url_list")); + } + }catch(...){ + error_log("Error: distfile.cpp: load_distfile_from_json()"); } } void Tdistfile::split_into_segments(){ - int range_end; - if (size>settings.max_segment_size){ - segments_count=size/settings.max_segment_size; - // set segments to have equal size, only last segment may be somewhat large (up to segment_count bytes large) - segment_size=size/segments_count; - } - else{ - segment_size=size; - segments_count=1; - }; - dn_segments = new Tsegment [segments_count]; - //none downloaded yet - for (uint segment_num=0; segment_num<segments_count; segment_num++){ - if (segment_num == (segments_count-1)){ - range_end=size-1; - debug("last_segment ends"+toString(range_end)); + try{ + int range_end; + if (size>settings.max_segment_size){ + segments_count=size/settings.max_segment_size; + // set segments to have equal size, only last segment may be somewhat large (up to segment_count bytes large) + segment_size=size/segments_count; } else{ - range_end=(segment_num+1)*segment_size-1; - debug("segment_range:"+toString(range_end)); - }; - dn_segments[segment_num].set_segment(this, segment_num, name, segment_size, range_end); - if (dn_segments[segment_num].status==DOWNLOADED) - inc_dld_segments_count(&dn_segments[segment_num]); + segment_size=size; + segments_count=1; + }; + dn_segments = new Tsegment [segments_count]; + //none downloaded yet + for (uint segment_num=0; segment_num<segments_count; segment_num++){ + if (segment_num == (segments_count-1)){ + range_end=size-1; + debug("last_segment ends"+toString(range_end)); + } + else{ + range_end=(segment_num+1)*segment_size-1; + debug("segment_range:"+toString(range_end)); + }; + dn_segments[segment_num].set_segment(this, segment_num, name, segment_size, range_end); + if (dn_segments[segment_num].status==DOWNLOADED) + inc_dld_segments_count(&dn_segments[segment_num]); + } + }catch(...){ + error_log("Error: distfile.cpp: split_into_segments()"); } } Tdistfile::~Tdistfile(){ - delete [] url_list; + try{ + delete [] url_list; + }catch(...){ + error_log("Error: distfile.cpp: ~Tdistfile()"); + } } -void Tdistfile::provide_segment(CURLM* cm, uint connection_num, uint seg_num){ - active_connections_num++; +int Tdistfile::provide_segment(CURLM* cm, uint connection_num, uint seg_num){ + try{ + active_connections_num++; - Tmirror *Pcurr_mirror; - Tmirror *Pbest_mirror; -//============================================================================= -// -// -// BEWARE first mirror needs to be checked for settings.max_connections_num_per_mirror -// -// -//============================================================================= - - // assume first mirrror to be the best and compare it with the rest - uint best_mirror_num=-1; -// Pcurr_mirror=find_mirror(strip_mirror_name(url_list[best_mirror_num])); - Pbest_mirror=0; - ulong best_mirror_self_rating=-1; - ulong curr_mirror_self_rating; + Tmirror *Pcurr_mirror; + Tmirror *Pbest_mirror=0; // the best isn't set let's find it + uint best_mirror_num=-1; // the best isn't set let's find it - for (url_num=0; url_num<url_count; url_num++){ - Pcurr_mirror=find_mirror(strip_mirror_name(url_list[url_num])); - if (Pcurr_mirror->get_active_num()<settings.max_connections_num_per_mirror){ - curr_mirror_self_rating=Pcurr_mirror->mirror_on_the_wall(); - if (curr_mirror_self_rating<best_mirror_self_rating){ - best_mirror_num=url_num; - best_mirror_self_rating=curr_mirror_self_rating; - Pbest_mirror=Pcurr_mirror; + ulong best_mirror_self_rating=-1; + ulong curr_mirror_self_rating; + + for (url_num=0; url_num<url_count; url_num++){ + Pcurr_mirror=find_mirror(strip_mirror_name(url_list[url_num])); + if (Pcurr_mirror->get_active_num()<settings.max_connections_num_per_mirror){ + curr_mirror_self_rating=Pcurr_mirror->mirror_on_the_wall(); + if (curr_mirror_self_rating<best_mirror_self_rating){ + best_mirror_num=url_num; + best_mirror_self_rating=curr_mirror_self_rating; + Pbest_mirror=Pcurr_mirror; + } + if (best_mirror_self_rating==0) + // 0 can not be improved - it's one of the best + break; } - if (best_mirror_self_rating==0) - // 0 can not be improved - it's one of the best - break; } + if (Pbest_mirror){ + debug("Downloading from BEST_MIRROR:"+url_list[best_mirror_num]); + Pbest_mirror->start(); + dn_segments[seg_num].prepare_for_connection(cm, connection_num, num, url_list[best_mirror_num]); + connection_array[connection_num].segment=&dn_segments[seg_num]; + } + else + error_log("Can't choose mirror for segment:"+dn_segments[seg_num].file_name); + }catch(...){ + error_log("Error: distfile.cpp: provide_segment()"); + return 1; } - if (Pbest_mirror){ - debug("Downloading from BEST_MIRROR:"+url_list[best_mirror_num]); - Pbest_mirror->start(); - dn_segments[seg_num].prepare_for_connection(cm, connection_num, num, url_list[best_mirror_num]); - connection_array[connection_num].segment=&dn_segments[seg_num]; - } - else - error_log("Can't choose mirror for segment:"+dn_segments[seg_num].file_name); + return 0; } void Tdistfile::inc_dld_segments_count(Tsegment* current_segment){ - stats.inc_dld_size(current_segment->segment_size); - if (++dld_segments_count==segments_count) - combine_segments(); + try{ + stats.inc_dld_size(current_segment->segment_size); + if (++dld_segments_count==segments_count) + combine_segments(); + }catch(...){ + error_log("Error: distfile.cpp: inc_dld_segments_count()"); + } } -void Tdistfile::combine_segments(){ - debug("Combining distfile"+name); - ofstream distfile_file((settings.distfiles_dir+"/"+name).c_str(),ofstream::binary|ios::trunc); - char * buffer; - ulong cur_seg_size; - +int Tdistfile::combine_segments(){ + try{ + debug("Combining distfile"+name); + ofstream distfile_file; + try{ + distfile_file.open((settings.distfiles_dir+"/"+name).c_str(),ofstream::binary|ios::trunc); + }catch(...){ + error_log("Error: distfile.cpp: combine_segments(): opening distfile:"+settings.distfiles_dir+"/"+name); + return 1; + } + char * buffer; + ulong cur_seg_size; // char * buffer; // buffer = new char [size]; - - for (uint seg_num=0; seg_num < segments_count; seg_num++){ - debug("Joining "+name+" segment "+toString(seg_num)+" "); - ifstream segment_file((settings.segments_dir+"/"+dn_segments[seg_num].file_name).c_str(),ifstream::binary); - - // get size of file - ulong start=segment_file.tellg(); - - segment_file.seekg(0,ifstream::end); - ulong end=segment_file.tellg(); - cur_seg_size=end-start; - segment_file.seekg(0); - debug(">>>>>SEG:"+dn_segments[seg_num].file_name+" Start: "+toString(start)+" End: "+toString(end)+" Size: "+toString(cur_seg_size)); - // allocate memory for file content - buffer = new char [cur_seg_size]; - // read content of infile - segment_file.read (buffer,cur_seg_size); - // write to outfile - distfile_file.write (buffer,cur_seg_size); - // release dynamically-allocated memory - delete[] buffer; - segment_file.close(); - if(remove((settings.segments_dir+"/"+dn_segments[seg_num].file_name).c_str()) != 0 ) - error_log("Tdistfile::combine_segments() - Error: can't delete:"+settings.segments_dir+"/"+dn_segments[seg_num].file_name); - else - debug(settings.segments_dir+"/"+dn_segments[seg_num].file_name+" deleted" ); - } - distfile_file.close(); - stats.inc_dld_distfiles_count(); - log("Distfile "+name+" has been combined"); - - if (rmd160_ok(settings.distfiles_dir+"/"+name,RMD160)) - log("RMD160 checksum for distfile:"+name+" is [OK]"); - else{ - log("Error: RMD160 checksum for distfile:"+name+" [FAILED]"); - error_log("Error: RMD160 checksum for distfile:"+name+" [FAILED]"); - } - - if (sha1_ok(settings.distfiles_dir+"/"+name,SHA1)) - log("SHA1 checksum for distfile:"+name+" is [OK]"); - else{ - log("Error: SHA1 checksum for distfile:"+name+" [FAILED]"); - error_log("Error: SHA1 checksum for distfile:"+name+" [FAILED]"); - } - - if (sha256_ok(settings.distfiles_dir+"/"+name,SHA256)) - log("SHA256 checksum for distfile:"+name+" is [OK]"); - else{ - log("Error: SHA256 checksum for distfile:"+name+" [FAILED]"); - error_log("Error: SHA256 checksum for distfile:"+name+" [FAILED]"); + try{ + for (uint seg_num=0; seg_num < segments_count; seg_num++){ + debug("Joining "+name+" segment "+toString(seg_num)+" "); + ifstream segment_file; + try{ + segment_file.open((settings.segments_dir+"/"+dn_segments[seg_num].file_name).c_str(),ifstream::binary); + }catch(...){ + error_log("Error: distfile.cpp: combine_segments(): opening segment:"+settings.segments_dir+"/"+dn_segments[seg_num].file_name); + return 2; + } + try{ + // get size of file + ulong start=segment_file.tellg(); + segment_file.seekg(0,ifstream::end); + ulong end=segment_file.tellg(); + cur_seg_size=end-start; + segment_file.seekg(0); + debug(">>>>>SEG:"+dn_segments[seg_num].file_name+" Start: "+toString(start)+" End: "+toString(end)+" Size: "+toString(cur_seg_size)); + // allocate memory for file content + buffer = new char [cur_seg_size]; + // read content of infile + segment_file.read (buffer,cur_seg_size); + segment_file.close(); + }catch(...){ + error_log("Error: distfile.cpp: combine_segments(): segment is open, but error occured while reading it:"+settings.segments_dir+"/"+dn_segments[seg_num].file_name); + return 3; + } + try{ + // write to outfile + distfile_file.write (buffer,cur_seg_size); + }catch(...){ + error_log("Error: distfile.cpp: combine_segments(): distfile is open, but error occured while writing into it:"+settings.distfiles_dir+"/"+name); + return 4; + } + // release dynamically-allocated memory + delete[] buffer; + if(remove((settings.segments_dir+"/"+dn_segments[seg_num].file_name).c_str()) != 0 ) + error_log("Tdistfile::combine_segments() - Error: can't delete:"+settings.segments_dir+"/"+dn_segments[seg_num].file_name); + else + debug(settings.segments_dir+"/"+dn_segments[seg_num].file_name+" deleted" ); + } + + distfile_file.close(); + stats.inc_dld_distfiles_count(); + log("Distfile "+name+" has been combined"); + }catch(...){ + error_log("Error in distfile.cpp: combine_segments() for distfile:"+settings.distfiles_dir+"/"+name); + return 5; + } + + try{ + if (rmd160_ok(settings.distfiles_dir+"/"+name,RMD160)) + log("RMD160 checksum for distfile:"+name+" is [OK]"); + else{ + log("Error: RMD160 checksum for distfile:"+name+" [FAILED]"); + error_log("Error: RMD160 checksum for distfile:"+name+" [FAILED]"); + } + + if (sha1_ok(settings.distfiles_dir+"/"+name,SHA1)) + log("SHA1 checksum for distfile:"+name+" is [OK]"); + else{ + log("Error: SHA1 checksum for distfile:"+name+" [FAILED]"); + error_log("Error: SHA1 checksum for distfile:"+name+" [FAILED]"); + } + + if (sha256_ok(settings.distfiles_dir+"/"+name,SHA256)) + log("SHA256 checksum for distfile:"+name+" is [OK]"); + else{ + log("Error: SHA256 checksum for distfile:"+name+" [FAILED]"); + error_log("Error: SHA256 checksum for distfile:"+name+" [FAILED]"); + } + }catch(...){ + error_log("Error: distfile.cpp: combine_segments() for segment:"+settings.distfiles_dir+"/"+name+" while checking checksums."); + return 6; + } + }catch(...){ + error_log("Error: distfile.cpp: combine_segments() for segment:"+settings.distfiles_dir+"/"+name+" during procedure."); + return 7; } - + return 0; } #endif
\ No newline at end of file diff --git a/segget/tui.cpp b/segget/tui.cpp index a7907ed..ccdcfa0 100644 --- a/segget/tui.cpp +++ b/segget/tui.cpp @@ -107,8 +107,7 @@ void log(string log_msg_text){ file.exceptions (ofstream::failbit | ofstream::badbit); try{ file.open((settings.logs_dir+"/"+settings.general_log_file).c_str(), ios::app); - } - catch(...){ + }catch(...){ error_log("Error opening "+settings.logs_dir+"/"+settings.general_log_file+"."); return; } |