Added another DeliverMessage version for broadcasting.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11132 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2005-01-29 17:45:59 +00:00
parent 156e4f302b
commit f64fc02f89
2 changed files with 45 additions and 0 deletions
@@ -6,6 +6,7 @@
#include <map>
#include <new>
#include <AutoDeleter.h>
#include <Autolock.h>
#include <DataIO.h>
#include <MessagePrivate.h>
@@ -343,6 +344,46 @@ MessageDeliverer::DeliverMessage(const void *message, int32 messageSize,
return DeliverMessage(message, messageSize, &target, 1, timeout);
}
// DeliverMessage
status_t
MessageDeliverer::DeliverMessage(BMessage *message, const BMessenger *targets,
int32 targetCount, bigtime_t timeout)
{
if (!message || targetCount < 0 || !targets)
return B_BAD_VALUE;
// convert the reply targets
messaging_target *messagingTargets
= new(nothrow) messaging_target[targetCount];
if (!messagingTargets)
return B_NO_MEMORY;
ArrayDeleter<messaging_target> _(messagingTargets);
for (int i = 0; i < targetCount; i++) {
BMessenger messenger(targets[i]);
BMessenger::Private messengerPrivate(messenger);
messaging_target &target = messagingTargets[i];
target.port = messengerPrivate.Port();
target.token = messengerPrivate.IsPreferredTarget()
? B_PREFERRED_TOKEN : messengerPrivate.Token();
}
// Set a dummy token now, so that the header contains room for it.
// It will be set when sending the message anyway, but if it is not set
// before flattening, the header will not contain room for it, and it
// will not possible to send the message flattened later.
BMessage::Private(message).SetTarget(0, false);
// flatten the message
BMallocIO mallocIO;
status_t error = message->Flatten(&mallocIO);
if (error != B_OK)
return error;
return DeliverMessage(mallocIO.Buffer(), mallocIO.BufferLength(),
messagingTargets, targetCount, timeout);
}
// DeliverMessage
status_t
MessageDeliverer::DeliverMessage(const void *messageData, int32 messageSize,
+4
View File
@@ -31,6 +31,10 @@ public:
BMessenger target, bigtime_t timeout = B_INFINITE_TIMEOUT);
status_t DeliverMessage(const void *message, int32 messageSize,
port_id port, int32 token, bigtime_t timeout = B_INFINITE_TIMEOUT);
status_t DeliverMessage(BMessage *message, const BMessenger *targets,
int32 targetCount,
bigtime_t timeout = B_INFINITE_TIMEOUT);
status_t DeliverMessage(const void *message, int32 messageSize,
const messaging_target *targets, int32 targetCount,
bigtime_t timeout = B_INFINITE_TIMEOUT);