? 744660-44_full_batching.patch
? 744660-45_full_batching.patch
? 849986-4_clean_batching.patch
? 850652-1_column_names.patch
? 850998-1_nice_upload.patch
? libraries/simplepie.inc
Index: feeds.css
===================================================================
RCS file: feeds.css
diff -N feeds.css
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ feeds.css	11 Jul 2010 16:05:25 -0000
@@ -0,0 +1,8 @@
+/* $Id$ */
+
+#edit-feeds-FeedsFileFetcher-upload-wrapper .file-info {
+  float: left;
+  width: 200px;
+  border-right: 1px solid #ddd;
+  margin-right: 10px;
+  }
Index: feeds.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feeds/feeds.module,v
retrieving revision 1.48
diff -u -p -r1.48 feeds.module
--- feeds.module	11 Jul 2010 01:10:52 -0000	1.48
+++ feeds.module	11 Jul 2010 16:05:25 -0000
@@ -154,6 +154,9 @@ function feeds_theme() {
     'feeds_info' => array(
       'file' => 'feeds.pages.inc',
     ),
+    'feeds_upload' => array(
+      'file' => 'feeds.pages.inc',
+    ),
   );
 }
 
Index: feeds.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feeds/feeds.pages.inc,v
retrieving revision 1.18
diff -u -p -r1.18 feeds.pages.inc
--- feeds.pages.inc	4 May 2010 21:24:58 -0000	1.18
+++ feeds.pages.inc	11 Jul 2010 16:05:25 -0000
@@ -152,3 +152,32 @@ function feeds_fetcher_callback($importe
   }
   drupal_access_denied();
 }
+
+/**
+ * Theme upload widget.
+ */
+function theme_feeds_upload($element) {
+  drupal_add_css(drupal_get_path('module', 'feeds') .'/feeds.css');
+  _form_set_class($element, array('form-file'));
+  $output = '';
+  if (!empty($element['#file_info'])) {
+    $info = $element['#file_info'];
+    $output .= '<div class="file-info">';
+    $output .= '<div class="file-name">';
+    $output .= l(basename($info['path']), $info['path']);
+    $output .= '</div>';
+    $output .= '<div class="file-size">';
+    $output .= format_size($info['size']);
+    $output .= '</div>';
+    if ($info['mime']) {
+      $output .= '<div class="file-mime">';
+      $output .= check_plain($info['mime']);
+      $output .= '</div>';
+    }
+    $output .= '</div>';
+  }
+  $output .= '<div class="file-upload">';
+  $output .= '<input type="file" name="'. $element['#name'] .'"'. ($element['#attributes'] ? ' '. drupal_attributes($element['#attributes']) : '') .' id="'. $element['#id'] .'" size="'. $element['#size'] ."\" />\n";
+  $output .= '</div>';
+  return theme('form_element', $element, $output);
+}
Index: plugins/FeedsFileFetcher.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feeds/plugins/FeedsFileFetcher.inc,v
retrieving revision 1.10
diff -u -p -r1.10 FeedsFileFetcher.inc
--- plugins/FeedsFileFetcher.inc	11 Jul 2010 13:54:35 -0000	1.10
+++ plugins/FeedsFileFetcher.inc	11 Jul 2010 16:05:25 -0000
@@ -53,17 +53,28 @@ class FeedsFileFetcher extends FeedsFetc
    * Source form.
    */
   public function sourceForm($source_config) {
-    $form = array();
+    $form = $info = array();
+    if (!empty($source_config['source'])) {
+      $info = array(
+        'path' => $source_config['source'],
+        'size' => filesize(realpath($source_config['source'])),
+      );
+      if (module_exists('mimedetect')) {
+        $info['mime'] = mimedetect_mime(realpath($source_config['source']));
+      }
+    }
     $form['source'] = array(
-      '#type' => 'textfield',
+      '#type' => empty($this->config['direct']) ? 'value' : 'textfield',
       '#title' => t('File'),
       '#description' => t('Specify a file in the site\'s file system path or upload a file below.'),
-      '#default_value' => isset($source_config['source']) ? $source_config['source'] : '',
+      '#default_value' => empty($source_config['source']) ? '' : $source_config['source'],
     );
     $form['upload'] = array(
       '#type' => 'file',
-      '#title' => t('Upload'),
-      '#description' => t('Choose a file from your local computer.'),
+      '#title' => empty($this->config['direct']) ? t('File') : NULL,
+      '#description' => empty($source_config['source']) ? t('Select the file to be imported from your local system.') : t('Select a different file to be imported from your local system.'),
+      '#theme' => 'feeds_upload',
+      '#file_info' => $info,
     );
     return $form;
   }
@@ -91,4 +102,27 @@ class FeedsFileFetcher extends FeedsFetc
       form_set_error('feeds][source', t('File needs to point to a file in your Drupal file system path.'));
     }
   }
+
+  /**
+   * Override parent::configDefaults().
+   */
+  public function configDefaults() {
+    return array(
+      'direct' => FALSE,
+    );
+  }
+
+  /**
+   * Override parent::configForm().
+   */
+  public function configForm(&$form_state) {
+    $form = array();
+    $form['direct'] = array(
+      '#type' =>'checkbox',
+      '#title' => t('Supply path to file directly'),
+      '#description' => t('For experts. If checked users can specify a path to a file when importing rather than uploading a file. This is useful when files to be imported are already present on server.'),
+      '#default_value' => $this->config['direct'],
+    );
+    return $form;
+  }
 }
