Constructor and Destructor
BInvoker(BMessage* message,
BMessenger messenger);
BInvoker(BMessage* message,
const BHandler* handler,
const BLooper* looper = NULL);
BInvoker();
Initializes the BInvoker
by setting its message and its messenger.
The object's
BMessage
is taken
directly as message
—the object is
not copied. The BInvoker
takes
over ownership of the BMessage
that you pass in.
The object's BMessenger
is copied from messenger
, or initialized with
looper
and handler
. See the
BMessenger
class for
details on how a BMessenger
identifies a target.
If you want a reply handler, you have to call
SetHandlerForReply()
after the constructor returns. You can reset the message and messenger through
SetMessage()
and
SetTarget()
.
virtual ~BInvoker();
Deletes the object's
BMessage
.
BeginInvokeNotify(), EndInvokeNotify()
void BeginInvokeNotify(uint32 kind = B_CONTROL_INVOKED);
void EndInvokeNotify();
If for some reason you need to implement a method that emulates an InvokeNotify()
call inside an Invoke()
implementation, you should wrap the invocation code in these functions.
They set up and tear down an InvokeNotify()
context.
virtual status_t Invoke(BMessage* message = NULL);
status_t InvokeNotify(BMessage* message,
uint32 kind = B_CONTROL_INVOKED);
Invoke()
tells the
BInvoker
's messenger to send a message. If
message
is non-NULL
, that
message is sent, otherwise the object sends its default message (i.e. the
BMessage
that was
passed in the constructor or in
SetMessage()
).
The message is sent asynchronously with no time limit on the reply.
Note
Regarding the use of the default message vs
the argument, a common practice is to reserve the default message as a
template, and pass a fine-tuned copy to Invoke()
BMessage
copy
(invoker
.Message
());
copy
.AddInt64
("when", system_time
());
invoker
.Invoke
(copy
);
The InvokeNotify()
function sends the
message
to the target, using the notification change
code specified by kind
. If
message
is NULL
, nothing gets
sent to the target, but any watchers of the invoker's handler will receive
their expected notifications. By default, the kind
is B_CONTROL_INVOKED
, the same kind sent by a straight
Invoke()
.
Invoke()
doesn't call
SendNotices()
by default; you'll have to implement code to do it yourself. Here's how:
status_t BControl
::Invoke
(BMessage* msg
) {
bool notify
= false
;
uint32 kind
= InvokeKind
(notify
);
BMessage
clone
(kind
);
status_t err
= B_BAD_VALUE
;
if (!msg
&& !notify
) {
msg
= Message
();
}
if (!msg
) {
if( !IsWatched
() ) return err
;
} else {
clone
= *msg
;
}
clone
.AddInt64
("when", system_time
());
clone
.AddPointer
("source", this
);
clone
.AddInt32
("be:value",fValue
);
clone
.AddMessenger
(B_NOTIFICATION_SENDER
, BMessenger
(this
));
if( msg
) err
= BInvoker
::Invoke
(&clone
);
SendNotices
(kind
, clone
);
return err
;
}
Return Code | Description |
---|
B_OK .
| The message was sent. |
B_BAD_VALUE .
| No default message, and no message argument. |
Other errors. | Forwarded from BMessenger::SendMessage() . |
uint32 InvokeKind(bool* notify = NULL);
Returns the kind passed to
InvokeNotify()
.
This should be called from within your implementation of
Invoke()
if you need to determine what kind was specified when
InvokeNotify()
was called. If you care whether
Invoke()
or
InvokeNotify()
was originally called, you can specify a pointer to a bool,
notify
, which is set to true
if
InvokeNotify()
was called, or false
if
Invoke()
was called.
This lets you fetch the
InvokeNotify()
arguments from your
Invoke()
code without breaking compatibility with older applications by adding arguments
to Invoke()
.
SetHandlerForReply(), HandlerForReply()
virtual status_t SetHandlerForReply(BHandler* replyHandler);
BHandler* HandlerForReply() const;
SetHandlerForReply()
sets the BHandler
object that
handles replies that are sent back by the target. By default (or if
replyHandler
is NULL
), replies
are sent to the BApplication
object.
HandlerForReply()
returns the object set through
SetHandlerForReply()
. If the reply handler isn't
set, this function returns NULL
, it doesn't return
be_app
(even
though be_app
will be handling the reply).
Return Code | Description |
---|
B_OK
| SetHandlerForReply() always returns
B_OK it doesn't check for validity.
|
SetMessage(), Message(), Command()
virtual status_t SetMessage(BMessage* message);
BMessage* Message() const;
uint32 Command() const;
SetMessage()
sets the
BInvoker
's default message to point to
message
(the message is not
copied). The previous default message (if any) is deleted; a
NULL
message
deletes the
previous message without setting a new one. The
BInvoker
owns the BMessage
that you pass in;
you mustn't delete it yourself.
Message()
returns a pointer to the default
message, and Command()
returns its
what
data member. Lacking a default message, the
functions return NULL
.
Return Code | Description |
---|
B_OK
| SetMessage() always returns
B_OK .
|
SetTarget(), Target(), IsTargetLocal(), Messenger()
virtual status_t SetTarget(BMessenger messenger);
virtual status_t SetTarget(const BHandler* handler,
const BLooper* looper = NULL);
BHandler* Target(BLooper** looper = NULL) const;
bool IsTargetLocal() const;
BMessenger Messenger() const;
These functions set and query the BInvoker
's target.
This is the BHandler
to which the object sends a message when Invoke()
is
called. The target is represented by a BMessenger
object; you
can set the BMessenger
as a copy of
messenger
, or initialize it with
looper
and handler
. See the
BMessenger
class
for details on how a BMessenger
identifies a
target.
Target()
returns the BHandler
that's targeted
by the object's messenger. If looper
is
non-NULL
, the BLooper
that owns the BHandler
is returned by
reference. If the target was set as a looper's preferred handler (i.e.
SetTarget(NULL
, looper)), or if the target hasn't been set yet,
Target()
returns NULL
. The
function returns NULL
for both objects if the target
is remote.
IsTargetLocal()
returns true
if the target lives within the BInvoker
's
application, and false
if it belongs to some other
application.
Messenger()
returns a copy of the BMessenger
object the
BInvoker
uses to send messages. If a target hasn't
been set yet, the return will be invalid.
Return Code | Description |
---|
B_OK .
| The target was successfully set. |
B_BAD_VALUE .
| The proposed
handler doesn't belong to a BLooper . |
B_MISMATCHED_VALUES .
| handler
doesn't belong to looper .
|
status_t SetTimeout(bigtime_t timeout);
bigtime_t Timeout() const;
SetTimeout()
sets the timeout that will be used
when sending the invocation message to the invoker's target. By default
this is B_INFINITE_TIMEOUT
.
Timeout()
returns the current setting for this value.
Return Code | Description |
---|
B_OK .
| No error. |