Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d6d972d16b | ||
|
|
ccc3de3597 | ||
|
|
7b72f50c1c | ||
|
|
87ccc5c041 | ||
|
|
37a11ffff4 | ||
|
|
208f4366c4 | ||
|
|
b39da3050b | ||
|
|
e7813b2d5e | ||
|
|
171c18677a |
No files matched your search
@@ -30,6 +30,7 @@ Mailer_OBJC_FILES += \
|
||||
SOGoImageMailBodyPart.m \
|
||||
SOGoMessageMailBodyPart.m \
|
||||
SOGoCalendarMailBodyPart.m \
|
||||
SOGoTNEFMailBodyPart.m \
|
||||
SOGoVCardMailBodyPart.m \
|
||||
\
|
||||
SOGoMailForward.m \
|
||||
|
||||
@@ -157,8 +157,7 @@ static BOOL debugOn = NO;
|
||||
{
|
||||
if (!partInfo)
|
||||
{
|
||||
partInfo
|
||||
= [[self mailObject] lookupInfoForBodyPart: [self bodyPartPath]];
|
||||
partInfo = [[self mailObject] lookupInfoForBodyPart: [self bodyPartPath]];
|
||||
[partInfo retain];
|
||||
}
|
||||
|
||||
@@ -546,7 +545,7 @@ static BOOL debugOn = NO;
|
||||
return self;
|
||||
|
||||
/* hard coded for now */
|
||||
|
||||
|
||||
switch ([pe length]) {
|
||||
case 3:
|
||||
if ([pe isEqualToString:@"gif"] ||
|
||||
@@ -588,6 +587,8 @@ static BOOL debugOn = NO;
|
||||
classString = @"SOGoVCardMailBodyPart";
|
||||
else if ([mimeType isEqualToString: @"message/rfc822"])
|
||||
classString = @"SOGoMessageMailBodyPart";
|
||||
else if ([mimeType isEqualToString: @"application/ms-tnef"])
|
||||
classString = @"SOGoTNEFMailBodyPart";
|
||||
else
|
||||
{
|
||||
classString = @"SOGoMailBodyPart";
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
Copyright (C) 2021 Inverse inc.
|
||||
|
||||
This file is part of SOGo.
|
||||
|
||||
SOGo is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with SOGo; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __Mailer_SOGoTNEFMailBodyPart_H__
|
||||
#define __Mailer_SOGoTNEFMailBodyPart_H__
|
||||
|
||||
#import "SOGoMailBodyPart.h"
|
||||
|
||||
@class NGMimeBodyPart;
|
||||
|
||||
@interface SOGoTNEFMailBodyPart : SOGoMailBodyPart
|
||||
{
|
||||
BOOL debugOn;
|
||||
NSData *part;
|
||||
NSString *filename;
|
||||
NGMimeMultipartBody *bodyParts;
|
||||
}
|
||||
|
||||
- (NGMimeMultipartBody *) bodyParts;
|
||||
- (void) setFilename: (NSString *) newFilename;
|
||||
- (void) setPart: (NGMimeBodyPart *) newPart;
|
||||
- (void) setPartInfo: (id) newPartInfo;
|
||||
- (void) decodeBLOB;
|
||||
- (NGMimeBodyPart *) bodyPartForData: (NSData *) _data
|
||||
withType: (NSString *) _type
|
||||
andSubtype: (NSString *) _subtype;
|
||||
- (NGMimeBodyPart *) bodyPartForAttachment: (NSData *) _data
|
||||
withName: (NSString *) _name
|
||||
andType: (NSString *) _type
|
||||
andSubtype: (NSString *) _subtype
|
||||
andContentId: (NSString *) _cid;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __Mailer_SOGoTNEFMailBodyPart_H__ */
|
||||
@@ -0,0 +1,957 @@
|
||||
/*
|
||||
Copyright (C) 2021 Inverse inc.
|
||||
|
||||
This file is part of SOGo.
|
||||
|
||||
SOGo is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with OGo; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
|
||||
The following code is a derivative work of the code from the Yerase's TNEF
|
||||
Stream Reader which is licensed GPLv2.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
|
||||
#import <NGExtensions/NGHashMap.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#import <NGMime/NGMimeBodyPart.h>
|
||||
#import <NGMime/NGMimeFileData.h>
|
||||
#import <NGMime/NGMimeHeaderFields.h>
|
||||
#import <NGMime/NGMimeMultipartBody.h>
|
||||
|
||||
#import <SOGo/RTFHandler.h>
|
||||
#import <SOGo/SOGoBuild.h>
|
||||
#import <SOGo/SOGoSystemDefaults.h>
|
||||
|
||||
#import <SoObjects/Mailer/NSData+SMIME.h>
|
||||
|
||||
#import <ytnef.h>
|
||||
|
||||
#import "SOGoTNEFMailBodyPart.h"
|
||||
|
||||
#define UPR_TO_ATTENDEES_STRING 0x823B
|
||||
#define UPR_CC_ATTENDEES_STRING 0x823C
|
||||
#define UPR_ALL_ATTENDEES_STRING 0x8238
|
||||
|
||||
/*
|
||||
SOGoTNEFMailBodyPart
|
||||
|
||||
A specialized SOGoMailBodyPart subclass for application/ms-tnef attachments. Can
|
||||
be used to attach special SoMethods.
|
||||
|
||||
See the superclass for more information on part objects.
|
||||
*/
|
||||
|
||||
unsigned char GetRruleCount(unsigned char a, unsigned char b) {
|
||||
return ((a << 8) | b);
|
||||
}
|
||||
|
||||
char *GetRruleDayname(unsigned char a) {
|
||||
static char daystring[25];
|
||||
|
||||
*daystring = 0;
|
||||
|
||||
if (a & 0x01) {
|
||||
strcat(daystring, "SU,");
|
||||
}
|
||||
if (a & 0x02) {
|
||||
strcat(daystring, "MO,");
|
||||
}
|
||||
if (a & 0x04) {
|
||||
strcat(daystring, "TU,");
|
||||
}
|
||||
if (a & 0x08) {
|
||||
strcat(daystring, "WE,");
|
||||
}
|
||||
if (a & 0x10) {
|
||||
strcat(daystring, "TH,");
|
||||
}
|
||||
if (a & 0x20) {
|
||||
strcat(daystring, "FR,");
|
||||
}
|
||||
if (a & 0x40) {
|
||||
strcat(daystring, "SA,");
|
||||
}
|
||||
|
||||
if (strlen(daystring)) {
|
||||
daystring[strlen(daystring) - 1] = 0;
|
||||
}
|
||||
|
||||
return (daystring);
|
||||
}
|
||||
|
||||
unsigned char GetRruleMonthNum(unsigned char a, unsigned char b) {
|
||||
switch (a) {
|
||||
case 0x00:
|
||||
switch (b) {
|
||||
case 0x00:
|
||||
// Jan
|
||||
return (1);
|
||||
case 0xA3:
|
||||
// May
|
||||
return (5);
|
||||
case 0xAE:
|
||||
// Nov
|
||||
return (11);
|
||||
}
|
||||
break;
|
||||
case 0x60:
|
||||
switch (b) {
|
||||
case 0xAE:
|
||||
// Feb
|
||||
return (2);
|
||||
case 0x51:
|
||||
// Jun
|
||||
return (6);
|
||||
}
|
||||
break;
|
||||
case 0xE0:
|
||||
switch (b) {
|
||||
case 0x4B:
|
||||
// Mar
|
||||
return (3);
|
||||
case 0x56:
|
||||
// Sep
|
||||
return (9);
|
||||
}
|
||||
break;
|
||||
case 0x40:
|
||||
switch (b) {
|
||||
case 0xFA:
|
||||
// Apr
|
||||
return (4);
|
||||
}
|
||||
break;
|
||||
case 0x20:
|
||||
if (b == 0xFA) {
|
||||
// Jul
|
||||
return (7);
|
||||
}
|
||||
break;
|
||||
case 0x80:
|
||||
if (b == 0xA8) {
|
||||
// Aug
|
||||
return (8);
|
||||
}
|
||||
break;
|
||||
case 0xA0:
|
||||
if (b == 0xFF) {
|
||||
// Oct
|
||||
return (10);
|
||||
}
|
||||
break;
|
||||
case 0xC0:
|
||||
if (b == 0x56) {
|
||||
return (12);
|
||||
}
|
||||
}
|
||||
|
||||
// Error
|
||||
return (0);
|
||||
}
|
||||
|
||||
@implementation SOGoTNEFMailBodyPart
|
||||
|
||||
/* Overwritten methods */
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
debugOn = [[SOGoSystemDefaults sharedSystemDefaults] tnefDecoderDebugEnabled];
|
||||
part = nil;
|
||||
filename = nil;
|
||||
bodyParts = [[NGMimeMultipartBody alloc] init];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) initWithName: (NSString *) _name
|
||||
inContainer: (id) _container
|
||||
{
|
||||
self = [super initWithName: _name inContainer: _container];
|
||||
|
||||
[self decodeBLOB];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
[part release];
|
||||
[filename release];
|
||||
[bodyParts release];
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (id) lookupName: (NSString *) _key
|
||||
inContext: (id) _ctx
|
||||
acquire: (BOOL) _flag
|
||||
{
|
||||
NSArray *parts;
|
||||
int i;
|
||||
|
||||
if ([self isBodyPartKey: _key])
|
||||
{
|
||||
// _key is an integer
|
||||
parts = [bodyParts parts];
|
||||
i = [_key intValue] - 1;
|
||||
|
||||
if (i > -1 && i < [parts count])
|
||||
{
|
||||
[self setPart: [parts objectAtIndex: i]];
|
||||
return self;
|
||||
}
|
||||
}
|
||||
else if ([_key isEqualToString: [self filename]])
|
||||
{
|
||||
return self;
|
||||
}
|
||||
else if ([_key isEqualToString: @"asAttachment"])
|
||||
{
|
||||
[self setAsAttachment];
|
||||
return self;
|
||||
}
|
||||
|
||||
/* Fallback to super class */
|
||||
return [super lookupName: _key inContext: _ctx acquire: _flag];
|
||||
}
|
||||
|
||||
- (NSData *) fetchBLOB
|
||||
{
|
||||
if (part)
|
||||
return [part body];
|
||||
|
||||
return [super fetchBLOB];
|
||||
}
|
||||
|
||||
- (NSString *) filename
|
||||
{
|
||||
if (filename)
|
||||
return filename;
|
||||
else if (part)
|
||||
return nil; // don't try to fetch the filename from the IMAP body structure
|
||||
else
|
||||
return [super filename];
|
||||
}
|
||||
|
||||
- (id) partInfo
|
||||
{
|
||||
if (partInfo)
|
||||
return partInfo;
|
||||
else if (part)
|
||||
return nil; // don't try to fetch the info from the IMAP body structure
|
||||
else
|
||||
return [super partInfo];
|
||||
}
|
||||
|
||||
/* New methods */
|
||||
|
||||
- (NGMimeMultipartBody *) bodyParts
|
||||
{
|
||||
return bodyParts;
|
||||
}
|
||||
|
||||
- (void) decodeBLOB
|
||||
{
|
||||
NSData *data;
|
||||
NSEnumerator *list;
|
||||
NSString *messageClass;
|
||||
NSString *partName, *type, *subtype;
|
||||
NSString *value, *attendee;
|
||||
RTFHandler *handler;
|
||||
|
||||
DWORD signature;
|
||||
DDWORD *classification;
|
||||
dtr datetime;
|
||||
TNEFStruct tnef;
|
||||
variableLength *attachmentName;
|
||||
variableLength *filedata;
|
||||
variableLength buf;
|
||||
|
||||
[self setPart: nil];
|
||||
partName = nil;
|
||||
data = [self fetchBLOB];
|
||||
|
||||
memcpy(&signature, [data bytes], sizeof(DWORD));
|
||||
if (TNEFCheckForSignature(signature) == 0)
|
||||
{
|
||||
TNEFInitialize(&tnef);
|
||||
tnef.Debug = 0;
|
||||
if (TNEFParseMemory((unsigned char *)[data bytes], [data length], &tnef) != -1)
|
||||
{
|
||||
messageClass = [NSString stringWithCString: tnef.messageClass];
|
||||
|
||||
if (debugOn)
|
||||
{
|
||||
NSLog(@"TNEF message class: %@", messageClass);
|
||||
MAPIPrint(&tnef.MapiProperties);
|
||||
}
|
||||
|
||||
if ([messageClass isEqualToString: @"IPM.Microsoft Mail.Note"])
|
||||
{
|
||||
if (tnef.subject.size > 0)
|
||||
{
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_BINARY, PR_BODY_HTML));
|
||||
if (filedata != MAPI_UNDEFINED)
|
||||
{
|
||||
partName = [NSString stringWithFormat: @"%s.html", tnef.subject.data];
|
||||
data = [NSData dataWithBytes: filedata->data length: filedata->size];
|
||||
}
|
||||
else
|
||||
{
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_BINARY, PR_RTF_COMPRESSED));
|
||||
if (filedata != MAPI_UNDEFINED)
|
||||
{
|
||||
buf.data = DecompressRTF(filedata, &(buf.size));
|
||||
if (buf.data != NULL)
|
||||
{
|
||||
partName = [NSString stringWithFormat: @"%s.html", tnef.subject.data];
|
||||
data = [NSData dataWithBytes: buf.data length: buf.size];
|
||||
|
||||
handler = [[RTFHandler alloc] initWithData: data];
|
||||
AUTORELEASE(handler);
|
||||
data = [handler parse]; // RTF to HTML
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ([data length])
|
||||
{
|
||||
[self bodyPartForData: data
|
||||
withType: @"text"
|
||||
andSubtype: @"html"];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ([messageClass isEqualToString: @"IPM.Microsoft Schedule.MtgRespA"] || // tentative response
|
||||
[messageClass isEqualToString: @"IPM.Microsoft Schedule.MtgRespP"] || // positive (accepted) response
|
||||
[messageClass isEqualToString: @"IPM.Microsoft Schedule.MtgRespN"] || // negative (declined) response
|
||||
[messageClass isEqualToString: @"IPM.Microsoft Schedule.MtgReq"]) // request (invitation)
|
||||
{
|
||||
// Meeting object -- construct text/calendar part
|
||||
|
||||
// Parse HTML body, if any
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_BINARY, PR_BODY_HTML));
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 0)
|
||||
{
|
||||
partName = [NSString stringWithFormat: @"%s.html", tnef.subject.data];
|
||||
data = [NSData dataWithBytes: filedata->data length: filedata->size];
|
||||
[self bodyPartForData: data
|
||||
withType: @"text"
|
||||
andSubtype: @"html"];
|
||||
}
|
||||
|
||||
// Create ics attachment
|
||||
NSMutableString *vcalendar = [NSMutableString stringWithString: @"BEGIN:VCALENDAR\n"];
|
||||
BOOL isRequest = [messageClass isEqualToString: @"IPM.Microsoft Schedule.MtgReq"];
|
||||
|
||||
if (isRequest)
|
||||
[vcalendar appendString: @"METHOD:REQUEST\n"];
|
||||
else
|
||||
[vcalendar appendString: @"METHOD:REPLY\n"];
|
||||
[vcalendar appendFormat: @"PRODID:-//Inverse inc./SOGo %@//EN\n", SOGoVersion];
|
||||
[vcalendar appendString: @"VERSION:2.0\n"];
|
||||
[vcalendar appendString: @"BEGIN:VEVENT\n"];
|
||||
|
||||
// UID
|
||||
// TODO: Probably wrong, probably irrelevant
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_BINARY, 0x3));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_BINARY, 0x23));
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
int i;
|
||||
[vcalendar appendString: @"UID:"];
|
||||
for (i = 0; i < filedata->size; i++)
|
||||
{
|
||||
[vcalendar appendFormat: @"%02X", (unsigned char)filedata->data[i]];
|
||||
}
|
||||
[vcalendar appendString: @"\n"];
|
||||
}
|
||||
|
||||
// Sequence
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_LONG, 0x8201));
|
||||
if (filedata != MAPI_UNDEFINED)
|
||||
{
|
||||
[vcalendar appendFormat: @"SEQUENCE:%i\n", (int)*filedata->data];
|
||||
}
|
||||
|
||||
// Attendee email
|
||||
if (isRequest)
|
||||
{
|
||||
// Organizer
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_BINARY, PR_SENDER_SEARCH_KEY));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, PR_SENT_REPRESENTING_EMAIL_ADDRESS));
|
||||
}
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
NSArray *components;
|
||||
NSString *email, *cn;
|
||||
email = [NSString stringWithUTF8String: (const char *)filedata->data];
|
||||
components = [email componentsSeparatedByString: @":"];
|
||||
email = [components objectAtIndex: 0];
|
||||
|
||||
if ([components count] > 1)
|
||||
cn = [components objectAtIndex: 1];
|
||||
else
|
||||
{
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, PR_SENT_REPRESENTING_NAME));
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
cn = [NSString stringWithUTF8String: (const char *)filedata->data];
|
||||
else
|
||||
cn = email;
|
||||
}
|
||||
[vcalendar appendFormat: @"ORGANIZER;cn=\"%@\":mailto:%@\n", cn, email];
|
||||
}
|
||||
|
||||
// Attendees
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_STRING8, UPR_TO_ATTENDEES_STRING));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, UPR_TO_ATTENDEES_STRING));
|
||||
}
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_STRING8, UPR_ALL_ATTENDEES_STRING));
|
||||
}
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, UPR_ALL_ATTENDEES_STRING));
|
||||
}
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
// Required attendees
|
||||
value = [NSString stringWithUTF8String: (const char *)filedata->data];
|
||||
list = [[value componentsSeparatedByString: @";"] objectEnumerator];
|
||||
while ((attendee = [list nextObject]))
|
||||
{
|
||||
attendee = [attendee stringByTrimmingSpaces];
|
||||
[vcalendar appendFormat: @"ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN=\"%@\":MAILTO:%@\n",
|
||||
attendee, attendee];
|
||||
}
|
||||
|
||||
// Optional attendees
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_STRING8, UPR_CC_ATTENDEES_STRING));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, UPR_CC_ATTENDEES_STRING));
|
||||
}
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
value = [NSString stringWithUTF8String: (const char *)filedata->data];
|
||||
if ([value length])
|
||||
{
|
||||
list = [[value componentsSeparatedByString: @";"] objectEnumerator];
|
||||
while ((attendee = [list nextObject]))
|
||||
{
|
||||
attendee = [attendee stringByTrimmingSpaces];
|
||||
[vcalendar appendFormat: @"ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=OPT-PARTICIPANT;RSVP=TRUE;CN=\"%@\":MAILTO:%@\n",
|
||||
attendee, attendee];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Meeting response
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, PR_SENT_REPRESENTING_EMAIL_ADDRESS));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, PR_SENDER_SMTP_ADDRESS));
|
||||
}
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
NSString *email, *cn, *partstat;
|
||||
email = [NSString stringWithUTF8String: (const char *)filedata->data];
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, PR_SENT_REPRESENTING_NAME));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, PR_SENDER_NAME));
|
||||
}
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
cn = [NSString stringWithUTF8String: (const char *)filedata->data];
|
||||
else
|
||||
cn = email;
|
||||
|
||||
switch ([messageClass characterAtIndex: [messageClass length] - 1])
|
||||
{
|
||||
case 'N':
|
||||
partstat = @"DECLINED";
|
||||
break;
|
||||
case 'A':
|
||||
partstat = @"TENTATIVE";
|
||||
break;
|
||||
default:
|
||||
partstat = @"ACCEPTED";
|
||||
}
|
||||
[vcalendar appendFormat: @"ATTENDEE;PARTSTAT=%@;CN=\"%@\":MAILTO:%@\n", partstat, cn, email];
|
||||
}
|
||||
}
|
||||
|
||||
// Summary
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_STRING8, PR_CONVERSATION_TOPIC));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, PR_CONVERSATION_TOPIC));
|
||||
}
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
[vcalendar appendFormat: @"SUMMARY:%@\n", [NSString stringWithUTF8String: (const char *)filedata->data]];
|
||||
}
|
||||
|
||||
// Description
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_STRING8, 0x3fd9));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
filedata = MAPIFindProperty(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, 0x3fd9));
|
||||
}
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
[vcalendar appendFormat: @"DESCRIPTION:%@\n", [NSString stringWithUTF8String: (const char *)filedata->data]];
|
||||
}
|
||||
|
||||
// Location
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_STRING8, 0x0002));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_STRING8, 0x8208));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, 0x0002));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_UNICODE, 0x8208));
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
[vcalendar appendFormat: @"LOCATION: %@\n", [NSString stringWithUTF8String: (const char *)filedata->data]];
|
||||
}
|
||||
|
||||
// Date start
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_SYSTIME, 0x820d));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_SYSTIME, 0x8516));
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
MAPISysTimetoDTR(filedata->data, &datetime);
|
||||
[vcalendar appendFormat: @"DTSTART:%04i%02i%02iT%02i%02i%02iZ\n",
|
||||
datetime.wYear, datetime.wMonth, datetime.wDay, datetime.wHour, datetime.wMinute, datetime.wSecond];
|
||||
}
|
||||
|
||||
// Date end
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_SYSTIME, 0x820e));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_SYSTIME, 0x8517));
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
MAPISysTimetoDTR(filedata->data, &datetime);
|
||||
[vcalendar appendFormat: @"DTEND:%04i%02i%02iT%02i%02i%02iZ\n",
|
||||
datetime.wYear, datetime.wMonth, datetime.wDay, datetime.wHour, datetime.wMinute, datetime.wSecond];
|
||||
}
|
||||
|
||||
// Date stamp
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_SYSTIME, 0x8202));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_SYSTIME, 0x001a));
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size > 1)
|
||||
{
|
||||
MAPISysTimetoDTR(filedata->data, &datetime);
|
||||
[vcalendar appendFormat: @"DTSTAMP:%04i%02i%02iT%02i%02i%02iZ\n",
|
||||
datetime.wYear, datetime.wMonth, datetime.wDay, datetime.wHour, datetime.wMinute, datetime.wSecond];
|
||||
}
|
||||
|
||||
// Classification
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_BOOLEAN, 0x8506));
|
||||
if (filedata != MAPI_UNDEFINED)
|
||||
{
|
||||
classification = (DDWORD *)filedata->data;
|
||||
if (*classification == 1)
|
||||
[vcalendar appendString: @"CLASS:PRIVATE\n"];
|
||||
else
|
||||
[vcalendar appendString: @"CLASS:PUBLIC\n"];
|
||||
}
|
||||
|
||||
// Repeating rule
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_BINARY, 0x8216));
|
||||
if (filedata != MAPI_UNDEFINED && filedata->size >= 0x1F)
|
||||
{
|
||||
NSMutableString *rrule = [NSMutableString string];
|
||||
unsigned char *recurData = filedata->data;
|
||||
|
||||
// [vcalendar appendString: @"RRULE:FREQ="];
|
||||
if (recurData[0x04] == 0x0A)
|
||||
{
|
||||
[rrule appendString: @"DAILY"];
|
||||
if (recurData[0x16] == 0x23 || recurData[0x16] == 0x22 || recurData[0x16] == 0x21)
|
||||
{
|
||||
filedata = MAPIFindUserProp(&(tnef.MapiProperties), PROP_TAG(PT_I2, 0x0011));
|
||||
if (filedata != MAPI_UNDEFINED)
|
||||
[rrule appendFormat: @";INTERVAL=%d", *(filedata->data)];
|
||||
if (recurData[0x16] == 0x22 || recurData[0x16] == 0x21)
|
||||
[rrule appendFormat: @";COUNT=%d", GetRruleCount(recurData[0x1B], recurData[0x1A])];
|
||||
}
|
||||
else if (recurData[0x16] == 0x3E)
|
||||
{
|
||||
[rrule appendString: @";BYDAY=MO,TU,WE,TH,FR"];
|
||||
if (recurData[0x1A] == 0x22 || recurData[0x1A] == 0x21)
|
||||
[rrule appendFormat: @";COUNT=%d", GetRruleCount(recurData[0x1F], recurData[0x1E])];
|
||||
|
||||
}
|
||||
}
|
||||
else if (recurData[0x04] == 0x0B)
|
||||
{
|
||||
[rrule appendFormat: @"WEEKLY;INTERVAL=%d;BYDAY=%s", recurData[0x0E], GetRruleDayname(recurData[0x16])];
|
||||
if (recurData[0x1A] == 0x22 || recurData[0x1A] == 0x21)
|
||||
[rrule appendFormat: @";COUNT=%d", GetRruleCount(recurData[0x1F], recurData[0x1E])];
|
||||
}
|
||||
else if (recurData[0x04] == 0x0C)
|
||||
{
|
||||
[rrule appendString: @"MONTHLY"];
|
||||
if (recurData[0x06] == 0x02)
|
||||
{
|
||||
[rrule appendFormat: @";INTERVAL=%d;BYMONTHDAY=%d", recurData[0x0E], recurData[0x16]];
|
||||
if (recurData[0x1A] == 0x22 || recurData[0x1A] == 0x21)
|
||||
[rrule appendFormat: @";COUNT=%d", GetRruleCount(recurData[0x1F], recurData[0x1E])];
|
||||
}
|
||||
else if (recurData[0x06] == 0x03)
|
||||
{
|
||||
[rrule appendFormat: @";BYDAY=%s;BYSETPOS=%d;INTERVAL=%d",
|
||||
GetRruleDayname(recurData[0x16]),
|
||||
recurData[0x1A] == 0x05 ? -1 : recurData[0x1A],
|
||||
recurData[0x0E]];
|
||||
if (recurData[0x1E] == 0x22 || recurData[0x1E] == 0x21)
|
||||
[rrule appendFormat: @";COUNT=%d", GetRruleCount(recurData[0x23], recurData[0x22])];
|
||||
}
|
||||
}
|
||||
else if (recurData[0x04] == 0x0D)
|
||||
{
|
||||
[rrule appendFormat: @"YEARLY;BYMONTH=%d", GetRruleMonthNum(recurData[0x0A], recurData[0x0B])];
|
||||
if (recurData[0x06] == 0x02)
|
||||
[rrule appendFormat: @";BYMONTHDAY=%d", recurData[0x16]];
|
||||
else if (recurData[0x06] == 0x03)
|
||||
[rrule appendFormat: @";BYDAY=%s;BYSETPOS=%d",
|
||||
GetRruleDayname(recurData[0x16]),
|
||||
recurData[0x1A] == 0x05 ? -1 : recurData[0x1A]];
|
||||
if (recurData[0x1E] == 0x22 || recurData[0x1E] == 0x21)
|
||||
[rrule appendFormat: @";COUNT=%d", GetRruleCount(recurData[0x23], recurData[0x22])];
|
||||
}
|
||||
|
||||
if ([rrule length])
|
||||
[vcalendar appendFormat: @"RRULE:FREQ=%@\n", rrule];
|
||||
}
|
||||
|
||||
[vcalendar appendString: @"END:VEVENT\n"];
|
||||
[vcalendar appendString: @"END:VCALENDAR"];
|
||||
|
||||
if (debugOn)
|
||||
NSLog(@"TNEF reconstructed vCalendar:\n%@", vcalendar);
|
||||
|
||||
[self bodyPartForData: [vcalendar dataUsingEncoding: NSUTF8StringEncoding]
|
||||
withType: @"text"
|
||||
andSubtype: @"calendar"];
|
||||
|
||||
}
|
||||
// Other classes to handle:
|
||||
//
|
||||
// IPM.Contact
|
||||
// IPM.Task
|
||||
// IPM.Microsoft Schedule.MtgCncl
|
||||
// IPM.Appointment
|
||||
//
|
||||
|
||||
Attachment *p;
|
||||
BOOL isObject, isRealAttachment;
|
||||
|
||||
p = tnef.starting_attach.next;
|
||||
while (p != NULL)
|
||||
{
|
||||
if (p->FileData.size > 0)
|
||||
{
|
||||
isObject = YES;
|
||||
|
||||
// See if the contents are stored as "attached data" inside the MAPI blocks.
|
||||
filedata = MAPIFindProperty(&(p->MAPI), PROP_TAG(PT_OBJECT, PR_ATTACH_DATA_OBJ));
|
||||
if (filedata == MAPI_UNDEFINED)
|
||||
{
|
||||
// Nope, standard TNEF stuff.
|
||||
filedata = &(p->FileData);
|
||||
isObject = NO;
|
||||
}
|
||||
|
||||
// See if this is an embedded TNEF stream.
|
||||
isRealAttachment = YES;
|
||||
|
||||
TNEFStruct emb_tnef;
|
||||
DWORD object_signature;
|
||||
|
||||
if (isObject)
|
||||
{
|
||||
// This is an "embedded object", so skip the 16-byte identifier first.
|
||||
memcpy(&object_signature, filedata->data + 16, sizeof(DWORD));
|
||||
if (TNEFCheckForSignature(object_signature) == 0) {
|
||||
TNEFInitialize(&emb_tnef);
|
||||
emb_tnef.Debug = tnef.Debug;
|
||||
if (TNEFParseMemory(filedata->data + 16, filedata->size - 16, &emb_tnef) != -1)
|
||||
{
|
||||
isRealAttachment = NO;
|
||||
}
|
||||
TNEFFree(&emb_tnef);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(&object_signature, filedata->data, sizeof(DWORD));
|
||||
if (TNEFCheckForSignature(object_signature) == 0) {
|
||||
TNEFInitialize(&emb_tnef);
|
||||
emb_tnef.Debug = tnef.Debug;
|
||||
if (TNEFParseMemory(filedata->data, filedata->size, &emb_tnef) != -1)
|
||||
{
|
||||
isRealAttachment = NO;
|
||||
}
|
||||
TNEFFree(&emb_tnef);
|
||||
}
|
||||
}
|
||||
if (isRealAttachment)
|
||||
{
|
||||
// Ok, it's not an embedded stream, so now we process it.
|
||||
attachmentName = MAPIFindProperty(&(p->MAPI), PROP_TAG(PT_STRING8, PR_ATTACH_LONG_FILENAME));
|
||||
if (attachmentName == MAPI_UNDEFINED)
|
||||
{
|
||||
attachmentName = MAPIFindProperty(&(p->MAPI), PROP_TAG(PT_STRING8, PR_DISPLAY_NAME));
|
||||
if (attachmentName == MAPI_UNDEFINED)
|
||||
{
|
||||
attachmentName = MAPIFindProperty(&(p->MAPI), PROP_TAG(PT_STRING8, PR_ATTACH_TRANSPORT_NAME));
|
||||
if (attachmentName == MAPI_UNDEFINED)
|
||||
{
|
||||
attachmentName = &(p->Title);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MAPIPrint(&p->MAPI);
|
||||
|
||||
variableLength *prop;
|
||||
|
||||
if (attachmentName->size > 1)
|
||||
{
|
||||
partName = [NSString stringWithUTF8String: (const char *)attachmentName->data];
|
||||
|
||||
type = @"application";
|
||||
subtype = @"octet-stream";
|
||||
|
||||
prop = MAPIFindProperty(&(p->MAPI), PROP_TAG(PT_UNICODE, PR_ATTACH_MIME_TAG));
|
||||
if (prop != MAPI_UNDEFINED)
|
||||
{
|
||||
NSString *mime = [NSString stringWithUTF8String: (const char *)prop->data];
|
||||
NSArray *pair = [mime componentsSeparatedByString: @"/"];
|
||||
if ([pair count] == 2)
|
||||
{
|
||||
type = [pair objectAtIndex: 0];
|
||||
subtype = [pair objectAtIndex: 1];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self warnWithFormat: @"Unexpected MIME type %@", mime];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
prop = MAPIFindProperty(&(p->MAPI), PROP_TAG(PT_STRING8, PR_ATTACH_EXTENSION));
|
||||
if (prop != MAPI_UNDEFINED)
|
||||
{
|
||||
NSString *ext = [NSString stringWithUTF8String: (const char *)prop->data];
|
||||
if ([ext caseInsensitiveCompare: @".txt"] == NSOrderedSame)
|
||||
{
|
||||
type = @"text";
|
||||
subtype = @"plain";
|
||||
}
|
||||
else
|
||||
{
|
||||
[self warnWithFormat: @"Unidentified extension %@", ext];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NSString *cid = partName;
|
||||
prop = MAPIFindProperty(&(p->MAPI), PROP_TAG(PT_UNICODE, 0x3712)); // PR_CONTENT_IDENTIFIER?
|
||||
if (prop != MAPI_UNDEFINED)
|
||||
{
|
||||
cid = [NSString stringWithUTF8String: (const char *)prop->data];
|
||||
}
|
||||
|
||||
NSData *attachment;
|
||||
if (isObject)
|
||||
attachment = [NSData dataWithBytes: filedata->data + 16 length: filedata->size - 16];
|
||||
else
|
||||
attachment = [NSData dataWithBytes: filedata->data length: filedata->size];
|
||||
|
||||
[self bodyPartForAttachment: attachment
|
||||
withName: partName
|
||||
andType: type
|
||||
andSubtype: subtype
|
||||
andContentId: cid];
|
||||
|
||||
// count++;
|
||||
}
|
||||
} // if isRealAttachment
|
||||
} // if size>0
|
||||
p = p->next;
|
||||
}
|
||||
}
|
||||
TNEFFree(&tnef);
|
||||
}
|
||||
}
|
||||
|
||||
- (void) setPart: (NGMimeBodyPart *) newPart
|
||||
{
|
||||
ASSIGN (part, newPart);
|
||||
if (newPart)
|
||||
{
|
||||
[self setFilename: [[newPart bodyInfo] filename]];
|
||||
[self setPartInfo: [newPart bodyInfo]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self setFilename: nil];
|
||||
[self setPartInfo: nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) setFilename: (NSString *) newFilename
|
||||
{
|
||||
ASSIGN (filename, newFilename);
|
||||
}
|
||||
|
||||
- (void) setPartInfo: (id) newPartInfo
|
||||
{
|
||||
ASSIGN (partInfo, newPartInfo);
|
||||
}
|
||||
|
||||
- (NSString *) contentDispositionForAttachmentWithName: (NSString *) _name
|
||||
andSize: (NSNumber *) _size
|
||||
andContentType: (NSString *) _type
|
||||
{
|
||||
NSString *cdtype, *cd;
|
||||
|
||||
if (([_type caseInsensitiveCompare: @"image"] == NSOrderedSame) ||
|
||||
([_type caseInsensitiveCompare: @"message"] == NSOrderedSame))
|
||||
cdtype = @"inline";
|
||||
else
|
||||
cdtype = @"attachment";
|
||||
|
||||
cd = [NSString stringWithFormat: @"%@; filename=\"%@\"; size=%i;",
|
||||
cdtype, [_name stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""], [_size intValue]];
|
||||
|
||||
return cd;
|
||||
}
|
||||
|
||||
- (NGMimeBodyPart *) bodyPartForData: (NSData *) _data
|
||||
withType: (NSString *) _type
|
||||
andSubtype: (NSString *) _subtype
|
||||
{
|
||||
NGMutableHashMap *map;
|
||||
NGMimeBodyPart *bodyPart;
|
||||
NSData *content;
|
||||
id body;
|
||||
|
||||
if (_data == nil) return nil;
|
||||
|
||||
/* check attachment */
|
||||
|
||||
/* prepare header of body part */
|
||||
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 4] autorelease];
|
||||
|
||||
// Content-Type
|
||||
[map setObject: [NSString stringWithFormat: @"%@/%@", _type, _subtype]
|
||||
forKey: @"content-type"];
|
||||
|
||||
/* prepare body content */
|
||||
|
||||
content = [NSData dataWithBytes: [_data bytes] length: [_data length]];
|
||||
[map setObject: [NSNumber numberWithInt: [content length]]
|
||||
forKey: @"content-length"];
|
||||
|
||||
/* Note: the -init method will create a temporary file! */
|
||||
body = [[[NGMimeFileData alloc] initWithBytes: [content bytes]
|
||||
length: [content length]] autorelease];
|
||||
|
||||
bodyPart = [[[NGMimeBodyPart alloc] initWithHeader: map] autorelease];
|
||||
[bodyPart setBody: body];
|
||||
[bodyParts addBodyPart: bodyPart];
|
||||
|
||||
return bodyPart;
|
||||
}
|
||||
|
||||
- (NGMimeBodyPart *) bodyPartForAttachment: (NSData *) _data
|
||||
withName: (NSString *) _name
|
||||
andType: (NSString *) _type
|
||||
andSubtype: (NSString *) _subtype
|
||||
andContentId: (NSString *) _cid
|
||||
{
|
||||
NGMutableHashMap *map;
|
||||
NGMimeBodyPart *bodyPart;
|
||||
NSData *content;
|
||||
NSString *s;
|
||||
id body;
|
||||
|
||||
if (_name == nil) return nil;
|
||||
|
||||
/* prepare header of body part */
|
||||
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 4] autorelease];
|
||||
|
||||
// Content-Type
|
||||
[map setObject: [NSString stringWithFormat: @"%@/%@", _type, _subtype]
|
||||
forKey: @"content-type"];
|
||||
|
||||
// Content-Id
|
||||
[map setObject: _cid
|
||||
forKey: @"content-id"];
|
||||
|
||||
// Content-Disposition
|
||||
s = [self contentDispositionForAttachmentWithName: _name
|
||||
andSize: [NSNumber numberWithLong: [_data length]]
|
||||
andContentType: _type];
|
||||
NGMimeContentDispositionHeaderField *o;
|
||||
o = [[NGMimeContentDispositionHeaderField alloc] initWithString: s];
|
||||
[map setObject: o forKey: @"content-disposition"];
|
||||
[o release];
|
||||
|
||||
/* prepare body content */
|
||||
|
||||
content = [NSData dataWithBytes: [_data bytes] length: [_data length]];
|
||||
[map setObject: [NSNumber numberWithInt: [content length]]
|
||||
forKey: @"content-length"];
|
||||
|
||||
/* Note: the -init method will create a temporary file! */
|
||||
body = [[NGMimeFileData alloc] initWithBytes: [content bytes]
|
||||
length: [content length]];
|
||||
|
||||
bodyPart = [[[NGMimeBodyPart alloc] initWithHeader: map] autorelease];
|
||||
[bodyPart setBody: body];
|
||||
|
||||
[body release];
|
||||
[bodyParts addBodyPart: bodyPart];
|
||||
|
||||
return bodyPart;
|
||||
}
|
||||
|
||||
@end /* SOGoTNEFMailBodyPart */
|
||||
@@ -59,6 +59,9 @@
|
||||
SOGoMessageMailBodyPart = {
|
||||
superclass = "SOGoMailBodyPart";
|
||||
};
|
||||
SOGoTNEFMailBodyPart = {
|
||||
superclass = "SOGoMailBodyPart";
|
||||
};
|
||||
SOGoCalendarMailBodyPart = {
|
||||
superclass = "SOGoMailBodyPart";
|
||||
};
|
||||
|
||||
@@ -21,6 +21,7 @@ SOGo_HEADER_FILES = \
|
||||
EOBitmaskQualifier.h \
|
||||
EOQualifier+SOGoCacheObject.h \
|
||||
GCSSpecialQueries+SOGoCacheObject.h \
|
||||
RTFHandler.h \
|
||||
SOGoCache.h \
|
||||
SOGoCacheGCSFolder.h \
|
||||
SOGoCacheGCSObject.h \
|
||||
@@ -100,6 +101,7 @@ SOGo_OBJC_FILES = \
|
||||
EOBitmaskQualifier.m \
|
||||
EOQualifier+SOGoCacheObject.m \
|
||||
GCSSpecialQueries+SOGoCacheObject.m \
|
||||
RTFHandler.m \
|
||||
SOGoCache.m \
|
||||
SOGoCacheGCSFolder.m \
|
||||
SOGoCacheGCSObject.m \
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
Copyright (C) 2005-2012 Inverse inc.
|
||||
|
||||
This file is part of SOGo.
|
||||
|
||||
SOGo is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with OGo; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <Foundation/NSArray.h>
|
||||
#include <Foundation/NSData.h>
|
||||
#include <Foundation/NSMapTable.h>
|
||||
#include <Foundation/NSObject.h>
|
||||
#include <Foundation/NSString.h>
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@class RTFFontTable;
|
||||
|
||||
@interface RTFHandler : NSObject
|
||||
{
|
||||
NSMapTable *_charsets;
|
||||
NSMutableData *_html;
|
||||
NSData *_data;
|
||||
|
||||
const char *_bytes;
|
||||
int _current_pos;
|
||||
int _len;
|
||||
}
|
||||
|
||||
- (id) initWithData: (NSData *) theData;
|
||||
- (NSMutableData *) parse;
|
||||
|
||||
- (RTFFontTable *) parseFontTable;
|
||||
- (void) mangleInternalStateWithBytesPtr: (const char*) newBytes
|
||||
andCurrentPos: (int) newCurrentPos;
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@interface RTFStack: NSObject
|
||||
{
|
||||
NSMutableArray *a;
|
||||
}
|
||||
- (void) push: (id) theObject;
|
||||
- (id) pop;
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@interface RTFFormattingOptions : NSObject
|
||||
{
|
||||
@public
|
||||
BOOL bold;
|
||||
BOOL italic;
|
||||
BOOL underline;
|
||||
BOOL strikethrough;
|
||||
int font_index;
|
||||
int color_index;
|
||||
int start_pos;
|
||||
const unsigned short *charset;
|
||||
}
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@interface RTFFontInfo : NSObject
|
||||
{
|
||||
@public
|
||||
NSString *family;
|
||||
unsigned char charset;
|
||||
NSString *name;
|
||||
unsigned int pitch;
|
||||
unsigned int index;
|
||||
}
|
||||
|
||||
- (NSString *) description;
|
||||
@end
|
||||
|
||||
//
|
||||
// \fX - font, index in font table
|
||||
//
|
||||
@interface RTFFontTable : NSObject
|
||||
{
|
||||
@public
|
||||
NSMapTable *fontInfos;
|
||||
}
|
||||
|
||||
- (void) addFontInfo: (RTFFontInfo *) theFontInfo
|
||||
atIndex: (unsigned int ) theIndex;
|
||||
- (RTFFontInfo *) fontInfoAtIndex: (unsigned int ) theIndex;
|
||||
- (NSString *) description;
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@interface RTFColorDef : NSObject
|
||||
{
|
||||
@public
|
||||
unsigned char red;
|
||||
unsigned char green;
|
||||
unsigned char blue;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
// {\colortbl\red0\green0\blue0;\red128\green0\blue0;\red255\green0\blue0;}
|
||||
//
|
||||
// \cfX - color/foreground - index
|
||||
// \cbX - color/background - index
|
||||
//
|
||||
//
|
||||
@interface RTFColorTable : NSObject
|
||||
{
|
||||
@public
|
||||
NSMutableArray *colorDefs;
|
||||
}
|
||||
|
||||
- (void) addColorDef: (RTFColorDef *) theColorDef;
|
||||
|
||||
@end
|
||||
File diff suppressed because it is too large.
Load diff
@@ -26,6 +26,7 @@
|
||||
SOGoMemcachedHost = "localhost";
|
||||
|
||||
SOGoUIxDebugEnabled = NO;
|
||||
SOGoTnefDecoderDebugEnabled = NO;
|
||||
|
||||
SOGoLDAPContactInfoAttribute = "description";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SOGoSystemDefaults.h - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2009-2016 Inverse inc.
|
||||
* Copyright (C) 2009-2021 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -65,6 +65,7 @@
|
||||
|
||||
- (BOOL) uixDebugEnabled;
|
||||
- (BOOL) easDebugEnabled;
|
||||
- (BOOL) tnefDecoderDebugEnabled;
|
||||
- (BOOL) xsrfValidationEnabled;
|
||||
|
||||
- (NSString *) pageTitle;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SOGoSystemDefaults.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2009-2015 Inverse inc.
|
||||
* Copyright (C) 2009-2021 Inverse inc.
|
||||
* Copyright (C) 2012 Jeroen Dekkers <jeroen@dekkers.ch>
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
@@ -434,6 +434,11 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict,
|
||||
return [self boolForKey: @"SOGoEASDebugEnabled"];
|
||||
}
|
||||
|
||||
- (BOOL) tnefDecoderDebugEnabled
|
||||
{
|
||||
return [self boolForKey: @"SOGoTnefDecoderDebugEnabled"];
|
||||
}
|
||||
|
||||
- (BOOL) xsrfValidationEnabled
|
||||
{
|
||||
id o;
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch37\stshfhich37\stshfbi37\deflang3082\deflangfe3082\themelang3082\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31561\fbidi \froman\fcharset161\fprq2 Times New RoLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1251\uc1\adeff0\deff0\stshfdbch0\stshfloch37\stshfhich37\stshfbi37\deflang1049\deflangfe1049\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f179\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f180\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f182\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f183\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f184\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f185\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f186\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f187\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f179\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f180\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f182\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f183\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f184\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f185\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f186\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f187\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f549\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f550\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f552\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f553\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f556\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f557\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31561\fbidi \froman\fcharset161\fpLine truncated
|
||||
@@ -0,0 +1,6 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang3082\deflangfe3082\themelang3082\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f180\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f181\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f183\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f184\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f185\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f186\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f187\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f188\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f180\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f181\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f183\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f184\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f185\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f186\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f187\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f188\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f550\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f551\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f553\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f554\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f557\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f558\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31561\fbidi \fromLine truncated
|
||||
{\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf0\insrsid12347655 x\341x\351x\372x\355x\363x\361x}
|
||||
{\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf0\insrsid12347655 S\~S\-S\_S\\S}
|
||||
{\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf0\insrsid12347655 U\u-2U\u345U}
|
||||
|
||||
{\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf0\insrsid12347655\charrsid12347655 \r\n\par }}}
|
||||
@@ -0,0 +1 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch37\stshfhich37\stshfbi37\deflang3082\deflangfe3082\themelang3082\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31561\fbidi \froman\fcharset161\fprq2 Times New RoLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang3082\deflangfe3082\themelang3082\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f40\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f41\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f43\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f44\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f45\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f46\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f47\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f48\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f40\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f41\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f43\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f44\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f45\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f46\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f47\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f48\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f410\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f411\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f413\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f414\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f417\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f418\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31561\fbidi \froman\fcharset161\fLine truncated
|
||||
@@ -0,0 +1,21 @@
|
||||
{\rtf1\ansi\deff3\adeflang1025
|
||||
{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Times New Roman;}{\f4\fs
|
||||
wiss\fprq2\fcharset0 Arial;}{\f5\fnil\fprq2\fcharset1 Ubuntu;}{\f6\fnil\fprq2\fcharset0 DejaVu Sans;}{\f7\fnil\fprq2\fcharset0 Lohit Hindi;}{\f8\fnil\fprq0\fcharset1 Lohit Hindi
|
||||
;}}
|
||||
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
|
||||
{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033 Normal;}
|
||||
{\s15\sbasedon0\snext16\sb240\sa120\keepn\dbch\af6\dbch\af7\afs28\loch\f4\fs28 Heading;}
|
||||
{\s16\sbasedon0\snext16\sb0\sa120 Text Body;}
|
||||
{\s17\sbasedon16\snext17\sb0\sa120\dbch\af8 List;}
|
||||
{\s18\sbasedon0\snext18\sb120\sa120\noline\i\dbch\af8\afs24\ai\fs24 Caption;}
|
||||
{\s19\sbasedon0\snext19\noline\dbch\af8 Index;}
|
||||
}{\info{\creatim\yr2014\mo8\dy4\hr16\min16}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67175170}}\deftab709
|
||||
\viewscale100
|
||||
{\*\pgdsctbl
|
||||
{\pgdsc0\pgdscuse451\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Default Style;}}
|
||||
\formshade\paperh16838\paperw11906\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\marg
|
||||
bsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
|
||||
\pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch\loch\l
|
||||
och\f5000
|
||||
foobar}
|
||||
\par }
|
||||
@@ -0,0 +1 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch37\stshfhich37\stshfbi37\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 00000000000000000000}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f379\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f380\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f382\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f383\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f386\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (ViLine truncated
|
||||
@@ -0,0 +1,33 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ËÎÌå};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ËÎÌå};}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f47\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ËÎÌå};}{\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ËÎÌå};}{\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f308\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f309\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f311\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f312\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f313\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f314\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f315\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f316\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f318\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f319\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\f321\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f322\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f323\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f324\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\f325\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f326\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f440\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ËÎÌå};}{\f440\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ËÎÌå};}{\f678\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f679\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f681\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f682\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f685\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f686\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f688\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;}{\f689\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f691\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f692\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}{\f693\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f694\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f695\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f696\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f697\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f780\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ËÎÌå};}{\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31552\fbLine truncated
|
||||
\par }\pard\plain \ltrpar\s1\ql \li0\ri0\sa150\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap2\pararsid14634989 \rtlch\fcs1 \ab\af0\afs48\alang1025 \ltrch\fcs0 \b\fs48\lang1033\langfe2052\kerning36\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \ab0\af1\afs45 \ltrch\fcs0 \b0\f1\fs45\cf19\insrsid8454727\charrsid8454727 Hi Niels-Uwe,
|
||||
\par }\pard\plain \ltrpar\s20\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\sl360\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap2\pararsid14634989 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \ab\af1\afs21 \ltrch\fcs0 \cs21\b\f1\fs21\cf20\insrsid8454727\charrsid8454727 \hich\af1\dbch\af31505\loch\f1 Only 2 weeks}{\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf20\insrsid8454727\charrsid8454727 \hich\af1\dbch\af31505\loch\f1 are left before Zentyal releases the }{\rtlch\fcs1 \ab\af1\afs21 \ltrch\fcs0 \cs21\b\f1\fs21\cf20\insrsid8454727\charrsid8454727 \hich\af1\dbch\af31505\loch\f1 next mayor Community Edition of the Zentyal Small Business Server}{\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf20\insrsid8454727\charrsid8454727 \hich\af1\dbch\af31505\loch\f1 . And we also want to share with you that Zental has been}{\rtlch\fcs1 \ab\af1\afs21 \ltrch\fcs0 \cs21\b\f1\fs21\cf20\insrsid8454727\charrsid8454727 \hich\af1\dbch\af31505\loch\f1 featured on TechRepublic.com}{\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf20\insrsid8454727\charrsid8454727 .}{\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf20\insrsid8454727\charrsid8454727 \nestcell{\nonesttables
|
||||
\par }}\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap2 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\cf0\dbch\af0\insrsid8454727\charrsid8454727 {\*\nesttableprops\trowd \irow0\irowband0\lastrow \ltrrow\ts11\trgaph300\trleft0\trftsWidth3\trwWidth9000\trautofit1\trpaddl300\trpaddt300\trpaddb300\trpaddr300\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid14634989\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrs\brdrw120\brdrcf21 \clbrdrr\brdrtbl \cltxlrtb\clftsWidth1\clshdrawnil\clhidemark \cellx9000\nestrow}{\nonesttables
|
||||
\par }\ltrrow}\trowd \irow0\irowband0\lastrow \ltrrow\ts11\trqc\trleft0\trftsWidth3\trwWidth12000\trautofit1\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid14634989\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \clcbpat8\cltxlrtb\clftsWidth3\clwWidth9000\clcbpatraw8\clhidemark \cellx9000\clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \clcbpat21\cltxlrtb\clftsWidth3\clwWidth3000\clcbpatraw21\clhidemark \cellx12000\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid14634989 {\rtlch\fcs1 \af0 \ltrch\fcs0 \v\cf0\dbch\af0\insrsid8454727
|
||||
\par }\pard\plain \ltrpar\s4\ql \li0\ri0\sa150\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap2\pararsid14634989 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang1033\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\lang1024\langfe1024\noproof\insrsid5784989 {\shp{\*\shpinst\shpleft0\shptop0\shpright2385\shpbottom4080\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr2\shpwrk0\shpfblwtxt0\shpz0\shplid1026{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLockAspectRatio}{\sv 1}}{\sp{\sn fLockPosition}{\sv 0}}{\sp{\sn fLockAgainstSelect}{\sv 0}}{\sp{\sn fLockAgainstGrouping}{\sv 0}}{\sp{\sn pibName}{\sv http://go.zentyal.com/l/24292/2014-10-08/dmptm/24292/55816/zentyal_4_0_release_data_vertical_image.png}}{\sp{\sn pibFlags}{\sv 13}}{\sp{\sn pictureGray}{\sv 0}}{\sp{\sn pictureBiLevel}{\sv 0}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fNoFillHitTest}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn wzName}{\sv Picture 4}}{\sp{\sn wzDescription}{\sv http://go.zentyal.com/l/24292/2014-10-08/dmptm/24292/55816/zentyal_4_0_release_data_vertical_image.png}}{\sp{\sn dxWrapDistLeft}{\sv 0}}{\sp{\sn dxWrapDistRight}{\sv 0}}{\sp{\sn posh}{\sv 3}}{\sp{\sn posrelv}{\sv 3}}{\sp{\sn dhgt}{\sv 251659264}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 0}}{\sp{\sn fBehindDocument}{\sv 0}}{\sp{\sn fHidden}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}{\shprslt\par\pard\intbl\ql \li0\ri0\widctlpar\posxr\wraparound\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\absnoovrlp1 {\pict\picscalex71\picscaley71\piccropl0\piccropr0\piccropt0\piccropb0\picw5900\pich10134\picwgoal3345\pichgoal5745\wmetafile8\bliptag-641113162{\*\blipuid d9c963b604fc4a8d8a51bbed15793a74}\bin257524 | ||||