Debian Bug report logs - #596122
unblock: gvfs/1.6.3-2

Package: release.debian.org; Maintainer for release.debian.org is Debian Release Team <debian-release@lists.debian.org>;

Reported by: Josselin Mouette <joss@debian.org>

Date: Wed, 8 Sep 2010 18:36:01 UTC

Severity: normal

Done: Julien Cristau <jcristau@debian.org>

Bug is archived. No further changes may be made.

Toggle useless messages

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to debian-bugs-dist@lists.debian.org, Debian Release Team <debian-release@lists.debian.org>:
Bug#596122; Package release.debian.org. (Wed, 08 Sep 2010 18:36:04 GMT) Full text and rfc822 format available.

Acknowledgement sent to Josselin Mouette <joss@debian.org>:
New Bug report received and forwarded. Copy sent to Debian Release Team <debian-release@lists.debian.org>. (Wed, 08 Sep 2010 18:36:04 GMT) Full text and rfc822 format available.

Message #5 received at submit@bugs.debian.org (full text, mbox):

From: Josselin Mouette <joss@debian.org>
To: submit@bugs.debian.org
Subject: unblock: gvfs/1.6.3-2
Date: Wed, 08 Sep 2010 20:32:46 +0200
[Message part 1 (text/plain, inline)]
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: freeze-exception

Hi,

please unblock gvfs for squeeze, it is only a trivial RC bug fix.

gvfs (1.6.3-2) unstable; urgency=low
 .
   * Depend on fuse-utils 2.8.4. Closes: #585648.

Cheers,
-- 
 .''`.      Josselin Mouette
: :' :
`. `'  “If you behave this way because you are blackmailed by someone,
  `-    […] I will see what I can do for you.”  -- Jörg Schilling
[signature.asc (application/pgp-signature, inline)]

Information forwarded to debian-bugs-dist@lists.debian.org, Debian Release Team <debian-release@lists.debian.org>:
Bug#596122; Package release.debian.org. (Wed, 08 Sep 2010 19:00:09 GMT) Full text and rfc822 format available.

Acknowledgement sent to "Adam D. Barratt" <adam@adam-barratt.org.uk>:
Extra info received and forwarded to list. Copy sent to Debian Release Team <debian-release@lists.debian.org>. (Wed, 08 Sep 2010 19:00:09 GMT) Full text and rfc822 format available.

Message #10 received at 596122@bugs.debian.org (full text, mbox):

From: "Adam D. Barratt" <adam@adam-barratt.org.uk>
To: Josselin Mouette <joss@debian.org>, 596122@bugs.debian.org
Subject: Re: Bug#596122: unblock: gvfs/1.6.3-2
Date: Wed, 08 Sep 2010 19:56:24 +0100
block 596122 by 590274
thanks

On Wed, 2010-09-08 at 20:32 +0200, Josselin Mouette wrote:
> please unblock gvfs for squeeze, it is only a trivial RC bug fix.
> 
> gvfs (1.6.3-2) unstable; urgency=low
>  .
>    * Depend on fuse-utils 2.8.4. Closes: #585648.

