blob: 41aa4d1c4139b3015c89998487f9bc1f5da1fd0a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Nokia and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nokia - Initial API and implementation
*******************************************************************************/
#ifndef TCFOUTPUTSTREAM_H
#define TCFOUTPUTSTREAM_H
#include <string>
#include <map>
#ifdef __cplusplus
extern "C" {
#endif
#include "mdep.h"
#include "streams.h"
#include "json.h"
#ifdef __cplusplus
}
#endif
class TCFOutputStream {
public:
TCFOutputStream(OutputStream* out);
~TCFOutputStream();
void writeReplyHeader(const char* token);
/**
* Write an error reply, indicating an error and optionally emitting null objects
* in place of the contents that would be expected in a successful case, then
* complete the reply.
* @error if message==NULL, then a system or TCF error code
* @addNullObjects number of null objects to emit after the error code
* @message if not NULL, the custom format (text) for the message
* @serviceName if not NULL, an additional specifier for the service that caused the error
*/
void writeErrorReply(int error, int addNullObjects = 0, const char* message = 0, const char* serviceName = 0);
/**
* Write the given error code and optional message and service identifier.
* @error if message==NULL, then a system or TCF error code, otherwise a custom code
* @message if not NULL, the custom format (text) for the message
* @serviceName if not NULL, an additional specifier for the service that caused the error
*/
void writeError(int error, const char* message = 0, const char* serviceName = 0);
void writeZero();
void writeComplete();
/**
* Write a complete reply, indicating success or an error, emitting N reply objects, and completing.
* @token the token for the reply header
* @error if message==NULL, then a system or TCF error code
* @addNullObjects number of null objects to emit after the error code
* @message if not NULL, the custom format (text) for the message
* @serviceName if not NULL, an additional specifier for the service that caused the error
*/
void writeCompleteReply(const char* token, int error, int addNullObjects = 0,
const char* message = 0, const char* serviceName = 0)
{
writeReplyHeader(token);
writeErrorReply(error, addNullObjects, message, serviceName);
}
void writeBinaryData(char* buffer, int bufferSize);
void writeCharacter(char character);
void writeBoolean(bool value);
void writeLong(long value);
void writeULong(unsigned long value);
void writeString(const std::string& str);
void writeStringZ(const std::string& str);
private:
OutputStream* out_; /* Output stream */
};
/**
* C++ wrapper for OutputStream.
*/
class TCFOutputStreamAdapter {
public:
/**
* Initialize, passing a pointer to an input stream to use.
* This is usually the address of "out" inside a Channel.
*/
TCFOutputStreamAdapter(OutputStream* output);
virtual ~TCFOutputStreamAdapter();
OutputStream* getOutputStream() { return theStream_; }
void setSupportsZeroCopy(bool supportsZeroCopy) { theStream_->supports_zero_copy = supportsZeroCopy; }
bool supportsZeroCopy() { return theStream_->supports_zero_copy; }
virtual void write(int byte) = 0;
virtual void write_block(const char * bytes, size_t size) = 0;
virtual ssize_t splice_block(int fd, size_t size, off_t * offset) = 0;
virtual void flush() = 0;
private:
OutputStream* theStream_;
static std::map<OutputStream*, TCFOutputStreamAdapter*> adapterMap;
static TCFOutputStreamAdapter* findOutputStream(OutputStream* stream);
static void write_impl(OutputStream* output, int byte);
static void write_block_impl(OutputStream * stream, const char * bytes, size_t size);
static ssize_t splice_block_impl(OutputStream * stream, int fd, size_t size, off_t * offset);
static void flush_impl(OutputStream * stream);
};
#endif