merge of 'be11ede9b39c76d3a71c05143a448ab27a83a818'

and 'f0542255e31c3d8ac8c2d9b48083294de7e0308c'

Monotone-Parent: be11ede9b39c76d3a71c05143a448ab27a83a818
Monotone-Parent: f0542255e31c3d8ac8c2d9b48083294de7e0308c
Monotone-Revision: 4716c9e3a88b72ca631ad4d08c69388764bf28d5

Monotone-Author: flachapelle@inverse.ca
Monotone-Date: 2009-02-07T00:20:02
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Francis Lachapelle 2009-02-07 00:20:02 +00:00
commit 9d9e5c0e55
16 changed files with 131 additions and 83 deletions

View File

@ -4,6 +4,52 @@
add CardDAV stuff. Currently only implements the add CardDAV stuff. Currently only implements the
addressbook-home-set report from the principal URL. addressbook-home-set report from the principal URL.
2009-02-06 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* SoObjects/Appointments/SOGoAppointmentFolder.m
([SOGoAppointmentFolder
-fetchFields:_fieldsfrom:_startDateto:_endDatetitle:titlecomponent:_componentadditionalFilters:filtersincludeProtectedInformation:_includeProtectedInformation]):
added the "c_cycleinfo" and "c_cycleenddate" fields to the list of
fields that should not be stripped when removing protected informations.
* UI/Scheduler/UIxTaskEditor.m ([UIxTaskEditor -dealloc])
([UIxTaskEditor -todo]): same as below (apts).
* UI/Scheduler/UIxAppointmentEditor.m ([UIxAppointmentEditor
-event]): retain the event parent calendar object instead of the
event itself.
([UIxAppointmentEditor -dealloc]): release the above calendar.
* UI/MailPartViewers/UIxMailPartICalViewer.m
([UIxMailPartICalViewer -dealloc]): no longer release "inEvent"
since it does not need to be retained.
* Main/SOGo.m ([SOGo +initialize]): added handling of the
"SOGoDebugLeaks" configuration variable.
([SOGo -dispatchRequest:_request]): log the classes of instances
that were leaked between the handling of the request, if
SOGoDebugLeaks is set.
* SoObjects/SOGo/SOGoGCSFolder.m ([SOGoGCSFolder
-aclsForUser:uidforObjectAtPath:objectPathArray]): cache an empty
array if not acl have been returned for the specified user.
* SoObjects/Contacts/SOGoContactGCSFolder.m ([SOGoContactGCSFolder
-lookupContactsWithFilter:filtersortBy:sortKeyordering:sortOrdering]):
same as below.
([SOGoContactGCSFolder -fixupContactRecord:contactRecord]): new
method that initializes c_mail, c_screenname, c_o,
c_telephonenumber to empty strings if not found.
* SoObjects/Contacts/SOGoContactLDAPFolder.m
([SOGoContactLDAPFolder
-lookupContactsWithFilter:filtersortBy:sortKeyordering:sortOrdering]):
no longer make use of the displayName, mail, screenName, phone and
org intermediary keys.
* UI/Contacts/UIxContactsListView.m ([-currentCName]): removed
useless method.
2009-02-05 Francis Lachapelle <flachapelle@inverse.ca> 2009-02-05 Francis Lachapelle <flachapelle@inverse.ca>
* UI/SOGoUI/UIxComponent.m ([UIxComponent -responseWithStatus:): * UI/SOGoUI/UIxComponent.m ([UIxComponent -responseWithStatus:):

View File

@ -19,6 +19,7 @@
02111-1307, USA. 02111-1307, USA.
*/ */
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSDebug.h> #import <Foundation/NSDebug.h>
#import <Foundation/NSData.h> #import <Foundation/NSData.h>
#import <Foundation/NSDate.h> #import <Foundation/NSDate.h>
@ -64,6 +65,7 @@ static unsigned int vMemSizeLimit = 0;
static BOOL doCrashOnSessionCreate = NO; static BOOL doCrashOnSessionCreate = NO;
static BOOL hasCheckedTables = NO; static BOOL hasCheckedTables = NO;
static BOOL debugRequests = NO; static BOOL debugRequests = NO;
static BOOL debugLeaks = NO;
#ifdef GNUSTEP_BASE_LIBRARY #ifdef GNUSTEP_BASE_LIBRARY
static BOOL debugObjectAllocation = NO; static BOOL debugObjectAllocation = NO;
@ -91,6 +93,7 @@ static BOOL debugObjectAllocation = NO;
} }
#endif #endif
debugRequests = [ud boolForKey: @"SOGoDebugRequests"]; debugRequests = [ud boolForKey: @"SOGoDebugRequests"];
debugLeaks = [ud boolForKey: @"SOGoDebugLeaks"];
/* vMem size check - default is 200MB */ /* vMem size check - default is 200MB */
tmp = [ud objectForKey: @"SxVMemLimit"]; tmp = [ud objectForKey: @"SxVMemLimit"];
@ -394,6 +397,7 @@ static BOOL debugObjectAllocation = NO;
static NSArray *runLoopModes = nil; static NSArray *runLoopModes = nil;
WOResponse *resp; WOResponse *resp;
NSDate *startDate, *endDate; NSDate *startDate, *endDate;
NSAutoreleasePool *pool;
if (debugRequests) if (debugRequests)
{ {
@ -403,6 +407,13 @@ static BOOL debugObjectAllocation = NO;
} }
cache = [SOGoCache sharedCache]; cache = [SOGoCache sharedCache];
if (debugLeaks)
{
GSDebugAllocationActive (YES);
GSDebugAllocationList (NO);
pool = [NSAutoreleasePool new];
}
resp = [super dispatchRequest: _request]; resp = [super dispatchRequest: _request];
[SOGoCache killCache]; [SOGoCache killCache];
@ -413,6 +424,15 @@ static BOOL debugObjectAllocation = NO;
[endDate timeIntervalSinceDate: startDate]]; [endDate timeIntervalSinceDate: startDate]];
} }
if (debugLeaks)
{
[resp retain];
[pool release];
[resp autorelease];
NSLog (@"allocated classes:\n%s", GSDebugAllocationList (YES));
GSDebugAllocationActive (NO);
}
if (![self isTerminating]) if (![self isTerminating])
{ {
if (!runLoopModes) if (!runLoopModes)

View File

@ -105,7 +105,6 @@
- (void) dealloc - (void) dealloc
{ {
[parent release];
[tag release]; [tag release];
[group release]; [group release];
[attributes release]; [attributes release];
@ -115,8 +114,7 @@
- (void) setParent: (CardGroup *) aParent - (void) setParent: (CardGroup *) aParent
{ {
#warning THIS CAUSES A LEAK. We need this for the moment because of a design error. parent = aParent;
ASSIGN (parent, aParent);
} }
- (id) parent - (id) parent

View File

@ -1,4 +1,4 @@
2008-12-15 Wolfgang Sourdeau <wsourdeau@inverse.ca> 2009-02-06 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* CardElement.m ([CardElement -setParent:aParent]): no longer * CardElement.m ([CardElement -setParent:aParent]): no longer
retain the parent passed as parameter. retain the parent passed as parameter.

View File

@ -880,6 +880,8 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
@"c_uid", @"c_startdate", @"c_uid", @"c_startdate",
@"c_enddate", @"c_isallday", @"c_enddate", @"c_isallday",
@"c_iscycle", @"c_isopaque", @"c_iscycle", @"c_isopaque",
@"c_cycleinfo",
@"c_cycleenddate",
@"c_classification", @"c_classification",
@"c_component", nil]]; @"c_component", nil]];
} }

