summaryrefslogtreecommitdiff
path: root/hfpd
diff options
context:
space:
mode:
authorsamr7 <samr7@126591fb-c623-4b62-a76d-97a8e4f34109>2008-10-24 20:25:10 +0000
committersamr7 <samr7@126591fb-c623-4b62-a76d-97a8e4f34109>2008-10-24 20:25:10 +0000
commite0bdf753a463bd2cd2880a70084bcc8ba69162d0 (patch)
tree11ce5bcb4ea7e00163cbb08ee7dbb0bd17f1a396 /hfpd
parent53ee70fd2e4c59b4e7b6d221e4cc594e2d1c13b4 (diff)
downloadnohands-e0bdf753a463bd2cd2880a70084bcc8ba69162d0.tar.gz
Add support for directing log messages to hfconsole using the LogMessage signal.
Add Claimed, NotifyClaimChanged to AudioGateway. Add VoluntaryDisconnect to AudioGateway, and add it as a boolean parameter to the NotifyStateChanged signal. Remove signal masking for missing imports in hfconsole. That's egregious. git-svn-id: http://nohands.svn.sourceforge.net/svnroot/nohands/trunk@14 126591fb-c623-4b62-a76d-97a8e4f34109
Diffstat (limited to 'hfpd')
-rw-r--r--hfpd/hfpd.cpp3
-rw-r--r--hfpd/objects.cpp77
-rw-r--r--hfpd/objects.h13
-rw-r--r--hfpd/util.cpp29
-rw-r--r--hfpd/util.h7
5 files changed, 124 insertions, 5 deletions
diff --git a/hfpd/hfpd.cpp b/hfpd/hfpd.cpp
index a0d4c9a..510f492 100644
--- a/hfpd/hfpd.cpp
+++ b/hfpd/hfpd.cpp
@@ -180,6 +180,9 @@ main(int argc, char **argv)
return 1;
}
+ /* Send log messages to D-Bus */
+ disp.cb_LogExt.Register(&hf, &HandsFree::LogMessage);
+
if (!do_foreground && !Daemonize())
return 1;
diff --git a/hfpd/objects.cpp b/hfpd/objects.cpp
index ce6cd5a..975e099 100644
--- a/hfpd/objects.cpp
+++ b/hfpd/objects.cpp
@@ -220,11 +220,19 @@ AudioGateway::
void AudioGateway::
OwnerDisconnectNotify(DbusPeerDisconnectNotifier *notp)
{
+ dbus_bool_t claim;
char buf[32];
assert(notp == m_owner);
m_sess->GetDevice()->GetAddr(buf);
GetDi()->LogInfo("AG %s: D-Bus owner disconnected\n", buf);
+
+ claim = false;
+ (void) SendSignalArgs(HFPD_AUDIOGATEWAY_INTERFACE_NAME,
+ "ClaimStateChanged",
+ DBUS_TYPE_BOOLEAN, &claim,
+ DBUS_TYPE_INVALID);
+
delete notp;
m_owner = 0;
if (!m_known)
@@ -291,10 +299,16 @@ bool AudioGateway::
UpdateState(AudioGatewayState st)
{
const unsigned char state = (char) st;
+ dbus_bool_t dc;
+
+ dc = ((st == HFPD_AG_DISCONNECTED) &&
+ m_sess->IsPriorDisconnectVoluntary());
+
if ((st != m_state) &&
!SendSignalArgs(HFPD_AUDIOGATEWAY_INTERFACE_NAME,
"StateChanged",
DBUS_TYPE_BYTE, &state,
+ DBUS_TYPE_BOOLEAN, &dc,
DBUS_TYPE_INVALID))
return false;
@@ -363,6 +377,8 @@ void AudioGateway::
NotifyConnection(libhfp::HfpSession *sessp)
{
AudioGatewayState st;
+ char addr[32];
+
st = State();
if (!m_hf->m_accept_unknown &&
@@ -377,8 +393,24 @@ NotifyConnection(libhfp::HfpSession *sessp)
st = State();
}
- if (st == HFPD_AG_DISCONNECTED)
+ if (st == HFPD_AG_DISCONNECTED) {
+ /*
+ * If the user pushed the "disconnect bluetooth" button
+ * on the device, don't keep trying to reconnect.
+ * Instead, disable auto-reconnect.
+ */
+ if (m_sess->IsPriorDisconnectVoluntary() &&
+ m_sess->IsAutoReconnect()) {
+ m_sess->GetDevice()->GetAddr(addr);
+ if (!m_hf->m_config->Set("devices", addr, false) ||
+ !m_hf->SaveConfig()) {
+ /* Nothing much we can do. */
+ }
+ m_sess->SetAutoReconnect(false);
+ }
+
DoDisconnect();
+ }
else if (st == HFPD_AG_CONNECTING) {
/*
@@ -684,6 +716,20 @@ GetVoiceState(DBusMessage *msgp, unsigned char &val)
}
bool AudioGateway::
+GetClaimed(DBusMessage *msgp, bool &val)
+{
+ val = (m_owner != 0);
+ return true;
+}
+
+bool AudioGateway::
+GetVoluntaryDisconnect(DBusMessage *msgp, bool &val)
+{
+ val = m_sess->IsPriorDisconnectVoluntary();
+ return true;
+}
+
+bool AudioGateway::
GetAddress(DBusMessage *msgp, const DbusProperty *propp, DBusMessageIter &mi)
{
char bdaddr[32], *bap;
@@ -996,6 +1042,19 @@ LoadDeviceConfig(void)
}
}
+void HandsFree::
+LogMessage(libhfp::DispatchInterface::logtype_t lt, const char *msg)
+{
+ dbus_uint32_t ltu;
+
+ ltu = (dbus_uint32_t) lt;
+ (void) SendSignalArgs(HFPD_HANDSFREE_INTERFACE_NAME,
+ "LogMessage",
+ DBUS_TYPE_UINT32, &ltu,
+ DBUS_TYPE_STRING, &msg,
+ DBUS_TYPE_INVALID);
+}
+
AudioGateway *HandsFree::
FindAudioGateway(const char *agpath)
{
@@ -1422,7 +1481,7 @@ AddDevice(DBusMessage *msgp)
DbusPeer *peerp = 0;
const char *addr, *path;
bool remove_dn = false, unsetknown = false, res;
- dbus_bool_t setknown;
+ dbus_bool_t setknown, claim;
res = dbus_message_iter_init(msgp, &mi);
assert(res);
@@ -1469,6 +1528,12 @@ AddDevice(DBusMessage *msgp)
GetDi()->LogInfo("AG %s: claimed by D-Bus peer %s\n",
addr, peerp->GetName());
+
+ claim = true;
+ (void) agp->SendSignalArgs(HFPD_AUDIOGATEWAY_INTERFACE_NAME,
+ "ClaimStateChanged",
+ DBUS_TYPE_BOOLEAN, &claim,
+ DBUS_TYPE_INVALID);
}
if (setknown && !agp->m_known) {
@@ -1519,6 +1584,7 @@ RemoveDevice(DBusMessage *msgp)
DBusMessageIter mi;
DbusPeer *peerp = 0;
const char *addr;
+ dbus_bool_t claim;
bool res;
res = dbus_message_iter_init(msgp, &mi);
@@ -1569,6 +1635,13 @@ RemoveDevice(DBusMessage *msgp)
if (agp->m_owner) {
GetDi()->LogInfo("AG %s: disowned by D-Bus peer %s\n",
addr, agp->m_owner->GetPeer()->GetName());
+
+ claim = false;
+ (void) agp->SendSignalArgs(HFPD_AUDIOGATEWAY_INTERFACE_NAME,
+ "ClaimStateChanged",
+ DBUS_TYPE_BOOLEAN, &claim,
+ DBUS_TYPE_INVALID);
+
delete agp->m_owner;
agp->m_owner = 0;
sessp->Put();
diff --git a/hfpd/objects.h b/hfpd/objects.h
index 5bc84c8..4d3e376 100644
--- a/hfpd/objects.h
+++ b/hfpd/objects.h
@@ -120,6 +120,8 @@ public:
bool GetState(DBusMessage *msgp, unsigned char &val);
bool GetCallState(DBusMessage *msgp, unsigned char &val);
bool GetVoiceState(DBusMessage *msgp, unsigned char &val);
+ bool GetClaimed(DBusMessage *msgp, bool &val);
+ bool GetVoluntaryDisconnect(DBusMessage *msgp, bool &val);
bool GetAddress(DBusMessage *msgp, const DbusProperty *propp,
DBusMessageIter &mi);
bool GetName(DBusMessage *msgp, const char * &val);
@@ -152,9 +154,10 @@ static const DbusMethod g_AudioGateway_methods[] = {
};
static const DbusMethod g_AudioGateway_signals[] = {
- DbusSignalEntry(StateChanged, "y"),
+ DbusSignalEntry(StateChanged, "yb"),
DbusSignalEntry(CallStateChanged, "y"),
DbusSignalEntry(VoiceStateChanged, "y"),
+ DbusSignalEntry(ClaimStateChanged, "b"),
DbusSignalEntry(Ring, "ss"),
DbusSignalEntry(IndicatorChanged, "si"),
DbusSignalEntry(NameResolved, "s"),
@@ -172,6 +175,10 @@ static const DbusProperty g_AudioGateway_properties[] = {
GetCallState),
DbusPropertyMarshallImmutable(unsigned char, VoiceState, AudioGateway,
GetVoiceState),
+ DbusPropertyMarshallImmutable(bool, Claimed, AudioGateway,
+ GetClaimed),
+ DbusPropertyMarshallImmutable(bool, VoluntaryDisconnect, AudioGateway,
+ GetVoluntaryDisconnect),
DbusPropertyRawImmutable("s", Address, AudioGateway, GetAddress),
DbusPropertyMarshallImmutable(const char *, Name, AudioGateway,
GetName),
@@ -227,6 +234,9 @@ public:
bool SaveConfig(bool force = false);
void LoadDeviceConfig(void);
+ void LogMessage(libhfp::DispatchInterface::logtype_t lt,
+ const char *msg);
+
AudioGateway *GetAudioGateway(libhfp::HfpSession *sessp) {
return !sessp ? 0 :
(sessp->GetPrivate()
@@ -309,6 +319,7 @@ static const DbusMethod g_HandsFree_signals[] = {
DbusSignalEntry(InquiryResult, "su"),
DbusSignalEntry(AudioGatewayAdded, "s"),
DbusSignalEntry(AudioGatewayRemoved, "s"),
+ DbusSignalEntry(LogMessage, "us"),
{ 0, }
};
diff --git a/hfpd/util.cpp b/hfpd/util.cpp
index 223e770..5f2662e 100644
--- a/hfpd/util.cpp
+++ b/hfpd/util.cpp
@@ -123,14 +123,42 @@ SetSyslog(bool enable, libhfp::DispatchInterface::logtype_t elevate)
}
void SyslogDispatcher::
+LogExt(DispatchInterface::logtype_t lt, const char *fmt, va_list ap)
+{
+ char buf[4096];
+ int len;
+ len = vsnprintf(buf, sizeof(buf), fmt, ap);
+ if (len < 0) {
+ /* This is bad news */
+ return;
+ }
+
+ /* Trim trailing newlines */
+ while (len && ((buf[len - 1] == '\r') || (buf[len - 1] == '\n'))) {
+ len--;
+ buf[len] = '\0';
+ }
+
+ cb_LogExt(lt, buf);
+}
+
+
+void SyslogDispatcher::
LogVa(libhfp::DispatchInterface::logtype_t lt, const char *fmt, va_list ap)
{
libhfp::DispatchInterface::logtype_t syslog_lt;
int syslog_prio;
+ va_list acpy;
if (lt > m_level)
return;
+ if (cb_LogExt.Registered()) {
+ va_copy(acpy, ap);
+ LogExt(lt, fmt, acpy);
+ va_end(acpy);
+ }
+
if (m_syslog) {
syslog_lt = lt;
if (m_syslog && (syslog_lt > m_syslog_elevate))
@@ -162,7 +190,6 @@ LogVa(libhfp::DispatchInterface::logtype_t lt, const char *fmt, va_list ap)
vsyslog(syslog_prio, fmt, ap);
}
if (m_stderr) {
- va_list acpy;
va_copy(acpy, ap);
vfprintf(stderr, fmt, acpy);
va_end(acpy);
diff --git a/hfpd/util.h b/hfpd/util.h
index e49c234..cf996dd 100644
--- a/hfpd/util.h
+++ b/hfpd/util.h
@@ -28,15 +28,20 @@
extern bool Daemonize(void);
class SyslogDispatcher : public libhfp::IndepEventDispatcher {
-public:
DispatchInterface::logtype_t m_level;
bool m_stderr;
bool m_syslog;
DispatchInterface::logtype_t m_syslog_elevate;
+ void LogExt(DispatchInterface::logtype_t, const char *fmt, va_list ap);
+
+public:
SyslogDispatcher(void);
virtual ~SyslogDispatcher(void);
+ libhfp::Callback<void, DispatchInterface::logtype_t, const char *>
+ cb_LogExt;
+
void SetLevel(DispatchInterface::logtype_t lt) { m_level = lt; }
void SetStderr(bool enable) { m_stderr = enable; }
void SetSyslog(bool enable, DispatchInterface::logtype_t elevate =