+2007-12-07 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+
+ * Main/SOGo.m ([SOGo -run]): the table creation script now have a
+ @{tableName} substitution variable to be substitued with the real
+ table name obtained from the configuration variables.
+
+2007-12-07 Ludovic Marcotte <ludovic@inverse.ca>
+
+ * UI/MailPartViewers/UIxMailRenderingContext.m
+ We treat multipart/appledouble like multipart/mixed
+ for now. That allows the user to save both parts.
+
+ * Corrected typos in Localizable.string files.
+
2007-12-06 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/Common/UIxAclEditor.m ([-currentUserIsOwner]): replaced
[super dealloc];
}
-- (void) _checkTableWithCM: (GCSChannelManager *) cm
- tableURL: (NSString *) url
- andType: (NSString *) tableType
+- (NSString *) _sqlScriptFromTableFile: (NSString *) fileName
+ withTableName: (NSString *) tableName
{
- NSString *tableName, *descFile, *tableFile, *fileSuffix;
- EOAdaptorChannel *tc;
+ NSString *script;
+
+
+ return script;
+}
+
+- (NSString *) _sqlScriptForTable: (NSString *) tableName
+ withType: (NSString *) tableType
+ andFileSuffix: (NSString *) fileSuffix
+{
+ NSString *tableFile, *descFile;
NGBundleManager *bm;
NSBundle *bundle;
unsigned int length;
- NSURL *channelURL;
bm = [NGBundleManager defaultBundleManager];
+ bundle = [bm bundleWithName: @"MainUI" type: @"SOGo"];
+ length = [tableType length] - 3;
+ tableFile = [tableType substringToIndex: length];
+ descFile
+ = [bundle pathForResource: [NSString stringWithFormat: @"%@-%@",
+ tableFile, fileSuffix]
+ ofType: @"sql"];
+ if (!descFile)
+ descFile = [bundle pathForResource: tableFile ofType: @"sql"];
+
+ return [[NSString stringWithContentsOfFile: descFile]
+ stringByReplacingString: @"@{tableName}"
+ withString: tableName];
+}
+
+- (void) _checkTableWithCM: (GCSChannelManager *) cm
+ tableURL: (NSString *) url
+ andType: (NSString *) tableType
+{
+ NSString *tableName, *fileSuffix, *tableScript;
+ EOAdaptorChannel *tc;
+ NSURL *channelURL;
+
channelURL = [NSURL URLWithString: url];
fileSuffix = [channelURL scheme];
tc = [cm acquireOpenChannelForURL: channelURL];
tableName = [url lastPathComponent];
if ([tc evaluateExpressionX:
- [NSString stringWithFormat: @"SELECT count(*) FROM %@", tableName]])
+ [NSString stringWithFormat: @"SELECT count(*) FROM %@",
+ tableName]])
{
- bundle = [bm bundleWithName: @"MainUI" type: @"SOGo"];
- length = [tableType length] - 3;
- tableFile = [tableType substringToIndex: length];
- descFile
- = [bundle pathForResource: [NSString stringWithFormat: @"%@-%@",
- tableFile, fileSuffix]
- ofType: @"sql"];
- if (!descFile)
- descFile = [bundle pathForResource: tableFile ofType: @"sql"];
- if (![tc evaluateExpressionX:
- [NSString stringWithContentsOfFile: descFile]])
+ tableScript = [self _sqlScriptForTable: tableName
+ withType: tableType
+ andFileSuffix: fileSuffix];
+ if (![tc evaluateExpressionX: tableScript])
[self logWithFormat: @"table '%@' successfully created!", tableName];
}
else
"Unit" = "Unit";
"delete" = "delete";
"edit" = "edit";
-"invalidemailwarn" = "invalidemailwarn";
+"invalidemailwarn" = "The specified email is invalid";
"new" = "new";
"Preferred Phone" = "Preferred Phone";
-/* this file is in UTF-8 format! */
+e/* this file is in UTF-8 format! */
"Contact" = "Contact";
"Address" = "Adresses";
"Unit" = "Département";
"delete" = "Effacer";
"edit" = "Éditer";
-"invalidemailwarn" = "Champ de l'email invalide, continuer quand même ?";
+"invalidemailwarn" = "Le champ de l'adresse électronique est invalide";
"new" = "Nouveau";
"Preferred Phone" = "Numéro préféré";
if ([mt isEqualToString:@"multipart"])
{
- if ([st isEqualToString:@"mixed"] || [st isEqualToString:@"related"])
+ if ([st isEqualToString:@"mixed"] || [st isEqualToString:@"related"] || [st isEqualToString: @"appledouble"])
return [self mixedViewer];
else if ([st isEqualToString:@"signed"])
return [self signedViewer];
-- (C) 2007 Inverse groupe conseil
--
-CREATE TABLE SOGo_user_profile (
+CREATE TABLE @{tableName} (
c_uid VARCHAR(255) NOT NULL PRIMARY KEY,
c_defaults CLOB,
c_settings CLOB
-- (C) 2006-2007 Inverse groupe conseil
--
-CREATE TABLE SOGo_user_profile (
+CREATE TABLE @{tableName} (
c_uid VARCHAR(255) NOT NULL PRIMARY KEY,
c_defaults TEXT,
c_settings TEXT
-- (C) 2007 Inverse groupe conseil
--
-CREATE TABLE SOGo_folder_info (
+CREATE TABLE @{tableName} (
c_folder_id INTEGER PRIMARY KEY,
c_path VARCHAR(255) NOT NULL, -- the full path to the folder
c_path1 VARCHAR(255) NOT NULL, -- parts (for fast queries)
c_folder_type VARCHAR(255) NOT NULL -- the folder type ...
);
-CREATE SEQUENCE SOGo_folder_info_seq;
-CREATE OR REPLACE TRIGGER SOGo_folder_info_autonumber
-BEFORE INSERT ON SOGo_folder_info FOR EACH ROW
+CREATE SEQUENCE @{tableName}_seq;
+CREATE OR REPLACE TRIGGER @{tableName}_autonumber
+BEFORE INSERT ON @{tableName} FOR EACH ROW
BEGIN
IF :new.c_folder_id IS NULL THEN
- SELECT SOGO_folder_info_seq.nextval INTO :new.c_folder_id FROM DUAL;
+ SELECT @{tableName}_seq.nextval INTO :new.c_folder_id FROM DUAL;
END IF;
END;
/
-- (C) 2006-2007 Inverse groupe conseil
--
-CREATE TABLE SOGo_folder_info (
+CREATE TABLE @{tableName} (
c_folder_id SERIAL,
c_path VARCHAR(255) NOT NULL, -- the full path to the folder
c_path1 VARCHAR(255) NOT NULL, -- parts (for fast queries)
SOGoCalendarComponent *co;
SOGoUser *currentUser;
BOOL hasOrganizer;
+ SoSecurityManager *sm;
co = [self clientObject];
owner = [co ownerInContext: context];
hasOrganizer = ([[organizer value: 0] length] > 0);
+ sm = [SoSecurityManager sharedSecurityManager];
+
return ([co isNew]
- || ([owner isEqualToString: [currentUser login]]
+ || (([owner isEqualToString: [currentUser login]]
+ || ![sm validatePermission: SOGoCalendarPerm_ModifyComponent
+ onObject: co
+ inContext: context])
&& (!hasOrganizer || [component userIsOrganizer: currentUser])));
}
{
NSString *organizerEmail;
NSString *owner, *login;
+ BOOL isOwner, hasOrganizer, hasAttendees;
+ owner = [[self clientObject] ownerInContext: context];
+ login = [[context activeUser] login];
+ isOwner = [owner isEqualToString: login];
+ hasAttendees = ([[component attendees] count] > 0);
organizerEmail = [[component organizer] email];
- if ([organizerEmail length] == 0)
+ hasOrganizer = ([organizerEmail length] > 0);
+
+ if (hasOrganizer)
{
- owner = [[self clientObject] ownerInContext: context];
- login = [[context activeUser] login];
- if (![owner isEqualToString: login]
- || [[component attendees] count] > 0)
+ if (isOwner && !hasAttendees)
{
ASSIGN (organizer, [iCalPerson elementWithTag: @"organizer"]);
- [organizer setCn: [organizerIdentity objectForKey: @"fullName"]];
- [organizer setEmail: [organizerIdentity objectForKey: @"email"]];
[component setOrganizer: organizer];
}
}
else
{
- if ([[component attendees] count] == 0)
+ if (!isOwner || hasAttendees)
{
ASSIGN (organizer, [iCalPerson elementWithTag: @"organizer"]);
+ [organizer setCn: [organizerIdentity objectForKey: @"fullName"]];
+ [organizer setEmail: [organizerIdentity objectForKey: @"email"]];
[component setOrganizer: organizer];
}
}
if ([component userIsOrganizer: currentUser])
toolbarFilename = @"SOGoComponentClose.toolbar";
else
- {
+ {
if ([component userIsOrganizer: ownerUser]
&& ![sm validatePermission: SOGoCalendarPerm_ModifyComponent
onObject: clientObject