Completed literal handling.
* LiteralHandler commands now receive the literal data as intended. * The 'fetch' command in the imap_tester now uses this to print the literal to stdout.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2011, Haiku Inc. All Rights Reserved.
|
||||
* Copyright 2010-2012, Haiku Inc. All Rights Reserved.
|
||||
* Copyright 2010 Clemens Zeidler. All rights reserved.
|
||||
*
|
||||
* Distributed under the terms of the MIT License.
|
||||
@@ -243,10 +243,15 @@ Protocol::ProcessCommand(Command& command, bigtime_t timeout)
|
||||
|
||||
|
||||
status_t
|
||||
Protocol::HandleResponse(bigtime_t timeout, bool disconnectOnTimeout)
|
||||
Protocol::HandleResponse(Command* command, bigtime_t timeout,
|
||||
bool disconnectOnTimeout)
|
||||
{
|
||||
status_t commandStatus = B_OK;
|
||||
IMAP::ResponseParser parser(*fBufferedSocket);
|
||||
if (IMAP::LiteralHandler* literalHandler
|
||||
= dynamic_cast<IMAP::LiteralHandler*>(command))
|
||||
parser.SetLiteralHandler(literalHandler);
|
||||
|
||||
IMAP::Response response;
|
||||
|
||||
bool done = false;
|
||||
@@ -329,7 +334,7 @@ Protocol::_ProcessCommandWithoutAfterQuake(Command& command, bigtime_t timeout)
|
||||
status_t status = SendCommand(commandID, commandString.String());
|
||||
if (status == B_OK) {
|
||||
fOngoingCommands[commandID] = &command;
|
||||
status = HandleResponse(timeout);
|
||||
status = HandleResponse(&command, timeout);
|
||||
}
|
||||
|
||||
if (handler != NULL)
|
||||
|
||||
@@ -82,7 +82,7 @@ public:
|
||||
const BString& CommandError() { return fCommandError; }
|
||||
|
||||
protected:
|
||||
status_t HandleResponse(
|
||||
status_t HandleResponse(Command* command,
|
||||
bigtime_t timeout = kIMAP4ClientTimeout,
|
||||
bool disconnectOnTimeout = true);
|
||||
void ProcessAfterQuacks(bigtime_t timeout);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011, Axel Dörfler, [email protected].
|
||||
* Copyright 2011-2012, Axel Dörfler, [email protected].
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
@@ -107,6 +107,37 @@ do_fetch(int argc, char** argv)
|
||||
from = to = atoul(argv[1]);
|
||||
|
||||
IMAP::FetchCommand command(from, to, mode);
|
||||
|
||||
// A fetch listener that dumps everything to stdout
|
||||
class Listener : public IMAP::FetchListener {
|
||||
public:
|
||||
virtual bool FetchData(IMAP::Response& reponse, uint32 uid,
|
||||
IMAP::FetchMode mode, BDataIO& stream, size_t length)
|
||||
{
|
||||
BMallocIO copy;
|
||||
char buffer[65535];
|
||||
while (length > 0) {
|
||||
ssize_t bytesRead = stream.Read(buffer,
|
||||
min_c(sizeof(buffer), length));
|
||||
if (bytesRead <= 0)
|
||||
break;
|
||||
|
||||
copy.Write(buffer, bytesRead);
|
||||
length -= bytesRead;
|
||||
}
|
||||
|
||||
// Null terminate the buffer
|
||||
char null = '\0';
|
||||
copy.Write(&null, 1);
|
||||
|
||||
printf("================= UID %ld =================\n", uid);
|
||||
puts((const char*)copy.Buffer());
|
||||
return true;
|
||||
}
|
||||
} listener;
|
||||
|
||||
command.SetListener(&listener);
|
||||
|
||||
status_t status = sProtocol.ProcessCommand(command);
|
||||
if (status != B_OK) {
|
||||
error("fetch", status);
|
||||
|
||||
Reference in New Issue
Block a user