186 lines
3.8 KiB
C++
186 lines
3.8 KiB
C++
/*
|
|
* Copyright 2007-2009 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com
|
|
* Copyright 2008 Mika Lindqvist, monni1995_at_gmail.com
|
|
* All rights reserved. Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
#include "LocalDeviceHandler.h"
|
|
|
|
|
|
LocalDeviceHandler::LocalDeviceHandler(HCIDelegate* hd)
|
|
{
|
|
fHCIDelegate = hd;
|
|
fProperties = new BMessage();
|
|
}
|
|
|
|
|
|
LocalDeviceHandler::~LocalDeviceHandler()
|
|
{
|
|
delete fHCIDelegate;
|
|
delete fProperties;
|
|
}
|
|
|
|
|
|
hci_id
|
|
LocalDeviceHandler::GetID()
|
|
{
|
|
return fHCIDelegate->Id();
|
|
}
|
|
|
|
|
|
status_t
|
|
LocalDeviceHandler::Launch(void)
|
|
{
|
|
return fHCIDelegate->Launch();
|
|
}
|
|
|
|
|
|
bool
|
|
LocalDeviceHandler::Available()
|
|
{
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
void
|
|
LocalDeviceHandler::Acquire(void)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
bool
|
|
LocalDeviceHandler::IsPropertyAvailable(const char* property)
|
|
{
|
|
type_code typeFound;
|
|
int32 countFound;
|
|
|
|
return (fProperties->GetInfo(property, &typeFound, &countFound) == B_OK );
|
|
}
|
|
|
|
|
|
void
|
|
LocalDeviceHandler::AddWantedEvent(BMessage* msg)
|
|
{
|
|
fEventsWanted.Lock();
|
|
// TODO: review why it is needed to replicate the msg
|
|
// printf("Adding request... %p\n", msg);
|
|
fEventsWanted.AddMessage(msg);
|
|
fEventsWanted.Unlock();
|
|
}
|
|
|
|
|
|
void
|
|
LocalDeviceHandler::ClearWantedEvent(BMessage* msg)
|
|
{
|
|
fEventsWanted.Lock();
|
|
fEventsWanted.RemoveMessage(msg);
|
|
fEventsWanted.Unlock();
|
|
}
|
|
|
|
|
|
void
|
|
LocalDeviceHandler::ClearWantedEvent(BMessage* msg, uint16 event, uint16 opcode)
|
|
{
|
|
// Remove the whole petition from queue
|
|
fEventsWanted.Lock();
|
|
|
|
int16 eventFound;
|
|
int16 opcodeFound;
|
|
int32 eventIndex = 0;
|
|
|
|
// for each Event
|
|
while (msg->FindInt16("eventExpected", eventIndex, &eventFound) == B_OK) {
|
|
|
|
printf("%s:Event expected %d@%" B_PRId32 "...\n", __FUNCTION__, event,
|
|
eventIndex);
|
|
|
|
if (eventFound == event) {
|
|
|
|
printf("%s:Event matches@%" B_PRId32 "\n", __FUNCTION__, eventIndex);
|
|
// there is an opcode specified
|
|
if (opcode != 0) {
|
|
|
|
// The opcode matches
|
|
if ((msg->FindInt16("opcodeExpected", eventIndex, &opcodeFound) == B_OK)
|
|
&& ((uint16)opcodeFound == opcode)) {
|
|
|
|
// this should remove only the entry
|
|
printf("Removed event %#x and opcode %d from request %p\n",
|
|
event, opcode, msg);
|
|
(void)msg->RemoveData("eventExpected", eventIndex);
|
|
(void)msg->RemoveData("opcodeExpected", eventIndex);
|
|
goto finish;
|
|
}
|
|
|
|
} else {
|
|
// Event matches so far
|
|
printf("Removed event %d from message %p\n", event, msg);
|
|
(void)msg->RemoveData("eventExpected", eventIndex);
|
|
goto finish;
|
|
}
|
|
|
|
}
|
|
eventIndex++;
|
|
}
|
|
printf("%s:Nothing Found/Removed\n", __FUNCTION__);
|
|
|
|
finish:
|
|
fEventsWanted.Unlock();
|
|
|
|
}
|
|
|
|
|
|
BMessage*
|
|
LocalDeviceHandler::FindPetition(uint16 event, uint16 opcode, int32* indexFound)
|
|
{
|
|
//debug data
|
|
int16 eventFound;
|
|
int16 opcodeFound;
|
|
int32 eventIndex;
|
|
|
|
fEventsWanted.Lock();
|
|
// for each Petition
|
|
for (int32 index = 0 ; index < fEventsWanted.CountMessages() ; index++) {
|
|
BMessage* msg = fEventsWanted.FindMessage(index);
|
|
// printf("%s:Petition %ld ... of %ld msg #%p\n", __FUNCTION__, index,
|
|
// fEventsWanted.CountMessages(), msg);
|
|
// msg->PrintToStream();
|
|
eventIndex = 0;
|
|
|
|
// for each Event
|
|
while (msg->FindInt16("eventExpected", eventIndex, &eventFound) == B_OK ) {
|
|
if (eventFound == event) {
|
|
|
|
// printf("%s:Event %d found@%ld...", __FUNCTION__, event, eventIndex);
|
|
// there is an opcode specified..
|
|
if (msg->FindInt16("opcodeExpected", eventIndex, &opcodeFound)
|
|
== B_OK) {
|
|
// ensure the opcode
|
|
if ((uint16)opcodeFound != opcode) {
|
|
// printf("%s:opcode does not match %d\n",
|
|
// __FUNCTION__, opcode);
|
|
eventIndex++;
|
|
continue;
|
|
}
|
|
// printf("Opcode matches %d\n", opcode);
|
|
} else {
|
|
// printf("No opcode specified\n");
|
|
}
|
|
|
|
fEventsWanted.Unlock();
|
|
if (indexFound != NULL)
|
|
*indexFound = eventIndex;
|
|
return msg;
|
|
}
|
|
eventIndex++;
|
|
}
|
|
}
|
|
// printf("%s:Event %d not found\n", __FUNCTION__, event);
|
|
|
|
fEventsWanted.Unlock();
|
|
return NULL;
|
|
|
|
}
|