Index: /trunk/admin/include/functions_upload.inc.php
===================================================================
--- /trunk/admin/include/functions_upload.inc.php	(revision 8248)
+++ /trunk/admin/include/functions_upload.inc.php	(revision 8249)
@@ -1,20 +1,26 @@
 <?php
-// TODO
-// * check md5sum (already exists?)
-
-include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
-include_once(PHPWG_ROOT_PATH.'include/ws_functions.inc.php');
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
 include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
-
-// Here is the plan
-//
-// 1) move uploaded file to upload/2010/01/22/20100122003814-449ada00.jpg
-//
-// 2) if taller than max_height or wider than max_width, move to pwg_high
-//    + web sized creation
-//
-// 3) thumbnail creation from web sized
-//
-// 4) register in database
 
 // add default event handler for image and thumbnail resize
@@ -22,8 +28,169 @@
 add_event_handler('upload_thumbnail_resize', 'pwg_image_resize', EVENT_HANDLER_PRIORITY_NEUTRAL, 7);
 
+function get_upload_form_config()
+{
+  // default configuration for upload
+  $upload_form_config = array(
+    'websize_resize' => array(
+      'default' => true,
+      'can_be_null' => false,
+      ),
+    
+    'websize_maxwidth' => array(
+      'default' => 800,
+      'min' => 100,
+      'max' => 1600,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => true,
+      'error_message' => l10n('The websize maximum width must be a number between %d and %d'),
+      ),
+  
+    'websize_maxheight' => array(
+      'default' => 600,
+      'min' => 100,
+      'max' => 1200,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => true,
+      'error_message' => l10n('The websize maximum height must be a number between %d and %d'),
+      ),
+  
+    'websize_quality' => array(
+      'default' => 95,
+      'min' => 50,
+      'max' => 100,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The websize image quality must be a number between %d and %d'),
+      ),
+  
+    'thumb_maxwidth' => array(
+      'default' => 128,
+      'min' => 50,
+      'max' => 300,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The thumbnail maximum width must be a number between %d and %d'),
+      ),
+  
+    'thumb_maxheight' => array(
+      'default' => 96,
+      'min' => 50,
+      'max' => 300,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The thumbnail maximum height must be a number between %d and %d'),
+      ),
+  
+    'thumb_quality' => array(
+      'default' => 95,
+      'min' => 50,
+      'max' => 100,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The thumbnail image quality must be a number between %d and %d'),
+      ),
+  
+    'hd_keep' => array(
+      'default' => true,
+      'can_be_null' => false,
+      ),
+  
+    'hd_resize' => array(
+      'default' => false,
+      'can_be_null' => false,
+      ),
+  
+    'hd_maxwidth' => array(
+      'default' => 2000,
+      'min' => 500,
+      'max' => 20000,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The high definition maximum width must be a number between %d and %d'),
+      ),
+  
+    'hd_maxheight' => array(
+      'default' => 2000,
+      'min' => 500,
+      'max' => 20000,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The high definition maximum height must be a number between %d and %d'),
+      ),
+  
+    'hd_quality' => array(
+      'default' => 95,
+      'min' => 50,
+      'max' => 100,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The high definition image quality must be a number between %d and %d'),
+      ),
+    );
+
+  return $upload_form_config;
+}
+
+/*
+ * automatic fill of configuration parameters
+ */
+function prepare_upload_configuration()
+{
+  global $conf;
+
+  $inserts = array();
+  
+  foreach (get_upload_form_config() as $param_shortname => $param)
+  {
+    $param_name = 'upload_form_'.$param_shortname;
+  
+    if (!isset($conf[$param_name]))
+    {
+      $param_value = boolean_to_string($param['default']);
+      
+      array_push(
+        $inserts,
+        array(
+          'param' => $param_name,
+          'value' => $param_value,
+          )
+        );
+
+      $conf[$param_name] = $param_value;
+      if (is_bool($param['default']))
+      {
+        $conf[$param_name] = get_boolean($param_value);
+      }
+    }
+  }
+  
+  if (count($inserts) > 0)
+  {
+    mass_inserts(
+      CONFIG_TABLE,
+      array_keys($inserts[0]),
+      $inserts
+      );
+  }
+}
+
 function add_uploaded_file($source_filepath, $original_filename=null, $categories=null, $level=null)
 {
+  // Here is the plan
+  //
+  // 1) move uploaded file to upload/2010/01/22/20100122003814-449ada00.jpg
+  //
+  // 2) if taller than max_height or wider than max_width, move to pwg_high
+  //    + web sized creation
+  //
+  // 3) thumbnail creation from web sized
+  //
+  // 4) register in database
+  
+  // TODO
+  // * check md5sum (already exists?)
+  
   global $conf;
-
+  
   // current date
   list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
@@ -90,18 +257,21 @@
       if ($conf['upload_form_hd_keep'])
       {
-        $need_resize = need_resize($high_path, $conf['upload_form_hd_maxwidth'], $conf['upload_form_hd_maxheight']);
+        if ($conf['upload_form_hd_resize'])
+        {
+          $need_resize = need_resize($high_path, $conf['upload_form_hd_maxwidth'], $conf['upload_form_hd_maxheight']);
         
-        if ($conf['upload_form_hd_resize'] and $need_resize)
-        {
-          pwg_image_resize(
-            false,
-            $high_path,
-            $high_path,
-            $conf['upload_form_hd_maxwidth'],
-            $conf['upload_form_hd_maxheight'],
-            $conf['upload_form_hd_quality'],
-            false
-            );
-          $high_infos = pwg_image_infos($high_path);
+          if ($need_resize)
+          {
+            pwg_image_resize(
+              false,
+              $high_path,
+              $high_path,
+              $conf['upload_form_hd_maxwidth'],
+              $conf['upload_form_hd_maxheight'],
+              $conf['upload_form_hd_quality'],
+              false
+              );
+            $high_infos = pwg_image_infos($high_path);
+          }
         }
       }
@@ -558,3 +728,63 @@
   return false;
 }
+
+function ready_for_upload_message()
+{
+  global $conf;
+
+  $relative_dir = preg_replace('#^'.PHPWG_ROOT_PATH.'#', '', $conf['upload_dir']);
+
+  if (!is_dir($conf['upload_dir']))
+  {
+    if (!is_writable(dirname($conf['upload_dir'])))
+    {
+      return sprintf(
+        l10n('Create the "%s" directory at the root of your Piwigo installation'),
+        $relative_dir
+        );
+    }
+  }
+  else
+  {
+    if (!is_writable($conf['upload_dir']))
+    {
+      @chmod($conf['upload_dir'], 0777);
+      
+      if (!is_writable($conf['upload_dir']))
+      {
+        return sprintf(
+          l10n('Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'),
+          $relative_dir
+          );
+      }
+    }
+  }
+
+  return null;
+}
+
+function file_path_for_type($file_path, $type='thumb')
+{
+  // resolve the $file_path depending on the $type
+  if ('thumb' == $type) {
+    $file_path = get_thumbnail_location(
+      array(
+        'path' => $file_path,
+        'tn_ext' => 'jpg',
+        )
+      );
+  }
+
+  if ('high' == $type) {
+    @include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+    $file_path = get_high_location(
+      array(
+        'path' => $file_path,
+        'has_high' => 'true'
+        )
+      );
+  }
+
+  return $file_path;
+}
 ?>
Index: /trunk/admin/photos_add.php
===================================================================
--- /trunk/admin/photos_add.php	(revision 8248)
+++ /trunk/admin/photos_add.php	(revision 8249)
@@ -44,132 +44,7 @@
 // +-----------------------------------------------------------------------+
 
-// automatic fill of configuration parameters
-$upload_form_config = array(
-  'websize_resize' => array(
-    'default' => true,
-    'can_be_null' => false,
-    ),
-  
-  'websize_maxwidth' => array(
-    'default' => 800,
-    'min' => 100,
-    'max' => 1600,
-    'pattern' => '/^\d+$/',
-    'can_be_null' => true,
-    'error_message' => l10n('The websize maximum width must be a number between %d and %d'),
-    ),
-  
-  'websize_maxheight' => array(
-    'default' => 600,
-    'min' => 100,
-    'max' => 1200,
-    'pattern' => '/^\d+$/',
-    'can_be_null' => true,
-    'error_message' => l10n('The websize maximum height must be a number between %d and %d'),
-    ),
-  
-  'websize_quality' => array(
-    'default' => 95,
-    'min' => 50,
-    'max' => 100,
-    'pattern' => '/^\d+$/',
-    'can_be_null' => false,
-    'error_message' => l10n('The websize image quality must be a number between %d and %d'),
-    ),
-  
-  'thumb_maxwidth' => array(
-    'default' => 128,
-    'min' => 50,
-    'max' => 300,
-    'pattern' => '/^\d+$/',
-    'can_be_null' => false,
-    'error_message' => l10n('The thumbnail maximum width must be a number between %d and %d'),
-    ),
-  
-  'thumb_maxheight' => array(
-    'default' => 96,
-    'min' => 50,
-    'max' => 300,
-    'pattern' => '/^\d+$/',
-    'can_be_null' => false,
-    'error_message' => l10n('The thumbnail maximum height must be a number between %d and %d'),
-    ),
-  
-  'thumb_quality' => array(
-    'default' => 95,
-    'min' => 50,
-    'max' => 100,
-    'pattern' => '/^\d+$/',
-    'can_be_null' => false,
-    'error_message' => l10n('The thumbnail image quality must be a number between %d and %d'),
-    ),
-  
-  'hd_keep' => array(
-    'default' => true,
-    'can_be_null' => false,
-    ),
-  
-  'hd_resize' => array(
-    'default' => false,
-    'can_be_null' => false,
-    ),
-  
-  'hd_maxwidth' => array(
-    'default' => 2000,
-    'min' => 500,
-    'max' => 20000,
-    'pattern' => '/^\d+$/',
-    'can_be_null' => false,
-    'error_message' => l10n('The high definition maximum width must be a number between %d and %d'),
-    ),
-  
-  'hd_maxheight' => array(
-    'default' => 2000,
-    'min' => 500,
-    'max' => 20000,
-    'pattern' => '/^\d+$/',
-    'can_be_null' => false,
-    'error_message' => l10n('The high definition maximum height must be a number between %d and %d'),
-    ),
-  
-  'hd_quality' => array(
-    'default' => 95,
-    'min' => 50,
-    'max' => 100,
-    'pattern' => '/^\d+$/',
-    'can_be_null' => false,
-    'error_message' => l10n('The high definition image quality must be a number between %d and %d'),
-    ),
-  );
+prepare_upload_configuration();
 
-$inserts = array();
-
-foreach ($upload_form_config as $param_shortname => $param)
-{
-  $param_name = 'upload_form_'.$param_shortname;
-  
-  if (!isset($conf[$param_name]))
-  {
-    $param_value = boolean_to_string($param['default']);
-    
-    array_push(
-      $inserts,
-      array(
-        'param' => $param_name,
-        'value' => $param_value,
-        )
-      );
-    $conf[$param_name] = $param_value;
-  }
-}
-
-if (count($inserts) > 0)
-{
-  mass_inserts(
-    CONFIG_TABLE,
-    array_keys($inserts[0]),
-    $inserts
-    );
-}
+$upload_form_config = get_upload_form_config();
 
 // +-----------------------------------------------------------------------+
@@ -239,9 +114,4 @@
   );
 
