>From 367a7ec014442b47be615ccbde8dc7441bfb466c Mon Sep 17 00:00:00 2001 From: Filip Onkelinx Date: Tue, 31 Mar 2009 22:28:22 +0200 Subject: [PATCH] using uevent to get kernel notifications for usb cable changed Signed-off-by: Filip Onkelinx --- devices/neo/server/neohardware.cpp | 79 ++ devices/neo/server/neohardware.h | 6 +- 2 files changed, 85 insertions(+), 1 deletions(-) diff --git a/devices/neo/server/neohardware.cpp b/devices/neo/server/neohardware.cpp index e259094..fca61bc 100644 --- a/devices/neo/server/neohardware.cpp +++ b/devices/neo/server/neohardware.cpp @@ -44,6 +44,16 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include QTOPIA_TASK(NeoHardware, NeoHardware); @@ -52,10 +62,31 @@ NeoHardware::NeoHardware() vsoUsbCable("/Hardware/UsbGadget"), vsoNeoHardware("/Hardware/Neo") { + struct sockaddr_nl snl; adaptor = new QtopiaIpcAdaptor("QPE/NeoHardware"); qLog(Hardware) << "neohardware"; + memset(&snl, 0x00, sizeof(struct sockaddr_nl)); + snl.nl_family = AF_NETLINK; + snl.nl_pid = getpid(); + snl.nl_groups = 1; + snl.nl_groups = 0x1; + + int hotplug_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); + if (hotplug_sock == -1) { + qLog(Hardware) << "error getting uevent socket: "<< strerror(errno); + }else{ + if ( bind(hotplug_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl)) < 0) { + qLog(Hardware) << "uevent bind failed: "<< strerror(errno); + hotplug_sock = -1; + }else{ + ueventSocket = new QTcpSocket(this); + ueventSocket->setSocketDescriptor(hotplug_sock); + connect(ueventSocket, SIGNAL(readyRead()), this, SLOT(uevent())); + } + } + cableConnected(getCableStatus()); vsoPortableHandsfree.setAttribute("Present", false); @@ -77,6 +108,54 @@ NeoHardware::~NeoHardware() { } +char *NeoHardware::findAttribute(char *buf, int len, const char *token) +{ +int pos=0; + + while (posbytesAvailable(); + int readCount = UEVENT_BUFFER_SIZE; + if (bytesAvail < readCount) + readCount = bytesAvail; + ueventSocket->read(&buffer[0],readCount); + if(strcmp(buffer,"change@/class/power_supply/usb")==0) + { + value=findAttribute(buffer,readCount,"POWER_SUPPLY_ONLINE="); + qDebug()<<"usb change event; online='"< #include +#include #include #include @@ -48,15 +49,18 @@ private: QValueSpaceObject vsoUsbCable; QValueSpaceObject vsoNeoHardware; QtopiaIpcAdaptor *adaptor; + QTcpSocket *ueventSocket; void findHardwareVersion(); QtopiaIpcAdaptor *audioMgr; - + char *findAttribute(char *buf, int len, const char *token); + private slots: void headphonesInserted(bool); void cableConnected(bool); void shutdownRequested(); bool getCableStatus(); + void uevent(); }; -- 1.4.4.4