+2007-08-24 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+
+ * SoObjects/Appointments/SOGoAppointmentFolder.m
+ ([SOGoAppointmentFolder -lookupCalendarFolderForUID:uid]): add
+ "personal" to the ocs path of the appointment folder.
+
+ * UI/MailPartViewers/UIxMailPartViewer.m ([UIxMailPartViewer
+ -flatContentAsString]): use latin1 when the encoding is not
+ specified, and to reencode data chunk which were not correctly
+ decoded with the original charset.
+
+ * SoObjects/Appointments/SOGoAppointmentFolder.m ([SOGoAppointmentFolder -aclUsersForObjectAtPath:objectPathArray])
+ ([SOGoAppointmentFolder -aclsForUser:uidforObjectAtPath:objectPathArray])
+ ([SOGoAppointmentFolder -setRoles:rolesforUser:uidforObjectAtPath:objectPathArray])
+ ([SOGoAppointmentFolder
+ -removeAclsForUsers:usersforObjectAtPath:objectPathArray]):
+ override those methods to use the "personal" additional directory.
+
+ * SoObjects/SOGo/SOGoUserFolder.m ([-ocsPrivateCalendarPath]):
+ append "/personal" to the calendar path to simulate a single
+ calendar in a choice of many.
+
+ * SoObjects/Mailer/SOGoMailFolder.m ([SOGoMailFolder
+ -lookupName:_keyinContext:acquire:_acquire]): moved the lookup
+ methods back here. Moved the folder existence check here, and do
+ it on self only when the lookup happens for a non-folder object.
+ This permits to accept entries for folders with parents who
+ don't really exist.
+
+2007-08-23 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+
+ * UI/Scheduler/UIxTaskEditor.m ([UIxTaskEditor
+ -shouldTakeValuesFromRequest:requestinContext:context]): same as
+ below.
+
+ * UI/Scheduler/UIxAppointmentEditor.m ([UIxAppointmentEditor
+ -shouldTakeValuesFromRequest:requestinContext:context]):
+ redesigned method since any method called can be received from a
+ POST or a GET. Instead we check the method call itself and we
+ accept only if it has the "save" prefix.
+
+ * SoObjects/Appointments/SOGoAptMailNotification.m
+ ([SOGoAptMailNotification -getSubject]): returns the subject an a
+ quoted-printable encoded string, if needed.
+
+ * SoObjects/Mailer/SOGoDraftObject.m ([NSString
+ -asQPSubjectString:encoding]): moved method into
+ NSString+Utilities.m.
+
2007-08-22 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/PreferencesUI/UIxPreferences.m ([UIxPreferences
--- /dev/null
+#!/bin/bash
+
+# this script only work with PostgreSQL
+
+defaultusername=$USER
+defaulthostname=localhost
+defaultdatabase=$USER
+indextable=sogo_folder_info
+
+read -p "Username ($defaultusername): " username
+read -p "Hostname ($defaulthostname): " hostname
+read -p "Database ($defaultdatabase): " database
+
+if [ -z "$username" ]
+then
+ username=$defaultusername
+fi
+if [ -z "$hostname" ]
+then
+ hostname=$defaulthostname
+fi
+if [ -z "$database" ]
+then
+ database=$defaultdatabase
+fi
+
+echo ""
+echo "You will now be requested your password twice..."
+echo "After that, a list of SQL operations will scroll."
+echo ""
+
+sqlscript=""
+
+function addField() {
+ oldIFS="$IFS"
+ IFS=" "
+ part="`echo -e \"ALTER TABLE $table ADD COLUMN c_deleted INTEGER;\\n\"`";
+ sqlscript="$sqlscript$part"
+ IFS="$oldIFS"
+}
+
+tables=`psql -t -U $username -h $hostname $database -c "select split_part(c_location, '/', 5) from $indextable where c_folder_type != 'Container';"`
+
+for table in $tables;
+do
+ addField
+done
+
+sqlscript="$sqlscript;update $indextable set c_path4 = 'personal', c_path = '/Users/' || c_path2 || '/Calendar/personal' where c_path3 = 'Calendar' and c_path4 is null;"
+
+function updateCalendarLocation() {
+ oldIFS="$IFS"
+ IFS=" "
+ user="`echo $table | cut -f 1 -d :`"
+ tablename="`echo $table | cut -f 2 -d :`"
+ newstart="/$user/Calendar/personal";
+ part="update $tablename set c_object = replace(c_object, '/$user/Calendar', '$newstart') where c_object not like '$newstart%';";
+ sqlscript="$sqlscript$part"
+ IFS="$oldIFS"
+}
+
+tables=`psql -t -U $username -h $hostname $database -c "select c_path2 || ':' || split_part(c_acl_location, '/', 5) from $indextable where c_folder_type = 'Appointment';"`
+for table in $tables;
+do
+ updateCalendarLocation
+done
+
+echo "$sqlscript" | psql -q -e -U $username -h $hostname $database > /dev/null
+
+echo "Please ignore the errors above. They just mean that the migration was already done for the elements in question.";
\ No newline at end of file
Appointments_COMPONENTS += \
SOGoAptMailEnglishInvitation.wo \
- SOGoAptMailFrenchInvitation.wo \
SOGoAptMailEnglishUpdate.wo \
- SOGoAptMailFrenchUpdate.wo \
SOGoAptMailEnglishRemoval.wo \
- SOGoAptMailFrenchRemoval.wo \
SOGoAptMailEnglishDeletion.wo \
+ SOGoAptMailFrenchInvitation.wo \
+ SOGoAptMailFrenchUpdate.wo \
+ SOGoAptMailFrenchRemoval.wo \
SOGoAptMailFrenchDeletion.wo \
+ SOGoAptMailGermanInvitation.wo \
+ SOGoAptMailGermanUpdate.wo \
+ SOGoAptMailGermanRemoval.wo \
+ SOGoAptMailGermanDeletion.wo \
-include GNUmakefile.preamble
include $(GNUSTEP_MAKEFILES)/wobundle.make
calendarFolder = [SOGoAppointmentFolder objectWithName: @"Calendar"
inContainer: userFolder];
[calendarFolder
- setOCSPath: [NSString stringWithFormat: @"/Users/%@/Calendar", uid]];
+ setOCSPath: [NSString stringWithFormat: @"/Users/%@/Calendar/personal", uid]];
[calendarFolder setOwner: uid];
return calendarFolder;
return @"IPF.Appointment";
}
+/* hack until we permit more than 1 cal per user */
+- (NSArray *) _fixedPath: (NSArray *) objectPath
+{
+ NSMutableArray *newPath;
+
+ newPath = [NSMutableArray arrayWithArray: objectPath];
+ if ([newPath count] > 2)
+ {
+ if (![[newPath objectAtIndex: 2] isEqualToString: @"personal"])
+ [newPath insertObject: @"personal" atIndex: 2];
+ }
+ else
+ [newPath addObject: @"personal"];
+
+ return newPath;
+}
+
+- (NSArray *) aclUsersForObjectAtPath: (NSArray *) objectPathArray
+{
+ return [super aclUsersForObjectAtPath: [self _fixedPath: objectPathArray]];
+}
+
+- (NSArray *) aclsForUser: (NSString *) uid
+ forObjectAtPath: (NSArray *) objectPathArray
+{
+ return [super aclsForUser: uid
+ forObjectAtPath: [self _fixedPath: objectPathArray]];
+}
+
+- (void) setRoles: (NSArray *) roles
+ forUser: (NSString *) uid
+ forObjectAtPath: (NSArray *) objectPathArray
+{
+ [super setRoles: roles
+ forUser: uid
+ forObjectAtPath: [self _fixedPath: objectPathArray]];
+}
+
+- (void) removeAclsForUsers: (NSArray *) users
+ forObjectAtPath: (NSArray *) objectPathArray
+{
+ [super removeAclsForUsers: users
+ forObjectAtPath: [self _fixedPath: objectPathArray]];
+}
+
@end /* SOGoAppointmentFolder */
/* store in all the other folders */
-- (NSException *)saveContentString:(NSString *)_iCal inUIDs:(NSArray *)_uids {
+- (NSException *) saveContentString: (NSString *) _iCal
+ inUIDs: (NSArray *) _uids
+{
NSEnumerator *e;
id folder;
NSException *allErrors = nil;
-<#IsSubject>Le rendez-vous du <#AptStartDate /> à <#AptStartTime /> a été supprimé</#IsSubject>
+<#IsSubject>Le rendez-vous du <#AptStartDate /> à <#AptStartTime /> a été supprimé</#IsSubject>
<#IsBody>
-Le rendez-vous du <#AptStartDate /> à <#AptStartTime /> a été supprimé par <#Organizer />.
+Le rendez-vous du <#AptStartDate /> à <#AptStartTime /> a été supprimé par <#Organizer />.
</#IsBody>
-<#IsSubject>Rendez-vous le <#AptStartDate /> à <#AptStartTime /></#IsSubject>
+<#IsSubject>Rendez-vous le <#AptStartDate /> à <#AptStartTime /></#IsSubject>
<#IsBody>
-Vous êtes invité par <#Organizer /> à une réunion.
+Vous êtes invité par <#Organizer /> à une réunion.
<#HasHomePageURL>
-Veuillez donner votre réponse à l'adresse <#HomePageURL />.
+Veuillez donner votre réponse à l'adresse <#HomePageURL />.
</#HasHomePageURL>
</#IsBody>
-<#IsSubject>Supprimé de la réunion du <#AptStartDate /> à <#AptStartTime /></#IsSubject>
+<#IsSubject>Supprimé de la réunion du <#AptStartDate /> à <#AptStartTime /></#IsSubject>
<#IsBody>
-Vous ne faites plus parti de la liste des invités de la réunion du <#AptStartDate /> à <#AptStartTime /> organisée par <#Organizer />.
+Vous ne faites plus parti de la liste des invités de la réunion du <#AptStartDate /> à <#AptStartTime /> organisée par <#Organizer />.
</#IsBody>
-<#IsSubject>Rendez-vous du <#OldAptStartDate /> à <#OldAptStartTime /> modifié</#IsSubject>
+<#IsSubject>Rendez-vous du <#OldAptStartDate /> à <#OldAptStartTime /> modifié</#IsSubject>
<#IsBody>
-La réunion qui devait se dérouler le <#OldAptStartDate /> à <#OldAptStartTime /> est maintenant prévue le <#NewAptStartDate /> à <#NewAptStartTime />.
-Vous êtes invité à accepter ou refuser de participer à la réunion pour cette nouvelle date à l'adresse <#HomePageURL />.
+La réunion qui devait se dérouler le <#OldAptStartDate /> à <#OldAptStartTime /> est maintenant prévue le <#NewAptStartDate /> à <#NewAptStartTime />.
+Vous êtes invité à accepter ou refuser de participer à la réunion pour cette nouvelle date à l'adresse <#HomePageURL />.
</#IsBody>
-<#IsSubject>Der Termin am <#AptStartDate /> um <#AptStartTime /> wurde gelöscht.</#IsSubject>
+<#IsSubject>Der Termin am <#AptStartDate /> um <#AptStartTime /> wurde gelöscht.</#IsSubject>
<#IsBody>
-Der Termin am <#AptStartDate /> um <#AptStartTime /> wurde von <#Organizer /> gelöscht.
+Der Termin am <#AptStartDate /> um <#AptStartTime /> wurde von <#Organizer /> gelöscht.
</#IsBody>
<#IsSubject>Termin am <#AptStartDate /> um <#AptStartTime /></#IsSubject>
<#IsBody>
-<#Organizer /> lädt Sie zu einem Termin am <#AptStartDate /> um <#AptStartTime /> ein.
+<#Organizer /> lädt Sie zu einem Termin am <#AptStartDate /> um <#AptStartTime /> ein.
<#HasHomePageURL>
-Bitte benutzen Sie folgende URL, um anzugeben, ob Sie an dem Termin teilnehmen können: <#HomePageURL />.
+Bitte benutzen Sie folgende URL, um anzugeben, ob Sie an dem Termin teilnehmen können: <#HomePageURL />.
</#HasHomePageURL>
</#IsBody>
-<#IsSubject>Von dem Termin am <#AptStartDate /> um <#AptStartTime /> gelöscht</#IsSubject>
+<#IsSubject>Von dem Termin am <#AptStartDate /> um <#AptStartTime /> gelöscht</#IsSubject>
<#IsBody>
Sie sind nicht mehr eingeladen zu dem Termin am <#AptStartDate /> um <#AptStartTime /> organisiert von <#Organizer />.
</#IsBody>
-<#IsSubject>Veränderung des Termins am <#OldAptStartDate /> um <#OldAptStartTime /></#IsSubject>
+<#IsSubject>Veränderung des Termins am <#OldAptStartDate /> um <#OldAptStartTime /></#IsSubject>
<#IsBody>
-Der Termin, der ursprünglich am <#OldAptStartDate /> um <#OldAptStartTime /> stattfinden sollte, ist jetzt für den <#NewAptStartDate /> um <#NewAptStartTime /> geplant.
-Bitte geben Sie an folgender URL an, ob Sie an diesem Termin zum neuen Datum teilnehmen können: <#HomePageURL />.
+Der Termin, der ursprünglich am <#OldAptStartDate /> um <#OldAptStartTime /> stattfinden sollte, ist jetzt für den <#NewAptStartDate /> um <#NewAptStartTime /> geplant.
+Bitte geben Sie an folgender URL an, ob Sie an diesem Termin zum neuen Datum teilnehmen können: <#HomePageURL />.
</#IsBody>
- (id) newApt;
- (void) setNewApt: (iCalEntityObject *) _newApt;
-- (NSString *)homePageURL;
-- (void)setHomePageURL: (NSString *)_homePageURL;
+- (NSString *) homePageURL;
+- (void) setHomePageURL: (NSString *) _homePageURL;
-- (NSTimeZone *)viewTZ;
-- (void)setViewTZ:(NSTimeZone *)_viewTZ;
+- (NSTimeZone *) viewTZ;
+- (void) setViewTZ: (NSTimeZone *) _viewTZ;
/* Helpers */
-- (NSCalendarDate *)oldStartDate;
-- (NSCalendarDate *)newStartDate;
+- (NSCalendarDate *) oldStartDate;
+- (NSCalendarDate *) newStartDate;
/* Content Generation */
-- (NSString *)getSubject;
-- (NSString *)getBody;
+- (NSString *) getSubject;
+- (NSString *) getBody;
@end
#import <NGExtensions/NSObject+Logs.h>
#import <NGCards/iCalEntityObject.h>
+#import <SoObjects/SOGo/NSString+Utilities.h>
+
#import "SOGoAptMailNotification.h"
@interface SOGoAptMailNotification (PrivateAPI)
[self name]];
subject = @"ERROR: missing subject!";
}
- return subject;
+
+ return [subject asQPSubjectString: @"utf-8"];
}
- (NSString *)getBody {
return nil;
}
-// - (NSString *) roleOfUser: (NSString *) uid
-// {
-// NSArray *roles, *traversalPath;
-// NSString *objectName, *role;
-
-// role = nil;
-// traversalPath = [context objectForKey: @"SoRequestTraversalPath"];
-// if ([traversalPath count] > 2)
-// {
-// objectName = [traversalPath objectAtIndex: 2];
-// roles = [[context activeUser]
-// rolesForObject: [self lookupName: objectName
-// inContext: context
-// acquire: NO]
-// inContext: context];
-// if ([roles containsObject: SOGoRole_Assistant]
-// || [roles containsObject: SOGoRole_Delegate])
-// role = SOGoRole_Assistant;
-// }
-
-// return role;
-// }
-
- (BOOL) davIsCollection
{
return YES;
#import <SoObjects/SOGo/NSArray+Utilities.h>
#import <SoObjects/SOGo/NSCalendarDate+SOGo.h>
+#import <SoObjects/SOGo/NSString+Utilities.h>
#import <SoObjects/SOGo/SOGoMailer.h>
#import <SoObjects/SOGo/SOGoUser.h>
#import "SOGoMailAccount.h"
static NSString *headerKeys[] = {@"subject", @"to", @"cc", @"bcc",
@"from", @"replyTo", nil};
-@interface NSString (NGMimeHelpers)
-
-- (NSString *) asQPSubjectString: (NSString *) encoding;
-
-@end
-
-@implementation NSString (NGMimeHelpers)
-
-- (NSString *) asQPSubjectString: (NSString *) encoding;
-{
- NSString *qpString, *subjectString;
- NSData *subjectData, *destSubjectData;
-
- subjectData = [self dataUsingEncoding: NSUTF8StringEncoding];
- destSubjectData = [subjectData dataByEncodingQuotedPrintable];
-
- qpString = [[NSString alloc] initWithData: destSubjectData
- encoding: NSASCIIStringEncoding];
- [qpString autorelease];
- if ([qpString length] > [self length])
- subjectString = [NSString stringWithFormat: @"=?%@?Q?%@?=",
- encoding, qpString];
- else
- subjectString = self;
-
- return subjectString;
-}
-
-@end
-
@implementation SOGoDraftObject
static NGMimeType *TextPlainType = nil;
/* name lookup */
-- (id) lookupImap4Folder: (NSString *) _key
- inContext: (id) _ctx
-{
- // TODO: we might want to check for existence prior controller creation
- NSURL *sf;
- SOGoMailFolder *newFolder;
-
- /* check whether URL exists */
-
- sf = [self imap4URL];
- sf = [NSURL URLWithString: [_key substringFromIndex: 6]
- relativeToURL: sf];
-
-// - sf = [NSURL URLWithString:[[sf path] stringByAppendingPathComponent:_key]
-// - relativeToURL:sf];
-
- if ([[self imap4Connection] doesMailboxExistAtURL: sf])
- newFolder = [SOGoMailFolder objectWithName: _key inContainer: self];
- else
- newFolder = nil;
- /*
- We may not return 404, confuses path traversal - but we still do in the
- calling method. Probably the traversal process should be fixed to
- support 404 exceptions (as stop traversal _and_ acquisition).
- */
-
- return newFolder;
-}
-
-- (id) lookupImap4Message: (NSString *) _key
- inContext: (id) _ctx
-{
- // TODO: we might want to check for existence prior controller creation
- return [SOGoMailObject objectWithName: _key inContainer: self];
-}
-
- (id) lookupName: (NSString *) _key
inContext: (id)_ctx
acquire: (BOOL) _acquire
id obj;
if ([_key hasPrefix: @"folder"])
- obj = [self lookupImap4Folder: _key inContext: _ctx];
+ obj = [SOGoMailFolder objectWithName: _key inContainer: self];
else
{
- if (isdigit ([_key characterAtIndex: 0]))
- obj = [self lookupImap4Message: _key inContext: _ctx];
+ if ([[self imap4Connection] doesMailboxExistAtURL: [self imap4URL]])
+ {
+ if (isdigit ([_key characterAtIndex: 0]))
+ obj = [SOGoMailObject objectWithName: _key inContainer: self];
+ else
+ obj = [super lookupName: _key inContext: _ctx acquire: NO];
+ }
else
- obj = [super lookupName: _key inContext: _ctx acquire: NO];
+ obj = nil;
}
if (!obj && _acquire)
/* bare email addresses */
- (NSString *) pureEMailAddress;
+- (NSString *) asQPSubjectString: (NSString *) encoding;
+
#ifndef GNUSTEP_BASE_LIBRARY
- (BOOL) boolValue;
#endif
return pureAddress;
}
+- (NSString *) asQPSubjectString: (NSString *) encoding
+{
+ NSString *qpString, *subjectString;
+ NSData *subjectData, *destSubjectData;
+
+ subjectData = [self dataUsingEncoding: NSUTF8StringEncoding];
+ destSubjectData = [subjectData dataByEncodingQuotedPrintable];
+
+ qpString = [[NSString alloc] initWithData: destSubjectData
+ encoding: NSASCIIStringEncoding];
+ [qpString autorelease];
+ if ([qpString length] > [self length])
+ subjectString = [NSString stringWithFormat: @"=?%@?Q?%@?=",
+ encoding, qpString];
+ else
+ subjectString = self;
+
+ return subjectString;
+}
+
#if LIB_FOUNDATION_LIBRARY
- (BOOL) boolValue
{
#import <GDLContentStore/GCSFolderType.h>
#import <SaxObjC/XMLNamespaces.h>
+#import "NSArray+Utilities.h"
#import "NSString+Utilities.h"
#import "SOGoPermissions.h"
}
if ([records isKindOfClass: [NSException class]])
return records;
- return [records valueForKey: @"c_name"];
+ return [records objectsForKey: @"c_name"];
}
- (BOOL) nameExistsInFolder: (NSString *) objectName
- (NSString *) ocsPrivateCalendarPath
{
- return [[self ocsUserPath] stringByAppendingString:@"/Calendar"];
+ return [[self ocsUserPath] stringByAppendingString:@"/Calendar/personal"];
}
- (NSString *) ocsPrivateContactsPath
--- /dev/null
+/* this file is in UTF-8 format! */
+
+"Contact" = "Kontakt";
+"Address" = "Adresse";
+"Other" = "Sonstiges";
+
+"Name" = "Name";
+"Internet" = "Internet";
+"Phones" = "Telefon";
+"Home" = "Privat";
+"Work" = "Dienstlich";
+
+"Address Books" = "Adressbücher";
+"Addresses" = "Adresses";
+"Update" = "Speichern";
+"Cancel" = "Abbrechen";
+"Common" = "Name";
+"Contact editor" = "Éditer le contact";
+"Contact viewer" = "Visualiser le contact";
+"Email" = "E-Mail";
+"Screen Name" = "Messenger-Name";
+"Extended" = "Informations complémentaires";
+"Fax" = "Fax";
+"Firstname" = "Vorname";
+"HomePhone" = "Privat";
+"Lastname" = "Name";
+"Location" = "Lieux";
+"MobilePhone" = "Mobil";
+"OfficePhone" = "Dienstlich";
+"Organization" = "Organisation";
+"Work Phone" = "Dienstlich";
+"Phone" = "Telefon";
+"Postal" = "Professionnelle";
+"Save" = "Speichern";
+"URL" = "Webseite";
+"Unit" = "Abteilung";
+"delete" = "Löschen";
+"edit" = "Éditer";
+"invalidemailwarn" = "Champ de l'email invalide, continuer quand même ?";
+"new" = "Neu";
+
+"htmlMailFormat_UNKNOWN" = "Unbekannt";
+"htmlMailFormat_FALSE" = "Reintext";
+"htmlMailFormat_TRUE" = "HTML";
+
+"Name or Email" = "Name oder E-Mail";
+"Personal Addressbook" = "Adresses personnelles";
+"Search in Addressbook" = "Carnet d'adresses...";
+
+"New Card" = "Neue Karte";
+"New List" = "Neue Liste";
+"Modify" = "Eigenschaften";
+"Sharing..." = "Benutzerrechte...";
+"Write" = "Verfassen";
+"Delete" = "Löschen";
+"Instant Message" = "Messenger";
+"Add..." = "Hinzufügen...";
+"Remove" = "Löschen";
+
+"Preferred" = "Préféré";
+"Card for %@" = "%@";
+"Display:" = "Anzeigename:";
+"Display Name:" = "Anzeigename:";
+"Email:" = "E-Mail:";
+"Additional Email:" = "Zusätzliche E-Mail:";
+
+"Phone Number:" = "Telefon:";
+"Prefers to receive messages formatted as:" = "Bevorzugt folgendes Nachrichten-Format:";
+"Screen Name:" = "Messenger-Name:";
+
+"First:" = "Vorname:";
+"Last:" = "Name:";
+"Nickname:" = "Spitzname:";
+
+"Telephone" = "Telefon";
+"Work:" = "Dienstlich:";
+"Home:" = "Privat:";
+"Fax:" = "Fax:";
+"Mobile:" = "Mobil:";
+"Pager:" = "Pager:";
+
+"Title:" = "Titel:";
+"Department:" = "Abteilung:";
+"Organization:" = "Organisation:";
+"Address:" = "Adresse:";
+"City:" = "Stadt:";
+"State_Province:" = "Bundesland:";
+"ZIP_Postal Code:" = "PLZ:";
+"Country:" = "Land:";
+"Web Page:" = "Webseite:";
+
+"Other Infos" = "Andere";
+
+"Note:" = "Notizen:";
+"Timezone:" = "Zeitzone:";
+"Birthday:" = "Geburtsdatum:";
+"Freebusy URL:" = "Free/Busy URL:";
+
+"Add as..." = "Ajouter...";
+"Recipient" = "Destinataire";
+"Carbon Copy" = "Copie carbone";
+"Blind Carbon Copy" = "C. carbone cachée";
+
+"New Addressbook..." = "Neues Adressbuch...";
+"Subscribe to an Addressbook..." = "Abonnieren...";
+"Remove the selected Addressbook" = "Adressbuch löschen";
+
+"Name of the Address Book" = "Adressbuch-Name";
+"Are you sure you want to delete the selected address book?"
+= "Voulez-vous vraiment supprimer le carnet d'adresses sélectionné ?";
+
+"You cannot subscribe to a folder that you own!"
+= "Vous ne pouvez pas vous inscrire à un dossier qui vous appartient!";
+"Unable to subscribe to that folder!"
+= "Impossible de vous inscrire à ce dossier!";
+
+"Default Roles" = "Standard-Rollen";
+"User rights for:" = "Benutzerrechte für:";
+
+"This person can add cards to this addressbook."
+= "Diese Person kann neue Karten zu diesem Adressbuch hinzufügen.";
+"This person can edit the cards of this addressbook."
+= "Diese Person kann in diesem Adressbuch bestehende Karten verändern.";
+"This person can list the content of this addressbook."
+= "Diese Person kann die Liste der Karten dieses Adressbuches anzeigen.";
+"This person can read the cards of this addressbook."
+= "Diese Person kann Karten dieses Adressbuches anzeigen.";
+"This person can erase cards from this addressbook."
+= "Diese Person kann Karten aus diesem Adressbuch löschen";
return 0;
}
-- (NSString *)flatContentAsString {
+- (NSString *) flatContentAsString
+{
/* Note: we even have the line count in the body-info! */
NSString *charset;
NSString *s;
{
charset = [[bodyInfo objectForKey:@"parameterList"]
objectForKey: @"charset"];
-
- // TODO: properly decode charset, might need to handle encoding?
-
- if ([charset length] > 0)
- s = [NSString stringWithData: content
- usingEncodingNamed: [charset lowercaseString]];
- else
+ charset = [charset lowercaseString];
+ if (![charset length]
+ || [charset isEqualToString: @"us-ascii"])
{
s = [[NSString alloc] initWithData: content
- encoding: NSUTF8StringEncoding];
+ encoding: NSISOLatin1StringEncoding];
[s autorelease];
}
+ else
+ {
+ s = [NSString stringWithData: content
+ usingEncodingNamed: charset];
+ if (![s length])
+ {
+ /* latin 1 is used as a 8bit fallback charset... but does this
+ encoding accept any byte from 0 to 255? */
+ s = [[NSString alloc] initWithData: content
+ encoding: NSISOLatin1StringEncoding];
+ [s autorelease];
+ }
+ }
if (!s)
{
- (NSString *) pathToAttachmentObject
{
/* this points to the SoObject representing the part, no modifications */
- NSString *url, *n, *pext;
+ NSString *url, *n;
/* path to mail controller object */
- (BOOL) shouldTakeValuesFromRequest: (WORequest *) request
inContext: (WOContext*) context
{
+ NSString *actionName;
+
+ actionName = [[request requestHandlerPath] lastPathComponent];
+
return ([[self clientObject] isKindOfClass: [SOGoAppointmentObject class]]
- && [[request method] isEqualToString: @"POST"]);
+ && [actionName hasPrefix: @"save"]);
}
- (void) takeValuesFromRequest: (WORequest *) _rq
- (BOOL) shouldTakeValuesFromRequest: (WORequest *) request
inContext: (WOContext*) context
{
+ NSString *actionName;
+
+ actionName = [[request requestHandlerPath] lastPathComponent];
+
return ([[self clientObject] isKindOfClass: [SOGoTaskObject class]]
- && [[request method] isEqualToString: @"POST"]);
+ && [actionName hasPrefix: @"save"]);
}
- (void) takeValuesFromRequest: (WORequest *) _rq
</div>
<form const:href="send" name="pageform" enctype="multipart/form-data">
- <div id="headerArea">
<div id="attachmentsArea">
<var:string label:value="Attachments:" />
<ul id="attachments">
/></li></var:foreach>
</ul>
</div>
+ <div id="headerArea">
<span class="headerField"><var:string label:value="From" />:</span>
<var:popup const:name="from"
list="fromEMails"
overflow: hidden;
}
+/* top list */
DIV#contactsListContent
-{ position: absolute;
- background: #fff;
- width: 100%;
- height: 16em;
+{ cursor: default;
+ position: absolute;
+ background-color: #fff;
top: 2.5em;
- overflow: auto;
- overflow-x: hidden;
left: 0px;
-}
+ right: 0px;
+ height: 16em;
+ overflow: hidden;
+ overflow-y: auto; }
.aptview_text
{
padding: 0px; }
TABLE#contactsList
-{
- display: block;
+{ display: block;
position: relative;
- color: #000;
- background: #fff;
- width: 100%;
-}
+ width: 100%; }
TABLE#contactsList TD
{ white-space: nowrap;
overflow: hidden;
}
+/* top list */
DIV#mailboxContent
-{ background-color: #fff;
+{ cursor: default;
position: absolute;
- width: 100%;
- height: 15.5em;
- left: 0px;
+ background-color: #fff;
top: 2.5em;
- right: 0px; }
+ left: 0px;
+ right: 0px;
+ height: 15.5em;
+ overflow: hidden;
+ overflow-y: auto; }
DIV#messageContent
{ position: absolute;
}
TABLE#messageList
-{ cursor: default;
- display: block;
- position: absolute;
- background-color: #fff;
- color: #000;
- width: 100%;
- left: 0px;
- right: 0px;
- top: 3.25em;
- bottom: 1px;
- overflow: auto;
- overflow-x: hidden; }
-
-TABLE#messageList THEAD
-{ position: fixed;
- margin-top: 1px;
- top: 7.5em;
- right: 0px;
- left: 15.5em;
- height: 2em; }
+{ display: block;
+ position: relative;
+ width: 100%; }
TABLE#messageList TD
{ height: 1.2em; }
padding: 0px;
overflow: hidden; }
+/* top list */
DIV#eventsListView
-{ display: block;
- cursor: default;
+{ cursor: default;
position: absolute;
background-color: #fff;
top: 2.5em;
}
function modifyEventCallback(http) {
- if (http.readyState == 4) {
- if (http.status == 200) {
- if (queryParameters["mail-invitation"].toLowerCase() == "yes")
- closeInvitationWindow();
- else {
- window.opener.setTimeout("refreshEventsAndDisplay();", 100);
- window.setTimeout("window.close();", 100);
- }
- }
+ if (http.readyState == 4) {
+ if (http.status == 200) {
+ var mailInvitation = queryParameters["mail-invitation"];
+ if (mailInvitation && mailInvitation.toLowerCase() == "yes")
+ closeInvitationWindow();
else {
-// log("showing alert...");
- window.alert(labels["eventPartStatModificationError"]);
+ window.opener.setTimeout("refreshEventsAndDisplay();", 100);
+ window.setTimeout("window.close();", 100);
}
- document.modifyEventAjaxRequest = null;
- }
+ }
+ else {
+// log("showing alert...");
+ window.alert(labels["eventPartStatModificationError"]);
+ }
+ document.modifyEventAjaxRequest = null;
+ }
}
function deleteEventCallback(http) {
SPAN.headerField
{ line-height: 1.8em;
- width: 5em;
+ width: 7em;
text-align: right; }
SPAN.headerInput INPUT
-{ width: 100%;
+{ width: 50%;
padding-left: 24px;
background-image: url('/SOGo.woa/WebServerResources/abcard.gif');
background-repeat: no-repeat;
- background-position: 2px center;
- margin-right: -12em; }
+ background-position: 2px center; }
+
+DIV#subjectRow
+{ margin-left: 9em; }
DIV#subjectRow INPUT
{ background-image: none;
- width: 100%;
+ width: 50%;
padding-left: .5em; }
div#compose_internetmarker
--- /dev/null
+function onPrintCurrentMessage(event) {
+ window.print();
+
+ preventDefault(event);
+}