Working on 'maildir' implementation.

This commit is contained in:
Vincent Richard 2004-12-16 10:23:45 +00:00
parent 0dbc72f835
commit 62093084c5
2 changed files with 80 additions and 3 deletions

View File

@ -67,6 +67,12 @@ public:
return (*(m_header = new header()));
}
const int getHeaderParsedOffset() const { return (m_headerParsedOffset); }
const int getHeaderParsedLength() const { return (m_headerParsedLength); }
const int getBodyParsedOffset() const { return (m_bodyParsedOffset); }
const int getBodyParsedLength() const { return (m_bodyParsedLength); }
private:
maildirStructure* m_structure;
@ -270,20 +276,89 @@ void maildirMessage::setFlags(const int flags, const int mode)
void maildirMessage::extract(utility::outputStream& os,
progressionListener* progress, const int start, const int length) const
{
// TODO
extractImpl(os, progress, 0, m_size, start, length);
}
void maildirMessage::extractPart(const part& p, utility::outputStream& os,
progressionListener* progress, const int start, const int length) const
{
// TODO
const maildirPart& mp = dynamic_cast <const maildirPart&>(p);
extractImpl(os, progress, mp.getBodyParsedOffset(), mp.getBodyParsedLength(), start, length);
}
void maildirMessage::extractImpl(utility::outputStream& os, progressionListener* progress,
const int start, const int length, const int partialStart, const int partialLength) const
{
utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory();
const utility::file::path path = m_folder->getMessageFSPath(m_num);
utility::auto_ptr <utility::file> file = fsf->create(path);
utility::auto_ptr <utility::fileReader> reader = file->getFileReader();
utility::auto_ptr <utility::inputStream> is = reader->getInputStream();
is->skip(start + partialStart);
utility::stream::value_type buffer[8192];
utility::stream::size_type remaining = (partialLength == -1 ? length
: std::min(partialLength, length));
const int total = remaining;
int current = 0;
progress->start(total);
while (!is->eof() && remaining > 0)
{
const utility::stream::size_type read =
is->read(buffer, std::min(remaining, sizeof(buffer)));
remaining -= read;
current += read;
os.write(buffer, read);
progress->progress(current, total);
}
progress->stop(total);
}
void maildirMessage::fetchPartHeader(part& p)
{
// TODO
maildirPart& mp = dynamic_cast <maildirPart&>(p);
utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory();
const utility::file::path path = m_folder->getMessageFSPath(m_num);
utility::auto_ptr <utility::file> file = fsf->create(path);
utility::auto_ptr <utility::fileReader> reader = file->getFileReader();
utility::auto_ptr <utility::inputStream> is = reader->getInputStream();
is->skip(mp.getHeaderParsedOffset());
utility::stream::value_type buffer[1024];
utility::stream::size_type remaining = mp.getHeaderParsedLength();
string contents;
contents.reserve(remaining);
while (!is->eof() && remaining > 0)
{
const utility::stream::size_type read =
is->read(buffer, std::min(remaining, sizeof(buffer)));
remaining -= read;
contents.append(buffer, read);
}
mp.getOrCreateHeader().parse(contents);
}

View File

@ -77,6 +77,8 @@ private:
header& getOrCreateHeader();
void extractImpl(utility::outputStream& os, progressionListener* progress, const int start, const int length, const int partialStart, const int partialLength) const;
maildirFolder* m_folder;