1*5edcfe96SAxel Dörfler /*
2*5edcfe96SAxel Dörfler * Copyright 2001-2005, Haiku.
3*5edcfe96SAxel Dörfler * Distributed under the terms of the MIT License.
4*5edcfe96SAxel Dörfler *
5*5edcfe96SAxel Dörfler * Authors:
6*5edcfe96SAxel Dörfler * Marc Flerackers (mflerackers@androme.be)
7*5edcfe96SAxel Dörfler */
852a38012Sejakowatz
952a38012Sejakowatz
105c85a290Shaydentech #include <Invoker.h>
1152a38012Sejakowatz
1252a38012Sejakowatz
BInvoker(BMessage * message,BMessenger messenger)1319225ae1SMarc Flerackers BInvoker::BInvoker(BMessage* message, BMessenger messenger)
14*5edcfe96SAxel Dörfler :
15*5edcfe96SAxel Dörfler fMessage(message),
1619225ae1SMarc Flerackers fMessenger(messenger),
1752a38012Sejakowatz fReplyTo(NULL),
1819225ae1SMarc Flerackers fTimeout(B_INFINITE_TIMEOUT),
1919225ae1SMarc Flerackers fNotifyKind(0)
2052a38012Sejakowatz {
2152a38012Sejakowatz }
22*5edcfe96SAxel Dörfler
23*5edcfe96SAxel Dörfler
BInvoker(BMessage * message,const BHandler * handler,const BLooper * looper)2452a38012Sejakowatz BInvoker::BInvoker(BMessage* message, const BHandler* handler,
2552a38012Sejakowatz const BLooper* looper)
26*5edcfe96SAxel Dörfler :
27*5edcfe96SAxel Dörfler fMessage(message),
2852a38012Sejakowatz fMessenger(BMessenger(handler, looper)),
2952a38012Sejakowatz fReplyTo(NULL),
3019225ae1SMarc Flerackers fTimeout(B_INFINITE_TIMEOUT),
3119225ae1SMarc Flerackers fNotifyKind(0)
3252a38012Sejakowatz {
3352a38012Sejakowatz }
34*5edcfe96SAxel Dörfler
35*5edcfe96SAxel Dörfler
BInvoker()3619225ae1SMarc Flerackers BInvoker::BInvoker()
37*5edcfe96SAxel Dörfler :
38*5edcfe96SAxel Dörfler fMessage(NULL),
3952a38012Sejakowatz fReplyTo(NULL),
4019225ae1SMarc Flerackers fTimeout(B_INFINITE_TIMEOUT),
4119225ae1SMarc Flerackers fNotifyKind(0)
4252a38012Sejakowatz {
4352a38012Sejakowatz }
44*5edcfe96SAxel Dörfler
45*5edcfe96SAxel Dörfler
~BInvoker()4652a38012Sejakowatz BInvoker::~BInvoker()
4752a38012Sejakowatz {
4852a38012Sejakowatz delete fMessage;
4952a38012Sejakowatz }
50*5edcfe96SAxel Dörfler
51*5edcfe96SAxel Dörfler
52*5edcfe96SAxel Dörfler status_t
SetMessage(BMessage * message)53*5edcfe96SAxel Dörfler BInvoker::SetMessage(BMessage* message)
5452a38012Sejakowatz {
5519225ae1SMarc Flerackers if (fMessage == message)
5619225ae1SMarc Flerackers return B_OK;
5719225ae1SMarc Flerackers
5852a38012Sejakowatz delete fMessage;
5952a38012Sejakowatz fMessage = message;
6019225ae1SMarc Flerackers
6152a38012Sejakowatz return B_OK;
6252a38012Sejakowatz }
63*5edcfe96SAxel Dörfler
64*5edcfe96SAxel Dörfler
65*5edcfe96SAxel Dörfler BMessage*
Message() const66*5edcfe96SAxel Dörfler BInvoker::Message() const
6752a38012Sejakowatz {
6852a38012Sejakowatz return fMessage;
6952a38012Sejakowatz }
70*5edcfe96SAxel Dörfler
71*5edcfe96SAxel Dörfler
72*5edcfe96SAxel Dörfler uint32
Command() const73*5edcfe96SAxel Dörfler BInvoker::Command() const
7452a38012Sejakowatz {
7552a38012Sejakowatz if (fMessage)
7652a38012Sejakowatz return fMessage->what;
77*5edcfe96SAxel Dörfler
7819225ae1SMarc Flerackers return 0;
7952a38012Sejakowatz }
80*5edcfe96SAxel Dörfler
81*5edcfe96SAxel Dörfler
82*5edcfe96SAxel Dörfler status_t
SetTarget(BMessenger messenger)83*5edcfe96SAxel Dörfler BInvoker::SetTarget(BMessenger messenger)
8452a38012Sejakowatz {
8552a38012Sejakowatz fMessenger = messenger;
8619225ae1SMarc Flerackers return B_OK;
8719225ae1SMarc Flerackers }
88*5edcfe96SAxel Dörfler
89*5edcfe96SAxel Dörfler
90*5edcfe96SAxel Dörfler status_t
SetTarget(const BHandler * handler,const BLooper * looper)91*5edcfe96SAxel Dörfler BInvoker::SetTarget(const BHandler* handler, const BLooper* looper)
9219225ae1SMarc Flerackers {
9319225ae1SMarc Flerackers fMessenger = BMessenger(handler, looper);
9419225ae1SMarc Flerackers return B_OK;
9552a38012Sejakowatz }
96*5edcfe96SAxel Dörfler
97*5edcfe96SAxel Dörfler
98*5edcfe96SAxel Dörfler bool
IsTargetLocal() const99*5edcfe96SAxel Dörfler BInvoker::IsTargetLocal() const
10052a38012Sejakowatz {
10152a38012Sejakowatz return fMessenger.IsTargetLocal();
10252a38012Sejakowatz }
103*5edcfe96SAxel Dörfler
104*5edcfe96SAxel Dörfler
105*5edcfe96SAxel Dörfler BHandler*
Target(BLooper ** _looper) const106*5edcfe96SAxel Dörfler BInvoker::Target(BLooper** _looper) const
10752a38012Sejakowatz {
108*5edcfe96SAxel Dörfler return fMessenger.Target(_looper);
10952a38012Sejakowatz }
110*5edcfe96SAxel Dörfler
111*5edcfe96SAxel Dörfler
112*5edcfe96SAxel Dörfler BMessenger
Messenger() const113*5edcfe96SAxel Dörfler BInvoker::Messenger() const
11452a38012Sejakowatz {
11552a38012Sejakowatz return fMessenger;
11652a38012Sejakowatz }
117*5edcfe96SAxel Dörfler
118*5edcfe96SAxel Dörfler
119*5edcfe96SAxel Dörfler status_t
SetHandlerForReply(BHandler * replyHandler)120*5edcfe96SAxel Dörfler BInvoker::SetHandlerForReply(BHandler* replyHandler)
12152a38012Sejakowatz {
12219225ae1SMarc Flerackers fReplyTo = replyHandler;
12352a38012Sejakowatz return B_OK;
12452a38012Sejakowatz }
125*5edcfe96SAxel Dörfler
126*5edcfe96SAxel Dörfler
127*5edcfe96SAxel Dörfler BHandler*
HandlerForReply() const128*5edcfe96SAxel Dörfler BInvoker::HandlerForReply() const
12952a38012Sejakowatz {
13052a38012Sejakowatz return fReplyTo;
13152a38012Sejakowatz }
132*5edcfe96SAxel Dörfler
133*5edcfe96SAxel Dörfler
134*5edcfe96SAxel Dörfler status_t
Invoke(BMessage * message)135*5edcfe96SAxel Dörfler BInvoker::Invoke(BMessage* message)
13652a38012Sejakowatz {
13719225ae1SMarc Flerackers if (!message)
13819225ae1SMarc Flerackers message = Message();
13919225ae1SMarc Flerackers
14019225ae1SMarc Flerackers if (!message)
14119225ae1SMarc Flerackers return B_BAD_VALUE;
14219225ae1SMarc Flerackers
14319225ae1SMarc Flerackers return fMessenger.SendMessage(message, fReplyTo, fTimeout);
14452a38012Sejakowatz }
145*5edcfe96SAxel Dörfler
146*5edcfe96SAxel Dörfler
147*5edcfe96SAxel Dörfler status_t
InvokeNotify(BMessage * message,uint32 kind)148*5edcfe96SAxel Dörfler BInvoker::InvokeNotify(BMessage* message, uint32 kind)
14952a38012Sejakowatz {
15019225ae1SMarc Flerackers if (fNotifyKind != 0)
15119225ae1SMarc Flerackers return B_WOULD_BLOCK;
15252a38012Sejakowatz
15319225ae1SMarc Flerackers BeginInvokeNotify(kind);
15419225ae1SMarc Flerackers status_t err = Invoke(message);
15519225ae1SMarc Flerackers EndInvokeNotify();
15652a38012Sejakowatz
15752a38012Sejakowatz return err;
15852a38012Sejakowatz }
159*5edcfe96SAxel Dörfler
160*5edcfe96SAxel Dörfler
161*5edcfe96SAxel Dörfler status_t
SetTimeout(bigtime_t timeout)162*5edcfe96SAxel Dörfler BInvoker::SetTimeout(bigtime_t timeout)
16352a38012Sejakowatz {
16452a38012Sejakowatz fTimeout = timeout;
16552a38012Sejakowatz return B_OK;
16652a38012Sejakowatz }
167*5edcfe96SAxel Dörfler
168*5edcfe96SAxel Dörfler
169*5edcfe96SAxel Dörfler bigtime_t
Timeout() const170*5edcfe96SAxel Dörfler BInvoker::Timeout() const
17152a38012Sejakowatz {
17252a38012Sejakowatz return fTimeout;
17352a38012Sejakowatz }
174*5edcfe96SAxel Dörfler
175*5edcfe96SAxel Dörfler
176*5edcfe96SAxel Dörfler uint32
InvokeKind(bool * _notify)177*5edcfe96SAxel Dörfler BInvoker::InvokeKind(bool* _notify)
17852a38012Sejakowatz {
179*5edcfe96SAxel Dörfler if (_notify)
180*5edcfe96SAxel Dörfler *_notify = fNotifyKind != 0;
18152a38012Sejakowatz
18219225ae1SMarc Flerackers if (fNotifyKind != 0)
18352a38012Sejakowatz return fNotifyKind;
184*5edcfe96SAxel Dörfler
18519225ae1SMarc Flerackers return B_CONTROL_INVOKED;
18652a38012Sejakowatz }
187*5edcfe96SAxel Dörfler
188*5edcfe96SAxel Dörfler
189*5edcfe96SAxel Dörfler void
BeginInvokeNotify(uint32 kind)190*5edcfe96SAxel Dörfler BInvoker::BeginInvokeNotify(uint32 kind)
19152a38012Sejakowatz {
19252a38012Sejakowatz fNotifyKind = kind;
19352a38012Sejakowatz }
194*5edcfe96SAxel Dörfler
195*5edcfe96SAxel Dörfler
196*5edcfe96SAxel Dörfler void
EndInvokeNotify()197*5edcfe96SAxel Dörfler BInvoker::EndInvokeNotify()
19852a38012Sejakowatz {
19919225ae1SMarc Flerackers fNotifyKind = 0;
20052a38012Sejakowatz }
201*5edcfe96SAxel Dörfler
202*5edcfe96SAxel Dörfler
_ReservedInvoker1()20319225ae1SMarc Flerackers void BInvoker::_ReservedInvoker1() {}
_ReservedInvoker2()20419225ae1SMarc Flerackers void BInvoker::_ReservedInvoker2() {}
_ReservedInvoker3()20519225ae1SMarc Flerackers void BInvoker::_ReservedInvoker3() {}
206*5edcfe96SAxel Dörfler
207*5edcfe96SAxel Dörfler
BInvoker(const BInvoker &)20852a38012Sejakowatz BInvoker::BInvoker(const BInvoker &)
20952a38012Sejakowatz {
21052a38012Sejakowatz }
211*5edcfe96SAxel Dörfler
212*5edcfe96SAxel Dörfler
213*5edcfe96SAxel Dörfler BInvoker &
operator =(const BInvoker &)214*5edcfe96SAxel Dörfler BInvoker::operator=(const BInvoker &)
21552a38012Sejakowatz {
21652a38012Sejakowatz return *this;
21752a38012Sejakowatz }
218*5edcfe96SAxel Dörfler
219