1 /*
2 * Copyright 2004-2010, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Andrew Bachmann
7 */
8
9
10 #include "AddOnMonitor.h"
11 #include "AddOnMonitorHandler.h"
12 #include <Message.h>
13 #include <MessageRunner.h>
14 #include <Messenger.h>
15 #include <stdio.h>
16
17
AddOnMonitor()18 AddOnMonitor::AddOnMonitor()
19 :
20 BLooper("AddOnMonitor"),
21 fInitCheck(B_NO_INIT),
22 fPulseRunner(NULL)
23 {
24 }
25
26
AddOnMonitor(AddOnMonitorHandler * handler)27 AddOnMonitor::AddOnMonitor(AddOnMonitorHandler* handler)
28 :
29 BLooper("AddOnMonitor"),
30 fInitCheck(B_NO_INIT),
31 fPulseRunner(NULL)
32 {
33 SetHandler(handler);
34
35 thread_id id = Run();
36 if (id < 0) {
37 fInitCheck = (status_t)id;
38 fprintf(stderr, "AddOnMonitor() : bad id returned by Run()\n");
39 return;
40 }
41 }
42
43
~AddOnMonitor()44 AddOnMonitor::~AddOnMonitor()
45 {
46 delete fPulseRunner;
47 }
48
49
50 status_t
InitCheck()51 AddOnMonitor::InitCheck()
52 {
53 return fInitCheck;
54 }
55
56
57 void
SetHandler(AddOnMonitorHandler * handler)58 AddOnMonitor::SetHandler(AddOnMonitorHandler* handler)
59 {
60 if (handler == NULL)
61 return;
62
63 AddHandler(handler);
64 SetPreferredHandler(handler);
65
66 delete fPulseRunner;
67 fPulseRunner = NULL;
68
69 status_t status;
70 BMessenger messenger(handler, this, &status);
71 if (status != B_OK) {
72 fInitCheck = status;
73 return;
74 }
75
76 BMessage pulseMessage(B_PULSE);
77 fPulseRunner = new(std::nothrow) BMessageRunner(messenger, &pulseMessage,
78 1000000);
79 if (fPulseRunner == NULL) {
80 fInitCheck = B_NO_MEMORY;
81 return;
82 }
83
84 status = fPulseRunner->InitCheck();
85 if (status != B_OK) {
86 fInitCheck = status;
87 fprintf(stderr, "AddOnMonitor() : bad status returned by "
88 "fPulseRunner->InitCheck()\n");
89 return;
90 }
91
92 // Send an initial message to process added directories immediately
93 messenger.SendMessage(&pulseMessage);
94
95 fInitCheck = B_OK;
96 }
97