diff options
author | samr7 <samr7@126591fb-c623-4b62-a76d-97a8e4f34109> | 2008-10-24 20:25:10 +0000 |
---|---|---|
committer | samr7 <samr7@126591fb-c623-4b62-a76d-97a8e4f34109> | 2008-10-24 20:25:10 +0000 |
commit | e0bdf753a463bd2cd2880a70084bcc8ba69162d0 (patch) | |
tree | 11ce5bcb4ea7e00163cbb08ee7dbb0bd17f1a396 /hfpd | |
parent | 53ee70fd2e4c59b4e7b6d221e4cc594e2d1c13b4 (diff) | |
download | nohands-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.cpp | 3 | ||||
-rw-r--r-- | hfpd/objects.cpp | 77 | ||||
-rw-r--r-- | hfpd/objects.h | 13 | ||||
-rw-r--r-- | hfpd/util.cpp | 29 | ||||
-rw-r--r-- | hfpd/util.h | 7 |
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, <u, + 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 = |