Finished the bulk of changes for gnupg 1.9. This included switching
[gnupg.git] / g10 / photoid.c
index 66240ec..1dd6ede 100644 (file)
 #include <errno.h>
 #include <stdio.h>
 #include <string.h>
-#ifdef HAVE_DOSISH_SYSTEM
-#include <windows.h>
+#ifdef __MINGW32__ 
+# include <windows.h>
+# ifndef VER_PLATFORM_WIN32_WINDOWS
+#  define VER_PLATFORM_WIN32_WINDOWS 1
+# endif
 #endif
 #include "packet.h"
 #include "status.h"
@@ -46,7 +49,7 @@ PKT_user_id *generate_photo_id(PKT_public_key *pk)
   char *filename=NULL;
   byte *photo=NULL;
   byte header[16];
-  IOBUF file;
+  iobuf_t file;
 
   header[0]=0x10; /* little side of photo header length */
   header[1]=0;    /* big side of photo header length */
@@ -56,7 +59,8 @@ PKT_user_id *generate_photo_id(PKT_public_key *pk)
   for(i=4;i<16;i++) /* The reserved bytes */
     header[i]=0;
 
-  uid=m_alloc_clear(sizeof(*uid)+50);
+#define EXTRA_UID_NAME_SPACE 71
+  uid=xcalloc (1,sizeof(*uid)+71);
 
   printf(_("\nPick an image to use for your photo ID.  "
           "The image must be a JPEG file.\n"
@@ -69,7 +73,7 @@ PKT_user_id *generate_photo_id(PKT_public_key *pk)
     {
       printf("\n");
 
-      m_free(filename);
+      xfree (filename);
 
       filename=cpr_get("photoid.jpeg.add",
                       _("Enter JPEG filename for photo ID: "));
@@ -97,7 +101,7 @@ PKT_user_id *generate_photo_id(PKT_public_key *pk)
          }
        }
 
-      photo=m_alloc(len);
+      photo=xmalloc (len);
       iobuf_read(file,photo,len);
       iobuf_close(file);
 
@@ -106,7 +110,7 @@ PKT_user_id *generate_photo_id(PKT_public_key *pk)
         photo[6]!='J' || photo[7]!='F' || photo[8]!='I' || photo[9]!='F')
        {
          log_error(_("\"%s\" is not a JPEG file\n"),filename);
-         m_free(photo);
+         xfree (photo);
          photo=NULL;
          continue;
        }
@@ -114,7 +118,7 @@ PKT_user_id *generate_photo_id(PKT_public_key *pk)
       /* Build the packet */
       build_attribute_subpkt(uid,1,photo,len,header,16);
       parse_attribute_subpkts(uid);
-      make_attribute_uidname(uid);
+      make_attribute_uidname(uid, EXTRA_UID_NAME_SPACE);
 
       /* Showing the photo is not safe when noninteractive since the
          "user" may not be able to dismiss a viewer window! */
@@ -128,7 +132,7 @@ PKT_user_id *generate_photo_id(PKT_public_key *pk)
              goto scram;
            case 0:
              free_attributes(uid);
-             m_free(photo);
+             xfree (photo);
              photo=NULL;
              continue;
            }
@@ -139,13 +143,13 @@ PKT_user_id *generate_photo_id(PKT_public_key *pk)
   uid->ref=1;
 
  scram:
-  m_free(filename);
-  m_free(photo);
+  xfree (filename);
+  xfree (photo);
 
   if(error)
     {
       free_attributes(uid);
-      m_free(uid);
+      xfree (uid);
       return NULL;
     }
 
@@ -155,7 +159,7 @@ PKT_user_id *generate_photo_id(PKT_public_key *pk)
 /* Returns 0 for error, 1 for valid */
 int parse_image_header(const struct user_attribute *attr,byte *type,u32 *len)
 {
-  int headerlen;
+  u16 headerlen;
 
   if(attr->len<3)
     return 0;
@@ -185,8 +189,9 @@ int parse_image_header(const struct user_attribute *attr,byte *type,u32 *len)
 
 /* style==0 for extension, 1 for name, 2 for MIME type.  Remember that
    the "name" style string could be used in a user ID name field, so
-   make sure it is not too big (see
-   parse-packet.c:parse_attribute). */
+   make sure it is not too big (see parse-packet.c:parse_attribute).
+   Extensions should be 3 characters long for the best cross-platform
+   compatibility. */
 char *image_type_to_string(byte type,int style)
 {
   char *string;
@@ -215,9 +220,10 @@ char *image_type_to_string(byte type,int style)
   return string;
 }
 
+#if !defined(FIXED_PHOTO_VIEWER) && !defined(DISABLE_PHOTO_VIEWER)
 static const char *get_default_photo_command(void)
 {
-#if defined(HAVE_DOSISH_SYSTEM)
+#if defined(__MINGW32__)
   OSVERSIONINFO osvi;
 
   memset(&osvi,0,sizeof(osvi));
@@ -237,10 +243,12 @@ static const char *get_default_photo_command(void)
   return "xloadimage -fork -quiet -title 'KeyID 0x%k' stdin";
 #endif
 }
+#endif
 
 void show_photos(const struct user_attribute *attrs,
                 int count,PKT_public_key *pk,PKT_secret_key *sk)
 {
+#ifndef DISABLE_PHOTO_VIEWER
   int i;
   struct expando_args args;
   u32 len;
@@ -263,21 +271,25 @@ void show_photos(const struct user_attribute *attrs,
        struct exec_info *spawn;
        int offset=attrs[i].len-len;
 
+#ifdef FIXED_PHOTO_VIEWER
+       opt.photo_viewer=FIXED_PHOTO_VIEWER;
+#else
        if(!opt.photo_viewer)
          opt.photo_viewer=get_default_photo_command();
+#endif
 
        /* make command grow */
        command=pct_expando(opt.photo_viewer,&args);
        if(!command)
          goto fail;
 
-       name=m_alloc(16+strlen(EXTSEP_S)+
+       name=xmalloc (16+strlen(EXTSEP_S)+
                     strlen(image_type_to_string(args.imagetype,0))+1);
 
        /* Make the filename.  Notice we are not using the image
            encoding type for more than cosmetics.  Most external image
            viewers can handle a multitude of types, and even if one
-           cannot understand a partcular type, we have no way to know
+           cannot understand a particular type, we have no way to know
            which.  The spec permits this, by the way. -dms */
 
 #ifdef USE_ONLY_8DOT3
@@ -290,16 +302,16 @@ void show_photos(const struct user_attribute *attrs,
 
        if(exec_write(&spawn,NULL,command,name,1,1)!=0)
          {
-           m_free(name);
+           xfree (name);
            goto fail;
          }
 
 #ifdef __riscos__
-        riscos_set_filetype(spawn->tempfile_in,
-                            image_type_to_string(args.imagetype,2));
+        riscos_set_filetype_by_mimetype(spawn->tempfile_in,
+                                        image_type_to_string(args.imagetype,2));
 #endif
 
-       m_free(name);
+       xfree (name);
 
        fwrite(&attrs[i].data[offset],attrs[i].len-offset,1,spawn->tochild);
 
@@ -316,5 +328,6 @@ void show_photos(const struct user_attribute *attrs,
   return;
 
  fail:
-  log_error("unable to display photo ID!\n");
+  log_error(_("unable to display photo ID!\n"));
+#endif
 }