Index: signup.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/signup/signup.module,v
retrieving revision 1.205.2.36
diff -u -p -r1.205.2.36 signup.module
--- signup.module	8 Oct 2009 00:01:29 -0000	1.205.2.36
+++ signup.module	10 May 2010 14:10:04 -0000
@@ -1007,6 +1007,11 @@ function signup_save_signup(&$signup) {
   if (!empty($rval)) {
     // If we successfully wrote a record, invoke the appropriate hook.
     module_invoke_all($hook, $signup);
+
+    // Invoke rules event handlers.
+    if (module_exists('rules')) {
+      rules_invoke_event($hook, $signup);
+    }
   }
 
   // Propagate the return value from drupal_write_record().
@@ -1087,6 +1092,11 @@ function signup_cancel_signup($signup, $
   // Invoke hook_signup_cancel().
   module_invoke_all('signup_cancel', $signup, $node);
 
+  // Invoke rules event handlers.
+  if (module_exists('rules')) {
+    rules_invoke_event('signup_cancel', $signup, $node);
+  }
+
   // Delete the record from the {signup_log} table.
   db_query('DELETE FROM {signup_log} WHERE sid = %d', $signup->sid);
   if ($notify_user) {
Index: signup.rules.inc
===================================================================
RCS file: signup.rules.inc
diff -N signup.rules.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ signup.rules.inc	12 May 2010 07:07:01 -0000
@@ -0,0 +1,108 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Provides rules integration for the signup module.
+ */
+
+/**
+ * Implementation of hook_rules_event_info().
+ * @ingroup rules
+ */
+function signup_rules_event_info() {
+  return array(
+    'signup_insert' => array(
+      'label' => t('User signed up to a content'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(FALSE),
+    ),
+    'signup_update' => array(
+      'label' => t('User updated signup of a content'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(FALSE),
+    ),
+    'signup_cancel' => array(
+      'label' => t('User canceled signup of a content'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(TRUE),
+    ),
+  );
+}
+
+/**
+ * Default arguments to signup rules events.
+ */
+function signup_rules_events_signup_arguments($have_node = FALSE) {
+  return array(
+    'signup' => array(
+      'type' => 'signup',
+      'label' => t('signup object'),
+    ),
+    'node' => array(
+      'type' => 'node',
+      'label' => t('node to which the user signed up'),
+      'handler' => $have_node ? '' : 'signup_rules_events_argument_signup_node',
+    ),
+    'account' => array(
+      'type' => 'user',
+      'label' => t('acting user'),
+      'handler' => 'signup_rules_events_argument_signup_user',
+    ),
+  );
+}
+
+/**
+ * Load associated node for a signup object.
+ */
+function signup_rules_events_argument_signup_node($signup) {
+  return node_load($signup->nid);
+}
+
+/**
+ * Load associated user account for a signup object.
+ */
+function signup_rules_events_argument_signup_user($signup) {
+  // If signup user is anonymous user get basic info from signup object.
+  if (!$signup->uid) {
+    $account = new stdClass();
+    $account->uid = 0;
+    $account->name = '';
+    $account->mail = $signup->anon_mail;
+    $account->roles = array(DRUPAL_ANONYMOUS_RID => 'anonymous user');
+  }
+  else {
+    $account = user_load($signup->uid);
+  }
+  return $account;
+}
+
+/**
+ * Implementation of hook_rules_data_type_info().
+ * @ingroup rules
+ */
+function signup_rules_data_type_info() {
+  return array(
+    'signup' => array(
+      'label' => t('signup'),
+      'class' => 'rules_data_type_signup',
+      'savable' => FALSE,
+      'identifiable' => TRUE,
+    ),
+  );
+}
+
+/**
+ * Implements the signup data type.
+ * @ingroup rules
+ */
+class rules_data_type_signup extends rules_data_type {
+  function load($sid) {
+    return signup_load_signup($sid);
+  }
+
+  function get_identifier() {
+    $signup = $this->get();
+    return $signup->sid;
+  }
+}
