From b95149eb636f54cc6dff7fa37621524e20406133 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Mon, 01 Aug 2011 08:20:10 -0400
Subject: [PATCH] - Fixed contact photos upload, moved code to separate file for better performance                                                        (to handle upload we don't need to initialize addressbook source)

---
 program/steps/addressbook/save.inc         |   72 ------------------------
 program/steps/addressbook/func.inc         |    4 
 program/steps/addressbook/upload_photo.inc |   83 +++++++++++++++++++++++++++
 3 files changed, 85 insertions(+), 74 deletions(-)

diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc
index 6635d13..6f01667 100644
--- a/program/steps/addressbook/func.inc
+++ b/program/steps/addressbook/func.inc
@@ -309,8 +309,9 @@
             if ($val == '' && $col == 'name') {
                 $val = rcube_addressbook::compose_display_name($row, true);
             }
+
             $a_row_cols[$col] = Q($val);
-        }
+	}
 
         $OUTPUT->command($prefix.'add_contact_row', $row['ID'], $a_row_cols);
     }
@@ -729,7 +730,6 @@
 $RCMAIL->register_action_map(array(
     'add' => 'edit.inc',
     'photo' => 'show.inc',
-    'upload-photo' => 'save.inc',
     'group-create' => 'groups.inc',
     'group-rename' => 'groups.inc',
     'group-delete' => 'groups.inc',
diff --git a/program/steps/addressbook/save.inc b/program/steps/addressbook/save.inc
index 599c2f6..43426d8 100644
--- a/program/steps/addressbook/save.inc
+++ b/program/steps/addressbook/save.inc
@@ -23,83 +23,11 @@
 $cid      = get_input_value('_cid', RCUBE_INPUT_POST);
 $return_action = empty($cid) ? 'add' : 'edit';
 
-// Source changed, display the form again
-if (!empty($_GET['_reload'])) {
-  rcmail_overwrite_action($return_action);
-  return;
-}
-
 // cannot edit record
 if ($CONTACTS->readonly) {
   $OUTPUT->show_message('contactreadonly', 'error');
   rcmail_overwrite_action($return_action);
   return;
-}
-
-
-// handle photo upload for contacts
-if ($RCMAIL->action == 'upload-photo') {
-    // clear all stored output properties (like scripts and env vars)
-    $OUTPUT->reset();
-
-    if ($filepath = $_FILES['_photo']['tmp_name']) {
-        // check file type and resize image
-        $imageprop = rcmail::imageprops($_FILES['_photo']['tmp_name']);
-
-        if ($imageprop['width'] && $imageprop['height']) {
-            $maxsize = intval($RCMAIL->config->get('contact_photo_size', 160));
-            $tmpfname = tempnam($RCMAIL->config->get('temp_dir'), 'rcmImgConvert');
-            $save_hook = 'attachment_upload';
-
-            // scale image to a maximum size
-            if (($imageprop['width'] > $maxsize || $imageprop['height'] > $maxsize) &&
-                  (rcmail::imageconvert(array('in' => $filepath, 'out' => $tmpfname, 'size' => $maxsize.'x'.$maxsize, 'type' => $imageprop['type'])) !== false)) {
-                $filepath = $tmpfname;
-                $save_hook = 'attachment_save';
-            }
-
-            // save uploaded file in storage backend
-            $attachment = $RCMAIL->plugins->exec_hook($save_hook, array(
-                'path' => $filepath,
-                'size' => $_FILES['_photo']['size'],
-                'name' => $_FILES['_photo']['name'],
-                'mimetype' => 'image/' . $imageprop['type'],
-                'group' => 'contact',
-            ));
-        }
-        else
-            $attachment['error'] = rcube_label('invalidimageformat');
-
-        if ($attachment['status'] && !$attachment['abort']) {
-            $file_id = $attachment['id'];
-            $_SESSION['contacts']['files'][$file_id] = $attachment;
-            $OUTPUT->command('replace_contact_photo', $file_id);
-        }
-        else {  // upload failed
-            $err = $_FILES['_photo']['error'];
-            if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE)
-                $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes(ini_get('upload_max_filesize'))))));
-            else if ($attachment['error'])
-                $msg = $attachment['error'];
-            else
-                $msg = rcube_label('fileuploaderror');
-            
-            $OUTPUT->command('display_message', $msg, 'error');
-        }
-    }
-    else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-        // if filesize exceeds post_max_size then $_FILES array is empty,
-        // show filesizeerror instead of fileuploaderror
-        if ($maxsize = ini_get('post_max_size'))
-            $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes($maxsize)))));
-        else
-            $msg = rcube_label('fileuploaderror');
-
-        $OUTPUT->command('display_message', $msg, 'error');
-    }
-
-    $OUTPUT->command('photo_upload_end');
-    $OUTPUT->send('iframe');
 }
 
 // read POST values into hash array
