ports/104552: [PATCH]: x11/kdebase3 Enable HAL backend support
Maxim Samsonov
xors at sendmail.ru
Wed Oct 18 21:40:43 UTC 2006
>Number: 104552
>Category: ports
>Synopsis: [PATCH]: x11/kdebase3 Enable HAL backend support
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Wed Oct 18 21:40:18 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator: Maxim Samsonov
>Release: FreeBSD 6.2-PRERELEASE i386
>Organization:
>Environment:
>Description:
This patch enables HAL backend support for KDE media manager
and adds the dependencies on sysutils/hal, devel/dbus-qt3(pr: ports/104547).
>How-To-Repeat:
>Fix:
--- kdebase3.diff begins here ---
diff -rubdBN kdebase3.orig/Makefile kdebase3/Makefile
--- kdebase3.orig/Makefile Wed Oct 18 14:24:45 2006
+++ kdebase3/Makefile Thu Oct 19 01:06:30 2006
@@ -22,6 +22,8 @@
xmkmf:${X_IMAKE_PORT}
LIB_DEPENDS= sasl2:${PORTSDIR}/security/cyrus-sasl2 \
smbclient:${PORTSDIR}/net/samba-libsmbclient \
+ dbus-qt-1.1:${PORTSDIR}/devel/dbus-qt3 \
+ hal.1:${PORTSDIR}/sysutils/hal \
usb-0.1:${PORTSDIR}/devel/libusb
CONFLICTS= kdeartwork-3.[2-3]* kdelibs-3.[0-4]* kdeutils-3.[0-2]*
@@ -46,7 +48,7 @@
LDCONFIG_DIRS+= %%PREFIX%%/lib %%PREFIX%%/lib/kde3
CONFIGURE_ENV+= RUN_KAPPFINDER=no kde_cv_utmp_file=/var/run/utmp
-CONFIGURE_ARGS+=--without-hal \
+CONFIGURE_ARGS+=--with-hal \
--without-java \
--with-qt-dir=${X11BASE} \
--with-xdmdir=${X11BASE}/lib/X11/xdm \
diff -rubdBN kdebase3.orig/files/patch-kioslave_media_mediamanager-halbackend.cpp kdebase3/files/patch-kioslave_media_mediamanager-halbackend.cpp
--- kdebase3.orig/files/patch-kioslave_media_mediamanager-halbackend.cpp Thu Jan 1 03:00:00 1970
+++ kdebase3/files/patch-kioslave_media_mediamanager-halbackend.cpp Thu Oct 19 00:38:15 2006
@@ -0,0 +1,175 @@
+--- kioslave/media/mediamanager/halbackend.cpp.orig Wed Oct 18 21:11:02 2006
++++ kioslave/media/mediamanager/halbackend.cpp Thu Oct 19 00:29:42 2006
+@@ -17,8 +17,9 @@
+ */
+
+ #include "halbackend.h"
+-#include "linuxcdpolling.h"
+
++#include <fcntl.h>
++#include <unistd.h>
+ #include <stdlib.h>
+
+ #include <klocale.h>
+@@ -348,6 +349,120 @@
+ delete m;
+ }
+
++bool HALBackend::hasDirectory(const QCString &devNode, const QCString &dir)
++{
++ bool ret = false; // return value
++ int fd = 0; // file descriptor for drive
++ unsigned short bs; // the discs block size
++ unsigned short bts; // the path table size (in blocks)
++ unsigned short ts; // the path table size (in bytes)
++ unsigned int btl; // the path table location (in blocks)
++ unsigned int tl; // the path table location (in bytes)
++ unsigned char len_di = 0; // length of the directory name in current path table entry
++ unsigned int parent = 0; // the number of the parent directory's path table entry
++ char dirname[256]; // filename for the current path table entry
++ int pos = 0; // our position into the path table
++ QCString fixed_directory = dir.upper(); // the uppercase version of the "directory" parameter
++ unsigned char buf[4096]; // the read buffer
++ unsigned char *sbuf = buf+2048; // the half part of the read buffer pointer
++ unsigned char *ptr; // the read buffer pointer
++ int rts; // the initial read path table size (in bytes)
++
++ // open the drive
++ fd = open(devNode, O_RDONLY | O_NONBLOCK);
++ if (fd == -1) return false;
++
++ // read the info block
++ lseek(fd, 0x8000, SEEK_SET);
++ if (read(fd, buf, 2048) != 2048)
++ {
++ close(fd);
++ return false;
++ }
++ // read the block size
++ bs = *(unsigned short *)(buf+0x80);
++ if (Q_BYTE_ORDER != Q_LITTLE_ENDIAN)
++ bs = ((bs << 8) & 0xFF00) | ((bs >> 8) & 0xFF);
++
++ // read in size of path table
++ ts = *(unsigned short *)(buf+0x84);
++ if (Q_BYTE_ORDER != Q_LITTLE_ENDIAN)
++ ts = ((ts << 8) & 0xFF00) | ((ts >> 8) & 0xFF);
++
++ // read in which block path table is in
++ btl = *(unsigned int *)(buf+0x8C);
++ if (Q_BYTE_ORDER != Q_LITTLE_ENDIAN)
++ btl = ((btl << 24) & 0xFF000000) | ((btl << 8) & 0xFF0000) |
++ ((btl >> 8) & 0xFF00) | ((btl >> 24) & 0xFF);
++
++ // seek to the path table
++ tl = btl*bs;
++ lseek(fd, tl&(~0x7FF), SEEK_SET);
++
++ // read the path table
++ bts = (ts+(tl&0x7FF))/2048;
++ rts = !bts ? 2048 : 4096;
++ if (read(fd, buf, rts) != rts)
++ {
++ close(fd);
++ return false;
++ }
++ if (bts) --bts;
++ ptr = buf+(tl&0x7FF);
++
++ // loop through the path table entries
++ while (pos < ts)
++ {
++ // get the length of the filename of the current entry
++ len_di = *ptr;
++
++ // get the record number of this entry's parent
++ // i'm pretty sure that the 1st entry is always the top directory
++ parent = *(unsigned short *)(ptr+6);
++ if (Q_BYTE_ORDER != Q_LITTLE_ENDIAN)
++ parent = ((parent << 8) & 0xFF00) | ((parent >> 8) & 0xFF);
++
++ // read the name
++ bcopy(ptr+8, dirname, len_di);
++ dirname[len_di] = 0;
++ qstrcpy(dirname, QCString(dirname).upper());
++
++ // if we found a folder that has the root as a parent, and the directory name matches
++ // then return success
++ if ((parent == 1) && (dirname == fixed_directory))
++ {
++ ret = true;
++ break;
++ }
++
++ // all path table entries are padded to be even, so if this is an odd-length table, seek a byte to fix it
++ if (len_di%2 == 1)
++ {
++ ++pos;
++ ++ptr;
++ }
++
++ // update our position
++ pos += 8 + len_di;
++ ptr += 8 + len_di;
++ if (bts && ptr >= sbuf )
++ {
++ --bts;
++ ptr -= 2048;
++ bcopy(sbuf, buf, 2048);
++ // read the path table
++ if (read(fd, sbuf, 2048) != 2048)
++ {
++ close(fd);
++ return false;
++ }
++ }
++ }
++
++ close(fd);
++ return ret;
++}
++
+ void HALBackend::setVolumeProperties(Medium* medium)
+ {
+ kdDebug(1219) << "HALBackend::setVolumeProperties for " << medium->id() << endl;
+@@ -407,28 +522,24 @@
+ else
+ mimeType = "media/dvd" + MOUNT_SUFFIX;
+
+- if (libhal_volume_disc_has_audio(halVolume) && !libhal_volume_disc_has_data(halVolume))
++ /* check if the disc id a vcd or a video dvd */
++ if (libhal_volume_disc_has_data(halVolume))
++ {
++ QCString devNode = libhal_volume_get_device_file(halVolume);
++ if (hasDirectory(devNode, "video_ts"))
++ mimeType = "media/dvdvideo";
++ else if (hasDirectory(devNode, "vcd"))
++ mimeType = "media/vcd";
++ else if (hasDirectory(devNode, "svcd"))
++ mimeType = "media/svcd";
++ }
++ else if (libhal_volume_disc_has_audio(halVolume))
+ {
+ mimeType = "media/audiocd";
+ medium->unmountableState( "audiocd:/?device=" + QString(libhal_volume_get_device_file(halVolume)) );
+ }
+
+ medium->setIconName(QString::null);
+-
+- /* check if the disc id a vcd or a video dvd */
+- DiscType type = LinuxCDPolling::identifyDiscType(libhal_volume_get_device_file(halVolume));
+- switch (type)
+- {
+- case DiscType::VCD:
+- mimeType = "media/vcd";
+- break;
+- case DiscType::SVCD:
+- mimeType = "media/svcd";
+- break;
+- case DiscType::DVD:
+- mimeType = "media/dvdvideo";
+- break;
+- }
+ }
+ else
+ {
diff -rubdBN kdebase3.orig/files/patch-kioslave_media_mediamanager-halbackend.h kdebase3/files/patch-kioslave_media_mediamanager-halbackend.h
--- kdebase3.orig/files/patch-kioslave_media_mediamanager-halbackend.h Thu Jan 1 03:00:00 1970
+++ kdebase3/files/patch-kioslave_media_mediamanager-halbackend.h Wed Oct 18 16:56:09 2006
@@ -0,0 +1,10 @@
+--- kioslave/media/mediamanager/halbackend.h.orig Sat Oct 14 21:08:31 2006
++++ kioslave/media/mediamanager/halbackend.h Wed Oct 18 16:41:14 2006
+@@ -197,6 +197,7 @@
+ void setFloppyProperties(Medium* medium);
+ void setCameraProperties(Medium* medium);
+ QString generateName(const QString &devNode);
++ bool hasDirectory(const QCString &devNode, const QCString &dir);
+
+ /* Hal call-backs -- from gvm*/
+ public:
--- kdebase3.diff ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list