Index: drupalgapps.module
===================================================================
--- drupalgapps.module	(revision 526)
+++ drupalgapps.module	(working copy)
@@ -145,12 +145,10 @@
     }
   }
 
-  drupal_set_message($auth_token);
-
   if ($response_code == '200') {
     drupal_set_message(t('Authentication Token fetched'), 'status');
     watchdog('Google Apps', 'Authentication token fetched properly.', array(), WATCHDOG_NOTICE);
-    variable_set ('gapps_prov_api_auth_token', $auth_token);  //Store authentication token in drupal variable
+    variable_set('drupalgapps_prov_api_auth_token', $auth_token);  //Store authentication token in drupal variable
   }
   elseif ($response_code == '403') {
     drupal_set_message('Unable to fetch authentication token . Please re-check your settings.', 'error');
@@ -171,6 +169,10 @@
 function drupalgapps_clientlogin_api_request($url, $method = 'POST', $data = NULL) {
   // Set up some variables.
   $auth = variable_get('drupalgapps_prov_api_auth_token', NULL);
+  if (!$auth) {
+    drupalgapps_get_authtoken();
+    $auth = variable_get('drupalgapps_prov_api_auth_token', NULL);
+  }
   $proxy_add = variable_get('drupalgapps_proxy', NULL);
   $proxy_exist = $proxy_add ? 1 : 0;
 
@@ -198,6 +200,9 @@
       curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
       break;
   }
+  // debug params
+  //curl_setopt($ch, CURLOPT_HEADER, TRUE);
+  //curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
 
   // Set up remaining curl parameters.
   curl_setopt($ch, CURLOPT_URL, $url);
@@ -219,22 +224,16 @@
       case 201:
       case 202:
         // Return good result.
-        $result = urlencode($result);
         return $result;
-      case 400:
-        drupal_set_message('Error 400');
-        break;
-      case 415:
-        drupal_set_message('Error 415');
-        break;
 
       default;
-        watchdog('drupalgapps', t('The HTTPS request to Google seems to be broken (HTTP %code).', array('%code' => $httpresult->code)), WATCHDOG_WARNING);
-        drupal_set_message(t('The HTTPS request to Google seems to be broken (HTTP %code).', array('%code' => $httpresult->code)), 'error');
+        drupalgapps_parse_xmlresponse($result);
+        watchdog('drupalgapps', t('HTTP error: %code.', array('%code' => $code)), WATCHDOG_WARNING);
         return FALSE;
     }
   }
   else {
+    drupalgapps_parse_xmlresponse($result);
     watchdog('drupalgapps', t('The HTTPS request to Google seems to be broken like hell (unknown error).'), WATCHDOG_WARNING);
     drupal_set_message(t('The HTTPS request to Google seems to be broken like hell (unknown error).'), 'error');
     return FALSE;
@@ -245,6 +244,36 @@
 }
 
 /**
+ * Parse XML response.
+ *
+ * @TODO: parse good responses too.
+ */
+function drupalgapps_parse_xmlresponse($data) {
+  if (!$data) {
+    return FALSE;
+  }
+  $xml_parser = drupal_xml_parser_create($data);
+
+  if (!xml_parse_into_struct($xml_parser, $data, $values, $index)) {
+    watchdog('drupalgapps', 'Error parsing response from Google: "%error" on line %line.', array('%error' => xml_error_string(xml_get_error_code($xml_parser)), '%line' => xml_get_current_line_number($xml_parser)), WATCHDOG_ERROR);
+    drupal_set_message(t('Error parsing response form Google: "%error" on line %line.', array('%error' => xml_error_string(xml_get_error_code($xml_parser)), '%line' => xml_get_current_line_number($xml_parser))), 'error');
+    return FALSE;
+  }
+  xml_parser_free($xml_parser);
+
+  if (isset($index['ERROR'])) {
+    $i = $index['ERROR'][0];
+    $code = $values[$i]['attributes']['ERRORCODE'];
+    $error = $values[$i]['attributes']['REASON'];
+    watchdog('drupalgapps', 'Error response from Google: "%code: %error".', array('%code' => $code, '%error' => $error), WATCHDOG_ERROR);
+    drupal_set_message(t('Error response form Google: "%code: %error".', array('%code' => $code, '%error' => $error)), 'error');
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
  * @} End of "ingroup client_login".
  */
 
@@ -322,7 +351,7 @@
 /**
  * Create user account.
  */
-function drupalgapps_make_gaccount($gaccount, $firstname, $lastname, $password, $quota = '', $changePassword = TRUE, $suspended = FALSE, $admin = FALSE) {
+function drupalgapps_make_gaccount($gaccount, $firstname, $lastname, $password, $quota = NULL, $changePassword = 'true', $suspended = 'false', $admin = 'false', $hashFunctionName = NULL) {
 
   $data = <<<XML
 <?xml version="1.0" encoding="UTF-8"?>
@@ -330,20 +359,32 @@
 xmlns:apps="http://schemas.google.com/apps/2006">
 <atom:category scheme="http://schemas.google.com/g/2005#kind"
 term="http://schemas.google.com/apps/2006#user"/>
-<apps:login userName="$gaccount"
-password="$password" suspended="$suspended" changePasswordAtNextLogin="$changePassword"/>
-<apps:quota limit="$quota"/>
-<apps:name familyName="$lastname" givenName="$firstname"/>
-</atom:entry>
 XML;
-  $url = 'https://apps-apis.google.com/a/feeds/jiitu.org/user/2.0';
-  $success = drupalgapps_clientlogin_api_request($url, 'POST', $data);
-  if ($success) {
-    drupal_set_message(t('Google account created'));
+
+  if ($hashFunctionName) {
+    $data .= '<apps:login userName="' . $gaccount . '" password="' . $password .
+      '" suspended="' . $suspended . '" changePasswordAtNextLogin="' .
+      $changePassword . '" hashFunctionName="' . $hashFunctionName .'" />';
   }
   else {
-    drupal_set_message(t('Failed to create Google account'), 'error');
+    $data .= '<apps:login userName="' . $gaccount . '" password="' . $password .
+      '" suspended="' . $suspended . '" changePasswordAtNextLogin="' .
+      $changePassword . '" />';
   }
+  if ($quota) {
+    $data .= '<apps:quota limit="' . $quota . '"/>';
+  }
+  $data .= '<apps:name familyName="' . $lastname . '" givenName="' . $firstname . '"/></atom:entry>';
+
+  // Make the request.
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/' . $domain . '/user/2.0';
+  $response = drupalgapps_clientlogin_api_request($url, 'POST', $data);
+  return $response;
 }
 
 
@@ -419,17 +460,14 @@
  * Retrieve a user account.
  */
 function drupalgapps_retrieve_gaccount($username) {
-  $url = 'https://apps-apis.google.com/a/feeds/jiitu.org/user/2.0/' . $username;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/' . $doamin . '/user/2.0/' . $username;
   $result = drupalgapps_clientlogin_api_request($url, 'GET');
-  if ($result) {
-    drupal_set_message(t('Google account retrieved'));
-    // @TODO: do something with the result.
-  }
-  else {
-    drupal_set_message(t('Failed to retrieve Google account'), 'error');
-  }
-
-  return;
+  return $result;
 }
 
 
@@ -459,14 +497,14 @@
   }
   $data .= '</atom:entry>';
 
-  $url = 'https://apps-apis.google.com/a/feeds/jiitu.org/user/2.0/' . $username;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/' . $doamin . '/user/2.0/' . $username;
   $result = drupalgapps_clientlogin_api_request($url, 'PUT', $data);
-  if ($result) {
-    drupal_set_message(t('Google account updated'));
-  }
-  else {
-    drupal_set_message(t('Failed to update Google account'), 'error');
-  }
+  return $result;
 }
 
 /**
@@ -491,14 +529,14 @@
     </atom:entry>
 XML;
 
-  $url = 'https://apps-apis.google.com/a/feeds/jiitu.org/user/2.0/' . $username;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/' . $doamin . '/user/2.0/' . $username;
   $result = drupalgapps_clientlogin_api_request($url, 'PUT', $data);
-  if ($result) {
-    drupal_set_message(t('Google account renamed'));
-  }
-  else {
-    drupal_set_message(t('Failed to rename Google account'), 'error');
-  }
+  return $result;
 }
 
 
@@ -506,14 +544,14 @@
  * Delete a Google user account.
  */
 function drupalgapps_delete_gaccount($username) {
-  $url = 'https://apps-apis.google.com/a/feeds/jiitu.org/user/2.0/' . $username;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/' . $doamin . '/user/2.0/' . $username;
   $result = drupalgapps_clientlogin_api_request($url, 'DELETE');
-  if ($result) {
-    drupal_set_message(t('Google account deleted'));
-  }
-  else {
-    drupal_set_message(t('Failed to delete Google account'), 'error');
-  }
+  return $result;
 }
 
 /**
@@ -531,43 +569,42 @@
 XML;
 
 
-  $url = 'https://apps-apis.google.com/a/feeds/domain/nickname/2.0';
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/' . $domain . '/nickname/2.0';
   $result = drupalgapps_clientlogin_api_request($url, 'POST', $data);
-  if ($result) {
-    drupal_set_message(t('Google nickname created'));
-  }
-  else {
-    drupal_set_message(t('Failed to create Google nickname'), 'error');
-  }
+  return $result;
 }
 
 /**
  * Retrieve a Google nickname.
  */
 function drupalgapps_retrieve_nickname($username) {
-  $url = 'https://apps-apis.google.com/a/feeds/jiitu.org/user/2.0/' . $username;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/' . $doamin . '/user/2.0/' . $username;
   $result = drupalgapps_clientlogin_api_request($url, 'GET');
-  if ($result) {
-    drupal_set_message(t('Google nickname retrieved'));
-    // @TODO: do something with the result.
-  }
-  else {
-    drupal_set_message(t('Failed to retrieve Google nickname'), 'error');
-  }
+  return $result;
 }
 
 /**
  * Delete a Google nickname.
  */
 function drupalgapps_delete_nickname($username) {
-  $url = 'https://apps-apis.google.com/a/feeds/domain/nickname/2.0/' . $username;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/' . $domain . '/nickname/2.0/' . $username;
   $result = drupalgapps_clientlogin_api_request($url, 'DELETE');
-  if ($result) {
-    drupal_set_message(t('Google nickname deleted'));
-  }
-  else {
-    drupal_set_message(t('Failed to delete Google nickname'), 'error');
-  }
+  return $result;
 }
 
 
@@ -584,14 +621,14 @@
 </atom:entry>
 XML;
 
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/';
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/';
   $result = drupalgapps_clientlogin_api_request($url, 'POST');
-  if ($result) {
-    drupal_set_message(t('Google group created'));
-  }
-  else {
-    drupal_set_message(t('Failed to create Google group'), 'error');
-  }
+  return $result;
 }
 
 