diff --git a/program/steps/addressbook/upload_photo.inc b/program/steps/addressbook/upload_photo.inc
new file mode 100644
index 0000000..1ed71f8
--- /dev/null
+++ b/program/steps/addressbook/upload_photo.inc
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/addressbook/upload_photo.inc                            |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2011, The Roundcube Dev Team                       |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Handles contact photo uploads                                       |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id$
+
+*/
+
+// clear all stored output properties (like scripts and env vars)
+$OUTPUT->reset();
+console($_FILES);
+if ($filepath = $_FILES['_photo']['tmp_name']) {
+    // check file type and resize image
+    $imageprop = rcmail::imageprops($_FILES['_photo']['tmp_name']);
+
+    if ($imageprop['width'] && $imageprop['height']) {
+        $maxsize = intval($RCMAIL->config->get('contact_photo_size', 160));
+        $tmpfname = tempnam($RCMAIL->config->get('temp_dir'), 'rcmImgConvert');
+        $save_hook = 'attachment_upload';
+
+        // scale image to a maximum size
+        if (($imageprop['width'] > $maxsize || $imageprop['height'] > $maxsize) &&
+            (rcmail::imageconvert(array('in' => $filepath, 'out' => $tmpfname,
+                'size' => $maxsize.'x'.$maxsize, 'type' => $imageprop['type'])) !== false)) {
+            $filepath = $tmpfname;
+            $save_hook = 'attachment_save';
+        }
+
+        // save uploaded file in storage backend
+        $attachment = $RCMAIL->plugins->exec_hook($save_hook, array(
+            'path' => $filepath,
+            'size' => $_FILES['_photo']['size'],
+            'name' => $_FILES['_photo']['name'],
+            'mimetype' => 'image/' . $imageprop['type'],
+            'group' => 'contact',
+        ));
+    }
+    else
+        $attachment['error'] = rcube_label('invalidimageformat');
+
+    if ($attachment['status'] && !$attachment['abort']) {
+        $file_id = $attachment['id'];
+        $_SESSION['contacts']['files'][$file_id] = $attachment;
+        $OUTPUT->command('replace_contact_photo', $file_id);
+    }
+    else {  // upload failed
+        $err = $_FILES['_photo']['error'];
+        if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE)
+            $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes(ini_get('upload_max_filesize'))))));
+        else if ($attachment['error'])
+            $msg = $attachment['error'];
+        else
+            $msg = rcube_label('fileuploaderror');
+            
+        $OUTPUT->command('display_message', $msg, 'error');
+    }
+}
+else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+    // if filesize exceeds post_max_size then $_FILES array is empty,
+    // show filesizeerror instead of fileuploaderror
+    if ($maxsize = ini_get('post_max_size'))
+        $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes($maxsize)))));
+    else
+        $msg = rcube_label('fileuploaderror');
+
+    $OUTPUT->command('display_message', $msg, 'error');
+}
+
+$OUTPUT->command('photo_upload_end');
+$OUTPUT->send('iframe');

--
Gitblit v1.9.1