1/*
2 * Copyright 2007-2009 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com
3 * Copyright 2008 Mika Lindqvist, monni1995_at_gmail.com
4 * All rights reserved. Distributed under the terms of the MIT License.
5 */
6
7#include "LocalDeviceHandler.h"
8
9
10LocalDeviceHandler::LocalDeviceHandler(HCIDelegate* hd)
11{
12	fHCIDelegate = hd;
13	fProperties = new BMessage();
14}
15
16
17LocalDeviceHandler::~LocalDeviceHandler()
18{
19	delete fHCIDelegate;
20	delete fProperties;
21}
22
23
24hci_id
25LocalDeviceHandler::GetID()
26{
27	return fHCIDelegate->Id();
28}
29
30
31status_t
32LocalDeviceHandler::Launch(void)
33{
34	return fHCIDelegate->Launch();
35}
36
37
38bool
39LocalDeviceHandler::Available()
40{
41
42	return true;
43}
44
45
46void
47LocalDeviceHandler::Acquire(void)
48{
49
50}
51
52
53bool
54LocalDeviceHandler::IsPropertyAvailable(const char* property)
55{
56	type_code typeFound;
57	int32 countFound;
58
59	return (fProperties->GetInfo(property, &typeFound, &countFound) == B_OK );
60}
61
62
63void
64LocalDeviceHandler::AddWantedEvent(BMessage* msg)
65{
66	fEventsWanted.Lock();
67	// TODO: review why it is needed to replicate the msg
68//	printf("Adding request... %p\n", msg);
69	fEventsWanted.AddMessage(msg);
70	fEventsWanted.Unlock();
71}
72
73
74void
75LocalDeviceHandler::ClearWantedEvent(BMessage* msg)
76{
77	fEventsWanted.Lock();
78	fEventsWanted.RemoveMessage(msg);
79	fEventsWanted.Unlock();
80}
81
82
83void
84LocalDeviceHandler::ClearWantedEvent(BMessage* msg, uint16 event, uint16 opcode)
85{
86	// Remove the whole petition from queue
87	fEventsWanted.Lock();
88
89	int16 eventFound;
90	int16 opcodeFound;
91	int32 eventIndex = 0;
92
93	// for each Event
94	while (msg->FindInt16("eventExpected", eventIndex, &eventFound) == B_OK) {
95
96		printf("%s:Event expected %d@%" B_PRId32 "...\n", __FUNCTION__, event,
97			eventIndex);
98
99		if (eventFound == event) {
100
101			printf("%s:Event matches@%" B_PRId32 "\n", __FUNCTION__, eventIndex);
102			// there is an opcode specified
103			if (opcode != 0) {
104
105				// The opcode matches
106				if ((msg->FindInt16("opcodeExpected", eventIndex, &opcodeFound) == B_OK)
107					&& ((uint16)opcodeFound == opcode)) {
108
109					// this should remove only the entry
110					printf("Removed event %#x and opcode %d from request %p\n",
111						event, opcode, msg);
112					(void)msg->RemoveData("eventExpected", eventIndex);
113					(void)msg->RemoveData("opcodeExpected", eventIndex);
114					goto finish;
115				}
116
117			} else {
118				// Event matches so far
119				printf("Removed event %d from message %p\n", event, msg);
120				(void)msg->RemoveData("eventExpected", eventIndex);
121				goto finish;
122			}
123
124		}
125		eventIndex++;
126	}
127	printf("%s:Nothing Found/Removed\n", __FUNCTION__);
128
129finish:
130	fEventsWanted.Unlock();
131
132}
133
134
135BMessage*
136LocalDeviceHandler::FindPetition(uint16 event, uint16 opcode, int32* indexFound)
137{
138	//debug data
139	int16 eventFound;
140	int16 opcodeFound;
141	int32 eventIndex;
142
143	fEventsWanted.Lock();
144	// for each Petition
145	for (int32 index = 0 ; index < fEventsWanted.CountMessages() ; index++) {
146		BMessage* msg = fEventsWanted.FindMessage(index);
147//		printf("%s:Petition %ld ... of %ld msg #%p\n", __FUNCTION__, index,
148//			fEventsWanted.CountMessages(), msg);
149//		msg->PrintToStream();
150		eventIndex = 0;
151
152		// for each Event
153		while (msg->FindInt16("eventExpected", eventIndex, &eventFound) == B_OK ) {
154			if (eventFound == event) {
155
156//				printf("%s:Event %d found@%ld...", __FUNCTION__, event, eventIndex);
157				// there is an opcode specified..
158				if (msg->FindInt16("opcodeExpected", eventIndex, &opcodeFound)
159					== B_OK) {
160					// ensure the opcode
161					if ((uint16)opcodeFound != opcode) {
162//						printf("%s:opcode does not match %d\n",
163//							__FUNCTION__, opcode);
164						eventIndex++;
165						continue;
166					}
167//					printf("Opcode matches %d\n", opcode);
168				} else {
169//					printf("No opcode specified\n");
170				}
171
172				fEventsWanted.Unlock();
173				if (indexFound != NULL)
174					*indexFound = eventIndex;
175				return msg;
176			}
177			eventIndex++;
178		}
179	}
180//	printf("%s:Event %d not found\n", __FUNCTION__, event);
181
182	fEventsWanted.Unlock();
183	return NULL;
184
185}
186