@@ -615,14 +652,14 @@
   }
   $data .= '</atom:entry>';
 
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id;
   $result = drupalgapps_clientlogin_api_request($url, 'PUT', $data);
-  if ($result) {
-    drupal_set_message(t('Google group updated'));
-  }
-  else {
-    drupal_set_message(t('Failed to update Google group'), 'error');
-  }
+  return $result;
 }
 
 
@@ -630,15 +667,14 @@
  * Retrieve a Google user group.
  */
 function drupalgapps_retrieve_groups($member_id) {
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/?member=' . $member_id . '[&[directOnly=]]';
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/?member=' . $member_id . '[&[directOnly=]]';
   $result = drupalgapps_clientlogin_api_request($url, 'GET');
-  if ($result) {
-    drupal_set_message(t('Google group retrieved'));
-    // @TODO: do something with the result.
-  }
-  else {
-    drupal_set_message(t('Failed to retrieve Google group'), 'error');
-  }
+  return $result;
 }
 
 
@@ -647,14 +683,14 @@
  * Delete a Google user group.
  */
 function drupalgapps_delete_group($group_id) {
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id;
   $result = drupalgapps_clientlogin_api_request($url, 'DELETE');
-  if ($result) {
-    drupal_set_message(t('Google group deleted'));
-  }
-  else {
-    drupal_set_message(t('Failed to delete Google group'), 'error');
-  }
+  return $result;
 }
 
 
