From ce916fe06ecb1cc1c711148f99a03130827a2702 Mon Sep 17 00:00:00 2001 From: helge Date: Tue, 28 Sep 2004 14:17:13 +0000 Subject: [PATCH] added SOGoMailManager object git-svn-id: http://svn.opengroupware.org/SOGo/trunk@325 d1b88da0-ebda-0310-925b-ed51d893ca5b --- SOGo/SoObjects/Mailer/ChangeLog | 8 + SOGo/SoObjects/Mailer/GNUmakefile | 4 +- SOGo/SoObjects/Mailer/SOGoMailBaseObject.h | 3 + SOGo/SoObjects/Mailer/SOGoMailBaseObject.m | 40 +---- SOGo/SoObjects/Mailer/SOGoMailFolder.m | 53 +------ SOGo/SoObjects/Mailer/SOGoMailManager.h | 54 +++++++ SOGo/SoObjects/Mailer/SOGoMailManager.m | 144 ++++++++++++++++++ SOGo/SoObjects/Mailer/Version | 2 +- SOGo/UI/Mailer/Images/tbtv_account_17x17.gif | Bin 0 -> 1077 bytes SOGo/UI/Mailer/Images/tbtv_drafts_17x17.gif | Bin 0 -> 1084 bytes SOGo/UI/Mailer/Images/tbtv_inbox_17x17.gif | Bin 0 -> 1093 bytes .../UI/Mailer/Images/tbtv_junction2_17x17.gif | Bin 0 -> 82 bytes SOGo/UI/Mailer/Images/tbtv_junction_17x17.gif | Bin 0 -> 81 bytes .../Mailer/Images/tbtv_leaf_corner_17x17.gif | Bin 0 -> 625 bytes SOGo/UI/Mailer/Images/tbtv_line_17x17.gif | Bin 0 -> 80 bytes SOGo/UI/Mailer/Images/tbtv_minus_17x17.gif | Bin 0 -> 122 bytes SOGo/UI/Mailer/Images/tbtv_plus_17x17.gif | Bin 0 -> 127 bytes SOGo/UI/Mailer/Images/tbtv_sent_17x17.gif | Bin 0 -> 654 bytes SOGo/UI/Mailer/Images/tbtv_trash_17x17.gif | Bin 0 -> 1119 bytes 19 files changed, 223 insertions(+), 85 deletions(-) create mode 100644 SOGo/SoObjects/Mailer/SOGoMailManager.h create mode 100644 SOGo/SoObjects/Mailer/SOGoMailManager.m create mode 100644 SOGo/UI/Mailer/Images/tbtv_account_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_drafts_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_inbox_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_junction2_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_junction_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_leaf_corner_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_line_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_minus_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_plus_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_sent_17x17.gif create mode 100644 SOGo/UI/Mailer/Images/tbtv_trash_17x17.gif diff --git a/SOGo/SoObjects/Mailer/ChangeLog b/SOGo/SoObjects/Mailer/ChangeLog index ee2ccf2d..87a3e750 100644 --- a/SOGo/SoObjects/Mailer/ChangeLog +++ b/SOGo/SoObjects/Mailer/ChangeLog @@ -1,4 +1,12 @@ 2004-09-28 Helge Hess + + * v0.9.9 + + * SOGoMailBaseObject.m: added -mailManager method to retrieve the + mail manager object for a folder/mail/account + + * added SOGoMailManager class, will probably be moved to SOGoLogic + in the long run * SOGoMailBaseObject.m, SOGoMailAccount.m: added -mailAccountFolder method to find the active root folder along the SOPE chain (v0.9.8) diff --git a/SOGo/SoObjects/Mailer/GNUmakefile b/SOGo/SoObjects/Mailer/GNUmakefile index b14a2948..f033de56 100644 --- a/SOGo/SoObjects/Mailer/GNUmakefile +++ b/SOGo/SoObjects/Mailer/GNUmakefile @@ -8,7 +8,9 @@ Mailer_PRINCIPAL_CLASS = SOGoMailerProduct Mailer_OBJC_FILES += \ Product.m \ - \ + \ + SOGoMailManager.m \ + \ SOGoMailBaseObject.m \ SOGoMailAccounts.m \ SOGoMailAccount.m \ diff --git a/SOGo/SoObjects/Mailer/SOGoMailBaseObject.h b/SOGo/SoObjects/Mailer/SOGoMailBaseObject.h index e5d50070..5ca0a908 100644 --- a/SOGo/SoObjects/Mailer/SOGoMailBaseObject.h +++ b/SOGo/SoObjects/Mailer/SOGoMailBaseObject.h @@ -33,6 +33,7 @@ @class NSURL; @class NGImap4Client; +@class SOGoMailManager; @class SOGoMailAccount; @interface SOGoMailBaseObject : SOGoObject @@ -48,7 +49,9 @@ /* IMAP4 */ +- (SOGoMailManager *)mailManager; - (NSURL *)imap4URL; +- (NSString *)imap4Password; - (NSString *)imap4FolderName; - (NGImap4Client *)imap4Client; diff --git a/SOGo/SoObjects/Mailer/SOGoMailBaseObject.m b/SOGo/SoObjects/Mailer/SOGoMailBaseObject.m index 589d063b..3eac2157 100644 --- a/SOGo/SoObjects/Mailer/SOGoMailBaseObject.m +++ b/SOGo/SoObjects/Mailer/SOGoMailBaseObject.m @@ -21,6 +21,7 @@ // $Id$ #include "SOGoMailBaseObject.h" +#include "SOGoMailManager.h" #include "common.h" #include @@ -55,6 +56,10 @@ /* IMAP4 */ +- (SOGoMailManager *)mailManager { + return [SOGoMailManager defaultMailManager]; +} + - (NSString *)relativeImap4Name { [self logWithFormat:@"WARNING: subclass should override %@", NSStringFromSelector(_cmd)]; @@ -91,23 +96,8 @@ return self->imap4URL; } -- (NSString *)imap4Separator { - return @"."; -} - - (NSString *)imap4FolderName { - /* a bit hackish, but should be OK */ - NSString *folderName; - - folderName = [[self imap4URL] path]; - if ([folderName length] == 0) - return nil; - if ([folderName characterAtIndex:0] == '/') - folderName = [folderName substringFromIndex:1]; - - [self logWithFormat:@"FOLDER: %@", folderName]; - return [[folderName pathComponents] componentsJoinedByString: - [self imap4Separator]]; + return [[self mailManager] imap4FolderNameForURL:[self imap4URL]]; } - (NSString *)imap4Password { @@ -115,23 +105,7 @@ } - (NGImap4Client *)imap4ClientForURL:(NSURL *)_url password:(NSString *)_pwd { - // TODO: move to some global IMAP4 connection pool manager - NGImap4Client *client; - NSDictionary *result; - - if (_url == nil) - return nil; - - if ((client = [NGImap4Client clientWithURL:_url]) == nil) - return nil; - - result = [client login:[_url user] password:_pwd]; - if (![[result valueForKey:@"result"] boolValue]) { - [self logWithFormat:@"ERROR: IMAP4 login failed!"]; - return nil; - } - - return client; + return [[self mailManager] imap4ClientForURL:_url password:_pwd]; } - (NGImap4Client *)imap4Client { diff --git a/SOGo/SoObjects/Mailer/SOGoMailFolder.m b/SOGo/SoObjects/Mailer/SOGoMailFolder.m index f26d4c89..9f8d20c2 100644 --- a/SOGo/SoObjects/Mailer/SOGoMailFolder.m +++ b/SOGo/SoObjects/Mailer/SOGoMailFolder.m @@ -22,6 +22,7 @@ #include "SOGoMailFolder.h" #include "SOGoMailObject.h" +#include "SOGoMailManager.h" #include "common.h" @implementation SOGoMailFolder @@ -34,57 +35,9 @@ /* listing the available folders */ -- (NSArray *)_getDirectChildren:(NSArray *)_array folderName:(NSString *)_fn { - // TODO: we should get the full list of folders _once_ and work on that - // (we could cache it in the context) - NSMutableArray *ma; - unsigned i, count, prefixlen; - - if ((count = [_array count]) < 2) - /* one entry is the folder itself, so we need at least two */ - return [NSArray array]; - - prefixlen = [_fn length] + 1; - ma = [NSMutableArray arrayWithCapacity:count]; - for (i = 0; i < count; i++) { - NSString *p; - - p = [_array objectAtIndex:i]; - if ([p length] <= prefixlen) - continue; - p = [p substringFromIndex:prefixlen]; - - if ([p rangeOfString:@"/"].length > 0) - continue; - - [ma addObject:p]; - } - - [ma sortUsingSelector:@selector(compare:)]; - return ma; -} - - (NSArray *)toManyRelationshipKeys { - // TODO - NGImap4Client *client; - NSDictionary *result; - NSString *folderName; - - if ((client = [self imap4Client]) == nil) - return nil; - - folderName = [self imap4FolderName]; - - /* maybe we want to use a cache over here */ - result = [client list:folderName pattern:@"*"]; - if (![[result valueForKey:@"result"] boolValue]) { - [self logWithFormat:@"ERROR: listing of folder failed!"]; - return nil; - } - - /* extract list */ - result = [result valueForKey:@"list"]; - return [self _getDirectChildren:[result allKeys] folderName:folderName]; + return [[self mailManager] subfoldersForURL:[self imap4URL] + password:[self imap4Password]]; } /* name lookup */ diff --git a/SOGo/SoObjects/Mailer/SOGoMailManager.h b/SOGo/SoObjects/Mailer/SOGoMailManager.h new file mode 100644 index 00000000..4fa50e5e --- /dev/null +++ b/SOGo/SoObjects/Mailer/SOGoMailManager.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2004 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo 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. +*/ + +#ifndef __Mailer_SOGoMailManager_H__ +#define __Mailer_SOGoMailManager_H__ + +#import + +/* + SOGoMailManager + + Coordinates access to IMAP4 mailboxes, caches folder hierarchies, etc. +*/ + +@class NSString, NSURL, NSArray; +@class NGImap4Client; + +@interface SOGoMailManager : NSObject +{ +} + ++ (id)defaultMailManager; + +/* client object */ + +- (NGImap4Client *)imap4ClientForURL:(NSURL *)_url password:(NSString *)_pwd; + +/* folder hierarchy */ + +- (NSString *)imap4Separator; +- (NSString *)imap4FolderNameForURL:(NSURL *)_url; +- (NSArray *)subfoldersForURL:(NSURL *)_url password:(NSString *)_pwd; + +@end + +#endif /* __Mailer_SOGoMailManager_H__ */ diff --git a/SOGo/SoObjects/Mailer/SOGoMailManager.m b/SOGo/SoObjects/Mailer/SOGoMailManager.m new file mode 100644 index 00000000..00b0cc42 --- /dev/null +++ b/SOGo/SoObjects/Mailer/SOGoMailManager.m @@ -0,0 +1,144 @@ +/* + Copyright (C) 2004 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo 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. +*/ + +#include "SOGoMailManager.h" +#include "common.h" + +@implementation SOGoMailManager + +static BOOL debugOn = YES; + ++ (id)defaultMailManager { + static SOGoMailManager *manager = nil; // THREAD + if (manager == nil) + manager = [[self alloc] init]; + return manager; +} + +- (void)dealloc { + [super dealloc]; +} + +/* client object */ + +- (NGImap4Client *)imap4ClientForURL:(NSURL *)_url password:(NSString *)_pwd { + // TODO: move to some global IMAP4 connection pool manager + NGImap4Client *client; + NSDictionary *result; + + if (_url == nil) + return nil; + + if ((client = [NGImap4Client clientWithURL:_url]) == nil) + return nil; + + result = [client login:[_url user] password:_pwd]; + if (![[result valueForKey:@"result"] boolValue]) { + [self logWithFormat:@"ERROR: IMAP4 login failed!"]; + return nil; + } + + return client; +} + +/* folder hierarchy */ + +- (NSArray *)_getDirectChildren:(NSArray *)_array folderName:(NSString *)_fn { + // TODO: we should get the full list of folders _once_ and work on that + // (we could cache it in the context) + NSMutableArray *ma; + unsigned i, count, prefixlen; + + if ((count = [_array count]) < 2) + /* one entry is the folder itself, so we need at least two */ + return [NSArray array]; + + prefixlen = [_fn length] + 1; + ma = [NSMutableArray arrayWithCapacity:count]; + for (i = 0; i < count; i++) { + NSString *p; + + p = [_array objectAtIndex:i]; + if ([p length] <= prefixlen) + continue; + p = [p substringFromIndex:prefixlen]; + + if ([p rangeOfString:@"/"].length > 0) + continue; + + [ma addObject:p]; + } + + [ma sortUsingSelector:@selector(compare:)]; + return ma; +} + +- (NSString *)imap4Separator { + return @"."; +} + +- (NSString *)imap4FolderNameForURL:(NSURL *)_url { + /* a bit hackish, but should be OK */ + NSString *folderName; + + if (_url == nil) + return nil; + + folderName = [_url path]; + if ([folderName length] == 0) + return nil; + if ([folderName characterAtIndex:0] == '/') + folderName = [folderName substringFromIndex:1]; + + return [[folderName pathComponents] componentsJoinedByString: + [self imap4Separator]]; +} + +- (NSArray *)subfoldersForURL:(NSURL *)_url password:(NSString *)_pwd { + // TODO: add caching + NGImap4Client *client; + NSDictionary *result; + NSString *folderName; + + if ((client = [self imap4ClientForURL:_url password:_pwd]) == nil) + return nil; + + folderName = [self imap4FolderNameForURL:_url]; + + /* maybe we want to use a cache over here */ + result = [client list:folderName pattern:@"*"]; + if (![[result valueForKey:@"result"] boolValue]) { + [self logWithFormat:@"ERROR: listing of folder failed!"]; + return nil; + } + + /* extract list */ + result = [result valueForKey:@"list"]; + return [self _getDirectChildren:[result allKeys] folderName:folderName]; +} + +/* debugging */ + +- (BOOL)isDebuggingEnabled { + return debugOn; +} + +@end /* SOGoMailManager */ diff --git a/SOGo/SoObjects/Mailer/Version b/SOGo/SoObjects/Mailer/Version index 28292b54..81be7eb6 100644 --- a/SOGo/SoObjects/Mailer/Version +++ b/SOGo/SoObjects/Mailer/Version @@ -1,3 +1,3 @@ # $Id$ -SUBMINOR_VERSION:=8 +SUBMINOR_VERSION:=9 diff --git a/SOGo/UI/Mailer/Images/tbtv_account_17x17.gif b/SOGo/UI/Mailer/Images/tbtv_account_17x17.gif new file mode 100644 index 0000000000000000000000000000000000000000..fbbdd1e24b0257062a08d36173f9cc445e7798ef GIT binary patch literal 1077 zcmd_pk5f_y0KoBQc^&Rb>1ub*d6!mq+q$}Sw{AaLyUle(-p$5MS((!DOpKpuYO%FT zA(MO7g+Ea0<&Qv9eBywF`6!c86L2tiqUhOxJPOf8Ve&G66tDU__POuB@TI07`uZDi zGq4#5ssZ{@5re^CGMU+oi`h9yb}o{0LY2+z%w-~AL3u9N#b&c}3vMt9Zg9C=9*+mI zw0u4vEYJu9f_jj~I@QDCD)QKdqN1WaPG50xF_S+4@(1`lgkK1A3fr%*cq`^B9W9-j@>$!2SHGw#8W8oBIO)Ob?2Xz z0;n35N~O>h1A39CgGy>@&^wU81aTT08x2yST;2o2u)eOsBrP?{{y5+A^nRUiNG7aM zgyl{D$eWz9=81k-q)=Gw@Y#EMx)VcwKp{n zT?jPRU8C3QQQeSPuS8MQr>VMw+NS!h_uhT%y?wRSy5=@1+$N=OpnYUy#B4TCKj^U8 zY@SghVD7Tp?XwouZ7kw&IGj#r|M=33LxW-1OKa2USTNxDYx(aMn=6bvR8IF(+^Kpt zb}QiSTX5;--Tjd%gU93XdcBcpqtE9frqut=%zAub&!dI#jFs@{L;mqc!RLhkZZH^} zo11$%hvD;+MDPLr-wYA5hn_F5geO-Q+-ol;*A}OU#fjIE=~di^W96p^Ic4mWEH*2Jnw~)eb_4Icp9CO9funKB zhjog<%FFdoEt%p<6T@=8m8KMlcPFg$>=m!Kk`g{RPTH7n+4S+g%)F5C$3Wbc)NM?X zL3U^Y*?)NP+Aaz=6W+G-0;#OD`f~CYwP)-7hCrlxjTalls{$rQ+J&tLncbkmZFY}c6?+#>(miHo4)e3+M3kGXLj0 z;!kwbk^*t#55GUM(6Fq2GL)FnuqTpX_+%q=FLl3h=i))?m5)9<(g38z3^&usBp?wJ xrLBvJ-~LmgW{|3+XONS1Kdi4x*ejUD;BpJCi!RgMH-eN+Z8Ri)-G*4;+qd?q(dPgF literal 0 HcmV?d00001 diff --git a/SOGo/UI/Mailer/Images/tbtv_drafts_17x17.gif b/SOGo/UI/Mailer/Images/tbtv_drafts_17x17.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6a82e6c66723c0c464b9dd80476f31f8168b9df GIT binary patch literal 1084 zcmdVZ{Zra?0KoCDb$OWGa&_x$?Jn@nnz>uM9(MC`m$o_cc6DxfJ9_v5EoDQ8Hr<9b zLqwdzJqQXDb-@&w$UK;UO&A5gLiJ;sbd+1 zd!fD1`V@5TTmk-DI)TU}5IH0gsiLH^f>eBsh`)THh*-)XlgZ`f<)vj!#4bau zesy&N`O4!;N_P#Vv6)gtrBZ8ZyXx!fo2hgPW2~B?YGts5jFOwXZVjK(Bd50iTGxPGJoxaKRkd z`bVI*_-9vvZe`PKHfvWm=WP+A#b>ctLe>ZKYrtx?{;vcYAFI1h!7Mw4}=H`8o4;_Mb{Wl4O zi9w8n1E0$TO8QjtWG(K&>z~!--)_X8$ss(KZSD?*KZa>8@dFe&F zBoX&c=FvxaGz(q!X(t|DxSZJf+N&3_sTo;V=8@cQC~E^br@850<(y<#34(fT;jruA zB_oN`cZl+a_n-_q{T_|mJ8_oLSI~p)8W}p0o$|-~v@wtW&3!X1Ehm1#Ym!p#&wNee zwRbMmr(M7E_FJ{dIzfsq>${>C@|Yj3CdThS-e8brHDD!atoXRLq}6!#$L0HzaG28R z?({uE3T^P+J3P$M1XBhblYb!n*axp*o)AuEpFR9#W>Pa$SNAfusy5Bgw1=69BPC?U OeW*@K#mB`#pZp6-UFj46 literal 0 HcmV?d00001 diff --git a/SOGo/UI/Mailer/Images/tbtv_inbox_17x17.gif b/SOGo/UI/Mailer/Images/tbtv_inbox_17x17.gif new file mode 100644 index 0000000000000000000000000000000000000000..745709d309f8df7b2d6cf7ec18d6e7cd7133e252 GIT binary patch literal 1093 zcmdVZ4O5Z_003a@rZacm>2}#}dON7w?N;7Scjd}fmwC(d+MS+Gt-K{3OjIBRZZcyL z@)FsBhn&QbU#UpNl=zTI5F0NVDjy;Oi9tdr7|ay3HqNhi+t1kZAD)83^CwOsQ(>vF zl?m9jyqxk%WW{B4#T8UV)sM9DysOB%YGfU);ym$(D<~AIrk04pkm~E}8yXtwuml_q zhrvIY5Ct#X>Vo*sW($CD6mKG7NltQ62Q`pxjx2aU>bt>zZ zR?dx9PB#Tbr_+JfTMx-q002+{9)rPPGMPXdpT%M^SzW_)9Gi2O-O>Ai-NfnWm9-H$ zojp7rZ?wIc&*uvS0;5QrK?vY=#yypH}3UG#ssb1{ZdUAL(#_;3WXw(2)uu5 zx)%V2)FJVc5wY;WutqAC%49OruWY$oJ|YJt3Q#pVFePn&JUVWXa2>;Jhon<6X0Ryu zDwRs1GFX*evt#$HV?8cqr~0X0rq2ZEp$v}*OU z&OiDcI?=p-(5)NNPdXMRL|(nnJ^9dRG`gmwCX>l!lueo!%x3dTqu64xyqZ!jnxtOK z@QP9Fvy8aSdhd+XH#6$7s?D}VpLHx~9ktu-ew*4mH)(smwCwnO*{KQ6>zxb1z=Gkq zd&TW`hg}mMk0<0Y1U-)MOM~0Dy6&Cu`~7cT8JCup*8MhLAQ}h+)&sNA;LQ4pEBe|Q z4b4YG?r=D~5qc2``Jva(c0$u{!;5cMU#zXI?Y*)59a)J*{qLe{8yg#&o13v%4BA?P zwt`z*ThMk0+Wr&TUWInnpq&V`6W!g}hITih-FMLc5Mu8@J^_s+p;7SWIuZt6hC#y% z3co9cWy1dTUlLg29;|JD#s%qpke>KK!l3d<>EUxyd~)XTP|Bw#s(&LR=)t6vF9#A5 zxb!0D7o~&8^7g$K-}p5!O`-pPnHqoz`S7Sajwu-8u#si z&*H!FAkt{ltn9L)s-8;;+fl#QK@$tLaya?t9FCCC9e3(=obLI5z< zjIa9(PQi2hq_A`3D&ID@JdVvyE561(R#3z_n4XrB*a(l8m7V$Ob~U{EChh$scw=?b gcw%~u`pkzXFQw`k?T1SokxQgUrQ*wRaj;YW04>MFWB>pF literal 0 HcmV?d00001 diff --git a/SOGo/UI/Mailer/Images/tbtv_junction2_17x17.gif b/SOGo/UI/Mailer/Images/tbtv_junction2_17x17.gif new file mode 100644 index 0000000000000000000000000000000000000000..f3c22703871340588c478726ab5bf90f15b2a7c0 GIT binary patch literal 82 zcmZ?wbhEHb6l4%&XkcV$XlVHV|G(ltQRkx6#FEq$h4Rdj426)4R0VfW-v9<31|R?_ iWnhx%sc$&__UEFO&1R{_Au-->A`>inQ&OZ@8LR0inD`oGki;7hA@?k)UzE>v-O@1jl-25SI8i5yt~ literal 0 HcmV?d00001 diff --git a/SOGo/UI/Mailer/Images/tbtv_leaf_corner_17x17.gif b/SOGo/UI/Mailer/Images/tbtv_leaf_corner_17x17.gif new file mode 100644 index 0000000000000000000000000000000000000000..33c9708add5205e286fdeff727ea8d95301393ed GIT binary patch literal 625 zcmZ?wbhEHb6l4%&I99??8y%3Hot=}Dlbf5HmzP&vUA-I4WyAMcGn*%y6k zLd@xjF=r;no}ChVeroKwX>sSL$6cHie|}clrMdB!=O)~ro_J+`!j%Py7Z+q*UXXot zVdAyLDQnlRUB7<)%@wH|Hf*@LGX46>{7suSom@Nf;o6eZTjzgSoB3sX&d;sckM_1* z-?QrBz6m$?t^Bt$_urnp$A@P=Ju><3(bbQSEjV-L%;OWQex0efa^=dkYuEl>YJPWp z&d*zo|F3m@ztep8?%f|xdp|wi^XJ*jr%#`LdA954tGUmgKY#J!#mkp3f4^V*|NV+T zA2xh@d+F=zCqF)({_|z;j}OoOemnmE@8Z8d&iwyz{O`|me}CTm{{8#^|NDOY`0@AG z(?37H{`~p#|DUJ-{@wlm|MvfXK*p>8|9|`^0x13ybuLOxEJ;mKD9Duo=xooi)6>*;3D4?ub0inD`oGki;7hA@?m2#bT|0G0YZ4=aH2@>!8`uB< literal 0 HcmV?d00001 diff --git a/SOGo/UI/Mailer/Images/tbtv_minus_17x17.gif b/SOGo/UI/Mailer/Images/tbtv_minus_17x17.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca17de65f053d25dc9991306880766fd617ac0a3 GIT binary patch literal 122 zcmZ?wbhEHb6l4%&IK;vL1a)R*HDrg>#!hwZ6;Y0z+R zt%Pook&%*;lCg<%larH_l$4c~m3@}qw2pVPka~@l!=06;wUmB?o8q{Xe7BZ>yO@8d zoS=}P&b*m`zn_J|poPGsi_C zX>@2HRA^-&M@dak04x9i000pH5dZ)O+JJR}gM@{Kbx&4dYKMho85cTSXpMtrGZYan zT4sk*O-o5cCJzoLG%znKS7L%G85R^04-5tcJVR9^9aMrNv9q-U04+JFFDO@aNpVed zayJ73M{R3Gxg;QUL~u)UHUk1k)oB|WK_3WpLT^cI1OiIrXXZZ~2X#Jf+)h*TV_?2` z(SUD98+LA>Ffjt82aXtCx?sSUV~xIl0V8gyfUgD&gKHQ%jKQMB7AzC+W${ok%^83K oyPS*y0UwzwGE%7^@qvQ|3>79oP_ST7mJkaPC|$a=frvl=JBEL8r2qf` literal 0 HcmV?d00001 diff --git a/SOGo/UI/Mailer/Images/tbtv_trash_17x17.gif b/SOGo/UI/Mailer/Images/tbtv_trash_17x17.gif new file mode 100644 index 0000000000000000000000000000000000000000..da3c01a774d8cd1ab39c58e142b82c70912974c3 GIT binary patch literal 1119 zcmZ?wbhEHb6l4%&cs`RMGBPqQE-pSkJ|Q7Ny<09RDM_neF+Dv!J3BikCr5vlivAoG ztp&0L1qFqLg(W2=rKP21Wo6~%gww2>swk{;ub}; zwY7O|vh&zx-O{?S_lCrp?yY0{+0lPBkFNSiWc zO7ubhY15|7m@y-JSJKRxGs`v?r0yb>6&r^XJcBxNu?3p0e_T z`HL1UTD*Aik|j%)FJHc5#fsXKB`a61T(xS|j2%-~uU@@o&6;)V)~#Q^e#3?h3-->N zc68#VO`A4v-n?bYmaSX2uHC(+=SuUsy=%8`-@aqVj$ONU?cTk6&z?Q&kFVXkckjM^ z`}XhOzv$ZRg9i`pKECVFp+kocA3l2Y=&@tRjvqgM;>3x47j~aKdGge$Q>Ra#K6B>G z*|TTQojZ5_{Q2WokM6&-`@)3_7cXACbm`LN%a^ZQxpMl>$*WhdUb}Yf;;oBEo*cM- z{rZg?H*Vg%dHeS5J9qBfzkmPk!#kH>UVQlQ;iE^79zS{f z=rvy|OEiU*)Lpl2@HBqrJxwd`+ZxAD%mK@!N*}FI6joCbQBA&5aC0G}$1+~8GaV0$ zR8I-1I4*EFDU{CA>SOROp@iwEmxM_Uo8%|u=S|H%+I+m9l1~JwdRA3^s5rcYhlzV; zU(ZA1cD|*a!FCG*5)K@h#Gq;nF_xn z2^$(*6|`Bs{s{iya1qt1f1{E0*@$hJ2*ZdG7<&n|a lqY>CLVS|E$Q=i2|4zE>@otarUCD%M~k!}xA3UFYs1^{S);~D?} literal 0 HcmV?d00001 -- 2.39.5