//------------------------------------------------------------------------------ void MobiCoreDriverDaemon::processNotify(Connection *connection) { // Read entire command data MC_DRV_CMD_NOTIFY_struct cmd; //RECV_PAYLOAD_FROM_CLIENT(connection, &cmd); void *payload = (void *)((uintptr_t)&cmd + sizeof(mcDrvCommandHeader_t)); uint32_t payload_len = sizeof(cmd) - sizeof(mcDrvCommandHeader_t); uint32_t rlen = connection->readData(payload, payload_len); if ((int) rlen < 0) { LOG_E("reading from Client failed"); /* it is questionable, if writing to broken socket has any effect here. */ // NOTE: notify fails silently //writeResult(connection, MC_DRV_RSP_SOCKET_ERROR); return; } if (rlen != payload_len) { LOG_E("wrong buffer length %i received from Client", rlen); // NOTE: notify fails silently //writeResult(connection, MC_DRV_RSP_PAYLOAD_LENGTH_ERROR); return; } // Device required MobiCoreDevice *device = (MobiCoreDevice *) (connection->connectionData); if (NULL == device) { LOG_V("%s: no device associated with connection", __FUNCTION__); // NOTE: notify fails silently // writeResult(connection,MC_DRV_RSP_DEVICE_NOT_OPENED); return; } device->notify(connection, cmd.sessionId); // NOTE: for notifications there is no response at all }
//------------------------------------------------------------------------------ void MobiCoreDriverDaemon::processNotify( Connection *connection ) { do { // Read entire command data mcDrvCmdNotifyPayload_t cmdNotifyPayload; uint32_t rlen = connection->readData( &cmdNotifyPayload, sizeof(cmdNotifyPayload)); if (sizeof(cmdNotifyPayload) != rlen) { LOG_E("processNotify(): NotifyPayload length error: %d", rlen); // NOTE: notify fails silently // writeResult(connection,MC_DRV_RSP_PAYLOAD_LENGTH_ERROR); break; } // Device required MobiCoreDevice *device = (MobiCoreDevice *) (connection->connectionData); if (NULL == device) { LOG_E("processNotify(): device is NULL"); // NOTE: notify fails silently // writeResult(connection,MC_DRV_RSP_DEVICE_NOT_OPENED); break; } // REV axh: we cannot trust the clientLib to give us a valid // sessionId here. Thus we have to check that it belongs to // the clientLib's process. device->notify(cmdNotifyPayload.sessionId); // NOTE: for notifications there is no response at all } while(0); }