/* * Copyright 2001-2005, Haiku. * Distributed under the terms of the MIT License. * * Authors: * DarkWyrm * Pahtz * Axel Dörfler, axeld@pinc-software.de */ #ifndef _LINK_SENDER_H #define _LINK_SENDER_H #include namespace BPrivate { class LinkSender { public: LinkSender(port_id sendport); virtual ~LinkSender(void); void SetPort(port_id port); port_id Port() { return fPort; } status_t StartMessage(int32 code, size_t minSize = 0); void CancelMessage(void); status_t EndMessage(bool needsReply = false); status_t Flush(bigtime_t timeout = B_INFINITE_TIMEOUT, bool needsReply = false); status_t Attach(const void *data, size_t size); status_t AttachString(const char *string, int32 maxLength = -1); template status_t Attach(const Type& data) { return Attach(&data, sizeof(Type)); } protected: size_t SpaceLeft() const { return fBufferSize - fCurrentEnd; } size_t CurrentMessageSize() const { return fCurrentEnd - fCurrentStart; } status_t AdjustBuffer(size_t newBufferSize, char **_oldBuffer = NULL); status_t FlushCompleted(size_t newBufferSize); port_id fPort; char *fBuffer; size_t fBufferSize; uint32 fCurrentEnd; // current append position uint32 fCurrentStart; // start of current message status_t fCurrentStatus; }; } // namespace BPrivate #endif /* _LINK_SENDER_H */