Index: cck_field_privacy.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck_field_privacy/cck_field_privacy.module,v
retrieving revision 1.3.2.2.2.10
diff -u -r1.3.2.2.2.10 cck_field_privacy.module
--- cck_field_privacy.module	21 Mar 2009 20:46:15 -0000	1.3.2.2.2.10
+++ cck_field_privacy.module	9 Apr 2009 18:39:45 -0000
@@ -422,4 +422,100 @@
   }
   variable_set('cckfp_values', serialize($stored_values));
   drupal_set_message('Settings Changed.');
-}
\ No newline at end of file
+}
+
+/**
+ * Implementation of hook_views - all views code in cck_field_privacy.module
+ */
+function cck_field_privacy_views_api() {
+  return array(
+    'api' => 2,
+  );
+}
+
+/**
+ * get the names of all inaccessible fields for a given user/node
+ * return array of field names that are inaccessible for given node or TRUE/FALSE if user is specified
+ */
+function _cck_get_inaccessible_fields($user, $node, $field = NULL) {
+  static $cached_results = array();
+  // check node type
+  $active_fields = _cck_field_privacy_get_active_fields($node->type);
+  
+  // do expensive db check only if it's a privacy controlled field (and if field is specified only if the field requested is privacy controlled)
+  if(!empty($active_fields) && (is_null($field) || array_key_exists($field, $active_fields)) && $user->uid != $node->uid) {
+    $cached_result = $cached_results[$node->uid][$node->type];
+    
+    if(isset($cached_result)) {
+      return is_null($field) ? $cached_result : isset($cached_result[$field]);
+    }
+    
+    $result = db_query("SELECT field_name, permission FROM {cckfp} WHERE uid = %d AND type_name = '%s' ORDER BY field_name DESC", $node->uid, $node->type);
+    
+    if ($result) {
+      while ($permissions = db_fetch_object($result)) {
+        if ($permissions->permission == 'e') {
+          continue;
+        } else if ($permissions->permission == 'n') {
+          $inaccessible_fields[$permissions->field_name] = $permissions->field_name;
+        } else if (!empty($permissions->permission)) {
+          $node_user = user_load(array('uid' => $node->uid));
+      		
+          $plugin_access_result = module_invoke($permissions->permission, 'cck_field_privacy_access', $node_user, $user);
+          error_log('result of module '.$permissions->permission.' check: '.print_r($plugin_access_result, TRUE));
+          if($plugin_access_result === FALSE) {
+            $inaccessible_fields[$permissions->field_name] = $permissions->field_name;
+          }
+        }
+      }
+    }   
+    
+    $cached_results[$node->uid][$node->type] = $inaccessible_fields;
+    
+    return is_null($field) ? $inaccessible_fields : isset($inaccessible_fields[$field]);
+  }
+}
+
+/**
+ * for a given content type - get the active fields
+ * if not content type given gets all active fields
+ */
+function _cck_field_privacy_get_active_fields($type = NULL) {
+  static $cached_all_active_fields;
+  static $cached_active_fields_by_type = array();
+  
+  if(is_null($type)) {
+    if(isset($cached_all_active_fields)) {
+      return $cached_all_active_fields;
+    }
+  } else {
+    if(isset($cached_active_fields_by_type[$type])) {
+      return $cached_active_fields_by_type[$type];
+    }
+  }
+  
+  $types = variable_get('cckfp_types', NULL);
+  $active_fields = array();
+
+  $values = unserialize(variable_get('cckfp_values', array()));
+
+  // if (array_key_exists($type, $types) && $types[$type] != '0') {
+  foreach($types as $key => $value) {
+    // if no type specified or the type matches and is not '0' - add the field names to the list of active fields
+    if((is_null($type) || $key == $type) && $value != '0') {
+      foreach($values[$key] as $field_name => $enabled) {
+        if(!strpos($field_name, '_default') && $enabled == TRUE) {
+          $active_fields[$field_name] = $field_name;
+        }
+      }
+    }
+  }
+  
+  if(is_null($type)) {
+    $cached_all_active_fields = $active_fields;
+  } else {
+    $cached_active_fields_by_type[$type] = $active_fields;
+  }
+  
+  return $active_fields;
+}

