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:
@@ -6,6 +6,7 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <new>
|
#include <new>
|
||||||
|
|
||||||
|
#include <AutoDeleter.h>
|
||||||
#include <Autolock.h>
|
#include <Autolock.h>
|
||||||
#include <DataIO.h>
|
#include <DataIO.h>
|
||||||
#include <MessagePrivate.h>
|
#include <MessagePrivate.h>
|
||||||
@@ -343,6 +344,46 @@ MessageDeliverer::DeliverMessage(const void *message, int32 messageSize,
|
|||||||
return DeliverMessage(message, messageSize, &target, 1, timeout);
|
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
|
// DeliverMessage
|
||||||
status_t
|
status_t
|
||||||
MessageDeliverer::DeliverMessage(const void *messageData, int32 messageSize,
|
MessageDeliverer::DeliverMessage(const void *messageData, int32 messageSize,
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ public:
|
|||||||
BMessenger target, bigtime_t timeout = B_INFINITE_TIMEOUT);
|
BMessenger target, bigtime_t timeout = B_INFINITE_TIMEOUT);
|
||||||
status_t DeliverMessage(const void *message, int32 messageSize,
|
status_t DeliverMessage(const void *message, int32 messageSize,
|
||||||
port_id port, int32 token, bigtime_t timeout = B_INFINITE_TIMEOUT);
|
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,
|
status_t DeliverMessage(const void *message, int32 messageSize,
|
||||||
const messaging_target *targets, int32 targetCount,
|
const messaging_target *targets, int32 targetCount,
|
||||||
bigtime_t timeout = B_INFINITE_TIMEOUT);
|
bigtime_t timeout = B_INFINITE_TIMEOUT);
|
||||||
|
|||||||
Reference in New Issue
Block a user