From 41572514dd7fec9470bb4670ef4ba2ed05aaf74d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 7 Nov 2005 16:14:05 +0000 Subject: [PATCH] * Added BString version of LinkReceiver::ReadString(). * adopted this method for ServerLink as well. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14750 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/app/AppServerLink.h | 4 +-- headers/private/app/LinkReceiver.h | 5 ++++ headers/private/app/ServerLink.h | 9 ++++++ src/kits/app/LinkReceiver.cpp | 44 +++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/headers/private/app/AppServerLink.h b/headers/private/app/AppServerLink.h index 8aadb797db..4cfa944b21 100644 --- a/headers/private/app/AppServerLink.h +++ b/headers/private/app/AppServerLink.h @@ -17,8 +17,8 @@ namespace BPrivate { class AppServerLink : public ServerLink { public: - AppServerLink(void); - ~AppServerLink(void); + AppServerLink(); + ~AppServerLink(); }; } // namespace BPrivate diff --git a/headers/private/app/LinkReceiver.h b/headers/private/app/LinkReceiver.h index 602d3e8c99..19ab637ca1 100644 --- a/headers/private/app/LinkReceiver.h +++ b/headers/private/app/LinkReceiver.h @@ -5,12 +5,16 @@ * Authors: * DarkWyrm * Pahtz + * Axel Dörfler, axeld@pinc-software.de */ #ifndef _LINK_RECEIVER_H #define _LINK_RECEIVER_H + #include +class BString; + namespace BPrivate { @@ -28,6 +32,7 @@ class LinkReceiver { virtual status_t Read(void *data, ssize_t size); status_t ReadString(char **string); + status_t ReadString(BString& string); status_t ReadString(char *buffer, size_t bufferSize); template status_t Read(Type *data) { diff --git a/headers/private/app/ServerLink.h b/headers/private/app/ServerLink.h index 5648989bae..6e7ee68c6e 100644 --- a/headers/private/app/ServerLink.h +++ b/headers/private/app/ServerLink.h @@ -15,6 +15,8 @@ #include #include +class BString; + /* * Error checking rules: (for if you don't want to check every return code) @@ -58,6 +60,7 @@ class ServerLink { bool NeedsReply() const; status_t Read(void *data, ssize_t size); status_t ReadString(char *buffer, size_t bufferSize); + status_t ReadString(BString& string); status_t ReadString(char **string); status_t ReadRegion(BRegion *region); status_t ReadShape(BShape *shape); @@ -169,6 +172,12 @@ ServerLink::ReadString(char *buffer, size_t bufferSize) return fReceiver->ReadString(buffer, bufferSize); } +inline status_t +ServerLink::ReadString(BString& string) +{ + return fReceiver->ReadString(string); +} + inline status_t ServerLink::ReadString(char **string) { diff --git a/src/kits/app/LinkReceiver.cpp b/src/kits/app/LinkReceiver.cpp index 6c1f44684e..f28007cba6 100644 --- a/src/kits/app/LinkReceiver.cpp +++ b/src/kits/app/LinkReceiver.cpp @@ -15,6 +15,7 @@ #include #include +#include #include "link_message.h" @@ -296,6 +297,49 @@ LinkReceiver::ReadString(char **_string) } +status_t +LinkReceiver::ReadString(BString &string) +{ + int32 length = 0; + status_t status; + + status = Read(&length); + if (status < B_OK) + return status; + + if (length < 0) { + status = B_ERROR; + goto err; + } + + if (length > 0) { + char* buffer = string.LockBuffer(length + 1); + if (buffer == NULL) { + status = B_NO_MEMORY; + goto err; + } + + status = Read(buffer, length); + if (status < B_OK) { + string.UnlockBuffer(); + goto err; + } + + // make sure the string is null terminated + buffer[length] = '\0'; + string.UnlockBuffer(length); + } else + string = ""; + + return B_OK; + +err: + fRecvPosition -= sizeof(int32); + // rewind the transaction + return status; +} + + status_t LinkReceiver::ReadString(char *buffer, size_t bufferLength) {