[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: KDE+HAL Часть вторая



В общем нарисовал я патчик для этой фигни:

http://gq.net.ru/2007/01/25/kde-mountoptions-patch/

Патч не совсем честный, просто потому, что честного метода похоже не
существует (точнее он заключается в том, чтобы задавать параметры в
настройках KDE, а не в HAL, но возможность их задавать появится только
в KDE 4). Тем не менее подожду еще немного (может из списка рассылки
ответят-таки) и попробую протолкнуть его в дебиановский пакет для Etch.
Типа “non-utf8-non-latin1 speaking communities need it very-very much”.

Для того, чтобы KDE монтировал флэшки (и другие носители) с iocharset,
а не с utf8 должен стоять пропатченный пакет kdebase-kio-plugin и в
настройках HAL должно быть следующее (эти настройки, кстати, заставляют
pmount-hal, gnome и ivman монтировать носители с правильной кодировкой):

root@vice:~# cat /etc/hal/fdi/policy/codepage.fdi
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
  <device>
    <match key="volume.fstype" string="vfat">
      <merge key="volume.policy.mount_option.utf8" type="bool">false</merge>
      <merge key="volume.policy.mount_option.iocharset=koi8-r" type="bool">true</merge>
      <merge key="volume.policy.mount_option.codepage=866" type="bool">true</merge>
    </match>
  </device>
</deviceinfo>

В принципе можно там дописать еще каких-нить опций, но учтите, что
опции можно только добавлять к тем, которые устанавливает KDE (отменять
можно только опцию utf8). Сделано так просто потому, что вменяемого
способа работы с ключами в libhal-storage нету, а добавлять проверку к
каждой опции мне показалось излишним.

Патч: 40_use_hal_mountoptions.diff
Пакет, собранный для Debian Etch:

    * kdebase-kio-plugins

Также пришлось обновить, чтобы не было проблем по зависимостям:

    * kcontrol
    * kdebase-bin
    * kdesktop
    * kfind
    * konqueror

В принципе все эти другие пакеты (которые тоже может потребоваться
обновить) ставится из репозитория

deb http://gq.net.ru/debian experimental/
diff -u -r kdebase-3.5.5a.dfsg.1.orig/kioslave/media/mediamanager/halbackend.cpp kdebase-3.5.5a.dfsg.1/kioslave/media/mediamanager/halbackend.cpp
--- kdebase-3.5.5a.dfsg.1.orig/kioslave/media/mediamanager/halbackend.cpp	2006-10-01 21:31:54.000000000 +0400
+++ kdebase-3.5.5a.dfsg.1/kioslave/media/mediamanager/halbackend.cpp	2007-01-25 00:20:57.036700891 +0300
@@ -745,6 +745,33 @@
     s_HALBackend->DeviceCondition(udi, condition_name);
 }
 
+QStringList HALBackend::getHALmountoptions(QString udi)
+{
+    const char*   _ppt_string;
+    LibHalVolume* volume;
+    LibHalDrive* drive;
+
+    QString _ppt_QString;
+    
+    volume = libhal_volume_from_udi( m_halContext, udi.latin1() );
+    if( volume )
+        drive = libhal_drive_from_udi( m_halContext, libhal_volume_get_storage_device_udi( volume ) );
+    else
+        drive = libhal_drive_from_udi( m_halContext, udi.latin1() );
+
+    if( !drive )
+	    return QString::null;
+
+    if( volume )
+       _ppt_string = libhal_volume_policy_get_mount_options ( drive, volume, NULL );
+    else
+       _ppt_string = libhal_drive_policy_get_mount_options ( drive, NULL );
+
+    _ppt_QString = QString(_ppt_string ? _ppt_string : "");
+
+   return QStringList::split(",",_ppt_QString);
+}
+
 QStringList HALBackend::mountoptions(const QString &name)
 {
     const Medium* medium = m_mediaList.findById(name);
@@ -824,7 +851,11 @@
     if (valids.contains("utf8"))
     {
         value = config.readBoolEntry("utf8", true);
-        tmp = QString("utf8=%1").arg(value ? "true" : "false");
+        tmp = QString("utf8=%1").arg(
+			(!libhal_device_property_exists(m_halContext, name.latin1(), "volume.policy.mount_option.utf8",NULL)&&value
+			 ||libhal_device_property_exists(m_halContext, name.latin1(), "volume.policy.mount_option.utf8",NULL)
+			 &&libhal_device_get_property_bool(m_halContext, name.latin1(), "volume.policy.mount_option.utf8",NULL)
+			 ) ? "true" : "false");
         result << tmp;
     }
 
@@ -1069,10 +1100,20 @@
             soptions << QString("data=ordered");
     }
 
+    QStringList hal_mount_options = getHALmountoptions(medium->id());
+    for (QValueListIterator<QString> it=hal_mount_options.begin();it!=hal_mount_options.end();it++)
+    {
+    	soptions << *it;
+	kdDebug()<<"HALOption: "<<*it<<endl;
+    }
+
     const char **options = new const char*[soptions.size() + 1];
     uint noptions = 0;
     for (QStringList::ConstIterator it = soptions.begin(); it != soptions.end(); ++it, ++noptions)
+    {
         options[noptions] = (*it).latin1();
+	kdDebug()<<"Option: "<<*it<<endl;
+    }
     options[noptions] = NULL;
 
     QString qerror = mount_priv(medium->id().latin1(), mount_point.utf8(), options, noptions, dbus_connection);
diff -u -r kdebase-3.5.5a.dfsg.1.orig/kioslave/media/mediamanager/halbackend.h kdebase-3.5.5a.dfsg.1/kioslave/media/mediamanager/halbackend.h
--- kdebase-3.5.5a.dfsg.1.orig/kioslave/media/mediamanager/halbackend.h	2006-07-22 12:15:45.000000000 +0400
+++ kdebase-3.5.5a.dfsg.1/kioslave/media/mediamanager/halbackend.h	2007-01-25 00:21:07.729315759 +0300
@@ -192,6 +192,7 @@
 				const char* message
 				);
 
+	QStringList getHALmountoptions(QString udi);
 /* HAL and DBus structures */
 private:
 	/**

Reply to: