Overview   API Reference  

raw_image.hpp

00001 #if !defined(__RAW_IMAGE_HPP__)
00002 #define __RAW_IMAGE_HPP__
00003 
00004 //
00005 // local includes
00006 //
00007 #include "block_driver_base.hpp"
00008 
00012 struct raw_image : public block_driver_base
00013 {
00014   protected:
00015     const string driver_name;
00016     // direct member to avoid virtual function calls (at least for now)
00017     l4vmm_file file;
00018 
00019   public:
00020     //
00021     // constructor
00022     //
00023     inline raw_image(const string &filename, const state_flags flags=0)
00024         : block_driver_base(string(L4VMM_DRIVER" file: ") + filename, flags),
00025           file(filename, this->flags.is(READONLY))
00026     {
00027         this->flags.clear(FLUSHABLE);
00028         this->flags.set(READY, file.is_open());
00029     }
00030 
00031     //
00032     // medium functions
00033     //
00034     virtual inline l4_sector_t sectors(void) const
00035     {
00036         return is(READY) ? file.size() / SECTOR_SIZE : 0;
00037     }
00038 
00039     virtual inline int read_sectors(uint8_t *buffer, l4_sector_t sector, l4_sector_t number)
00040     {
00041         if (!is(READY)) return -L4_ENOTAVAIL;
00042         // file checks size
00043         file::offset_t bytes=file.read(buffer, sector * SECTOR_SIZE, number * SECTOR_SIZE);
00044         return (bytes < 0) ? bytes : 0;
00045     }
00046 
00047     virtual inline int write_sectors(uint8_t *buffer, l4_sector_t sector, l4_sector_t number)
00048     {
00049         if (!is(READY)) return -L4_ENOTAVAIL;
00050         // file checks size
00051         file::offset_t bytes=file.write(buffer, sector * SECTOR_SIZE, number * SECTOR_SIZE);
00052         return (bytes < 0) ? bytes : 0;
00053     }
00054 
00055     virtual inline int flush_sectors(void)
00056     {
00057         return file.flush();
00058     }
00059 };
00060 
00061 #endif
00062 
00063 // ***** end of source ***** //
00064 

L4vmm Reference Manual, written by Mario Schwalbe  © 2006-2008