View File

@ -32,6 +32,8 @@
@interface SOGoContactGCSFolder : SOGoGCSFolder <SOGoContactFolder> @interface SOGoContactGCSFolder : SOGoGCSFolder <SOGoContactFolder>
- (void) fixupContactRecord: (NSMutableDictionary *) contactRecord;
@end @end
#endif /* __Contacts_SOGoContactGCSFolder_H__ */ #endif /* __Contacts_SOGoContactGCSFolder_H__ */

View File

@ -232,13 +232,33 @@
return qualifier; return qualifier;
} }
- (void) fixupContactRecord: (NSMutableDictionary *) contactRecord
{
NSString *data;
data = [contactRecord objectForKey: @"c_cn"];
if (![data length])
{
data = [contactRecord keysWithFormat: @"%{c_givenname} %{c_sn}"];
[contactRecord setObject: data forKey: @"c_cn"];
}
if (![contactRecord objectForKey: @"c_mail"])
[contactRecord setObject: @"" forKey: @"c_mail"];
if (![contactRecord objectForKey: @"c_screenname"])
[contactRecord setObject: @"" forKey: @"c_screenname"];
if (![contactRecord objectForKey: @"c_o"])
[contactRecord setObject: @"" forKey: @"c_o"];
if (![contactRecord objectForKey: @"c_telephonenumber"])
[contactRecord setObject: @"" forKey: @"c_telephonenumber"];
}
- (NSArray *) _flattenedRecords: (NSArray *) records - (NSArray *) _flattenedRecords: (NSArray *) records
{ {
NSMutableArray *newRecords; NSMutableArray *newRecords;
NSEnumerator *oldRecords; NSEnumerator *oldRecords;
NSDictionary *oldRecord; NSDictionary *oldRecord;
NSMutableDictionary *newRecord; NSMutableDictionary *newRecord;
NSString *data;
newRecords = [NSMutableArray arrayWithCapacity: [records count]]; newRecords = [NSMutableArray arrayWithCapacity: [records count]];
@ -246,40 +266,8 @@
oldRecord = [oldRecords nextObject]; oldRecord = [oldRecords nextObject];
while (oldRecord) while (oldRecord)
{ {
newRecord = [NSMutableDictionary new]; newRecord = [NSMutableDictionary dictionaryWithDictionary: oldRecord];
[newRecord autorelease]; [self fixupContactRecord: newRecord];
[newRecord setObject: [oldRecord objectForKey: @"c_name"]
forKey: @"c_uid"];
[newRecord setObject: [oldRecord objectForKey: @"c_name"]
forKey: @"c_name"];
data = [oldRecord objectForKey: @"c_cn"];
if (![data length])
data = [oldRecord keysWithFormat: @"%{c_givenname} %{c_sn}"];
[newRecord setObject: data
forKey: @"displayName"];
data = [oldRecord objectForKey: @"c_mail"];
if (!data)
data = @"";
[newRecord setObject: data forKey: @"mail"];
data = [oldRecord objectForKey: @"c_screenname"];
if (!data)
data = @"";
[newRecord setObject: data forKey: @"screenName"];
data = [oldRecord objectForKey: @"c_o"];
if (!data)
data = @"";
[newRecord setObject: data forKey: @"org"];
data = [oldRecord objectForKey: @"c_telephonenumber"];
if (![data length])
data = @"";
[newRecord setObject: data forKey: @"phone"];
[newRecords addObject: newRecord]; [newRecords addObject: newRecord];
oldRecord = [oldRecords nextObject]; oldRecord = [oldRecords nextObject];
} }

View File

@ -167,11 +167,12 @@
if (!obj) if (!obj)
{ {
ldifEntry = [ldapSource lookupContactEntryWithUIDorEmail: objectName]; ldifEntry = [ldapSource lookupContactEntryWithUIDorEmail: objectName];
obj = ((ldifEntry) if (ldifEntry)
? [SOGoContactLDIFEntry contactEntryWithName: objectName obj = [SOGoContactLDIFEntry contactEntryWithName: objectName
withLDIFEntry: ldifEntry withLDIFEntry: ldifEntry
inContainer: self] inContainer: self];
: [NSException exceptionWithHTTPStatus: 404]); else
obj = [NSException exceptionWithHTTPStatus: 404];
} }
return obj; return obj;
@ -212,24 +213,24 @@
data = [oldRecord objectForKey: @"c_cn"]; data = [oldRecord objectForKey: @"c_cn"];
if (!data) if (!data)
data = @""; data = @"";
[newRecord setObject: data forKey: @"displayName"]; [newRecord setObject: data forKey: @"c_cn"];
data = [oldRecord objectForKey: @"mail"]; data = [oldRecord objectForKey: @"mail"];
if (!data) if (!data)
data = @""; data = @"";
[newRecord setObject: data forKey: @"mail"]; [newRecord setObject: data forKey: @"c_mail"];
data = [oldRecord objectForKey: @"nsAIMid"]; data = [oldRecord objectForKey: @"nsAIMid"];
if (![data length]) if (![data length])
data = [oldRecord objectForKey: @"nscpaimscreenname"]; data = [oldRecord objectForKey: @"nscpaimscreenname"];
if (![data length]) if (![data length])
data = @""; data = @"";
[newRecord setObject: data forKey: @"screenName"]; [newRecord setObject: data forKey: @"c_screenname"];
data = [oldRecord objectForKey: @"o"]; data = [oldRecord objectForKey: @"o"];
if (!data) if (!data)
data = @""; data = @"";
[newRecord setObject: data forKey: @"org"]; [newRecord setObject: data forKey: @"c_o"];
data = [oldRecord objectForKey: @"telephoneNumber"]; data = [oldRecord objectForKey: @"telephoneNumber"];
if (![data length]) if (![data length])
@ -238,7 +239,7 @@
data = [oldRecord objectForKey: @"homePhone"]; data = [oldRecord objectForKey: @"homePhone"];
if (![data length]) if (![data length])
data = @""; data = @"";
[newRecord setObject: data forKey: @"phone"]; [newRecord setObject: data forKey: @"c_telephonenumber"];
contactInfo = [ud stringForKey: @"SOGoLDAPContactInfoAttribute"]; contactInfo = [ud stringForKey: @"SOGoLDAPContactInfoAttribute"];
if ([contactInfo length] > 0) { if ([contactInfo length] > 0) {

View File

@ -817,6 +817,8 @@ static NSArray *childRecordFields = nil;
if (!acls) if (!acls)
{ {
acls = [self _fetchAclsForUser: uid forObjectAtPath: objectPath]; acls = [self _fetchAclsForUser: uid forObjectAtPath: objectPath];
if (!acls)
acls = [NSArray array];
[self _cacheRoles: acls forUser: uid forObjectAtPath: objectPath]; [self _cacheRoles: acls forUser: uid forObjectAtPath: objectPath];
} }

View File

@ -60,15 +60,6 @@
return currentContact; return currentContact;
} }
- (NSString *) currentCName
{
NSString *cName;
cName = [currentContact objectForKey: @"c_name"];
return [cName stringByEscapingURL];
}
- (id <WOActionResults>) mailerContactsAction - (id <WOActionResults>) mailerContactsAction
{ {
selectorComponentClass = @"UIxContactsMailerSelection"; selectorComponentClass = @"UIxContactsMailerSelection";

View File

@ -57,7 +57,6 @@
[attendee release]; [attendee release];
[item release]; [item release];
[inCalendar release]; [inCalendar release];
[inEvent release];
[dateFormatter release]; [dateFormatter release];
[super dealloc]; [super dealloc];
} }
@ -67,7 +66,7 @@
- (void) resetPathCaches - (void) resetPathCaches
{ {
[super resetPathCaches]; [super resetPathCaches];
[inEvent release]; inEvent = nil; inEvent = nil;
[inCalendar release]; inCalendar = nil; [inCalendar release]; inCalendar = nil;
[storedEventObject release]; storedEventObject = nil; [storedEventObject release]; storedEventObject = nil;
[storedEvent release]; storedEvent = nil; [storedEvent release]; storedEvent = nil;
@ -104,7 +103,7 @@
{ {
events = [[self inCalendar] events]; events = [[self inCalendar] events];
if ([events count] > 0) if ([events count] > 0)
inEvent = [[events objectAtIndex: 0] retain]; inEvent = [events objectAtIndex: 0];
} }
return inEvent; return inEvent;

View File

@ -74,7 +74,7 @@
- (void) dealloc - (void) dealloc
{ {
[item release]; [item release];
[event release]; [[event parent] release];
[aptStartDate release]; [aptStartDate release];
[aptEndDate release]; [aptEndDate release];
[componentCalendar release]; [componentCalendar release];
@ -87,7 +87,7 @@
if (!event) if (!event)
{ {
event = (iCalEvent *) [[self clientObject] occurence]; event = (iCalEvent *) [[self clientObject] occurence];
[event retain]; [[event parent] retain];
} }
return event; return event;

View File

@ -67,7 +67,7 @@
[statusDate release]; [statusDate release];
[status release]; [status release];
[statusPercent release]; [statusPercent release];
[todo release]; [[todo parent] release];
[super dealloc]; [super dealloc];
} }
@ -77,7 +77,7 @@
if (!todo) if (!todo)
{ {
todo = (iCalToDo *) [[self clientObject] component: YES secure: YES]; todo = (iCalToDo *) [[self clientObject] component: YES secure: YES];
[todo retain]; [[todo parent] retain];
} }
return todo; return todo;

View File

@ -29,14 +29,13 @@
<tbody> <tbody>
<var:foreach list="contactInfos" item="currentContact"> <var:foreach list="contactInfos" item="currentContact">
<tr class="tableview" <tr class="tableview"
var:id="currentCName" var:id="currentContact.c_name"
var:contactname="currentContact.displayName" var:contactname="currentContact.c_cn">
var:contactid="currentContact.c_uid"> <td class="displayName"><var:string value="currentContact.c_cn" const:escapeHTML="YES" /></td>
<td class="displayName"><var:string value="currentContact.displayName" const:escapeHTML="YES" /></td> <td><var:string value="currentContact.c_mail"/></td>
<td><var:string value="currentContact.mail"/></td> <td><var:string value="currentContact.c_screenname"/></td>
<td><var:string value="currentContact.screenName"/></td> <td><var:string value="currentContact.c_o"/></td>
<td><var:string value="currentContact.org"/></td> <td><var:string value="currentContact.c_telephonenumber"/></td>
<td><var:string value="currentContact.phone"/></td>
</tr> </tr>
</var:foreach> </var:foreach>
</tbody> </tbody>

View File

@ -351,10 +351,10 @@ function moveTo(uri) {
/* contact menu entries */ /* contact menu entries */
function onContactRowDblClick(event) { function onContactRowDblClick(event) {
var contactId = this.getAttribute('contactid'); var cname = this.getAttribute('id');
openContactWindow(URLForFolderID(Contact.currentAddressBook) openContactWindow(URLForFolderID(Contact.currentAddressBook)
+ "/" + contactId + "/edit", contactId); + "/" + cname + "/edit", cname);
return false; return false;
} }
@ -364,7 +364,7 @@ function onContactSelectionChange(event) {
if (rows.length == 1) { if (rows.length == 1) {
var node = $(rows[0]); var node = $(rows[0]);
loadContact(node.getAttribute('contactid')); loadContact(node.getAttribute('id'));
} }
else if (rows.length > 1) { else if (rows.length > 1) {
$('contactView').update(); $('contactView').update();
@ -551,7 +551,7 @@ function onConfirmContactSelection(event) {
var contactsList = $("contactsList"); var contactsList = $("contactsList");
var rows = contactsList.getSelectedRows(); var rows = contactsList.getSelectedRows();
for (i = 0; i < rows.length; i++) { for (i = 0; i < rows.length; i++) {
var cid = rows[i].getAttribute("contactid"); var cid = rows[i].getAttribute("id");
var cname = '' + rows[i].getAttribute("contactname"); var cname = '' + rows[i].getAttribute("contactname");
var email = '' + rows[i].cells[1].innerHTML; var email = '' + rows[i].cells[1].innerHTML;
@ -562,10 +562,10 @@ function onConfirmContactSelection(event) {
preventDefault(event); preventDefault(event);
} }
function refreshContacts(contactId) { function refreshContacts(cname) {
openContactsFolder(Contact.currentAddressBook, true, contactId); openContactsFolder(Contact.currentAddressBook, true, cname);
delete cachedContacts[Contact.currentAddressBook + "/" + contactId]; delete cachedContacts[Contact.currentAddressBook + "/" + cname];
loadContact(contactId); loadContact(cname);
return false; return false;
} }

View File

@ -207,7 +207,7 @@ function openUserFolderSelector(callback, type) {
} }
function openContactWindow(url, wId) { function openContactWindow(url, wId) {
if (typeof wId == "undefined") if (!wId)
wId = "_blank"; wId = "_blank";
else { else {
wId = sanitizeWindowName(wId); wId = sanitizeWindowName(wId);
@ -223,7 +223,7 @@ function openContactWindow(url, wId) {
function openMailComposeWindow(url, wId) { function openMailComposeWindow(url, wId) {
var parentWindow = this; var parentWindow = this;
if (typeof wId == "undefined") if (!wId)
wId = "_blank"; wId = "_blank";
else { else {
wId = sanitizeWindowName(wId); wId = sanitizeWindowName(wId);