void HexEditorCtrl::ReadFromBuffer( uint64_t position, unsigned lenght, char *buffer, bool cursor_reset, bool paint ){ static wxMutex MyBufferMutex; MyBufferMutex.Lock(); page_offset = position; if( lenght != ByteCapacity() ){ //last line could be NULL; } Clear( false, cursor_reset ); wxString text_string; // Optimized Code for( unsigned i=0 ; i<lenght ; i++ ) text_string << text_ctrl->Filter(buffer[i]); //Painting Zebra Stripes, -1 means no stripe. 0 means start with normal, 1 means start with zebra *ZebraStriping=(ZebraEnable ? position/BytePerLine()%2 : -1); if(sector_size > 1){ offset_ctrl->sector_size=sector_size; int draw_line=sector_size-(page_offset%sector_size); hex_ctrl->ThinSeperationLines.Clear(); text_ctrl->ThinSeperationLines.Clear(); do{ hex_ctrl->ThinSeperationLines.Add( 2*draw_line ); text_ctrl->ThinSeperationLines.Add( draw_line ); draw_line += sector_size; }while (draw_line < lenght ); } hex_ctrl->SetBinValue(buffer, lenght, false ); text_ctrl->ChangeValue(text_string, false); offset_ctrl->SetValue( position, BytePerLine() ); if( offset_scroll->GetThumbPosition() not_eq (page_offset / BytePerLine()) ) offset_scroll->SetThumbPosition( page_offset / BytePerLine() ); if( paint ){ PaintSelection(); } // sector_size=128; // if(sector_size > 1){ // int draw_line=sector_size-(page_offset%sector_size); // do{ // hex_ctrl->DrawSeperationLineAfterChar( 2*draw_line ); // text_ctrl->DrawSeperationLineAfterChar( draw_line ); // draw_line += sector_size; // }while (draw_line < GetByteCount() ); // } MyBufferMutex.Unlock(); }
//-----READ/WRITE FUNCTIONS-------// void HexEditorCtrl::ReadFromBuffer( uint64_t position, unsigned lenght, char *buffer, bool cursor_reset, bool paint ){ if( lenght==4294967295LL ){ std::cout << "Buffer has no data!" << std::endl; return; } static wxMutex MyBufferMutex; MyBufferMutex.Lock(); page_offset = position; if( lenght != ByteCapacity() ){ //last line could be NULL; } Clear( false, cursor_reset ); wxString text_string; // Optimized Code // for( unsigned i=0 ; i<lenght ; i++ ) //text_string << text_ctrl->Filter(buffer[i]); // text_string << static_cast<wxChar>((unsigned char)(buffer[i])); // text_string << CP473toUnicode((unsigned char)(buffer[i])); //Painting Zebra Stripes, -1 means no stripe. 0 means start with normal, 1 means start with zebra *ZebraStriping=(ZebraEnable ? position/BytePerLine()%2 : -1); if(sector_size > 1){ offset_ctrl->sector_size=sector_size; unsigned draw_line=sector_size-(page_offset%sector_size); hex_ctrl->ThinSeparationLines.Clear(); text_ctrl->ThinSeparationLines.Clear(); do{ hex_ctrl->ThinSeparationLines.Add( 2*draw_line ); text_ctrl->ThinSeparationLines.Add( draw_line ); draw_line += sector_size; }while (draw_line < lenght ); } if(ProcessRAMMap.Count()){ hex_ctrl->ThinSeparationLines.Clear(); text_ctrl->ThinSeparationLines.Clear(); //Notice that, ProcessRAMMap is SORTED. for( unsigned i=0; i < ProcessRAMMap.Count(); i++ ){ int64_t M = ProcessRAMMap.Item(i); if( M > page_offset + ByteCapacity() ) break; if( (M > page_offset) && (M <= page_offset + ByteCapacity()) ){ int draw_line = M - page_offset; hex_ctrl->ThinSeparationLines.Add( 2*draw_line ); text_ctrl->ThinSeparationLines.Add( draw_line ); } } } hex_ctrl->SetBinValue(buffer, lenght, false ); //text_ctrl->ChangeValue(text_string, false); text_ctrl->SetBinValue(buffer, lenght, false); offset_ctrl->SetValue( position, BytePerLine() ); if( offset_scroll->GetThumbPosition() != (page_offset / BytePerLine()) ) offset_scroll->SetThumbPosition( page_offset / BytePerLine() ); if( paint ){ PaintSelection(); } MyBufferMutex.Unlock(); }