Index: mappers/feedapi_mapper_filefield.inc
===================================================================
RCS file: mappers/feedapi_mapper_filefield.inc
diff -N mappers/feedapi_mapper_filefield.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ mappers/feedapi_mapper_filefield.inc	16 Jul 2009 15:01:25 -0000
@@ -0,0 +1,65 @@
+<?php
+// $Id$
+
+/**
+* Implementation of hook_feedapi_mapper for pulling a file from an enclosure into a node.
+*
+* @param string $op
+* @param Drupal node $node
+* @param string $field_name
+* @param string, number or array of string or number $feed_element
+* @param string or number as id $sub_field
+*/
+function filefield_feedapi_mapper($op, $node, $feed_element = array(), $field_name = '', $sub_field = '') {
+  switch ($op) {
+    case 'describe':
+      return t('Maps a link to a file in a FileField CCK field. Use the original_url element for mapping to this field.');
+      break;
+
+    case 'list':
+      $info = content_types($node->type);
+      $fields = array();
+      if (@count($info['fields'])) {
+        foreach ($info['fields'] as $field_name => $field) {
+          if (in_array($field['type'], array('filefield'))) {
+            $fields[$field_name] = isset($field['widget']['label']) ? $field['widget']['label'] : $field_name;
+          }
+        }
+      }
+      if (count($fields)) {
+        return $fields;
+      }
+      return FALSE;
+      break;
+
+    case 'map':
+      if (is_string($feed_element) && valid_url($feed_element)) {
+        if (isset($node->{$field_name})) {
+          $items = $node->{$field_name};
+        }
+        else {
+          $items = array();
+        }
+
+        // straight link usually from options->original_url or options->guid
+        $filepath = file_destination(file_directory_temp() . '/' . basename($feed_element), FILE_EXISTS_RENAME);
+        $ok = copy($feed_element, $filepath); // TODO: use curl?
+        if ($ok) {
+          $info = field_file_save_file($filepath, array(), file_directory_path());
+          if ($info) {
+            $items[] = $info;
+          }
+          else {
+            watchdog("feedapi_mapper", "Could not save file @file", array('@file' => $filepath));
+          }
+        }
+        else {
+          watchdog("feedapi_mapper", "Could not fetch @url", array('@url' => $url));
+        }
+
+        $node->$field_name = $items;
+        return $node;
+      }
+      break;
+  }
+}
