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	19 Mar 2009 09:40:34 -0000
@@ -489,6 +489,14 @@ function feedapi_form_alter(&$form, $for
       '#default_value' => $feedapi_url_default,
       '#maxlength' => 2048,
     );
+    if (empty($feedapi_url_default) && !isset($form['#node']->nid)) {
+      $form['feedapi']['feedapi_file'] = array(
+        '#type' => 'file',
+        '#title' => t('Feed from file'),
+        '#description' => t('Upload a local file.'),
+        '#size' => 40,
+      );
+    }
     
     // Show per-node-type feedapi, parser options only for users with permissions.
     if (user_access('advanced feedapi options')) {
@@ -552,17 +560,35 @@ 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);
+  $file = file_save_upload('feedapi', array(), file_directory_path());
+  $has_upload = is_object($file);
+  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 (empty($form_state['values']['feedapi']['feedapi_url']) && $has_upload) {
+      $form_state['values']['feedapi']['feedapi_url'] = file_create_url($file->filename);
+    }
+    $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.'));
+      }
+    }
   }
 }
 
