]> err.no Git - scalable-opengroupware.org/commitdiff
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1364 d1b88da0-ebda-0310...
authorwolfgang <wolfgang@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 8 Feb 2008 16:21:28 +0000 (16:21 +0000)
committerwolfgang <wolfgang@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 8 Feb 2008 16:21:28 +0000 (16:21 +0000)
ChangeLog
SoObjects/Appointments/SOGoAppointmentFolders.m
SoObjects/Mailer/SOGoMailAccount.m
SoObjects/Mailer/SOGoMailBaseObject.h
SoObjects/Mailer/SOGoMailBaseObject.m
SoObjects/Mailer/SOGoMailBodyPart.m
SoObjects/Mailer/SOGoMailObject.m
SoObjects/SOGo/SOGoObject.m
SoObjects/SOGo/SOGoUserFolder.m
UI/WebServerResources/UIxRecurrenceEditor.js

index 84bb66280333c16f87bc6f5e419fc75715525642..8cd7fe1ac24f7439d190499cc94252dbefd5c2c6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2008-02-08  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
+
+       * SoObjects/Mailer/SOGoMailAccount.m ([SOGoMailAccount
+       -_urlHostString]): replace "@" with %40 AFTER invoking
+       stringByEscapingURL.
+
+       * SoObjects/Mailer/SOGoMailBaseObject.m ([SOGoMailBaseObject
+       -isBodyPartKey:key]): hacked a little bit to test for the length
+       of the key trimmed from its bordering digits. So if the key
+       contains only digits, we consider it to be a body part key. There
+       is room for improvement but we can consider this will be accurate
+       in 99.99% of the cases. Also, removed the context parameter which
+       was useless.
+
+       * SoObjects/SOGo/SOGoObject.m ([SOGoObject
+       -davComplianceClassesInContext:localContext]): new method,
+       declaring "access-control" in the compliance classes.
+
 2008-02-07  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
 
        * SoObjects/Mailer/SOGoMailAccount.m ([SOGoMailAccount
index 151f66fc866b4195f8fd088f414b26fd4f2979d2..dbb0277eb0e6c0cc5ed306f5ec26578c5de0edc5 100644 (file)
@@ -20,6 +20,7 @@
  * Boston, MA 02111-1307, USA.
  */
 
+#import <Foundation/NSArray.h>
 #import <Foundation/NSString.h>
 
 #import "SOGoAppointmentFolder.h"
   return @"Personal calendar";
 }
 
+// /* CalDAV support */
+// - (NSArray *) davComplianceClassesInContext: (WOContext *) localContext
+// {
+//   NSMutableArray *newClasses;
+
+//   newClasses
+//     = [NSMutableArray arrayWithArray:
+//                     [super davComplianceClassesInContext: localContext]];
+//   [newClasses addObject: @"calendar-access"];
+
+//   return newClasses;
+// }
+
+// - (NSArray *) davCalendarHomeSet
+// {
+//   /*
+//     <C:calendar-home-set xmlns:D="DAV:"
+//         xmlns:C="urn:ietf:params:xml:ns:caldav">
+//       <D:href>http://cal.example.com/home/bernard/calendars/</D:href>
+//     </C:calendar-home-set>
+
+//     Note: this is the *container* for calendar collections, not the
+//           collections itself. So for use its the home folder, the
+//       public folder and the groups folder.
+//   */
+//   NSArray *tag;
+
+//   tag = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
+//                  [self davURL], nil];
+
+//   return [NSArray arrayWithObject: tag];
+// }
+
+// - (NSArray *) davCalendarUserAddressSet
+// {
+//   NSArray *tag, *allEmails;
+//   NSMutableArray *addresses;
+//   NSEnumerator *emails;
+//   NSString *currentEmail;
+
+//   addresses = [NSMutableArray array];
+
+//   allEmails = [[context activeUser] allEmails];
+//   emails = [allEmails objectEnumerator];
+//   while ((currentEmail = [emails nextObject]))
+//     {
+//       tag = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
+//                  [NSString stringWithFormat: @"mailto:%@", currentEmail],
+//                  nil];
+//       [addresses addObject: tag];
+//     }
+
+//   return addresses;
+// }
+
+// - (NSArray *) davCalendarScheduleInboxURL
+// {
+//   NSArray *tag;
+
+//   tag = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
+//                  [NSString stringWithFormat: @"%@personal/", [self davURL]],
+//              nil];
+
+//   return [NSArray arrayWithObject: tag];
+// }
+
+// - (NSString *) davCalendarScheduleOutboxURL
+// {
+//   NSArray *tag;
+
+//   tag = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
+//                  [NSString stringWithFormat: @"%@personal/", [self davURL]],
+//              nil];
+
+//   return [NSArray arrayWithObject: tag];
+// }
+
+// - (NSString *) davDropboxHomeURL
+// {
+//   NSArray *tag;
+
+//   tag = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
+//                  [NSString stringWithFormat: @"%@personal/", [self davURL]],
+//              nil];
+
+//   return [NSArray arrayWithObject: tag];
+// }
+
+// - (NSString *) davNotificationsURL
+// {
+//   NSArray *tag;
+
+//   tag = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
+//                  [NSString stringWithFormat: @"%@personal/", [self davURL]],
+//              nil];
+
+//   return [NSArray arrayWithObject: tag];
+// }
+
 @end
index 7270874e5e7b9c7e3997721350fad7fa003413cd..976f3f98db3f34d4dbcc464d6efbb936878b217c 100644 (file)
@@ -256,8 +256,8 @@ static NSString *otherUsersFolderName = @""; // TODO: add English default
     {
       username = [mailAccount objectForKey: @"userName"];
       escUsername
-       = [[username stringByReplacingString: @"@" withString: @"%40"]
-           stringByEscapingURL];
+       = [[username stringByEscapingURL] stringByReplacingString: @"@"
+                                         withString: @"%40"];
       hostString = [NSString stringWithFormat: @"%@@%@", escUsername,
                             [mailAccount objectForKey: @"serverName"]];
     }
index 1faecb77f5338380ca2d1562a9ddcec1b7252317..8d59674297b76b02a68695b6dc356ae75e8dc09c 100644 (file)
@@ -74,7 +74,7 @@
 
 /* IMAP4 names */
 
-- (BOOL) isBodyPartKey: (NSString *) _key inContext: (id) _ctx;
+- (BOOL) isBodyPartKey: (NSString *) key;
 
 @end
 
index ebe5946259abca4ab194df7fad46b45c2654f3a4..cfeda797fbb9c6291fdcae4acf5b3f81f7f9c519 100644 (file)
@@ -19,6 +19,9 @@
   02111-1307, USA.
 */
 
+#import <Foundation/NSCharacterSet.h>
+#import <Foundation/NSString.h>
+
 #import <NGObjWeb/SoObject+SoDAV.h>
 #import <NGExtensions/NSNull+misc.h>
 #import <NGExtensions/NSObject+Logs.h>
@@ -205,18 +208,15 @@ static BOOL debugOn = YES;
 
 /* IMAP4 names */
 
-- (BOOL)isBodyPartKey:(NSString *)_key inContext:(id)_ctx {
-  /*
-    Every key starting with a digit is considered an IMAP4 mime part key, used in
-    SOGoMailObject and SOGoMailBodyPart.
-  */
-  if ([_key length] == 0)
-    return NO;
-  
-  if (isdigit([_key characterAtIndex:0]))
-    return YES;
-  
-  return NO;
+#warning we could improve this by simply testing if the reference is the filename of an attachment or if the body part mentionned actually exists in the list of body parts. Another way is to use a prefix such as "attachment-*" to declare attachments.
+- (BOOL) isBodyPartKey: (NSString *) key
+{
+  NSString *trimmedKey;
+
+  trimmedKey = [key stringByTrimmingCharactersInSet:
+                     [NSCharacterSet decimalDigitCharacterSet]];
+
+  return (![trimmedKey length]);
 }
 
 - (NSArray *) aclsForUser: (NSString *) uid
index 970abbb8d7e53e26806c3f8cc529ce11c2bdd34d..3afd10e076aee681bcf32e4a363b2069578a2ee6 100644 (file)
@@ -206,7 +206,7 @@ static BOOL debugOn = NO;
   if (!obj)
     {
       /* lookup body part */
-      if ([self isBodyPartKey:_key inContext:_ctx])
+      if ([self isBodyPartKey:_key])
        obj = [self lookupImap4BodyPartKey:_key inContext:_ctx];
       else if ([_key isEqualToString: @"asAttachment"])
        [self setAsAttachment];
index ec0c280368132996161e72cf2829ce47d6754b56..d1493a505d5e89c300a35544dd9d573facf98a78 100644 (file)
@@ -866,7 +866,7 @@ static BOOL debugSoParts       = NO;
   
   /* lookup body part */
   
-  if ([self isBodyPartKey:_key inContext:_ctx]) {
+  if ([self isBodyPartKey:_key]) {
     if ((obj = [self lookupImap4BodyPartKey:_key inContext:_ctx]) != nil) {
       if (debugSoParts)
        [self logWithFormat: @"mail looked up part %@: %@", _key, obj];
index 9c5fbcee648b727c7c22d745046f25f7f599f978..748461d97d8a2af6c7399d21f62cbdda74ade603 100644 (file)
@@ -1099,4 +1099,16 @@ static BOOL kontactGroupDAV = YES;
                   [self nameInContainer]];
 }
 
+- (NSArray *) davComplianceClassesInContext: (WOContext *) localContext
+{
+  NSMutableArray *newClasses;
+
+  newClasses
+    = [NSMutableArray arrayWithArray:
+                       [super davComplianceClassesInContext: localContext]];
+  [newClasses addObject: @"access-control"];
+
+  return newClasses;
+}
+
 @end /* SOGoObject */
index efd551e7774de75b7e9be7cf781dfa059027c51f..1df3b30458e9af02197868c491ce4fae6e51471e 100644 (file)
   return YES;
 }
 
-/* CalDAV support */
-- (NSArray *) davCalendarHomeSet
-{
-  /*
-    <C:calendar-home-set xmlns:D="DAV:"
-        xmlns:C="urn:ietf:params:xml:ns:caldav">
-      <D:href>http://cal.example.com/home/bernard/calendars/</D:href>
-    </C:calendar-home-set>
-
-    Note: this is the *container* for calendar collections, not the
-          collections itself. So for use its the home folder, the
-         public folder and the groups folder.
-  */
-  NSArray *tag;
-  SOGoAppointmentFolders *parent;
-
-  parent = [self privateCalendars: @"Calendar" inContext: context];
-  tag = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
-                 [parent davURL], nil];
-
-  return [NSArray arrayWithObject: tag];
-}
+// /* CalDAV support */
+// - (NSArray *) davCalendarHomeSet
+// {
+//   /*
+//     <C:calendar-home-set xmlns:D="DAV:"
+//         xmlns:C="urn:ietf:params:xml:ns:caldav">
+//       <D:href>http://cal.example.com/home/bernard/calendars/</D:href>
+//     </C:calendar-home-set>
+
+//     Note: this is the *container* for calendar collections, not the
+//           collections itself. So for use its the home folder, the
+//       public folder and the groups folder.
+//   */
+//   NSArray *tag;
+//   SOGoAppointmentFolders *parent;
+
+//   parent = [self privateCalendars: @"Calendar" inContext: context];
+//   tag = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
+//                  [parent davURL], nil];
+
+//   return [NSArray arrayWithObject: tag];
+// }
 
 // - (NSArray *) davCalendarUserAddressSet
 // {
index 06856f57e7de6415b43b83d12cdf28d0275543a7..243649846168450259ed9c37fcdb9e3bed7ab47e 100644 (file)
@@ -3,9 +3,9 @@ var RecurrenceEditor = {
  currentRepeatType: 0
 }
 
-function onRepeatTypeChange(event) {
-  setRepeatType(parseInt(this.value));
-}
+  function onRepeatTypeChange(event) {
+    setRepeatType(parseInt(this.value));
+  }
 
 function setRepeatType(type) {
   var elements;
@@ -29,7 +29,7 @@ function getSelectedDays(element) {
   var elementsArray = $A(element.getElementsByTagName('DIV'));
   var days = new Array();
   elementsArray.each(function(item) {
-       if (isNodeSelected(item))
+      if (isNodeSelected(item))
        days.push(item.readAttribute("name"));
     });
   return days.join(",");
@@ -62,13 +62,15 @@ function initializeSelectors() {
 }
 
 function initializeWindowButtons() {
-   var okButton = $("okButton");
-   var cancelButton = $("cancelButton");
+  var okButton = $("okButton");
+  var cancelButton = $("cancelButton");
 
-   Event.observe(okButton, "click", onEditorOkClick, false);
-   Event.observe(cancelButton, "click", onEditorCancelClick, false);
+  Event.observe(okButton, "click", onEditorOkClick, false);
+  Event.observe(cancelButton, "click", onEditorCancelClick, false);
 
-   $("repeatType").observe("change", onRepeatTypeChange, false);
+  var repeatType = $("repeatType");
+  setRepeatType(parseInt(repeatType.value));
+  repeatType.observe("change", onRepeatTypeChange, false);
 }
 
 function initializeFormValues() {
@@ -145,112 +147,151 @@ function initializeFormValues() {
   $("range_of_recurrence").show();
 }
 
+function handleDailyRecurrence() {
+  var validate = false;
+
+  var radioValue = $('recurrence_form').getRadioValue('dailyRadioButtonName');
+
+  // We check if the dailyDaysField really contains an integer
+  if (radioValue == 0) {
+    var v = "" + $('dailyDaysField').value;
+    if (v.length > 0) {
+      v = parseInt(v);
+      if (isNaN(v) || v <= 1)
+       window.alert("Please specify a numerical value in the Days field greater or equal to 1.");
+      else
+       validate = true;
+    }
+  }
+  else
+    validate = true;
+
+  if (validate) {
+    parent$("repeat1").value = radioValue;
+    parent$("repeat2").value = v;
+  }
+
+  return validate;
+}
+
+function handleWeeklyRecurrence() {
+  var validate = false;
+
+  var fieldValue = "" + $('weeklyWeeksField').value;
+
+  // We check if the weeklyWeeksField really contains an integer
+  var v = parseInt(fieldValue);
+  if (isNaN(v) || v <= 0)
+    window.alert("Please specify a numerical value in the Week(s) field greater or equal to 1.");
+  else {
+    validate = true;
+    parent$("repeat1").value = fieldValue;
+    parent$("repeat2").value = getSelectedDays($('week'));
+  }
+
+  return validate;
+}
+
+function handleMonthlyRecurrence() {
+  var validate = false;
+
+  var radioValue = $('recurrence_form').getRadioValue('monthlyRadioButtonName');
+
+  // FIXME - right now we do not support rules
+  //         such as The Second Tuesday...
+  if (radioValue == 0)
+    window.alert("This type of recurrence is currently unsupported.");
+  else {
+    // We check if the monthlyMonthsField really contains an integer
+    var fieldValue = $('monthlyMonthsField').value;
+    var v = parseInt(fieldValue);
+    if (isNaN(v) || v <= 0)
+      window.alert("Please specify a numerical value in the Month(s) field greater or equal to 1.");
+    else {
+      parent$("repeat1").value = fieldValue;
+      parent$("repeat2").value = radioValue;
+      parent$("repeat3").value = $('monthlyRepeat').value;
+      parent$("repeat4").value = $('monthlyDay').value;
+      parent$("repeat5").value = getSelectedDays($('month'));
+    }
+  }
+
+  return validate;
+}
+
+function handleYearlyRecurrence() {
+  var validate = true;
+
+  parent$("repeat1").value = $('yearlyYearsField').value;
+  parent$("repeat2").value = $('recurrence_form').getRadioValue('yearlyRadioButtonName');
+  parent$("repeat3").value = $('yearlyDayField').value;
+  parent$("repeat4").value = $('yearlyMonth1').value;
+  parent$("repeat5").value = $('yearlyRepeat').value;
+  parent$("repeat6").value = $('yearlyDay').value;
+  parent$("repeat7").value = $('yearlyMonth2').value;
+
+  // FIXME - right now we do not support rules
+  //         such as Every Second Tuesday of February
+  if (parent$("repeat2").value == 1) {
+    window.alert("This type of recurrence is currently unsupported.");
+    validate = false;
+  }
+
+  // We check if the yearlyYearsField really contains an integer
+  var v = parseInt(parent$("repeat1").value);
+  if (isNaN(v) || v <= 0) {
+    window.alert("Please specify a numerical value in the Year(s) field greater or equal to 1.");
+    validate = false;
+  }
+
+  return validate;
+}
+
+function validateRange() {
+  var validate = true;
+
+  var range = $('recurrence_form').getRadioValue('rangeRadioButtonName');
+  parent$("range1").value = range;
+
+  if (range == 1) {
+    parent$("range2").value = $('rangeAppointmentsField').value;
+
+    // We check if the rangeAppointmentsField really contains an integer
+    var v = parseInt(parent$("range2").value);
+    if (isNaN(v) || v <= 0) {
+      window.alert("Please specify a numerical value in the Appointment(s) field  greater or equal to 1.");
+      validate = false;
+    }
+  }
+  else if (range == 2)
+    parent$("range2").value = $('endDate_date').value;
+
+  return validate;
+}
+
 function onEditorOkClick(event) {
-   preventDefault(event);
-   var repeatType = $("repeatType").value;
-   var v;
-
-   parent$("repeatType").value = repeatType;
-
-   if (repeatType == 0) {
-     // Repeat daily
-     v = $('recurrence_form').getRadioValue('dailyRadioButtonName')
-     parent$("repeat1").value = v;
-
-     // We check if the dailyDaysField really contains an integer
-     if (v == 0) {
-       parent$("repeat2").value = $('dailyDaysField').value;
-       v = parseInt(parent$("repeat2").value);
-       if (isNaN(v) || v <= 0) {
-        window.alert("Please specify a numerical value in the Days field greater or equal to 1.");
-        return false;
-       }
-     }
-   } 
-   else if (repeatType == 1) {
-     // Repeat weekly
-     v = $('weeklyWeeksField').value;
-     parent$("repeat1").value = v;
-     parent$("repeat2").value = getSelectedDays($('week'));
-
-     // We check if the weeklyWeeksField really contains an integer
-     v = parseInt(v);
-     if (isNaN(v) || v <= 0) {
-       window.alert("Please specify a numerical value in the Week(s) field greater or equal to 1.");
-       return false;
-     }
-   }
-   else if (repeatType == 2) {
-     // Repeat monthly
-     v = $('monthlyMonthsField').value;
-     parent$("repeat1").value = v;
-     parent$("repeat2").value = $('recurrence_form').getRadioValue('monthlyRadioButtonName');
-     parent$("repeat3").value = $('monthlyRepeat').value;
-     parent$("repeat4").value = $('monthlyDay').value;
-     parent$("repeat5").value = getSelectedDays($('month'));
-
-     // FIXME - right now we do not support rules
-     //         such as The Second Tuesday...
-     if (parent$("repeat2").value == 0) {
-       window.alert("This type of recurrence is currently unsupported.");
-       return false;
-     }
-
-     // We check if the monthlyMonthsField really contains an integer
-     v = parseInt(v);
-     if (isNaN(v) || v <= 0) {
-       window.alert("Please specify a numerical value in the Month(s) field greater or equal to 1.");
-       return false;
-     }
-   }
-   else {
-     // Repeat yearly 
-     parent$("repeat1").value = $('yearlyYearsField').value;
-     parent$("repeat2").value = $('recurrence_form').getRadioValue('yearlyRadioButtonName');
-     parent$("repeat3").value = $('yearlyDayField').value;
-     parent$("repeat4").value = $('yearlyMonth1').value;
-     parent$("repeat5").value = $('yearlyRepeat').value;
-     parent$("repeat6").value = $('yearlyDay').value;
-     parent$("repeat7").value = $('yearlyMonth2').value;
-
-     // FIXME - right now we do not support rules
-     //         such as Every Second Tuesday of February
-     if (parent$("repeat2").value == 1) {
-       window.alert("This type of recurrence is currently unsupported.");
-       return false;
-     }
-
-     // We check if the yearlyYearsField really contains an integer
-     v = parseInt(parent$("repeat1").value);
-     if (isNaN(v) || v <= 0) {
-       window.alert("Please specify a numerical value in the Year(s) field greater or equal to 1.");
-       return false;
-     }
-   }
-
-   var range = $('recurrence_form').getRadioValue('rangeRadioButtonName');
-   parent$("range1").value = range;
-
-   if (range == 1) {
-     parent$("range2").value = $('rangeAppointmentsField').value;
-
-     // We check if the rangeAppointmentsField really contains an integer
-     v = parseInt(parent$("range2").value);
-     if (isNaN(v) || v <= 0) {
-       window.alert("Please specify a numerical value in the Appointment(s) field  greater or equal to 1.");
-       return false;
-     }
-   }
-   else if (range == 2) {
-     parent$("range2").value = $('endDate_date').value;
-   }
-
-   window.close();
+  preventDefault(event);
+  var repeatType = $("repeatType").value;
+  parent$("repeatType").value = repeatType;
+
+  var validate;
+  if (repeatType == 0)
+    validate = handleDailyRecurrence();
+  else if (repeatType == 1)
+    validate = handleWeeklyRecurrence();
+  else if (repeatType == 2)
+    validate = handleMonthlyRecurrence();
+  else
+    validate = handleYearlyRecurrence();
+
+  if (validate
+      && validateRange())
+    window.close();
 }
 
 function onEditorCancelClick(event) {
-   preventDefault(event);
-   window.close();
+  preventDefault(event);
+  window.close();
 }
 
 function onRecurrenceLoadHandler() {