@@ -672,14 +708,14 @@
 </atom:entry>
 XML;
 
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id . '/member';
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id . '/member';
   $result = drupalgapps_clientlogin_api_request($url, 'POST', $data);
-  if ($result) {
-    drupal_set_message(t('Google group member added'));
-  }
-  else {
-    drupal_set_message(t('Failed to add member to Google group'), 'error');
-  }
+  return $result;
 }
 
 
@@ -699,14 +735,14 @@
 </atom:entry>
 XML;
 
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id . '/member';
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id . '/member';
   $result = drupalgapps_clientlogin_api_request($url, 'POST', $data);
-  if ($result) {
-    drupal_set_message(t('Google group added to group'));
-  }
-  else {
-    drupal_set_message(t('Failed to add group to Google group'), 'error');
-  }
+  return $result;
 }
 
 
@@ -714,44 +750,42 @@
  * Retrieve all members of a Google group.
  */
 function drupalgapps_retrieve_group_members($group_id) {
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id . '/member[?[start=]]';
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id . '/member[?[start=]]';
   $result = drupalgapps_clientlogin_api_request($url, 'GET');
-  if ($result) {
-    drupal_set_message(t('Google group members retrieved'));
-    // @TODO: do something with $result.
-  }
-  else {
-    drupal_set_message(t('Failed to retrieve Google group members'), 'error');
-  }
+  return $result;
 }
 
 /**
  * Retrieve a member from a Google group.
  */
 function drupalgapps_retrieve_group_member($group_id, $member_id) {
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id . '/member/' . $member_id;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id . '/member/' . $member_id;
   $result = drupalgapps_clientlogin_api_request($url, 'GET');
-  if ($result) {
-    drupal_set_message(t('Google group member retrieved'));
-    // @TODO: do something with $result.
-  }
-  else {
-    drupal_set_message(t('Failed to retrieve Google group member'), 'error');
-  }
+  return $result;
 }
 
 /**
  * Remove a Google group member.
  */
 function drupalgapps_delete_member($group_id, $member_id) {
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id . '/member/' . $member_id;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id . '/member/' . $member_id;
   $result = drupalgapps_clientlogin_api_request($url, 'DELETE');
-  if ($result) {
-    drupal_set_message(t('Google group member deleted'));
-  }
-  else {
-    drupal_set_message(t('Failed to delete Google group member'), 'error');
-  }
+  return $result;
 }
 
 
