Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "rosbag/chunked_file.h"
00036
00037 #include <iostream>
00038 #include <cstring>
00039
00040 #include <boost/format.hpp>
00041
00042 using std::string;
00043 using boost::format;
00044 using ros::Exception;
00045
00046 namespace rosbag {
00047
00048 UncompressedStream::UncompressedStream(ChunkedFile* file) : Stream(file) { }
00049
00050 CompressionType UncompressedStream::getCompressionType() const {
00051 return compression::Uncompressed;
00052 }
00053
00054 void UncompressedStream::write(void* ptr, size_t size) {
00055 size_t result = fwrite(ptr, 1, size, getFilePointer());
00056 if (result != size)
00057 throw BagIOException((format("Error writing to file: writing %1% bytes, wrote %2% bytes") % size % result).str());
00058
00059 advanceOffset(size);
00060 }
00061
00062 void UncompressedStream::read(void* ptr, size_t size) {
00063 size_t nUnused = (size_t) getUnusedLength();
00064 char* unused = getUnused();
00065
00066 if (nUnused > 0) {
00067
00068 if (nUnused == size) {
00069
00070 memcpy(ptr, unused, nUnused);
00071
00072 clearUnused();
00073 }
00074 else if (nUnused < size) {
00075
00076 memcpy(ptr, unused, nUnused);
00077
00078
00079 size -= nUnused;
00080
00081
00082 int result = fread((char*) ptr + nUnused, 1, size, getFilePointer());
00083 if ((size_t) result != size)
00084 throw BagIOException((format("Error reading from file + unused: wanted %1% bytes, read %2% bytes") % size % result).str());
00085
00086 advanceOffset(size);
00087
00088 clearUnused();
00089 }
00090 else {
00091
00092 memcpy(ptr, unused, size);
00093
00094 setUnused(unused + size);
00095 setUnusedLength(nUnused - size);
00096 }
00097 }
00098
00099
00100 int result = fread(ptr, 1, size, getFilePointer());
00101 if ((size_t) result != size)
00102 throw BagIOException((format("Error reading from file: wanted %1% bytes, read %2% bytes") % size % result).str());
00103
00104 advanceOffset(size);
00105 }
00106
00107 void UncompressedStream::decompress(uint8_t* dest, unsigned int dest_len, uint8_t* source, unsigned int source_len) {
00108 if (dest_len < source_len)
00109 throw BagException("dest_len not large enough");
00110
00111 memcpy(dest, source, source_len);
00112 }
00113
00114 }