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
18AddOnMonitor::AddOnMonitor()
19	:
20	BLooper("AddOnMonitor"),
21	fInitCheck(B_NO_INIT),
22	fPulseRunner(NULL)
23{
24}
25
26
27AddOnMonitor::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
44AddOnMonitor::~AddOnMonitor()
45{
46	delete fPulseRunner;
47}
48
49
50status_t
51AddOnMonitor::InitCheck()
52{
53	return fInitCheck;
54}
55
56
57void
58AddOnMonitor::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