@@ -768,14 +802,14 @@
 </atom:entry>
 XML;
 
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id . '/owner';
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id . '/owner';
   $result = drupalgapps_clientlogin_api_request($url, 'POST', $data);
-  if ($result) {
-    drupal_set_message(t('Owner member added to Google group'));
-  }
-  else {
-    drupal_set_message(t('Failed to add owner member to Google group'), 'error');
-  }
+  return $result;
 }
 
 
@@ -792,14 +826,14 @@
 </atom:entry>
 XML;
 
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id . '/owner';
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id . '/owner';
   $result = drupalgapps_clientlogin_api_request($url, 'POST', $data);
-  if ($result) {
-    drupal_set_message(t('Owner group added to Google group'));
-  }
-  else {
-    drupal_set_message(t('Failed to add owner group to Google group'), 'error');
-  }
+  return $result;
 }
 
 
@@ -807,29 +841,28 @@
  * Retrieve an owner of a Google group.
  */
 function drupalgapps_retrieve_group_owner($group_id) {
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id . '/owner';
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id . '/owner';
   $result = drupalgapps_clientlogin_api_request($url, 'GET');
-  if ($result) {
-    drupal_set_message(t('Google group owner retrieved'));
-    // @TODO: do something with $result.
-  }
-  else {
-    drupal_set_message(t('Failed to retrieve Google group owner'), 'error');
-  }
+  return $result;
 }
 
 /**
  * Remove an owner from a Google group.
  */
 function drupalgapps_delete_owner($group_id, $owner_email) {
-  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/domain/' . $group_id . '/owner/' . $owner_email;
+  $domain = variable_get('drupalgapps_domain_name', '');
+  if (!$domain) {
+    drupal_set_message(t('No Google Apps domain name set'));
+    return FALSE;
+  }
+  $url = 'https://apps-apis.google.com/a/feeds/group/2.0/' . $domain . '/' . $group_id . '/owner/' . $owner_email;
   $result = drupalgapps_clientlogin_api_request($url, 'DELETE');
-  if ($result) {
-    drupal_set_message(t('Google group owner deleted'));
-  }
-  else {
-    drupal_set_message(t('Failed to delete Google group owner'), 'error');
-  }
+  return $result;
 }
 
 /**
Index: drupalgapps.info
===================================================================
--- drupalgapps.info	(revision 524)
+++ drupalgapps.info	(working copy)
@@ -1,8 +1,8 @@
 ; $Id$
-name = Drupalgapps
+name = Drupalgapps API
 description = "Google Apps framework for Drupal"
 core = 6.x
 dependencies[] = curl
 dependencies[] = elysia_cron
 dependencies[] = aes
-package = "Google Apps Framework"
\ No newline at end of file
+package = "Google Apps Framework"
