diff options
author | Benoit Foucher <benoit@zeroc.com> | 2006-12-13 18:22:50 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2006-12-13 18:22:50 +0000 |
commit | bc5160534bc886da1612f4d76e40784c3651fc84 (patch) | |
tree | e7fd1f277b262f83013a8b43da4725412f82c144 /cpp/src/IceGrid/FileCache.cpp | |
parent | - Adding file list for 'ca' scripts. (diff) | |
download | ice-bc5160534bc886da1612f4d76e40784c3651fc84.tar.bz2 ice-bc5160534bc886da1612f4d76e40784c3651fc84.tar.xz ice-bc5160534bc886da1612f4d76e40784c3651fc84.zip |
Fixed bug 1617
Diffstat (limited to 'cpp/src/IceGrid/FileCache.cpp')
-rw-r--r-- | cpp/src/IceGrid/FileCache.cpp | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/cpp/src/IceGrid/FileCache.cpp b/cpp/src/IceGrid/FileCache.cpp index f6cbce81264..4f03160eeea 100644 --- a/cpp/src/IceGrid/FileCache.cpp +++ b/cpp/src/IceGrid/FileCache.cpp @@ -19,8 +19,8 @@ using namespace std; using namespace IceGrid; -FileCache::FileCache(const Ice::CommunicatorPtr& communicator) : - _messageSizeMax(communicator->getProperties()->getPropertyAsIntWithDefault("Ice.MessageSizeMax", 1024) * 1024) +FileCache::FileCache(const Ice::CommunicatorPtr& com) : + _messageSizeMax(com->getProperties()->getPropertyAsIntWithDefault("Ice.MessageSizeMax", 1024) * 1024 - 256) { } @@ -119,6 +119,11 @@ FileCache::read(const string& file, Ice::Long offset, int size, Ice::Long& newOf size = _messageSizeMax; } + if(size <= 5) + { + throw FileNotAvailableException("maximum bytes per read request is too low"); + } + ifstream is(file.c_str()); if(is.fail()) { @@ -148,12 +153,28 @@ FileCache::read(const string& file, Ice::Long offset, int size, Ice::Long& newOf #else is.seekg(static_cast<streampos>(offset)); #endif - int totalSize = 1024; // Some room for the message header. + int totalSize = 0; string line; - for(int i = 0; is.good() && totalSize < size; ++i) + for(int i = 0; is.good(); ++i) { getline(is, line); - totalSize += line.size() + 5; // 5 bytes for the encoding of the string size (worst case scenario) + int lineSize = line.size() + 5; // 5 bytes for the encoding of the string size (worst case scenario) + if(lineSize + totalSize > size) + { + if(size - totalSize - 5) // If there's some room left for a part of the string, return a partial string + { + line.substr(0, size - totalSize - 5); + lines.push_back(line); + newOffset += line.size(); + } + else + { + lines.push_back(""); + } + break; + } + + totalSize += lineSize; if(!is.fail()) { newOffset = is.tellg(); |