-// $template->append(
-//   'head_elements',
-//   '<link rel="stylesheet" type="text/css" href="'.UPLOAD_FORM_PATH.'upload.css">'."\n"
-//   );
-
 // +-----------------------------------------------------------------------+
 // |                             Load the tab                              |
Index: /trunk/include/ws_functions.inc.php
===================================================================
--- /trunk/include/ws_functions.inc.php	(revision 8248)
+++ /trunk/include/ws_functions.inc.php	(revision 8249)
@@ -1077,4 +1077,6 @@
 function add_file($file_path, $type, $original_sum, $file_sum)
 {
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+  
   $file_path = file_path_for_type($file_path, $type);
 
@@ -1336,4 +1338,99 @@
   
   invalidate_user_cache();
+}
+
+function ws_images_addSimple($params, &$service)
+{
+  global $conf;
+  if (!is_admin() || is_adviser() )
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  // category
+  $params['category'] = (int)$params['category'];
+  if ($params['category'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+  prepare_upload_configuration();
+
+  $image_id = add_uploaded_file(
+    $_FILES['image']['tmp_name'],
+    $_FILES['image']['name'],
+    array($params['category']),
+    8
+    );
+
+  $info_columns = array(
+    'name',
+    'author',
+    'comment',
+    'level',
+    'date_creation',
+    );
+
+  foreach ($info_columns as $key)
+  {
+    if (isset($params[$key]))
+    {
+      $update[$key] = $params[$key];
+    }
+  }
+
+  if (count(array_keys($update)) > 0)
+  {
+    $update['id'] = $image_id;
+
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+    mass_updates(
+      IMAGES_TABLE,
+      array(
+        'primary' => array('id'),
+        'update'  => array_diff(array_keys($update), array('id'))
+        ),
+      array($update)
+      );
+  }
+
+
+  if (isset($params['tags']) and !empty($params['tags']))
+  {
+    $tag_ids = array();
+    $tag_names = explode(',', $params['tags']);
+    foreach ($tag_names as $tag_name)
+    {
+      $tag_id = tag_id_from_tag_name($tag_name);
+      array_push($tag_ids, $tag_id);
+    }
+
+    add_tags($tag_ids, array($image_id));
+  }
+
+  $query = '
+SELECT id, name, permalink
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$params['category'].'
+;';
+  $result = pwg_query($query);
+  $category = pwg_db_fetch_assoc($result);
+
+  return array(
+    'image_id' => $image_id,
+    'url' => make_picture_url(
+      array(
+        'image_id' => $image_id,
+        'section' => 'categories',
+        'category' => $category
+        )
+      ),
+    );
 }
 
@@ -1745,4 +1842,5 @@
 
     if (isset($params[$param_name.'_sum'])) {
+      include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
       $type_path = file_path_for_type($path, $type);
       if (!is_file($type_path)) {
@@ -1761,29 +1859,4 @@
 
   return $ret;
-}
-
-function file_path_for_type($file_path, $type='thumb')
-{
-  // resolve the $file_path depending on the $type
-  if ('thumb' == $type) {
-    $file_path = get_thumbnail_location(
-      array(
-        'path' => $file_path,
-        'tn_ext' => 'jpg',
-        )
-      );
-  }
-
-  if ('high' == $type) {
-    @include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
-    $file_path = get_high_location(
-      array(
-        'path' => $file_path,
-        'has_high' => 'true'
-        )
-      );
-  }
-
-  return $file_path;
 }
 
@@ -2153,4 +2226,5 @@
   }
 
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
   $ret['message'] = ready_for_upload_message();
   $ret['ready_for_upload'] = true;
@@ -2163,38 +2237,3 @@
   return $ret;
 }
-
-function ready_for_upload_message()
-{
-  global $conf;
-
-  $relative_dir = preg_replace('#^'.PHPWG_ROOT_PATH.'#', '', $conf['upload_dir']);
-
-  if (!is_dir($conf['upload_dir']))
-  {
-    if (!is_writable(dirname($conf['upload_dir'])))
-    {
-      return sprintf(
-        l10n('Create the "%s" directory at the root of your Piwigo installation'),
-        $relative_dir
-        );
-    }
-  }
-  else
-  {
-    if (!is_writable($conf['upload_dir']))
-    {
-      @chmod($conf['upload_dir'], 0777);
-      
-      if (!is_writable($conf['upload_dir']))
-      {
-        return sprintf(
-          l10n('Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'),
-          $relative_dir
-          );
-      }
-    }
-  }
-
-  return null;
-}
 ?>
Index: /trunk/ws.php
===================================================================
--- /trunk/ws.php	(revision 8248)
+++ /trunk/ws.php	(revision 8249)
@@ -222,4 +222,21 @@
 
   $service->addMethod(
+    'pwg.images.addSimple',
+    'ws_images_addSimple',
+    array(
+      'category' => array('default' => null),
+      'name' => array('default' => null),
+      'author' => array('default' => null),
+      'comment' => array('default' => null),
+      'level' => array(
+        'default' => 0,
+        'maxValue' => $conf['available_permission_levels']
+        ),
+      'tags' => array('default' => null),
+      ),
+    'POST method only.<br>Use the <b>image</b> field for uploading file.<br>Set the form encoding to "form-data"<br><b>category</b> is the numeric identifier of the destination category.'
+    );
+  
+  $service->addMethod(
     'pwg.categories.getAdminList',
     'ws_categories_getAdminList',
