From 82427071c1ca63c3621c81db1230b26fc2ee30ed Mon Sep 17 00:00:00 2001 From: "Bruno G. Albuquerque" Date: Thu, 21 Aug 2008 02:33:19 +0000 Subject: [PATCH] - Added skeleton for new cddb_server. - Includes all relevant handling of CDDA exported attributes so you guys can see where I am going with this. CDDB handling (including server connection, request and response parsing) will come up next. In the future we will also have a configuration panel and a Deskbar replicant for controlling it. Do we really have to edit the Jamfile in the parent dir to get something building with our build system? git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27096 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/Jamfile | 1 + src/servers/cddb_daemon/Jamfile | 6 ++ src/servers/cddb_daemon/cddb_daemon.cpp | 103 ++++++++++++++++++++++++ src/servers/cddb_daemon/cddb_daemon.h | 26 ++++++ 4 files changed, 136 insertions(+) create mode 100644 src/servers/cddb_daemon/Jamfile create mode 100644 src/servers/cddb_daemon/cddb_daemon.cpp create mode 100644 src/servers/cddb_daemon/cddb_daemon.h diff --git a/src/servers/Jamfile b/src/servers/Jamfile index 7c52e1676b7..5f1b67f86a0 100644 --- a/src/servers/Jamfile +++ b/src/servers/Jamfile @@ -2,6 +2,7 @@ SubDir HAIKU_TOP src servers ; SubInclude HAIKU_TOP src servers app ; SubInclude HAIKU_TOP src servers bluetooth ; +SubInclude HAIKU_TOP src servers cddb_daemon ; SubInclude HAIKU_TOP src servers debug ; SubInclude HAIKU_TOP src servers input ; SubInclude HAIKU_TOP src servers mail ; diff --git a/src/servers/cddb_daemon/Jamfile b/src/servers/cddb_daemon/Jamfile new file mode 100644 index 00000000000..e4feb508efc --- /dev/null +++ b/src/servers/cddb_daemon/Jamfile @@ -0,0 +1,6 @@ +SubDir HAIKU_TOP src servers cddb_daemon ; + +Server cddb_daemon : + cddb_daemon.cpp + : be + ; diff --git a/src/servers/cddb_daemon/cddb_daemon.cpp b/src/servers/cddb_daemon/cddb_daemon.cpp new file mode 100644 index 00000000000..7ce6cb2800e --- /dev/null +++ b/src/servers/cddb_daemon/cddb_daemon.cpp @@ -0,0 +1,103 @@ +/* + * Copyright 2008, Bruno Albuquerque, bga@bug-br.org.br. All rights reserved. + * Distributed under the terms of the MIT License. + */ + +#include "cddb_daemon.h" + +#include +#include + +#include +#include +#include + +#include + + +static const char* kCddaFsName = "cdda"; + + +CDDBDaemon::CDDBDaemon() + : BApplication("application/x-vnd.Haiku-CDDBDaemon") + , _volumeRoster(new BVolumeRoster) +{ + _volumeRoster->StartWatching(); + + BVolume volume; + while (_volumeRoster->GetNextVolume(&volume) == B_OK) { + uint32 cddbId; + if (CanLookup(volume.Device(), &cddbId)) { + printf("CD can be looked up. CDDB id = %lu.\n", cddbId); + // TODO(bga): Implement and enable CDDB database lookup. + } + } +} + + +CDDBDaemon::~CDDBDaemon() +{ + _volumeRoster->StopWatching(); + delete _volumeRoster; +} + + +void +CDDBDaemon::MessageReceived(BMessage* message) +{ + switch(message->what) { + case B_NODE_MONITOR: + int32 opcode; + if (message->FindInt32("opcode", &opcode) == B_OK) { + if (opcode == B_DEVICE_MOUNTED) { + dev_t device; + if (message->FindInt32("new device", &device) == B_OK) { + uint32 cddbId; + if (CanLookup(device, &cddbId)) { + printf("CD can be looked up. CDDB id = %lu.\n", + cddbId); + // TODO(bga): Implement and enable CDDB database lookup. + } + } + } + } + break; + default: + BApplication::MessageReceived(message); + } +} + + +bool +CDDBDaemon::CanLookup(const dev_t device, uint32* cddbId) const +{ + // Is it an Audio disk? + fs_info info; + fs_stat_dev(device, &info); + if (strncmp(info.fsh_name, kCddaFsName, strlen(kCddaFsName)) != 0) + return false; + + // Does it have the CD:do_lookup attribute and is it true? + BVolume volume(device); + BDirectory directory; + volume.GetRootDirectory(&directory); + + bool doLookup; + if (directory.ReadAttr("CD:do_lookup", B_BOOL_TYPE, 0, (void *)&doLookup, + sizeof(bool)) < B_OK || !doLookup) + return false; + + // Does it have the CD:cddbid attribute? + if (directory.ReadAttr("CD:cddbid", B_UINT32_TYPE, 0, (void *)cddbId, + sizeof(uint32)) < B_OK) + return false; + + return true; +} + + +int main(void) { + CDDBDaemon* cddbDaemon = new CDDBDaemon(); + cddbDaemon->Run(); + delete cddbDaemon; +} diff --git a/src/servers/cddb_daemon/cddb_daemon.h b/src/servers/cddb_daemon/cddb_daemon.h new file mode 100644 index 00000000000..58284baab70 --- /dev/null +++ b/src/servers/cddb_daemon/cddb_daemon.h @@ -0,0 +1,26 @@ +/* + * Copyright 2008, Bruno Albuquerque, bga@bug-br.org.br. All rights reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef CDDB_DAEMON_H +#define CDDB_DAEMON_H + +#include +#include +#include + +class CDDBDaemon : public BApplication +{ +public: + CDDBDaemon(); + virtual ~CDDBDaemon(); + + virtual void MessageReceived(BMessage* message); + +private: + bool CanLookup(const dev_t device, uint32* cddbId) const; + + BVolumeRoster* _volumeRoster; +}; + +#endif