While the gvfs fix is indeed trivial, fuse 2.8.4-1 is unable to migrate
due to a FTBFS on kfreebsd-* (#590274); marking this bug as blocked by
that.

Regards,

Adam




Added blocking bug(s) of 596122: 590274 Request was from "Adam D. Barratt" <adam@adam-barratt.org.uk> to control@bugs.debian.org. (Wed, 08 Sep 2010 19:00:10 GMT) Full text and rfc822 format available.

Information forwarded to debian-bugs-dist@lists.debian.org, Debian Release Team <debian-release@lists.debian.org>:
Bug#596122; Package release.debian.org. (Sat, 02 Oct 2010 10:51:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Josselin Mouette <joss@debian.org>:
Extra info received and forwarded to list. Copy sent to Debian Release Team <debian-release@lists.debian.org>. (Sat, 02 Oct 2010 10:51:03 GMT) Full text and rfc822 format available.

Message #17 received at 596122@bugs.debian.org (full text, mbox):

From: Josselin Mouette <joss@debian.org>
To: 596122@bugs.debian.org
Subject: Re: Bug#596122: unblock: gvfs/1.6.3-2
Date: Sat, 02 Oct 2010 12:48:09 +0200
[Message part 1 (text/plain, inline)]
Le mercredi 08 septembre 2010 à 19:56 +0100, Adam D. Barratt a écrit : 
> block 596122 by 590274
> thanks
> 
> On Wed, 2010-09-08 at 20:32 +0200, Josselin Mouette wrote:
> > please unblock gvfs for squeeze, it is only a trivial RC bug fix.
> > 
> > gvfs (1.6.3-2) unstable; urgency=low
> >  .
> >    * Depend on fuse-utils 2.8.4. Closes: #585648.
> 
> While the gvfs fix is indeed trivial, fuse 2.8.4-1 is unable to migrate
> due to a FTBFS on kfreebsd-* (#590274); marking this bug as blocked by
> that.

So, the situation has evolved.

First, fuse has been fixed in the meantime by a NMU. It’s just needing
an unblock.

Second, gvfs has been updated again. This update is appropriate for
squeeze, but the timing is unfortunate. It is solely a new upstream
release.

Major changes in 1.6.4 
======================
* Lots of translation updates
* afc: Add support for photo thumbnails on iOS4
* daemons: Move GConf initialization from backend constructor
* sftp: Use poll() to cope with openssh-5.6 changes

The OpenSSH change is not necessary per se since we ship 5.5, but the
GConf one fixes a deadlock, and iOS4 support really looks like a good
idea.

Non-translation changes attached.

Cheers,
-- 
 .''`.      Josselin Mouette
: :' :
`. `'  “If you behave this way because you are blackmailed by someone,
  `-    […] I will see what I can do for you.”  -- Jörg Schilling
[gvfs.diff (text/x-patch, inline)]
--- gvfs-1.6.3/daemon/gvfsbackendafc.c	2010-07-12 15:22:38.000000000 +0000
+++ gvfs-1.6.4/daemon/gvfsbackendafc.c	2010-09-27 14:51:51.000000000 +0000
@@ -43,6 +43,14 @@
 #define AFC_E_INVALID_ARG AFC_E_INVALID_ARGUMENT
 #endif /* !AFC_E_INVALID_ARG */
 
+typedef enum {
+  IOS_UNKNOWN = 0,
+  IOS1,
+  IOS2,
+  IOS3,
+  IOS4
+} HostOSVersion;
+
 struct _GVfsBackendAfc {
   GVfsBackend backend;
 
@@ -50,6 +58,7 @@
   char *service;
   char *model;
   gboolean connected;
+  HostOSVersion version;
 
   idevice_t dev;
   afc_client_t afc_cli;
@@ -391,6 +400,42 @@
       g_vfs_backend_set_icon_name (G_VFS_BACKEND(self), "phone-apple-iphone");
     }
 
+  /* Get the major OS version */
+  value = NULL;
+  self->version = IOS_UNKNOWN;
+  if (G_LIKELY(g_vfs_backend_lockdownd_check (lockdownd_get_value (lockdown_cli, NULL, "ProductVersion", &value), G_VFS_JOB(job)) == 0))
+    {
+      if (plist_get_node_type(value) == PLIST_STRING)
+        {
+          char *version_string = NULL;
+
+          plist_get_string_val(value, &version_string);
+          if (version_string)
+            {
+              /* parse version */
+              int maj = 0;
+              int min = 0;
+              int rev = 0;
+
+              sscanf(version_string, "%d.%d.%d", &maj, &min, &rev);
+              free(version_string);
+
+              switch (maj)
+                {
+                case 2:
+                  self->version = IOS2;
+                  break;
+                case 3:
+                  self->version = IOS3;
+                  break;
+                case 4:
+                  self->version = IOS4;
+                  break;
+                }
+            }
+        }
+    }
+
   lockdownd_client_free (lockdown_cli);
   lockdown_cli = NULL;
 
@@ -1026,33 +1071,98 @@
       strlen (basename) > 4 &&
       basename[strlen(basename) - 4] == '.')
     {
-      char *thumb_uri, *thumb_base, *thumb_path;
-      char *parent, *ptr, *no_suffix;
+      char *thumb_uri, *thumb_path;
+      char *no_suffix;
       char **thumb_afcinfo;
       GFile *thumb_file;
+      const char *suffix;
 
       GMountSpec *mount_spec;
       const char *port;
 
-      /* Parent directory */
-      ptr = strrchr (path, '/');
-      if (ptr == NULL)
-        return;
-      parent = g_strndup (path, ptr - path);
+      /* Handle thumbnails for movies as well */
+      if (g_str_has_suffix (path, ".MOV"))
+        suffix = "JPG";
+      else
+        suffix = "THM";
 
-      /* Basename with suffix replaced */
-      no_suffix = g_strndup (basename, strlen (basename) - 3);
-      thumb_base = g_strdup_printf ("%s%s", no_suffix, "THM");
-      g_free (no_suffix);
+      if (self->version == IOS2)
+        {
+          /* The thumbnails are side-by-side with the
+           * THM files in iOS2 */
 
-      /* Full thumbnail path */
-      thumb_path = g_build_filename (parent, ".MISC", thumb_base, NULL);
+          /* Remove the suffix */
+          no_suffix = g_strndup (path, strlen (path) - 3);
+          /* Replace with THM */
+          thumb_path = g_strdup_printf ("%s%s", no_suffix, suffix);
+          g_free (no_suffix);
+        }
+      else if (self->version == IOS3)
+        {
+          char *parent, *ptr;
+          char *thumb_base;
 
-      g_free (parent);
-      g_free (thumb_base);
+          /* The thumbnails are in the .MISC sub-directory, relative to the
+           * image itself, so:
+           * afc://xxx/DCIM/100APPLE/IMG_0001.JPG
+           * =>
+           * afc://xxx/DCIM/100APPLE/.MISC/IMG_0001.THM
+           */
+
+          /* Parent directory */
+          ptr = strrchr (path, '/');
+          if (ptr == NULL)
+                return;
+          parent = g_strndup (path, ptr - path);
+
+          /* Basename with suffix replaced */
+          no_suffix = g_strndup (basename, strlen (basename) - 3);
+          thumb_base = g_strdup_printf ("%s%s", no_suffix, suffix);
+          g_free (no_suffix);
+
+          /* Full thumbnail path */
+          thumb_path = g_build_filename (parent, ".MISC", thumb_base, NULL);
+
+          g_free (parent);
+          g_free (thumb_base);
+        }
+      else if (self->version == IOS4)
+        {
+          char **components;
+
+          /* The thumbnails are in the PhotoData/ so:
+           * afc://xxx/DCIM/100APPLE/IMG_0001.JPG
+           * =>
+           * afc://xxx/PhotoData/100APPLE/IMG_0001.THM
+           */
+
+          /* Replace the JPG by THM */
+          no_suffix = g_strndup (path, strlen (path) - 3);
+          thumb_path = g_strdup_printf ("%s%s", no_suffix, suffix);
+          g_free (no_suffix);
+
+          /* Replace DCIM with PhotoData */
+          components = g_strsplit (thumb_path, "/", -1);
+          g_free (thumb_path);
+          for (i = 0; components[i] != NULL; i++)
+            {
+              if (g_str_equal (components[i], "DCIM"))
+                {
+                  g_free (components[i]);
+                  components[i] = g_strdup ("PhotoData");
+                }
+            }
+          thumb_path = g_strjoinv ("/", components);
+          g_strfreev (components);
+        }
+      else
+        {
+          thumb_path = NULL;
+        }
 
       thumb_afcinfo = NULL;
-      if (afc_get_file_info (self->afc_cli, thumb_path, &thumb_afcinfo) != 0)
+      if (thumb_path == NULL ||
+          afc_get_file_info (self->afc_cli, thumb_path, &thumb_afcinfo) != 0)
         {
           g_strfreev (thumb_afcinfo);
           g_free (thumb_path);
@@ -1064,6 +1174,7 @@
       mount_spec = g_vfs_backend_get_mount_spec (G_VFS_BACKEND (self));
       port = g_mount_spec_get (mount_spec, "port");
       thumb_uri = g_strdup_printf ("afc://%s%s%s", self->uuid, port ? port : "", thumb_path);
+      g_free (thumb_path);
       thumb_file = g_file_new_for_uri (thumb_uri);
       g_free (thumb_uri);
 
--- gvfs-1.6.3/daemon/gvfsbackendsftp.c	2010-07-12 15:22:38.000000000 +0000
+++ gvfs-1.6.4/daemon/gvfsbackendsftp.c	2010-09-27 14:52:28.000000000 +0000
@@ -24,6 +24,7 @@
 #include <config.h>
 
 #include <stdlib.h>
+#include <sys/poll.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/time.h>
@@ -837,10 +838,9 @@
   GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend);
   GInputStream *prompt_stream;
   GOutputStream *reply_stream;
-  fd_set ifds;
-  struct timeval tv;
   int ret;
   int prompt_fd;
+  struct pollfd fds[2];
   char buffer[1024];
   gsize len;
   gboolean aborted = FALSE;
@@ -864,14 +864,12 @@
   ret_val = TRUE;
   while (1)
     {
-      FD_ZERO (&ifds);
-      FD_SET (stdout_fd, &ifds);
-      FD_SET (prompt_fd, &ifds);
-      
-      tv.tv_sec = SFTP_READ_TIMEOUT;
-      tv.tv_usec = 0;
+      fds[0].fd = stdout_fd;
+      fds[0].events = POLLIN;
+      fds[1].fd = prompt_fd;
+      fds[1].events = POLLIN;
       
-      ret = select (MAX (stdout_fd, prompt_fd)+1, &ifds, NULL, NULL, &tv);
+      ret = poll(fds, 2, SFTP_READ_TIMEOUT);
       
       if (ret <= 0)
         {
@@ -882,11 +880,11 @@
           break;
         }
       
-      if (FD_ISSET (stdout_fd, &ifds))
+      if (fds[0].revents)
         break; /* Got reply to initial INIT request */
       
-      g_assert (FD_ISSET (prompt_fd, &ifds));
-      
+      if (!(fds[1].revents & POLLIN))
+        continue;
       
       len = g_input_stream_read (prompt_stream,
                                  buffer, sizeof (buffer) - 1,
@@ -955,16 +953,18 @@
               g_free (new_password);
               
               if (op_backend->user_specified)
-                /* Translators: the first %s is the username, the second the host name */
                 if (strcmp (authtype, "publickey") == 0)
+                  /* Translators: the first %s is the username, the second the host name */
                   prompt = g_strdup_printf (_("Enter passphrase for key for ssh as %s on %s"), op_backend->user, op_backend->host);
                 else
+                  /* Translators: the first %s is the username, the second the host name */
                   prompt = g_strdup_printf (_("Enter password for ssh as %s on %s"), op_backend->user, op_backend->host);
               else
-                /* translators: %s here is the hostname */
                 if (strcmp (authtype, "publickey") == 0)
+                  /* Translators: %s is the hostname */
                   prompt = g_strdup_printf (_("Enter passphrase for key for ssh on %s"), op_backend->host);
                 else
+                  /* Translators: %s is the hostname */
                   prompt = g_strdup_printf (_("Enter password for ssh on %s"), op_backend->host);
 
               if (!g_mount_source_ask_password (mount_source,
--- gvfs-1.6.3/daemon/gvfsbackendsmbbrowse.c	2010-02-11 06:32:21.000000000 +0000
+++ gvfs-1.6.4/daemon/gvfsbackendsmbbrowse.c	2010-09-27 14:51:51.000000000 +0000
@@ -247,11 +247,35 @@
 static void
 g_vfs_backend_smb_browse_init (GVfsBackendSmbBrowse *backend)
 {
+#ifdef HAVE_GCONF
+  GConfClient *gclient;
+#endif
+
   backend->entries_lock = g_mutex_new ();
   backend->update_cache_lock = g_mutex_new ();
 
   if (mount_tracker == NULL)
     mount_tracker = g_mount_tracker_new (NULL);
+
+#ifdef HAVE_GCONF
+  gclient = gconf_client_get_default ();
+  if (gclient)
+    {
+      char *workgroup;
+
+      workgroup = gconf_client_get_string (gclient,
+					   PATH_GCONF_GNOME_VFS_SMB_WORKGROUP, NULL);
+
+      if (workgroup && workgroup[0])
+	default_workgroup = workgroup;
+      else
+	g_free (workgroup);
+
+      g_object_unref (gclient);
+    }
+#endif
+
+  DEBUG ("g_vfs_backend_smb_browse_init: default workgroup = '%s'\n", default_workgroup ? default_workgroup : "NULL");
 }
 
 /**
@@ -1456,9 +1480,6 @@
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   GVfsBackendClass *backend_class = G_VFS_BACKEND_CLASS (klass);
-#ifdef HAVE_GCONF
-  GConfClient *gclient;
-#endif
   
   gobject_class->finalize = g_vfs_backend_smb_browse_finalize;
 
@@ -1475,26 +1496,6 @@
   backend_class->try_query_info = try_query_info;
   backend_class->enumerate = do_enumerate;
   backend_class->try_enumerate = try_enumerate;
-
-#ifdef HAVE_GCONF
-  gclient = gconf_client_get_default ();
-  if (gclient)
-    {
-      char *workgroup;
-      
-      workgroup = gconf_client_get_string (gclient, 
-					   PATH_GCONF_GNOME_VFS_SMB_WORKGROUP, NULL);
-
-      if (workgroup && workgroup[0])
-	default_workgroup = workgroup;
-      else
-	g_free (workgroup);
-      
-      g_object_unref (gclient);
-    }
-#endif
-
-  DEBUG ("g_vfs_backend_smb_browse_class_init - default workgroup = '%s'\n", default_workgroup ? default_workgroup : "NULL");
 }
 
 void
--- gvfs-1.6.3/daemon/gvfsbackendsmb.c	2010-02-11 06:32:25.000000000 +0000
+++ gvfs-1.6.4/daemon/gvfsbackendsmb.c	2010-09-27 14:51:51.000000000 +0000
@@ -121,6 +121,27 @@
 static void
 g_vfs_backend_smb_init (GVfsBackendSmb *backend)
 {
+#ifdef HAVE_GCONF
+  GConfClient *gclient;
+#endif
+
+#ifdef HAVE_GCONF
+  gclient = gconf_client_get_default ();
+  if (gclient)
+    {
+      char *workgroup;
+
+      workgroup = gconf_client_get_string (gclient,
+					   PATH_GCONF_GNOME_VFS_SMB_WORKGROUP, NULL);
+
+      if (workgroup && workgroup[0])
+	default_workgroup = workgroup;
+      else
+	g_free (workgroup);
+
+      g_object_unref (gclient);
+    }
+#endif
 }
 
 /**
@@ -2109,9 +2130,6 @@
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   GVfsBackendClass *backend_class = G_VFS_BACKEND_CLASS (klass);
-#ifdef HAVE_GCONF
-  GConfClient *gclient;
-#endif
   
   gobject_class->finalize = g_vfs_backend_smb_finalize;
 
@@ -2138,25 +2156,6 @@
   backend_class->move = do_move;
   backend_class->try_query_settable_attributes = try_query_settable_attributes;
   backend_class->set_attribute = do_set_attribute;
-
-#ifdef HAVE_GCONF
-  gclient = gconf_client_get_default ();
-  if (gclient)
-    {
-      char *workgroup;
-      
-      workgroup = gconf_client_get_string (gclient, 
-					   PATH_GCONF_GNOME_VFS_SMB_WORKGROUP, NULL);
-
-      if (workgroup && workgroup[0])
-	default_workgroup = workgroup;
-      else
-	g_free (workgroup);
-      
-      g_object_unref (gclient);
-    }
-#endif
-
 }
 
 void
[signature.asc (application/pgp-signature, inline)]

Information forwarded to debian-bugs-dist@lists.debian.org, Debian Release Team <debian-release@lists.debian.org>:
Bug#596122; Package release.debian.org. (Sat, 02 Oct 2010 22:57:03 GMT) Full text and rfc822 format available.

Acknowledgement sent to Josselin Mouette <joss@debian.org>:
Extra info received and forwarded to list. Copy sent to Debian Release Team <debian-release@lists.debian.org>. (Sat, 02 Oct 2010 22:57:03 GMT) Full text and rfc822 format available.

Message #22 received at 596122@bugs.debian.org (full text, mbox):

From: Josselin Mouette <joss@debian.org>
To: 596122@bugs.debian.org
Subject: Re: Bug#596122: unblock: gvfs/1.6.3-2
Date: Sun, 03 Oct 2010 00:55:36 +0200
[Message part 1 (text/plain, inline)]
Le samedi 02 octobre 2010 à 12:48 +0200, Josselin Mouette a écrit : 
> Major changes in 1.6.4 
> ======================
> * Lots of translation updates
> * afc: Add support for photo thumbnails on iOS4
> * daemons: Move GConf initialization from backend constructor
> * sftp: Use poll() to cope with openssh-5.6 changes
> 
> The OpenSSH change is not necessary per se since we ship 5.5

More than unnecessary, it is broken (for both 5.5 and 5.6).

I just uploaded 1.6.4-2 with the attached fix. Sorry for all the mess.

Cheers,
-- 
 .''`.      Josselin Mouette
: :' :
`. `'  “If you behave this way because you are blackmailed by someone,
  `-    […] I will see what I can do for you.”  -- Jörg Schilling
[06_sftp_timeout.patch (text/x-patch, inline)]
From 2b779633f48f3099205a81737cf601939289fa73 Mon Sep 17 00:00:00 2001
From: Andreas Henriksson <andreas@fatal.se>
Date: Sat, 2 Oct 2010 14:51:54 +0200
Subject: [PATCH] sftp: fix poll() timeout.

When switching from select() to poll() in commit
"sftp: Use poll() to cope with openssh-5.6 changes" (c6be45c8934)
the difference in seconds vs milliseconds for select/poll timeout
argument was missed.

SFTP_READ_TIMEOUT is defined in seconds, so multiply it with 1000
when using it with poll().

https://bugzilla.gnome.org/show_bug.cgi?id=631169
---
 daemon/gvfsbackendsftp.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c
index 9fecf6a..f6b7785 100644
--- a/daemon/gvfsbackendsftp.c
+++ b/daemon/gvfsbackendsftp.c
@@ -869,7 +869,7 @@ handle_login (GVfsBackend *backend,
       fds[1].fd = prompt_fd;
       fds[1].events = POLLIN;
       
-      ret = poll(fds, 2, SFTP_READ_TIMEOUT);
+      ret = poll(fds, 2, SFTP_READ_TIMEOUT * 1000);
       
       if (ret <= 0)
         {
-- 
1.7.1
[signature.asc (application/pgp-signature, inline)]

Reply sent to Julien Cristau <jcristau@debian.org>:
You have taken responsibility. (Sun, 03 Oct 2010 13:33:17 GMT) Full text and rfc822 format available.

Notification sent to Josselin Mouette <joss@debian.org>:
Bug acknowledged by developer. (Sun, 03 Oct 2010 13:33:17 GMT) Full text and rfc822 format available.

Message #27 received at 596122-done@bugs.debian.org (full text, mbox):

From: Julien Cristau <jcristau@debian.org>
To: Josselin Mouette <joss@debian.org>, 596122-done@bugs.debian.org
Subject: Re: Bug#596122: unblock: gvfs/1.6.3-2
Date: Sun, 3 Oct 2010 15:30:47 +0200
[Message part 1 (text/plain, inline)]
On Sun, Oct  3, 2010 at 00:55:36 +0200, Josselin Mouette wrote:

> I just uploaded 1.6.4-2 with the attached fix. Sorry for all the mess.
> 
Unblocked.

Cheers,
Julien
[signature.asc (application/pgp-signature, inline)]

Bug archived. Request was from Debbugs Internal Request <owner@bugs.debian.org> to internal_control@bugs.debian.org. (Mon, 01 Nov 2010 07:30:55 GMT) Full text and rfc822 format available.

Send a report that this bug log contains spam.


Debian bug tracking system administrator <owner@bugs.debian.org>. Last modified: Sat Apr 19 20:33:10 2014; Machine Name: buxtehude.debian.org

Debian Bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.