Index: feedapi.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feedapi/feedapi.module,v
retrieving revision 1.23.2.119.2.48
diff -u -p -r1.23.2.119.2.48 feedapi.module
--- feedapi.module	18 Mar 2009 22:50:03 -0000	1.23.2.119.2.48
+++ feedapi.module	20 Mar 2009 16:46:23 -0000
@@ -369,6 +369,14 @@ function feedapi_form_alter(&$form, $for
       '#default_value' => isset($node_type_settings['enabled']) ? $node_type_settings['enabled'] : FALSE,
       '#weight' => -15,
     );
+    $form['feedapi']['upload_method'] = array(
+      '#type' => 'radios',
+      '#title' => t('Supply feed as'),
+      '#description' => t('Select how a user will supply a feed. Choose URL if the user will paste a URL to a textfield, choose File upload if the user will upload a feed from the local disk.'),
+      '#options' => array('url' => t('URL'), 'upload' => t('File upload')),
+      '#default_value' => isset($node_type_settings['upload_method']) ? $node_type_settings['upload_method'] : 'url',
+      '#weight' => -14,
+    );
     $modules = module_implements('feedapi_settings_form');
     foreach ($modules as $module) {
       $form['feedapi']['defaults'] = array('#type' => 'markup', '#value' => '<strong>'. t('Default settings') .'</strong><hr/>');
@@ -459,6 +467,10 @@ function feedapi_form_alter(&$form, $for
     $form['#submit'][] = 'feedapi_content_type_submit';
   }
   elseif (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] .'_node_form' == $form_id && feedapi_enabled_type($form['type']['#value'])) {
+    // Get settings for corresponding content type
+    // Which parsers / processors are enabled is a per content-type setting.
+    $node_type_settings = feedapi_get_settings($form['type']['#value']);
+
     // FeedAPI-enabled node form.
     $form['title']['#required'] = FALSE;
     $form['title']['#description'] = t('This field will be populated with the feed title. You can override by filling in this field.');
@@ -482,26 +494,38 @@ function feedapi_form_alter(&$form, $for
     elseif (isset($form_state['values']['feedapi']['feedapi_url'])) {
       $feedapi_url_default = $form_state['values']['feedapi']['feedapi_url'];
     }
-    $form['feedapi']['feedapi_url'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Feed URL'),
-      '#description' => t('Enter feed URL.'),
-      '#default_value' => $feedapi_url_default,
-      '#maxlength' => 2048,
-    );
-    
+    if ($node_type_settings['upload_method'] == 'upload') {
+      // Makes possible to upload file via this form.
+      $form['#attributes']['enctype'] = 'multipart/form-data';
+      $form['feedapi']['feedapi_file'] = array(
+        '#type' => 'file',
+        '#title' => t('Upload a feed'),
+        '#description' => $feedapi_url_default ? '<div class="feed-url">'. $feedapi_url_default .'</div>' : '',
+        '#size' => 40,
+      );
+      $form['feedapi']['feedapi_url'] = array(
+        '#type' => 'value',
+        '#value' => $feedapi_url_default,
+      );
+    }
+    else {
+      $form['feedapi']['feedapi_url'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Feed URL'),
+        '#description' => t('Enter feed URL.'),
+        '#default_value' => $feedapi_url_default,
+        '#maxlength' => 2048,
+      );
+    }
     // Show per-node-type feedapi, parser options only for users with permissions.
     if (user_access('advanced feedapi options')) {
+      // retrieve forms.
       $modules = module_implements('feedapi_settings_form');
       foreach ($modules as $module) {
         if ($feedapi_form = module_invoke($module, 'feedapi_settings_form', 'general')) {
           $form['feedapi'] = array_merge_recursive($form['feedapi'], $feedapi_form);
         }
       }
-      // Get settings for corresponding content type
-      // Which parsers / processors are enabled is a per content-type setting.
-      $node_type_settings = feedapi_get_settings($form['type']['#value']);
-      // retrieve forms.
 
       $submodules_names = array(
         'parsers' => t('Parsers'),
@@ -552,17 +576,40 @@ function feedapi_form_alter(&$form, $for
  * See feedapi_form_alter on finding out how it is called (via FormAPI)
  */
 function feedapi_node_validate($form, &$form_state) {
-  $feed = _feedapi_build_feed_object($form_state['values']['type'], $form_state['values']['feedapi']['feedapi_url']);
-  // Stick feed object into feedapi form snippet - store it in submit.
-  $form_state['values']['feedapi_object'] = $feed;
-  if (empty($form_state['values']['title']) && isset($feed->title)) {
-    form_set_value($form['title'], $feed->title, $form_state);
-  }
-  if (isset($form['body_field']) && empty($form_state['values']['body']) && isset($feed->description)) {
-    form_set_value($form['body_field']['body'], $feed->description, $form_state);
+  // Upload file.
+  $feed_dir = file_directory_path() .'/feeds';
+  file_check_directory($feed_dir, TRUE);
+  $file = file_save_upload('feedapi', array(), $feed_dir);
+  $has_upload = is_object($file);
+
+  // Validate and transform settings for submission.
+  if (empty($form_state['values']['feedapi']['feedapi_url']) && !$has_upload) {
+    form_set_error('source', t('The Feed URL or uploading a file is required.'));
   }
-  if (empty($form_state['values']['title'])) {
-    form_set_error('title', t('Title could not be retrieved from feed.'));
+  else {
+    if ($has_upload) {
+      $form_state['values']['feedapi']['feedapi_url'] = file_create_url($file->filepath);
+    }
+    $feed = _feedapi_build_feed_object($form_state['values']['type'], $form_state['values']['feedapi']['feedapi_url']);
+    if (!isset($feed->title) && $has_upload) {
+      $form_state['values']['feedapi']['feedapi_url'] = NULL;
+    }
+    // Stick feed object into feedapi form snippet - store it in submit.
+    $form_state['values']['feedapi_object'] = $feed;
+    if (empty($form_state['values']['title']) && isset($feed->title)) {
+      form_set_value($form['title'], $feed->title, $form_state);
+    }
+    if (isset($form['body_field']) && empty($form_state['values']['body']) && isset($feed->description)) {
+      form_set_value($form['body_field']['body'], $feed->description, $form_state);
+    }
+    if (empty($form_state['values']['title'])) {
+      if (!$has_upload) {
+        form_set_error('title', t('Title could not be retrieved from feed.'));
+      }
+      else {
+        form_set_error('title', t('Title could not be detected. Make sure that the uploaded file is a valid feed.'));
+      }
+    }
   }
 }
 
