author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Thu, 07 Jan 2010 12:38:38 +0200 | |
changeset 1 | 12c456ceeff2 |
parent 0 | 8466d47a6819 |
child 2 | 5253a20d2a1e |
--- a/emailcontacts/contactactionservice/data/FscActionUtils.rss Thu Dec 17 08:39:21 2009 +0200 +++ b/emailcontacts/contactactionservice/data/FscActionUtils.rss Thu Jan 07 12:38:38 2010 +0200 @@ -376,6 +376,15 @@ EVPbkVersitParamVOIP }; extensionName = "X-SIP"; + }, + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameX; + extensionName = "X-SIP"; + }, + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; } }; }
--- a/emailservices/emailclientapi/inc/emailclientapiimpl.hrh Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailclientapi/inc/emailclientapiimpl.hrh Thu Jan 07 12:38:38 2010 +0200 @@ -24,4 +24,4 @@ #endif // _EMAILCLIENTAPIIMPL_HRH -// End of file. \ No newline at end of file +// End of file.
--- a/emailservices/emailframework/commonlib/inc/CFSMailCommon.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailframework/commonlib/inc/CFSMailCommon.h Thu Jan 07 12:38:38 2010 +0200 @@ -240,11 +240,11 @@ public: inline TFSMailMsgId( ) // constructs NULL id - { iPluginId.iUid = 0; iId = 0; iNullId = ETrue; }; + { iPluginId.iUid = 0; iId = 0; iNullId = ETrue; iSeparator = EFalse; }; inline TFSMailMsgId(TUid aPluginId, TUint aId) - { iPluginId = aPluginId; iId = aId; iNullId = EFalse; }; + { iPluginId = aPluginId; iId = aId; iNullId = EFalse; iSeparator = EFalse; }; inline TFSMailMsgId(TUint aPluginId, TUint aId) - { iPluginId.iUid = aPluginId; iId = aId; iNullId = EFalse; }; + { iPluginId.iUid = aPluginId; iId = aId; iNullId = EFalse; iSeparator = EFalse; }; inline TBool operator==(TFSMailMsgId aId) const { if(iNullId != aId.IsNullId()) return EFalse; if(iPluginId.iUid != aId.PluginId().iUid) return EFalse; @@ -259,12 +259,14 @@ inline TUint Id() const { return iId; }; inline void SetPluginId(TUid aPluginId) { iPluginId = aPluginId; iNullId = EFalse; }; inline void SetId(TUint aId) { iId = aId; iNullId = EFalse; }; - + inline void SetSeparator( TBool aSeparator ) { iSeparator = aSeparator; } + inline TBool IsSeparator() const { return iSeparator; } protected: TBool iNullId; TUid iPluginId; // ecom implementation id TUint iId; // message, folder, mailbox id + TBool iSeparator; // if object is separator }; /* Predefined constants for ContentTypes and parameters for ContentType and ContentDisposition */
--- a/emailservices/emailframework/commonlib/src/CFSMailPluginData.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailframework/commonlib/src/CFSMailPluginData.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -37,6 +37,7 @@ if(iPlugin) { delete iPlugin; + iPlugin = NULL; CFSMailPlugin::Close(); } }
--- a/emailservices/emailframework/data/microsoft.svg Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailframework/data/microsoft.svg Thu Jan 07 12:38:38 2010 +0200 @@ -1,82 +1,429 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="44" height="44" viewBox="105.585 74.074 44 44"> -<rect fill="none" height="44" width="44" x="105.585" y="74.074"/> -<linearGradient id="SVGID_2" gradientUnits="userSpaceOnUse" x1="117.14" y1="94.11" x2="146.99" y2="94.11"> -<stop stop-color="#A5D288" offset="0"/> -<stop stop-color="#A2D085" offset="0.27"/> -<stop stop-color="#9BCA7D" offset="0.48"/> -<stop stop-color="#8EC06F" offset="0.68"/> -<stop stop-color="#7EB55D" offset="0.87"/> -<stop stop-color="#6EAA4F" offset="1"/> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"> +<rect fill="none" height="24" width="24"/> +<path fill="#FFFFFF" d="M20.024,19.734c0,0.297-0.238,0.489-0.497,0.489c-0.262,0-0.49-0.185-0.49-0.483c0-0.258,0.197-0.491,0.494-0.491C19.797,19.249,20.024,19.439,20.024,19.734z M19.964,19.738c0-0.248-0.188-0.435-0.433-0.435c-0.252,0-0.438,0.187-0.438,0.435c0,0.252,0.205,0.438,0.438,0.438C19.783,20.176,19.964,19.975,19.964,19.738z M19.769,20.045h-0.106l-0.069-0.151c-0.033-0.074-0.07-0.112-0.11-0.112h-0.06v0.264h-0.088v-0.626h0.177c0.119,0,0.229,0.044,0.229,0.171c0,0.074-0.05,0.146-0.158,0.171v0.002c0.033,0.009,0.07,0.048,0.104,0.117L19.769,20.045z M19.647,19.6c0-0.066-0.034-0.106-0.145-0.106h-0.079v0.213h0.094C19.604,19.706,19.647,19.672,19.647,19.6z"/> +<radialGradient id="SVGID_1" gradientUnits="userSpaceOnUse" cx="12.33" cy="13.53" r="9.43"> +<stop stop-color="#FFFFFF" offset="0.25"/> +<stop stop-color="#000000" offset="1"/> +</radialGradient> +<path opacity="0.2" fill="url(#SVGID_1)" enable-background="new " d="M3.988,12.398c-0.017,0.01-0.026,0.008-0.038,0.04l-1.926,6.53c-0.011,0.033,0.008,0.068,0.031,0.09c0,0,0.131,0.096,0.133,0.097c0.041,0.028,0.065,0.019,0.078,0.017c3.298-1.234,5.002-0.924,7.124,0.389l0.004,0.006l0,0c0.01,0.005,0.042,0.02,0.071,0.007c0,0,0.084-0.05,0.109-0.064l0,0l0.009-0.007c0.018-0.012,0.042-0.028,0.048-0.058l0.002-0.007l0,0c0.004-0.011,1.983-6.575,1.983-6.575c0.007-0.03-0.006-0.063-0.03-0.082C9.031,11.105,6.954,11.21,3.988,12.398z M12.394,13.491c-0.038,0.026-0.135,0.091-0.152,0.141L10.313,20.1c-0.035,0.098,0.055,0.151,0.066,0.156c2.595,1.692,5.201,1.686,8.082,0.491c0.002,0,0.049-0.029,0.064-0.061c0-0.002,1.885-6.365,1.885-6.367c0.01-0.052-0.004-0.085-0.031-0.114l-0.158-0.123c-0.01-0.011-0.037-0.028-0.105-0.019c-3.7,1.216-5.648,0.668-7.571-0.587C12.505,13.455,12.458,13.447,12.394,13.491z M14.678,5.58c-0.074,0.054-0.139,0.096-0.156,0.156l-1.936,6.485c-0.017,0.067-0.006,0.105,0.06,0.149c2.486,1.691,5.264,1.702,8.062,0.487c0.027-0.009,0.053-0.034,0.066-0.062c0-0.001,1.967-6.543,1.967-6.543c0.021-0.074-0.03-0.124-0.09-0.175c-0.026-0.024-0.063-0.057-0.088-0.067c-0.055-0.024-0.108-0.017-0.124-0.007c-0.001,0-0.002,0-0.002,0l0,0c-3.356,1.343-5.374,1.029-7.61-0.439C14.768,5.54,14.74,5.542,14.678,5.58z M6.245,4.441L6.245,4.441C6.239,4.443,6.217,4.451,6.209,4.48l-1.955,6.549c-0.009,0.032,0.002,0.083,0.026,0.101c0.002,0.002,0.147,0.109,0.15,0.111c0.036,0.014,0.028,0.011,0.098-0.012c3.296-1.268,5.097-0.888,7.107,0.354c0.039,0.021,0.064,0.025,0.089,0.019l0.123-0.053c0.016-0.009,0.037-0.021,0.053-0.063l1.952-6.53c0.006-0.024,0.003-0.058-0.025-0.079C11.438,3.206,9.207,3.261,6.245,4.441z"/> +<path fill="#FFFFFF" d="M17.984,20.216c0.02-0.011,0.051-0.038,0.061-0.063c0,0,1.875-6.541,1.877-6.543l-0.002-0.003l0,0c0.002-0.011,0.002-0.021,0.002-0.028c0-0.054-0.031-0.086-0.033-0.086c0.002,0-0.154-0.126-0.154-0.126l0,0l0,0c-0.012-0.012-0.039-0.028-0.108-0.021C19.359,13.453,16.719,20.688,17.984,20.216z M20.226,12.327c0.014-0.009,0.052-0.028,0.066-0.063l1.957-6.724c0.021-0.074-0.034-0.135-0.089-0.183c-0.092-0.093-0.152-0.097-0.215-0.074C21.873,5.362,18.964,12.428,20.226,12.327z"/> +<radialGradient id="SVGID_2" gradientUnits="userSpaceOnUse" cx="11.6" cy="11.99" r="10.38"> +<stop stop-color="#D1E7ED" offset="0"/> +<stop stop-color="#CDE4EC" offset="0.1"/> +<stop stop-color="#C0DCE7" offset="0.2"/> +<stop stop-color="#ADD0E1" offset="0.3"/> +<stop stop-color="#3982B1" offset="0.65"/> +<stop stop-color="#3474AA" offset="0.72"/> +<stop stop-color="#285699" offset="0.9"/> +<stop stop-color="#244B93" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_2)" d="M3.534,11.72c3.933-1.621,5.839-0.756,7.543,0.403l-1.969,6.769c-1.712-1.15-3.574-2.097-7.522-0.465l1.925-6.697L3.534,11.72z"/> +<radialGradient id="SVGID_3" gradientUnits="userSpaceOnUse" cx="11.79" cy="11.82" r="10.63"> +<stop stop-color="#D8EEED" offset="0"/> +<stop stop-color="#98D8D7" offset="0.17"/> +<stop stop-color="#8ED3D3" offset="0.22"/> +<stop stop-color="#74C6CA" offset="0.31"/> +<stop stop-color="#49B1BA" offset="0.42"/> +<stop stop-color="#3BAAB5" offset="0.45"/> +<stop stop-color="#2D81A4" offset="0.56"/> +<stop stop-color="#215B94" offset="0.68"/> +<stop stop-color="#19448B" offset="0.78"/> +<stop stop-color="#163B87" offset="0.84"/> +<stop stop-color="#0B317D" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_3)" d="M1.729,18.626c0.012,0.003,0.037-0.012,0.037-0.012c0.026,0.021,0.05,0.033,0.05,0.033S1.772,18.656,1.729,18.626z"/> +<path fill="#152469" d="M9.04,18.969c0,0,0.027,0.022,0.057,0.017l-0.118,0.069c-0.037,0.019-0.077-0.01-0.077-0.01L9.04,18.969z"/> +<radialGradient id="SVGID_4" gradientUnits="userSpaceOnUse" cx="11.61" cy="12.07" r="10.38"> +<stop stop-color="#D8EEED" offset="0"/> +<stop stop-color="#98D8D7" offset="0.17"/> +<stop stop-color="#8ED3D3" offset="0.22"/> +<stop stop-color="#74C6CA" offset="0.31"/> +<stop stop-color="#49B1BA" offset="0.42"/> +<stop stop-color="#3BAAB5" offset="0.45"/> +<stop stop-color="#2D81A4" offset="0.56"/> +<stop stop-color="#215B94" offset="0.68"/> +<stop stop-color="#19448B" offset="0.78"/> +<stop stop-color="#163B87" offset="0.84"/> +<stop stop-color="#152469" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_4)" d="M1.769,18.616c0,0-0.022,0.011-0.036,0.011l-0.129-0.101l-0.003-0.001c0.021,0.004,0.041,0.001,0.048,0.001L1.769,18.616z"/> +<path fill="#152469" d="M9.106,18.873c0.014,0.01,0.028,0.021,0.04,0.048c-0.006,0.035-0.034,0.052-0.052,0.066c-0.024,0.005-0.058-0.019-0.058-0.019C9.054,18.954,9.086,18.931,9.106,18.873z"/> +<path fill="#172E65" d="M1.603,18.527c-0.026-0.021-0.042-0.059-0.032-0.094l0.023-0.009c-0.009,0.05,0.028,0.086,0.052,0.102C1.646,18.527,1.626,18.535,1.603,18.527z"/> +<radialGradient id="SVGID_5" gradientUnits="userSpaceOnUse" cx="11.6" cy="11.96" r="10.42"> +<stop stop-color="#D8EEED" offset="0"/> +<stop stop-color="#98D8D7" offset="0.17"/> +<stop stop-color="#8ED3D3" offset="0.22"/> +<stop stop-color="#74C6CA" offset="0.31"/> +<stop stop-color="#49B1BA" offset="0.42"/> +<stop stop-color="#3BAAB5" offset="0.45"/> +<stop stop-color="#2D81A4" offset="0.56"/> +<stop stop-color="#215B94" offset="0.68"/> +<stop stop-color="#19448B" offset="0.78"/> +<stop stop-color="#163B87" offset="0.84"/> +<stop stop-color="#0B317D" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_5)" d="M1.761,18.609c3.757-1.468,5.44-0.668,7.152,0.433c-1.025-0.659-2.079-1.185-3.534-1.195c-0.975-0.007-2.125,0.24-3.566,0.801C1.813,18.647,1.783,18.635,1.761,18.609z"/> +<path fill="#094B8F" d="M9.039,18.973c-1.712-1.151-3.485-2.031-7.389-0.445c-0.025-0.016-0.068-0.056-0.057-0.104c3.962-1.688,5.804-0.703,7.517,0.448C9.093,18.937,9.058,18.957,9.039,18.973z"/> +<path fill="#094B8F" d="M9.041,18.973l-0.139,0.071c-1.711-1.1-3.443-1.862-7.133-0.429l-0.123-0.089C5.551,16.94,7.328,17.822,9.041,18.973z"/> +<linearGradient id="SVGID_6" gradientUnits="userSpaceOnUse" x1="11.03" y1="12.31" x2="9.4" y2="18.02"> +<stop stop-color="#98D8D7" offset="0"/> +<stop stop-color="#152469" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_6)" d="M9.106,18.876l1.971-6.754c0.022,0.015,0.034,0.024,0.044,0.038l-1.975,6.764C9.136,18.892,9.106,18.876,9.106,18.876z"/> +<radialGradient id="SVGID_7" gradientUnits="userSpaceOnUse" cx="11.61" cy="11.96" r="10.6"> +<stop stop-color="#D8EEED" offset="0"/> +<stop stop-color="#98D8D7" offset="0.17"/> +<stop stop-color="#8ED3D3" offset="0.22"/> +<stop stop-color="#74C6CA" offset="0.31"/> +<stop stop-color="#49B1BA" offset="0.42"/> +<stop stop-color="#3BAAB5" offset="0.45"/> +<stop stop-color="#2D81A4" offset="0.56"/> +<stop stop-color="#215B94" offset="0.68"/> +<stop stop-color="#19448B" offset="0.78"/> +<stop stop-color="#163B87" offset="0.84"/> +<stop stop-color="#152469" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_7)" d="M11.09,12.075h0.003c0.024,0.017,0.035,0.052,0.028,0.085v0.003c-0.012-0.011-0.021-0.024-0.044-0.04L11.09,12.075z"/> +<polygon opacity="0.66" fill="#063367" enable-background="new " points="3.489,11.724 3.511,11.729 1.593,18.425 1.57,18.434 "/> +<linearGradient id="SVGID_8" gradientUnits="userSpaceOnUse" x1="1.57" y1="15.19" x2="3.72" y2="15.19"> +<stop stop-color="#DEF3F1" offset="0"/> +<stop stop-color="#5085BC" offset="1"/> +</linearGradient> +<path opacity="0.42" fill="url(#SVGID_8)" enable-background="new " d="M3.489,11.724l-0.09,0.321l-1.826,6.389c-0.011,0.034,0.006,0.072,0.031,0.093l0.129,0.103c0,0,0-0.003,0,0c0.017,0.01,0.034,0.015,0.047,0.018l1.943-6.735L3.72,11.906L3.511,11.73L3.489,11.724z M1.597,18.423v-0.002c0.009-0.004,0.017-0.006,0.027-0.01C1.614,18.415,1.605,18.417,1.597,18.423z M1.646,18.527c-0.013-0.01-0.028-0.021-0.04-0.037C1.618,18.506,1.634,18.518,1.646,18.527C1.646,18.526,1.646,18.526,1.646,18.527z"/> +<linearGradient id="SVGID_9" gradientUnits="userSpaceOnUse" x1="8.93" y1="15.58" x2="11.12" y2="15.58"> +<stop stop-color="#DEF3F1" offset="0"/> +<stop stop-color="#5085BC" offset="1"/> +</linearGradient> +<path opacity="0.42" fill="url(#SVGID_9)" enable-background="new " d="M11.116,12.104l-0.041,0.021l-0.163,0.161c0.001,0,0.001,0,0.001,0.001c-0.267,0.909-1.757,6.004-1.984,6.768c0.015,0.004,0.032,0.006,0.048-0.002l0.119-0.07H9.094c0.017-0.013,0.044-0.03,0.052-0.063c0,0.002,0,0.002,0,0.002l1.91-6.541l0.066-0.224c0.002-0.013,0.002-0.023,0-0.035C11.122,12.117,11.12,12.111,11.116,12.104z"/> +<linearGradient id="SVGID_10" gradientUnits="userSpaceOnUse" x1="3.51" y1="11.53" x2="11.09" y2="11.53"> +<stop stop-color="#094992" offset="0"/> +<stop stop-color="#8ACDE1" offset="0.67"/> +<stop stop-color="#E6F6F9" offset="1"/> </linearGradient> -<polygon fill="url(#SVGID_2)" points="117.137,83.5 117.618,79.434 146.991,86.86 143.509,108.785 141.842,108.246 "/> -<linearGradient id="SVGID_3" gradientUnits="userSpaceOnUse" x1="123.02" y1="75" x2="148.69" y2="104.01"> -<stop stop-color="#BAD986" offset="0"/> -<stop stop-color="#B7D884" offset="0.24"/> -<stop stop-color="#AED27D" offset="0.43"/> -<stop stop-color="#9FCA70" offset="0.61"/> -<stop stop-color="#8CC15E" offset="0.78"/> -<stop stop-color="#70B64B" offset="0.94"/> -<stop stop-color="#63B246" offset="1"/> +<path fill="url(#SVGID_10)" d="M11.077,12.124l-0.164,0.163c-0.566-0.378-2.131-1.349-3.896-1.204C5.583,11.2,4.32,11.661,3.722,11.91l-0.211-0.182l0.015-0.046c3.952-1.634,5.856-0.766,7.566,0.393H11.09h0.003L11.077,12.124z"/> +<linearGradient id="SVGID_11" gradientUnits="userSpaceOnUse" x1="3.53" y1="11.68" x2="3.53" y2="11.68"> +<stop stop-color="#7D9EC4" offset="0"/> +<stop stop-color="#151D89" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_11)" d="M3.526,11.682"/> +<linearGradient id="SVGID_12" gradientUnits="userSpaceOnUse" x1="3.69" y1="11.66" x2="10.94" y2="11.66"> +<stop stop-color="#BAC7E1" offset="0.01"/> +<stop stop-color="#7090C3" offset="0.22"/> +<stop stop-color="#C8EAEF" offset="0.54"/> +<stop stop-color="#FFFFFF" offset="1"/> +</linearGradient> +<path opacity="0.33" fill="url(#SVGID_12)" enable-background="new " d="M3.694,11.886c3.953-1.633,5.716-0.554,7.25,0.372l-0.03,0.029c-1.578-0.978-3.257-1.937-7.192-0.375L3.694,11.886z"/> +<linearGradient id="SVGID_13" gradientUnits="userSpaceOnUse" x1="3.51" y1="11.45" x2="11.09" y2="11.45"> +<stop stop-color="#7090C3" offset="0.01"/> +<stop stop-color="#C0E7ED" offset="0.54"/> +<stop stop-color="#FFFFFF" offset="1"/> +</linearGradient> +<path opacity="0.33" fill="url(#SVGID_13)" enable-background="new " d="M3.526,11.682c3.952-1.634,5.779-0.8,7.567,0.394l-0.016,0.048c-1.877-1.218-3.633-2-7.566-0.395L3.526,11.682z"/> +<radialGradient id="SVGID_14" gradientUnits="userSpaceOnUse" cx="3.5" cy="11.7" r="0.02"> +<stop stop-color="#7D9EC4" offset="0"/> +<stop stop-color="#0A50A1" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_14)" d="M3.511,11.729l-0.022-0.005c0.008-0.028,0.028-0.038,0.034-0.04l0.004-0.001C3.526,11.682,3.522,11.695,3.511,11.729z"/> +<radialGradient id="SVGID_15" gradientUnits="userSpaceOnUse" cx="-1.49" cy="18.16" r="12.8"> +<stop stop-color="#D8EEED" offset="0"/> +<stop stop-color="#98D8D7" offset="0.17"/> +<stop stop-color="#8ED3D3" offset="0.22"/> +<stop stop-color="#74C6CA" offset="0.31"/> +<stop stop-color="#49B1BA" offset="0.42"/> +<stop stop-color="#3BAAB5" offset="0.45"/> +<stop stop-color="#359FB5" offset="0.5"/> +<stop stop-color="#2988B4" offset="0.63"/> +<stop stop-color="#257FB4" offset="0.71"/> +<stop stop-color="#4161AA" offset="1"/> +</radialGradient> +<path opacity="0.5" fill="url(#SVGID_15)" enable-background="new " d="M9.043,18.971c-1.713-1.15-3.485-2.03-7.389-0.445c-0.026-0.015-0.068-0.054-0.058-0.105c3.963-1.688,5.804-0.702,7.518,0.449C9.096,18.935,9.062,18.956,9.043,18.971z"/> +<radialGradient id="SVGID_16" gradientUnits="userSpaceOnUse" cx="11.59" cy="12.21" r="9.66"> +<stop stop-color="#FCF5B0" offset="0"/> +<stop stop-color="#F7EDA0" offset="0.17"/> +<stop stop-color="#F3E591" offset="0.28"/> +<stop stop-color="#FCD118" offset="0.65"/> +<stop stop-color="#F7A50C" offset="0.8"/> +<stop stop-color="#F38603" offset="0.93"/> +<stop stop-color="#F27B00" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_16)" d="M12.108,12.777c1.712,1.149,3.46,1.994,7.481,0.617l-1.877,6.528c-3.945,1.633-5.839,0.71-7.548-0.449L12.108,12.777z"/> +<linearGradient id="SVGID_17" gradientUnits="userSpaceOnUse" x1="18.01" y1="20.07" x2="17.97" y2="20.22"> +<stop stop-color="#DD980D" offset="0"/> +<stop stop-color="#A75D0F" offset="1"/> </linearGradient> -<path d="M141.933,108.094c0.915,0.92-23.651-23.688-24.616-24.655 c0.019-0.151,0.408-3.444,0.448-3.789c0.372,0.094,28.732,7.263,29.031,7.338c-0.048,0.303-3.365,21.184-3.425,21.571 C143.079,108.466,142,108.115,141.933,108.094" fill="url(#SVGID_3)"/> -<path d="M143.032,108.61c-0.094-0.016-0.594-0.188-0.594-0.188s1.33-20.618,1.551-20.618l0.277,0.04 c0.222,0,0.4,0.179,0.4,0.4L143.032,108.61z" fill-opacity="0.24" /> -<linearGradient id="SVGID_7" gradientUnits="userSpaceOnUse" x1="114.32" y1="96.34" x2="144.22" y2="96.34"> -<stop stop-color="#FBAF4B" offset="0"/> -<stop stop-color="#FBAD48" offset="0.31"/> -<stop stop-color="#FAA53E" offset="0.56"/> -<stop stop-color="#F89930" offset="0.8"/> -<stop stop-color="#F6891F" offset="1"/> +<path fill="url(#SVGID_17)" d="M18.047,20.155c-0.02,0.037-0.053,0.058-0.063,0.063c-0.004,0-0.004,0.002-0.004,0.002s-0.035,0.002-0.064-0.021c0.076-0.043,0.1-0.127,0.1-0.127S18.061,20.113,18.047,20.155z"/> +<linearGradient id="SVGID_18" gradientUnits="userSpaceOnUse" x1="18.01" y1="16.86" x2="19.92" y2="16.86"> +<stop stop-color="#DEB150" offset="0"/> +<stop stop-color="#FFF8B2" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_18)" d="M18.047,20.155c0.008-0.037-0.035-0.069-0.035-0.069l1.871-6.522c0,0,0.03,0.027,0.041,0.05L18.047,20.155z"/> +<linearGradient id="SVGID_19" gradientUnits="userSpaceOnUse" x1="19.9" y1="13.49" x2="19.9" y2="13.62"> +<stop stop-color="#C67C0C" offset="0.01"/> +<stop stop-color="#DD980D" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_19)" d="M19.922,13.614c0,0-0.008-0.02-0.041-0.046c0.018-0.064,0.006-0.076,0.006-0.076l0.005,0.002C19.891,13.494,19.939,13.539,19.922,13.614z"/> +<linearGradient id="SVGID_20" gradientUnits="userSpaceOnUse" x1="19.63" y1="13.34" x2="19.7" y2="13.47"> +<stop stop-color="#FED30E" offset="0.01"/> +<stop stop-color="#A75D0F" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_20)" d="M19.734,13.458c0,0-0.051-0.063-0.156-0.045c0.004-0.023,0.014-0.052,0.047-0.064c0.064-0.011,0.094,0.006,0.107,0.021c0.008,0.008,0.012,0.014,0.012,0.014C19.752,13.42,19.734,13.458,19.734,13.458z"/> +<linearGradient id="SVGID_21" gradientUnits="userSpaceOnUse" x1="19.83" y1="13.45" x2="19.78" y2="13.5"> +<stop stop-color="#FED30E" offset="0.01"/> +<stop stop-color="#A75D0F" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_21)" d="M19.732,13.368l0.156,0.126c0.01,0.041-0.008,0.083-0.008,0.083l-0.154-0.123C19.729,13.454,19.744,13.405,19.732,13.368z"/> +<polygon opacity="0.66" fill="#B37E00" enable-background="new " points="17.844,19.965 19.727,13.444 19.885,13.569 18.016,20.09 18.01,20.107 "/> +<linearGradient id="SVGID_22" gradientUnits="userSpaceOnUse" x1="12.09" y1="13.44" x2="19.63" y2="13.44"> +<stop stop-color="#FFF8FB" offset="0"/> +<stop stop-color="#FEC236" offset="1"/> </linearGradient> -<polygon fill="url(#SVGID_7)" points="114.318,87.056 114.516,82.685 144.223,87.005 142.486,109.992 139.294,109.096 114.347,87.143 "/> -<linearGradient id="SVGID_8" gradientUnits="userSpaceOnUse" x1="119.66" y1="77.69" x2="147.3" y2="104.68"> -<stop stop-color="#FDC27F" offset="0"/> -<stop stop-color="#FDC17D" offset="0.22"/> -<stop stop-color="#FBBD76" offset="0.41"/> -<stop stop-color="#F9B668" offset="0.57"/> -<stop stop-color="#F7AD54" offset="0.73"/> -<stop stop-color="#F4A138" offset="0.88"/> -<stop stop-color="#F19720" offset="1"/> +<path fill="url(#SVGID_22)" d="M19.584,13.42c-3.961,1.353-5.776,0.549-7.485-0.604c0.004-0.012,0.01-0.042-0.008-0.07c1.71,1.149,3.603,1.935,7.535,0.604C19.596,13.368,19.592,13.396,19.584,13.42z"/> +<polygon fill="#D9A200" points="11.791,12.896 11.923,12.808 10.019,19.45 9.869,19.567 9.869,19.552 "/> +<linearGradient id="SVGID_23" gradientUnits="userSpaceOnUse" x1="18.8" y1="16.71" x2="18.63" y2="16.66"> +<stop stop-color="#B37E00" offset="0"/> +<stop stop-color="#FF9E00" offset="1"/> +</linearGradient> +<path opacity="0.66" fill="url(#SVGID_23)" enable-background="new " d="M17.693,19.929l1.886-6.518c0.003,0,0.007-0.006,0.011-0.006c0.098-0.011,0.145,0.042,0.145,0.042l-1.875,6.51C17.857,19.957,17.779,19.895,17.693,19.929z"/> +<path fill="#A75D0F" d="M17.982,20.219c-3.867,1.654-6.351,0.635-8.061-0.516l0.018-0.014c1.71,1.15,4.342,2.109,7.977,0.505C17.943,20.217,17.982,20.219,17.982,20.219z"/> +<linearGradient id="SVGID_24" gradientUnits="userSpaceOnUse" x1="17.92" y1="19.99" x2="17.84" y2="20.17"> +<stop stop-color="#FFD100" offset="0.01"/> +<stop stop-color="#A8710A" offset="1"/> +</linearGradient> +<path opacity="0.66" fill="url(#SVGID_24)" enable-background="new " d="M17.857,19.955l0.158,0.136c0,0-0.021,0.077-0.109,0.112l-0.161-0.134C17.832,20.033,17.857,19.955,17.857,19.955z"/> +<linearGradient id="SVGID_25" gradientUnits="userSpaceOnUse" x1="10.1" y1="20.18" x2="17.78" y2="20.18"> +<stop stop-color="#DD980D" offset="0"/> +<stop stop-color="#FDDA10" offset="0.4"/> +<stop stop-color="#DD980D" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_25)" d="M17.697,19.925c-0.016,0.1,0.082,0.163,0.082,0.163c-4.068,1.515-5.859,0.596-7.681-0.501c0.031-0.022,0.048-0.041,0.064-0.111c0.004,0.002,0.012,0.004,0.016,0.007C11.941,20.567,13.988,21.459,17.697,19.925z"/> +<path fill="#C67C0C" d="M9.94,19.697l0.158-0.114c1.566,0.978,3.763,2.045,7.657,0.482l0.159,0.136C14.297,21.806,11.649,20.847,9.94,19.697z"/> +<path fill="#DD980D" d="M9.954,19.701l-0.019,0.014c0,0-0.103-0.058-0.067-0.163C9.877,19.655,9.954,19.701,9.954,19.701z"/> +<linearGradient id="SVGID_26" gradientUnits="userSpaceOnUse" x1="10.05" y1="19.64" x2="9.92" y2="19.5"> +<stop stop-color="#DD980D" offset="0.1"/> +<stop stop-color="#FDDA10" offset="0.7"/> +<stop stop-color="#DD980D" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_26)" d="M9.869,19.552l0.149-0.123c-0.008,0.11,0.096,0.149,0.096,0.149l-0.163,0.125C9.952,19.703,9.861,19.659,9.869,19.552z"/> +<linearGradient id="SVGID_27" gradientUnits="userSpaceOnUse" x1="10.05" y1="19.41" x2="10.14" y2="19.57"> +<stop stop-color="#DD980D" offset="0"/> +<stop stop-color="#FEBF0F" offset="0.4"/> +<stop stop-color="#FED30E" offset="0.8"/> +<stop stop-color="#DD980D" offset="1"/> </linearGradient> -<path d="M139.38,108.942c0.899,0.811-23.935-21.1-24.886-21.958c0.006-0.148,0.171-3.764,0.186-4.101 c0.37,0.053,29.05,4.224,29.361,4.27c-0.023,0.313-1.679,22.211-1.709,22.618C141.98,109.671,139.451,108.961,139.38,108.942" fill="url(#SVGID_8)"/> -<path d="M142.172,109.891c0.016,0-0.531-0.156-0.909-0.176c0,0-0.024-20.99-0.089-21.022 l0.089,0.012c0.589,0,1.066,0.544,1.066,1.214L142.172,109.891z" fill="#231F20" fill-opacity="0.23" /> -<linearGradient id="SVGID_10" gradientUnits="userSpaceOnUse" x1="111.43" y1="99.17" x2="141.47" y2="99.17"> -<stop stop-color="#74B8E5" offset="0"/> -<stop stop-color="#56A7DB" offset="1"/> +<path fill="url(#SVGID_27)" d="M10.006,19.434c0.053-0.021,0.103,0.004,0.159,0.037c-0.02,0.069-0.032,0.094-0.062,0.115C10.068,19.567,9.999,19.522,10.006,19.434z"/> +<path fill="#DD980D" d="M11.948,12.751l-0.029,0.057l-0.132,0.094c0.009-0.044,0.118-0.123,0.152-0.145C11.943,12.754,11.948,12.751,11.948,12.751z"/> +<radialGradient id="SVGID_28" gradientUnits="userSpaceOnUse" cx="11.99" cy="12.72" r="0.09"> +<stop stop-color="#FEEB71" offset="0"/> +<stop stop-color="#DD980D" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_28)" d="M12.096,12.815c-0.079-0.044-0.149-0.022-0.177-0.008c0.004-0.015,0.022-0.052,0.022-0.052c0.063-0.04,0.09-0.04,0.15-0.013C12.108,12.773,12.103,12.798,12.096,12.815z"/> +<linearGradient id="SVGID_29" gradientUnits="userSpaceOnUse" x1="11.14" y1="16.15" x2="10.96" y2="16.1"> +<stop stop-color="#FEEFBB" offset="0.01"/> +<stop stop-color="#FFBF00" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_29)" d="M10.179,19.482c-0.056-0.034-0.12-0.06-0.173-0.036l1.917-6.638c0.029-0.014,0.097-0.037,0.176,0.009L10.179,19.482z"/> +<linearGradient id="SVGID_30" gradientUnits="userSpaceOnUse" x1="11.72" y1="13.52" x2="19.91" y2="13.52"> +<stop stop-color="#FCA859" offset="0.01"/> +<stop stop-color="#FDC30F" offset="0.21"/> +<stop stop-color="#B51C00" offset="1"/> +</linearGradient> +<path opacity="0.33" fill="url(#SVGID_30)" enable-background="new " d="M11.824,12.852c0.586,0.509,3.127,2.585,8.066,0.643l-0.156-0.126c-0.016-0.015-0.045-0.03-0.107-0.021c-3.932,1.333-5.824,0.548-7.534-0.604c0,0.002,0,0.002,0,0.002c-0.058-0.03-0.086-0.029-0.149,0.012C11.863,12.812,11.863,12.812,11.824,12.852z"/> +<linearGradient id="SVGID_31" gradientUnits="userSpaceOnUse" x1="11.79" y1="13.62" x2="19.92" y2="13.62"> +<stop stop-color="#FFF6D8" offset="0.01"/> +<stop stop-color="#FDDA10" offset="0.53"/> +<stop stop-color="#F9BD0C" offset="1"/> +</linearGradient> +<path opacity="0.33" fill="url(#SVGID_31)" enable-background="new " d="M19.891,13.494L19.891,13.494c-4.941,1.942-7.48-0.135-8.066-0.643c-0.016,0.017-0.026,0.03-0.033,0.043v0.001l-0.002,0.007c0,0,0,0,0,0.002v-0.002v0.004c0.511,0.447,3.063,2.67,8.135,0.66C19.916,13.521,19.891,13.494,19.891,13.494z"/> +<linearGradient id="SVGID_32" gradientUnits="userSpaceOnUse" x1="17.79" y1="20" x2="17.68" y2="19.9"> +<stop stop-color="#EAB849" offset="0"/> +<stop stop-color="#EDC15A" offset="0.07"/> +<stop stop-color="#F3D783" offset="0.28"/> +<stop stop-color="#F8E8A4" offset="0.48"/> +<stop stop-color="#FCF5BC" offset="0.67"/> +<stop stop-color="#FEFCCA" offset="0.85"/> +<stop stop-color="#FFFFCF" offset="1"/> </linearGradient> -<polygon fill="url(#SVGID_10)" points="111.432,86.639 111.432,107.756 141.473,111.703 141.473,87.842 "/> -<linearGradient id="SVGID_11" gradientUnits="userSpaceOnUse" x1="111.95" y1="99.09" x2="140.61" y2="99.09"> -<stop stop-color="#D8EEFB" offset="0"/> -<stop stop-color="#A3DCEA" offset="1"/> +<path fill="url(#SVGID_32)" d="M17.756,20.066c0,0-0.072-0.046-0.059-0.146c0.1-0.026,0.16,0.036,0.16,0.036S17.842,20.028,17.756,20.066z"/> +<radialGradient id="SVGID_33" gradientUnits="userSpaceOnUse" cx="11.3" cy="10.89" r="9.17"> +<stop stop-color="#EFD815" offset="0"/> +<stop stop-color="#EFD415" offset="0.11"/> +<stop stop-color="#EDC614" offset="0.22"/> +<stop stop-color="#EBB112" offset="0.33"/> +<stop stop-color="#E89211" offset="0.45"/> +<stop stop-color="#E36C0E" offset="0.57"/> +<stop stop-color="#E04C0C" offset="0.65"/> +<stop stop-color="#CE2907" offset="0.78"/> +<stop stop-color="#BF0B02" offset="0.92"/> +<stop stop-color="#B90000" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_33)" d="M11.406,10.901C10.377,10.208,9.27,9.56,7.695,9.548c-1.037-0.007-2.273,0.288-3.844,0.936l1.945-6.74c3.946-1.631,5.843-0.706,7.555,0.452L11.406,10.901z"/> +<path fill="#BC1B00" d="M11.402,10.898l1.948-6.702c0.021,0.013,0.028,0.023,0.04,0.038l-1.946,6.713C11.436,10.919,11.402,10.898,11.402,10.898z"/> +<path fill="#BC1B00" d="M4.039,10.679c0.622-0.255,1.198-0.445,1.732-0.574c0.13-0.031,0.245-0.06,0.383-0.085C6.281,9.995,6.405,9.97,6.525,9.95C6.715,9.924,6.9,9.898,7.083,9.884c0.153-0.012,0.302-0.021,0.45-0.021c0.142,0,0.281,0,0.417,0.008C8.07,9.877,8.187,9.886,8.304,9.9C8.402,9.91,8.499,9.923,8.593,9.94c0.199,0.033,0.394,0.077,0.58,0.129c0.757,0.214,1.429,0.579,2.046,0.989c-0.005,0.002-0.019-0.004-0.025-0.007c-0.006-0.002-0.009-0.002-0.014-0.006c-0.835-0.529-1.731-0.99-2.838-1.126c-1.133-0.14-2.454,0.056-4.231,0.762c0,0-0.042,0.019-0.059,0.02C4.039,10.704,4.041,10.693,4.039,10.679z"/> +<path fill="#BC1B00" d="M11.337,10.999c0,0,0.024,0.017,0.056,0.011l-0.123,0.056c-0.033,0.008-0.072-0.012-0.072-0.012L11.337,10.999z"/> +<path fill="#B81A00" d="M4.039,10.679c0,0,0.008,0.015,0.014,0.022c-0.011,0.001-0.014,0.005-0.043-0.008c-0.005-0.002-0.01-0.006-0.015-0.01l-0.128-0.099l-0.012-0.01c0.018-0.001,0.03,0.006,0.038,0.006L4.039,10.679z"/> +<path fill="#E82E00" d="M11.406,10.901c0.012,0.008,0.031,0.014,0.042,0.042c-0.007,0.036-0.038,0.054-0.056,0.066c-0.03,0.008-0.059-0.014-0.059-0.014C11.353,10.981,11.385,10.957,11.406,10.901z"/> +<path fill="#E32D00" d="M3.856,10.577c-0.019-0.013-0.036-0.069-0.025-0.105l0.025-0.006c-0.011,0.048,0.02,0.104,0.047,0.121C3.904,10.586,3.885,10.597,3.856,10.577z"/> +<linearGradient id="SVGID_34" gradientUnits="userSpaceOnUse" x1="5.78" y1="3.72" x2="5.82" y2="3.72"> +<stop stop-color="#FD7E36" offset="0"/> +<stop stop-color="#BD6F4F" offset="1"/> </linearGradient> -<polygon fill="url(#SVGID_11)" points="111.948,87.154 111.948,107.339 140.614,111.016 140.614,88.528 "/> -<linearGradient id="SVGID_12" gradientUnits="userSpaceOnUse" x1="141.56" y1="87.76" x2="141.56" y2="111.66"> -<stop stop-color="#3686C3" offset="0"/> -<stop stop-color="#245F98" offset="1"/> +<path id="SVGID_37" fill="url(#SVGID_34)" d="M5.796,3.746L5.778,3.742c0.008-0.03,0.028-0.04,0.035-0.042l0.002-0.001C5.815,3.699,5.808,3.715,5.796,3.746z"/> +<path fill="#E82E00" d="M11.339,11c-1.838-1.277-4.093-2.079-7.44-0.416l0.137,0.097c3.658-1.494,5.564-0.688,7.168,0.372L11.339,11z"/> +<path fill="#E82E00" d="M11.337,10.999c-1.054-0.688-2.039-1.257-3.6-1.302c-1.14,0.022-2.017,0.17-3.836,0.89c-0.025-0.014-0.061-0.053-0.051-0.103c1.575-0.67,2.826-0.96,3.864-0.951c1.571,0.015,2.66,0.673,3.689,1.365C11.388,10.961,11.354,10.983,11.337,10.999z"/> +<path fill="#E32D00" d="M5.778,3.742l0.018,0.005l-1.94,6.734c-0.004-0.003-0.023-0.007-0.023-0.007L5.778,3.742z"/> +<linearGradient id="SVGID_35" gradientUnits="userSpaceOnUse" x1="5.79" y1="3.51" x2="13.36" y2="3.51"> +<stop stop-color="#FC2B20" offset="0"/> +<stop stop-color="#FF590A" offset="0.24"/> +<stop stop-color="#FB570B" offset="0.25"/> +<stop stop-color="#E74C0E" offset="0.33"/> +<stop stop-color="#D84511" offset="0.42"/> +<stop stop-color="#D04013" offset="0.52"/> +<stop stop-color="#CD3F13" offset="0.7"/> +<stop stop-color="#D04213" offset="0.8"/> +<stop stop-color="#D84B14" offset="0.87"/> +<stop stop-color="#E65B16" offset="0.93"/> +<stop stop-color="#F97219" offset="0.99"/> +<stop stop-color="#FC7519" offset="1"/> +</linearGradient> +<path opacity="0.66" fill="url(#SVGID_35)" enable-background="new " d="M13.351,4.194C11.639,3.036,9.725,2.14,5.796,3.746c0.008-0.033,0.017-0.045,0.017-0.045c3.95-1.632,5.839-0.709,7.549,0.449L13.351,4.194z"/> +<path opacity="0.33" fill="#FE8411" enable-background="new " d="M13.123,4.417c-1.394-0.904-3.236-2.04-7.164-0.435c0.008-0.033,0.019-0.05,0.019-0.05c3.948-1.633,5.807-0.389,7.159,0.435L13.123,4.417z"/> +<g opacity="0.6"> +<linearGradient id="SVGID_36" gradientUnits="userSpaceOnUse" x1="3.86" y1="7.25" x2="5.97" y2="7.25"> +<stop stop-color="#FD7E36" offset="0"/> +<stop stop-color="#BD6F4F" offset="1"/> +</linearGradient> +<path opacity="0.6" fill="url(#SVGID_36)" enable-background="new " d="M5.86,3.79c-0.011,0.004-0.05,0-0.05,0l-1.955,6.778l0.139,0.113C4,10.686,4.005,10.689,4.01,10.692c0.024,0.011,0.031,0.011,0.038,0.009l1.921-6.748l0.006-0.021L5.86,3.79z"/> +</g> +<linearGradient id="SVGID_38" gradientUnits="userSpaceOnUse" x1="14" y1="4.57" x2="4.22" y2="2.39"> +<stop stop-color="#FE550D" offset="0"/> +<stop stop-color="#8C1501" offset="1"/> +</linearGradient> +<path opacity="0.5" fill="url(#SVGID_38)" enable-background="new " d="M13.135,4.373c0.002,0.002,0.002,0.002,0.002,0.002c0-0.002,0.002-0.002,0.002-0.004L13.135,4.373z"/> +<linearGradient id="SVGID_39" gradientUnits="userSpaceOnUse" x1="9.57" y1="4.43" x2="9.49" y2="2.08"> +<stop stop-color="#FE550D" offset="0"/> +<stop stop-color="#8C1501" offset="1"/> +</linearGradient> +<path opacity="0.5" fill="url(#SVGID_39)" enable-background="new " d="M13.182,4.219c-0.649-0.435-1.73-1.14-3.309-1.25C8.196,2.85,6.072,3.704,5.86,3.791l0.114,0.143L5.969,3.955C5.975,3.954,5.98,3.95,5.987,3.948c3.913-1.684,6.325-0.163,7.146,0.428l0.004-0.003l0.123-0.101C13.234,4.253,13.209,4.236,13.182,4.219z"/> +<path opacity="0.5" fill="#FFF4C5" enable-background="new " d="M5.86,3.79c0.211-0.088,2.336-0.941,4.013-0.822c1.579,0.111,2.66,0.816,3.309,1.25c0.027,0.019,0.053,0.034,0.076,0.052l0.121-0.099c-0.006-0.008-0.009-0.018-0.018-0.022c-1.672-1.133-3.519-2.041-7.292-0.554C5.984,3.63,5.901,3.663,5.813,3.699l0,0L5.86,3.79z"/> +<linearGradient id="SVGID_40" gradientUnits="userSpaceOnUse" x1="11.18" y1="7.61" x2="13.39" y2="7.61"> +<stop stop-color="#FD7E36" offset="0"/> +<stop stop-color="#FC895B" offset="1"/> +</linearGradient> +<path opacity="0.6" fill="url(#SVGID_40)" enable-background="new " d="M13.361,4.151l-0.011,0.042l-0.093,0.077l-0.121,0.101c0,0.002-0.002,0.002-0.002,0.005c-0.407,1.398-1.679,5.761-1.95,6.67c0.003,0.001,0.005,0.002,0.008,0.003c0.002,0.001,0.004,0.002,0.004,0.002l0,0c0,0,0.041,0.021,0.072,0.012l0.123-0.057c-0.001,0.001-0.001,0-0.004,0.001c0.001-0.001,0.002,0,0.003-0.001c0.015-0.012,0.046-0.03,0.053-0.063l0,0v-0.001c0,0,0.001,0,0.001-0.002l0,0l1.864-6.439l0,0l0.049-0.159V4.336l0.029-0.106C13.395,4.211,13.393,4.166,13.361,4.151z"/> +<linearGradient id="SVGID_41" gradientUnits="userSpaceOnUse" x1="3.85" y1="10.26" x2="11.41" y2="10.26"> +<stop stop-color="#FD9B20" offset="0.25"/> +<stop stop-color="#FDB830" offset="0.34"/> +<stop stop-color="#FDD23E" offset="0.43"/> +<stop stop-color="#FDDB43" offset="0.49"/> +<stop stop-color="#FE8411" offset="0.75"/> +<stop stop-color="#FE550D" offset="1"/> </linearGradient> -<polygon fill="url(#SVGID_12)" points="141.643,111.364 141.47,111.704 141.47,87.842 141.643,88.162 "/> -<polygon fill="#CC4124" points="138.591,96.151 132.129,95.083 132.495,90.082 138.957,90.953 "/> -<path d="M139.314,90.919c0.011,0.002,0.017,0.007,0.027,0.01l0.012-0.202c-0.015,0.002-0.027,0.006-0.043,0.004 c-0.116-0.013-0.203-0.116-0.198-0.228c0.001-0.023,0.01-0.043,0.019-0.063l-0.237-0.028c0.006,0.021,0.012,0.043,0.01,0.066 c-0.007,0.111-0.104,0.19-0.221,0.177c-0.115-0.015-0.202-0.115-0.196-0.226c0.001-0.023,0.009-0.043,0.018-0.064l-0.235-0.027 c0.007,0.022,0.012,0.044,0.011,0.066c-0.007,0.111-0.104,0.19-0.22,0.178c-0.114-0.015-0.202-0.115-0.194-0.226 c0.001-0.022,0.009-0.045,0.017-0.063l-0.232-0.028c0.007,0.021,0.011,0.045,0.011,0.067c-0.008,0.11-0.105,0.188-0.219,0.175 c-0.113-0.013-0.199-0.114-0.192-0.224c0.001-0.024,0.007-0.044,0.017-0.063l-0.232-0.027c0.007,0.021,0.012,0.042,0.01,0.064 c-0.006,0.11-0.103,0.189-0.215,0.176c-0.113-0.014-0.199-0.113-0.191-0.224c0.001-0.022,0.009-0.043,0.016-0.063l-0.229-0.026 c0.006,0.022,0.01,0.044,0.009,0.066c-0.005,0.109-0.103,0.188-0.215,0.175c-0.111-0.015-0.196-0.113-0.189-0.223 c0.002-0.022,0.01-0.044,0.019-0.063l-0.229-0.027c0.007,0.021,0.01,0.043,0.01,0.066c-0.007,0.109-0.104,0.188-0.214,0.173 c-0.111-0.013-0.195-0.112-0.188-0.222c0.002-0.022,0.01-0.042,0.019-0.062l-0.227-0.026c0.007,0.021,0.01,0.043,0.009,0.064 c-0.007,0.109-0.102,0.187-0.212,0.174c-0.11-0.014-0.193-0.112-0.187-0.221c0.002-0.021,0.01-0.042,0.017-0.063l-0.223-0.026 c0.004,0.021,0.009,0.044,0.008,0.066c-0.006,0.108-0.101,0.185-0.21,0.173c-0.109-0.014-0.192-0.111-0.185-0.22 c0.002-0.023,0.007-0.044,0.017-0.063l-0.224-0.026c0.007,0.021,0.012,0.042,0.01,0.064c-0.008,0.107-0.1,0.187-0.208,0.173 c-0.108-0.013-0.19-0.111-0.185-0.219c0.001-0.022,0.009-0.042,0.019-0.063l-0.222-0.026c0.006,0.022,0.009,0.043,0.008,0.065 c-0.006,0.107-0.1,0.185-0.207,0.172s-0.188-0.11-0.182-0.217c0.002-0.024,0.008-0.044,0.017-0.063l-0.22-0.025 c0.007,0.021,0.011,0.041,0.01,0.063c-0.008,0.108-0.101,0.185-0.207,0.171c-0.106-0.012-0.188-0.109-0.18-0.216 c0.002-0.022,0.009-0.042,0.017-0.063l-0.18-0.021c0.001,0.014,0.006,0.024,0.005,0.038c-0.008,0.106-0.101,0.183-0.207,0.171 c-0.009-0.001-0.018-0.007-0.027-0.01l-0.008,0.14c0.009,0,0.019-0.004,0.028-0.003c0.107,0.013,0.188,0.111,0.181,0.219 c-0.007,0.108-0.099,0.184-0.208,0.172c-0.009-0.001-0.017-0.007-0.027-0.01l-0.013,0.205c0.011,0,0.018-0.002,0.028,0 c0.107,0.013,0.188,0.11,0.181,0.219c-0.006,0.109-0.099,0.185-0.206,0.17c-0.011-0.001-0.018-0.006-0.028-0.008l-0.015,0.206 c0.011,0,0.021-0.004,0.029-0.003c0.106,0.016,0.188,0.113,0.183,0.222c-0.008,0.108-0.101,0.184-0.209,0.17 c-0.008-0.001-0.017-0.007-0.027-0.01l-0.013,0.208c0.009,0,0.018-0.004,0.029-0.002c0.106,0.014,0.188,0.113,0.18,0.223 c-0.007,0.107-0.099,0.183-0.206,0.167c-0.011-0.001-0.02-0.005-0.027-0.008l-0.015,0.206c0.01,0,0.02-0.003,0.028-0.002 c0.107,0.016,0.188,0.115,0.183,0.224c-0.008,0.108-0.102,0.184-0.208,0.17c-0.011-0.002-0.018-0.008-0.028-0.011l-0.013,0.209 c0.009,0,0.019-0.004,0.029-0.002c0.106,0.015,0.188,0.114,0.181,0.223c-0.008,0.109-0.1,0.186-0.207,0.169 c-0.011-0.002-0.02-0.006-0.028-0.01l-0.015,0.208c0.011,0,0.019-0.004,0.029-0.002c0.107,0.017,0.188,0.117,0.181,0.226 c-0.006,0.108-0.1,0.184-0.206,0.168c-0.012-0.001-0.019-0.008-0.028-0.011l-0.015,0.209c0.01,0,0.02-0.002,0.028-0.001 c0.108,0.016,0.19,0.116,0.183,0.225c-0.008,0.109-0.101,0.186-0.208,0.168c-0.009-0.001-0.018-0.008-0.028-0.009l-0.013,0.208 c0.011,0,0.018-0.003,0.029-0.002c0.107,0.017,0.188,0.119,0.181,0.229c-0.008,0.108-0.1,0.183-0.207,0.167 c-0.011-0.002-0.02-0.008-0.028-0.012l-0.013,0.178c0.099,0.025,0.171,0.118,0.164,0.22c-0.002,0.024-0.008,0.047-0.018,0.066 l0.221,0.035c-0.007-0.022-0.012-0.047-0.01-0.071c0.007-0.107,0.101-0.181,0.207-0.165c0.107,0.019,0.188,0.119,0.181,0.227 c-0.001,0.024-0.009,0.046-0.018,0.067l0.223,0.033c-0.007-0.021-0.012-0.045-0.01-0.069c0.008-0.108,0.1-0.182,0.207-0.166 c0.107,0.017,0.189,0.119,0.185,0.229c-0.002,0.023-0.01,0.045-0.02,0.065l0.224,0.036c-0.007-0.022-0.011-0.047-0.01-0.071 c0.008-0.109,0.102-0.184,0.21-0.166c0.109,0.017,0.191,0.118,0.185,0.228c-0.001,0.023-0.009,0.048-0.018,0.067l0.224,0.035 c-0.005-0.023-0.01-0.047-0.008-0.071c0.008-0.109,0.101-0.184,0.21-0.167c0.109,0.019,0.193,0.12,0.186,0.229 c-0.001,0.024-0.007,0.047-0.018,0.066l0.229,0.037c-0.008-0.023-0.013-0.047-0.011-0.071c0.007-0.11,0.102-0.187,0.212-0.168 c0.11,0.017,0.194,0.119,0.188,0.229c-0.002,0.024-0.008,0.048-0.019,0.068l0.23,0.037c-0.008-0.024-0.013-0.049-0.011-0.073 c0.007-0.11,0.102-0.186,0.213-0.168c0.111,0.019,0.197,0.121,0.189,0.231c-0.002,0.025-0.008,0.047-0.018,0.067l0.231,0.037 c-0.008-0.023-0.013-0.047-0.011-0.072c0.007-0.11,0.103-0.186,0.215-0.168c0.112,0.017,0.198,0.12,0.191,0.231 c-0.002,0.024-0.01,0.049-0.019,0.069l0.232,0.037c-0.008-0.025-0.011-0.05-0.01-0.074c0.005-0.111,0.104-0.187,0.217-0.169 c0.113,0.019,0.197,0.123,0.192,0.234c-0.001,0.024-0.009,0.047-0.02,0.067l0.235,0.037c-0.008-0.023-0.013-0.047-0.012-0.072 c0.008-0.111,0.104-0.188,0.219-0.17s0.202,0.122,0.194,0.234c-0.001,0.024-0.009,0.049-0.018,0.069l0.235,0.036 c-0.008-0.023-0.012-0.048-0.011-0.072c0.007-0.112,0.105-0.188,0.219-0.171c0.116,0.02,0.204,0.124,0.197,0.236 c-0.002,0.025-0.008,0.048-0.019,0.068l0.238,0.039c-0.008-0.024-0.012-0.049-0.01-0.075c0.005-0.111,0.104-0.189,0.221-0.17 c0.115,0.018,0.203,0.124,0.197,0.236c-0.002,0.025-0.009,0.048-0.019,0.07l0.242,0.037c-0.004-0.017-0.009-0.035-0.008-0.053 c0.008-0.113,0.106-0.188,0.222-0.172c0.02,0.004,0.036,0.013,0.053,0.021l0.013-0.217c-0.01-0.001-0.018,0.001-0.027,0.001 c-0.117-0.02-0.206-0.124-0.199-0.237c0.007-0.112,0.105-0.189,0.222-0.172c0.011,0.001,0.017,0.007,0.026,0.01l0.014-0.214 c-0.011,0-0.019,0.003-0.027,0.001c-0.117-0.017-0.206-0.123-0.199-0.235c0.007-0.11,0.105-0.189,0.223-0.171 c0.008,0.001,0.017,0.007,0.026,0.008l0.011-0.214c-0.008,0-0.017,0.003-0.027,0.001c-0.114-0.016-0.204-0.12-0.197-0.232 c0.005-0.112,0.105-0.189,0.222-0.174c0.01,0.002,0.018,0.007,0.027,0.01l0.012-0.213c-0.011,0-0.018,0.001-0.028,0.001 c-0.116-0.017-0.203-0.121-0.198-0.232c0.007-0.112,0.105-0.19,0.222-0.175c0.01,0.001,0.019,0.007,0.026,0.01l0.014-0.213 c-0.011,0-0.02,0.003-0.028,0.002c-0.116-0.018-0.205-0.12-0.198-0.232s0.105-0.189,0.222-0.173 c0.011,0.001,0.017,0.005,0.026,0.008l0.014-0.213c-0.011,0-0.02,0.003-0.027,0.001c-0.117-0.014-0.206-0.119-0.199-0.23 c0.007-0.11,0.105-0.189,0.222-0.174c0.009,0.002,0.017,0.008,0.026,0.009l0.012-0.213c-0.009,0-0.018,0.003-0.028,0.002 c-0.114-0.015-0.203-0.117-0.196-0.229c0.005-0.111,0.105-0.189,0.22-0.176c0.011,0.002,0.02,0.008,0.027,0.01l0.013-0.214 c-0.011,0-0.018,0.003-0.028,0.002c-0.116-0.014-0.204-0.115-0.198-0.228c0.007-0.11,0.105-0.189,0.222-0.176 c0.011,0.001,0.019,0.007,0.026,0.01l0.014-0.212c-0.011,0-0.02,0.001-0.027,0.001c-0.117-0.014-0.206-0.115-0.199-0.227 C139.1,90.984,139.198,90.906,139.314,90.919z M138.558,96.088l-6.397-1.064l0.383-4.887l6.35,0.824L138.558,96.088z" fill="#FFFFFF"/> -<path d="M129.281,93.9c-1.055,0.178-1.858,0.011-2.746-0.474 c0.877,0.404,2.153,0.47,3.562-0.041c3.479-1.262,4.393,0.537,4.393,0.537C132.681,92.495,130.582,93.706,129.281,93.9 L129.281,93.9z M129.35,94.872c-1.055,0.176-1.858,0.009-2.745-0.476c0.878,0.404,2.152,0.472,3.562-0.039 c3.478-1.263,4.395,0.537,4.395,0.537C132.75,93.465,130.652,94.677,129.35,94.872L129.35,94.872z M129.21,92.93 c-1.055,0.176-1.859,0.009-2.746-0.476c0.877,0.404,2.152,0.471,3.562-0.039c3.478-1.262,4.394,0.536,4.394,0.536 C132.609,91.523,130.511,92.736,129.21,92.93L129.21,92.93z M129.14,91.959c-1.054,0.178-1.859,0.011-2.746-0.474 c0.877,0.404,2.153,0.47,3.562-0.041c3.479-1.263,4.396,0.536,4.396,0.536C132.54,90.552,130.441,91.764,129.14,91.959 L129.14,91.959z" fill="#446D92" fill-opacity="0.2" /> -<path d="M135.787,99.213c0,0,0,4.979,0,6.008 s-0.686,0.688-0.686,0.688s-14.084-1.508-14.934-1.717c-0.741-0.184-0.687-0.686-0.687-0.686s0-4.979,0-5.666 s0.858-0.516,0.858-0.516s13.551,1.121,14.763,1.203C135.819,98.574,135.787,99.213,135.787,99.213L135.787,99.213z" fill="#0F001F" fill-opacity="0.25" /> -<linearGradient id="SVGID_13" gradientUnits="userSpaceOnUse" x1="119.33" y1="101.42" x2="135.64" y2="101.42"> -<stop stop-color="#FFFFFF" offset="0"/> -<stop stop-color="#F5F9FC" offset="1"/> +<path opacity="0.5" fill="url(#SVGID_41)" enable-background="new " d="M11.342,10.996c-1.053-0.688-2.038-1.258-3.6-1.303c-1.141,0.023-2.017,0.169-3.834,0.89c-0.027-0.014-0.061-0.053-0.052-0.102C5.431,9.81,6.683,9.52,7.72,9.529c1.572,0.016,2.662,0.675,3.693,1.367C11.393,10.957,11.358,10.981,11.342,10.996z"/> +<path fill="#F83503" d="M13.361,4.149h0.002c0.027,0.018,0.033,0.051,0.029,0.083l-0.004,0.004c-0.01-0.013-0.019-0.024-0.037-0.043L13.361,4.149z"/> +<path id="SVGID_46" fill="url(#SVGID_34)" d="M5.796,3.746L5.778,3.742c0.008-0.03,0.028-0.04,0.035-0.042l0.003-0.001C5.815,3.699,5.808,3.715,5.796,3.746z"/> +<path opacity="0.66" fill="url(#SVGID_35)" enable-background="new " d="M13.351,4.194C11.639,3.036,9.725,2.14,5.796,3.746c0.008-0.033,0.017-0.045,0.017-0.045c3.95-1.632,5.839-0.709,7.549,0.449L13.351,4.194z"/> +<radialGradient id="SVGID_44" gradientUnits="userSpaceOnUse" cx="11.55" cy="11.9" r="10.5"> +<stop stop-color="#D1E787" offset="0.01"/> +<stop stop-color="#CEE583" offset="0.12"/> +<stop stop-color="#C4DE76" offset="0.25"/> +<stop stop-color="#B3D361" offset="0.38"/> +<stop stop-color="#9CC443" offset="0.51"/> +<stop stop-color="#7FB01D" offset="0.64"/> +<stop stop-color="#7BAE19" offset="0.65"/> +<stop stop-color="#578D19" offset="0.78"/> +<stop stop-color="#366E1A" offset="0.92"/> +<stop stop-color="#29621A" offset="1"/> +</radialGradient> +<path fill="url(#SVGID_44)" d="M21.92,5.337c-3.941,1.63-5.838,0.712-7.545-0.437l-1.943,6.744c1.705,1.155,3.766,2.104,7.545,0.414L21.92,5.337z"/> +<linearGradient id="SVGID_45" gradientUnits="userSpaceOnUse" x1="14.38" y1="5.53" x2="21.96" y2="5.53"> +<stop stop-color="#D3ED89" offset="0"/> +<stop stop-color="#5F811B" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_45)" d="M21.912,5.343c-3.943,1.63-5.83,0.713-7.537-0.437c0.004-0.016,0.012-0.044,0-0.072c1.707,1.148,3.641,2.074,7.58,0.445C21.924,5.298,21.92,5.319,21.912,5.343z"/> +<polygon fill="#8CAC42" points="14.074,4.987 14.215,4.887 12.291,11.571 12.143,11.688 12.143,11.674 "/> +<linearGradient id="SVGID_47" gradientUnits="userSpaceOnUse" x1="13.42" y1="8.27" x2="13.24" y2="8.22"> +<stop stop-color="#D3ED89" offset="0.4"/> +<stop stop-color="#5F811B" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_47)" d="M12.436,11.646c-0.06-0.034-0.104-0.102-0.156-0.081l1.929-6.678c0.029-0.012,0.104-0.037,0.176,0.018L12.436,11.646z"/> +<path fill="#5F811B" d="M14.232,4.844l-0.02,0.047l-0.141,0.103c0.012-0.045,0.119-0.121,0.151-0.145C14.23,4.844,14.232,4.844,14.232,4.844z"/> +<linearGradient id="SVGID_48" gradientUnits="userSpaceOnUse" x1="14.38" y1="4.86" x2="14.21" y2="4.85"> +<stop stop-color="#7AA922" offset="0"/> +<stop stop-color="#D3ED89" offset="0.2"/> +<stop stop-color="#D3ED89" offset="0.53"/> +<stop stop-color="#7AA922" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_48)" d="M14.375,4.901c-0.072-0.044-0.139-0.021-0.168-0.009c0.006-0.014,0.018-0.044,0.018-0.044c0.064-0.04,0.09-0.041,0.15-0.012C14.385,4.857,14.387,4.881,14.375,4.901z"/> +<linearGradient id="SVGID_49" gradientUnits="userSpaceOnUse" x1="20.11" y1="8.8" x2="22.22" y2="8.8"> +<stop stop-color="#7AA922" offset="0.01"/> +<stop stop-color="#1D4A20" offset="0.17"/> +<stop stop-color="#26551B" offset="0.38"/> +<stop stop-color="#7AA922" offset="1"/> +</linearGradient> +<polygon opacity="0.81" fill="url(#SVGID_49)" enable-background="new " points="20.107,12.089 22.057,5.375 22.217,5.502 20.256,12.219 "/> +<path fill="#476E32" d="M20.293,12.268c0.006-0.038-0.033-0.069-0.033-0.069l1.953-6.702c0,0,0.031,0.028,0.039,0.046L20.293,12.268z"/> +<path fill="#1D3419" d="M20.229,12.33c-1.053,0.479-2.049,0.725-2.975,0.805c-1.6,0.18-2.893-0.166-3.947-0.686c-0.411-0.188-0.781-0.401-1.112-0.624l0.017-0.013c0.334,0.224,0.697,0.443,1.095,0.638c1.072,0.491,2.412,0.817,3.947,0.685c0.873-0.099,1.838-0.356,2.906-0.829C20.191,12.329,20.229,12.33,20.229,12.33z"/> +<linearGradient id="SVGID_50" gradientUnits="userSpaceOnUse" x1="20.13" y1="12.13" x2="19.96" y2="12.12"> +<stop stop-color="#7AA922" offset="0"/> +<stop stop-color="#D3ED89" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_50)" d="M20.025,12.208c0,0-0.076-0.067-0.064-0.166c0.105-0.025,0.17,0.037,0.17,0.037S20.109,12.173,20.025,12.208z"/> +<linearGradient id="SVGID_51" gradientUnits="userSpaceOnUse" x1="20.2" y1="12.14" x2="20.09" y2="12.26"> +<stop stop-color="#5F811B" offset="0"/> +<stop stop-color="#26551B" offset="1"/> </linearGradient> -<path d="M135.636,99c0,0,0,4.979,0,6.008s-0.686,0.688-0.686,0.688s-14.085-1.508-14.935-1.717 c-0.741-0.184-0.687-0.687-0.687-0.687s0-4.979,0-5.665c0-0.688,0.858-0.516,0.858-0.516s13.552,1.121,14.764,1.202 C135.668,98.362,135.636,99,135.636,99L135.636,99z" fill="url(#SVGID_13)"/> -<path d="M111.617,89.262c-0.063,0-0.123,0.002-0.185,0.002v-2.625 l30.041,1.202v9.104C134.069,92.074,123.71,89.262,111.617,89.262L111.617,89.262z" fill="#FFFFFF" fill-opacity="0.25" /> -<linearGradient id="SVGID_14" gradientUnits="userSpaceOnUse" x1="148.5" y1="107.51" x2="106.79" y2="107.51"> -<stop stop-color="#FCD959" offset="0"/> -<stop stop-color="#FBC64A" offset="0.21"/> -<stop stop-color="#FBCB4D" offset="0.24"/> -<stop stop-color="#FCDB58" offset="0.35"/> -<stop stop-color="#FCE15C" offset="0.42"/> -<stop stop-color="#FBDC5B" offset="0.53"/> -<stop stop-color="#F9CE55" offset="0.69"/> -<stop stop-color="#F5B84C" offset="0.88"/> -<stop stop-color="#F5B84C" offset="0.88"/> -<stop stop-color="#FBDB5C" offset="1"/> +<path fill="url(#SVGID_51)" d="M20.121,12.076l0.139,0.125c0,0-0.02,0.077-0.105,0.115l-0.146-0.125C20.096,12.155,20.121,12.076,20.121,12.076z"/> +<linearGradient id="SVGID_52" gradientUnits="userSpaceOnUse" x1="12.36" y1="12.35" x2="20.04" y2="12.35"> +<stop stop-color="#7AA922" offset="0"/> +<stop stop-color="#D3ED89" offset="0.4"/> +<stop stop-color="#7AA922" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_52)" d="M19.977,12.036c-0.014,0.099,0.061,0.171,0.061,0.171c-3.939,1.631-5.971,0.673-7.679-0.484c0.031-0.021,0.037-0.021,0.055-0.093C14.117,12.787,16.697,13.597,19.977,12.036z"/> +<path fill="#26551B" d="M12.212,11.819l0.147-0.099c1.707,1.102,3.723,2.05,7.66,0.467l0.141,0.125C16.381,13.979,13.965,13.051,12.212,11.819z"/> +<path fill="#5F811B" d="M20.293,12.268c-0.018,0.036-0.053,0.058-0.064,0.063c-0.004,0.001-0.004,0.001-0.004,0.001s-0.027,0.005-0.064-0.021c0.078-0.041,0.1-0.127,0.1-0.127S20.305,12.224,20.293,12.268z"/> +<path fill="#26551B" d="M12.218,11.818l-0.018,0.013c0,0-0.096-0.052-0.06-0.157C12.15,11.778,12.218,11.818,12.218,11.818z"/> +<linearGradient id="SVGID_53" gradientUnits="userSpaceOnUse" x1="12.31" y1="11.77" x2="12.19" y2="11.63"> +<stop stop-color="#1D3A19" offset="0"/> +<stop stop-color="#26551B" offset="0.1"/> +<stop stop-color="#7AA922" offset="0.65"/> +<stop stop-color="#D3ED89" offset="1"/> +</linearGradient> +<path fill="url(#SVGID_53)" d="M12.143,11.674l0.142-0.112c-0.008,0.107,0.084,0.152,0.084,0.152l-0.143,0.11C12.225,11.826,12.134,11.781,12.143,11.674z"/> +<linearGradient id="SVGID_54" gradientUnits="userSpaceOnUse" x1="12.31" y1="11.55" x2="12.4" y2="11.71"> +<stop stop-color="#5F811B" offset="0"/> +<stop stop-color="#7AA922" offset="0.4"/> +<stop stop-color="#5F811B" offset="0.8"/> +</linearGradient> +<path fill="url(#SVGID_54)" d="M12.28,11.562c0.048-0.017,0.092,0.035,0.152,0.083c-0.021,0.069-0.035,0.058-0.068,0.078C12.332,11.704,12.271,11.651,12.28,11.562z"/> +<linearGradient id="SVGID_55" gradientUnits="userSpaceOnUse" x1="22.13" y1="5.44" x2="22.15" y2="5.36"> +<stop stop-color="#5B7F30" offset="0"/> +<stop stop-color="#D3ED89" offset="1"/> </linearGradient> -<path d="M148.35,108.015c-1.304-3.304-4.799-4.506-8.053-4.504c-0.684,0-1.358,0.053-2.004,0.15 c-4.305,0.654-8.352,2.646-12.408,4.011c-3.642,1.226-7.412,1.98-11.248,1.979c-0.335,0-0.67-0.006-1.005-0.016 c-1.8-0.059-4.04-0.284-5.268-1.639c-0.478-0.524-0.672-1.141-0.673-1.784c0-0.816,0.321-1.678,0.791-2.384 c0.037-0.055,0.077-0.111,0.116-0.169c0,0,0.084-0.144-0.008-0.235c-0.091-0.092-0.234-0.001-0.234-0.001 c-1.054,0.749-1.559,2.021-1.56,3.266c0,0.29,0.027,0.577,0.082,0.858c0.313,1.63,1.542,2.705,3.01,3.265 c1.509,0.575,3.156,0.716,4.728,0.788c0.446,0.02,0.893,0.03,1.34,0.03c1.691,0,3.382-0.147,5.046-0.444 c4.259-0.762,8.247-2.509,12.264-3.95c2.519-0.903,5.514-1.979,8.329-1.979c1.125,0,2.222,0.172,3.253,0.59 c1.232,0.5,2.326,1.347,3.212,2.345c0,0,0.061,0.125,0.217,0.037C148.434,108.143,148.35,108.015,148.35,108.015z" fill="url(#SVGID_14)"/> +<path opacity="0.72" fill="url(#SVGID_55)" enable-background="new " d="M22.229,5.432c0.002,0.026-0.016,0.067-0.016,0.067l-0.152-0.123c0,0,0.021-0.05,0.01-0.087C22.123,5.312,22.221,5.417,22.229,5.432z"/> +<linearGradient id="SVGID_56" gradientUnits="userSpaceOnUse" x1="21.97" y1="6.52" x2="14.26" y2="4.3"> +<stop stop-color="#1D3419" offset="0"/> +<stop stop-color="#26551B" offset="0.23"/> +<stop stop-color="#7AA922" offset="1"/> +</linearGradient> +<path opacity="0.33" fill="url(#SVGID_56)" enable-background="new " d="M22.225,5.426c-0.029-0.041-0.074-0.074-0.109-0.109c-0.068-0.06-0.15-0.046-0.17-0.035l-0.002,0.001c-3.932,1.623-5.862,0.698-7.568-0.449c0.004,0.006,0.004,0.016,0.004,0.023c0-0.007,0-0.017-0.004-0.023c-0.062-0.028-0.086-0.027-0.15,0.012C14.199,4.863,14.137,4.91,14.1,4.95C14.76,5.503,17.545,7.688,22.225,5.426z M14.375,4.901L14.375,4.901L14.375,4.901C14.375,4.901,14.375,4.901,14.375,4.901L14.375,4.901c0.004-0.009,0.004-0.017,0.008-0.025C14.379,4.885,14.379,4.895,14.375,4.901z"/> +<linearGradient id="SVGID_57" gradientUnits="userSpaceOnUse" x1="21.1" y1="8.73" x2="20.93" y2="8.68"> +<stop stop-color="#5F811B" offset="0"/> +<stop stop-color="#75C145" offset="1"/> +</linearGradient> +<path opacity="0.72" fill="url(#SVGID_57)" enable-background="new " d="M19.959,12.052l1.949-6.711c0.105-0.019,0.156,0.042,0.156,0.042l-1.944,6.695C20.121,12.076,20.041,12.017,19.959,12.052z"/> +<linearGradient id="SVGID_58" gradientUnits="userSpaceOnUse" x1="21.91" y1="5.41" x2="22.26" y2="5.41"> +<stop stop-color="#D3ED89" offset="0"/> +<stop stop-color="#5F811B" offset="1"/> +</linearGradient> +<path opacity="0.6" fill="url(#SVGID_58)" enable-background="new " d="M21.912,5.343c0.006-0.025,0.01-0.037,0.033-0.061c0.02-0.011,0.102-0.025,0.17,0.035c0.064,0.062,0.166,0.131,0.137,0.225c-0.01-0.019-0.039-0.043-0.039-0.043l-0.148-0.118C22.064,5.381,22.016,5.324,21.912,5.343z"/> +<linearGradient id="SVGID_59" gradientUnits="userSpaceOnUse" x1="21.94" y1="6.6" x2="14.24" y2="4.39"> +<stop stop-color="#93BF81" offset="0"/> +<stop stop-color="#26551B" offset="0.23"/> +<stop stop-color="#BDE256" offset="1"/> +</linearGradient> +<path opacity="0.3" fill="url(#SVGID_59)" enable-background="new " d="M14.101,4.952c-0.011,0.013-0.021,0.023-0.022,0.034l-0.002,0.002l-0.01,0.023c0.594,0.501,3.408,2.813,8.189,0.486c-0.003-0.025-0.014-0.049-0.031-0.071C17.545,7.688,14.76,5.503,14.101,4.952z"/> +<path opacity="0.72" fill="url(#SVGID_55)" enable-background="new " d="M22.229,5.432c0.002,0.026-0.016,0.067-0.016,0.067l-0.152-0.123c0,0,0.021-0.05,0.01-0.087C22.123,5.312,22.221,5.417,22.229,5.432z"/> +<path opacity="0.6" fill="url(#SVGID_58)" enable-background="new " d="M21.912,5.343c0.006-0.025,0.01-0.037,0.033-0.061c0.02-0.011,0.104-0.025,0.17,0.035c0.064,0.062,0.17,0.129,0.138,0.226c-0.011-0.02-0.038-0.044-0.038-0.044l-0.15-0.118C22.064,5.381,22.016,5.324,21.912,5.343z"/> </svg> \ No newline at end of file
--- a/emailservices/emailframework/data/yahoo.svg Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailframework/data/yahoo.svg Thu Jan 07 12:38:38 2010 +0200 @@ -1,101 +1,45 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="44" height="44" viewBox="36.537 17.377 44 44"> -<rect fill="none" height="44" width="44" x="36.537" y="17.377"/> -<linearGradient id="SVGID_1" gradientUnits="userSpaceOnUse" x1="49.26" y1="25.84" x2="49.26" y2="42.11"> -<stop stop-color="#A6A6A6" offset="0"/> -<stop stop-color="#888888" offset="0.61"/> -<stop stop-color="#737373" offset="1"/> -</linearGradient> -<path d="M59.806,41.027l0.178-14.559l-0.026-0.026c-0.103-0.478-0.597-0.585-0.597-0.585H39.244 c0,0-0.623,0.075-0.637,0.771c-0.003,0.188-0.069,14.318-0.069,14.318c-0.001,0.019-0.003,0.095,0.007,0.2 c0.018,0.181,0.075,0.453,0.24,0.678c0.109,0.148,0.301,0.326,0.601,0.326l19.55,0.002c0.283,0,0.475-0.163,0.586-0.303 C59.778,41.532,59.803,41.109,59.806,41.027z" fill="url(#SVGID_1)"/> -<linearGradient id="SVGID_2" gradientUnits="userSpaceOnUse" x1="49.23" y1="26.81" x2="49.23" y2="41.55"> -<stop stop-color="#ACC7DD" offset="0"/> -<stop stop-color="#EDF7FF" offset="1"/> -</linearGradient> -<path d="M59.312,26.748l-0.117,14.193c0,0-0.012,0.545-0.401,0.545c-2.61,0-18.931-0.003-19.249-0.003 c-0.426,0-0.393-0.621-0.393-0.621l0.126-14.114H59.312" fill="url(#SVGID_2)"/> -<g fill-opacity="0.33" stroke-opacity="0.33"> -<polygon points="58.848,40.986 40.23,40.684 47.141,32.271 52.228,32.271 "/> -</g> -<g fill-opacity="0.33" stroke-opacity="0.33"> -<polygon points="58.125,40.685 39.498,40.985 46.292,32.271 51.379,32.271 "/> -</g> -<linearGradient id="SVGID_3" gradientUnits="userSpaceOnUse" x1="49.17" y1="32.61" x2="49.17" y2="43.16"> -<stop stop-color="#D1E2EE" offset="0"/> -<stop stop-color="#E4F3FF" offset="1"/> -</linearGradient> -<polygon fill="url(#SVGID_3)" points="58.848,41.323 39.498,41.322 46.717,32.608 51.803,32.608 "/> -<path d="M57.54,41.097c0,0-3.083-0.301-8.173-0.301 s-8.184,0.301-8.184,0.301" fill="#FFFFFF" fill-opacity="0.8" /> -<path d="M39.498,41.322c0,0,5.426-5.472,6.864-7.623l-0.379-0.135 L39.498,41.322z" fill="#FFFFFF" fill-opacity="0.6" /> -<path d="M58.855,41.322l-6.354-7.763l-0.383,0.135 C53.491,35.847,58.855,41.322,58.855,41.322z" fill="#FFFFFF" fill-opacity="0.6" /> -<path d="M39.544,41.483c-0.426,0-0.393-0.621-0.393-0.621 l0.126-14.114h0.447L39.54,40.862c0,0-0.036,0.621,0.39,0.621H39.544L39.544,41.483z" fill="#FFFFFF" fill-opacity="0.4" /> -<path d="M58.407,41.486c0.149,0,0.279,0,0.386,0 c0.39,0,0.401-0.545,0.401-0.545l0.118-14.193h-0.447l-0.059,14.193C58.807,40.941,58.797,41.486,58.407,41.486z" fill="#FFFFFF" fill-opacity="0.4" /> -<g fill-opacity="0.4" stroke-opacity="0.4"> -<path d="M39.278,26.75c0,0,8.156,10.261,9.93,10.261S59.312,26.75,59.312,26.75H39.278z"/> -</g> -<linearGradient id="SVGID_4" gradientUnits="userSpaceOnUse" x1="49.29" y1="35.82" x2="49.29" y2="26.75"> -<stop stop-color="#EEEEEE" offset="0"/> -<stop stop-color="#ECECEC" offset="0.02"/> -<stop stop-color="#C7C7C7" offset="0.31"/> -<stop stop-color="#ACACAC" offset="0.58"/> -<stop stop-color="#9C9C9C" offset="0.82"/> -<stop stop-color="#969696" offset="1"/> -</linearGradient> -<path d="M59.312,26.748H39.277c0,0,8.403,9.077,9.935,9.077 C50.743,35.825,59.312,26.748,59.312,26.748z" fill="url(#SVGID_4)"/> -<linearGradient id="SVGID_5" gradientUnits="userSpaceOnUse" x1="49.29" y1="35.33" x2="49.29" y2="26.52"> -<stop stop-color="#FFFFFF" offset="0"/> -<stop stop-color="#D5E9F7" offset="1"/> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" baseProfile="tiny" height="44px" version="1.1" viewBox="0 0 44 44" width="44px" x="0px" y="0px"> +<radialGradient cx="16.6729" cy="32.6836" gradientTransform="matrix(1 0 0 0.1855 0 26.6218)" gradientUnits="userSpaceOnUse" id="SVGID_1_" r="12.1104"> +<stop offset="0" style="stop-color:#636466"/> +<stop offset="0.4817" style="stop-color:#636466"/> +<stop offset="1" style="stop-color:#636466;stop-opacity:0"/> +</radialGradient> +<path d="M16.757,35.012c-7.248,0-12.307-1.365-12.307-2.553s5.06-1.479,12.307-1.479 c7.246,0.002,12.306,0.291,12.306,1.479S24.003,35.012,16.757,35.012z" fill="url(#SVGID_1_)"/> +<radialGradient cx="36.9902" cy="32.4746" gradientTransform="matrix(1 0 0 0.2569 0 24.1333)" gradientUnits="userSpaceOnUse" id="SVGID_2_" r="4.0342"> +<stop offset="0" style="stop-color:#636466"/> +<stop offset="0.3636" style="stop-color:#636466"/> +<stop offset="1" style="stop-color:#636466;stop-opacity:0"/> +</radialGradient> +<path d="M37.045,31.314c1.98,0.074,3.793,0.375,3.979,1.062c0,0.702-1.664,1.167-3.906,1.108 c-2.961,0-4.122-0.41-4.159-1.053C32.906,31.643,34.661,31.229,37.045,31.314z" fill="url(#SVGID_2_)"/> +<linearGradient gradientTransform="matrix(1 0 0 1 -144.0156 -532.127)" gradientUnits="userSpaceOnUse" id="SVGID_3_" x1="160.8359" x2="160.8359" y1="542.251" y2="562.5588"> +<stop offset="0" style="stop-color:#88449A"/> +<stop offset="0.231" style="stop-color:#824094"/> +<stop offset="0.5333" style="stop-color:#723684"/> +<stop offset="0.8737" style="stop-color:#582569"/> +<stop offset="1" style="stop-color:#4C1E5D"/> </linearGradient> -<path d="M59.103,26.524c-0.118,0-19.495,0-19.611,0c-0.238,0-0.214,0.224-0.214,0.224 s8.581,8.578,9.939,8.578s10.095-8.578,10.095-8.578S59.339,26.524,59.103,26.524z" fill="url(#SVGID_5)"/> -<path d="M59.103,26.524c-0.118,0-19.495,0-19.611,0 c-0.238,0-0.214,0.168-0.214,0.168s8.581,6.449,9.939,6.449s10.095-6.449,10.095-6.449S59.339,26.524,59.103,26.524z" fill="#FFFFFF" fill-opacity="0.8" /> -<linearGradient id="SVGID_6" gradientUnits="userSpaceOnUse" x1="58.51" y1="35.84" x2="58.51" y2="52.9"> -<stop stop-color="#8418A8" offset="0"/> -<stop stop-color="#4A005C" offset="1"/> -</linearGradient> -<path d="M58.512,52.899c-6.571,0-11.161-3.509-11.161-8.533c0-5.022,4.589-8.529,11.161-8.529 c6.57,0,11.158,3.507,11.158,8.529C69.671,49.39,65.082,52.899,58.512,52.899L58.512,52.899z" fill="url(#SVGID_6)"/> -<linearGradient id="SVGID_7" gradientUnits="userSpaceOnUse" x1="72.51" y1="48.54" x2="72.51" y2="52.62"> -<stop stop-color="#8418A8" offset="0"/> -<stop stop-color="#4A005C" offset="1"/> -</linearGradient> -<polygon fill="url(#SVGID_7)" points="74.239,52.623 73.57,52.542 71.01,52.228 70.342,52.145 70.423,51.477 70.701,49.205 70.783,48.537 71.452,48.619 74.014,48.933 74.683,49.014 74.6,49.683 74.32,51.955 "/> -<linearGradient id="SVGID_8" gradientUnits="userSpaceOnUse" x1="74.11" y1="36" x2="74.11" y2="47.87"> -<stop stop-color="#8418A8" offset="0"/> -<stop stop-color="#4A005C" offset="1"/> -</linearGradient> -<polygon fill="url(#SVGID_8)" points="74.252,47.871 73.66,47.798 71.784,47.568 71.193,47.495 71.192,46.901 71.175,36.764 71.174,35.999 71.934,36.095 76.29,36.644 77.043,36.74 76.858,37.476 74.396,47.292 "/> -<linearGradient id="SVGID_9" gradientUnits="userSpaceOnUse" x1="58.51" y1="36.51" x2="58.51" y2="52.23"> -<stop stop-color="#B340D9" offset="0"/> -<stop stop-color="#7B0099" offset="1"/> -</linearGradient> -<path d="M58.513,52.226c-6.175,0-10.487-3.231-10.487-7.86c0-4.624,4.312-7.855,10.487-7.855 c6.173,0,10.485,3.231,10.485,7.855C68.998,48.995,64.686,52.226,58.513,52.226z" fill="url(#SVGID_9)"/> -<linearGradient id="SVGID_10" gradientUnits="userSpaceOnUse" x1="72.51" y1="49.29" x2="72.51" y2="51.87"> -<stop stop-color="#B340D9" offset="0"/> -<stop stop-color="#7B0099" offset="1"/> +<path d="M16.821,33.165c-9.292,0-15.779-4.858-15.779-11.826c0-6.957,6.487-11.819,15.779-11.819 c9.289,0,15.777,4.862,15.777,11.819C32.6,28.305,26.109,33.165,16.821,33.165z" fill="url(#SVGID_3_)"/> +<linearGradient gradientTransform="matrix(1 0 0 1 -144.0156 -532.127)" gradientUnits="userSpaceOnUse" id="SVGID_4_" x1="180.7793" x2="180.7793" y1="541.584" y2="566.3591"> +<stop offset="0" style="stop-color:#88449A"/> +<stop offset="0.2697" style="stop-color:#844296"/> +<stop offset="0.517" style="stop-color:#7A3B8B"/> +<stop offset="0.7554" style="stop-color:#672F79"/> +<stop offset="0.9871" style="stop-color:#4E1F5F"/> +<stop offset="1" style="stop-color:#4C1E5D"/> </linearGradient> -<polygon fill="url(#SVGID_10)" points="73.652,51.873 71.092,51.558 71.37,49.288 73.932,49.601 "/> -<linearGradient id="SVGID_11" gradientUnits="userSpaceOnUse" x1="74.03" y1="36.76" x2="74.03" y2="47.13"> -<stop stop-color="#B340D9" offset="0"/> -<stop stop-color="#7B0099" offset="1"/> -</linearGradient> -<polygon fill="url(#SVGID_11)" points="71.849,36.762 71.865,46.899 73.743,47.129 76.205,37.312 "/> -<g fill-opacity="0.66" stroke-opacity="0.66"> -<linearGradient id="SVGID_12" gradientUnits="userSpaceOnUse" x1="58.51" y1="36.66" x2="58.51" y2="48.71"> -<stop stop-color="#FFFFFF" offset="0"/> -<stop stop-color="#8A26A3" offset="1"/> +<polygon fill="url(#SVGID_4_)" points="38.678,32.711 34.385,32.184 34.85,28.375 39.143,28.902 "/> +<linearGradient gradientTransform="matrix(1 0 0 1 -144.0156 -532.127)" gradientUnits="userSpaceOnUse" id="SVGID_5_" x1="183.3213" x2="183.3213" y1="541.585" y2="566.3589"> +<stop offset="0" style="stop-color:#88449A"/> +<stop offset="0.231" style="stop-color:#824094"/> +<stop offset="0.5333" style="stop-color:#723684"/> +<stop offset="0.8737" style="stop-color:#582569"/> +<stop offset="1" style="stop-color:#4C1E5D"/> </linearGradient> -<path d="M58.513,48.711c-4.936,0-8.382-2.479-8.382-6.028c0-3.548,3.447-6.026,8.382-6.026 c4.934,0,8.38,2.479,8.38,6.026C66.893,46.232,63.446,48.711,58.513,48.711L58.513,48.711z" fill="url(#SVGID_12)"/> -<linearGradient id="SVGID_13" gradientUnits="userSpaceOnUse" x1="72.33" y1="49.81" x2="72.33" y2="50.82"> -<stop stop-color="#FFFFFF" offset="0"/> -<stop stop-color="#8A26A3" offset="1"/> -</linearGradient> -<polygon fill="url(#SVGID_13)" points="72.93,50.822 71.616,50.666 71.725,49.805 73.038,49.962 "/> -<linearGradient id="SVGID_14" gradientUnits="userSpaceOnUse" x1="73.3" y1="37.3" x2="73.3" y2="45.41"> -<stop stop-color="#FFFFFF" offset="0"/> -<stop stop-color="#8A26A3" offset="1"/> -</linearGradient> -<polygon fill="url(#SVGID_14)" points="72.375,45.413 72.271,45.4 72.258,37.304 74.344,37.567 "/> -</g> -<path fill-opacity="0.25" d="M62.098,49.658l-0.682-0.047c-0.188-0.013-1.543-0.013-1.988-0.013h-0.654h-0.525 c-0.213,0-0.614,0.01-1.052,0.02c-0.543,0.013-1.145,0.026-1.532,0.026c-0.105,0-0.197-0.001-0.268-0.003l-0.777-0.023 l0.134-0.766l0.102-0.579l0.09-0.516l0.521-0.04c0.075-0.006,0.201-0.007,0.357-0.007c0.174-0.001,0.627-0.002,0.901-0.041 c-0.001-0.046-0.001-0.093-0.002-0.141c-0.002-0.129-0.004-0.284-0.004-0.477v-0.386c0-0.144,0-0.393-0.025-0.633 c-0.372-0.597-2.491-3.226-3.205-3.883c-0.183-0.029-0.515-0.071-0.751-0.101c-0.443-0.057-0.724-0.093-0.883-0.127l-0.518-0.111 l-0.015-0.528l-0.015-0.522l-0.013-0.427l0.38-0.193c0.179-0.09,0.375-0.105,0.775-0.105c0.169,0,0.375,0.003,0.605,0.008 l0.096,0.001c0.258,0.004,0.547,0.008,0.849,0.008c0.297,0,0.607-0.004,0.916-0.016c0.274-0.01,0.655-0.015,1.06-0.015 c0.776,0,2.015,0.02,2.273,0.049l0.686,0.08l-0.097,0.684l-0.065,0.462l-0.063,0.448l-0.44,0.109 c-0.165,0.043-0.426,0.063-0.862,0.091c0.388,0.525,0.803,1.06,1.163,1.524c0.16,0.206,0.31,0.4,0.445,0.576 c0.103-0.084,0.218-0.177,0.348-0.282c0.193-0.157,0.482-0.393,0.752-0.625c-0.162-0.021-0.29-0.035-0.341-0.037l-0.54-0.021 l-0.114-0.532l-0.109-0.594l-0.124-0.681l0.683-0.105c0.099-0.016,0.26-0.029,0.771-0.029c0.331,0,0.736,0.006,1.125,0.012 c0.352,0.005,0.69,0.01,0.946,0.01c1.148,0,2.266,0.004,2.661,0.036l1.162,0.096l-0.663,0.959l-0.386,0.56l-0.177,0.256 l-0.31,0.031c-0.148,0.016-0.897,0.178-1.18,0.239l-0.167,0.036c-0.525,0.284-2.853,2.136-3.216,2.659 c-0.023,0.149-0.037,0.368-0.037,0.589l-0.024,0.509c0.001,0.117,0.022,0.308,0.049,0.499c0.126,0.001,0.259,0.001,0.369,0.002 c0.642,0.002,0.941,0.007,1.112,0.035l0.595,0.099l-0.032,0.603l-0.032,0.607L62.098,49.658L62.098,49.658z" fill="#A02DBD"/> -<path d="M64.631,42.427c-0.228,0.023-1.172,0.234-1.489,0.302c-0.34,0.091-3.445,2.489-3.649,3.08 c-0.045,0.204-0.067,0.517-0.067,0.812l-0.022,0.476c0,0.341,0.094,0.888,0.14,1.184c0.203,0.045,1.681,0.005,1.953,0.051 l-0.033,0.608c-0.266-0.019-2.142-0.014-3.214-0.014c-0.545,0-2.293,0.059-2.831,0.043l0.101-0.579 c0.295-0.023,1.514,0.053,1.783-0.23c0.133-0.142,0.091-0.291,0.091-1.107v-0.385c0-0.183,0-0.521-0.045-0.839 c-0.113-0.34-2.849-3.755-3.552-4.3c-0.204-0.067-1.482-0.195-1.799-0.264l-0.015-0.522c0.157-0.079,1.579,0.021,2.959-0.031 c0.906-0.033,2.976,0,3.23,0.03l-0.065,0.46c-0.273,0.069-1.582,0.094-1.922,0.185c0.883,1.313,2.282,3.007,2.735,3.664 c0.25-0.362,2.442-1.87,2.509-2.391c-0.341-0.068-1.467-0.231-1.647-0.231l-0.108-0.594c0.309-0.048,1.932,0,2.738,0 c0.696,0,2.184,0,2.606,0.035L64.631,42.427z" fill="#FFFFFF"/> -<polygon fill="#7B0099" points="76.299,48.863 75.897,48.863 75.897,48.634 76.949,48.634 76.949,48.863 76.547,48.863 76.547,49.935 76.299,49.935 "/> -<polygon fill="#7B0099" points="77.229,48.634 77.493,48.634 77.887,49.251 78.28,48.634 78.537,48.634 78.537,49.935 78.297,49.935 78.297,49.01 77.896,49.634 77.87,49.634 77.469,49.01 77.469,49.935 77.229,49.935 "/> -</svg> \ No newline at end of file +<polygon fill="url(#SVGID_5_)" points="35.654,8.989 35.68,25.984 38.83,26.366 42.957,9.911 "/> +<path d="M26.029,18.421c-0.348,0.036-1.766,0.354-2.242,0.456c-0.51,0.134-5.184,3.747-5.49,4.635 c-0.07,0.307-0.103,0.775-0.103,1.221l-0.036,0.715c0,0.516,0.143,1.335,0.211,1.779c0.304,0.067,2.529,0.008,2.94,0.076 l-0.051,0.916c-0.401-0.027-3.223-0.019-4.836-0.019c-0.821,0-3.452,0.089-4.259,0.062l0.151-0.869 c0.445-0.033,2.278,0.078,2.684-0.348c0.201-0.211,0.135-0.436,0.135-1.666V24.8c0-0.276,0-0.786-0.066-1.263 c-0.172-0.512-4.286-5.651-5.346-6.471c-0.306-0.101-2.229-0.291-2.708-0.394L6.99,15.885c0.241-0.118,2.377,0.031,4.455-0.048 c1.363-0.053,4.479,0,4.862,0.045l-0.098,0.691c-0.412,0.107-2.38,0.144-2.894,0.281c1.329,1.976,3.436,4.522,4.116,5.513 c0.377-0.548,3.674-2.815,3.778-3.602C20.695,18.663,19,18.42,18.73,18.42l-0.166-0.893c0.465-0.072,2.909,0,4.122,0 c1.047,0,3.285,0,3.924,0.053L26.029,18.421z" fill="#FFFFFF"/> +<polygon fill="#DCBCDA" fill-opacity="0.5" points="36.04,11.116 36.09,9.583 42.396,10.301 41.98,11.645 41.928,11.07 36.296,10.396 " stroke-opacity="0.5"/> +<path d="M30.77,16.643c-2.438-3.875-7.81-6.567-14.048-6.567 c-6.238,0-11.613,2.692-14.05,6.567c3.298-2.664,8.366-4.371,14.05-4.371C22.404,12.272,27.473,13.979,30.77,16.643z" fill="#DCBCDA" fill-opacity="0.5" stroke-opacity="0.5"/> +<rect fill="none" height="44" width="44"/> +</svg>
--- a/emailservices/emailframework/inc/emailversionnumbers.hrh Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailframework/inc/emailversionnumbers.hrh Thu Jan 07 12:38:38 2010 +0200 @@ -12,7 +12,7 @@ * Contributors: * * Description : Common email version number definitions -* Version : %version: 9 % +* Version : %version: 10.1.1 % * */
--- a/emailservices/emailserver/cmailhandlerplugin/group/cmailhandlerplugin.mmp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/group/cmailhandlerplugin.mmp Thu Jan 07 12:38:38 2010 +0200 @@ -16,7 +16,7 @@ */ #include <platform_paths.hrh> -#include <data_caging_paths.hrh> // Needed for ECOM_RESOURCE_DIR +#include <data_caging_paths.hrh> // Needed for APP_RESOURCE_DIR #include "../../../../inc/emailversionnumbers.hrh" // KEmailBinaryVersionNumber @@ -69,7 +69,7 @@ #if !defined(FF_CMAIL_INTEGRATION) START RESOURCE ../data/emailwidget.rss HEADER -TARGETPATH ECOM_RESOURCE_DIR +TARGETPATH APP_RESOURCE_DIR LANGUAGE_IDS END #endif // FF_CMAIL_INTEGRATION
--- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpsifconsts.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpsifconsts.h Thu Jan 07 12:38:38 2010 +0200 @@ -34,9 +34,11 @@ _LIT( KAt,"@"); _LIT( KDot,"."); _LIT( KMifPrefix, "mif("); -_LIT( KMifPath, "z:\\resource\\apps\\cmailhandlerplugin.mif"); +// Mif file name and path, drive letter need to be parsed run time +_LIT( KMifPath, "\\resource\\apps\\cmailhandlerplugin.mif"); _LIT( KSpace, " "); -_LIT( KResourceFile, "z:emailwidget.rsc" ); +// Resource file name and path, drive letter need to be parsed run time +_LIT( KResourceFile, "\\resource\\apps\\emailwidget.rsc" ); _LIT( KDissociated,"0"); //
--- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpssettings.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpssettings.h Thu Jan 07 12:38:38 2010 +0200 @@ -126,7 +126,7 @@ /** * */ - void GetContentId( TInt aId, TDes16& aValue ); + TInt GetContentId( TInt aMailboxId, TInt aId, TDes16& aValue ); /** *
--- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailwidgetcenrepkeys.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailwidgetcenrepkeys.h Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -11,88 +11,38 @@ * * Contributors: * -* Description: Constants for cmailhandlerplugin Central Repository keys. +* Description: Constants for cmailhandlerplugin Central Repository keys. * */ -#ifndef CMAILCENREPKEYS_H -#define CMAILCENREPKEYS_H +#ifndef CMAILWIDGETCENREPKEYS_H +#define CMAILWIDGETCENREPKEYS_H #include <e32std.h> +// Repository Uid +const TUid KCRUidCmailWidget = {0x2001E272}; + const TUint32 KCMailMailboxIdBase = 0x00000100; const TUint32 KCMailPluginIdBase = 0x00000200; const TUint32 KCMailWidgetContentIdBase = 0x00000300; -// Repository Uid -const TUid KCRUidCmailWidget = {0x2001E272}; - -// Keys - // Constants for observing the whole repository const TUint32 KCmailPartialKey = 0x00000000; const TUint32 KCmailMask = 0x00000000; -// Constants that define/specify mailbox entries +// Constants that define internal mailbox entries const TUint32 KCmailPartialKeyRange = 0x00000100; -const TUint32 KCmailRangeMask = 0x00000f00; - -const TUint32 KCMailMailbox1 = 0x100; -const TUint32 KCMailMailbox2 = 0x101; -const TUint32 KCMailMailbox3 = 0x102; -const TUint32 KCMailMailbox4 = 0x103; -const TUint32 KCMailMailbox5 = 0x104; -const TUint32 KCMailMailbox6 = 0x105; -const TUint32 KCMailMailbox7 = 0x106; -const TUint32 KCMailMailbox8 = 0x107; -const TUint32 KCMailMailbox9 = 0x108; -const TUint32 KCMailMailbox10 = 0x109; -const TUint32 KCMailMailbox11 = 0x10a; -const TUint32 KCMailMailbox12 = 0x10b; -const TUint32 KCMailMailbox13 = 0x10c; -const TUint32 KCMailMailbox14 = 0x10d; -const TUint32 KCMailMailbox15 = 0x10e; -const TUint32 KCMailMailbox16 = 0x10f; -const TUint32 KCMailMailbox17 = 0x110; -const TUint32 KCMailMailbox18 = 0x111; +const TUint32 KCmailRangeMask = 0x0000ff00; -const TUint32 KCMailPlugin1 = 0x200; -const TUint32 KCMailPlugin2 = 0x201; -const TUint32 KCMailPlugin3 = 0x202; -const TUint32 KCMailPlugin4 = 0x203; -const TUint32 KCMailPlugin5 = 0x204; -const TUint32 KCMailPlugin6 = 0x205; -const TUint32 KCMailPlugin7 = 0x206; -const TUint32 KCMailPlugin8 = 0x207; -const TUint32 KCMailPlugin9 = 0x208; -const TUint32 KCMailPlugin10 = 0x209; -const TUint32 KCMailPlugin11 = 0x20a; -const TUint32 KCMailPlugin12 = 0x20b; -const TUint32 KCMailPlugin13 = 0x20c; -const TUint32 KCMailPlugin14 = 0x20d; -const TUint32 KCMailPlugin15 = 0x20e; -const TUint32 KCMailPlugin16 = 0x20f; -const TUint32 KCMailPlugin17 = 0x210; -const TUint32 KCMailPlugin18 = 0x211; +// Constants that define external mailbox entries +const TUint32 KCmailExtMailboxKeyRange = 0x00001100; +const TUint32 KCmailExtMailboxRangeMask = 0x0000ff00; -// Constants that assosiates Home Screen widget instances to mailbox settings -const TUint32 KCMailWidgetContentId1 = 0x300; -const TUint32 KCMailWidgetContentId2 = 0x301; -const TUint32 KCMailWidgetContentId3 = 0x302; -const TUint32 KCMailWidgetContentId4 = 0x303; -const TUint32 KCMailWidgetContentId5 = 0x304; -const TUint32 KCMailWidgetContentId6 = 0x305; -const TUint32 KCMailWidgetContentId7 = 0x306; -const TUint32 KCMailWidgetContentId8 = 0x307; -const TUint32 KCMailWidgetContentId9 = 0x308; -const TUint32 KCMailWidgetContentId10 = 0x309; -const TUint32 KCMailWidgetContentId11 = 0x30a; -const TUint32 KCMailWidgetContentId12 = 0x30b; -const TUint32 KCMailWidgetContentId13 = 0x30c; -const TUint32 KCMailWidgetContentId14 = 0x30d; -const TUint32 KCMailWidgetContentId15 = 0x30e; -const TUint32 KCMailWidgetContentId16 = 0x30f; -const TUint32 KCMailWidgetContentId17 = 0x310; -const TUint32 KCMailWidgetContentId18 = 0x311; -#endif // CMAILCENREPKEYS_H +// External mailboxes' base indexes +const TUint32 KCMailExtMailboxBase = 0x00001100; +const TUint32 KCMailExtPluginIdOffset = 0x00000100; +const TUint32 KCMailExtWidgetCidOffset = 0x00000200; + +#endif // CMAILWIDGETCENREPKEYS_H
--- a/emailservices/emailserver/cmailhandlerplugin/rom/cmailhandlerpluginresources.iby Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/rom/cmailhandlerpluginresources.iby Thu Jan 07 12:38:38 2010 +0200 @@ -24,7 +24,7 @@ #ifdef FF_EMAIL_FRAMEWORK -data=DATAZ_\ECOM_RESOURCE_DIR\emailwidget.rsc ECOM_RESOURCE_DIR\emailwidget.rsc +data=DATAZ_\APP_RESOURCE_DIR\emailwidget.rsc APP_RESOURCE_DIR\emailwidget.rsc #endif //FF_EMAIL_FRAMEWORK
--- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -115,18 +115,18 @@ // and pass it on to actual publisher interface iLiwIf->SetConfiguration( iSettings->Configuration() ); - const TInt iiMax( iSettings->Mailboxes().Count() ); + TInt iiMax( iSettings->Mailboxes().Count() ); for ( TInt ii = 0; ii < iiMax; ii++ ) { CFSMailBox* mailbox( NULL ); mailbox = MailClient().GetMailBoxByUidL( iSettings->Mailboxes()[ii] ); - TInt id(0); + TInt mailboxId(0); if (mailbox) { - id = mailbox->GetId().Id(); + mailboxId = mailbox->GetId().Id(); } - if ( !id ) + if ( !mailboxId ) { // Remove box from settings iSettings->RemoveMailboxL( ii ); @@ -136,13 +136,24 @@ else { CleanupStack::PushL( mailbox ); - CMailMailboxDetails* mailboxDetails = CreateMailboxDetailsL( *mailbox ); - CleanupStack::PushL( mailboxDetails ); - TBuf<KMaxDescLen> cid; - iSettings->GetContentId(id, cid); - mailboxDetails->SetWidgetInstance(cid); - iAccountsArray.AppendL( mailboxDetails ); - CleanupStack::Pop( mailboxDetails ); + TInt id(1); + while (id) + { + CMailMailboxDetails* mailboxDetails = CreateMailboxDetailsL( *mailbox ); + CleanupStack::PushL( mailboxDetails ); + + if (id > 1) + { + iiMax = iiMax - 1; + } + TBuf<KMaxDescLen> cid; + id = iSettings->GetContentId(mailboxId, id, cid); + mailboxDetails->SetWidgetInstance(cid); + iAccountsArray.AppendL( mailboxDetails ); + + CleanupStack::Pop( mailboxDetails ); + } + CleanupStack::PopAndDestroy( mailbox ); } }
--- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpsif.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpsif.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -106,11 +106,12 @@ // create resourcefile CCoeEnv* env = CCoeEnv::Static(); - TFileName resourceFile; + // Load resource file from the same drive where this dll is loaded from + TFileName dllFileName; + Dll::FileName( dllFileName ); TParse parse; - - parse.Set( KResourceFile, &KDC_ECOM_RESOURCE_DIR, NULL ); - resourceFile = parse.FullName(); + User::LeaveIfError( parse.Set( KResourceFile, &dllFileName, NULL ) ); + TFileName resourceFile( parse.FullName() ); BaflUtils::NearestLanguageFile( env->FsSession(), resourceFile ); iResourceFileOffset = env->AddResourceFileL( resourceFile ); @@ -474,47 +475,53 @@ } } + // Parse mif file full path by own dll drive letter + TFileName dllFileName; + Dll::FileName( dllFileName ); + TParse mifParse; + User::LeaveIfError( mifParse.Set( KMifPath, &dllFileName, NULL ) ); + if (!iconIds.Length()) { TBuf<KMaxDescLen> id; - iconIds.Copy(KMifPrefix); - iconIds.Append(KMifPath); - iconIds.Append(KSpace); - id.Num(aBitmapId); - iconIds.Append(id); - iconIds.Append(KSpace); - id.Num(aBitmapMaskId); - iconIds.Append(id); + iconIds.Copy( KMifPrefix ); + iconIds.Append( mifParse.FullName() ); + iconIds.Append( KSpace ); + id.Num( aBitmapId ); + iconIds.Append( id ); + iconIds.Append( KSpace ); + id.Num( aBitmapMaskId ); + iconIds.Append( id ); } // The actual image publishing part starts here CLiwGenericParamList* inparam = &(iServiceHandler->InParamListL()); CLiwGenericParamList* outparam = &(iServiceHandler->OutParamListL()); - TLiwGenericParam type( KType, TLiwVariant(KCpData)); + TLiwGenericParam type( KType, TLiwVariant( KCpData ) ); inparam->AppendL( type ); CLiwDefaultMap* pdatamap = CLiwDefaultMap::NewLC(); CLiwDefaultMap* datamap = CLiwDefaultMap::NewLC(); - pdatamap->InsertL( KPublisherId, TLiwVariant( KPubId )); - pdatamap->InsertL( KContentType, TLiwVariant( aContentType )); - pdatamap->InsertL( KContentId, TLiwVariant( aContentId )); + pdatamap->InsertL( KPublisherId, TLiwVariant( KPubId ) ); + pdatamap->InsertL( KContentType, TLiwVariant( aContentType ) ); + pdatamap->InsertL( KContentId, TLiwVariant( aContentId ) ); - datamap->InsertL(aKey, TLiwVariant(iconIds)); + datamap->InsertL( aKey, TLiwVariant(iconIds) ); pdatamap->InsertL( KDataMap, TLiwVariant(datamap) ); - TLiwGenericParam item( KItem, TLiwVariant( pdatamap )); + TLiwGenericParam item( KItem, TLiwVariant( pdatamap ) ); inparam->AppendL( item ); // Publish icon ( or remove it from widget when no id provided ) if ( aBitmapId == KNullIcon ) { - iMsgInterface->ExecuteCmdL( KDelete, *inparam, *outparam); + iMsgInterface->ExecuteCmdL( KDelete, *inparam, *outparam ); } else { - iMsgInterface->ExecuteCmdL( KAdd, *inparam, *outparam); + iMsgInterface->ExecuteCmdL( KAdd, *inparam, *outparam ); } CleanupStack::PopAndDestroy( datamap );
--- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpssettings.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpssettings.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -429,20 +429,35 @@ // CMailCpsSettings::GetContentId // --------------------------------------------------------------------------- // -void CMailCpsSettings::GetContentId( TInt aId, TDes16& aValue ) +TInt CMailCpsSettings::GetContentId( TInt aMailboxId, TInt aId, TDes16& aValue ) { - FUNC_LOG; + FUNC_LOG; + TBool cidFound(EFalse); + TInt ret(0); + TInt found(0); for (TInt i = 0; i < KMaxMailboxCount; i++) { TInt value; TUint32 mailboxKey(KCMailMailboxIdBase+i); - iCenRep->Get( mailboxKey, value ); - if (aId == value) + iCenRep->Get( mailboxKey, value ); + if (aMailboxId == value) { - iCenRep->Get( KCMailWidgetContentIdBase+i, aValue ); - break; + found++; + if ( !cidFound && found == aId ) + { + iCenRep->Get( KCMailWidgetContentIdBase+i, aValue ); + cidFound = ETrue; + } + else if ( cidFound && found == aId + 1 ) + { + // There is more widgets with same mailbox accounts. + ret = aId + 1; + break; + } } - } + } + // if there is more than one mailbox with different cid return id of next mailbox + return ret; } // ---------------------------------------------------------------------------
--- a/emailservices/emailserver/src/fsmailserver.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailserver/src/fsmailserver.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -90,8 +90,6 @@ // GLDEF_C TInt E32Main() { - - TInt error = KErrNone; // First check that the server isn't already running
--- a/emailservices/emailservermonitor/src/emailshutter.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailservermonitor/src/emailshutter.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -54,18 +54,18 @@ // Non-UI clients that need to be closed const TUid KOtherClientsToClose[] = { - { FSMailServerUidAsTInt }, // FSMailServer - { KPcsServerProcessUidAsTInt } // PCS server + { KPcsServerProcessUidAsTInt }, // PCS server + { FSMailServerUidAsTInt }, // FSMailServer }; // Plugin processes that need to be closed const TUid KPluginProcessesToClose[] = { // MfE plugin - { 0x10206961 }, // KUidEasServer - { 0x10206970 }, // KUidEasTarmAccess - { 0x10206972 }, // KUidEasStartup + { 0x20012BEE }, // KUidEasStartup + { 0x20012BEC }, // KUidEasTarmAccess { 0x20012BD4 }, // KEasLogSenderServer + { 0x20012BE6 }, // KUidEasServer // Oz plugin { 0x2002136A }, // monitor { 0x20021367 }, // server
--- a/emailservices/emailstore/message_store/MsgStoreRfsPlugin/group/RfsMsgStorePlugin.mmp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailstore/message_store/MsgStoreRfsPlugin/group/RfsMsgStorePlugin.mmp Thu Jan 07 12:38:38 2010 +0200 @@ -55,6 +55,8 @@ LIBRARY ecom.lib LIBRARY efsrv.lib LIBRARY platformenv.lib +LIBRARY bafl.lib +LIBRARY estor.lib // END FILE RfsMsgStorePlugin.mmp
--- a/emailservices/emailstore/message_store/MsgStoreRfsPlugin/inc/RfsMsgStorePlugin.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailstore/message_store/MsgStoreRfsPlugin/inc/RfsMsgStorePlugin.h Thu Jan 07 12:38:38 2010 +0200 @@ -56,6 +56,7 @@ * @return None */ void ExecuteCustomCommandL( const TRfsReason aType, TDesC& aCommand ); + TInt GetDriveL( TDriveNumber& aDrive ); private: CRfsMsgStorePlugin();
--- a/emailservices/emailstore/message_store/MsgStoreRfsPlugin/src/RfsMsgStorePlugin.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailservices/emailstore/message_store/MsgStoreRfsPlugin/src/RfsMsgStorePlugin.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -20,6 +20,8 @@ #include "RfsMsgStorePlugin.h" #include "EmailStoreUids.hrh" +#include <bautils.h> +#include <s32file.h> // ----------------------------------------------------------------------------- // CRfsMsgStorePlugin::NewL() @@ -53,27 +55,25 @@ if ( aType == ENormalRfs || aType == EDeepRfs || aType == EInitRfs ) { TUint driveStatus( 0 ); - - if ( DriveInfo::GetDriveStatus( iFs, EDriveE, driveStatus ) == KErrNone ) + TDriveNumber drive( EDriveC ); + GetDriveL( drive ); + if ( DriveInfo::GetDriveStatus( iFs, drive, driveStatus ) == KErrNone ) { - // check if internal E: drive is exists on the device - if ( ( driveStatus & DriveInfo::EDriveUserVisible ) && - ( driveStatus & DriveInfo::EDriveInternal ) && - ( driveStatus & DriveInfo::EDrivePresent ) ) - { - // since we are dealing with internal E: drive only, - // it is ok to hardcoded the E: in the string - _LIT( KMsgStoreEDrivePrivate, "E:\\Private\\" ); - - TFileName msgStorePath( KMsgStoreEDrivePrivate ); - msgStorePath.AppendNum( KUidMessageStoreExe, EHex ); - msgStorePath.Append( KPathDelimiter ); - CFileMan* fileManager = CFileMan::NewL( iFs ); - // this will recursively delete all files in all directories under the msgStorePath - // but directories under the msgStorePath are not deleted - fileManager->Delete( msgStorePath, CFileMan::ERecurse ); - delete fileManager; - } + _LIT( KPrivate, ":\\Private\\" ); + TChar driveChar; + RFs::DriveToChar(drive, driveChar); + TFileName msgStorePath; + TBuf<5> driveLetter; + driveLetter.Append(driveChar); + msgStorePath.Append(driveLetter); + msgStorePath.Append(KPrivate); + msgStorePath.AppendNum( KUidMessageStoreExe, EHex ); + msgStorePath.Append( KPathDelimiter ); + CFileMan* fileManager = CFileMan::NewL( iFs ); + // this will recursively delete all files in all directories under the msgStorePath + // but directories under the msgStorePath are not deleted + fileManager->Delete( msgStorePath, CFileMan::ERecurse ); + delete fileManager; } } } @@ -115,5 +115,47 @@ { User::LeaveIfError( iFs.Connect() ); } + +// ----------------------------------------------------------------------------- +// CRfsMsgStorePlugin::GetDriveL(TDriveNumber&) +// ----------------------------------------------------------------------------- +// +TInt CRfsMsgStorePlugin::GetDriveL( TDriveNumber& aDrive ) + { + _LIT16( KDriveToUseFile, "db_drive.cfg" ); + TInt ret( KErrNotFound ); + RFs fs; + if( fs.Connect() == KErrNone ) + { + CleanupClosePushL( fs ); //+fs + TFileName fileName; + _LIT( KCDrive, "C:" ); + _LIT( KPrivate, "Private" ); + fileName.Append(KCDrive()); + fileName.Append( KPathDelimiter ); + fileName.Append(KPrivate); + fileName.Append( KPathDelimiter ); + fileName.AppendNum( KUidMessageStoreExe, EHex ); + fileName.Append( KPathDelimiter ); + fileName.Append( KDriveToUseFile ); + if( BaflUtils::FileExists( fs, fileName ) ) + { + RFileReadStream reader; + if ( reader.Open( fs, fileName, EFileRead ) == KErrNone ) + { + CleanupClosePushL( reader ); //+reader + TUint drive = reader.ReadUint32L(); + CleanupStack::PopAndDestroy( &reader ); //-reader + if(drive <=EDriveZ) + { + aDrive = static_cast<TDriveNumber>( drive ); + ret = KErrNone; + } + } + } + CleanupStack::PopAndDestroy( &fs ); //-fs + } // end if + return ret; + } // END FILE RfsMsgStorePlugin.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/bwins/t_msgstoreu.def Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,4 @@ +EXPORTS + ?LibEntryL@@YAPAVCTestModuleBase@@XZ @ 1 NONAME ; class CTestModuleBase * LibEntryL(void) + ?SetRequirements@@YAHAAPAVCTestModuleParam@@AAK@Z @ 2 NONAME ; int SetRequirements(class CTestModuleParam * &, unsigned long &) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/group/bld.inf Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,22 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +PRJ_PLATFORMS +DEFAULT + +PRJ_TESTMMPFILES +t_bufferedmsgcreator.mmp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/group/t_bufferedmsgcreator.mmp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: project file for Message Store unit test +* +*/ + +// For OS_LAYER_SYSTEMINCLUDE +#include <platform_paths.hrh> + +TARGET t_bufferedmsgcreator.dll +TARGETTYPE dll +UID 0x1000008D 0x101FB3E7 + +CAPABILITY ALL -TCB +/* Remove comments and replace 0x00000000 with correct vendor id */ +// VENDORID 0x00000000 +/* Remove comments and replace 0x00000000 with correct secure id */ +SECUREID 0x20022BFE + +//TARGETPATH target_path +DEFFILE t_bufferedmsgcreator.def + +USERINCLUDE ../inc +USERINCLUDE ../../../message_store/server/inc +USERINCLUDE ../../../message_store/common/inc + +OS_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE ../../../../../inc + +SOURCEPATH ../src +SOURCE t_bufferedmsgcreator.cpp +SOURCE t_bufferedmsgcreatorcases.cpp +SOURCE mockups.cpp +SOURCEPATH ../../../message_store/server/src +SOURCE bufferedmessagecreator.cpp +SOURCE messagestoreutils.cpp + +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY bafl.lib +LIBRARY stiftestinterface.lib +LIBRARY stiftestengine.lib +LIBRARY tzclient.lib +LIBRARY edbms.lib +LIBRARY estor.lib + +LANG SC +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/inc/containerstore.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,97 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mockup Container store. +* +*/ +#ifndef __CONTAINER_STORE_H__ +#define __CONTAINER_STORE_H__ + +#include "msgstoretypes.h" +#include <e32base.h> + +typedef TUint TContainerId; +const TContainerId KContainerInvalidId = 0; + +class CContainerStoreContentManager; +class CContainerStoreUtils; + + +NONSHARABLE_CLASS( MContainerStoreObserver ) + { + + }; + + +/** + * + */ +NONSHARABLE_CLASS( CContainerStore ) : + public CBase, + public MContainerStoreObserver + + { +public: + friend class CBufferedMessageCreator; + + static CContainerStore* NewL(); + + void ConstructL(); + + CContainerStore(); + + ~CContainerStore(); + + TContainerId CreateContainerL( TContainerId aType, + TContainerId aParentId, + TContainerId aGrandparentId, + const TDesC8& aProperties, + TContainerId aId = KMsgStoreInvalidId ); + + void CommitContainerL( TContainerId aId, + TContainerId aParentId, + TContainerId aMailBoxId, + MContainerStoreObserver* aObserver, + TContainerId aCopiedFromOriginalMsgId = KContainerInvalidId ); + + void BeginDatabaseTransactionLC(); + + void CommitDatabaseTransactionL(); + + void AllocateIdsBlockL( + RArray<TContainerId>& aIds, + TInt aBlockSize = 4 ); + + TBool IsEncryptionEnabled(); + + CContainerStoreUtils& StoreUtils(); + + CContainerStoreContentManager& ContentManager(); + + const TDesC& PrivatePath() const; + + void SetLeaveAfter( TInt aLeaveAfter ); + + void SimulateLeaveL(); + +public: + CContainerStoreContentManager* iContentManager; + CContainerStoreUtils* iUtils; + TContainerId iSequence; + TBool iInTransaction; + TInt iLeaveAfter; + }; + + +#endif // __CONTAINER_STORE_H__ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/inc/containerstorecontentmanager.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mockup Container store content manager. +* +*/ +#ifndef __CONTAINERSTORECONTENTMANAGER_H__ +#define __CONTAINERSTORECONTENTMANAGER_H__ + + +#include <f32file.h> + + +NONSHARABLE_CLASS( CContainerStoreContentManager ) : CBase + { +public: + + CContainerStoreContentManager(); + + void ReplaceFileWithFileL( + RFile& aSource, + const TDesC& aTarget ); + + void PrependBufferAndMoveFileL( + const TDesC& aSource, + const TDesC& aTarget, + const TDesC8& aPrepend ); + + TInt TransferContentFile( + TContainerId aId, + const TDesC& aContentPath ); + + void SetLeaveAfter( TInt aLeaveAfter ); + + void SimulateLeaveL(); + +private: + TInt iLeaveAfter; + }; + +#endif // __CONTAINERSTORECONTENTMANAGER_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/inc/containerstoreutils.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mockup Container store utils. +* +*/ +#ifndef CONTAINERSTOREUTILS_H +#define CONTAINERSTOREUTILS_H + + +/** + * + */ +NONSHARABLE_CLASS( CContainerStoreUtils ) : + public CBase + + { +public: + + static CContainerStoreUtils* NewL(); + + void ConstructL(); + + CContainerStoreUtils(); + + ~CContainerStoreUtils(); + + const TDesC& PrivatePath() const; + + RFs& FileSystem(); + + void LeaveIfLowDiskSpaceL( TUint aBytesToWrite ); + +public: + RFs iFs; + RBuf iPrivatePath; + }; + + +#endif // CONTAINERSTOREUTILS_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/inc/t_bufferedmsgcreatore.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,270 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: t_msgstore test module. +* +*/ + + + +#ifndef T_MSGSTORE_H +#define T_MSGSTORE_H + +// INCLUDES +#include "StifTestModule.h" +#include <StifLogger.h> +#include <NormalHardcodedAssert.h> + +// CONSTANTS + +// MACROS +#define TEST_MODULE_VERSION_MAJOR 0 +#define TEST_MODULE_VERSION_MINOR 0 +#define TEST_MODULE_VERSION_BUILD 0 + +// Logging path +_LIT( Kt_msgstoreLogPath, "\\logs\\testframework\\t_bufferedmsgcreatore\\" ); +// Log file +_LIT( Kt_msgstoreLogFile, "t_bufferedmsgcreatore.txt" ); +_LIT( Kt_msgstoreLogFileWithTitle, "t_bufferedmsgcreatore_[%S].txt" ); + +#define GETPTR & +#define ENTRY(str,func) {_S(str), GETPTR func,0,0,0} +#define FUNCENTRY(func) {_S(#func), GETPTR func,0,0,0} +#define OOM_ENTRY(str,func,a,b,c) {_S(str), GETPTR func,a,b,c} +#define OOM_FUNCENTRY(func,a,b,c) {_S(#func), GETPTR func,a,b,c} + +// FORWARD DECLARATIONS +class Ct_bufferedmsgcreator; + +// DATA TYPES +// A typedef for function that does the actual testing, +// function is a type +typedef TInt (Ct_bufferedmsgcreator::* TestFunction)(TTestResult&); + +// CLASS DECLARATION + +/** +* An internal structure containing a test case name and +* the pointer to function doing the test +*/ +class TCaseInfoInternal + { + public: + const TText* iCaseName; + TestFunction iMethod; + TBool iIsOOMTest; + TInt iFirstMemoryAllocation; + TInt iLastMemoryAllocation; + }; + +// CLASS DECLARATION + +/** +* A structure containing a test case name and +* the pointer to function doing the test +* +* @lib ?library +* @since ?Series60_version +*/ +class TCaseInfo + { + public: + TPtrC iCaseName; + TestFunction iMethod; + TBool iIsOOMTest; + TInt iFirstMemoryAllocation; + TInt iLastMemoryAllocation; + + TCaseInfo( const TText* a ) : iCaseName( (TText*) a ) + { + }; + + }; + + +// CLASS DECLARATION + +/** +* This a t_msgstore class. +* ?other_description_lines +* +* @lib ?library +* @since ?Series60_version +*/ +NONSHARABLE_CLASS(Ct_bufferedmsgcreator) : public CTestModuleBase + { + public: // Constructors and destructor + + + /** + * Two-phased constructor. + */ + static Ct_bufferedmsgcreator* NewL(); + + /** + * Destructor. + */ + virtual ~Ct_bufferedmsgcreator(); + + public: // Functions from base classes + + /** + * From CTestModuleBase InitL is used to initialize the + * t_msgstore. It is called once for every instance of + * TestModulet_msgstore after its creation. + * @since ?Series60_version + * @param aIniFile Initialization file for the test module (optional) + * @param aFirstTime Flag is true when InitL is executed for first + * created instance of t_msgstore. + * @return Symbian OS error code + */ + TInt InitL( TFileName& aIniFile, TBool aFirstTime ); + + /** + * From CTestModuleBase GetTestCasesL is used to inquiry test cases + * from t_msgstore. + * @since ?Series60_version + * @param aTestCaseFile Test case file (optional) + * @param aTestCases Array of TestCases returned to test framework + * @return Symbian OS error code + */ + TInt GetTestCasesL( const TFileName& aTestCaseFile, + RPointerArray<TTestCaseInfo>& aTestCases ); + + /** + * From CTestModuleBase RunTestCaseL is used to run an individual + * test case. + * @since ?Series60_version + * @param aCaseNumber Test case number + * @param aTestCaseFile Test case file (optional) + * @param aResult Test case result returned to test framework (PASS/FAIL) + * @return Symbian OS error code (test case execution error, which is + * not reported in aResult parameter as test case failure). + */ + TInt RunTestCaseL( const TInt aCaseNumber, + const TFileName& aTestCaseFile, + TTestResult& aResult ); + + /** + * From CTestModuleBase; OOMTestQueryL is used to specify is particular + * test case going to be executed using OOM conditions + * @param aTestCaseFile Test case file (optional) + * @param aCaseNumber Test case number (optional) + * @param aFailureType OOM failure type (optional) + * @param aFirstMemFailure The first heap memory allocation failure value (optional) + * @param aLastMemFailure The last heap memory allocation failure value (optional) + * @return TBool + */ + virtual TBool OOMTestQueryL( const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */, + TOOMFailureType& aFailureType, + TInt& /* aFirstMemFailure */, + TInt& /* aLastMemFailure */ ); + + /** + * From CTestModuleBase; OOMTestInitializeL may be used to initialize OOM + * test environment + * @param aTestCaseFile Test case file (optional) + * @param aCaseNumber Test case number (optional) + * @return None + */ + virtual void OOMTestInitializeL( const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */ ); + + /** + * From CTestModuleBase; OOMHandleWarningL + * @param aTestCaseFile Test case file (optional) + * @param aCaseNumber Test case number (optional) + * @param aFailNextValue FailNextValue for OOM test execution (optional) + * @return None + * + * User may add implementation for OOM test warning handling. Usually no + * implementation is required. + */ + virtual void OOMHandleWarningL( const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */, + TInt& /* aFailNextValue */); + + /** + * From CTestModuleBase; OOMTestFinalizeL may be used to finalize OOM + * test environment + * @param aTestCaseFile Test case file (optional) + * @param aCaseNumber Test case number (optional) + * @return None + * + */ + virtual void OOMTestFinalizeL( const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */ ); + + /** + * Method used to log version of test module + */ + void SendTestModuleVersion(); + + private: + + /** + * C++ default constructor. + */ + Ct_bufferedmsgcreator(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + /** + * Function returning test case name and pointer to test case function. + * @since ?Series60_version + * @param aCaseNumber test case number + * @return TCaseInfo + */ + const TCaseInfo Case ( const TInt aCaseNumber ) const; + + /** + * [test case declarations] - do not remove + */ + //ADD NEW METHOD DEC HERE" + + TInt Oom1L( TTestResult& aResult ); + + TInt ErrHandling1L( TTestResult& aResult ); + + TInt ErrHandling2L( TTestResult& aResult ); + + + private: // Data + // Pointer to test (function) to be executed + TestFunction iMethod; + + // Pointer to logger + CStifLogger * iLog; + + // Normal logger + CStifLogger* iStdLog; + + // Test case logger + CStifLogger* iTCLog; + + // Flag saying if test case title should be added to log file name + TBool iAddTestCaseTitleToLogName; + + // Flag saying if version of test module was already sent + TBool iVersionLogged; + + }; + +#endif // T_MSGSTORE_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/src/mockups.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,232 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +//mockups below: +#include "containerstore.h" +#include "containerstorecontentmanager.h" +#include "containerstoreutils.h" + + +/*static*/ CContainerStore* CContainerStore::NewL() + { + CContainerStore* self = new (ELeave) CContainerStore; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +void CContainerStore::ConstructL() + { + iContentManager = new (ELeave) CContainerStoreContentManager; + iUtils = CContainerStoreUtils::NewL(); + } + +CContainerStore::CContainerStore() : + iSequence( 0 ), iInTransaction( EFalse ), iLeaveAfter( -1 ) + { + } + +CContainerStore::~CContainerStore() + { + delete iUtils; + delete iContentManager; + } + +TContainerId CContainerStore::CreateContainerL( + TContainerId aType, + TContainerId aParentId, + TContainerId aGrandparentId, + const TDesC8& aProperties, + TContainerId aId ) + { + SimulateLeaveL(); + + return 0; + } + +void CContainerStore::CommitContainerL( + TContainerId aId, + TContainerId aParentId, + TContainerId aMailBoxId, + MContainerStoreObserver* aObserver, + TContainerId aCopiedFromOriginalMsgId ) + { + SimulateLeaveL(); + } + +void CContainerStore::BeginDatabaseTransactionLC() + { + SimulateLeaveL(); + iInTransaction = ETrue; + } + +void CContainerStore::CommitDatabaseTransactionL() + { + SimulateLeaveL(); + iInTransaction = EFalse; + } + +void CContainerStore::AllocateIdsBlockL( + RArray<TContainerId>& aIds, + TInt aBlockSize ) + { + SimulateLeaveL(); + for ( TInt i = 0; i < aBlockSize; ++i ) + { + aIds.Append( ++iSequence ); + } + } + +TBool CContainerStore::IsEncryptionEnabled() + { + return EFalse; + } + +CContainerStoreUtils& CContainerStore::StoreUtils() + { + return *iUtils; + } + +CContainerStoreContentManager& CContainerStore::ContentManager() + { + return *iContentManager; + } + +const TDesC& CContainerStore::PrivatePath() const + { + return iUtils->PrivatePath(); + } + +void CContainerStore::SetLeaveAfter( TInt aLeaveAfter ) + { + iLeaveAfter = aLeaveAfter; + } + +void CContainerStore::SimulateLeaveL() + { + if ( 0 == iLeaveAfter ) + { + User::Leave( KErrGeneral ); + } + else if ( 0 < iLeaveAfter ) + { + --iLeaveAfter; + } + } + +///////////////////////////////////// +// CContainerStoreContentManager // +///////////////////////////////////// + +CContainerStoreContentManager::CContainerStoreContentManager() : + iLeaveAfter( -1 ) + { + + } + +void CContainerStoreContentManager::SetLeaveAfter( TInt aLeaveAfter ) + { + iLeaveAfter = aLeaveAfter; + } + +void CContainerStoreContentManager::SimulateLeaveL() + { + if ( 0 == iLeaveAfter ) + { + User::Leave( KErrGeneral ); + } + else if ( 0 < iLeaveAfter ) + { + --iLeaveAfter; + } + } + +void CContainerStoreContentManager::ReplaceFileWithFileL( + RFile& aSource, + const TDesC& aTarget ) + { + SimulateLeaveL(); + } + +void CContainerStoreContentManager::PrependBufferAndMoveFileL( + const TDesC& aSource, + const TDesC& aTarget, + const TDesC8& aPrepend ) + { + SimulateLeaveL(); + } + +TInt CContainerStoreContentManager::TransferContentFile( + TContainerId aId, + const TDesC& aContentPath ) + { + return KErrNone; + } + + +/////////////////////////////// +// CContainerStoreUtils // +/////////////////////////////// + +CContainerStoreUtils* CContainerStoreUtils::NewL() + { + + CContainerStoreUtils* self = new (ELeave) CContainerStoreUtils(); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +void CContainerStoreUtils::ConstructL() + { + User::LeaveIfError( iFs.Connect() ); + + User::LeaveIfError( iPrivatePath.Create( KMaxPath ) ); + iFs.PrivatePath( iPrivatePath ); + } + +CContainerStoreUtils::CContainerStoreUtils() + { + + } + +CContainerStoreUtils::~CContainerStoreUtils() + { + iPrivatePath.Close(); + iFs.Close(); + } + +const TDesC& CContainerStoreUtils::PrivatePath() const + { + return iPrivatePath; + } + +RFs& CContainerStoreUtils::FileSystem() + { + return iFs; + } + +void CContainerStoreUtils::LeaveIfLowDiskSpaceL( TUint aBytesToWrite ) + { + + }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/src/t_bufferedmsgcreator.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,443 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: t_msgstore class member functions +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <Stiftestinterface.h> +#include "t_bufferedmsgcreatore.h" +#include <SettingServerClient.h> + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ?function_name ?description. +// ?description +// Returns: ?value_1: ?description +// ?value_n: ?description_line1 +// ?description_line2 +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg) // ?description + { + + ?code // ?comment + + // ?comment + ?code + } +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Ct_msgstore::Ct_msgstore +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +Ct_bufferedmsgcreator::Ct_bufferedmsgcreator() + { + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::ConstructL +// Symbian 2nd phase constructor can leave. +// +// Note: If OOM test case uses STIF Logger, then STIF Logger must be created +// with static buffer size parameter (aStaticBufferSize). Otherwise Logger +// allocates memory from heap and therefore causes error situations with OOM +// testing. For more information about STIF Logger construction, see STIF Users +// Guide. +// ----------------------------------------------------------------------------- +// +void Ct_bufferedmsgcreator::ConstructL() + { + //Read logger settings to check whether test case name is to be + //appended to log file name. + RSettingServer settingServer; + TInt ret = settingServer.Connect(); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Struct to StifLogger settigs. + TLoggerSettings loggerSettings; + // Parse StifLogger defaults from STIF initialization file. + ret = settingServer.GetLoggerSettings(loggerSettings); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Close Setting server session + settingServer.Close(); + iAddTestCaseTitleToLogName = loggerSettings.iAddTestCaseTitle; + + iStdLog = CStifLogger::NewL( Kt_msgstoreLogPath, + Kt_msgstoreLogFile); + iLog = iStdLog; + + // Sample how to use logging + _LIT( KLogStart, "t_msgstore logging starts!" ); + iLog->Log( KLogStart ); + + iVersionLogged = EFalse; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +Ct_bufferedmsgcreator* Ct_bufferedmsgcreator::NewL() + { + Ct_bufferedmsgcreator* self = new (ELeave) Ct_bufferedmsgcreator; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + + } + +// Destructor +Ct_bufferedmsgcreator::~Ct_bufferedmsgcreator() + { + iLog = NULL; + delete iStdLog; + iStdLog = NULL; + delete iTCLog; + iTCLog = NULL; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::InitL +// InitL is used to initialize the Test Module. +// ----------------------------------------------------------------------------- +// +TInt Ct_bufferedmsgcreator::InitL( + TFileName& /*aIniFile*/, + TBool /*aFirstTime*/ ) + { + return KErrNone; + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::GetTestCasesL +// GetTestCases is used to inquire test cases from the Test Module. Test +// cases are stored to array of test cases. The Test Framework will be +// the owner of the data in the RPointerArray after GetTestCases return +// and it does the memory deallocation. +// ----------------------------------------------------------------------------- +// +TInt Ct_bufferedmsgcreator::GetTestCasesL( + const TFileName& /*aConfig*/, + RPointerArray<TTestCaseInfo>& aTestCases ) + { + + // Loop through all test cases and create new + // TTestCaseInfo items and append items to aTestCase array + for( TInt i = 0; Case(i).iMethod != NULL; i++ ) + { + + // Allocate new TTestCaseInfo from heap for a testcase definition. + TTestCaseInfo* newCase = new( ELeave ) TTestCaseInfo(); + + // PushL TTestCaseInfo to CleanupStack. + CleanupStack::PushL( newCase ); + + // Set number for the testcase. + // When the testcase is run, this comes as a parameter to RunTestCaseL. + newCase->iCaseNumber = i; + + // Set title for the test case. This is shown in UI to user. + newCase->iTitle.Copy( Case(i).iCaseName ); + + // Append TTestCaseInfo to the testcase array. After appended + // successfully the TTestCaseInfo object is owned (and freed) + // by the TestServer. + User::LeaveIfError(aTestCases.Append ( newCase ) ); + + // Pop TTestCaseInfo from the CleanupStack. + CleanupStack::Pop( newCase ); + + } + + return KErrNone; + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::RunTestCaseL +// RunTestCaseL is used to run an individual test case specified +// by aTestCase. Test cases that can be run may be requested from +// Test Module by GetTestCases method before calling RunTestCase. +// ----------------------------------------------------------------------------- +// +TInt Ct_bufferedmsgcreator::RunTestCaseL( + const TInt aCaseNumber, + const TFileName& /*aConfig*/, + TTestResult& aResult ) + { + if(!iVersionLogged) + { + SendTestModuleVersion(); + iVersionLogged = ETrue; + } + + // Return value + TInt execStatus = KErrNone; + + // Get the pointer to test case function + TCaseInfo tmp = Case ( aCaseNumber ); + + _LIT( KLogStartTC, "Starting testcase [%S]" ); + iLog->Log( KLogStartTC, &tmp.iCaseName); + + // Check that case number was valid + if ( tmp.iMethod != NULL ) + { + //Open new log file with test case title in file name + if(iAddTestCaseTitleToLogName) + { + //Delete test case logger if exists + if(iTCLog) + { + delete iTCLog; + iTCLog = NULL; + } + + TFileName logFileName; + TName title; + TestModuleIf().GetTestCaseTitleL(title); + + logFileName.Format(Kt_msgstoreLogFileWithTitle, &title); + + iTCLog = CStifLogger::NewL(Kt_msgstoreLogPath, + logFileName); + iLog = iTCLog; + } + + // Valid case was found, call it via function pointer + iMethod = tmp.iMethod; + //execStatus = ( this->*iMethod )( aResult ); + TRAPD(err, execStatus = ( this->*iMethod )( aResult )); + if(iAddTestCaseTitleToLogName) + { + //Restore standard log and destroy test case logger + iLog = iStdLog; + delete iTCLog; //Close test case log + iTCLog = NULL; + } + User::LeaveIfError(err); + } + else + { + // Valid case was not found, return error. + execStatus = KErrNotFound; + } + + // Return case execution status (not the result of the case execution) + return execStatus; + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::OOMTestQueryL +// Used to check if a particular test case should be run in OOM conditions and +// which memory allocations should fail. +// ----------------------------------------------------------------------------- +// +TBool Ct_bufferedmsgcreator::OOMTestQueryL( + const TFileName& /* aTestCaseFile */, + const TInt aCaseNumber, + TOOMFailureType& /* aFailureType */, + TInt& aFirstMemFailure, + TInt& aLastMemFailure ) + { + _LIT( KLogOOMTestQueryL, "Ct_msgstore::OOMTestQueryL" ); + iLog->Log( KLogOOMTestQueryL ); + + aFirstMemFailure = Case( aCaseNumber ).iFirstMemoryAllocation; + aLastMemFailure = Case( aCaseNumber ).iLastMemoryAllocation; + + return Case( aCaseNumber ).iIsOOMTest; + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::OOMTestInitializeL +// Used to perform the test environment setup for a particular OOM test case. +// Test Modules may use the initialization file to read parameters for Test +// Module initialization but they can also have their own configure file or +// some other routine to initialize themselves. +// +// NOTE: User may add implementation for OOM test environment initialization. +// Usually no implementation is required. +// ----------------------------------------------------------------------------- +// +void Ct_bufferedmsgcreator::OOMTestInitializeL( + const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */ ) + { + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::OOMHandleWarningL +// In some cases the heap memory allocation should be skipped, either due to +// problems in the OS code or components used by the code being tested, or even +// inside the tested components which are implemented this way on purpose (by +// design), so it is important to give the tester a way to bypass allocation +// failures. +// +// NOTE: User may add implementation for OOM test warning handling. Usually no +// implementation is required. +// ----------------------------------------------------------------------------- +// +void Ct_bufferedmsgcreator::OOMHandleWarningL( + const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */, + TInt& /* aFailNextValue */ ) + { + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::OOMTestFinalizeL +// Used to perform the test environment cleanup for a particular OOM test case. +// +// NOTE: User may add implementation for OOM test environment finalization. +// Usually no implementation is required. +// ----------------------------------------------------------------------------- +// +void Ct_bufferedmsgcreator::OOMTestFinalizeL( + const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */ ) + { + } + +//----------------------------------------------------------------------------- +// Ct_msgstore::SendTestModuleVersion +// Method used to send version of test module +//----------------------------------------------------------------------------- +// +void Ct_bufferedmsgcreator::SendTestModuleVersion() + { + TVersion moduleVersion; + moduleVersion.iMajor = TEST_MODULE_VERSION_MAJOR; + moduleVersion.iMinor = TEST_MODULE_VERSION_MINOR; + moduleVersion.iBuild = TEST_MODULE_VERSION_BUILD; + + TFileName moduleName; + moduleName = _L("t_msgstore.dll"); + + TBool newVersionOfMethod = ETrue; + TestModuleIf().SendTestModuleVersion(moduleVersion, moduleName, newVersionOfMethod); + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// LibEntryL is a polymorphic Dll entry point +// Returns: CTestModuleBase*: Pointer to Test Module object +// ----------------------------------------------------------------------------- +// +EXPORT_C CTestModuleBase* LibEntryL() + { + return Ct_bufferedmsgcreator::NewL(); + + } + +// ----------------------------------------------------------------------------- +// SetRequirements handles test module parameters(implements evolution +// version 1 for test module's heap and stack sizes configuring). +// Returns: TInt: Symbian error code. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt SetRequirements( CTestModuleParam*& /*aTestModuleParam*/, + TUint32& /*aParameterValid*/ ) + { + + /* --------------------------------- NOTE --------------------------------- + USER PANICS occurs in test thread creation when: + 1) "The panic occurs when the value of the stack size is negative." + 2) "The panic occurs if the minimum heap size specified is less + than KMinHeapSize". + KMinHeapSize: "Functions that require a new heap to be allocated will + either panic, or will reset the required heap size to this value if + a smaller heap size is specified". + 3) "The panic occurs if the minimum heap size specified is greater than + the maximum size to which the heap can grow". + Other: + 1) Make sure that your hardware or Symbian OS is supporting given sizes. + e.g. Hardware might support only sizes that are divisible by four. + ------------------------------- NOTE end ------------------------------- */ + + // Normally STIF uses default heap and stack sizes for test thread, see: + // KTestThreadMinHeap, KTestThreadMinHeap and KStackSize. + // If needed heap and stack sizes can be configured here by user. Remove + // comments and define sizes. + +/* + aParameterValid = KStifTestModuleParameterChanged; + + CTestModuleParamVer01* param = CTestModuleParamVer01::NewL(); + // Stack size + param->iTestThreadStackSize= 16384; // 16K stack + // Heap sizes + param->iTestThreadMinHeap = 4096; // 4K heap min + param->iTestThreadMaxHeap = 1048576;// 1M heap max + + aTestModuleParam = param; +*/ + return KErrNone; + + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/bufferedmsgcreator_test/src/t_bufferedmsgcreatorcases.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,495 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: implementation of test cases methods. +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <e32math.h> +#include "t_bufferedmsgcreatore.h" +#include "containerstore.h" //mockup +#include "containerstorecontentmanager.h" //mockup +#include "bufferedmessagecreator.h" //real +#include "messagestoreclientserver.h" //real + + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); +void CallSequence1L( CContainerStore& aStore, CBufferedMessageCreator& aCreator, + RBuf8& aMsgProps, RBuf8& aMsgProps1, RBuf8& aPartProps, RBuf8& aPartProps1, + RBuf8& aContent, TMsgStoreId& aSequence ); + + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ?function_name ?description. +// ?description +// Returns: ?value_1: ?description +// ?value_n: ?description_line1 +// ?description_line2 +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg) // ?description + { + + ?code // ?comment + + // ?comment + ?code + } +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Ct_msgstore::Case +// Returns a test case by number. +// +// This function contains an array of all available test cases +// i.e pair of case name and test function. If case specified by parameter +// aCaseNumber is found from array, then that item is returned. +// +// The reason for this rather complicated function is to specify all the +// test cases only in one place. It is not necessary to understand how +// function pointers to class member functions works when adding new test +// cases. See function body for instructions how to add new test case. +// ----------------------------------------------------------------------------- +// +const TCaseInfo Ct_bufferedmsgcreator::Case ( + const TInt aCaseNumber ) const + { + + /** + * To add new test cases, implement new test case function and add new + * line to KCases array specify the name of the case and the function + * doing the test case + * In practice, do following + * 1) Make copy of existing test case function and change its name + * and functionality. Note that the function must be added to + * t_msgstore.cpp file and to t_msgstore.h + * header file. + * + * 2) Add entry to following KCases array either by using: + * + * 2.1: FUNCENTRY or ENTRY macro + * ENTRY macro takes two parameters: test case name and test case + * function name. + * + * FUNCENTRY macro takes only test case function name as a parameter and + * uses that as a test case name and test case function name. + * + * Or + * + * 2.2: OOM_FUNCENTRY or OOM_ENTRY macro. Note that these macros are used + * only with OOM (Out-Of-Memory) testing! + * + * OOM_ENTRY macro takes five parameters: test case name, test case + * function name, TBool which specifies is method supposed to be run using + * OOM conditions, TInt value for first heap memory allocation failure and + * TInt value for last heap memory allocation failure. + * + * OOM_FUNCENTRY macro takes test case function name as a parameter and uses + * that as a test case name, TBool which specifies is method supposed to be + * run using OOM conditions, TInt value for first heap memory allocation + * failure and TInt value for last heap memory allocation failure. + */ + + static TCaseInfoInternal const KCases[] = + { + // [test cases entries] - do not remove + + // NOTE: When compiled to GCCE, there must be Classname:: + // declaration in front of the method name, e.g. + // Ct_msgstore::PrintTest. Otherwise the compiler + // gives errors. + ENTRY( "Oom1", Ct_bufferedmsgcreator::Oom1L ), + ENTRY( "ErrHandling1", Ct_bufferedmsgcreator::ErrHandling1L ), + ENTRY( "ErrHandling2", Ct_bufferedmsgcreator::ErrHandling2L ), + // Example how to use OOM functionality + //OOM_ENTRY( "Loop test with OOM", Ct_msgstore::LoopTest, ETrue, 2, 3), + //OOM_FUNCENTRY( Ct_msgstore::PrintTest, ETrue, 1, 3 ), + }; + + // Verify that case number is valid + if( (TUint) aCaseNumber >= sizeof( KCases ) / + sizeof( TCaseInfoInternal ) ) + { + // Invalid case, construct empty object + TCaseInfo null( (const TText*) L"" ); + null.iMethod = NULL; + null.iIsOOMTest = EFalse; + null.iFirstMemoryAllocation = 0; + null.iLastMemoryAllocation = 0; + return null; + } + + // Construct TCaseInfo object and return it + TCaseInfo tmp ( KCases[ aCaseNumber ].iCaseName ); + tmp.iMethod = KCases[ aCaseNumber ].iMethod; + tmp.iIsOOMTest = KCases[ aCaseNumber ].iIsOOMTest; + tmp.iFirstMemoryAllocation = KCases[ aCaseNumber ].iFirstMemoryAllocation; + tmp.iLastMemoryAllocation = KCases[ aCaseNumber ].iLastMemoryAllocation; + return tmp; + + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt Ct_bufferedmsgcreator::Oom1L( TTestResult& aResult ) + { + _LIT( KFolderTests, "Oom1" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KFolderTests, KEnter ); + + // + CContainerStore* store = CContainerStore::NewL(); + CleanupStack::PushL( store ); + + CBufferedMessageCreator* creator + = CBufferedMessageCreator::NewL( *store ); + CleanupStack::PushL( creator ); + + //setup + _LIT8( KTestProperties, "Test123,123,123" ); + _LIT8( KTestContent, "Content123,123,123" ); + TMsgStoreId sequence = 0; + + TMsgStoreCreateContainerCmdParams msgParams={0}; + msgParams.iType = EMsgStoreMessageBits; + TMsgStoreCreateContainerCmdParams partParams={0}; + partParams.iType = EMsgStorePartBits; + + //main loop + for ( TInt i = 0; i < 100; ++i ) + { + RBuf8 msgProps; + msgProps.CreateL( KTestProperties ); + msgProps.CleanupClosePushL(); + + RBuf8 msgProps1; + msgProps1.CreateL( KTestProperties ); + msgProps1.CleanupClosePushL(); + + RBuf8 partProps; + partProps.CreateL( KTestProperties ); + partProps.CleanupClosePushL(); + + RBuf8 partProps1; + partProps1.CreateL( KTestProperties ); + partProps1.CleanupClosePushL(); + + RBuf8 content; + content.CreateL( KTestContent ); + content.CleanupClosePushL(); + + __UHEAP_SETFAIL( RAllocator::EDeterministic, i ); + + TRAP_IGNORE( + ::CallSequence1L( *store, *creator, msgProps, msgProps1, partProps, + partProps1, content, sequence ); + ); + + __UHEAP_RESET; + + CleanupStack::PopAndDestroy( &content ); + CleanupStack::Pop( &partProps1 ); + CleanupStack::Pop( &partProps ); + CleanupStack::Pop( &msgProps1 ); + CleanupStack::Pop( &msgProps ); + } + + CleanupStack::PopAndDestroy( creator ); + CleanupStack::PopAndDestroy( store ); + + TestModuleIf().Printf( 0, KFolderTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + TInt result = KErrNone; + _LIT( KPassDescription, "Oom1 passed" ); + _LIT( KFailDescription, "Oom1 failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + + +TInt Ct_bufferedmsgcreator::ErrHandling1L( TTestResult& aResult ) + { + _LIT( KTestName, "ErrHandling1" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KTestName, KEnter ); + + // + CContainerStore* store = CContainerStore::NewL(); + CleanupStack::PushL( store ); + + CBufferedMessageCreator* creator + = CBufferedMessageCreator::NewL( *store ); + CleanupStack::PushL( creator ); + + //setup + _LIT8( KTestProperties, "Test123,123,123" ); + _LIT8( KTestContent, "Content123,123,123" ); + TMsgStoreId sequence = 0; + + //main loop + for ( TInt i = 0; i < 100; ++i ) + { + RBuf8 msgProps; + msgProps.CreateL( KTestProperties ); + msgProps.CleanupClosePushL(); + + RBuf8 msgProps1; + msgProps1.CreateL( KTestProperties ); + msgProps1.CleanupClosePushL(); + + RBuf8 partProps; + partProps.CreateL( KTestProperties ); + partProps.CleanupClosePushL(); + + RBuf8 partProps1; + partProps1.CreateL( KTestProperties ); + partProps1.CleanupClosePushL(); + + RBuf8 content; + content.CreateL( KTestContent ); + content.CleanupClosePushL(); + + store->SetLeaveAfter( i ); + + TRAP_IGNORE( + ::CallSequence1L( *store, *creator, msgProps, msgProps1, partProps, + partProps1, content, sequence ); + ); + + CleanupStack::PopAndDestroy( &content ); + CleanupStack::Pop( &partProps1 ); + CleanupStack::Pop( &partProps ); + CleanupStack::Pop( &msgProps1 ); + CleanupStack::Pop( &msgProps ); + } + + CleanupStack::PopAndDestroy( creator ); + CleanupStack::PopAndDestroy( store ); + + TestModuleIf().Printf( 0, KTestName, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + TInt result = KErrNone; + _LIT( KPassDescription, "ErrHandling1 passed" ); + _LIT( KFailDescription, "ErrHandling1 failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + + +TInt Ct_bufferedmsgcreator::ErrHandling2L( TTestResult& aResult ) + { + _LIT( KTestName, "ErrHandling2" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KTestName, KEnter ); + + // + CContainerStore* store = CContainerStore::NewL(); + CleanupStack::PushL( store ); + + CBufferedMessageCreator* creator + = CBufferedMessageCreator::NewL( *store ); + CleanupStack::PushL( creator ); + + //setup + _LIT8( KTestProperties, "Test123,123,123" ); + _LIT8( KTestContent, "Content123,123,123" ); + TMsgStoreId sequence = 0; + + //main loop + for ( TInt i = 0; i < 10; ++i ) + { + RBuf8 msgProps; + msgProps.CreateL( KTestProperties ); + msgProps.CleanupClosePushL(); + + RBuf8 msgProps1; + msgProps1.CreateL( KTestProperties ); + msgProps1.CleanupClosePushL(); + + RBuf8 partProps; + partProps.CreateL( KTestProperties ); + partProps.CleanupClosePushL(); + + RBuf8 partProps1; + partProps1.CreateL( KTestProperties ); + partProps1.CleanupClosePushL(); + + RBuf8 content; + content.CreateL( KTestContent ); + content.CleanupClosePushL(); + + store->ContentManager().SetLeaveAfter( i ); + + TRAP_IGNORE( + ::CallSequence1L( *store, *creator, msgProps, msgProps1, partProps, + partProps1, content, sequence ); + ); + + CleanupStack::PopAndDestroy( &content ); + CleanupStack::Pop( &partProps1 ); + CleanupStack::Pop( &partProps ); + CleanupStack::Pop( &msgProps1 ); + CleanupStack::Pop( &msgProps ); + } + + CleanupStack::PopAndDestroy( creator ); + CleanupStack::PopAndDestroy( store ); + + TestModuleIf().Printf( 0, KTestName, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + TInt result = KErrNone; + _LIT( KPassDescription, "ErrHandling2 passed" ); + _LIT( KFailDescription, "ErrHandling2 failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + + +void CallSequence1L( CContainerStore& aStore, CBufferedMessageCreator& aCreator, + RBuf8& aMsgProps, RBuf8& aMsgProps1, RBuf8& aPartProps, RBuf8& aPartProps1, + RBuf8& aContent, TMsgStoreId& aSequence ) + { + TMsgStoreCreateContainerCmdParams msgParams={0}; + msgParams.iType = EMsgStoreMessageBits; + TMsgStoreCreateContainerCmdParams partParams={0}; + partParams.iType = EMsgStorePartBits; + + msgParams.iId = ++aSequence; + + aCreator.EnqueueL( + aStore, + msgParams, + aMsgProps ); + + aCreator.AppendContentL( aStore, msgParams.iId, aContent ); + aCreator.PrependContentL( aStore, msgParams.iId, aContent ); + aCreator.ReplaceContentL( aStore, msgParams.iId, aContent ); + + aCreator.AbandonMessageL( aStore, msgParams.iId ); + + partParams.iId = ++aSequence; + partParams.iParentId = msgParams.iId; + + aCreator.EnqueueL( + aStore, + partParams, + aPartProps ); + + aCreator.AppendContentL( aStore, partParams.iId, aContent ); + aCreator.PrependContentL( aStore, partParams.iId, aContent ); + aCreator.ReplaceContentL( aStore, partParams.iId, aContent ); + + // + aCreator.ResetL( aStore ); + + // + msgParams.iId = ++aSequence; + + aCreator.EnqueueL( + aStore, + msgParams, + aMsgProps1 ); + + aCreator.AppendContentL( aStore, msgParams.iId, aContent ); + aCreator.PrependContentL( aStore, msgParams.iId, aContent ); + aCreator.ReplaceContentL( aStore, msgParams.iId, aContent ); + + partParams.iId = ++aSequence; + partParams.iParentId = msgParams.iId; + + aCreator.EnqueueL( + aStore, + partParams, + aPartProps1 ); + + aCreator.AppendContentL( aStore, partParams.iId, aContent ); + aCreator.PrependContentL( aStore, partParams.iId, aContent ); + aCreator.ReplaceContentL( aStore, partParams.iId, aContent ); + + // + aCreator.CommitMessageL( aStore, &aStore ); + } + + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// ?function_name implements... +// ?implementation_description. +// Returns: ?value_1: ?description +// ?value_n: ?description +// ?description +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg ) // ?description + { + + ?code + + } +*/ +// [End of File] - do not remove
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/Bmarm/t_msgstoreU.DEF Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,4 @@ +EXPORTS + LibEntryL__Fv @ 1 NONAME R3UNUSED ; LibEntryL(void) + SetRequirements__FRP16CTestModuleParamRUl @ 2 NONAME R3UNUSED ; SetRequirements(CTestModuleParam *&, unsigned long &) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/Bwins/t_msgstoreU.DEF Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,4 @@ +EXPORTS + ?LibEntryL@@YAPAVCTestModuleBase@@XZ @ 1 NONAME ; class CTestModuleBase * __cdecl LibEntryL(void) + ?SetRequirements@@YAHAAPAVCTestModuleParam@@AAK@Z @ 2 NONAME ; int __cdecl SetRequirements(class CTestModuleParam * &,unsigned long &) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/EABI/t_msgstoreU.def Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,4 @@ +EXPORTS + _Z9LibEntryLv @ 1 NONAME + _Z15SetRequirementsRP16CTestModuleParamRm @ 2 NONAME +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/group/bld.inf Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Message store unit tests build file. +* +*/ + + + +PRJ_PLATFORMS +// specify the platforms your component needs to be built for here +// defaults to WINS MARM so you can ignore this if you just build these +DEFAULT + +PRJ_TESTEXPORTS +// NOTE: If using ARS requirements all export operations should be done under this. +// 'abld test export' + +PRJ_EXPORTS +// Specify the source file followed by its destination here +// copy will be used to copy the source file to its destination +// If there's no destination then the source file will be copied +// to the same name in /epoc32/include +// Example: +/* +/agnmodel/inc/AGMCOMON.H +*/ + +PRJ_TESTMMPFILES +t_msgstore.mmp + +PRJ_MMPFILES +t_msgstore_nrm.mmp + +// Specify the .mmp files required for building the important component +// releasables. +// +// Specify "tidy" if the component you need to build doesn't need to be +// released. Specify "ignore" if the MMP file exists but should be +// ignored. +// Example: +/* +/agnmodel/group/agnmodel.mmp +#if defined(MARM) +/agnmodel/group/agsvexe.mmp +#endif +*/ + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/group/ctc_postprocess.bat Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,22 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: processing data collected by CTC +rem + +cd ..\..\group +REM Force Function Coverage. The data was collected for MultiCondition Coverage, but +REM We can just show the Function Coverage. +call ctcpost -ff -p profile.txt +call ctc2html -i profile.txt +cd ..\tsrc_stif\group
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/group/ctc_preprocess.bat Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,25 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: prepare the invironment for CTC data collection +rem + +cd ..\..\group +del MON.sym +del MON.dat +del profile.txt +del /q CTCHTML +call bldmake bldfiles +call abld reallyclean +call ctcwrap -i m -C "EXCLUDE+*/DebugLog/*" abld build winscw udeb +cd ..\tsrc_stif\group
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/group/run_coverage_test.bat Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,38 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: calls ctc_preprocess, run_unit_test, and ctc_post_process +rem + +@echo off +REM ------------------------------- +REM Preparing CTC Instrumentation +REM ------------------------------- +call ctc_preprocess.bat + +REM ------------------------------- +REM Build test modules +REM ------------------------------- +call bldmake bldfiles +call abld reallyclean winscw +call abld build winscw udeb + +REM ------------------------------- +REM Run the test modules +REM ------------------------------- +call run_unit_tests.bat + +REM ------------------------------- +REM Post process CTC data +REM ------------------------------- +call ctc_postprocess.bat
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/group/run_unit_tests.bat Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,17 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: invokes stiff command line interface to run the tests +rem + +\epoc32\release\winscw\udeb\ATSInterface -testmodule t_msgstore -engineini c:\testframework\testframework.ini
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/group/t_msgstore.mmp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,97 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: project file for Message Store unit test +* +*/ + +// For OS_LAYER_SYSTEMINCLUDE +#include <platform_paths.hrh> + +TARGET t_msgstore.dll +TARGETTYPE dll +UID 0x1000008D 0x101FB3E7 + +CAPABILITY ALL -TCB +/* Remove comments and replace 0x00000000 with correct vendor id */ +// VENDORID 0x00000000 +/* Remove comments and replace 0x00000000 with correct secure id */ +SECUREID 0x20022BFD + +//TARGETPATH target_path +DEFFILE t_msgstore.def + +USERINCLUDE ../inc +USERINCLUDE ../../../message_store/common/inc +USERINCLUDE ../../../message_store/server/inc + +OS_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE ../../../../../inc + +SOURCEPATH ../src +SOURCE t_msgstore.cpp +SOURCE t_msgstoreCases.cpp +SOURCE asynctestcasebase.cpp +SOURCE mailboxtests.cpp +SOURCE propertytests.cpp +SOURCE FolderTests.cpp +SOURCE MessageTests.cpp +SOURCE PartTests.cpp +SOURCE ObserverTests.cpp +SOURCE ContentTests.cpp +SOURCE MruTests.cpp +SOURCE SearchTests.cpp +SOURCE SortTests.cpp +SOURCE SizeTests.cpp +SOURCE ShutdownServerTest.cpp +SOURCE DbCorruptTests.cpp +SOURCE EncryptionTests.cpp + +//RESOURCE resource_file +//RESOURCE resource_file2 + +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY bafl.lib +LIBRARY stiftestinterface.lib +LIBRARY stiftestengine.lib +LIBRARY messagestoreclient.lib +LIBRARY tzclient.lib +LIBRARY edbms.lib +LIBRARY estor.lib + +LANG SC + +/* +START WINS +?wins_specific_information +END + +START MARM +?marm_specific_information +END +*/ +// Other possible keywords: + +// DOCUMENT ?file, that is not compiled, but added to MSVC project workspace (i.e. release notes) +/* +START BITMAP ?target +TARGETPATH ?emulated_path_on_target_machine +HEADER +SOURCE ?color_depth ?source_bitmap +END +*/ +// DEFFILE ?filename +// AIF ?filename// End of File + +EPOCALLOWDLLDATA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/group/t_msgstore.pkg Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,61 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: package file for Message Store unit test +; +; +; Installation file for STIF +; + +; Languages +&EN + +; Provide value for uid +#{"STIF"},(0x20022BFD),1,1,0,TYPE=SA + +; Series60 product id for S60 3.0 +[0x101F7961], 0, 0, 0, {"Series60ProductID"} + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Logo +; None + +; Package signature - Optional +; None + +; Start of Package body + +; Condition blocks +; None + +; Options list +; None + +; Install files +"\epoc32\release\armv5\udeb\t_msgstore.dll" - "!:\Sys\Bin\t_msgstore.dll" + +; Embedded SIS +; None + +; End of Package body + +; PKG dependencies +; None + +; PKG capabilities +; None
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/group/t_msgstore_DoxyFile.txt Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,222 @@ +# Doxyfile 1.4.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = t_msgstore +PROJECT_NUMBER = +OUTPUT_DIRECTORY = \t_msgstore\ +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = YES +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = YES +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = NO +GENERATE_TESTLIST = NO +GENERATE_BUGLIST = NO +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = YES +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = \t_msgstore\ +FILE_PATTERNS = *.h \ + *.rh \ + *.hrh +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = NO +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = YES +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = YES +TOC_EXPAND = YES +DISABLE_INDEX = YES +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = YES +RTF_OUTPUT = Doc +COMPACT_RTF = YES +RTF_HYPERLINKS = YES +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = NONSHARABLE_CLASS +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/group/t_msgstore_nrm.mmp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,97 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: project file for Message Store unit test +* +*/ + +// For OS_LAYER_SYSTEMINCLUDE +#include <platform_paths.hrh> + +TARGET t_msgstore.dll +TARGETTYPE dll +UID 0x1000008D 0x101FB3E7 + +CAPABILITY ALL -TCB +/* Remove comments and replace 0x00000000 with correct vendor id */ +// VENDORID 0x00000000 +/* Remove comments and replace 0x00000000 with correct secure id */ +SECUREID 0x20022BFD + +//TARGETPATH target_path +DEFFILE t_msgstore.def + +USERINCLUDE ../inc +USERINCLUDE ../../../message_store/common/inc +USERINCLUDE ../../../message_store/server/inc + +OS_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE ../../../../../inc + +SOURCEPATH ../src +SOURCE t_msgstore.cpp +SOURCE t_msgstoreCases.cpp +SOURCE asynctestcasebase.cpp +SOURCE mailboxtests.cpp +SOURCE propertytests.cpp +SOURCE FolderTests.cpp +SOURCE MessageTests.cpp +SOURCE PartTests.cpp +SOURCE ObserverTests.cpp +SOURCE ContentTests.cpp +SOURCE MruTests.cpp +SOURCE SearchTests.cpp +SOURCE SortTests.cpp +SOURCE SizeTests.cpp +SOURCE DbCorruptTests.cpp +SOURCE ShutdownServerTest.cpp +SOURCE EncryptionTests.cpp + +//RESOURCE resource_file +//RESOURCE resource_file2 + +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY bafl.lib +LIBRARY stiftestinterface.lib +LIBRARY stiftestengine.lib +LIBRARY messagestoreclient.lib +LIBRARY tzclient.lib +LIBRARY edbms.lib +LIBRARY estor.lib + +LANG SC + +/* +START WINS +?wins_specific_information +END + +START MARM +?marm_specific_information +END +*/ +// Other possible keywords: + +// DOCUMENT ?file, that is not compiled, but added to MSVC project workspace (i.e. release notes) +/* +START BITMAP ?target +TARGETPATH ?emulated_path_on_target_machine +HEADER +SOURCE ?color_depth ?source_bitmap +END +*/ +// DEFFILE ?filename +// AIF ?filename// End of File + +EPOCALLOWDLLDATA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/AsyncTestCaseBase.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,215 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: t_ImsIdsPlugin test module. +* +*/ + + + +#ifndef ASYNC_TESTCASE_BASE_H +#define ASYNC_TESTCASE_BASE_H + +// INCLUDES +#include "StifTestModule.h" +#include <StifLogger.h> +#include <NormalHardcodedAssert.h> +#include <msgstoreapi.h> + +//Forward declaration + +class CYieldHelper : public CTimer + { + public: + static CYieldHelper* NewL(); + virtual ~CYieldHelper(); + + void Yield( TInt aMicroSeconds ); + + private: + CYieldHelper(); + void ConstructL(); + + // inherited from CActive + virtual void RunL(); + virtual void DoCancel(); + + private: + CActiveSchedulerWait* iYieldWait; + }; + +// CLASS DECLARATION +class RDebugSession : public RSessionBase + { + public: + + // SERVER MUST BE ALREADY RUNNING! + TInt Connect(); + + void Close(); + + void SendBackupRestoreEventL( TUint aEvent ); + + void SendPointSecEventL( TBool aLock ); + + void SimulateLowDiskSpaceL( TUint aLatency ); + + TInt GetEncryptionStateL(); + + void ShutdownServerL(); + }; + + +// CLASS DECLARATION +class CAsyncTestCaseBase : public CTimer + { + public: // Constructors and destructor + + virtual ~CAsyncTestCaseBase(); + + inline TInt Result() { return iResult; } + + protected: + enum TState + { + EStateInit, + EStateExecute, + EStateDone, + }; + + /** + * C++ default constructor. + */ + CAsyncTestCaseBase( CStifLogger* aLogger ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + //steps for preparing the test cases + virtual void BeforeTestL(); + + //abstract method to start executing the real test case + // return ETrue if execution is done + virtual TBool ExecuteL() = 0; + + //steps for after the test cases, make sure this is always run + virtual void AfterTestL(); + + //stop the execution + virtual void Stop(); + + //From CTimer + virtual void RunL(); + virtual TInt RunError(TInt aError); + virtual void DoCancel(); + + void LogHeader( const TDesC& aTestType ); + + void CheckCondition( const TDesC& aCondition, TBool aPassed, TBool aLog=ETrue ); + + void ComparePropertiesL( const CMsgStorePropertyContainer& aProperties1, + const CMsgStorePropertyContainer& aProperties2 ); + + void SimulateLowDiskSpaceL( TUint aLatency ); + void TriggerBackupRestoreEventL( TUint aEvent ); + void TriggerPointSecEventL( TBool aLock ); + void ShutdownServerL(); + void Yield( TInt aMicroSeconds ); + void WaitForServerToTerminate(); + + TUint TestAddIntegerPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, TUint32 aValue, TBool aUseAddOrUpdate = EFalse ); + TUint TestAddBoolPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, TBool aValue, TBool aUseAddOrUpdate = EFalse ); + TUint TestAddDes8PropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const TDesC8& aValue, TBool aUseAddOrUpdate = EFalse ); + TUint TestAddDesPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const TDesC& aValue, TBool aUseAddOrUpdate = EFalse ); + TUint TestAddContainerPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const CMsgStorePropertyContainer& aValue, TBool aUseAddOrUpdate = EFalse ); + TUint TestAddTimePropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const TTime& aValue, TBool aUseAddOrUpdate = EFalse ); + TUint TestAddAddressPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const RMsgStoreAddress& aValue, TBool aUseAddOrUpdate = EFalse ); + + void TestRemovePropertyL( CMsgStorePropertyContainer& aProperties, TUint aIndex ); + + void TestUpdateDes8PropertyL( CMsgStorePropertyContainer& aProperties, + TUint aIndex, + const TDesC8& aNewValue, + TBool aUseAddOrUpdate = EFalse ); + + void TestUpdateDesPropertyL( CMsgStorePropertyContainer& aProperties, + TUint aIndex, + const TDesC& aNewValue, + TBool aUseAddOrUpdate = EFalse ); + + void TestUpdateContainerPropertyL( CMsgStorePropertyContainer& aProperties, + TUint aIndex, + CMsgStorePropertyContainer& aNewValue, + TBool aUseAddOrUpdate = EFalse ); + + void TestUpdateBoolPropertyL( CMsgStorePropertyContainer& aProperties, + TUint aIndex, + TBool aNewValue, + TBool aUseAddOrUpdate = EFalse ); + + void TestUpdateIntegerPropertyL( CMsgStorePropertyContainer& aProperties, + TUint aIndex, + TUint32 aNewValue, + TBool aUseAddOrUpdate = EFalse ); + + void TestUpdateTimePropertyL( CMsgStorePropertyContainer& aProperties, + TUint aIndex, + const TTime& aNewValue, + TBool aUseAddOrUpdate = EFalse ); + + void TestUpdateAddressPropertyL( CMsgStorePropertyContainer& aProperties, + TUint aIndex, + const RMsgStoreAddress& aNewValue, + TBool aUseAddOrUpdate = EFalse ); + + void CopyDesToDes8( const TDesC& aDes, TDes8& aDes8 ); + + void CreateFileL( const TDesC& aName, + TUint aTotalLength, + TChar aFillChar, + const TDesC& aString, + TUint aOffset ); + + void CreateRandomMessagesL( CMsgStoreMailBox* aMailBox1, + TMsgStoreId aFolder1Id, + TInt aCount, + TBool aKeepIds = EFalse, + TBool aLog = EFalse ); + + void CreateRandomString( TDes& aString, TInt aLength, TInt64& aSeed ); + + void SetMessageContentL( CMsgStoreMessage* aMessage, const TDesC8& aContent ); + + protected: + // Pointer to logger + CStifLogger* iLog; + + CActiveScheduler* iActiveScheduler; + CMsgStore* iMsgStore; + + TState iState; + TInt iResult; + TInt iCaseId; + + RArray<TMsgStoreId> iMatches; + RPointerArray<CMsgStoreMessage> iMessages; + + private: + CYieldHelper* iYieldHelper; + }; + +#endif // ASYNC_TESTCASE_BASE_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/ContentTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef CONTENT_TESTS_H +#define CONTENT_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CContentTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CContentTests* NewL( CStifLogger* aLog ); + + virtual ~CContentTests(); + + private: + + CContentTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + private: + + }; + +#endif // CONTENT_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/DbCorruptTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef DB_CORRUPTION_TESTS_H +#define DB_CORRUPTION_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CDbCorruptTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CDbCorruptTests* NewL( CStifLogger* aLog ); + + virtual ~CDbCorruptTests(); + + private: + + CDbCorruptTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + private: + + }; + +#endif // DB_CORRUPTION_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/EncryptionTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef ENCRYPTION_TESTS_H +#define ENCRYPTION_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CEncryptionTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CEncryptionTests* NewL( CStifLogger* aLog ); + + virtual ~CEncryptionTests(); + + private: + + CEncryptionTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + void WaitUntilEncryptDecryptCompleteL( TInt aCurrentState, CMsgStoreMailBox* aMailBox ); + void CompareMessagesL( CMsgStoreMailBox* aMailBox ); + void CompareAccountsL( CMsgStore* aSession, RPointerArray<CMsgStoreAccount>& aAccounts ); + void GetSortedIdsL( CMsgStoreMailBox* aMailBox, TMsgStoreId aFolderId, TMsgStoreSortByField aSortedBy, TInt aCount, RArray<TMsgStoreId>& aSortedIds ); + void CompareSortedIdArraysL( RArray<TMsgStoreId>& aIDs1, RArray<TMsgStoreId>& aIDs2 ); + + private: + RArray<TPtrC8> iTestContentArray; + + }; + +#endif // ENCRYPTION_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/FolderTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef FOLDER_TESTS_H +#define FOLDER_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CFolderTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CFolderTests* NewL( CStifLogger* aLog ); + + virtual ~CFolderTests(); + + private: + + CFolderTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + void VerifyFolderIdsL( RPointerArray<CMsgStoreFolder>& aFolders, RArray<TMsgStoreId>& aExpectedIds ); + }; + +#endif // FOLDER_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/MailboxTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef MAILBOX_TESTS_H +#define MAILBOX_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" + +class CMailboxTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CMailboxTests* NewL( CStifLogger* aLog ); + + virtual ~CMailboxTests(); + + private: + + CMailboxTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + void DoListAccountsL( CMsgStore& aSession ); + }; + +#endif // INIT_TESTCASE_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/MessageTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef MESSAGE_TESTS_H +#define MESSAGE_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CMessageTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CMessageTests* NewL( CStifLogger* aLog ); + + virtual ~CMessageTests(); + + private: + + CMessageTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + void VerifyMessageIdsL( CMsgStoreMailBox& aMailBox, TMsgStoreId aFolderId, RArray<TMsgStoreId>& expectedIds ); + void DoMessageCountsL( CMsgStoreMailBox& aMailBox ); + + }; + +#endif // MESSAGE_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/MruTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef MRU_TESTS_H +#define MRU_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CMruTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CMruTests* NewL( CStifLogger* aLog ); + + virtual ~CMruTests(); + + private: + + CMruTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + void CompareMruArraysL( CMsgStoreMailBox* aMailBox, RPointerArray<CMsgStoreAddress>& aExpected ); + + private: + + }; + +#endif // MRU_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/ObserverTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef OBSERVER_TESTS_H +#define OBSERVER_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CObserverTests : public CAsyncTestCaseBase, public MMsgStoreObserver, public MMsgStoreMailBoxObserver + { + public: // Constructors and destructor + + static CObserverTests* NewL( CStifLogger* aLog ); + + virtual ~CObserverTests(); + + private: + class TObserverEvent + { + public: + TInt iMailBoxId; + TInt iOperation; + TInt iType; + TInt iId; + TInt iParentId; + TInt iOtherId; + TUint32 iFlags; + TBuf8<KMaxAccountNameLen> iName; + TBuf8<KMaxAccountNameLen> iNewName; + }; + + void StartRecordingObserverEvents(); + + void StopRecordingObserverEvents(); + + void VerifyRecordedObserverEventsL( TBool aVerifyOrder, RArray<TObserverEvent>& aExpectedEvents ); + + // inherited from MMsgStoreObserver + virtual void ModificationNotify( TMsgStoreId aMailBoxId, + TMsgStoreOperation aOperation, + TMsgStoreContainerType aType, + TUint32 aFlags, + TMsgStoreId aId, + TMsgStoreId aParentId, + TMsgStoreId aOtherId ); + + virtual void SystemEventNotify( TMsgStoreSystemEvent aEvent ); + + virtual void AccountEventNotify( TMsgStoreAccountEvent aEvent, + TInt32 aOwnerId, + const TDesC& aName, + const TDesC& aNewName, + TMsgStoreId aMailboxId ); + + CObserverTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + private: + TBool iRecordEvents; + RArray<TObserverEvent> iRecordedEvents; + + + }; + +#endif // OBSERVER_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/PartTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef PART_TESTS_H +#define PART_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CPartTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CPartTests* NewL( CStifLogger* aLog ); + + virtual ~CPartTests(); + + private: + + CPartTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + }; + +#endif // PART_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/PropertyTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef PROPERTY_TESTS_H +#define PROPERTY_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" + +class CPropertyTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CPropertyTests* NewL( CStifLogger* aLog ); + + virtual ~CPropertyTests(); + + private: + + CPropertyTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + }; + +#endif // PROPERTY_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/SearchTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef SEARCH_TESTS_H +#define SEARCH_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CSearchTests : public CAsyncTestCaseBase, public MMsgStoreSearchClient + { + public: // Constructors and destructor + + static CSearchTests* NewL( CStifLogger* aLog ); + + virtual ~CSearchTests(); + + private: + + CSearchTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + // inherited from MMsgStoreSearchClient + virtual void MatchFound( CMsgStorePropertyContainer*& aMessage ); + virtual void SearchCompleted(); + + void ValidateSearchResults( RArray<TMsgStoreId>& aExpectedMatches, TBool aIgnoreExtra = EFalse ); + + void ReplaceMessageContentWithFileL( CMsgStoreMessage* aMessage, const TDesC& KFilename ); + + void SetSubjectAndAddressL( CMsgStoreMessage* aMessage, + const TDesC& aSubject, + const TDesC& aDisplayName, + const TDesC& aAddress, + const TDesC8& aAddressType ); + + private: + + CMsgStoreMailBox* iSessionToCancelSearch; + TBool iSearchCompleted; + RArray<TMsgStoreId> iMatches; + RPointerArray<CMsgStoreMessage> iMessages; + RMsgStoreSearchCriteria* iSearchCriteria; + }; + +#endif // SEARCH_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/ShutdownServerTest.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef SHUTDOWN_SERVER_TESTS_H +#define SHUTDOWN_SERVER_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CShutdownServerTest : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CShutdownServerTest* NewL( CStifLogger* aLog ); + + virtual ~CShutdownServerTest(); + + private: + + CShutdownServerTest( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + private: + + }; + +#endif // SHUTDOWN_SERVER_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/SizeTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef SIZE_TESTS_H +#define SIZE_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CSizeTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CSizeTests* NewL( CStifLogger* aLog ); + + virtual ~CSizeTests(); + + private: + + CSizeTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + private: + + }; + +#endif // SIZE_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/SortTests.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: InitTestCase test module. +* +*/ + + + +#ifndef SORT_TESTS_H +#define SORT_TESTS_H + +// INCLUDES +#include "AsyncTestCaseBase.h" +#include <msgstoreapi.h> + +class CSortTests : public CAsyncTestCaseBase + { + public: // Constructors and destructor + + static CSortTests* NewL( CStifLogger* aLog ); + + virtual ~CSortTests(); + + private: + + CSortTests( CStifLogger* aLogger ); + + void ConstructL(); + + //from CAsyncTestCaseBase + TBool ExecuteL(); + + void DoCreateMessagesL( TInt aMsgCount ); + + TMsgStoreId CompareSortResultsL( RMsgStoreSortCriteria aCriteria, + TMsgStoreIteratorDirection aDirection, + const RPointerArray<CMsgStorePropertyContainer>& aResults ); + + + private: + + }; + +#endif // SORT_TESTS_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/inc/t_msgstore.h Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,332 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: t_msgstore test module. +* +*/ + + + +#ifndef T_MSGSTORE_H +#define T_MSGSTORE_H + +// INCLUDES +#include "StifTestModule.h" +#include <StifLogger.h> +#include <NormalHardcodedAssert.h> + +// CONSTANTS + +// MACROS +#define TEST_MODULE_VERSION_MAJOR 0 +#define TEST_MODULE_VERSION_MINOR 0 +#define TEST_MODULE_VERSION_BUILD 0 + +// Logging path +_LIT( Kt_msgstoreLogPath, "\\logs\\testframework\\t_msgstore\\" ); +// Log file +_LIT( Kt_msgstoreLogFile, "t_msgstore.txt" ); +_LIT( Kt_msgstoreLogFileWithTitle, "t_msgstore_[%S].txt" ); + +#define GETPTR & +#define ENTRY(str,func) {_S(str), GETPTR func,0,0,0} +#define FUNCENTRY(func) {_S(#func), GETPTR func,0,0,0} +#define OOM_ENTRY(str,func,a,b,c) {_S(str), GETPTR func,a,b,c} +#define OOM_FUNCENTRY(func,a,b,c) {_S(#func), GETPTR func,a,b,c} + +// FORWARD DECLARATIONS +class Ct_msgstore; + +// DATA TYPES +// A typedef for function that does the actual testing, +// function is a type +typedef TInt (Ct_msgstore::* TestFunction)(TTestResult&); + +// CLASS DECLARATION + +/** +* An internal structure containing a test case name and +* the pointer to function doing the test +*/ +class TCaseInfoInternal + { + public: + const TText* iCaseName; + TestFunction iMethod; + TBool iIsOOMTest; + TInt iFirstMemoryAllocation; + TInt iLastMemoryAllocation; + }; + +// CLASS DECLARATION + +/** +* A structure containing a test case name and +* the pointer to function doing the test +* +* @lib ?library +* @since ?Series60_version +*/ +class TCaseInfo + { + public: + TPtrC iCaseName; + TestFunction iMethod; + TBool iIsOOMTest; + TInt iFirstMemoryAllocation; + TInt iLastMemoryAllocation; + + TCaseInfo( const TText* a ) : iCaseName( (TText*) a ) + { + }; + + }; + + +// CLASS DECLARATION + +/** +* This a t_msgstore class. +* ?other_description_lines +* +* @lib ?library +* @since ?Series60_version +*/ +NONSHARABLE_CLASS(Ct_msgstore) : public CTestModuleBase + { + public: // Constructors and destructor + + + /** + * Two-phased constructor. + */ + static Ct_msgstore* NewL(); + + /** + * Destructor. + */ + virtual ~Ct_msgstore(); + + public: // Functions from base classes + + /** + * From CTestModuleBase InitL is used to initialize the + * t_msgstore. It is called once for every instance of + * TestModulet_msgstore after its creation. + * @since ?Series60_version + * @param aIniFile Initialization file for the test module (optional) + * @param aFirstTime Flag is true when InitL is executed for first + * created instance of t_msgstore. + * @return Symbian OS error code + */ + TInt InitL( TFileName& aIniFile, TBool aFirstTime ); + + /** + * From CTestModuleBase GetTestCasesL is used to inquiry test cases + * from t_msgstore. + * @since ?Series60_version + * @param aTestCaseFile Test case file (optional) + * @param aTestCases Array of TestCases returned to test framework + * @return Symbian OS error code + */ + TInt GetTestCasesL( const TFileName& aTestCaseFile, + RPointerArray<TTestCaseInfo>& aTestCases ); + + /** + * From CTestModuleBase RunTestCaseL is used to run an individual + * test case. + * @since ?Series60_version + * @param aCaseNumber Test case number + * @param aTestCaseFile Test case file (optional) + * @param aResult Test case result returned to test framework (PASS/FAIL) + * @return Symbian OS error code (test case execution error, which is + * not reported in aResult parameter as test case failure). + */ + TInt RunTestCaseL( const TInt aCaseNumber, + const TFileName& aTestCaseFile, + TTestResult& aResult ); + + /** + * From CTestModuleBase; OOMTestQueryL is used to specify is particular + * test case going to be executed using OOM conditions + * @param aTestCaseFile Test case file (optional) + * @param aCaseNumber Test case number (optional) + * @param aFailureType OOM failure type (optional) + * @param aFirstMemFailure The first heap memory allocation failure value (optional) + * @param aLastMemFailure The last heap memory allocation failure value (optional) + * @return TBool + */ + virtual TBool OOMTestQueryL( const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */, + TOOMFailureType& aFailureType, + TInt& /* aFirstMemFailure */, + TInt& /* aLastMemFailure */ ); + + /** + * From CTestModuleBase; OOMTestInitializeL may be used to initialize OOM + * test environment + * @param aTestCaseFile Test case file (optional) + * @param aCaseNumber Test case number (optional) + * @return None + */ + virtual void OOMTestInitializeL( const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */ ); + + /** + * From CTestModuleBase; OOMHandleWarningL + * @param aTestCaseFile Test case file (optional) + * @param aCaseNumber Test case number (optional) + * @param aFailNextValue FailNextValue for OOM test execution (optional) + * @return None + * + * User may add implementation for OOM test warning handling. Usually no + * implementation is required. + */ + virtual void OOMHandleWarningL( const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */, + TInt& /* aFailNextValue */); + + /** + * From CTestModuleBase; OOMTestFinalizeL may be used to finalize OOM + * test environment + * @param aTestCaseFile Test case file (optional) + * @param aCaseNumber Test case number (optional) + * @return None + * + */ + virtual void OOMTestFinalizeL( const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */ ); + + /** + * Method used to log version of test module + */ + void SendTestModuleVersion(); + + private: + + /** + * C++ default constructor. + */ + Ct_msgstore(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + /** + * Function returning test case name and pointer to test case function. + * @since ?Series60_version + * @param aCaseNumber test case number + * @return TCaseInfo + */ + const TCaseInfo Case ( const TInt aCaseNumber ) const; + + /** + * [test case declarations] - do not remove + */ + //ADD NEW METHOD DEC HERE" + + /** + * Mailbox test cases. + * @param aResult Test case result (PASS/FAIL) + * @return Symbian OS error code (test case execution error + * that is not returned as test case result in aResult) + */ + TInt MailboxTestsL( TTestResult& aResult ); + + /** + * Property test cases. + */ + TInt PropertyTestsL( TTestResult& aResult ); + + /** + * Folder test cases. + */ + TInt FolderTestsL( TTestResult& aResult ); + + /** + * Message test cases. + */ + TInt MessageTestsL( TTestResult& aResult ); + + /** + * Part test cases. + */ + TInt PartTestsL( TTestResult& aResult ); + + /** + * Observer test cases. + */ + TInt ObserverTestsL( TTestResult& aResult ); + + /** + * Content test cases. + */ + TInt ContentTestsL( TTestResult& aResult ); + + /** + * MRU Address test cases. + */ + TInt MruTestsL( TTestResult& aResult ); + + /** + * Search test cases. + */ + TInt SearchTestsL( TTestResult& aResult ); + + /** + * Sort test cases. + */ + TInt SortTestsL( TTestResult& aResult ); + + /** + * Encryption test cases. + */ + TInt EncryptionTestsL( TTestResult& aResult ); + + /** + * Size test cases. + */ + TInt SizeTestsL( TTestResult& aResult ); + + + /** + * Database Corruption test cases. + */ + TInt DbCorruptTestsL( TTestResult& aResult ); + + private: // Data + // Pointer to test (function) to be executed + TestFunction iMethod; + + // Pointer to logger + CStifLogger * iLog; + + // Normal logger + CStifLogger* iStdLog; + + // Test case logger + CStifLogger* iTCLog; + + // Flag saying if test case title should be added to log file name + TBool iAddTestCaseTitleToLogName; + + // Flag saying if version of test module was already sent + TBool iVersionLogged; + + }; + +#endif // T_MSGSTORE_H + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/AsyncTestCaseBase.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,1279 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <tz.h> +#include <e32math.h> +#include <Stiftestinterface.h> +#include <SettingServerClient.h> +#include "AsyncTestCaseBase.h" +#include "messagestoreclientserver.h" + +const TInt KExecutionTimeout = 30*1000000; //30 seconds timelimit for each test case + +//Class RDebugSession +TInt RDebugSession::Connect() + { +#ifdef _DEBUG + return CreateSession( KMsgStoreServerName, TVersion(KMsgStoreMajorVersion, KMsgStoreMinorVersion, KMsgStoreBuild), 3 ); +#endif + } + +void RDebugSession::Close() + { +#ifdef _DEBUG + RSessionBase::Close(); //basecall +#endif + } + +void RDebugSession::SendBackupRestoreEventL( TUint aEvent ) + { +#ifdef _DEBUG + User::LeaveIfError( SendReceive( EMsgStoreCmdInjectBackupRestoreEvent, TIpcArgs( aEvent ) ) ); +#else + User::Leave(KErrNotSupported); +#endif + } + +void RDebugSession::SendPointSecEventL( TBool aLock ) + { +#ifdef _DEBUG + User::LeaveIfError( SendReceive( EMsgStoreCmdInjectPointSecEvent, TIpcArgs( aLock ) ) ); +#else + User::Leave(KErrNotSupported); +#endif + } + +void RDebugSession::SimulateLowDiskSpaceL( TUint aLatency ) + { +#ifdef _DEBUG + User::LeaveIfError( SendReceive( EMsgStoreCmdSimulateLowDiskSpace, TIpcArgs( aLatency ) ) ); +#else + User::Leave(KErrNotSupported); +#endif + } + +TInt RDebugSession::GetEncryptionStateL() + { +#ifdef _DEBUG + TPckgBuf<TInt> resultPckg(0); + + User::LeaveIfError( SendReceive( EMsgStoreCmdGetEncryptionState, TIpcArgs( &resultPckg ) ) ); + + return resultPckg(); +#else + User::Leave(KErrNotSupported); +#endif + } + +void RDebugSession:: ShutdownServerL() + { +#ifdef _DEBUG + User::LeaveIfError( SendReceive( EMsgStoreCmdShutdownServer ) ); +#else + User::Leave(KErrNotSupported); +#endif + } + +//Class CYieldHelper + +CYieldHelper* CYieldHelper::NewL() + { + CYieldHelper* self = new(ELeave) CYieldHelper(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CYieldHelper::CYieldHelper() : CTimer( EPriorityIdle ) + { + } + +void CYieldHelper::ConstructL() + { + CTimer::ConstructL(); + iYieldWait = new(ELeave) CActiveSchedulerWait(); + CActiveScheduler::Add(this); + } + +CYieldHelper::~CYieldHelper() + { + delete iYieldWait; + } + +void CYieldHelper::Yield( TInt aMicroSeconds ) + { + After( aMicroSeconds ); + iYieldWait->Start(); + } + +void CYieldHelper::DoCancel() + { + //DO Nothing + } + +void CYieldHelper::RunL() + { + if( iYieldWait->IsStarted() ) + { + // Stop the nested active scheduler (flow-of-control will pick up immediately following the + // call to iWait.Start(). + iYieldWait->AsyncStop(); + } // end if + } + +//Class CAsyncTestCaseBase + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CAsyncTestCaseBase::CAsyncTestCaseBase( CStifLogger* aLog ) +: CTimer( CActive::EPriorityStandard ), iLog( aLog ), iCaseId(1) + { + // Construct and install active scheduler + CActiveScheduler* iActiveScheduler = new CActiveScheduler; + CActiveScheduler::Replace( iActiveScheduler ); + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CAsyncTestCaseBase::~CAsyncTestCaseBase() + { + Cancel(); + iMessages.ResetAndDestroy(); + delete iMsgStore; + delete iActiveScheduler; + delete iYieldHelper; + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CAsyncTestCaseBase::ConstructL() + { + CTimer::ConstructL(); + CActiveScheduler::Add(this); + + //Construct the MsgStore client session + iMsgStore = CMsgStore::NewL(); + + iYieldHelper = CYieldHelper::NewL(); + + iState = EStateInit; + iResult = KErrNone; + CTimer::After(0); + } + + +//stop the execution +void CAsyncTestCaseBase::Stop() + { + TRAP_IGNORE( AfterTestL() ); + + _LIT( KStop, "Ending test cases... iResult=%d" ); + iLog->Log( KStop, iResult ); + CActiveScheduler::Stop(); + } + +void CAsyncTestCaseBase::BeforeTestL() + { + _LIT( KBeforeTestLEnter, ">> BeforeTestL" ); + iLog->Log( KBeforeTestLEnter ); + + iMsgStore->WipeEverythingL(); + + _LIT( KBeforeTestLExit, "<< BeforeTestL" ); + iLog->Log( KBeforeTestLExit ); + } + +void CAsyncTestCaseBase::AfterTestL() + { + _LIT( KAfterTestLEnter, ">> AfterTestL" ); + iLog->Log( KAfterTestLEnter ); + + delete iMsgStore; + iMsgStore = NULL; + + _LIT( KAfterTestLExit, "<< AfterTestL" ); + iLog->Log( KAfterTestLExit ); + } + + +//From CTimer +void CAsyncTestCaseBase::RunL() + { + if ( iStatus == KErrNone ) + { + if ( iState == EStateInit ) + { + BeforeTestL(); + + TBool done = EFalse; + TRAP( iResult, done = ExecuteL() ); + if( iResult == KErrNone ) + { + if ( done ) + { + iState = EStateDone; + Stop(); + } + else + { + iState = EStateExecute; + CTimer::After( KExecutionTimeout ); + } + } + else + { + iState = EStateDone; + Stop(); + } + } + else if ( iState == EStateExecute ) + { + //Timer has expired, error out + iState = EStateDone; + iResult = KErrTimedOut; + Stop(); + } + } + else if ( iStatus != KErrCancel ) + { + iState = EStateDone; + iResult = KErrCorrupt; + Stop(); + } + + } + +TInt CAsyncTestCaseBase::RunError(TInt aError) + { + //log the error + iResult = aError; + return aError; + } + +void CAsyncTestCaseBase::DoCancel() + { + CTimer::DoCancel(); + } + +void CAsyncTestCaseBase::LogHeader( const TDesC& aTestType ) + { + _LIT(KDivider, "=============================================================="); + iLog->Log( KDivider ); + iLog->Log( _L("Executing %S Test Cases"), &aTestType ); + iLog->Log( KDivider ); + } + +void CAsyncTestCaseBase::CheckCondition( const TDesC& aCondition, TBool aPassed, TBool aLog ) + { + if( aPassed ) + { + if ( aLog ) + { + iLog->Log( _L(" PASSED! Condition: %S"), &aCondition ); + } + } + else + { + iLog->Log( _L( "*** FAILED! Condition: %S"), &aCondition ); + User::Panic( aCondition, 1 ); + } // end if + } + + +void CAsyncTestCaseBase::ComparePropertiesL( const CMsgStorePropertyContainer& aProperties1, const CMsgStorePropertyContainer& aProperties2 ) + { + iLog->Log( _L(" >> ComparePropertiesL") ); + + TBool passed = (aProperties1.PropertyCount() == aProperties2.PropertyCount()); + + for( TUint index1 = 0; index1 < aProperties1.PropertyCount(); index1++ ) + { + TUint index2; + + const TPtrC8 property1Name( aProperties1.PropertyNameL(index1) ); + + TBool matched = EFalse; + + if( aProperties2.FindProperty( property1Name, index2 ) ) + { + TMsgStorePropertyValueType value1 = aProperties1.PropertyTypeL( index1 ); + TMsgStorePropertyValueType value2 = aProperties2.PropertyTypeL( index2 ); + + // Found + if( value1 != value2 ) + { + iLog->Log( _L("type mismatch") ); + } + else + { + switch( aProperties1.PropertyTypeL( index1 ) ) + { + case EMsgStoreTypeBool: + { + const TBool property1Value = aProperties1.PropertyValueBoolL(index1); + const TBool property2Value = aProperties2.PropertyValueBoolL(index2); + + if( property1Value == property2Value ) + { + matched = ETrue; + } + else + { + iLog->Log( _L(" property %S value mismatch"), &property1Name ); + iLog->Log( _L(" expected %i"), &property1Value ); + iLog->Log( _L(" found %i"), &property2Value ); + } + break; + } + case EMsgStoreTypeUint32: + { + const TUint32 property1Value = aProperties1.PropertyValueUint32L(index1); + const TUint32 property2Value = aProperties2.PropertyValueUint32L(index2); + + if( property1Value == property2Value ) + { + matched = ETrue; + } + else + { + iLog->Log( _L(" property %S value mismatch"), &property1Name ); + iLog->Log( _L(" expected %i"), &property1Value ); + iLog->Log( _L(" found %i"), &property2Value ); + } + break; + } + case EMsgStoreTypeDes: + { + const TPtrC property1Value( aProperties1.PropertyValueDesL(index1) ); + const TPtrC property2Value( aProperties2.PropertyValueDesL(index2) ); + + if( property1Value.Compare( property2Value ) == 0 ) + { + matched = ETrue; + } + else + { + iLog->Log( _L(" property %S value mismatch"), &property1Name ); + iLog->Log( _L(" expected %S"), &property1Value ); + iLog->Log( _L(" found %S"), &property2Value ); + } + break; + } + case EMsgStoreTypeDes8: + { + const TPtrC8 property1Value( aProperties1.PropertyValueDes8L(index1) ); + const TPtrC8 property2Value( aProperties2.PropertyValueDes8L(index2) ); + + if( property1Value.Compare( property2Value ) == 0 ) + { + matched = ETrue; + } + else + { + iLog->Log( _L(" property %S value mismatch"), &property1Name ); + iLog->Log( _L(" expected %S"), &property1Value ); + iLog->Log( _L(" found %S"), &property2Value ); + } + break; + } + case EMsgStoreTypeContainer: + { + CMsgStorePropertyContainer* property1Value = aProperties1.PropertyValueContainerL(index1); + CMsgStorePropertyContainer* property2Value = aProperties2.PropertyValueContainerL(index2); + + ComparePropertiesL( *property1Value, *property2Value ); + + matched = ETrue; + + delete property1Value; + delete property2Value; + break; + } + case EMsgStoreTypeTime: + { + TTime time1, time2; + aProperties1.PropertyValueTimeL( index1, time1 ); + aProperties2.PropertyValueTimeL( index2, time2 ); + + if ( time1 == time2 ) + { + matched = ETrue; + } + + break; + } + case EMsgStoreTypeAddress: + { + RMsgStoreAddress addr1, addr2; + + aProperties1.PropertyValueAddressL( index1, addr1 ); + aProperties2.PropertyValueAddressL( index2, addr2 ); + + if ( addr1.iEmailAddress == addr2.iEmailAddress && addr1.iDisplayName == addr2.iDisplayName ) + { + matched = ETrue; + } + + addr1.Close(); + addr2.Close(); + break; + } + + } // end switch + + } // end if + } + else + { + iLog->Log( _L(" property %S not found"), &property1Name ); + } + + passed = passed && matched; + + } // end for + + TBuf<30> text; + text.Format( _L("compare %i properties"), aProperties1.PropertyCount() ); + + CheckCondition( text, passed ); + iLog->Log( _L(" << ComparePropertiesL") ); + } + + +TUint CAsyncTestCaseBase::TestAddIntegerPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, TUint32 aValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TUint index; + if( aUseAddOrUpdate ) + { + index = aProperties.AddOrUpdatePropertyL( aName, aValue ); + } + else + { + index = aProperties.AddPropertyL( aName, aValue ); + } // end if + + TRAPD( des8Result, aProperties.PropertyValueDes8L( index ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( index ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( index ) ); + TRAPD( boolResult, aProperties.PropertyValueBoolL( index ) ); + + TBool passed = (aProperties.PropertyCount() == (countBefore+1) && + aProperties.PropertyNameL( index ).Compare( aName ) == 0 && + aProperties.PropertyTypeL( index ) == EMsgStoreTypeUint32 && + aProperties.PropertyValueUint32L( index ) == aValue && + des8Result == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + boolResult == KErrArgument ); + + CheckCondition( _L("add integer property"), passed ); + + return index; + } + +TUint CAsyncTestCaseBase::TestAddBoolPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, TBool aValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TUint index; + if( aUseAddOrUpdate ) + { + index = aProperties.AddOrUpdatePropertyL( aName, aValue ); + } + else + { + index = aProperties.AddPropertyL( aName, aValue ); + } // end if + + TRAPD( des8Result, aProperties.PropertyValueDes8L( index ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( index ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( index ) ); + TRAPD( integerResult, aProperties.PropertyValueUint32L( index ) ); + + TBool passed = (aProperties.PropertyCount() == (countBefore+1) && + aProperties.PropertyNameL( index ).Compare( aName ) == 0 && + aProperties.PropertyTypeL( index ) == EMsgStoreTypeBool && + aProperties.PropertyValueBoolL( index ) == aValue && + des8Result == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + integerResult == KErrArgument ); + + CheckCondition( _L("add bool property"), passed ); + + return index; + } + +TUint CAsyncTestCaseBase::TestAddDes8PropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const TDesC8& aValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TUint index; + if( aUseAddOrUpdate ) + { + index = aProperties.AddOrUpdatePropertyL( aName, aValue ); + } + else + { + index = aProperties.AddPropertyL( aName, aValue ); + } // end if + + TRAPD( boolResult, aProperties.PropertyValueBoolL( index ) ); + TRAPD( intResult, aProperties.PropertyValueUint32L( index ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( index ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( index ) ); + + TBool passed = (aProperties.PropertyCount() == (countBefore+1) && + aProperties.PropertyNameL( index ).Compare( aName ) == 0 && + aProperties.PropertyTypeL( index ) == EMsgStoreTypeDes8 && + aProperties.PropertyValueDes8L( index ).Compare( aValue ) == 0 && + intResult == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + boolResult == KErrArgument ); + + CheckCondition( _L("add des8 property"), passed ); + + return index; + } + +TUint CAsyncTestCaseBase::TestAddDesPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const TDesC& aValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TUint index; + if( aUseAddOrUpdate ) + { + index = aProperties.AddOrUpdatePropertyL( aName, aValue ); + } + else + { + index = aProperties.AddPropertyL( aName, aValue ); + } // end if + + TRAPD( boolResult, aProperties.PropertyValueBoolL( index ) ); + TRAPD( intResult, aProperties.PropertyValueUint32L( index ) ); + TRAPD( des8Result, aProperties.PropertyValueDes8L( index ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( index ) ); + + TBool passed = (aProperties.PropertyCount() == (countBefore+1) && + aProperties.PropertyNameL( index ).Compare( aName ) == 0 && + aProperties.PropertyTypeL( index ) == EMsgStoreTypeDes && + aProperties.PropertyValueDesL( index ).Compare( aValue ) == 0 && + intResult == KErrArgument && + des8Result == KErrArgument && + containerResult == KErrArgument && + boolResult == KErrArgument ); + + CheckCondition( _L("add des property"), passed ); + + return index; + } + +TUint CAsyncTestCaseBase::TestAddContainerPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const CMsgStorePropertyContainer& aValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TUint index; + if( aUseAddOrUpdate ) + { + index = aProperties.AddOrUpdatePropertyL( aName, aValue ); + } + else + { + index = aProperties.AddPropertyL( aName, aValue ); + } // end if + + CMsgStorePropertyContainer* container = aProperties.PropertyValueContainerL( index ); + ComparePropertiesL( aValue, *container ); + delete container; + + TRAPD( boolResult, aProperties.PropertyValueUint32L( index ) ); + TRAPD( intResult, aProperties.PropertyValueUint32L( index ) ); + TRAPD( des8Result, aProperties.PropertyValueDes8L( index ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( index ) ); + + TBool passed = (aProperties.PropertyCount() == (countBefore+1) && + aProperties.PropertyNameL( index ).Compare( aName ) == 0 && + aProperties.PropertyTypeL( index ) == EMsgStoreTypeContainer && + desResult == KErrArgument && + des8Result == KErrArgument && + intResult == KErrArgument && + boolResult == KErrArgument ); + + CheckCondition( _L("add container property"), passed ); + + return index; + } + +TUint CAsyncTestCaseBase::TestAddTimePropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const TTime& aValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TUint index; + if( aUseAddOrUpdate ) + { + index = aProperties.AddOrUpdatePropertyL( aName, aValue ); + } + else + { + index = aProperties.AddPropertyL( aName, aValue ); + } // end if + + TRAPD( des8Result, aProperties.PropertyValueDes8L( index ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( index ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( index ) ); + TRAPD( integerResult, aProperties.PropertyValueUint32L( index ) ); + TRAPD( boolResult, aProperties.PropertyValueBoolL( index ) ); + + TBool passed = (aProperties.PropertyCount() == (countBefore+1) && + aProperties.PropertyNameL( index ).Compare( aName ) == 0 && + aProperties.PropertyTypeL( index ) == EMsgStoreTypeTime && + des8Result == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + integerResult == KErrArgument && + boolResult == KErrArgument ); + + TTime time; + aProperties.PropertyValueTimeL( index, time ); + + passed = passed && time == aValue; + + CheckCondition( _L("add time property"), passed ); + + return index; + } + +TUint CAsyncTestCaseBase::TestAddAddressPropertyL( CMsgStorePropertyContainer& aProperties, const TDesC8& aName, const RMsgStoreAddress& aValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TUint index; + if( aUseAddOrUpdate ) + { + index = aProperties.AddOrUpdatePropertyL( aName, aValue ); + } + else + { + index = aProperties.AddPropertyL( aName, aValue ); + } // end if + + TRAPD( des8Result, aProperties.PropertyValueDes8L( index ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( index ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( index ) ); + TRAPD( integerResult, aProperties.PropertyValueUint32L( index ) ); + TRAPD( boolResult, aProperties.PropertyValueBoolL( index ) ); + TTime time; + TRAPD( timeResult, aProperties.PropertyValueTimeL( index, time ) ); + + TBool passed = (aProperties.PropertyCount() == (countBefore+1) && + aProperties.PropertyNameL( index ).Compare( aName ) == 0 && + aProperties.PropertyTypeL( index ) == EMsgStoreTypeAddress && + des8Result == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + integerResult == KErrArgument && + boolResult == KErrArgument && + timeResult == KErrArgument ); + + RMsgStoreAddress address; + aProperties.PropertyValueAddressL( index, address ); + + iLog->Log( _L(" passed=%d"), passed ); + iLog->Log( _L(" email addr=%S, disp name=%S"), &address.iEmailAddress, &address.iDisplayName); + + passed = passed && (address.iEmailAddress == aValue.iEmailAddress) && (address.iDisplayName == aValue.iDisplayName); + + address.Close(); + + CheckCondition( _L("add address property"), passed ); + + return index; + } + +void CAsyncTestCaseBase::TestRemovePropertyL( CMsgStorePropertyContainer& aProperties, TUint aIndex ) + { + TUint countBefore = aProperties.PropertyCount(); + + TBuf8<500> oldName; + oldName.Copy( aProperties.PropertyNameL( aIndex ) ); + + aProperties.RemovePropertyL( aIndex ); + + TUint index; + TBool found = aProperties.FindProperty( oldName, index ); + + TBool passed = (!found && + aProperties.PropertyCount() == (countBefore-1) ); + + CheckCondition( _L("remove property"), passed ); + } + +void CAsyncTestCaseBase::TestUpdateDes8PropertyL( CMsgStorePropertyContainer& aProperties, TUint aIndex, const TDesC8& aNewValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TBuf8<500> oldName; + oldName.Copy( aProperties.PropertyNameL( aIndex ) ); + + if( aUseAddOrUpdate ) + { + aProperties.AddOrUpdatePropertyL( aProperties.PropertyNameL(aIndex), aNewValue ); + } + else + { + aProperties.UpdatePropertyL( aIndex, aNewValue ); + } // end if + + TRAPD( intResult, aProperties.PropertyValueUint32L( aIndex ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( aIndex ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( aIndex ) ); + TRAPD( boolResult, aProperties.PropertyValueBoolL( aIndex ) ); + + TPtrC8 des8( aProperties.PropertyValueDes8L( aIndex ) ); + + TBool passed = (aProperties.PropertyCount() == countBefore && + aProperties.PropertyNameL( aIndex ).Compare( oldName ) == 0 && + aProperties.PropertyTypeL( aIndex ) == EMsgStoreTypeDes8 && + des8.Compare( aNewValue ) == 0 && + intResult == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + boolResult == KErrArgument ); + + CheckCondition( _L("update des8 property"), passed ); + } + +void CAsyncTestCaseBase::TestUpdateDesPropertyL( CMsgStorePropertyContainer& aProperties, TUint aIndex, const TDesC& aNewValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TBuf8<500> oldName; + oldName.Copy( aProperties.PropertyNameL( aIndex ) ); + + if( aUseAddOrUpdate ) + { + aProperties.AddOrUpdatePropertyL( aProperties.PropertyNameL(aIndex), aNewValue ); + } + else + { + aProperties.UpdatePropertyL( aIndex, aNewValue ); + } // end if + + TRAPD( intResult, aProperties.PropertyValueUint32L( aIndex ) ); + TRAPD( des8Result, aProperties.PropertyValueDes8L( aIndex ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( aIndex ) ); + TRAPD( boolResult, aProperties.PropertyValueBoolL( aIndex ) ); + + TPtrC des( aProperties.PropertyValueDesL( aIndex ) ); + + TBool passed = (aProperties.PropertyCount() == countBefore && + aProperties.PropertyNameL( aIndex ).Compare( oldName ) == 0 && + aProperties.PropertyTypeL( aIndex ) == EMsgStoreTypeDes && + des.Compare( aNewValue ) == 0 && + intResult == KErrArgument && + des8Result == KErrArgument && + containerResult == KErrArgument && + boolResult == KErrArgument ); + + CheckCondition( _L("update string(16) property"), passed ); + } + +void CAsyncTestCaseBase::TestUpdateContainerPropertyL( CMsgStorePropertyContainer& aProperties, TUint aIndex, CMsgStorePropertyContainer& aNewValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TBuf8<500> oldName; + oldName.Copy( aProperties.PropertyNameL( aIndex ) ); + + if( aUseAddOrUpdate ) + { + aProperties.AddOrUpdatePropertyL( aProperties.PropertyNameL(aIndex), aNewValue ); + } + else + { + aProperties.UpdatePropertyL( aIndex, aNewValue ); + } // end if + + CMsgStorePropertyContainer* container = aProperties.PropertyValueContainerL( aIndex ); + ComparePropertiesL( aNewValue, *container ); + delete container; + + TRAPD( intResult, aProperties.PropertyValueUint32L( aIndex ) ); + TRAPD( des8Result, aProperties.PropertyValueDes8L( aIndex ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( aIndex ) ); + TRAPD( boolResult, aProperties.PropertyValueBoolL( aIndex ) ); + + TBool passed = (aProperties.PropertyCount() == countBefore && + aProperties.PropertyNameL( aIndex ).Compare( oldName ) == 0 && + aProperties.PropertyTypeL( aIndex ) == EMsgStoreTypeContainer && + intResult == KErrArgument && + des8Result == KErrArgument && + desResult == KErrArgument && + boolResult == KErrArgument ); + + CheckCondition( _L("update container property"), passed ); + } + +void CAsyncTestCaseBase::TestUpdateBoolPropertyL( CMsgStorePropertyContainer& aProperties, TUint aIndex, TBool aNewValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TBuf8<500> oldName; + oldName.Copy( aProperties.PropertyNameL( aIndex ) ); + + if( aUseAddOrUpdate ) + { + aProperties.AddOrUpdatePropertyL( aProperties.PropertyNameL(aIndex), aNewValue ); + } + else + { + aProperties.UpdatePropertyL( aIndex, aNewValue ); + } // end if + + TRAPD( intResult, aProperties.PropertyValueUint32L( aIndex ) ); + TRAPD( des8Result, aProperties.PropertyValueDes8L( aIndex ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( aIndex ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( aIndex ) ); + + TBool passed = (aProperties.PropertyCount() == countBefore && + aProperties.PropertyNameL( aIndex ).Compare( oldName ) == 0 && + aProperties.PropertyTypeL( aIndex ) == EMsgStoreTypeBool && + aProperties.PropertyValueBoolL( aIndex ) == aNewValue && + des8Result == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + intResult == KErrArgument ); + + CheckCondition( _L("update bool property"), passed ); + } + +void CAsyncTestCaseBase::TestUpdateIntegerPropertyL( CMsgStorePropertyContainer& aProperties, TUint aIndex, TUint32 aNewValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TBuf8<500> oldName; + oldName.Copy( aProperties.PropertyNameL( aIndex ) ); + + if( aUseAddOrUpdate ) + { + aProperties.AddOrUpdatePropertyL( aProperties.PropertyNameL(aIndex), aNewValue ); + } + else + { + aProperties.UpdatePropertyL( aIndex, aNewValue ); + } // end if + + TRAPD( des8Result, aProperties.PropertyValueDes8L( aIndex ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( aIndex ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( aIndex ) ); + TRAPD( boolResult, aProperties.PropertyValueBoolL( aIndex ) ); + + TBool passed = (aProperties.PropertyCount() == countBefore && + aProperties.PropertyNameL( aIndex ).Compare( oldName ) == 0 && + aProperties.PropertyTypeL( aIndex ) == EMsgStoreTypeUint32 && + aProperties.PropertyValueUint32L( aIndex ) == aNewValue && + des8Result == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + boolResult == KErrArgument ); + + CheckCondition( _L("update integer property"), passed ); + } + +void CAsyncTestCaseBase::TestUpdateTimePropertyL( CMsgStorePropertyContainer& aProperties, TUint aIndex, const TTime& aNewValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TBuf8<500> oldName; + oldName.Copy( aProperties.PropertyNameL( aIndex ) ); + + if( aUseAddOrUpdate ) + { + aProperties.AddOrUpdatePropertyL( aProperties.PropertyNameL(aIndex), aNewValue ); + } + else + { + aProperties.UpdatePropertyL( aIndex, aNewValue ); + } // end if + + TRAPD( des8Result, aProperties.PropertyValueDes8L( aIndex ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( aIndex ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( aIndex ) ); + TRAPD( boolResult, aProperties.PropertyValueBoolL( aIndex ) ); + TRAPD( intResult, aProperties.PropertyValueUint32L( aIndex ) ); + + TBool passed = (aProperties.PropertyCount() == countBefore && + aProperties.PropertyNameL( aIndex ).Compare( oldName ) == 0 && + aProperties.PropertyTypeL( aIndex ) == EMsgStoreTypeTime && + des8Result == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + boolResult == KErrArgument && + intResult == KErrArgument ); + + TTime time; + aProperties.PropertyValueTimeL( aIndex, time ); + + passed = passed && time == aNewValue; + + + CheckCondition( _L("update time property"), passed ); + } + + +void CAsyncTestCaseBase::TestUpdateAddressPropertyL( CMsgStorePropertyContainer& aProperties, TUint aIndex, const RMsgStoreAddress& aNewValue, TBool aUseAddOrUpdate ) + { + TUint countBefore = aProperties.PropertyCount(); + + TBuf8<500> oldName; + oldName.Copy( aProperties.PropertyNameL( aIndex ) ); + + if( aUseAddOrUpdate ) + { + aProperties.AddOrUpdatePropertyL( aProperties.PropertyNameL(aIndex), aNewValue ); + } + else + { + aProperties.UpdatePropertyL( aIndex, aNewValue ); + } // end if + + TRAPD( des8Result, aProperties.PropertyValueDes8L( aIndex ) ); + TRAPD( desResult, aProperties.PropertyValueDesL( aIndex ) ); + TRAPD( containerResult, aProperties.PropertyValueContainerL( aIndex ) ); + TRAPD( boolResult, aProperties.PropertyValueBoolL( aIndex ) ); + TRAPD( intResult, aProperties.PropertyValueUint32L( aIndex ) ); + TTime time; + TRAPD( timeResult, aProperties.PropertyValueTimeL( aIndex, time ) ); + + TBool passed = (aProperties.PropertyCount() == countBefore && + aProperties.PropertyNameL( aIndex ).Compare( oldName ) == 0 && + aProperties.PropertyTypeL( aIndex ) == EMsgStoreTypeAddress && + des8Result == KErrArgument && + desResult == KErrArgument && + containerResult == KErrArgument && + boolResult == KErrArgument && + intResult == KErrArgument, + timeResult == KErrArgument ); + + RMsgStoreAddress address; + aProperties.PropertyValueAddressL( aIndex, address ); + + iLog->Log( _L(" email addr=%S, disp name=%S"), &address.iEmailAddress, &address.iDisplayName); + + passed = passed && (address.iEmailAddress == aNewValue.iEmailAddress) && (address.iDisplayName == aNewValue.iDisplayName); + + address.Close(); + + CheckCondition( _L("update address property"), passed ); + } + +void CAsyncTestCaseBase::CopyDesToDes8( const TDesC& aDes, TDes8& aDes8 ) + { + const TUint8* ptr = reinterpret_cast<const TUint8*>( aDes.Ptr() ); + + aDes8.Copy( ptr, aDes.Length() * 2 ); + } + +void CAsyncTestCaseBase::SimulateLowDiskSpaceL( TUint aLatency ) + { + RDebugSession session; + User::LeaveIfError( session.Connect() ); + session.SimulateLowDiskSpaceL( aLatency ); + session.Close(); + } + +void CAsyncTestCaseBase::TriggerBackupRestoreEventL( TUint aEvent ) + { + RDebugSession session; + User::LeaveIfError( session.Connect() ); + session.SendBackupRestoreEventL( aEvent ); + session.Close(); + } + +void CAsyncTestCaseBase::TriggerPointSecEventL( TBool aLock ) + { + RDebugSession session; + User::LeaveIfError( session.Connect() ); + session.SendPointSecEventL( aLock ); + session.Close(); + } + +void CAsyncTestCaseBase::ShutdownServerL() + { + RDebugSession temp; + User::LeaveIfError( temp.Connect() ); + temp.ShutdownServerL(); + temp.Close(); + } + +void CAsyncTestCaseBase::Yield( TInt aMicroSeconds ) + { + iYieldHelper->Yield( aMicroSeconds ); + } + +void CAsyncTestCaseBase::CreateRandomMessagesL( CMsgStoreMailBox* aMailBox, TMsgStoreId aFolderId, TInt aCount, TBool aKeepIds, TBool /* aLog */ ) + { + iLog->Log( _L(" >> CreateRandomMessagesL, creating %d messages"), aCount ); + + TTime time; + time.HomeTime(); + TInt64 seed = time.Int64(); + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( properties ); //+1 + + RMsgStoreAddress address; + CleanupClosePushL( address ); //+2 + + address.iDisplayName.Create( 50 ); + address.iEmailAddress.Create( 50 ); + + TBuf<30> subject; + TBuf<50> realSubject; + TBuf<6> fname, lname; + TTime startTime; + + if ( aKeepIds ) + { + iMatches.Reset(); + } + + RTz timeZoneServer; + User::LeaveIfError( timeZoneServer.Connect() ); + CleanupClosePushL( timeZoneServer ); //+3 + + for (TInt i = 0 ; i < aCount ; i++ ) + { + TTime received; + received.HomeTime(); + TTimeIntervalDays days( (i+1) % 9 ); + TTimeIntervalHours hours( (i+1) %9 ); + received -= days; + received += hours; + + timeZoneServer.ConvertToUniversalTime( received ); + properties->AddOrUpdatePropertyL( KMsgStorePropertyReceivedAt, received ); + + TUint32 flags = Math::Rand( seed ); + properties->AddOrUpdatePropertyL( KMsgStorePropertyFlags, (TUint32) flags ); + + TUint32 size = Math::Rand( seed ); + properties->AddOrUpdatePropertyL( KMsgStorePropertyMessageSizeOnServer, (TUint32) size ); + + if ( i == 0 || i % 9 == 0 ) + { + CreateRandomString( subject, 30, seed ); + CreateRandomString( fname, 6, seed ); + CreateRandomString( lname, 6, seed ); + } + + realSubject.SetLength(0); + if ( i % 5 == 0 ) + { + realSubject.Copy(_L("RE: ")); + } + else if ( i % 10 == 0 ) + { + realSubject.Copy(_L("RE: FWD:")); + } + else if ( i % 3 == 0 ) + { + realSubject.Copy(_L("R&D:")); + } + realSubject.Append( subject ); + + properties->AddOrUpdatePropertyL( KMsgStorePropertySubject, realSubject ); + + if ( i % 10 > 0 ) + { + //skip display name for every 10 messages + address.iDisplayName.Format( _L("%S %S"), &fname, &lname ); + } + _LIT(KDomainName, "nokia.com"); + address.iEmailAddress.Format( _L("%S.%S@%S"), &fname, &lname, &KDomainName); + properties->AddOrUpdatePropertyL( KMsgStorePropertyFrom, address ); + + properties->AddOrUpdatePropertyL( KMsgStorePropertyTo, address ); + + if ( i == aCount - 1 ) + { + startTime.HomeTime(); + } + CMsgStoreMessage* msg = aMailBox->CreateMessageL( aFolderId, *properties ); + CleanupStack::PushL( msg ); + msg->CommitL(); + + if ( i == aCount - 1 ) + { + TTime endTime; + endTime.HomeTime(); + // iLog->Log( _L(" PERFORMANCE: add messages #%d took %d ms"), aCount, (TInt) (endTime.MicroSecondsFrom( startTime ).Int64() / 1000) ); + } + +#if 0 + if ( aLog ) + { + iLog->Log( _L(" msgId=%x, flags=%x, size=%d"), msg->Id(), flags, size); + iLog->Log( _L(" subject=%S"), &realSubject ); + } + else if ( i % 10 == 9 ) + { + iLog->Log( _L(" count=%d, msgId=%x"), i+1, msg->Id() ); + } +#endif + + if ( aKeepIds ) + { + iMatches.Append( msg->Id() ); + } + + CleanupStack::PopAndDestroy( msg ); + } + + CleanupStack::PopAndDestroy( 3 ); + + iLog->Log( _L(" << CreateRandomMessagesL") ); + } + +void CAsyncTestCaseBase::CreateFileL( const TDesC& aName, TUint aTotalLength, TChar aFillChar, const TDesC& aString, TUint aOffset ) + { + RFs fs; + User::LeaveIfError( fs.Connect() ); + RFile file; + User::LeaveIfError( file.Replace( fs, aName, EFileWrite ) ); + + TUint currentLength = 0; + + TBuf<1000> buf; + + const TUint8* buf8Ptr = reinterpret_cast<const TUint8*>( buf.Ptr() ); + TPtrC8 buf8( buf8Ptr, 2000 ); + + buf.Fill( aFillChar, 1000 ); + while( currentLength < aOffset ) + { + TUint amountToWrite = aOffset - currentLength; + if( amountToWrite > 1000 ) + { + amountToWrite = 1000; + } + + file.Write( buf8, amountToWrite*2 ); + + currentLength += amountToWrite; + } + + buf.Copy( aString ); + file.Write( buf8, aString.Length() * 2 ); + currentLength += aString.Length(); + + buf.Fill( aFillChar, 1000 ); + while( currentLength < aTotalLength ) + { + TUint amountToWrite = aTotalLength - currentLength; + if( amountToWrite > 1000 ) + { + amountToWrite = 1000; + } + + file.Write( buf8, amountToWrite*2 ); + + currentLength += amountToWrite; + } + + file.Close(); + fs.Close(); + } + + +void CAsyncTestCaseBase::CreateRandomString( TDes& aString, TInt aLength, TInt64& aSeed ) + { + aString.SetLength(0); + for ( TInt i = 0 ; i < aLength; i++ ) + { + TUint val = static_cast<TUint>(Math::Rand( aSeed )); + val = ( val % 52 ); + if ( val <= 25 ) + { + val += 65; + } + else + { + val += ( 97 - 26 ); + } + aString.Append( TChar(val) ); + } + } + +void CAsyncTestCaseBase::SetMessageContentL( CMsgStoreMessage* aMessage, const TDesC8& aContent ) + { + CMsgStorePropertyContainer* props = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( props ); + + CMsgStoreMessagePart* body = aMessage->AddChildPartL( *props ); + CleanupStack::PushL( body ); + + CMsgStoreMessagePart* plainTextbody = body->AddChildPartL( *props ); + CleanupStack::PushL( plainTextbody ); + + plainTextbody->ReplaceContentL( aContent ); + + CleanupStack::PopAndDestroy( plainTextbody ); + CleanupStack::PopAndDestroy( body ); + CleanupStack::PopAndDestroy( props ); + } + +void CAsyncTestCaseBase::WaitForServerToTerminate() + { + TBool done = EFalse; + + RDebugSession temp; + + while( !done ) + { + TInt err = temp.Connect(); + + if (err == KErrNone ) + { + temp.Close(); + + // Still running. Wait. + Yield( 1000000 ); + } + else + { + done = ETrue; + } + + } // end if + + temp.Close(); + } +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/ContentTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,375 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + +#include <BAUTILS.H> +#include "ContentTests.h" +//#include <ismsgstorepropertykeys.h> +#include "messagestoreclientserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + +CContentTests* CContentTests::NewL( CStifLogger* aLog ) + { + CContentTests* self = new(ELeave) CContentTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CContentTests::CContentTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CContentTests::~CContentTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CContentTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CContentTests::ExecuteL() + { + LogHeader( _L("Content") ); + + // Create messages for later use. + CMsgStoreAccount* account = CMsgStoreAccount::NewLC(1234, _L("new account") ); //+1 + CMsgStoreMailBox* mailBox1 = iMsgStore->CreateAccountL( *account ); + CleanupStack::PushL( mailBox1 ); //+2 + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( properties ); //+3 + + TMsgStoreId inbox1Id = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + CMsgStoreFolder* inbox1 = mailBox1->FolderL( inbox1Id ); + CleanupStack::PushL( inbox1 ); //+4 + + CMsgStoreMessage* message1 = mailBox1->CreateMessageL( inbox1Id, *properties ); + CleanupStack::PushL( message1 ); //+5 + message1->CommitL(); + + CMsgStoreMessage* message2 = mailBox1->CreateMessageL( inbox1Id, *properties ); + CleanupStack::PushL( message2 ); //+6 + message2->CommitL(); + + CMsgStoreMessage* message3 = mailBox1->CreateMessageL( inbox1Id, *properties ); + CleanupStack::PushL( message3 ); //+7 + message3->CommitL(); + + // BUFFER-ORIENTED TESTS + + RBuf8 expectedContent; + RBuf8 contentBuf; + expectedContent.CreateL( 1000 ); + contentBuf.CreateL( 1000 ); + + iLog->Log( _L("Case %d: Fetch content to buffer before content added"), iCaseId++ ); + + message1->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("no content"), (contentBuf.Length() == 0) && (message1->ContentLengthL() == 0) ); + + iLog->Log( _L("Case %d: ReplaceContentL"), iCaseId++ ); + + _LIT8( KContent1, "THIS IS SOME CONTENT" ); + message1->ReplaceContentL( KContent1 ); + CheckCondition( _L("ContentLength matches"), message1->ContentLengthL() == KContent1().Length() ); + + iLog->Log( _L("Case %d: FetchContentToBufferL"), iCaseId++ ); + + message1->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("content matches"), contentBuf.Compare( KContent1 ) == 0 ); + + iLog->Log( _L("Case %d: Fetch content with start offset"), iCaseId++ ); + + message1->FetchContentToBufferL( contentBuf, 4 ); + CheckCondition( _L("content matches"), contentBuf.Compare( KContent1().Mid( 4 ) ) == 0 ); + + iLog->Log( _L("Case %d: Append to content"), iCaseId++ ); + + _LIT8( KContent2, "MORE CONTENT" ); + message1->AppendToContentL( KContent2 ); + TInt contentLength = message1->ContentLengthL(); + TInt expectedLength = KContent1().Length() + KContent2().Length(); + CheckCondition( _L("ContentLength matches"), contentLength == expectedLength ); + + iLog->Log( _L("Case %d: Append null buffer to content"), iCaseId++ ); + + _LIT8( KNullBuffer, "" ); + message1->AppendToContentL( KNullBuffer ); + contentLength = message1->ContentLengthL(); + CheckCondition( _L("ContentLength matches"), contentLength == expectedLength ); + + iLog->Log( _L("Case %d: Append null buffer to content"), iCaseId++ ); + + expectedContent.Copy( KContent1 ); + expectedContent.Append( KContent2 ); + message1->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("content matches"), contentBuf.Compare( expectedContent ) == 0 ); + + iLog->Log( _L("Case %d: Long content"), iCaseId++ ); + + expectedContent.Fill( 'C', 998 ); + expectedContent.Insert( 0, _L8("A") ); + expectedContent.Append( _L8("B") ); + message1->ReplaceContentL( expectedContent ); + message1->FetchContentToBufferL( contentBuf ); + contentLength = message1->ContentLengthL(); + expectedLength = expectedContent.Length(); + TBool passed = (contentLength == expectedLength && contentBuf.Compare( expectedContent ) == 0); + //if( !passed ) + // { + // __LOG_HEX_DUMP_ERROR( "expected", expectedContent ) + // __LOG_HEX_DUMP_ERROR( "actual", contentBuf ) + // } + CheckCondition( _L("content matches"), passed ); + + iLog->Log( _L("Case %d: Open the original content file"), iCaseId++ ); + RFile testFile; + TRAPD(err, message1->OpenOriginalContentFileL( testFile ) ); + + //try to read from the file + CheckCondition( _L("OpenOriginalContentFileL succeeded"), err == KErrNone ); + + testFile.Read( contentBuf ); + CheckCondition( _L("Content in original file"), contentBuf.Compare( expectedContent ) == 0 ); + + iLog->Log( _L("Case %d: Fetch while client has original file open"), iCaseId++ ); + + message1->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("Fetch while client has original file open"), contentBuf.Compare( expectedContent ) == 0 ); + + iLog->Log( _L("Case %d: ContentLength while client has original file open"), iCaseId++ ); + + contentLength = message1->ContentLengthL(); + CheckCondition( _L("ContentLength while client has original file open"), contentLength == expectedLength ); + + iLog->Log( _L("Case %d: ReplaceContent while client has original file open"), iCaseId++ ); + + message1->ReplaceContentL( KContent1 ); + message1->FetchContentToBufferL( contentBuf ); + expectedContent.Copy( KContent1 ); + CheckCondition( _L("ReplaceContent while client has original file open"), contentLength == expectedLength ); + + iLog->Log( _L("Case %d: Can't Remove Content while client has original file open"), iCaseId++ ); + + TRAP( err, message1->RemoveContentL() ); + CheckCondition( _L("can't RemoveContentL"), err == KErrInUse ); + + iLog->Log( _L("Case %d: Delete message while client has original file open"), iCaseId++ ); + //delete message while content file is locked + mailBox1->DeleteMessageL( message1->Id(), inbox1Id ); + + iLog->Log( _L(" Wait 3 seconds for server delete handler to complete") ); + Yield(3000000); + + iLog->Log( _L(" Create a dummy message") ); + CMsgStoreMessage* message4 = mailBox1->CreateMessageL( inbox1Id, *properties ); + CleanupStack::PushL( message4 ); //+8 + message4->CommitL(); + + testFile.Close(); + iLog->Log( _L(" Client closed content file") ); + iLog->Log( _L(" delete dummy message after the file is closed, to trigger the delete handle") ); + + mailBox1->DeleteMessageL( message4->Id(), inbox1Id ); + + iLog->Log( _L(" Wait 3 secs for server delete handler to complete") ); + Yield(3000000); + + CMsgStoreMessage* message5 = mailBox1->CreateMessageL( inbox1Id, *properties ); + CleanupStack::PushL( message5 ); //+9 + message5->CommitL(); + + iLog->Log( _L(" Make sure other messages are not affected") ); + + message2->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("no content"), (contentBuf.Length() == 0) && (message2->ContentLengthL() == 0) ); + + message3->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("no content"), (contentBuf.Length() == 0) && (message3->ContentLengthL() == 0) ); + + // FILE-ORIENTED TESTS + + iLog->Log( _L("Case %d: FetchContentToFileL"), iCaseId++ ); + _LIT( KFilename, "c:\\content_test.txt" ); + + expectedContent.Fill( 'C', 998 ); + expectedContent.Insert( 0, _L8("A") ); + expectedContent.Append( _L8("B") ); + message5->ReplaceContentL( expectedContent ); + + message5->FetchContentToFileL( KFilename ); + + iLog->Log( _L("Case %d: ReplaceContentWithFileL"), iCaseId++ ); + + message2->ReplaceContentWithFileL( KFilename ); + + contentBuf.SetLength(0); + message2->FetchContentToBufferL( contentBuf ); + + CheckCondition( _L("content matches"), contentBuf.Compare( expectedContent ) == 0 ); + + // REMOVE CONTENT + + iLog->Log( _L("Case %d: Remove content"), iCaseId++ ); + + message5->RemoveContentL(); + message5->FetchContentToBufferL( contentBuf ); + + TInt length1 = contentBuf.Length(); + TInt length2 = message5->ContentLengthL(); + CheckCondition( _L("no content"), length1 == 0 && length2 == 0 ); + + iLog->Log( _L("case %d: Fetch content to file with no content"), iCaseId++ ); + + RFs fs; + User::LeaveIfError( fs.Connect() ); + + message5->FetchContentToFileL( KFilename ); + RFile file; + User::LeaveIfError( file.Open( fs, KFilename, EFileRead ) ); + TInt size; + User::LeaveIfError( file.Size( size ) ); + file.Close(); + CheckCondition( _L("file size = 0"), size == 0 ); + + // TESTS WITH VARIOUS CONTENT SIZES, TO DETECT FENCEPOST ERRORS + + iLog->Log( _L("Case %d: FENCEPOST ERRORS Detection"), iCaseId++ ); + + // THESE SHOULD EXACTLY MATCH THE VALUES INSIDE ContainerStoreContentManager.cpp + const TUint KBlockSize = 64; + const TUint KBufferSize = 4096; + + // THESE MUST BE IN INCREASING ORDER. + const TInt KSizesToTest[] = + { + 0, + 1, + KBlockSize-1, + KBlockSize, + KBlockSize+1, + KBufferSize-1, + KBufferSize, + KBufferSize+1, + 2*KBufferSize-1, + 2*KBufferSize, + 2*KBufferSize+1, + 5*KBufferSize-1, + 5*KBufferSize, + 5*KBufferSize+1, + -1 + }; + + expectedContent.ReAllocL( 7*KBufferSize ); + expectedContent.SetLength( 0 ); + + contentBuf.ReAllocL( 7*KBufferSize ); + contentBuf.SetLength( 0 ); + + TBuf8<KBufferSize+1> appendBuffer; + + TInt index = 0; + while( KSizesToTest[index] != -1 ) + { + TInt growSizeBy = KSizesToTest[index] - expectedContent.Length(); + expectedContent.SetLength( KSizesToTest[index] ); + expectedContent.RightTPtr( growSizeBy ).Fill( 'A' + index ); + + contentBuf.SetLength( 0 ); + message5->ReplaceContentL( expectedContent ); + message5->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("content matches"), message5->ContentLengthL() == expectedContent.Length() && contentBuf.Compare( expectedContent ) == 0 ); + + contentBuf.SetLength( 0 ); + BaflUtils::DeleteFile( fs, KFilename ); + message5->FetchContentToFileL( KFilename ); + message2->ReplaceContentWithFileL( KFilename ); + message2->FetchContentToBufferL( contentBuf ); + contentLength = message2->ContentLengthL(); + expectedLength = expectedContent.Length(); + CheckCondition( _L("content matches"), contentLength == expectedLength && contentBuf.Compare( expectedContent ) == 0 ); + + message3->ReplaceContentWithFileL( KFilename ); + + appendBuffer.Fill( 'w', 1 ); + expectedContent.Append( appendBuffer ); + message5->AppendToContentL( appendBuffer ); + message5->FetchContentToBufferL( contentBuf ); + contentLength = message5->ContentLengthL(); + expectedLength = expectedContent.Length(); + CheckCondition( _L("content matches"), contentLength == expectedLength && contentBuf.Compare( expectedContent ) == 0 ); + + appendBuffer.Fill( 'x', KBlockSize-1 ); + expectedContent.SetLength( KSizesToTest[index] ); + expectedContent.Append( appendBuffer ); + message2->AppendToContentL( appendBuffer ); + message2->FetchContentToBufferL( contentBuf ); + contentLength = message2->ContentLengthL(); + expectedLength = expectedContent.Length(); + CheckCondition( _L("content matches"), contentLength == expectedLength && contentBuf.Compare( expectedContent ) == 0 ); + + appendBuffer.Fill( 'y', KBlockSize ); + expectedContent.SetLength( KSizesToTest[index] ); + expectedContent.Append( appendBuffer ); + message3->AppendToContentL( appendBuffer ); + message3->FetchContentToBufferL( contentBuf ); + contentLength = message3->ContentLengthL(); + expectedLength = expectedContent.Length(); + CheckCondition( _L("content matches"), contentLength == expectedLength && contentBuf.Compare( expectedContent ) == 0 ); + + appendBuffer.Fill( 'z', KBufferSize+1 ); + expectedContent.Append( appendBuffer ); + message3->AppendToContentL( appendBuffer ); + message3->FetchContentToBufferL( contentBuf ); + contentLength = message3->ContentLengthL(); + expectedLength = expectedContent.Length(); + CheckCondition( _L("content matches"), contentLength == expectedLength && contentBuf.Compare( expectedContent ) == 0 ); + + expectedContent.SetLength( KSizesToTest[index] ); + + index++; + } // end for + + expectedContent.Close(); + contentBuf.Close(); + + fs.Close(); + + CleanupStack::PopAndDestroy( 9 ); + + //we are done + return ETrue; + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/DbCorruptTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,265 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + +#include <BAUTILS.H> +#include <S32FILE.H> +#include <D32DBMS.H> +#include "DbCorruptTests.h" +#include <EmailStoreUids.hrh> + +//these must match those defined in ContainerStoreDefs. +_LIT( KDbFilename, "message_store.db" ); +_LIT( KGeneralTableName, "G001" ); +_LIT( KGeneralTableDbSchemaVersionCol, "G002" ); + +// ============================ MEMBER FUNCTIONS =============================== + +CDbCorruptTests* CDbCorruptTests::NewL( CStifLogger* aLog ) + { + CDbCorruptTests* self = new(ELeave) CDbCorruptTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CDbCorruptTests::CDbCorruptTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CDbCorruptTests::~CDbCorruptTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CDbCorruptTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CDbCorruptTests::ExecuteL() + { + LogHeader( _L("Database Corruption") ); + + RFs fs; + RFile file; + CPermanentFileStore* fileStore; + CMsgStorePropertyContainer* properties; + RDbStoreDatabase database; + RDbTable table; + CDbColSet* colSet; + TUint unreadCount; + TUint totalCount; + TInt result; + TFileName dbFileName; + + User::LeaveIfError( fs.Connect() ); + + properties = CMsgStorePropertyContainer::NewL(); + + iLog->Log( _L("Case %d: Database file exists but is empty"), iCaseId++ ); + + iLog->Log( _L(" Shutdown the server") ); + //shutdown the server + ShutdownServerL(); + + // The file cannot be opened until the server has shut down, so keep trying until it is possible. + result = KErrInUse; + while( result == KErrInUse ) + { + Yield( 100000 ); + dbFileName.Format( _L("C:\\private\\%x\\%S"), KUidMessageStoreExe, &KDbFilename ); + result = file.Replace( fs, dbFileName, EFileWrite ); + } + + file.Close(); + + CMsgStore* session = CMsgStore::NewL( ETrue ); + CleanupStack::PushL( session ); //+1 + + iLog->Log( _L("Case %d: Create Mailbox"), iCaseId++ ); + CMsgStoreAccount* account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC ); //+2 + CMsgStoreMailBox* mailbox1 = session->CreateAccountL( *account1 ); + CleanupStack::PushL( mailbox1 ); //+3 + + iLog->Log( _L("Case %d: Message counts are 0"), iCaseId++ ); + mailbox1->TotalMessageCountsL( totalCount, unreadCount ); + CheckCondition( _L("no crash, counts are zero"), totalCount == 0 && unreadCount == 0 ); + + iLog->Log( _L("Case %d: Create Folder"), iCaseId++ ); + TMsgStoreId inbox1Id = mailbox1->CreateFolderL( mailbox1->Id(), *properties ); + CMsgStoreFolder* inbox1 = mailbox1->FolderL( inbox1Id ); + CleanupStack::PushL( inbox1 ); //+4 + + iLog->Log( _L("Case %d: Create Message"), iCaseId++ ); + CMsgStoreMessage* msg = mailbox1->CreateMessageL( inbox1Id, *properties ); + delete msg; + + CleanupStack::PopAndDestroy(4); + + //shutdown the server again + iLog->Log( _L(" Shutdown the server again") ); + ShutdownServerL(); + + iLog->Log( _L("Case %d: Database file exists but contains bad content"), iCaseId++ ); + result = KErrInUse; + while( result == KErrInUse ) + { + Yield( 100000 ); + result = file.Replace( fs, dbFileName, EFileWrite ); + } + + file.Write( _L8("RANDOM CONTENT") ); + file.Close(); + + session = CMsgStore::NewL( ETrue ); + CleanupStack::PushL( session ); //+1 + + iLog->Log( _L("Case %d: Create Mailbox"), iCaseId++ ); + account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC ); //+2 + mailbox1 = session->CreateAccountL( *account1 ); + CleanupStack::PushL( mailbox1 ); //+3 + + iLog->Log( _L("Case %d: Message counts are 0"), iCaseId++ ); + mailbox1->TotalMessageCountsL( totalCount, unreadCount ); + CheckCondition( _L("no crash, counts are zero"), totalCount == 0 && unreadCount == 0 ); + + iLog->Log( _L("Case %d: Create Folder"), iCaseId++ ); + inbox1Id = mailbox1->CreateFolderL( mailbox1->Id(), *properties ); + inbox1 = mailbox1->FolderL( inbox1Id ); + CleanupStack::PushL( inbox1 ); //+4 + + iLog->Log( _L("Case %d: Create Message"), iCaseId++ ); + msg = mailbox1->CreateMessageL( inbox1Id, *properties ); + + delete msg; + CleanupStack::PopAndDestroy(4); + + //shutdown the server again + iLog->Log( _L(" Shutdown the server again") ); + ShutdownServerL(); + + iLog->Log( _L("Case %d: Database file exists and contains an empty database"), iCaseId++ ); + + result = KErrInUse; + while( result == KErrInUse ) + { + Yield( 100000 ); + TRAP( result, fileStore = CPermanentFileStore::ReplaceL( fs, dbFileName, EFileRead|EFileWrite ) ); + } + + fileStore->SetTypeL( fileStore->Layout() ); + TStreamId id = database.CreateL( fileStore ); + fileStore->SetRootL( id ); + fileStore->CommitL(); + database.Close(); + delete fileStore; + + session = CMsgStore::NewL( ETrue ); + CleanupStack::PushL( session ); //+1 + + iLog->Log( _L("Case %d: Create Mailbox"), iCaseId++ ); + + account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC ); //+2 + mailbox1 = session->CreateAccountL( *account1 ); + CleanupStack::PushL( mailbox1 ); //+3 + + iLog->Log( _L("Case %d: Message counts are 0"), iCaseId++ ); + mailbox1->TotalMessageCountsL( totalCount, unreadCount ); + CheckCondition( _L("no crash, counts are zero"), totalCount == 0 && unreadCount == 0 ); + + iLog->Log( _L("Case %d: Create Folder"), iCaseId++ ); + inbox1Id = mailbox1->CreateFolderL( mailbox1->Id(), *properties ); + inbox1 = mailbox1->FolderL( inbox1Id ); + CleanupStack::PushL( inbox1 ); //+4 + + iLog->Log( _L("Case %d: Create Message"), iCaseId++ ); + msg = mailbox1->CreateMessageL( inbox1Id, *properties ); + delete msg; + + CleanupStack::PopAndDestroy(4); + + //shutdown the server again + iLog->Log( _L(" Shutdown the server again") ); + ShutdownServerL(); + + iLog->Log( _L("Case %d: Database schema mismatch"), iCaseId++ ); + + result = KErrInUse; + while( result == KErrInUse ) + { + Yield( 100000 ); + TRAP( result, fileStore = CPermanentFileStore::OpenL( fs, dbFileName, EFileRead|EFileWrite ) ); + } + + database.OpenL( fileStore, fileStore->Root() ); + User::LeaveIfError( table.Open( database, KGeneralTableName ) ); + colSet = table.ColSetL(); + TUint schemaVersionColNum = colSet->ColNo( KGeneralTableDbSchemaVersionCol ); + delete colSet; + table.FirstL(); + table.UpdateL(); + table.SetColL( schemaVersionColNum, 0 ); + table.PutL(); + table.Close(); + database.Close(); + delete fileStore; + + session = CMsgStore::NewL( ETrue ); + CleanupStack::PushL( session ); //+1 + + iLog->Log( _L("Case %d: Create Mailbox"), iCaseId++ ); + account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC ); //+2 + mailbox1 = session->CreateAccountL( *account1 ); + CleanupStack::PushL( mailbox1 ); //+3 + + iLog->Log( _L("Case %d: Message counts are 0"), iCaseId++ ); + mailbox1->TotalMessageCountsL( totalCount, unreadCount ); + CheckCondition( _L("no crash, counts are zero"), totalCount == 0 && unreadCount == 0 ); + + iLog->Log( _L("Case %d: Create Folder"), iCaseId++ ); + inbox1Id = mailbox1->CreateFolderL( mailbox1->Id(), *properties ); + inbox1 = mailbox1->FolderL( inbox1Id ); + CleanupStack::PushL( inbox1 ); //+4 + + iLog->Log( _L("Case %d: Create Message"), iCaseId++ ); + msg = mailbox1->CreateMessageL( inbox1Id, *properties ); + + delete msg; + CleanupStack::PopAndDestroy(4); + + delete properties; + fs.Close(); + + //we are done + return ETrue; + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/EncryptionTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,421 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + +//#include <BAUTILS.H> +#include "EncryptionTests.h" +//#include <ismsgstorepropertykeys.h> +//#include "messagestoreclientserver.h" + +// This must match that's defined in ContainerStoreDefs.h +enum TEncryptionState +{ + EMsgStoreESIdle, + EMsgStoreESEncrypting, + EMsgStoreESDecrypting +}; // end TEncryptionState + +// ============================ MEMBER FUNCTIONS =============================== + +CEncryptionTests* CEncryptionTests::NewL( CStifLogger* aLog ) + { + CEncryptionTests* self = new(ELeave) CEncryptionTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CEncryptionTests::CEncryptionTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CEncryptionTests::~CEncryptionTests() + { + iTestContentArray.Reset(); + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CEncryptionTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + iTestContentArray.AppendL( _L8("This is the first test content!") ); + iTestContentArray.AppendL( _L8("This is the second test content!") ); + iTestContentArray.AppendL( _L8("This is the first test content!") ); + iTestContentArray.AppendL( _L8("What-ever!!!!") ); + iTestContentArray.AppendL( _L8("ok fine!!!") ); + iTestContentArray.AppendL( _L8("Here is a long content (>300 bytes). Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content.") ); + iTestContentArray.AppendL( _L8("Is that long enough") ); + iTestContentArray.AppendL( _L8("aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffff") ); + iTestContentArray.AppendL( _L8("Here is a >300 unicode characters (> 600 bytes). Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content. Here is a long content.") ); + iTestContentArray.AppendL( _L8("Hi") ); + iTestContentArray.AppendL( _L8("") ); + iTestContentArray.AppendL( _L8("This is another test content") ); + iTestContentArray.AppendL( _L8("How many more?") ); + iTestContentArray.AppendL( _L8("Six more contents to go") ); + iTestContentArray.AppendL( _L8("Five more contents to go") ); + iTestContentArray.AppendL( _L8(" ") ); + iTestContentArray.AppendL( _L8("Three more...") ); + iTestContentArray.AppendL( _L8("Two more...") ); + iTestContentArray.AppendL( _L8("One more...") ); + iTestContentArray.AppendL( _L8("Last one! We are done") ); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CEncryptionTests::ExecuteL() + { + LogHeader( _L("Encryption") ); + + iLog->Log( _L("Case %d: Testing SetPasswordL()"), iCaseId++ ); + iMsgStore->SetPasswordL( _L("mypassword") ); + + iLog->Log( _L("Case %d: Testing AuthenticatedL()"), iCaseId++ ); + CheckCondition( _L("AuthenticatedL() is TRUE"), iMsgStore->AuthenticatedL() ); + + iLog->Log( _L("Case %d: Testing HasPasswordL()"), iCaseId++ ); + CheckCondition( _L("HasPasswordL() is TRUE"), iMsgStore->HasPasswordL() ); + + iLog->Log( _L("Case %d: Create Mailboxes"), iCaseId++ ); + RPointerArray<CMsgStoreAccount> accountArray; + CMsgStoreAccount* account1 = CMsgStoreAccount::NewL(1234, _L("Account 1") ); + accountArray.Append( account1 ); + + CMsgStoreAccount* account2 = CMsgStoreAccount::NewL(1234, _L("") ); + accountArray.Append( account2 ); + + CMsgStoreAccount* account3 = CMsgStoreAccount::NewL(5678, _L("Account 3") ); + accountArray.Append( account3 ); + + CMsgStoreMailBox* mailBox1 = iMsgStore->CreateAccountL( *account1 ); + CleanupStack::PushL( mailBox1 ); //+1 + + CMsgStoreMailBox* mailBox2 = iMsgStore->CreateAccountL( *account2 ); + CleanupStack::PushL( mailBox2 ); //+2 + + CMsgStoreMailBox* mailBox3 = iMsgStore->CreateAccountL( *account3 ); + CleanupStack::PushL( mailBox3 ); //+3 + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( properties ); //+4 + + properties->AddPropertyL( _L8("1"), _L("PROPERTY 1") ); + properties->AddPropertyL( _L8("2"), 12345 ); + properties->AddPropertyL( _L8("3"), _L8("ANOTHER PROPERTY") ); + + iLog->Log( _L("Case %d: Create Folders"), iCaseId++ ); + + TMsgStoreId inbox1Id = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + TMsgStoreId sentFolderId = mailBox2->CreateFolderL( mailBox2->Id(), *properties ); + TMsgStoreId deletedFolderId = mailBox3->CreateFolderL( mailBox3->Id(), *properties ); + + iLog->Log( _L(" inbox=%x, sent=%x, deleted=%x"), inbox1Id, sentFolderId, deletedFolderId ); + + TInt msgCountPerFolder = 20; + + iLog->Log( _L("Case %d: Create messages in Inbox"), iCaseId++ ); + //keep ids, message ids will be stored in iMatches + CreateRandomMessagesL( mailBox1, inbox1Id, msgCountPerFolder, ETrue ); + + iLog->Log( _L("Case %d: Create messages in Sent folder"), iCaseId++ ); + CreateRandomMessagesL( mailBox2, sentFolderId, msgCountPerFolder ); + + iLog->Log( _L("Case %d: Create messages in Deleted folder"), iCaseId++ ); + CreateRandomMessagesL( mailBox3, deletedFolderId, msgCountPerFolder ); + + iLog->Log( _L("Case %d: Set msg contents and store them for comparison"), iCaseId++ ); + for ( TInt i = 0 ; i < iMatches.Count() ; i++ ) + { + CMsgStoreMessage* msg = mailBox1->FetchMessageL( iMatches[i], inbox1Id ); + SetMessageContentL( msg, iTestContentArray[i] ); + iMessages.Append( msg ); + } + + iLog->Log( _L("Case %d: Store Msg Ids Sorted by Subject and Sender for comparison"), iCaseId++ ); + RArray<TMsgStoreId> idsSortdBySubject; + GetSortedIdsL( mailBox2, sentFolderId, EMsgStoreSortBySubject, msgCountPerFolder, idsSortdBySubject ); + + RArray<TMsgStoreId> idsSortdByFrom; + GetSortedIdsL( mailBox3, deletedFolderId, EMsgStoreSortBySender, msgCountPerFolder, idsSortdByFrom ); + + iLog->Log( _L("Case %d: Start Encryption"), iCaseId++ ); + iMsgStore->EnableEncryptionL(); + + iLog->Log( _L(" Wait until Encryption completes") ); + WaitUntilEncryptDecryptCompleteL( EMsgStoreESEncrypting, mailBox1 ); + + iLog->Log( _L(" Encryption completed") ); + + iLog->Log( _L("Case %d: Comparing messages"), iCaseId++ ); + CompareMessagesL( mailBox1 ); + + iLog->Log( _L("Case %d: Comparing Accounts"), iCaseId++ ); + CompareAccountsL( iMsgStore, accountArray ); + + iLog->Log( _L("Case %d: Comparing msg IDs sorted by Subject"), iCaseId++ ); + RArray<TMsgStoreId> aSortedIds; + GetSortedIdsL( mailBox2, sentFolderId, EMsgStoreSortBySubject, msgCountPerFolder, aSortedIds ); + CompareSortedIdArraysL( aSortedIds, idsSortdBySubject ); + aSortedIds.Reset(); + + iLog->Log( _L("Case %d: Comparing msg IDs sorted by Sender"), iCaseId++ ); + GetSortedIdsL( mailBox3, deletedFolderId, EMsgStoreSortBySender, msgCountPerFolder, aSortedIds ); + CompareSortedIdArraysL( aSortedIds, idsSortdByFrom ); + aSortedIds.Reset(); + + iLog->Log( _L("Case %d: Start Decryption"), iCaseId++ ); + + iMsgStore->DisableEncryptionL(); + + iLog->Log( _L(" Wait until Decryption completes") ); + + WaitUntilEncryptDecryptCompleteL( EMsgStoreESDecrypting, mailBox1 ); + + iLog->Log( _L(" Decryption completed") ); + + iLog->Log( _L("Case %d: Comparing messages"), iCaseId++ ); + CompareMessagesL( mailBox1 ); + + iLog->Log( _L("Case %d: Comparing Accounts"), iCaseId++ ); + CompareAccountsL( iMsgStore, accountArray ); + + iLog->Log( _L("Case %d: Comparing msg IDs sorted by Subject"), iCaseId++ ); + GetSortedIdsL( mailBox2, sentFolderId, EMsgStoreSortBySubject, msgCountPerFolder, aSortedIds ); + CompareSortedIdArraysL( aSortedIds, idsSortdBySubject ); + aSortedIds.Reset(); + + iLog->Log( _L("Case %d: Comparing msg IDs sorted by Sender"), iCaseId++ ); + GetSortedIdsL( mailBox3, deletedFolderId, EMsgStoreSortBySender, msgCountPerFolder, aSortedIds ); + CompareSortedIdArraysL( aSortedIds, idsSortdByFrom ); + aSortedIds.Reset(); + + idsSortdBySubject.Close(); + idsSortdByFrom.Close(); + accountArray.ResetAndDestroy(); + iMatches.Reset(); + iMessages.ResetAndDestroy(); + + CleanupStack::PopAndDestroy( 4 ); + + //test authentication + iLog->Log( _L("Case %d: Test AuthenticateL"), iCaseId++ ); + TRAPD(err, iMsgStore->AuthenticateL( _L("mypassword")) ); + CheckCondition( _L("AuthenticateL successful"), err == KErrNone ); + + iLog->Log( _L("Case %d: Test ChangePasswordL"), iCaseId++ ); + TRAP(err, iMsgStore->ChangePasswordL( _L("mypassword"), _L("newpassword") ) ); + CheckCondition( _L("ChangePasswordL successful"), err == KErrNone ); + + iLog->Log( _L("Case %d: Test ClearAuthenticationL"), iCaseId++ ); + TRAP(err, iMsgStore->ClearAuthenticationL() ); + CheckCondition( _L("ClearAuthenticationL successful"), err == KErrNone ); + + //we are done + return ETrue; + } + + +void CEncryptionTests::WaitUntilEncryptDecryptCompleteL( TInt aCurrentState, CMsgStoreMailBox* aMailBox ) + { + RDebugSession debugSession; + User::LeaveIfError( debugSession.Connect() ); + + TInt encryptionState = aCurrentState; + TInt loopCount = 0; + TMsgStoreId folderId; + while( encryptionState != EMsgStoreESIdle && loopCount < 4000 ) + { + Yield( 20000 ); + loopCount++; + if ( loopCount % 20 == 0 ) + { + encryptionState = debugSession.GetEncryptionStateL(); + } + + if ( loopCount == 2 && encryptionState == aCurrentState ) + { + iLog->Log( _L("Case %d: Testing fetch msgs while encryption/decription is in progress"), iCaseId++ ); + CompareMessagesL( aMailBox ); + } + + if ( loopCount == 5 && encryptionState == aCurrentState ) + { + iLog->Log( _L("Case %d: Testing create msgs while encryption/decription is in progress"), iCaseId++ ); + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + folderId = aMailBox->CreateFolderL( aMailBox->Id(), *properties); + delete properties; + CreateRandomMessagesL(aMailBox, folderId, 5); + } + + if ( loopCount == 8 && encryptionState == aCurrentState ) + { + iLog->Log( _L("Case %d: Testing delete folder while encryption/decription is in progress"), iCaseId++ ); + aMailBox->DeleteFolderL(folderId); + } + + if ( encryptionState != aCurrentState && encryptionState != EMsgStoreESIdle ) + { + break; + } + } + + debugSession.Close(); + if ( encryptionState != EMsgStoreESIdle ) + { + iLog->Log( _L(" Encryption did NOT complete") ); + User::Leave( KErrCancel ); + } + } + +void CEncryptionTests::CompareMessagesL( CMsgStoreMailBox* aMailBox ) + { + iLog->Log( _L(" >> CompareMessagesL") ); + + RBuf8 contentBuf; + contentBuf.Create( 1024 ); + contentBuf.CleanupClosePushL(); + + for( TInt i = 0 ; i < iMessages.Count() ; i++ ) + { + CMsgStoreMessage* msg = aMailBox->FetchMessageL( iMessages[i]->Id(), KMsgStoreInvalidId ); + CleanupStack::PushL( msg ); //+1 + + ComparePropertiesL( *msg, *(iMessages[i]) ); + + iLog->Log( _L(" Comparing contents...") ); + + RPointerArray<CMsgStoreMessagePart> parts; + msg->ChildPartsL( parts ); + CMsgStoreMessagePart* part =parts[0]; + + RPointerArray<CMsgStoreMessagePart> childParts; + part->ChildPartsL( childParts ); + CMsgStoreMessagePart* plain_text_part = childParts[0]; + + plain_text_part->FetchContentToBufferL( contentBuf ); + if ( contentBuf == iTestContentArray[i] ) + { + iLog->Log( _L(" Contents match!") ); + } + else + { + iLog->Log( _L(" Error: Contents don't match! index=%d"), i ); + User::Leave( KErrNotFound ); + } + + childParts.ResetAndDestroy(); + parts.ResetAndDestroy(); + CleanupStack::PopAndDestroy( msg ); + } + CleanupStack::PopAndDestroy( &contentBuf ); + + iLog->Log( _L(" << CompareMessagesL - PASSED") ); + } + +void CEncryptionTests::CompareAccountsL( CMsgStore* aSession, RPointerArray<CMsgStoreAccount>& aAccounts ) + { + iLog->Log( _L(" >> CompareAccountsL") ); + + RPointerArray<CMsgStoreAccount> accs; + aSession->AccountsL( accs ); + + CheckCondition( _L("Counts match"), accs.Count() == aAccounts.Count() ); + + for ( TInt i = 0 ; i < accs.Count() ; i++ ) + { + CMsgStoreAccount* acc = accs[i]; + TBool found = EFalse; + for (TInt j = 0 ; !found && j < aAccounts.Count() ; j++ ) + { + CMsgStoreAccount* acc2 = aAccounts[j]; + if ( acc->Owner() == acc2->Owner() && acc->Name() == acc2->Name() ) + { + found = ETrue; + } + } + if ( !found ) + { + iLog->Log( _L(" Account:%X %S not found!"), acc->Owner(), &( acc->Name() ) ); + User::Leave(KErrNotFound); + } + } + + accs.ResetAndDestroy(); + + iLog->Log( _L(" << CompareAccountsL - PASSED") ); + } + +void CEncryptionTests::GetSortedIdsL( CMsgStoreMailBox* aMailBox, TMsgStoreId aFolderId, TMsgStoreSortByField aSortedBy, TInt aCount, RArray<TMsgStoreId>& aSortedIds ) + { + iLog->Log( _L(" >> GetSortedIdsL") ); + + RMsgStoreSortCriteria criteria; + CleanupClosePushL( criteria ); + + criteria.iFolderId = aFolderId; + criteria.AddResultPropertyL( KMsgStorePropertyFrom ); + criteria.AddResultPropertyL( KMsgStorePropertySubject ); + criteria.iSortBy = aSortedBy; + criteria.iSortOrder = EMsgStoreSortDescending; + + CMsgStoreSortResultIterator* iterator = aMailBox->SortL( criteria ); + CleanupStack::PushL( iterator ); + + RPointerArray<CMsgStorePropertyContainer> results; + + iterator->NextL( KMsgStoreSortResultTop, aCount, results ); + for ( TInt i = 0 ; i < results.Count() ; i++ ) + { + TMsgStoreId msgId = results[i]->Id(); + aSortedIds.Append( msgId ); + } + + results.ResetAndDestroy(); + CleanupStack::PopAndDestroy( iterator ); + CleanupStack::PopAndDestroy( &criteria ); + + iLog->Log( _L(" << GetSortedIdsL") ); + } + +void CEncryptionTests::CompareSortedIdArraysL( RArray<TMsgStoreId>& aIDs1, RArray<TMsgStoreId>& aIDs2 ) + { + iLog->Log( _L(" >> CompareSortedIdArraysL") ); + + CheckCondition(_L("Counts match"), aIDs1.Count() == aIDs2.Count() ); + + for ( TInt i = 0 ; i < aIDs1.Count() ; i++ ) + { + if ( aIDs1[i] != aIDs2[i] ) + { + iLog->Log( _L(" Arrays don't match. Index=%d, val1=%u, val2=%u") , i, aIDs1[i], aIDs2[i] ); + User::Leave( KErrNotFound ); + } + } + + iLog->Log( _L(" << CompareSortedIdArraysL - PASSED") ); + } + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/FolderTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,322 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <tz.h> +#include "FolderTests.h" +//#include <ismsgstorepropertykeys.h> +#include "messagestoreclientserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + +CFolderTests* CFolderTests::NewL( CStifLogger* aLog ) + { + CFolderTests* self = new(ELeave) CFolderTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CFolderTests::CFolderTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CFolderTests::~CFolderTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CFolderTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CFolderTests::ExecuteL() + { + LogHeader( _L("Folder") ); + + //account 1 + CMsgStoreAccount* account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC ); //+1 + CMsgStoreMailBox* mailBox1 = iMsgStore->CreateAccountL( *account1 ); + CleanupStack::PushL( mailBox1 ); //+2 + + iLog->Log( _L("Case %d: Create Top-Level folders"), iCaseId++ ); + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( properties ); //+3 + + TestAddIntegerPropertyL( *properties, _L8("INTEGER PROPERTY"), 99999 ); + TestAddDes8PropertyL( *properties, _L8("STRING PROPERTY"), _L8("STRING VALUE") ); + + TMsgStoreId folder1Id = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + + CMsgStoreFolder* folder = mailBox1->FolderL( folder1Id ); + + ComparePropertiesL( *properties, *folder ); + CheckCondition( _L("parent folder ID"), folder->ParentId() == mailBox1->Id() ); + delete folder; + + iLog->Log( _L("Case %d: Create local sub-folder"), iCaseId++ ); + TMsgStoreId folder2Id = mailBox1->CreateFolderL( folder1Id, *properties, ETrue ); + + folder = mailBox1->FolderL( folder2Id ); + CheckCondition( _L("is local flag"), folder->IsLocalL() ); + + ComparePropertiesL( *properties, *folder ); + CheckCondition( _L("parent folder ID"), folder->ParentId() == folder1Id ); + delete folder; + + iLog->Log( _L("Case %d: Move folder"), iCaseId++ ); + TMsgStoreId folder3Id = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + mailBox1->MoveFolderL( folder3Id, mailBox1->Id(), folder2Id ); + + iLog->Log( _L("Case %d: Delete folder"), iCaseId++ ); + mailBox1->DeleteFolderL( folder3Id ); + + iLog->Log( _L("Case %d: Error - Open non-existing folder"), iCaseId++ ); + TRAPD( err, folder = mailBox1->FolderL( folder3Id ) ); //folder should be deleted + CheckCondition( _L("open non-existing folder - -1"), err == KErrNotFound ); + + iLog->Log( _L("Case %d: Get root folders"), iCaseId++ ); + //get the system folders + TMsgStoreRootFolders rootFolders; + MsgStoreFolderUtils::InitializeRootFoldersL( *mailBox1, rootFolders ); + + RPointerArray<CMsgStoreFolder> folders; + mailBox1->FoldersL( folders ); + + RArray<TMsgStoreId> expectedIds; + expectedIds.AppendL( folder1Id ); + expectedIds.AppendL( folder2Id ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreInbox] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreOutbox] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreDrafts] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreSent] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreDeleted] ); + + + VerifyFolderIdsL( folders, expectedIds ); + + for ( int i = 0 ; i < folders.Count() ; i++ ) + { + iLog->Log( _L(" folderId=%d, parentId=%d"), folders[i]->Id(), folders[i]->ParentId() ); + } + + folders.ResetAndDestroy(); + expectedIds.Reset(); + + + iLog->Log( _L("Case %d: Create more user defined folders, with messages in them"), iCaseId++ ); + folder3Id = mailBox1->CreateFolderL( folder1Id, *properties ); + + CMsgStoreMessage* message = mailBox1->CreateMessageL( folder2Id, *properties ); + TMsgStoreId messageId = message->Id(); + message->CommitL(); + delete message; + message = mailBox1->CreateMessageL( folder2Id, *properties ); + message->CommitL(); + delete message; + + TMsgStoreId folder4Id = mailBox1->CreateFolderL( folder2Id, *properties ); + + message = mailBox1->CreateMessageL( folder4Id, *properties ); + message->CommitL(); + delete message; + + TMsgStoreId folder5Id = mailBox1->CreateFolderL( folder2Id, *properties ); + + iLog->Log( _L("Case %d: List all folders"), iCaseId++ ); + mailBox1->FoldersL( folders ); + + expectedIds.AppendL( folder1Id ); + expectedIds.AppendL( folder2Id ); + expectedIds.AppendL( folder3Id ); + expectedIds.AppendL( folder4Id ); + expectedIds.AppendL( folder5Id ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreInbox] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreOutbox] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreDrafts] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreSent] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreDeleted] ); + VerifyFolderIdsL( folders, expectedIds ); + + folders.ResetAndDestroy(); + + iLog->Log( _L("Case %d: List child folders"), iCaseId++ ); + mailBox1->FoldersL( folder1Id, folders ); + + RArray<TMsgStoreId> expectedIds2; + expectedIds2.AppendL( folder2Id ); + expectedIds2.AppendL( folder3Id ); + VerifyFolderIdsL( folders, expectedIds2 ); + + folders.ResetAndDestroy(); + expectedIds2.Reset(); + + iLog->Log( _L("Case %d: List child folders recursively"), iCaseId++ ); + //list all subfolders of folder1Id + mailBox1->FoldersL( folder1Id, folders, ETrue ); + + expectedIds2.Reset(); + expectedIds2.AppendL( folder2Id ); + expectedIds2.AppendL( folder3Id ); + expectedIds2.AppendL( folder4Id ); + expectedIds2.AppendL( folder5Id ); + VerifyFolderIdsL( folders, expectedIds2 ); + + folders.ResetAndDestroy(); + expectedIds2.Reset(); + + mailBox1->FoldersL( folder2Id, folders ); + + expectedIds2.AppendL( folder4Id ); + expectedIds2.AppendL( folder5Id ); + VerifyFolderIdsL( folders, expectedIds2 ); + + folders.ResetAndDestroy(); + expectedIds2.Reset(); + + iLog->Log( _L("Case %d: Delete user defined folder with no children"), iCaseId++ ); + mailBox1->DeleteFolderL( folder5Id ); + + mailBox1->FoldersL( folders ); + + expectedIds.Remove( 4 ); // folder5 + VerifyFolderIdsL( folders, expectedIds ); + folders.ResetAndDestroy(); + expectedIds.Reset(); + + iLog->Log( _L("Case %d: Delete user defined folder with children"), iCaseId++ ); + mailBox1->DeleteFolderL( folder2Id ); + + mailBox1->FoldersL( folders ); + + expectedIds.AppendL( folder1Id ); + expectedIds.AppendL( folder3Id ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreInbox] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreOutbox] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreDrafts] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreSent] ); + expectedIds.AppendL( rootFolders.iFolders[EMsgStoreDeleted] ); + + VerifyFolderIdsL( folders, expectedIds ); + + folders.ResetAndDestroy(); + expectedIds.Reset(); + + // ERROR PATH TESTS + + iLog->Log( _L("Case %d: Error - Delete nonexistent folder"), iCaseId++ ); + TRAPD( result, mailBox1->DeleteFolderL( folder5Id ) ); + CheckCondition( _L("not found error"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - Create folder in nonexistent folder"), iCaseId++ ); + TRAP( result, mailBox1->CreateFolderL( folder5Id, *properties ) ); + CheckCondition( _L("not found error"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - FolderL for nonexistent folder"), iCaseId++ ); + TRAP( result, mailBox1->FolderL( folder4Id ) ); + CheckCondition( _L("not found error"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - FoldersL for nonexistent parent folder"), iCaseId++ ); + TRAP( result, mailBox1->FoldersL( folder2Id, folders ) ); + CheckCondition( _L("not found error"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - Create folder with wrong type for folder"), iCaseId++ ); + TRAP( result, mailBox1->CreateFolderL( messageId, *properties ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - Delete folder with wrong type for folder"), iCaseId++ ); + TRAP( result, mailBox1->DeleteFolderL( messageId ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - FolderL with wrong type for folder"), iCaseId++ ); + TRAP( result, mailBox1->FolderL( messageId ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - FoldersL with wrong type for folder"), iCaseId++ ); + TRAP( result, mailBox1->FoldersL( messageId, folders ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + // OUT OF MEMORY ERROR PATH TESTS + + iLog->Log( _L("Case %d: Error - Out of memory"), iCaseId++ ); + for( TInt i = 0; i < 1; i++ ) + { + SimulateLowDiskSpaceL( i ); + TRAP( result, mailBox1->CreateFolderL( folder1Id, *properties ) ); + CheckCondition( _L("out of memory"), result == KErrNoMemory ); + } + + CleanupStack::PopAndDestroy( 3 ); + + //we are done + return ETrue; + } + +void CFolderTests::VerifyFolderIdsL( RPointerArray<CMsgStoreFolder>& aFolders, RArray<TMsgStoreId>& aExpectedIds ) + { + iLog->Log( _L(" >> VerifyFolderIdsL") ); + + TBool passed = (aFolders.Count() == aExpectedIds.Count() ); + + for( TInt i = 0; i < aFolders.Count(); i++ ) + { + TBool found = EFalse; + for ( TInt j = 0; j < aExpectedIds.Count() && !found; j++ ) + { + found = (aFolders[i]->Id() == aExpectedIds[j]); + } + passed = passed && found; + } + + if( !passed ) + { + for( TInt i = 0; i < aExpectedIds.Count(); i++ ) + { + iLog->Log( _L(" expected[%i]=%x"), i, aExpectedIds[i] ); + } + for( TInt i = 0; i < aFolders.Count(); i++ ) + { + iLog->Log( _L(" found[%i]=%x"), i, aFolders[i]->Id() ); + } + } + + TBuf<30> text; + text.Format( _L("%i ids matched"), aFolders.Count() ); + CheckCondition( text, passed ); + + iLog->Log( _L(" << VerifyFolderIdsL") ); + } + + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/MailboxTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,292 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <tz.h> +#include "MailboxTests.h" +#include <msgstoreapi.h> +//#include <ismsgstorepropertykeys.h> + +// ============================ MEMBER FUNCTIONS =============================== + +CMailboxTests* CMailboxTests::NewL( CStifLogger* aLog ) + { + CMailboxTests* self = new(ELeave) CMailboxTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CMailboxTests::CMailboxTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CMailboxTests::~CMailboxTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CMailboxTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CMailboxTests::ExecuteL() + { + LogHeader( _L("Mailbox") ); + + //StartRecordingObserverEvents(); + TInt32 owner1 = 1234; + TInt32 owner2 = 5678; + _LIT(KName1, "My Account"); + _LIT(KName2, "Your Account"); + + iLog->Log( _L("Case %d: Account Object"), iCaseId++ ); + + iLog->Log( _L(" Test Accounts in Memory") ); + + CMsgStoreAccount* testAcc = CMsgStoreAccount::NewLC(9999, _L("test accoun")); //+testAcc + CheckCondition( _L("owner id"), testAcc->Owner() == 9999 ); + CheckCondition( _L("account name"), testAcc->Name() == _L("test accoun") ); + + _LIT( KChangeAccountOwner, " Change Account Owner" ); + iLog->Log( KChangeAccountOwner ); + testAcc->SetOwner( 8888 ); + CheckCondition( _L("new owner id"), testAcc->Owner() == 8888 ); + + _LIT( KChangeAccountNameLong, " Change Account Name (long)" ); + iLog->Log( KChangeAccountNameLong ); + testAcc->SetNameL( _L("this is a very very long account name") ); + CheckCondition( _L("new account name"), testAcc->Name() == _L("this is a very very long account name") ); + + _LIT( KChangeAccountNameShort, " Change Account Name (short)" ); + iLog->Log( KChangeAccountNameShort ); + testAcc->SetNameL( _L("sl name") ); + CheckCondition( _L("new account name"), testAcc->Name() == _L("sl name") ) ; + + CleanupStack::PopAndDestroy( testAcc ); + + iLog->Log( _L("Case %d: Create Mailboxes"), iCaseId++ ); + + //account 1 + CMsgStoreMailBox* mailBox1 = NULL; + CMsgStoreAccount* account1 = CMsgStoreAccount::NewLC( owner1, KNullDesC ); //+1 + + TRAPD( err, mailBox1 = iMsgStore->CreateAccountL( *account1 ) ); + + CleanupStack::PushL( mailBox1 ); //+2 + CheckCondition( _L("Id1, empty name"), err == KErrNone ); + + //mailbox 1 should be set as default mailbox now + iLog->Log( _L(" mailbox1Id=%d, isCorporate=%d"), mailBox1->Id(), mailBox1->IsCorporateMailbox() ); + + //account 2, with propertyes + CMsgStoreMailBox* mailBox2 = NULL; + CMsgStoreAccount* account2 = CMsgStoreAccount::NewLC( owner1, KName1 ); //+3 + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + properties->AddPropertyL(_L8("mailbox property"), _L("maibox property value")); + + TUint32 aSourceId = 0x80001; + TUint32 feature = 0x1f; + properties->AddOrUpdatePropertyL( KIsPropertyEmailSourceId, aSourceId ); + properties->AddOrUpdatePropertyL( KIsPropertyCapabilities, feature ); + + mailBox2 = iMsgStore->CreateAccountL( *account2, properties ); + + CleanupStack::PushL( mailBox2 ); //+4 + + //mailbox 1 should be set as default mailbox now + iLog->Log( _L(" mailbox2Id=%d, isCorporate=%d"), mailBox2->Id(), mailBox2->IsCorporateMailbox() ); + + ComparePropertiesL( *mailBox2, *properties ); + delete properties; + + //account 3 + CMsgStoreMailBox* mailBox3 = NULL; + CMsgStoreAccount* account3 = CMsgStoreAccount::NewLC( owner2, KNullDesC ); //+5 + + TRAP( err, mailBox3 = iMsgStore->CreateAccountL( *account3 ) ); + + CleanupStack::PushL( mailBox3 ); //+6 + CheckCondition( _L("Id2, empty name"), err == KErrNone ); + //mailbox 1 should be set as default mailbox now + iLog->Log( _L(" mailbox3Id=%d, isCorporate=%d"), mailBox3->Id(), mailBox3->IsCorporateMailbox() ); + + //account 4 + CMsgStoreMailBox* mailBox4 = NULL; + CMsgStoreAccount* account4 = CMsgStoreAccount::NewLC( owner2, KName2 ); //+7 + + properties = CMsgStorePropertyContainer::NewL(); + properties->AddOrUpdatePropertyL( KIsPropertyServerType, (TUint32)ESrvExchange ); + + TRAP( err, mailBox4 = iMsgStore->CreateAccountL( *account4, properties ) ); + delete properties; + + CleanupStack::PushL( mailBox4 ); //+8 + CheckCondition( _L("Id2, name2"), err == KErrNone ); + iLog->Log( _L(" mailbox4Id=%d, isCorporate=%d"), mailBox4->Id(), mailBox4->IsCorporateMailbox() ); + + //test account aready exists error + iLog->Log( _L("Case %d: Error - Test Account Exists"), iCaseId++ ); + + CMsgStoreMailBox* mailBox = NULL; + TRAP( err, mailBox = iMsgStore->CreateAccountL( *account1 ) ); + delete mailBox; + mailBox = NULL; + CheckCondition( _L("account1 exists - empty name"), err == KErrAlreadyExists ); + + TRAP( err, mailBox = iMsgStore->CreateAccountL( *account4 ) ); + delete mailBox; + mailBox = NULL; + CheckCondition( _L("account2 exists - name2"), err == KErrAlreadyExists ); + + DoListAccountsL( *iMsgStore ); + + iLog->Log( _L("Case %d: Set/Get Default Mailbox"), iCaseId++ ); + iMsgStore->SetDefaultMailboxL( mailBox3->Id() ); + + TMsgStoreId id = iMsgStore->DefaultMailboxL(); + CheckCondition( _L("DefaultMailboxL() is now account3"), mailBox3->Id() ); + + iLog->Log( _L("Case %d: Open Account by Account Object"), iCaseId++ ); + mailBox = iMsgStore->OpenAccountL( *account1 ); + CheckCondition( _L("open account 1"), mailBox->Id() == mailBox1->Id() ); + iLog->Log( _L(" mailbox1Id=%d, isCorporate=%d"), mailBox->Id(), mailBox->IsCorporateMailbox() ); + delete mailBox; + + mailBox = iMsgStore->OpenAccountL( *account2 ); + CheckCondition( _L("open account 2"), mailBox->Id() == mailBox2->Id() ); + iLog->Log( _L(" mailbox2Id=%d, isCorporate=%d"), mailBox->Id(), mailBox->IsCorporateMailbox() ); + delete mailBox; + + mailBox = iMsgStore->OpenAccountL( *account3 ); + CheckCondition( _L("open account 3"), mailBox->Id() == mailBox3->Id() ); + iLog->Log( _L(" mailbox3Id=%d, isCorporate=%d"), mailBox->Id(), mailBox->IsCorporateMailbox() ); + delete mailBox; + + mailBox = iMsgStore->OpenAccountL( *account4 ); + CheckCondition( _L("open account 4"), mailBox->Id() == mailBox4->Id() ); + iLog->Log( _L(" mailbox4Id=%d, isCorporate=%d"), mailBox->Id(), mailBox->IsCorporateMailbox() ); + delete mailBox; + + iLog->Log( _L("Case %d: Open Account by MailBoxId"), iCaseId++ ); + mailBox = iMsgStore->OpenAccountL( mailBox1->Id() ); + CheckCondition( _L("open account 1 by MailBoxId"), mailBox->Id() == mailBox1->Id() ); + delete mailBox; + + mailBox = iMsgStore->OpenAccountL( mailBox2->Id() ); + CheckCondition( _L("open account 2 by MailBoxId"), mailBox->Id() == mailBox2->Id() ); + //ComparePropertiesL( *mailBox, *mailBox2 ); + delete mailBox; + + mailBox = iMsgStore->OpenAccountL( mailBox3->Id() ); + CheckCondition( _L("open account 3 by MailBoxId"), mailBox->Id() == mailBox3->Id() ); + //ComparePropertiesL( *mailBox, *mailBox3 ); + delete mailBox; + + mailBox = iMsgStore->OpenAccountL( mailBox4->Id() ); + CheckCondition( _L("open account 4 by MailBoxId"), mailBox->Id() == mailBox4->Id() ); + //ComparePropertiesL( *mailBox, *mailBox4 ); + delete mailBox; + mailBox = NULL; + + iLog->Log( _L("Case %d: Error - Open Account"), iCaseId++ ); + iLog->Log( _L(" Open an nonexisting account - bad owner id") ); + //Open an nonexisting account - bad owner id + CMsgStoreAccount* badAccount1 = CMsgStoreAccount::NewLC( 1, KName2 ); //+9 + TRAP(err, mailBox = iMsgStore->OpenAccountL(*badAccount1) ); + CheckCondition( _L("bad ownerId"), err==KErrNotFound ); + + iLog->Log( _L(" Open an nonexisting account - bad name") ); + //Open an nonexisting account - bad name + CMsgStoreAccount* badAccount2 = CMsgStoreAccount::NewLC( owner1, _L("bad name") ); //+10 + TRAP(err, mailBox = iMsgStore->OpenAccountL(*badAccount2) ); + CheckCondition( _L("bad name"), err==KErrNotFound ); + + iLog->Log( _L("Case %d: Rename Account"), iCaseId++ ); + + TRAP(err, iMsgStore->RenameAccountL( account1->Owner(), account1->Name(), _L("New acc 1")) ); + CheckCondition( _L("rename account1"), err==KErrNone ); + + TRAP(err, iMsgStore->RenameAccountL( account1->Owner(), account1->Name(), _L("New acc 1")) ); + CheckCondition( _L("rename account1 again - should return -1"), err==KErrNotFound ); + + TRAP(err, iMsgStore->RenameAccountL( account4->Owner(), account4->Name(), _L("New acc 4")) ); + CheckCondition( _L("rename account4"), err==KErrNone ); + + iLog->Log( _L("Case %d: Error - Rename Account"), iCaseId++ ); + TRAP(err, iMsgStore->RenameAccountL( account1->Owner(), _L("New acc 1"), KName1) ); + CheckCondition( _L("new name already exists"), err==KErrAlreadyExists ); + + DoListAccountsL( *iMsgStore ); + + iLog->Log( _L("Case %d: Delete Account"), iCaseId++ ); + + TRAP(err, iMsgStore->DeleteAccountL(*account2)); + CheckCondition( _L("delete account2"), err==KErrNone ); + + TRAP(err, iMsgStore->DeleteAccountL(*account3)); + CheckCondition( _L("delete account3"), err==KErrNone ); + + iLog->Log( _L("Case %d: Error - Delete Account"), iCaseId++ ); + TRAP(err, iMsgStore->DeleteAccountL(*account2)); + CheckCondition( _L("delete account2 again - should return -1"), err==KErrNotFound ); + + TRAP(err, iMsgStore->DeleteAccountL(*account4)); + CheckCondition( _L("delete account4 using old name, should return -1"), err==KErrNotFound ); + + DoListAccountsL( *iMsgStore ); + + CleanupStack::PopAndDestroy( 10 ); + + //we are done + return ETrue; + } + +void CMailboxTests::DoListAccountsL( CMsgStore& aMsgStore ) +{ + iLog->Log( _L(" --List Accounts--") ); + RPointerArray<CMsgStoreAccount> accounts; + TRAPD( err, aMsgStore.AccountsL( accounts ) ); + CheckCondition( _L("Accounts"), err == KErrNone ); + + for ( int i = 0 ; i < accounts.Count() ; i++ ) + { + CMsgStoreAccount* account = accounts[i]; + iLog->Log( _L(" id=%i, name=%S"), account->Owner(), &account->Name() ); + } + + accounts.ResetAndDestroy(); +} + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/MessageTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,603 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <tz.h> +#include "MessageTests.h" +//#include <ismsgstorepropertykeys.h> +#include "messagestoreclientserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + +CMessageTests* CMessageTests::NewL( CStifLogger* aLog ) + { + CMessageTests* self = new(ELeave) CMessageTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CMessageTests::CMessageTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CMessageTests::~CMessageTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CMessageTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CMessageTests::ExecuteL() + { + LogHeader( _L("Message") ); + + //account 1 + CMsgStoreAccount* account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC ); //+1 + CMsgStoreMailBox* mailBox1 = iMsgStore->CreateAccountL( *account1 ); + CleanupStack::PushL( mailBox1 ); //+2 + + //accoun 2 + CMsgStoreAccount* account2 = CMsgStoreAccount::NewLC( 4567, _L("Account 2") ); //+3 + CMsgStoreMailBox* mailBox2 = iMsgStore->CreateAccountL( *account2 ); + CleanupStack::PushL( mailBox2 ); //+4 + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + + CleanupStack::PushL( properties ); //+5 + TestAddIntegerPropertyL( *properties, _L8("INTEGER PROPERTY"), 99999 ); + TestAddDes8PropertyL( *properties, _L8("STRING PROPERTY"), _L8("STRING VALUE") ); + TestAddDesPropertyL( *properties, _L8("name"), _L("Inbox") ); + + TMsgStoreId inbox1Id = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + CMsgStoreFolder* inbox1 = mailBox1->FolderL( inbox1Id ); + CleanupStack::PushL( inbox1 ); //+6 + + TMsgStoreId inbox2Id = mailBox2->CreateFolderL( mailBox2->Id(), *properties ); + CMsgStoreFolder* inbox2 = mailBox2->FolderL( inbox2Id ); + CleanupStack::PushL( inbox2 ); //+7 + + //create outbox folders for mailbox1 and mailbox2 + CMsgStorePropertyContainer* outboxProp = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( outboxProp ); //+8 + + TestAddIntegerPropertyL( *outboxProp, _L8("INTEGER PROPERTY"), 99999 ); + TestAddDes8PropertyL( *outboxProp, _L8("STRING PROPERTY"), _L8("STRING VALUE") ); + TestAddDesPropertyL( *outboxProp, _L8("name"), _L("Outbox") ); + + TMsgStoreId outbox1Id = mailBox1->CreateFolderL( mailBox1->Id(), *outboxProp ); + CMsgStoreFolder* outbox1 = mailBox1->FolderL( outbox1Id ); + CleanupStack::PushL( outbox1 ); //+9 + + TMsgStoreId outbox2Id = mailBox1->CreateFolderL( mailBox2->Id(), *outboxProp ); + CMsgStoreFolder* outbox2 = mailBox1->FolderL( outbox2Id ); + CleanupStack::PushL( outbox2 ); //+10 + + + RArray<TMsgStoreId> expectedIds; + + CMsgStorePropertyContainer* properties2 = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( properties2 ); //+11 + TestAddIntegerPropertyL( *properties2, KMsgStorePropertyFlags, 0 ); + TestAddIntegerPropertyL( *properties2, KMsgStorePropertyReplyBy, 1 ); + TestAddIntegerPropertyL( *properties2, _L8("SOME INTEGER PROPERTY"), KMaxTUint32 ); + TestAddDes8PropertyL( *properties2, _L8("SOME OTHER PROPERTY"), _L8("SOME VALUE") ); + + iLog->Log( _L("Case %d: Create messages"), iCaseId++ ); + + _LIT8( KTestContent, "TEST CONTENT" ); + + CMsgStoreMessage* message1 = mailBox1->CreateMessageL( inbox1Id, *properties2 ); + CleanupStack::PushL( message1 ); //+12 + + iLog->Log( _L("Case %d: Total Message Count"), iCaseId++ ); + + //get message counts + TUint totalCount, unreadCount; + mailBox1->TotalMessageCountsL( totalCount, unreadCount ); + + CheckCondition( _L("Msg Not Committed. Count=0"), totalCount==0 && unreadCount==0 ); + + message1->CommitL(); + + mailBox1->TotalMessageCountsL( totalCount, unreadCount ); + CheckCondition( _L("Msg Commited. Count=1"), totalCount==1 && unreadCount==1 ); + + iLog->Log( _L("Case %d: Create message in a different way"), iCaseId++ ); + CMsgStorePropertyContainer* props = CMsgStorePropertyContainer::NewL(); + props->AddOrUpdatePropertyL( KMsgStorePropertyFlags, (TUint32) 0 ); //set the unread flag + + CMsgStoreMessage* tmpMsg = mailBox1->CreateMessageL( inbox1Id, *props ); + + mailBox1->TotalMessageCountsL( totalCount, unreadCount ); + CheckCondition( _L("Msg Not Committed. Count=1"), totalCount==1 && unreadCount==1 ); + + mailBox1->TotalMessageCountsL( totalCount, unreadCount ); + CheckCondition( _L("Msg Not Committed. Count=1"), totalCount==1 && unreadCount==1 ); + + tmpMsg->CommitL(); + + mailBox1->TotalMessageCountsL( totalCount, unreadCount ); + CheckCondition( _L("Msg Commited. Count=2"), totalCount==2 && unreadCount==2 ); + + iLog->Log( _L("Case %d: Delete Message"), iCaseId++ ); + mailBox1->DeleteMessageL( tmpMsg->Id(), inbox1Id ); + + delete tmpMsg; + + iLog->Log( _L("Case %d: Abandon Uncommitted Message"), iCaseId++ ); + tmpMsg = mailBox1->CreateMessageL( inbox1Id, *props ); + //Instead commit, abandon it + tmpMsg->AbandonL(); + + delete tmpMsg; + + delete props; + + iLog->Log( _L("Case %d: StorePropertiesL in between create and commit"), iCaseId++ ); + CMsgStoreMessage* message2 = mailBox1->CreateMessageL( inbox1Id, *properties2 ); + CleanupStack::PushL( message2 ); //+13 + + // Test StorePropertiesL in between create and commit. This is no supported + // for uncommitted messages. + TRAPD( err, message2->StorePropertiesL() ); + // Test StorePropertyL in between create and commit. + TRAPD( err1, message2->StorePropertyL( 0 ) ); + + CheckCondition( _L("StoreProperties failed as expected. Count=2"), + err==KErrNotFound && err1==KErrNotFound ); + message2->CommitL(); + + iLog->Log( _L("Case %d: Create message in different folders/mailboxes"), iCaseId++ ); + CMsgStoreMessage* message3 = mailBox1->CreateMessageL( outbox1Id, *properties2 ); + CleanupStack::PushL( message3 ); //+14 + message3->CommitL(); + + CMsgStoreMessage* message4 = mailBox1->CreateMessageL( outbox1Id, *properties2 ); + CleanupStack::PushL( message4 ); //+15 + message4->CommitL(); + + CMsgStoreMessage* message5 = mailBox2->CreateMessageL( inbox2Id, *properties2 ); + CleanupStack::PushL( message5 ); //+16 + message5->CommitL(); + + CMsgStoreMessage* message6 = mailBox2->CreateMessageL( inbox2Id, *properties2 ); + CleanupStack::PushL( message6 ); //+17 + message6->CommitL(); + + CMsgStoreMessage* message7 = mailBox2->CreateMessageL( outbox2Id, *properties2 ); + CleanupStack::PushL( message7 ); //+18 + message7->CommitL(); + + CMsgStoreMessage* message8 = mailBox2->CreateMessageL( outbox2Id, *properties2 ); + CleanupStack::PushL( message8 ); //+19 + message8->CommitL(); + + message1->ReplaceContentL( KTestContent ); + message2->ReplaceContentL( KTestContent ); + message3->ReplaceContentL( KTestContent ); + message4->ReplaceContentL( KTestContent ); + message5->ReplaceContentL( KTestContent ); + + iLog->Log( _L(" Verify contents of each folder") ); + + expectedIds.AppendL( message1->Id() ); + expectedIds.AppendL( message2->Id() ); + VerifyMessageIdsL( *mailBox1, inbox1Id, expectedIds ); + expectedIds.Reset(); + + expectedIds.AppendL( message3->Id() ); + expectedIds.AppendL( message4->Id() ); + VerifyMessageIdsL( *mailBox1, outbox1Id, expectedIds ); + expectedIds.Reset(); + + expectedIds.AppendL( message5->Id() ); + expectedIds.AppendL( message6->Id() ); + VerifyMessageIdsL( *mailBox2, inbox2Id, expectedIds ); + expectedIds.Reset(); + + expectedIds.AppendL( message7->Id() ); + expectedIds.AppendL( message8->Id() ); + VerifyMessageIdsL( *mailBox2, outbox2Id, expectedIds ); + expectedIds.Reset(); + + //Message counts + DoMessageCountsL( *mailBox1 ); + DoMessageCountsL( *mailBox2 ); + + iLog->Log( _L("Case %d: Move messages"), iCaseId++ ); + + mailBox1->MoveMessageL( message1->Id(), inbox1Id, outbox1Id ); + mailBox1->MoveMessageL( message2->Id(), inbox1Id, outbox1Id ); + mailBox2->MoveMessageL( message7->Id(), outbox2Id, inbox2Id ); + mailBox2->MoveMessageL( message8->Id(), outbox2Id, inbox2Id ); + + iLog->Log( _L(" Verify contents of each folder") ); + + VerifyMessageIdsL( *mailBox1, inbox1Id, expectedIds ); + expectedIds.Reset(); + + expectedIds.AppendL( message1->Id() ); + expectedIds.AppendL( message2->Id() ); + expectedIds.AppendL( message3->Id() ); + expectedIds.AppendL( message4->Id() ); + VerifyMessageIdsL( *mailBox1, outbox1->Id(), expectedIds ); + expectedIds.Reset(); + + VerifyMessageIdsL( *mailBox2, outbox2->Id(), expectedIds ); + expectedIds.Reset(); + + expectedIds.AppendL( message5->Id() ); + expectedIds.AppendL( message6->Id() ); + expectedIds.AppendL( message7->Id() ); + expectedIds.AppendL( message8->Id() ); + VerifyMessageIdsL( *mailBox2, inbox2->Id(), expectedIds ); + expectedIds.Reset(); + + DoMessageCountsL( *mailBox1 ); + DoMessageCountsL( *mailBox2 ); + + iLog->Log( _L("Case %d: Delete messages"), iCaseId++ ); + + mailBox1->DeleteMessageL( message1->Id(), outbox1Id ); + mailBox2->DeleteMessageL( message8->Id(), inbox2Id ); + + iLog->Log( _L(" Verify contents of each folder") ); + + VerifyMessageIdsL( *mailBox1, inbox1Id, expectedIds ); + expectedIds.Reset(); + + expectedIds.AppendL( message2->Id() ); + expectedIds.AppendL( message3->Id() ); + expectedIds.AppendL( message4->Id() ); + VerifyMessageIdsL( *mailBox1, outbox1->Id(), expectedIds ); + expectedIds.Reset(); + + VerifyMessageIdsL( *mailBox2, outbox2->Id(), expectedIds ); + expectedIds.Reset(); + + expectedIds.AppendL( message5->Id() ); + expectedIds.AppendL( message6->Id() ); + expectedIds.AppendL( message7->Id() ); + VerifyMessageIdsL( *mailBox2, inbox2->Id(), expectedIds ); + expectedIds.Reset(); + + DoMessageCountsL( *mailBox1 ); + DoMessageCountsL( *mailBox2 ); + + iLog->Log( _L("Case %d: Copy message"), iCaseId++ ); + + TMsgStoreId newId = mailBox1->CopyMessageL( message3->Id(), outbox1->Id(), inbox1->Id() ); + + iLog->Log( _L(" Delete all other messages") ); + + mailBox1->DeleteMessageL( message2->Id(), outbox1->Id() ); + mailBox1->DeleteMessageL( message3->Id(), outbox1->Id() ); + mailBox1->DeleteMessageL( message4->Id(), outbox1->Id() ); + mailBox2->DeleteMessageL( message5->Id(), inbox2->Id() ); + mailBox2->DeleteMessageL( message6->Id(), inbox2->Id() ); + mailBox2->DeleteMessageL( message7->Id(), inbox2->Id() ); + + iLog->Log( _L(" Verify contents of each folder") ); + + expectedIds.AppendL( newId ); + VerifyMessageIdsL( *mailBox1, inbox1->Id(), expectedIds ); + expectedIds.Reset(); + + VerifyMessageIdsL( *mailBox1, outbox1->Id(), expectedIds ); + VerifyMessageIdsL( *mailBox2, inbox2->Id(), expectedIds ); + VerifyMessageIdsL( *mailBox2, outbox2->Id(), expectedIds ); + + iLog->Log( _L(" Fetch copied message") ); + + CMsgStoreMessage* newMessage = mailBox1->FetchMessageL( newId, inbox1->Id() ); + + iLog->Log( _L(" Verify properties and content") ); + + ComparePropertiesL( *newMessage, *properties2 ); + + TBuf8<1000> contentBuf; + newMessage->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("content matches"), contentBuf.Compare( KTestContent ) == 0 ); + + delete newMessage; + + iLog->Log( _L("Case %d: Message Commit"), iCaseId++ ); + + CMsgStoreMessage* msg1 = mailBox1->CreateMessageL( inbox1Id, *properties ); + CleanupStack::PushL( msg1 ); //+20 + msg1->ReplaceContentL( _L8("CONTENT1") ); + TInt result = KErrNone; + TRAP( result, mailBox1->FetchMessageL( msg1->Id(), inbox1Id ) ); + CheckCondition( _L("uncommitted message not found"), result == KErrNotFound ); + + CMsgStoreMessagePart* part1 = msg1->AddChildPartL( *properties ); + part1->AppendToContentL( _L8("CONTENT2") ); +// TRAP( result, msg1->ChildPartL( part1->Id() ) ); +// CheckCondition( _L("uncommitted message not found"), result == KErrNotFound ); + + _LIT( KFilename, "C:\\test_content.txt" ); + _LIT8( KContent, "THIS IS THE CONTENT FOR THIS TEST" ); + RFs fs; + User::LeaveIfError( fs.Connect() ); + RFile file; + User::LeaveIfError( file.Replace( fs, KFilename, EFileWrite ) ); + file.Write( KContent ); + file.Close(); + fs.Close(); + +// CMsgStoreMessagePart* part2 = msg1->AddChildPartL( *properties ); +// part2->ReplaceContentWithFileL( KFilename ); +// TRAP( result, tmpPart = msg1->ChildPartL( part2->Id() ) ); +// CheckCondition( _L("uncommitted message not found"), result == KErrNotFound ); + + msg1->CommitL(); + iLog->Log( _L(" Message committed") ); + + TMsgStoreId message1Id = msg1->Id(); + + iLog->Log( _L("Case %d: Fetch message in a specific folder"), iCaseId++ ); + message2 = mailBox1->FetchMessageL( message1Id, inbox1->Id() ); + ComparePropertiesL( *message2, *properties ); + delete message2; + + iLog->Log( _L("Case %d: Fetch message in an unknown folder"), iCaseId++ ); + message2 = mailBox1->FetchMessageL( message1Id, KMsgStoreInvalidId ); + ComparePropertiesL( *message2, *properties ); + + iLog->Log( _L(" Verify contents") ); + + TBuf8<100> tmpBuf; + message2->FetchContentToBufferL( tmpBuf ); + CheckCondition( _L("content fetched"), tmpBuf.Compare(_L8("CONTENT1")) == 0 ); + + CMsgStoreMessagePart* part3 = msg1->ChildPartL( part1->Id() ); + ComparePropertiesL( *part3, *properties ); + + part3->FetchContentToBufferL( tmpBuf ); + CheckCondition( _L("content fetched"), tmpBuf.Compare(_L8("CONTENT2")) == 0 ); + + delete part1; +// delete part2; + delete part3; + delete message2; + + // OUT OF MEMORY ERROR PATH TESTS + + iLog->Log( _L("Case %d: Error - Out of memory"), iCaseId++ ); + for( TInt i = 0; i < 4; i++ ) + { + SimulateLowDiskSpaceL( i ); + TRAP( result, mailBox1->CopyMessageL( message1Id, inbox1Id, outbox1Id ) ); + CheckCondition( _L("out of memory"), result == KErrNoMemory ); + } + + // ERROR PATH TESTS + + // Nonexistent message/folder or wrong folder + + iLog->Log( _L("Case %d: Error - Delete nonexistent message"), iCaseId++ ); + + TRAP( result, mailBox1->DeleteMessageL( message1Id, outbox1Id ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - Move nonexistent message"), iCaseId++ ); + + TRAP( result, mailBox1->MoveMessageL( message1Id, outbox1Id, inbox1Id ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + +// __LOG_WRITE_INFO( "Replace content for nonexistent message." ) + +// TRAP( result, message1->ReplaceContentL( _L8("CONTENT") ) ); +// CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - ReplaceContentWithFileL for nonexistent message"), iCaseId++ ); + + TRAP( result, message1->ReplaceContentWithFileL( KFilename ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - Append to content for nonexistent message"), iCaseId++ ); + + TRAP( result, message1->AppendToContentL( _L8("CONTENT") ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - ContentLengthL for nonexistent message"), iCaseId++ ); + + TRAP( result, message1->ContentLengthL() ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - FetchContentToBufferL for nonexistent message"), iCaseId++ ); + + TRAP( result, message1->FetchContentToBufferL( contentBuf ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - FetchContentToFileL for nonexistent message"), iCaseId++ ); + + TRAP( result, message1->FetchContentToFileL( KFilename ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + CMsgStoreMessage* msg3 = mailBox1->CreateMessageL( inbox1Id, *properties ); + CleanupStack::PushL( msg3 ); //+21 + msg3->CommitL(); + + iLog->Log( _L("Case %d: Error - Delete message from wrong folder"), iCaseId++ ); + + TRAP( result, mailBox1->DeleteMessageL( msg3->Id(), outbox1Id ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - Move message from wrong folder"), iCaseId++ ); + + TRAP( result, mailBox1->MoveMessageL( msg3->Id(), outbox1Id, inbox1Id ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - Move message from nonexistent folder"), iCaseId++ ); + + TRAP( result, mailBox1->MoveMessageL( msg3->Id(), inbox1Id, inbox1Id + 50 ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - Create message in nonexistent folder"), iCaseId++ ); + + TRAP( result, + CMsgStoreMessage* msg = mailBox1->CreateMessageL( inbox1Id + 50, *properties ); + CleanupStack::PushL( msg ); + msg->CommitL(); + CleanupStack::PopAndDestroy( msg ); + ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + // Content file not found + iLog->Log( _L("Case %d: Error - ReplaceContentWithFileL with nonexistent file"), iCaseId++ ); + + TRAP( result, msg3->ReplaceContentWithFileL( _L("c:\\some_nonexistent_file.txt") ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + TMsgStoreId messageId = msg3->Id(); + + iLog->Log( _L("Case %d: Error - Commit message into deleted folder"), iCaseId++ ); + + TMsgStoreId folderId = mailBox1->CreateFolderL( inbox1Id, *properties ); + CMsgStoreMessage* msg4 = mailBox1->CreateMessageL( folderId, *properties ); + CleanupStack::PushL( msg4 ); //+22 + mailBox1->DeleteFolderL( folderId ); + TRAP( result, msg4->CommitL() ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + // Wrong types + + iLog->Log( _L("Case %d: Error - Create message with invalid type for folder"), iCaseId++ ); + + TRAP( result, mailBox1->CreateMessageL( messageId, *properties ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - Delete message with invalid type for message"), iCaseId++ ); + + TRAP( result, mailBox1->DeleteMessageL( folderId, folderId ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - Delete message with invalid type for folder"), iCaseId++ ); + + TRAP( result, mailBox1->DeleteMessageL( messageId, messageId ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - Move message with invalid type for message"), iCaseId++ ); + + TRAP( result, mailBox1->MoveMessageL( folderId, folderId, folderId ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - Move message with invalid type for source folder"), iCaseId++ ); + + TRAP( result, mailBox1->MoveMessageL( messageId, messageId, folderId ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - Move message with invalid type for destination folder"), iCaseId++ ); + + TRAP( result, mailBox1->MoveMessageL( messageId, folderId, messageId ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - Fetch message with invalid type for message"), iCaseId++ ); + + TRAP( result, mailBox1->FetchMessageL( folderId, folderId ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + CleanupStack::PopAndDestroy( 22 ); + + //we are done + return ETrue; + } + +void CMessageTests::VerifyMessageIdsL( CMsgStoreMailBox& aMailBox, TMsgStoreId aFolderId, RArray<TMsgStoreId>& expectedIds ) + { + iLog->Log( _L(" >> VerifyMessageIdsL") ); + + RArray<TMsgStoreId> ids; + + aMailBox.MessageIdsL( aFolderId, ids ); + + TBool passed = (ids.Count() == expectedIds.Count() ); + + for( TInt i = 0; i < ids.Count(); i++ ) + { + TBool found = EFalse; + for ( TInt j = 0; j < expectedIds.Count() && !found; j++ ) + { + found = (ids[i] == expectedIds[j]); + } + passed = passed && found; + } + + if( !passed ) + { + for( TInt i = 0; i < expectedIds.Count(); i++ ) + { + iLog->Log( _L(" expected=%i"), expectedIds[i] ); + } + for( TInt i = 0; i < ids.Count(); i++ ) + { + iLog->Log( _L(" found=%i"), ids[i] ); + } + } + + TBuf<30> text; + text.Format( _L("%i ids matched"), ids.Count() ); + CheckCondition( text, passed ); + + ids.Close(); + + iLog->Log( _L(" << VerifyMessageIdsL") ); + } + + +void CMessageTests::DoMessageCountsL( CMsgStoreMailBox& aMailBox ) + { + iLog->Log( _L(" Message counts") ); + + TUint totalCount, unreadCount; + aMailBox.TotalMessageCountsL( totalCount, unreadCount ); + iLog->Log( _L(" mb=%u total=%u, unread=%u"), aMailBox.Id(), totalCount, unreadCount ); + + RPointerArray<CMsgStoreFolder> folders; + aMailBox.FoldersL( folders ); + + for ( TInt i = 0 ; i < folders.Count() ; i++ ) + { + aMailBox.MessageCountsL( folders[i]->Id(), totalCount, unreadCount ); + iLog->Log( _L(" folder=%u total=%u, unread=%u"), folders[i]->Id(), totalCount, unreadCount ); + } + + folders.ResetAndDestroy(); + } + + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/MruTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,260 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + +//#include <BAUTILS.H> +#include "MruTests.h" +//#include <ismsgstorepropertykeys.h> +#include "messagestoreclientserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + +CMruTests* CMruTests::NewL( CStifLogger* aLog ) + { + CMruTests* self = new(ELeave) CMruTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CMruTests::CMruTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CMruTests::~CMruTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CMruTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CMruTests::ExecuteL() + { + LogHeader( _L("MRU") ); + + CMsgStoreAccount* account1 = CMsgStoreAccount::NewL(1234, _L("Account 1") ); + CleanupStack::PushL( account1 ); //+1 + + CMsgStoreAccount* account2 = CMsgStoreAccount::NewL(1234, _L("") ); + CleanupStack::PushL( account2 ); //+2 + + CMsgStoreAccount* account3 = CMsgStoreAccount::NewL(5678, _L("Account 3") ); + CleanupStack::PushL( account3 ); //+3 + + CMsgStoreMailBox* mailBox1 = iMsgStore->CreateAccountL( *account1 ); + CleanupStack::PushL( mailBox1 ); //+4 + + CMsgStoreMailBox* mailBox2 = iMsgStore->CreateAccountL( *account2 ); + CleanupStack::PushL( mailBox2 ); //+5 + + CMsgStoreMailBox* mailBox3 = iMsgStore->CreateAccountL( *account3 ); + CleanupStack::PushL( mailBox3 ); //+6 + + iLog->Log( _L("Case %d: Calling MruAddressesL() on empty mailbox"), iCaseId++ ); + RPointerArray<CMsgStoreAddress> expectedArray; + CompareMruArraysL( mailBox2, expectedArray ); + + RPointerArray<CMsgStoreAddress> inputArray; + + TBuf<100> addrBuf; + TBuf<100> nameBuf; + + for ( TInt i = 0 ; i < 20 ; i++ ) + { + addrBuf.Format(_L("name%d@nok%d.com"), i, i ); + nameBuf.Format(_L("Fname%d LName%d"), i, i ); + if ( i == 3 || i == 6 ) + { + nameBuf.Copy( KNullDesC ); + } + CMsgStoreAddress* address = CMsgStoreAddress::NewL( addrBuf, nameBuf ); + inputArray.Append( address ); + expectedArray.Append( address ); + } + + TRAPD( err, mailBox1->AddMruAddressesL( inputArray ) ); + CheckCondition( _L("AddMruAddressesL() ok"), err == KErrNone ); + + CompareMruArraysL( mailBox1, expectedArray ); + + inputArray.Reset(); //do not destroy because the memory is also in the expectedArray + + iLog->Log( _L("Case %d: Add more address to the top of MRU address list"), iCaseId++ ); + for ( TInt i = 0 ; i < 20 ; i++ ) + { + addrBuf.Format(_L("new name%d@nok%d.com"), i, i ); + nameBuf.Format(_L("new Fname%d LName%d"), i, i ); + if ( i == 3 || i == 7 ) + { + nameBuf.Copy( KNullDesC ); + } + CMsgStoreAddress* address = CMsgStoreAddress::NewL( addrBuf, nameBuf ); + inputArray.Append( address ); + //add the new addresss to the top of the array in the correct order + expectedArray.Insert( address, i ); + } + + iLog->Log( _L("Case %d: Calling AddMruAddressesL()"), iCaseId++ ); + TRAP( err, mailBox1->AddMruAddressesL( inputArray ) ); + CheckCondition( _L("AddMruAddressesL() ok"), err == KErrNone ); + + CompareMruArraysL( mailBox1, expectedArray ); + + iLog->Log( _L("Case %d: Promoting some address to top and add some to the top"), iCaseId++ ); + inputArray.Reset(); + for ( TInt i = 0 ; i < expectedArray.Count() ; i += 3 ) + { + CMsgStoreAddress* address = expectedArray[i]; + inputArray.Insert( address, 0 ); + expectedArray.Remove(i); + expectedArray.Insert( address, 0 ); + } + for ( TInt i = 40 ; i < 43 ; i++ ) + { + addrBuf.Format(_L("new name%d@nok%d.com"), i, i ); + nameBuf.Format(_L("new Fname%d LName%d"), i, i ); + CMsgStoreAddress* address = CMsgStoreAddress::NewL( addrBuf, nameBuf ); + inputArray.Insert(address, 5); + expectedArray.Insert(address, 5); + } + TRAP( err, mailBox1->AddMruAddressesL( inputArray ) ); + CheckCondition( _L("AddMruAddressesL() ok"), err == KErrNone ); + + CompareMruArraysL( mailBox1, expectedArray ); + + TInt newMaxCount=30; + iLog->Log( _L("Case %d: Change the MaxMruAddressCount"), iCaseId++ ); + iMsgStore->SetMaxMruAddressCountL( newMaxCount ); + while( expectedArray.Count() > newMaxCount ) + { + CMsgStoreAddress* address = expectedArray[newMaxCount]; + expectedArray.Remove(newMaxCount); + delete address; + } + CompareMruArraysL( mailBox1, expectedArray ); + + inputArray.Reset(); + + iLog->Log( _L("Case %d: Add some more to make sure only %d are returned"), iCaseId++ ); + for ( int i = 0 ; i < 10 ; i++ ) + { + addrBuf.Format(_L("newer name%d@nok%d.com"), i, i ); + nameBuf.Format(_L("newer Fname%d LName%d"), i, i ); + CMsgStoreAddress* address = CMsgStoreAddress::NewL( addrBuf, nameBuf ); + inputArray.Insert(address, 0); + expectedArray.Insert(address, 0); + } + while( expectedArray.Count() > newMaxCount ) + { + CMsgStoreAddress* address = expectedArray[newMaxCount]; + expectedArray.Remove(newMaxCount); + delete address; + } + + TRAP( err, mailBox1->AddMruAddressesL( inputArray ) ); + CheckCondition( _L("AddMruAddressesL() ok"), err == KErrNone ); + + CompareMruArraysL( mailBox1, expectedArray ); + + //__LOG_WRITE_INFO("Test Dynamic Encryption") + //TRAP( err, iMsgStore->EnableEncryptionL() ); + //CheckCondition( _L("EnableEncryption() should return KErrNone or KErrAlreadyExists() ok"), err == KErrNone || err == KErrAlreadyExists); + //if ( err == KErrAlreadyExists ) + // { + //encryption may be still going on, make sure it's complete before calling DisableEncryption() + // WaitUntilEncryptDecryptCompleteL( EMsgStoreESEncrypting, mailBox1 ); + + // __LOG_WRITE_INFO("Store is encrypted, decrypt it") + // iMsgStore->DisableEncryptionL(); + // __LOG_WRITE_INFO("Wait for decryption to complete") + // WaitUntilEncryptDecryptCompleteL( EMsgStoreESDecrypting, mailBox1 ); + // } + //else + // { + // __LOG_WRITE_INFO("Wait for encryption to complete") + // WaitUntilEncryptDecryptCompleteL( EMsgStoreESEncrypting, mailBox1 ); + // } + + //__LOG_WRITE_INFO("Comparing results") + //CompareMruArraysL( mailBox1, expectedArray ); + + //add a few more address to see if it works when encryption is turned on + + inputArray.Reset(); + + CleanupStack::PopAndDestroy( 6 ); + + //we are done + return ETrue; + } + +void CMruTests::CompareMruArraysL( CMsgStoreMailBox* aMailBox, RPointerArray<CMsgStoreAddress>& aExpected ) + { + iLog->Log(_L(" >> CompareMruArraysL") ); + + RPointerArray<CMsgStoreAddress> results; + TRAPD(err, aMailBox->MruAddressesL( results ) ); + CheckCondition( _L("MruAddressesL() ok"), err == KErrNone ); + + CheckCondition( _L("same counts"), aExpected.Count() == results.Count() ); + + TInt count = aExpected.Count(); + + iLog->Log( _L(" comparing %d addresses"), count); + + for ( TInt i = 0 ; i < count ; i++ ) + { + CMsgStoreAddress* addr1 = aExpected[i]; + CMsgStoreAddress* addr2 = results[i]; + iLog->Log( _L(" i=%d, addr=%S, dispName=%S"), i, &addr2->EmailAddress(), &addr2->DisplayName() ); + if ( addr1->EmailAddress() != addr2->EmailAddress() ) + { + iLog->Log( _L(" Different email address found!! index=%d addr1=%S, addr2=%S"), i, &addr1->EmailAddress(), &addr2->EmailAddress() ); + User::Leave( KErrNotFound ); + } + if ( addr1->DisplayName() != addr2->DisplayName() ) + { + iLog->Log( _L(" Different display name found!! index=%d name1=%S, name2=%S"), i, &addr1->DisplayName(), &addr2->DisplayName() ); + User::Leave( KErrNotFound ); + } + } + + results.ResetAndDestroy(); + + iLog->Log(_L(" addresses all match!") ); + + iLog->Log(_L(" << CompareMruArraysL") ); + + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/ObserverTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,840 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <connect/sbdefs.h> +#include <e32property.h> +#include "ObserverTests.h" +//#include <ismsgstorepropertykeys.h> +#include "messagestoreclientserver.h" + +const TInt32 KOwner1 = 1234; +const TInt32 KOwner2 = 5678; + +_LIT( KAccount1, "my account 1"); +_LIT( KAccount2, "my account 2"); + +//PointSec related tests. Must match ImsPointsecMonitor.h +// KPsUidPointsec +// The Pointsec status as defined by TPointsecStatus +#if 0 +const TUint KUidPointsecStatus = { 0x102070e3 }; +#endif + +enum TPointsecStatus + { + EPointsecRecognizerStarted = 1, + EPointsecInitializing, + EPointsecLocked, + EPointsecUnlocked, + EPointSecUnknown, //Do not know what 5 means, ignore it for now + EPointSecEncryptionStarting, //We received this while PointSec says "Encrypting Files" + //encryption is done, we received EPointSecUnlocked + EPointsecNotStarted = -1 + }; + + + +// ============================ MEMBER FUNCTIONS =============================== + +CObserverTests* CObserverTests::NewL( CStifLogger* aLog ) + { + CObserverTests* self = new(ELeave) CObserverTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CObserverTests::CObserverTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CObserverTests::~CObserverTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CObserverTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CObserverTests::ExecuteL() + { + LogHeader( _L("Observer") ); + + CMsgStore* session1 = CMsgStore::NewL(); + CleanupStack::PushL( session1 ); //+1 + CMsgStore* session2 = CMsgStore::NewL(); + CleanupStack::PushL( session2 ); //+2 + + StartRecordingObserverEvents(); + + session1->AddObserverL( this ); + session2->AddObserverL( this ); + + TObserverEvent event; + RArray<TObserverEvent> expectedEvents; + + iLog->Log( _L("Case %d: Create Account events"), iCaseId++ ); + + CMsgStoreAccount* account1 = CMsgStoreAccount::NewLC( KOwner1, KAccount1 ); //+3 + CMsgStoreMailBox* mailBox1 = session1->CreateAccountL( *account1 ); + CleanupStack::PushL( mailBox1 ); //+4 + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAccountCreated; + event.iType = KMsgStoreInvalidId; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = KOwner1; + event.iParentId = KMsgStoreInvalidId; + event.iOtherId = KMsgStoreInvalidId; + event.iName.Copy( KAccount1 ); + event.iNewName.Copy( KNullDesC ); + + expectedEvents.AppendL( event ); + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + CMsgStoreAccount* account2 = CMsgStoreAccount::NewLC( KOwner2, KAccount2 ); //+5 + CMsgStoreMailBox* mailBox2 = session2->CreateAccountL( *account2 ); + CleanupStack::PushL( mailBox2 ); //+6 + + event.iMailBoxId = mailBox2->Id(); + event.iOperation = EMsgStoreAccountCreated; + event.iType = KMsgStoreInvalidId; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = KOwner2; + event.iParentId = KMsgStoreInvalidId; + event.iOtherId = KMsgStoreInvalidId; + event.iName.Copy( KAccount2 ); + event.iNewName.Copy( KNullDesC ); + + expectedEvents.AppendL( event ); + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Rename Account events"), iCaseId++ ); + + session1->RenameAccountL( KOwner1, KAccount1, KAccount2 ); + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAccountRenamed; + event.iType = KMsgStoreInvalidId; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = KOwner1; + event.iParentId = KMsgStoreInvalidId; + event.iOtherId = KMsgStoreInvalidId; + event.iName.Copy( KAccount1 ); + event.iNewName.Copy( KAccount2 ); + + expectedEvents.AppendL( event ); + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Delete Account events"), iCaseId++ ); + + CMsgStoreAccount* newAccount = CMsgStoreAccount::NewLC( KOwner1, KAccount2 ); //+7 + session1->DeleteAccountL( *newAccount ); + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAccountDeleted; + event.iType = KMsgStoreInvalidId; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = KOwner1; + event.iParentId = KMsgStoreInvalidId; + event.iOtherId = KMsgStoreInvalidId; + event.iName.Copy( KAccount2 ); + event.iNewName.Copy( KNullDesC ); + + expectedEvents.AppendL( event ); + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Create Account events"), iCaseId++ ); + + mailBox1 = session1->CreateAccountL( *account1 ); + CleanupStack::PushL( mailBox1 ); //+8 + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAccountCreated; + event.iType = KMsgStoreInvalidId; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = KOwner1; + event.iParentId = KMsgStoreInvalidId; + event.iOtherId = KMsgStoreInvalidId; + event.iName.Copy( KAccount1 ); + event.iNewName.Copy( KNullDesC ); + + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Mailbox events"), iCaseId++ ); + + mailBox1->AddObserverL( this ); + + //This mailbox should NOT get any notifications for events on mailBox1 + mailBox2->AddObserverL( this ); + + ///This mailbox should get notifications for ALL events on mailBox1 + CMsgStoreMailBox *mailBox1_too = session2->OpenAccountL( *account1 ); + CleanupStack::PushL( mailBox1_too ); //+9 + mailBox1_too->AddObserverL( this ); + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( properties ); //+10 + _LIT8( KProperty1, "PROP1" ); + _LIT8( KProperty2, "PROP2" ); + TestAddIntegerPropertyL( *properties, KProperty1, 1 ); + TestAddIntegerPropertyL( *properties, KProperty2, 1 ); + + iLog->Log( _L("Case %d: Create Folder events"), iCaseId++ ); + + TMsgStoreId folderId = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAdd; + event.iType = EMsgStoreFolderContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = folderId; + event.iParentId = mailBox1->Id(); + event.iOtherId = KMsgStoreRootMailBoxId; + event.iName.SetLength(0); + event.iNewName.SetLength(0); + + expectedEvents.AppendL( event ); + + TMsgStoreId folder2Id = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAdd; + event.iType = EMsgStoreFolderContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = folder2Id; + event.iParentId = mailBox1->Id(); + event.iOtherId = KMsgStoreRootMailBoxId; + event.iName.SetLength(0); + event.iNewName.SetLength(0); + + expectedEvents.AppendL( event ); + + iLog->Log( _L("Case %d: Create Message events"), iCaseId++ ); + + CMsgStoreMessage* message1 = mailBox1->CreateMessageL( folderId, *properties ); + CleanupStack::PushL( message1 ); //+11 + message1->CommitL(); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAdd; + event.iType = EMsgStoreMessageContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = message1->Id(); + event.iParentId = folderId; + event.iOtherId = mailBox1->Id(); + event.iName.SetLength(0); + event.iNewName.SetLength(0); + + expectedEvents.AppendL( event ); + + TestAddIntegerPropertyL( *properties, KMsgStorePropertyFlags, 12345 ); + + CMsgStoreMessage* message2 = mailBox1->CreateMessageL( folderId, *properties ); + CleanupStack::PushL( message2 ); //+12 + message2->CommitL(); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAdd; + event.iType = EMsgStoreMessageContainer; + event.iFlags = 12345; + event.iId = message2->Id(); + event.iParentId = folderId; + event.iOtherId = mailBox1->Id(); + event.iName.SetLength(0); + event.iNewName.SetLength(0); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Create Part events"), iCaseId++ ); + + CMsgStoreMessagePart* part1 = message1->AddChildPartL( *properties ); + CleanupStack::PushL( part1 ); //+13 + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAdd; + event.iType = EMsgStorePartContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = part1->Id(); + event.iParentId = message1->Id(); + event.iOtherId = message1->ParentId(); + event.iName.SetLength(0); + event.iNewName.SetLength(0); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + _LIT( KFilename, "C:\\test_content.txt" ); + _LIT8( KContent, "THIS IS THE CONTENT FOR THIS TEST" ); + RFs fs; + User::LeaveIfError( fs.Connect() ); + RFile file; + User::LeaveIfError( file.Replace( fs, KFilename, EFileWrite ) ); + file.Write( KContent ); + file.Close(); + fs.Close(); + + part1->ReplaceContentWithFileL( KFilename ); + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreUpdateContent; + event.iType = EMsgStorePartContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = part1->Id(); + event.iParentId = message1->Id(); + event.iOtherId = message1->ParentId(); + event.iName.SetLength(0); + event.iNewName.SetLength(0); + + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + // Test message creation with operations between CreateMessageL and CommitL. + iLog->Log( _L("Case %d: Test operations between CreateMessageL and CommitL"), iCaseId++ ); + + TUint index; + properties->FindProperty( KMsgStorePropertyFlags, index ); + TestUpdateIntegerPropertyL( *properties, index, 99999 ); + + CMsgStoreMessage* message3 = mailBox1->CreateMessageL( folderId, *properties ); + CleanupStack::PushL( message3 ); //+14 + message3->ReplaceContentL( _L8("CONTENT") ); + CMsgStoreMessagePart* part3 = message3->AddChildPartL( *properties ); + part3->ReplaceContentL( _L8("NEW CONTENT" ) ); + part3->AppendToContentL( _L8("MORE CONTENT" ) ); + part3->ReplaceContentWithFileL( KFilename ); + message3->CommitL(); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAdd; + event.iType = EMsgStoreMessageContainer; + event.iFlags = 99999; + event.iId = message3->Id(); + event.iParentId = folderId; + event.iOtherId = mailBox1->Id(); + event.iName.SetLength(0); + event.iNewName.SetLength(0); + expectedEvents.AppendL( event ); + delete part3; + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Move events"), iCaseId++ ); + + mailBox1->MoveMessageL( message1->Id(), folderId, folder2Id ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreMove; + event.iType = EMsgStoreMessageContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = message1->Id(); + event.iParentId = folderId; + event.iOtherId = folder2Id; + expectedEvents.AppendL( event ); + + mailBox1->MoveMessageL( message1->Id(), folder2Id, folderId ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreMove; + event.iFlags = KMsgStoreFlagsNotFound; + event.iType = EMsgStoreMessageContainer; + event.iId = message1->Id(); + event.iParentId = folder2Id; + event.iOtherId = folderId; + expectedEvents.AppendL( event ); + + mailBox1->MoveMessageL( message3->Id(), folderId, folder2Id ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreMove; + event.iFlags = 99999; + event.iType = EMsgStoreMessageContainer; + event.iId = message3->Id(); + event.iParentId = folderId; + event.iOtherId = folder2Id; + expectedEvents.AppendL( event ); + + mailBox1->MoveMessageL( message3->Id(), folder2Id, folderId ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreMove; + event.iFlags = 99999; + event.iType = EMsgStoreMessageContainer; + event.iId = message3->Id(); + event.iParentId = folder2Id; + event.iOtherId = folderId; + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Update properties events"), iCaseId++ ); + + message1->StorePropertiesL(); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreUpdateProperties; + event.iType = EMsgStoreMessageContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = message1->Id(); + event.iParentId = folderId; + event.iOtherId = mailBox1->Id(); + expectedEvents.AppendL( event ); + + message2->StorePropertyL( 0 ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreUpdateProperties; + event.iType = EMsgStoreMessageContainer; + event.iFlags = 12345; + event.iId = message2->Id(); + event.iParentId = folderId; + event.iOtherId = mailBox1->Id(); + expectedEvents.AppendL( event ); + + CMsgStoreFolder* folder = mailBox1->FolderL( folderId ); + CleanupStack::PushL( folder ); //+15 + folder->StorePropertiesL(); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreUpdateProperties; + event.iType = EMsgStoreFolderContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = folderId; + event.iParentId = mailBox1->Id(); + event.iOtherId = KMsgStoreRootMailBoxId; + expectedEvents.AppendL( event ); + + folder->StorePropertyL( 0 ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreUpdateProperties; + event.iType = EMsgStoreFolderContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = folderId; + event.iParentId = mailBox1->Id(); + event.iOtherId = KMsgStoreRootMailBoxId; + expectedEvents.AppendL( event ); + + part1->StorePropertiesL(); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreUpdateProperties; + event.iType = EMsgStorePartContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = part1->Id(); + event.iParentId = message1->Id(); + event.iOtherId = folderId; + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Update content events"), iCaseId++ ); + + part1->AppendToContentL( _L8("SOME MORE CONTENT") ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreUpdateContent; + event.iType = EMsgStorePartContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = part1->Id(); + event.iParentId = message1->Id(); + event.iOtherId = folderId; + expectedEvents.AppendL( event ); + + message1->ReplaceContentL( _L8("NEW CONTENT") ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreUpdateContent; + event.iType = EMsgStoreMessageContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = message1->Id(); + event.iParentId = folderId; + event.iOtherId = mailBox1->Id(); + expectedEvents.AppendL( event ); + + message2->ReplaceContentWithFileL( KFilename ); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreUpdateContent; + event.iType = EMsgStoreMessageContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = message2->Id(); + event.iParentId = folderId; + event.iOtherId = mailBox1->Id(); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Remove content events"), iCaseId++ ); + + part1->RemoveContentL(); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreRemoveContent; + event.iType = EMsgStorePartContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = part1->Id(); + event.iParentId = message1->Id(); + event.iOtherId = folderId; + expectedEvents.AppendL( event ); + + message2->RemoveContentL(); + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreRemoveContent; + event.iType = EMsgStoreMessageContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = message2->Id(); + event.iParentId = folderId; + event.iOtherId = mailBox1->Id(); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Copy events"), iCaseId++ ); + + TMsgStoreId copyId = mailBox1_too->CopyMessageL( message1->Id(), folderId, folder2Id ); + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreAdd; + event.iType = EMsgStoreMessageContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = copyId; + event.iParentId = folder2Id; + //Per Gypsy UI's request, when copying messages, we now send the original message id + // in the aOtherId field of the notification ( MotificationNotify() ). + event.iOtherId = message1->Id(); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( EFalse, expectedEvents ); + + iLog->Log( _L("Case %d: Delete events"), iCaseId++ ); + + mailBox1->DeleteMessageL( message2->Id(), folderId ); + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreDelete; + event.iType = EMsgStoreMessageContainer; + event.iFlags = 12345; + event.iId = message2->Id(); + event.iParentId = folderId; + event.iOtherId = mailBox1->Id(); + + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + message1->RemoveChildPartL( part1->Id() ); + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreDelete; + event.iType = EMsgStorePartContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = part1->Id(); + event.iParentId = message1->Id(); + event.iOtherId = folderId; + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + mailBox1->DeleteFolderL( folderId ); + + event.iMailBoxId = mailBox1->Id(); + event.iOperation = EMsgStoreDelete; + event.iType = EMsgStoreFolderContainer; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = folderId; + event.iParentId = mailBox1->Id(); + event.iOtherId = KMsgStoreRootMailBoxId; + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( ETrue, expectedEvents ); + + iLog->Log( _L("Case %d: Database wiped system event"), iCaseId++ ); + + session1->WipeEverythingL(); + + // one per each session + event.iMailBoxId = -1; + event.iOperation = EMsgStoreDatabaseWiped; + event.iType = -1; + event.iFlags = (TUint32)-1; + event.iId = -1; + event.iParentId = -1; + event.iOtherId = -1; + + expectedEvents.AppendL( event ); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( EFalse, expectedEvents ); + + iLog->Log( _L("Case %d: Backup/restore system events"), iCaseId++ ); + + TriggerBackupRestoreEventL( conn::EBURBackupFull ); + + // one per each session + event.iMailBoxId = -1; + event.iOperation = EMsgStoreBackupOrRestoreInProgress; + event.iType = -1; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = -1; + event.iParentId = -1; + event.iOtherId = -1; + + expectedEvents.AppendL( event ); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( EFalse, expectedEvents ); + + + TriggerBackupRestoreEventL( 0 ); + + // one per each session + event.iOperation = EMsgStoreBackupOrRestoreCompleted; + expectedEvents.AppendL( event ); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( EFalse, expectedEvents ); + + iLog->Log( _L("Case %d: PointSec system lock events"), iCaseId++ ); + + TriggerPointSecEventL( ETrue ); + + // one per each session + event.iMailBoxId = -1; + event.iOperation = EMsgStorePointSecLockStarted; + event.iType = -1; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = -1; + event.iParentId = -1; + event.iOtherId = -1; + + expectedEvents.AppendL( event ); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( EFalse, expectedEvents ); + + TriggerPointSecEventL( EFalse ); + + // one per each session + event.iOperation = EMsgStorePointSecLockEnded; + expectedEvents.AppendL( event ); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( EFalse, expectedEvents ); + + + //Begin PointSec +#if 0 + TInt rc = RProperty::Define( KPsUidPointsec, KUidPointsecStatus, RProperty::EInt ); + rc = RProperty::Set( KPsUidPointsec, KUidPointsecStatus, EPointsecLocked ); + event.iOperation = EMsgStorePointSecLockStarted; + expectedEvents.AppendL( event ); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( EFalse, expectedEvents ); + + rc = RProperty::Set( KPsUidPointsec, KUidPointsecStatus, EPointsecUnlocked ); + event.iOperation = EMsgStorePointSecLockEnded; + expectedEvents.AppendL( event ); + expectedEvents.AppendL( event ); + + VerifyRecordedObserverEventsL( EFalse, expectedEvents ); +#endif + //End PointSec + + StopRecordingObserverEvents(); + + + iLog->Log( _L("Case %d: Remove Mailbox Observers"), iCaseId++ ); + mailBox1->RemoveObserverL( this ); + mailBox2->RemoveObserverL( this ); + + iLog->Log( _L("Case %d: Large number of observers on large number of sessions"), iCaseId++ ); + + RPointerArray<CMsgStore> sessions; + + for( TInt i = 0; i < 20; i++ ) + { + CMsgStore* session = CMsgStore::NewL(); + session->AddObserverL( this ); + + sessions.AppendL( session ); + } + + session1->WipeEverythingL(); + + for( TInt i = 0; i < 20; i++ ) + { + sessions[i]->RemoveObserverL( this ); + sessions[i]->AddObserverL( this ); + } + + session1->WipeEverythingL(); + + sessions.ResetAndDestroy(); + + CleanupStack::PopAndDestroy( 15 ); + + //we are done + return ETrue; + } + + +void CObserverTests::StartRecordingObserverEvents() + { + iRecordEvents = ETrue; + } + +void CObserverTests::StopRecordingObserverEvents() + { + iRecordEvents = ETrue; + iRecordedEvents.Reset(); + } + +void CObserverTests::VerifyRecordedObserverEventsL( TBool aVerifyOrder, RArray<TObserverEvent>& aExpectedEvents ) + { + iLog->Log( _L(" >> VerifyRecordedObserverEventsL") ); + + // Allow all events to propagate. + TInt loopCount = 0; + while( loopCount < 1000 && iRecordedEvents.Count() < aExpectedEvents.Count() ) + { + Yield( 10000 ); + loopCount++; + } + + TBool matched = ( aExpectedEvents.Count() == iRecordedEvents.Count() ); + + CheckCondition( _L("correct number of recorded events"), matched ); + + TObserverEvent expectedEvent; + TObserverEvent recordedEvent; + + while( matched && (aExpectedEvents.Count() > 0 ) ) + { + expectedEvent = aExpectedEvents[0]; + + TUint highestCompareIndex = 0; + if( !aVerifyOrder ) + { + highestCompareIndex = iRecordedEvents.Count() - 1; + } + + TBool found = EFalse; + TUint compareIndex = 0; + while( !found && compareIndex <= highestCompareIndex ) + { + recordedEvent = iRecordedEvents[compareIndex]; + + if (recordedEvent.iMailBoxId == expectedEvent.iMailBoxId && + recordedEvent.iOperation == expectedEvent.iOperation && + recordedEvent.iType == expectedEvent.iType && + recordedEvent.iFlags == expectedEvent.iFlags && + recordedEvent.iId == expectedEvent.iId && + recordedEvent.iParentId == expectedEvent.iParentId && + recordedEvent.iOtherId == expectedEvent.iOtherId && + recordedEvent.iName == expectedEvent.iName && + recordedEvent.iNewName == expectedEvent.iNewName ) + { + found = ETrue; + iRecordedEvents.Remove( compareIndex ); + } + else + { + compareIndex++; + } // end if + } + aExpectedEvents.Remove( 0 ); + + matched = (matched && found); + } + + aExpectedEvents.Reset(); + + CheckCondition( _L("recorded events matched"), matched ); + + iLog->Log( _L(" << VerifyRecordedObserverEventsL") ); + } + +void CObserverTests::ModificationNotify( TMsgStoreId aMailBoxId, TMsgStoreOperation aOperation, TMsgStoreContainerType aType, TUint32 aFlags, TMsgStoreId aId, TMsgStoreId aParentId, TMsgStoreId aOtherId ) + { + iLog->Log( _L(" ModificationNotify %i"), iRecordedEvents.Count()+1 ); + + if( iRecordEvents ) + { + TObserverEvent event; + event.iMailBoxId = aMailBoxId; + event.iOperation = aOperation; + event.iType = aType; + event.iFlags = aFlags; + event.iId = aId; + event.iParentId = aParentId; + event.iOtherId = aOtherId; + event.iName.SetLength( 0 ); + event.iNewName.SetLength( 0 ); + + iRecordedEvents.Append( event ); + } + } + +void CObserverTests::SystemEventNotify( TMsgStoreSystemEvent aEvent ) + { + iLog->Log( _L(" >> SystemEventNotify") ); + + if( iRecordEvents ) + { + TObserverEvent event; + event.iMailBoxId = -1; + event.iOperation = aEvent; + event.iType = -1; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = -1; + event.iParentId = -1; + event.iOtherId = -1; + event.iName.SetLength( 0 ); + event.iNewName.SetLength( 0 ); + + iRecordedEvents.Append( event ); + } + + iLog->Log( _L(" << SystemEventNotify") ); + } +void CObserverTests::AccountEventNotify( TMsgStoreAccountEvent aEvent, TInt32 aOwnerId, const TDesC& aName, const TDesC& aNewName, TMsgStoreId aMailboxId ) + { + iLog->Log( _L(" >> AccountEventNotify") ); + if( iRecordEvents ) + { + TObserverEvent event; + event.iMailBoxId = aMailboxId; + event.iOperation = aEvent; + event.iType = KMsgStoreInvalidId; + event.iFlags = KMsgStoreFlagsNotFound; + event.iId = aOwnerId; + event.iParentId = KMsgStoreInvalidId; + event.iOtherId = KMsgStoreInvalidId; + event.iName.Copy( aName ); + event.iNewName.Copy( aNewName ); + + iRecordedEvents.Append( event ); + } + iLog->Log( _L(" << AccountEventNotify") ); + } + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/PartTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,387 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <tz.h> +#include "PartTests.h" +//#include <ismsgstorepropertykeys.h> +#include "messagestoreclientserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + +CPartTests* CPartTests::NewL( CStifLogger* aLog ) + { + CPartTests* self = new(ELeave) CPartTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CPartTests::CPartTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CPartTests::~CPartTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CPartTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CPartTests::ExecuteL() + { + LogHeader( _L("Part") ); + + //account 1 + CMsgStoreAccount* account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC ); //+1 + CMsgStoreMailBox* mailBox1 = iMsgStore->CreateAccountL( *account1 ); + CleanupStack::PushL( mailBox1 ); //+2 + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( properties ); //+3 + properties->AddPropertyL( _L8("name"), _L("some name") ); + + TMsgStoreId inbox1Id = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + CMsgStoreFolder* inbox1 = mailBox1->FolderL( inbox1Id ); + CleanupStack::PushL( inbox1 ); //+4 + + CMsgStoreMessage* message1 = mailBox1->CreateMessageL( inbox1Id, *properties ); + CleanupStack::PushL( message1 ); //+5 + message1->CommitL(); + + RPointerArray<CMsgStoreMessagePart> parts; + + iLog->Log( _L("Case %d: List parts when no parts yet"), iCaseId++ ); + + message1->ChildPartsL( parts ); + CheckCondition( _L("no parts"), parts.Count() == 0 ); + parts.ResetAndDestroy(); + + iLog->Log( _L("Case %d: Add a part with no content"), iCaseId++ ); + + CMsgStoreMessagePart* part = message1->AddChildPartL( *properties ); + ComparePropertiesL( *part, *properties ); + CheckCondition( _L("parent ID is correct"), part->ParentId() == message1->Id() ); + + iLog->Log( _L("Case %d: Get ChildPart"), iCaseId++ ); + + CMsgStoreMessagePart* compareMe = message1->ChildPartL( part->Id() ); + ComparePropertiesL( *part, *compareMe ); + CheckCondition( _L("parent ID is correct"), compareMe->ParentId() == message1->Id() ); + + iLog->Log( _L("Case %d: Add a child part to a child child part"), iCaseId++ ); + + CMsgStoreMessagePart* grandChild = part->AddChildPartL( *properties ); + ComparePropertiesL( *grandChild, *properties ); + CheckCondition( _L("grandChild's parent ID is correct"), grandChild->ParentId() == part->Id() ); + + iLog->Log( _L("Case %d: Testing ChildPartL(aRecursive=ETrue)"), iCaseId++ ); + delete compareMe; + compareMe = message1->ChildPartL( grandChild->Id(), ETrue ); + ComparePropertiesL( *grandChild, *compareMe ); + CheckCondition( _L("GrandChild's parent ID is correct"), compareMe->ParentId() == part->Id() ); + delete compareMe; + + iLog->Log( _L("Case %d: Testing RemoveChildPartL(aRecursive=ETrue)"), iCaseId++ ); + message1->RemoveChildPartL( grandChild->Id(), ETrue ); + delete grandChild; + + iLog->Log( _L(" List parts") ); + + message1->ChildPartsL( parts ); + CheckCondition( _L("1 part"), parts.Count() == 1 ); + ComparePropertiesL( *parts[0], *properties ); + CheckCondition( _L("parent ID is correct"), parts[0]->ParentId() == message1->Id() ); + parts.ResetAndDestroy(); + + TMsgStoreId partId = part->Id(); + delete part; + + iLog->Log( _L("Case %d: Add an attachment with content using file path"), iCaseId++ ); + + _LIT( KFilename, "C:\\test_content.txt" ); + _LIT8( KContent, "THIS IS THE CONTENT FOR THIS TEST" ); + RFs fs; + User::LeaveIfError( fs.Connect() ); + RFile file; + User::LeaveIfError( file.Replace( fs, KFilename, EFileWrite ) ); + file.Write( KContent ); + file.Close(); + fs.Close(); + + part = message1->AddChildPartL( *properties, KFilename ); //new part + + iLog->Log( _L(" List parts") ); + + message1->ChildPartsL( parts ); + CheckCondition( _L("2 parts"), parts.Count() == 2 ); + + compareMe = NULL; + if( parts[0]->Id() == part->Id() ) + { + compareMe = parts[0]; + } + else if( parts[1]->Id() == part->Id() ) + { + compareMe = parts[1]; + } // end if + + CheckCondition( _L("found"), compareMe != NULL ); + CheckCondition( _L("parent ID is correct"), compareMe->ParentId() == message1->Id() ); + + iLog->Log( _L(" Verify content") ); + + TBuf8<100> contentBuf; + compareMe->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("content matches"), contentBuf.Compare( KContent ) == 0 ); + + parts.ResetAndDestroy(); + delete part; + + iLog->Log( _L("Case %d: Add an attachment with content using file handle"), iCaseId++ ); + RFs fs2; + User::LeaveIfError( fs2.Connect() ); + RFile file2; + fs2.ShareProtected(); + User::LeaveIfError( file2.Open( fs2, KFilename, EFileRead ) ); + + part = message1->AddChildPartL( *properties, file2 ); //new part + + file2.Close(); + fs2.Close(); + + iLog->Log( _L(" List parts") ); + + message1->ChildPartsL( parts ); + CheckCondition( _L("2 parts"), parts.Count() == 3 ); + + compareMe = NULL; + for (TInt i=0; i < parts.Count() ; i++ ) + { + if( parts[i]->Id() == part->Id() ) + { + compareMe = parts[i]; + break; + } + } + + CheckCondition( _L("found"), compareMe != NULL ); + CheckCondition( _L("parent ID is correct"), compareMe->ParentId() == message1->Id() ); + + iLog->Log( _L(" Verify content") ); + + compareMe->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("content matches"), contentBuf.Compare( KContent ) == 0 ); + + parts.ResetAndDestroy(); + + + iLog->Log( _L("Case %d: Copy part"), iCaseId++ ); + + CMsgStoreMessage* message2 = mailBox1->CreateMessageL( inbox1Id, *properties ); + CleanupStack::PushL( message2 ); //+6 + message2->CommitL(); + + TMsgStoreId newId = message1->CopyChildPartL( part->Id(), message2->Id() ); + + CMsgStoreMessagePart* newpart = message2->ChildPartL( newId ); + ComparePropertiesL( *part, *newpart ); + + contentBuf.SetLength( 0 ); + newpart->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("content matches"), contentBuf.Compare( KContent ) == 0 ); + + delete newpart; + + iLog->Log( _L("Case %d: Remove parts"), iCaseId++ ); + message1->RemoveChildPartL( part->Id() ); + message1->RemoveChildPartL( partId ); + + message1->ChildPartsL( parts ); + + CheckCondition( _L("one part left"), parts.Count() == 1 ); + parts.ResetAndDestroy(); + + delete part; + + iLog->Log( _L("Case %d: Nested parts"), iCaseId++ ); + // put an attachment back + CMsgStorePropertyContainer* nestedProps = CMsgStorePropertyContainer::NewL(); + nestedProps->AddPropertyL(_L8("prop1"), _L("value 1") ); + + part = message1->AddChildPartL( *properties ); + CMsgStoreMessagePart* nestedPart = part->AddChildPartL( *nestedProps ); + nestedPart->ReplaceContentL( KContent ); + + CMsgStoreMessagePart* comparePart = part->ChildPartL( nestedPart->Id() ); + ComparePropertiesL( *comparePart, *nestedProps ); + CheckCondition( _L("content length matches"), comparePart->ContentLengthL() == nestedPart->ContentLengthL() ); + comparePart->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("content matches"), contentBuf == KContent ); + + delete comparePart; + + iLog->Log( _L("Case %d: Fetch nested part from mailBox object"), iCaseId++ ); + + CMsgStoreWritablePropertyContainer* container = mailBox1->FetchPropertiesL( nestedPart->Id() ); + ComparePropertiesL( *container, *nestedPart ); + delete container; + + iLog->Log( _L("Case %d: Fetch part from mailBox object"), iCaseId++ ); + + container = mailBox1->FetchPropertiesL( part->Id() ); + ComparePropertiesL( *container, *part ); + delete container; + + iLog->Log( _L("Case %d: Fetch message from mailBox object"), iCaseId++ ); + + container = mailBox1->FetchPropertiesL( message1->Id() ); + ComparePropertiesL( *container, *message1 ); + delete container; + + iLog->Log( _L("Case %d: Fetch folder from mailBox object"), iCaseId++ ); + + container = mailBox1->FetchPropertiesL( inbox1->Id() ); + ComparePropertiesL( *container, *inbox1 ); + delete container; + + iLog->Log( _L("Case %d: ContainerTypeById"), iCaseId++ ); + + TMsgStoreContainerType contentType = mailBox1->ContainerTypeById( part->Id() ); + CheckCondition( _L("container type is Part"), contentType == EMsgStorePartContainer ); + + contentType = mailBox1->ContainerTypeById( message1->Id() ); + CheckCondition( _L("container type is Message"), contentType == EMsgStoreMessageContainer ); + + contentType = mailBox1->ContainerTypeById( inbox1->Id() ); + CheckCondition( _L("container type is Folder"), contentType == EMsgStoreFolderContainer ); + + contentType = mailBox1->ContainerTypeById( mailBox1->Id() ); + CheckCondition( _L("container type is Mailbox"), contentType == EMsgStoreMailboxContainer ); + + /****************************************************************** + * (end of) Testing of the new CMsgStoreMailBox methods: FetchPropertiesL() and + * ContentTypeBuId() requested by the Mail for Exchange team + * ****************************************************************/ + + iLog->Log( _L("Case %d: Add a message as an attachment (embedded msg)"), iCaseId++ ); + + CMsgStoreMessage* nestedMsg = part->AddChildMessageL( *nestedProps ); + nestedMsg->ReplaceContentL( KContent ); + comparePart = part->ChildPartL( nestedMsg->Id() ); + ComparePropertiesL( *nestedMsg, *comparePart ); + comparePart->FetchContentToBufferL( contentBuf ); + CheckCondition( _L("content matches"), contentBuf == KContent ); + CheckCondition( _L("IsEmbeddedMessage()"), comparePart->IsEmbeddedMessageL() ); + + iLog->Log( _L("Case %d: CommitL() not supported for embedded msgs"), iCaseId++ ); + //it should be safe to cast it to message + CMsgStoreMessage* castedMessage = static_cast<CMsgStoreMessage*>(comparePart); + //CommitL() should leave with KErrNotSupported + TRAPD( err, castedMessage->CommitL() ); + CheckCondition( _L("CommitL() not supported for embedded msgs"), err = KErrNotSupported ); + + iLog->Log( _L("Case %d: AbandonL() not supported for embedded msgs"), iCaseId++ ); + TRAP( err, castedMessage->AbandonL() ); + CheckCondition( _L("AbandonL() not supported for embedded msgs"), err = KErrNotSupported ); + + RPointerArray<CMsgStoreMessagePart> nestedParts; + part->ChildPartsL( nestedParts ); + CheckCondition( _L("2 nested parts"), nestedParts.Count() == 2 ); + + nestedParts.ResetAndDestroy(); + delete comparePart; + delete nestedMsg; + delete nestedPart; + delete part; + delete nestedProps; + + // ERROR PATH TESTS + + // put an attachment back + part = message1->AddChildPartL( *properties ); + CleanupStack::PushL( part ); //+7 + + iLog->Log( _L("Case %d: Error - ChildPartL for invalid part ID"), iCaseId++ ); + + TRAPD( result, message1->ChildPartL( EMsgStorePartBits | 50 ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - ChildPartL for wrong message"), iCaseId++ ); + + TRAP( result, message2->ChildPartL( part->Id() ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - AddAttachmentL (content) with nonexistent file"), iCaseId++ ); + + CMsgStoreMessagePart* tempPart = message2->AddChildPartL( *properties ); + TRAP( result, tempPart->ReplaceContentWithFileL( _L("C:\\some_nonexistent_file.txt") ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + delete tempPart; + + iLog->Log( _L("Case %d: Error - RemoveChildPartL for invalid part ID"), iCaseId++ ); + + TRAP( result, message2->RemoveChildPartL( part->Id() + 50 ) ); + CheckCondition( _L("not found"), result == KErrNotFound ); + + // wrong parameter types + + iLog->Log( _L("Case %d: Error - ChildPartL with wrong type for part"), iCaseId++ ); + + TRAP( result, message2->ChildPartL( message1->Id() ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + iLog->Log( _L("Case %d: Error - RemoveChildPartL with wrong type for part"), iCaseId++ ); + + TRAP( result, message2->RemoveChildPartL( message1->Id() ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + // OUT OF MEMORY ERROR PATH TESTS + + iLog->Log( _L("Case %d: Error - Out of memory"), iCaseId++ ); + for( TInt i = 0; i < 1; i++ ) + { + SimulateLowDiskSpaceL( i ); + TRAP( result, message1->AddChildPartL( *properties ) ); + CheckCondition( _L("out of memory"), result == KErrNoMemory ); + } + + CleanupStack::PopAndDestroy( 7 ); + + //we are done + return ETrue; + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/PropertyTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,413 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <tz.h> +#include "PropertyTests.h" +#include <msgstoreapi.h> +//#include <ismsgstorepropertykeys.h> +#include "messagestoreclientserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + +CPropertyTests* CPropertyTests::NewL( CStifLogger* aLog ) + { + CPropertyTests* self = new(ELeave) CPropertyTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CPropertyTests::CPropertyTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CPropertyTests::~CPropertyTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CPropertyTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CPropertyTests::ExecuteL() + { + LogHeader( _L("Property") ); + + iLog->Log( _L("Case %d: Manipulation of properties in RAM."), iCaseId++ ); + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + + CheckCondition( _L("default IDs"), properties->Id() == KMsgStoreInvalidId && properties->ParentId() == KMsgStoreInvalidId ); + + // "quick" properties + iLog->Log( _L("Case %d: Add integer properties"), iCaseId++ ); + TUint flagsIndex = TestAddIntegerPropertyL( *properties, KMsgStorePropertyFlags, EMsgStoreFlag_Read_Locally ); + TestAddIntegerPropertyL( *properties, KMsgStorePropertyReplyBy, 1 ); + TestAddIntegerPropertyL( *properties, KMsgStorePropertyCompletedAt, 2 ); + TestAddIntegerPropertyL( *properties, KMsgStorePropertyReceivedAt, 3, ETrue ); + + // integer + TUint intIndex1 = TestAddIntegerPropertyL( *properties, _L8("TOTALCONTENTSIZE"), 1000 ); + TUint intIndex2 = TestAddIntegerPropertyL( *properties, _L8("RETRIEVEMORE"), ETrue ); + TUint intIndex3 = TestAddIntegerPropertyL( *properties, _L8("ABC"), 1500 ); + + // bool + iLog->Log( _L("Case %d: Add boolean properties"), iCaseId++ ); + TUint boolIndex1 = TestAddBoolPropertyL( *properties, _L8("BOOL1"), ETrue ); + TUint boolIndex2 = TestAddBoolPropertyL( *properties, _L8("BOOL2"), EFalse, ETrue ); + + + // 8-bit descriptor + iLog->Log( _L("Case %d: Add 8-bit descriptor properties"), iCaseId++ ); + TUint stringIndex1 = TestAddDes8PropertyL( *properties, _L8("SOME OTHER PROPERTY"), _L8("SOME VALUE") ); + TUint stringIndex2 = TestAddDes8PropertyL( *properties, _L8("YET ANOTHER PROPERTY"), _L8("YET ANOTHER VALUE"), ETrue ); + + // 16-bit descriptor + iLog->Log( _L("Case %d: Add 16-bit descriptor properties"), iCaseId++ ); + TUint stringIndex3 = TestAddDesPropertyL( *properties, _L8("XYZ"), _L("sdfhsdgjg") ); + TestAddDesPropertyL( *properties, _L8("XYZ1"), _L("sdfhsdgjg1"), ETrue ); + + // container + iLog->Log( _L("Case %d: Add container properties"), iCaseId++ ); + CMsgStorePropertyContainer* subproperties = CMsgStorePropertyContainer::NewL(); + TestAddIntegerPropertyL( *subproperties, _L8("TOTALCONTENTSIZE"), 1000 ); + TestAddDes8PropertyL( *subproperties, _L8("SOME OTHER PROPERTY"), _L8("SOME VALUE") ); + TestAddDesPropertyL( *subproperties, _L8("XYZ"), _L("sdfhsdgjg") ); + + TUint containerIndex1 = TestAddContainerPropertyL( *properties, _L8("container 1"), *subproperties ); + TUint containerIndex2 = TestAddContainerPropertyL( *properties, _L8("container 2"), *subproperties ); + + delete subproperties; + + // time + iLog->Log( _L("Case %d: Add TTime properties"), iCaseId++ ); + TTime time1; + time1.HomeTime(); + TTime time2( 1000 ); + + TUint timeIndex1 = TestAddTimePropertyL( *properties, _L8("TIME PROPERTY 1"), time1); + TUint timeIndex2 = TestAddTimePropertyL( *properties, _L8("TIME PROPERTY 2"), time2); + + //Address + iLog->Log( _L("Case %d: Add Address properties"), iCaseId++ ); + RMsgStoreAddress address1, address2; + CleanupClosePushL( address1 ); + CleanupClosePushL( address2 ); + address1.iEmailAddress.Create(_L("myAddres1@nokia.com")); + address1.iDisplayName.Create(_L("My Name 1")); + address2.iEmailAddress.Create(_L("myAddres2@nokia.com")); + address2.iDisplayName.Create(_L("My Name 2")); + + TUint addressIndex1 = TestAddAddressPropertyL( *properties, _L8("ADDRESS PROPERTY 1"), address1); + TUint addressIndex2 = TestAddAddressPropertyL( *properties, _L8("ADDRESS PROPERTY 2"), address2); + + CleanupStack::PopAndDestroy(2); + + // Test long property names and values. + iLog->Log( _L("Case %d: Test long property names and values"), iCaseId++ ); + TBuf8<255> longName; + RBuf8 longValue; + longValue.CreateL( 65535 ); // boundary case + + longName.Fill( 'N', 255 ); + longValue.Fill( 'V', 65535 ); + + TUint longIndex = TestAddDes8PropertyL( *properties, longName, longValue ); + + longValue.Close(); + + // Test shrinking the size of a property from long to short. + iLog->Log( _L("Case %d: Test shrinking the size of a property from long to short"), iCaseId++ ); + TestUpdateDes8PropertyL( *properties, longIndex, _L8("ASDFGHJKL:") ); + + // Test growing short property back to long property. + iLog->Log( _L("Case %d: Test growing short property back to long property"), iCaseId++ ); + longValue.CreateL( 70000 ); + longValue.Fill( 'V', 70000 ); + + TestUpdateDes8PropertyL( *properties, longIndex, longValue ); + + longValue.Close(); + + // Test update. + subproperties = CMsgStorePropertyContainer::NewL(); + TestAddIntegerPropertyL( *subproperties, _L8("X"), 1 ); + + iLog->Log( _L("Case %d: Update boolean property"), iCaseId++ ); + TestUpdateBoolPropertyL( *properties, boolIndex1, EFalse ); + TestUpdateBoolPropertyL( *properties, boolIndex1, ETrue, ETrue ); + + iLog->Log( _L("Case %d: Update integer property"), iCaseId++ ); + TestUpdateIntegerPropertyL( *properties, intIndex1, 987 ); + TestUpdateIntegerPropertyL( *properties, intIndex1, 986, ETrue ); + + iLog->Log( _L("Case %d: Update 8-bit descriptor property"), iCaseId++ ); + TestUpdateDes8PropertyL( *properties, stringIndex1, _L8("ASDFGHJKL:") ); + TestUpdateDes8PropertyL( *properties, stringIndex1, _L8("ASDFGHJKL:1"), ETrue ); + + iLog->Log( _L("Case %d: Update 16-bit descriptor property"), iCaseId++ ); + TestUpdateDesPropertyL( *properties, stringIndex3, _L(",mxcn,mxbxcbmbnxv") ); + TestUpdateDesPropertyL( *properties, stringIndex3, _L(",mxcn,mxbxcbmbnxv"), ETrue ); + + iLog->Log( _L("Case %d: Update container property"), iCaseId++ ); + TestUpdateContainerPropertyL( *properties, containerIndex2, *subproperties ); + + TestAddIntegerPropertyL( *subproperties, _L8("Y"), 2 ); + TestUpdateContainerPropertyL( *properties, containerIndex2, *subproperties, ETrue ); + + delete subproperties; + + iLog->Log( _L("Case %d: Update TTime property"), iCaseId++ ); + time2 = 1000000; + TestUpdateTimePropertyL( *properties, timeIndex1, time2 ); + time2 = 1000000; + TestUpdateTimePropertyL( *properties, timeIndex1, time2, ETrue ); + + iLog->Log( _L("Case %d: Update address property"), iCaseId++ ); + RMsgStoreAddress address3; + + CleanupClosePushL(address3); + + address3.iDisplayName.Create(_L("new name")); + TestUpdateAddressPropertyL( *properties, addressIndex1, address3 ); + address3.iEmailAddress.Create( _L("mail@com")); + TestUpdateAddressPropertyL( *properties, addressIndex1, address3, ETrue ); + + CleanupStack::PopAndDestroy( &address3 ); + + // Test remove. + iLog->Log( _L("Case %d: Remove property"), iCaseId++ ); + TestRemovePropertyL( *properties, intIndex3 ); + TestRemovePropertyL( *properties, stringIndex3 ); + + iLog->Log( _L("Case %d: Store properties as a message and verify stored message"), iCaseId++ ); + + CMsgStoreAccount* account = CMsgStoreAccount::NewLC(1234, _L("my account") ); //+1 + CMsgStoreMailBox* mailBox1 = iMsgStore->CreateAccountL( *account ); + CleanupStack::PushL( mailBox1 ); //+2 + + TMsgStoreId folderId = mailBox1->CreateFolderL( mailBox1->Id(), *properties); + + CMsgStoreMessage* message = mailBox1->CreateMessageL( folderId, *properties ); + CleanupStack::PushL( message ); //+3 + message->CommitL(); + TMsgStoreId messageId = message->Id(); + + ComparePropertiesL( *message, *properties ); + CheckCondition( _L("IDs"), message->Id() != KMsgStoreInvalidId && message->ParentId() == folderId ); + + // fetch message + CMsgStoreMessage* message2 = mailBox1->FetchMessageL( messageId, folderId ); + CleanupStack::PushL( message2 ); //+4 + ComparePropertiesL( *message2, *message ); + CheckCondition( _L("IDs"), message2->Id() == message->Id() && message2->ParentId() == message->ParentId() ); + + // fetch message without specifying parent ID + CMsgStoreMessage* message3 = mailBox1->FetchMessageL( messageId, KMsgStoreInvalidId ); + CleanupStack::PushL( message3 ); //+5 + ComparePropertiesL( *message3, *message ); + CheckCondition( _L("IDs"), message3->Id() == message->Id() && message3->ParentId() == message->ParentId() ); + + iLog->Log( _L("Case %d: Test FetchPropertiesL"), iCaseId++ ); + //create another message that has the same properties as message1 + CMsgStoreMessage* message4 = mailBox1->CreateMessageL( folderId, *properties ); + CleanupStack::PushL( message4 ); //+6 + message4->CommitL(); + RArray<TMsgStoreId> ids; + ids.Append( message->Id() ); + ids.Append( message4->Id() ); + RPointerArray<TDesC8> propNames; + _LIT8( KAddProp1, "ADDRESS PROPERTY 1" ); + _LIT8( KAddProp2, "ADDRESS PROPERTY 2" ); + propNames.Append( &KAddProp1 ); + propNames.Append( &KAddProp2 ); + RPointerArray<CMsgStorePropertyContainer> propArray; + mailBox1->FetchPropertiesL( ids, propNames, propArray ); + CheckCondition( _L("PropertyCounts match"), ids.Count() == propArray.Count() ); + ComparePropertiesL( *propArray[0], *propArray[1] ); + ids.Reset(); + propNames.Reset(); + propArray.ResetAndDestroy(); + + iLog->Log( _L("Case %d: Update message properties and store"), iCaseId++ ); + TestAddIntegerPropertyL( *message, _L8("NEW INT PROPERTY"), 135 ); + TestAddDes8PropertyL( *message, _L8("NEW STRING PROPERTY"), _L8("NEW VALUE") ); + TestUpdateIntegerPropertyL( *message, intIndex1, 17475 ); + TestUpdateDes8PropertyL( *message, stringIndex1, _L8("zxxcvb") ); + TestRemovePropertyL( *message, intIndex2 ); + TestRemovePropertyL( *message, stringIndex2 ); + + message->StorePropertiesL(); + + // fetch message + message2 = mailBox1->FetchMessageL( messageId, folderId ); + ComparePropertiesL( *message2, *message ); + CheckCondition( _L("IDs"), message2->Id() == message->Id() && message2->ParentId() == message->ParentId() ); + delete message2; + + iLog->Log( _L("Case %d: Update individual message property and store"), iCaseId++ ); + TestUpdateIntegerPropertyL( *message, flagsIndex, 0 ); + + message->StorePropertyL( flagsIndex ); + + // fetch message + message2 = mailBox1->FetchMessageL( messageId, folderId ); + ComparePropertiesL( *message2, *message ); + CheckCondition( _L("IDs"), message2->Id() == message->Id() && message2->ParentId() == message->ParentId() ); + delete message2; + + iLog->Log( _L("Case %d: Add property and store individually"), iCaseId++ ); + TMsgStoreId newPropertyIndex = TestAddIntegerPropertyL( *message, _L8("A NEW INTEGER PROPERTY"), 50 ); + + message->StorePropertyL( newPropertyIndex ); + + // fetch message + message2 = mailBox1->FetchMessageL( messageId, folderId ); + ComparePropertiesL( *message2, *message ); + CheckCondition( _L("IDs"), message2->Id() == message->Id() && message2->ParentId() == message->ParentId() ); + delete message2; + + iLog->Log( _L("Case %d: Update individual message property 64K value to short value"), iCaseId++ ); + message->FindProperty( longName, longIndex ); + + TestUpdateDes8PropertyL( *message, longIndex, _L8("SHORT VALUE AGAIN") ); + + message->StorePropertyL( longIndex ); + + // fetch message + message2 = mailBox1->FetchMessageL( messageId, folderId ); + ComparePropertiesL( *message2, *message ); + CheckCondition( _L("IDs"), message2->Id() == message->Id() && message2->ParentId() == message->ParentId() ); + delete message2; + + iLog->Log( _L("Case %d: Update individual message property from short value to >64K value"), iCaseId++ ); + longValue.CreateL( 70000 ); + longValue.Fill( 'V', 70000 ); + TestUpdateDes8PropertyL( *message, longIndex, longValue ); + + message->StorePropertyL( longIndex ); + + longValue.Close(); + + // fetch message + message2 = mailBox1->FetchMessageL( messageId, folderId ); + ComparePropertiesL( *message2, *message ); + CheckCondition( _L("IDs"), message2->Id() == message->Id() && message2->ParentId() == message->ParentId() ); + delete message2; + + // ERROR PATH TESTS + iLog->Log( _L("Case %d: Error - Find property that does not exist"), iCaseId++ ); + TUint index = 500; + TBool found = properties->FindProperty( _L8("SOME PROPERTY THAT DOES NOT EXIST"), index ); + CheckCondition( _L("property not found"), !found && (index == 500) ); + + iLog->Log( _L("Case %d: Error - PropertyNameL with an invalid index"), iCaseId++ ); + TRAPD( result, properties->PropertyNameL( 5000 ) ); + CheckCondition( _L("property not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - PropertyValueDes8L with an invalid index"), iCaseId++ ); + TRAP( result, properties->PropertyValueDes8L( 5000 ) ); + CheckCondition( _L("property not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - PropertyValueUint32L with an invalid index"), iCaseId++ ); + TRAP( result, properties->PropertyValueUint32L( 5000 ) ); + CheckCondition( _L("property not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - UpdatePropertyL (string) with an invalid index"), iCaseId++ ); + TRAP( result, properties->UpdatePropertyL( 5000, _L8("abc") ) ); + CheckCondition( _L("property not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - UpdatePropertyL (integer) with an invalid index"), iCaseId++ ); + TRAP( result, properties->UpdatePropertyL( 5000, (TUint32)123 ) ); + CheckCondition( _L("property not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - UpdatePropertyL (bool) with an invalid index"), iCaseId++ ); + TRAP( result, properties->UpdatePropertyL( 5000, (TBool)123 ) ); + CheckCondition( _L("property not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - RemovePropertyL with an invalid index"), iCaseId++ ); + TRAP( result, properties->RemovePropertyL( 5000 ) ); + CheckCondition( _L("property not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - Fetch message that does not exist"), iCaseId++ ); + TRAP( result, message2 = mailBox1->FetchMessageL( EMsgStoreMessageBits | 50, folderId ) ); + CheckCondition( _L("message not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - Fetch message exists but is in a different folder"), iCaseId++ ); + TRAP( result, message2 = mailBox1->FetchMessageL( messageId, folderId + 1 ) ); + CheckCondition( _L("message not found"), result == KErrNotFound ); + + iLog->Log( _L("Case %d: Error - StoreProperty with an invalid property index"), iCaseId++ ); + TRAP( result, message->StorePropertyL( 5000 ) ); + CheckCondition( _L("property not found"), result == KErrNotFound ); + + // OUT OF MEMORY ERROR PATH TESTS + iLog->Log( _L("Case %d: Error - Out of memory, CreateMessageL"), iCaseId++ ); + for( TInt i = 0; i < 2; i++ ) + { + SimulateLowDiskSpaceL( i ); + TRAP( result, + CMsgStoreMessage* msg = mailBox1->CreateMessageL( folderId, *properties ); + CleanupStack::PushL( msg ); + msg->CommitL(); + CleanupStack::PopAndDestroy( msg ); + ); + CheckCondition( _L("out of memory"), result == KErrNoMemory ); + } + + iLog->Log( _L("Case %d: Error - Out of memory, StorePropertiesL"), iCaseId++ ); + for( TInt i = 0; i < 2; i++ ) + { + SimulateLowDiskSpaceL( i ); + TRAP( result, message->StorePropertiesL() ); + CheckCondition( _L("out of memory"), result == KErrNoMemory ); + } + + iLog->Log( _L("Case %d: Error - Out of memory, StorePropertyL"), iCaseId++ ); + for( TInt i = 0; i < 2; i++ ) + { + SimulateLowDiskSpaceL( i ); + TRAP( result, message->StorePropertyL( 0 ) ); + CheckCondition( _L("out of memory"), result == KErrNoMemory ); + } + + CleanupStack::PopAndDestroy(6); + + delete properties; + + //we are done + return ETrue; + } + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/SearchTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,718 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + +//#include <BAUTILS.H> +#include "SearchTests.h" +//#include <ismsgstorepropertykeys.h> +//#include "messagestoreclientserver.h" + +_LIT(KHigh, "High"); +_LIT(KNormal, "Normal"); +_LIT(KLow, "Low"); + +_LIT(KFollowUp, "FollowUp"); +_LIT(KFollowUpComplete, "FollowUpComplete"); +_LIT(KNone, "None"); + +// ============================ MEMBER FUNCTIONS =============================== + +CSearchTests* CSearchTests::NewL( CStifLogger* aLog ) + { + CSearchTests* self = new(ELeave) CSearchTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CSearchTests::CSearchTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CSearchTests::~CSearchTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CSearchTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CSearchTests::ExecuteL() + { + LogHeader( _L("Search") ); + + //account 1 + CMsgStoreAccount* account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC ); //+1 + CMsgStoreMailBox* mailBox1 = iMsgStore->CreateAccountL( *account1 ); + CleanupStack::PushL( mailBox1 ); //+2 + + //NOTE: the CreateRandomMessagesL() only generage string fields with 'A' through 'Z' and 'a' though 'z'. + // So to avoid the ramdom message have strings that match the search criteria, the search criteria must + // include some non-alphabetical characters, e.g., ' ', '.', etc. + _LIT( KDisplayName1, "FName1 LName1" ); + _LIT( KDisplayName2, "FName2 LName2" ); + _LIT( KDisplayName3, "FName3 LName3" ); + _LIT( KAddress1, "email1.addr1@yahoo.com" ); + _LIT( KAddress2, "email2.addr2@yahoo.com" ); + _LIT( KAddress3, "email3.addr3@yahoo.com" ); + _LIT( KSubject1, "Real subject 1." ); + _LIT( KSubject2, "Real subject 2." ); + _LIT( KSubject3, "Real subject 3." ); + _LIT( KContent1, "This is the subject of a message." ); + _LIT( KContent2, "The quick brown fox jumped over the lazy dog. Hurray!" ); + _LIT( KContent3, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()" ); + + CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( properties ); //+3 + + properties->AddPropertyL( _L8("1"), _L("PROPERTY 1") ); + properties->AddPropertyL( _L8("2"), 12345 ); + properties->AddPropertyL( _L8("3"), _L8("ANOTHER PROPERTY") ); + + //create 3 folders, but only search 2 of them + TMsgStoreId inbox1Id = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + TMsgStoreId sentFolderId = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + TMsgStoreId deletedFolderId = mailBox1->CreateFolderL( mailBox1->Id(), *properties ); + + //create messages for the 3 folders + TInt msgCountPerFolder = 20; + + CreateRandomMessagesL( mailBox1, inbox1Id, msgCountPerFolder ); + CreateRandomMessagesL( mailBox1, sentFolderId, msgCountPerFolder ); + CreateRandomMessagesL( mailBox1, deletedFolderId, msgCountPerFolder ); + + //get message ids for inbox + RArray<TMsgStoreId> msgIds; + mailBox1->MessageIdsL( inbox1Id, msgIds ); + RPointerArray<CMsgStoreMessage> inboxMsgs; + for ( TInt i = 0 ; i < msgCountPerFolder ; i++ ) + { + inboxMsgs.Append( mailBox1->FetchMessageL( msgIds[i], inbox1Id ) ); + } + msgIds.Reset(); + + //get message ids for sentFolderId + mailBox1->MessageIdsL( sentFolderId, msgIds ); + RPointerArray<CMsgStoreMessage> sentMsgs; + for ( TInt i = 0 ; i < msgCountPerFolder ; i++ ) + { + sentMsgs.Append( mailBox1->FetchMessageL( msgIds[i], sentFolderId ) ); + } + msgIds.Reset(); + + //get message ids for deletedFolder + mailBox1->MessageIdsL( deletedFolderId, msgIds ); + RPointerArray<CMsgStoreMessage> deletedMsgs; + for ( TInt i = 0 ; i < msgCountPerFolder ; i++ ) + { + deletedMsgs.Append( mailBox1->FetchMessageL( msgIds[i], deletedFolderId ) ); + } + msgIds.Close(); + + TBuf8<500> contentBuf; + + for ( TInt i = 0 ; i < 3 ; i++ ) + { + RPointerArray<CMsgStoreMessage>* msgs; + if ( i == 0 ) + { + msgs = &inboxMsgs; + } + else if ( i == 1 ) + { + msgs = &sentMsgs; + } + else + { + msgs = &deletedMsgs; + } + CopyDesToDes8( KContent1, contentBuf ); + SetMessageContentL( (*msgs)[0], contentBuf ); + SetMessageContentL( (*msgs)[3], contentBuf ); + SetMessageContentL( (*msgs)[4], contentBuf ); + + CopyDesToDes8( KContent2, contentBuf ); + SetMessageContentL( (*msgs)[1], contentBuf ); + SetMessageContentL( (*msgs)[6], contentBuf ); + + CopyDesToDes8( KContent3, contentBuf ); + SetMessageContentL( (*msgs)[2], contentBuf ); + SetMessageContentL( (*msgs)[5], contentBuf ); + SetMessageContentL( (*msgs)[7], contentBuf ); + SetMessageContentL( (*msgs)[8], contentBuf ); + + SetSubjectAndAddressL( (*msgs)[11], KSubject1, KDisplayName1, KAddress1, KMsgStorePropertyTo ); + SetSubjectAndAddressL( (*msgs)[14], KSubject1, KDisplayName1, KAddress1, KMsgStorePropertyCc ); + SetSubjectAndAddressL( (*msgs)[17], KSubject1, KDisplayName1, KAddress1, KMsgStorePropertyBcc ); + + SetSubjectAndAddressL( (*msgs)[12], KSubject2, KDisplayName2, KAddress2, KMsgStorePropertyTo ); + SetSubjectAndAddressL( (*msgs)[15], KSubject2, KDisplayName2, KAddress2, KMsgStorePropertyCc ); + SetSubjectAndAddressL( (*msgs)[18], KSubject2, KDisplayName2, KAddress2, KMsgStorePropertyBcc ); + + SetSubjectAndAddressL( (*msgs)[13], KSubject3, KDisplayName3, KAddress3, KMsgStorePropertyTo ); + SetSubjectAndAddressL( (*msgs)[16], KSubject3, KDisplayName3, KAddress3, KMsgStorePropertyCc ); + //make #19 use name 3 and addr2 + SetSubjectAndAddressL( (*msgs)[19], KSubject3, KDisplayName3, KAddress2, KMsgStorePropertyBcc ); + + //add 3 TOs to message 10, 3 CCs to msg 13, and 3 BCCs to msg 16 + RMsgStoreAddress addr; + CleanupClosePushL( addr ); + addr.iDisplayName.Create(100); + addr.iEmailAddress.Create(100); + + addr.iDisplayName.Copy( KDisplayName1 ); + addr.iEmailAddress.Copy( KAddress1 ); + (*msgs)[10]->AddPropertyL( KMsgStorePropertyTo, addr ) ; + (*msgs)[13]->AddPropertyL( KMsgStorePropertyCc, addr ) ; + (*msgs)[16]->AddPropertyL( KMsgStorePropertyBcc, addr ) ; + + addr.iDisplayName.Copy( KDisplayName2 ); + addr.iEmailAddress.Copy( KAddress2 ); + (*msgs)[10]->AddPropertyL( KMsgStorePropertyTo, addr ) ; + (*msgs)[13]->AddPropertyL( KMsgStorePropertyCc, addr ) ; + (*msgs)[16]->AddPropertyL( KMsgStorePropertyBcc, addr ) ; + + addr.iDisplayName.Copy( KDisplayName3 ); + addr.iEmailAddress.Copy( KAddress3 ); + (*msgs)[10]->AddPropertyL( KMsgStorePropertyTo, addr ) ; + (*msgs)[13]->AddPropertyL( KMsgStorePropertyCc, addr ) ; + (*msgs)[16]->AddPropertyL( KMsgStorePropertyBcc, addr ) ; + + (*msgs)[10]->StorePropertiesL(); + (*msgs)[13]->StorePropertiesL(); + (*msgs)[16]->StorePropertiesL(); + + CleanupStack::PopAndDestroy( &addr ); + } + + RArray<TMsgStoreId> expectedMatches; + + RMsgStoreSearchCriteria criteria; + CleanupClosePushL( criteria ); // +4 + iSearchCriteria = &criteria; + + criteria.AddSearchStringL( _L("no match") ); + criteria.AddSearchStringL( _L("The") ); + criteria.iSortBy = EMsgStoreSortByReceivedDate; + criteria.iSortOrder = EMsgStoreSortDescending; + + //WMT: test "global search". when no filder id is specified, all folders are searched + //search inbox1Id first, than sendFolderId + //criteria.AddFolderId( inbox1Id ); + //criteria.AddFolderId( sentFolderId ); + + criteria.AddResultPropertyL( KMsgStorePropertyReceivedAt ); + criteria.AddResultPropertyL( KMsgStorePropertyFlags ); + criteria.AddResultPropertyL( KMsgStorePropertyMessageSizeOnServer ); + criteria.AddResultPropertyL( KMsgStorePropertyFrom ); + criteria.AddResultPropertyL( KMsgStorePropertySubject ); + + iLog->Log( _L("Case %d: Search for \"%S\" AND \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.SearchStrings()[1], criteria.iSortBy ); + + mailBox1->SearchL( criteria, *this ); + ValidateSearchResults( expectedMatches ); + + //search for "The", using the wild card... + criteria.SearchStrings().ResetAndDestroy(); +// criteria.AddSearchStringL( _L("T?e") ); + criteria.AddSearchStringL( _L("The ") ); //add a space to avoid random match + + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + + expectedMatches.AppendL( inboxMsgs[0]->Id() ); + expectedMatches.AppendL( inboxMsgs[3]->Id() ); + expectedMatches.AppendL( inboxMsgs[4]->Id() ); + expectedMatches.AppendL( inboxMsgs[1]->Id() ); + expectedMatches.AppendL( inboxMsgs[6]->Id() ); + expectedMatches.AppendL( sentMsgs[0]->Id() ); + expectedMatches.AppendL( sentMsgs[3]->Id() ); + expectedMatches.AppendL( sentMsgs[4]->Id() ); + expectedMatches.AppendL( sentMsgs[1]->Id() ); + expectedMatches.AppendL( sentMsgs[6]->Id() ); + expectedMatches.AppendL( deletedMsgs[0]->Id() ); + expectedMatches.AppendL( deletedMsgs[3]->Id() ); + expectedMatches.AppendL( deletedMsgs[4]->Id() ); + expectedMatches.AppendL( deletedMsgs[1]->Id() ); + expectedMatches.AppendL( deletedMsgs[6]->Id() ); + + mailBox1->SearchL( criteria, *this ); + //call validate but ignore extra match that may be generated by the wild card + //because the ramdom message may happen to match the wild card + ValidateSearchResults( expectedMatches, ETrue ); + + //change the sort order + criteria.iSortBy = EMsgStoreSortByFlagStatus; + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + mailBox1->SearchL( criteria, *this ); + //should have the same results as previous serach, just different sort order + ValidateSearchResults( expectedMatches, ETrue ); + + //change the sort order again + criteria.iSortBy = EMsgStoreSortBySize; + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + mailBox1->SearchL( criteria, *this ); + //should have the same results as previous serach, just different sort order + ValidateSearchResults( expectedMatches, ETrue ); + + expectedMatches.Reset(); + + //search for "HURRAY!" + criteria.SearchStrings().ResetAndDestroy(); + criteria.AddSearchStringL( _L("HURRAY!") ); //added '!' to avoid match random string + criteria.iSortBy = EMsgStoreSortBySubject; + + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + + expectedMatches.AppendL( inboxMsgs[1]->Id() ); + expectedMatches.AppendL( inboxMsgs[6]->Id() ); + expectedMatches.AppendL( sentMsgs[1]->Id() ); + expectedMatches.AppendL( sentMsgs[6]->Id() ); + + //search inbox1Id first, than sendFolderId + criteria.AddFolderId( inbox1Id ); + criteria.AddFolderId( sentFolderId ); + + mailBox1->SearchL( criteria, *this ); + ValidateSearchResults( expectedMatches ); + + //change sort order + criteria.iSortBy = EMsgStoreSortByUnRead; + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + mailBox1->SearchL( criteria, *this ); + //should have the same results as previous serach, just different sort order + ValidateSearchResults( expectedMatches ); + expectedMatches.Reset(); + + //search for "()" + criteria.SearchStrings().ResetAndDestroy(); + criteria.AddSearchStringL( _L("()") ); + criteria.iSortBy = EMsgStoreSortBySender; + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + + expectedMatches.AppendL( inboxMsgs[2]->Id() ); + expectedMatches.AppendL( inboxMsgs[5]->Id() ); + expectedMatches.AppendL( inboxMsgs[7]->Id() ); + expectedMatches.AppendL( inboxMsgs[8]->Id() ); + expectedMatches.AppendL( sentMsgs[2]->Id() ); + expectedMatches.AppendL( sentMsgs[5]->Id() ); + expectedMatches.AppendL( sentMsgs[7]->Id() ); + expectedMatches.AppendL( sentMsgs[8]->Id() ); + + mailBox1->SearchL( criteria, *this ); + ValidateSearchResults( expectedMatches ); + + //Change the sort order + criteria.iSortBy = EMsgStoreSortByPriority; + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + //should have the same results as previous serach, just different sort order + mailBox1->SearchL( criteria, *this ); + ValidateSearchResults( expectedMatches ); + + //Change the sort order again + criteria.iSortBy = EMsgStoreSortByAttachment; + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + //should have the same results as previous serach, just different sort order + mailBox1->SearchL( criteria, *this ); + ValidateSearchResults( expectedMatches ); + + expectedMatches.Reset(); + + //search subject fields + criteria.iSortBy = EMsgStoreSortByReceivedDate; + criteria.SearchStrings().ResetAndDestroy(); + criteria.AddSearchStringL( _L("subject ") ); + + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + + expectedMatches.AppendL( inboxMsgs[0]->Id() ); + expectedMatches.AppendL( inboxMsgs[3]->Id() ); + expectedMatches.AppendL( inboxMsgs[4]->Id() ); + expectedMatches.AppendL( sentMsgs[0]->Id() ); + expectedMatches.AppendL( sentMsgs[3]->Id() ); + expectedMatches.AppendL( sentMsgs[4]->Id() ); + for (TInt i=11; i<=19; i++) + { + expectedMatches.AppendL( inboxMsgs[i]->Id() ); + expectedMatches.AppendL( sentMsgs[i]->Id() ); + } + mailBox1->SearchL( criteria, *this ); + ValidateSearchResults( expectedMatches ); + expectedMatches.Reset(); + + //search addresses fields + criteria.SearchStrings().ResetAndDestroy(); + + criteria.AddSearchStringL( _L("fname3") ); + criteria.AddSearchStringL( _L("addr3") ); + + iLog->Log( _L("Case %d: Search for \"%S\" AND \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.SearchStrings()[1], criteria.iSortBy ); + + expectedMatches.AppendL( inboxMsgs[10]->Id() ); + expectedMatches.AppendL( inboxMsgs[13]->Id() ); + expectedMatches.AppendL( inboxMsgs[16]->Id() ); +// expectedMatches.AppendL( inboxMsgs[19]->Id() ); + expectedMatches.AppendL( sentMsgs[10]->Id() ); + expectedMatches.AppendL( sentMsgs[13]->Id() ); + expectedMatches.AppendL( sentMsgs[16]->Id() ); +// expectedMatches.AppendL( sentMsgs[19]->Id() ); + mailBox1->SearchL( criteria, *this ); + ValidateSearchResults( expectedMatches ); + expectedMatches.Reset(); + + //search addresses fields + criteria.SearchStrings().ResetAndDestroy(); + criteria.AddSearchStringL( _L("addr2") ); + + iLog->Log( _L("Case %d: Search for \"%S\", ordered by:%d"), iCaseId++, criteria.SearchStrings()[0], criteria.iSortBy ); + + expectedMatches.AppendL( inboxMsgs[12]->Id() ); + expectedMatches.AppendL( inboxMsgs[15]->Id() ); + expectedMatches.AppendL( inboxMsgs[18]->Id() ); + expectedMatches.AppendL( inboxMsgs[10]->Id() ); + expectedMatches.AppendL( inboxMsgs[13]->Id() ); + expectedMatches.AppendL( inboxMsgs[16]->Id() ); + expectedMatches.AppendL( inboxMsgs[19]->Id() ); + expectedMatches.AppendL( sentMsgs[12]->Id() ); + expectedMatches.AppendL( sentMsgs[15]->Id() ); + expectedMatches.AppendL( sentMsgs[18]->Id() ); + expectedMatches.AppendL( sentMsgs[10]->Id() ); + expectedMatches.AppendL( sentMsgs[13]->Id() ); + expectedMatches.AppendL( sentMsgs[16]->Id() ); + expectedMatches.AppendL( sentMsgs[19]->Id() ); + mailBox1->SearchL( criteria, *this ); + ValidateSearchResults( expectedMatches ); + expectedMatches.Reset(); + + iLog->Log( _L("Case %d: Cancel search"), iCaseId++ ); + + criteria.SearchStrings().ResetAndDestroy(); + criteria.AddSearchStringL( _L("the ") ); + mailBox1->SearchL( criteria, *this ); + mailBox1->CancelSearch(); + for( TInt i = 0; i < 10; i++ ) + { + Yield( 25000 ); + } + CheckCondition( _L("MatchFound not called"), iMatches.Count() == 0 ); + CheckCondition( _L("SearchCompleted not called"), !iSearchCompleted ); + + iLog->Log( _L("Case %d: Cancel search during MatchFound callback"), iCaseId++ ); + + iSessionToCancelSearch = mailBox1; + criteria.SearchStrings().ResetAndDestroy(); + criteria.AddSearchStringL( _L("the ") ); + mailBox1->SearchL( criteria, *this ); + for( TInt i = 0; i < 10; i++ ) + { + Yield( 25000 ); + } + CheckCondition( _L("MatchFound not called again"), iMatches.Count() == 1 ); + CheckCondition( _L("SearchCompleted not called"), !iSearchCompleted ); + iMatches.Reset(); + iSessionToCancelSearch = NULL; + + iLog->Log( _L("Case %d: Large content"), iCaseId++ ); + + _LIT( KFilename, "c:\\content_test.txt" ); + _LIT( KSearchString, "this is the search string" ); + CreateFileL( KFilename, 13000, 'X', KSearchString, 0 ); // beginning of file + ReplaceMessageContentWithFileL( inboxMsgs[0], KFilename ); + CreateFileL( KFilename, 25000, 'X', KSearchString, 15813 ); // middle + ReplaceMessageContentWithFileL( inboxMsgs[1], KFilename ); + CreateFileL( KFilename, 8763, 'X', KSearchString, 8762 ); // end + ReplaceMessageContentWithFileL( inboxMsgs[2], KFilename ); + + // THIS CONSTANT SHOULD BE KEPT CONSISTENT WITH THE SEARCH BUFFER SIZE IN CSearchHandler + const TInt KSearchBufferSize = 2500; + CreateFileL( KFilename, 5000, 'X', KSearchString, KSearchBufferSize/2-2 ); + ReplaceMessageContentWithFileL( sentMsgs[3], KFilename ); + CreateFileL( KFilename, 7500, 'X', KSearchString, KSearchBufferSize-2 ); + ReplaceMessageContentWithFileL( sentMsgs[4], KFilename ); + + criteria.SearchStrings().ResetAndDestroy(); + criteria.AddSearchStringL( KSearchString ); + expectedMatches.AppendL( inboxMsgs[0]->Id() ); + expectedMatches.AppendL( inboxMsgs[1]->Id() ); + expectedMatches.AppendL( inboxMsgs[2]->Id() ); + expectedMatches.AppendL( sentMsgs[3]->Id() ); + expectedMatches.AppendL( sentMsgs[4]->Id() ); + mailBox1->SearchL( criteria, *this ); + ValidateSearchResults( expectedMatches ); + expectedMatches.Reset(); + + iLog->Log( _L("Case %d: Cleanup the search cache"), iCaseId++ ) ; + mailBox1->ClearSearchResultCache(); + + // ERROR CASES + + iLog->Log( _L("Case %d: Error - Search while another search is in progress"), iCaseId++ ) ; + + mailBox1->SearchL( criteria, *this ); + TRAPD( result, mailBox1->SearchL( criteria, *this ) ); + CheckCondition( _L("in use error"), result == KErrInUse ); + + expectedMatches.AppendL( inboxMsgs[0]->Id() ); + expectedMatches.AppendL( inboxMsgs[1]->Id() ); + expectedMatches.AppendL( inboxMsgs[2]->Id() ); + expectedMatches.AppendL( sentMsgs[3]->Id() ); + expectedMatches.AppendL( sentMsgs[4]->Id() ); + ValidateSearchResults( expectedMatches ); + expectedMatches.Reset(); + + iLog->Log( _L("Case %d: Error - Wrong type for folder"), iCaseId++ ) ; + criteria.AddFolderId( 50 ); + + TRAP( result, mailBox1->SearchL( criteria, *this ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + criteria.FolderIds().Reset(); + + criteria.AddFolderId( inbox1Id ); + criteria.AddFolderId( sentFolderId ); + + iLog->Log( _L("Case %d: Error - Zero length search string"), iCaseId++ ) ; + criteria.SearchStrings().ResetAndDestroy(); + + TRAP( result, mailBox1->SearchL( criteria, *this ) ); + CheckCondition( _L("argument error"), result == KErrArgument ); + + deletedMsgs.ResetAndDestroy(); + sentMsgs.ResetAndDestroy(); + inboxMsgs.ResetAndDestroy(); + + iMatches.Reset(); + + mailBox1->ClearSearchResultCache(); + + CleanupStack::PopAndDestroy( 4 ); + //we are done + return ETrue; + } + + +void CSearchTests::MatchFound( CMsgStorePropertyContainer*& aMessage ) + { + iLog->Log( _L(" >> MatchFound" ) ); + + TUint index; + TUint flags = 0; + TInt err; + if ( aMessage->FindProperty( KMsgStorePropertyFlags, index ) ) + { + TRAP( err, flags = aMessage->PropertyValueUint32L( index ) ); + } + + TTime time; + if ( aMessage->FindProperty( KMsgStorePropertyReceivedAt, index ) ) + { + TRAP( err, aMessage->PropertyValueTimeL( index, time ) ); + } + + switch( iSearchCriteria->iSortBy ) + { + case EMsgStoreSortByReceivedDate: + iLog->Log( _L(" msg=%x, folder=%x, received date=%Ld"), aMessage->Id(), aMessage->ParentId(), time.Int64()); + break; + + case EMsgStoreSortBySender: + if ( aMessage->FindProperty( KMsgStorePropertyFrom, index ) ) + { + RMsgStoreAddress address; + TRAP( err, aMessage->PropertyValueAddressL( index, address ) ); + iLog->Log( _L(" msg=%x, folder=%x, from=%S(%S)"), aMessage->Id(), aMessage->ParentId(), &address.iDisplayName, &address.iEmailAddress ); + address.Close(); + } + else + { + iLog->Log( _L(" msg=%x folder=%x"), aMessage->Id(), aMessage->ParentId() ); + } + break; + + case EMsgStoreSortBySubject: + if ( aMessage->FindProperty( KMsgStorePropertySubject, index ) ) + { + TRAP(err, const TDesC& subject = aMessage->PropertyValueDesL( index ) ; + iLog->Log( _L(" msg=%x, folder=%x, subj=%S"), aMessage->Id(), aMessage->ParentId(), &subject ) ); + } + else + { + iLog->Log( _L(" msg=%x, folder=%x"), aMessage->Id(), aMessage->ParentId() ); + } + break; + + case EMsgStoreSortByPriority: + iLog->Log( _L(" msg=%x, folre=%x, priority=%S date=%Ld"), aMessage->Id(), aMessage->ParentId(), (flags & EMsgStoreFlag_Important ? &KHigh : (flags & EMsgStoreFlag_Low ? &KLow : &KNormal )) , time.Int64() ); + break; + + case EMsgStoreSortByFlagStatus: + iLog->Log( _L(" msg=%x, folder=%x, flagStatus=%S date=%Ld"), aMessage->Id(), aMessage->ParentId(), (flags & EMsgStoreFlag_FollowUp ? &KFollowUp : (flags & EMsgStoreFlag_FollowUpComplete ? &KFollowUpComplete : &KNone )), time.Int64()); + break; + + case EMsgStoreSortByUnRead: + { + TInt readUnread = (TInt) flags & ( EMsgStoreFlag_Read | EMsgStoreFlag_Read_Locally ); + iLog->Log( _L(" msg=%x, folder=%x, readFlag=%d date=%Ld"), aMessage->Id(), aMessage->ParentId(), readUnread, time.Int64() ); + } + break; + + case EMsgStoreSortBySize: + { + TUint size = 0; + if ( aMessage->FindProperty( KMsgStorePropertyMessageSizeOnServer, index ) ) + { + TRAP( err, size = aMessage->PropertyValueUint32L( index ) ); + } + iLog->Log( _L(" msg=%x, folder=%x, size=%u date=%Ld"), aMessage->Id(), aMessage->ParentId(), size, time.Int64() ); + } + break; + + case EMsgStoreSortByAttachment: + { + TBool hasAttachment = (flags & EMsgStoreFlag_Attachments > 0 ); + iLog->Log( _L(" msg=%x, folder=%x, attachmentFlag=%d date=%Ld"), aMessage->Id(), aMessage->ParentId(), hasAttachment, time.Int64()); + } + break; + } + + iMatches.Append( aMessage->Id() ); + + if( iSessionToCancelSearch != NULL ) + { + iSessionToCancelSearch->CancelSearch(); + } + + delete aMessage; + aMessage = NULL; + + iLog->Log( _L(" << MatchFound" ) ); + } + +void CSearchTests::SearchCompleted() + { + iLog->Log( _L(" >> SearchCompleted, matches=%i"), iMatches.Count() ); + iSearchCompleted = ETrue; + iLog->Log( _L(" << SearchCompleted" ) ); + } + +void CSearchTests::ValidateSearchResults( RArray<TMsgStoreId>& aExpectedMatches, TBool aIgnoreExtra ) + { + iLog->Log( _L(" >> ValidateSearchResults" ) ); + + while( !iSearchCompleted ) + { + Yield( 1000 ); + } + + TBool matched = ETrue; + for( TInt index = 0; index < aExpectedMatches.Count(); index++ ) + { + TInt foundIndex = iMatches.Find( aExpectedMatches[index] ); + if( foundIndex == KErrNotFound ) + { + iLog->Log( _L(" %x not found"), aExpectedMatches[index] ); + matched = EFalse; + } + } + + if( matched && !aIgnoreExtra ) + { + for( TInt index = 0; index < iMatches.Count(); index++ ) + { + TInt foundIndex = aExpectedMatches.Find( iMatches[index] ); + if( foundIndex == KErrNotFound ) + { + iLog->Log( _L(" %x not expected"), iMatches[index] ); + matched = EFalse; + } + } + } + + if( !matched ) + { + for( TInt index = 0; index < aExpectedMatches.Count(); index++ ) + { + iLog->Log( _L(" expected=%x"), aExpectedMatches[index] ); + } + for( TInt index = 0; index < iMatches.Count(); index++ ) + { + iLog->Log( _L(" found=%x"), iMatches[index] ); + } + } + + CheckCondition( _L("search results matched"), matched ); + + iMatches.Reset(); + + iSearchCompleted = EFalse; + + iLog->Log( _L(" << ValidateSearchResults" ) ); + } + +void CSearchTests::ReplaceMessageContentWithFileL( CMsgStoreMessage* aMessage, const TDesC& aFilename ) + { + RPointerArray<CMsgStoreMessagePart> parts; + aMessage->ChildPartsL( parts ); + + CMsgStoreMessagePart* body = parts[0]; + CMsgStoreMessagePart* plainTextPart = body; + + RPointerArray<CMsgStoreMessagePart> childParts; + body->ChildPartsL( childParts ); + + if ( childParts.Count() > 0 ) + { + plainTextPart = childParts[0]; + } + + plainTextPart->ReplaceContentWithFileL( aFilename ); + + childParts.ResetAndDestroy(); + parts.ResetAndDestroy(); + } + +void CSearchTests::SetSubjectAndAddressL( CMsgStoreMessage* aMessage, const TDesC& aSubject, const TDesC& aDisplayName, const TDesC& aAddress, const TDesC8& aAddressType ) + { + aMessage->AddOrUpdatePropertyL( KMsgStorePropertySubject, aSubject ); + + RMsgStoreAddress addr; + CleanupClosePushL( addr ); + + addr.iDisplayName.Create( aDisplayName ); + addr.iEmailAddress.Create( aAddress ); + + aMessage->AddOrUpdatePropertyL( aAddressType, addr ); + + CleanupStack::PopAndDestroy( &addr ); + aMessage->StorePropertiesL(); + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/ShutdownServerTest.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + +//#include <BAUTILS.H> +#include "ShutdownServerTest.h" +//#include <ismsgstorepropertykeys.h> +//#include "messagestoreclientserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + +CShutdownServerTest* CShutdownServerTest::NewL( CStifLogger* aLog ) + { + CShutdownServerTest* self = new(ELeave) CShutdownServerTest( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CShutdownServerTest::CShutdownServerTest( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CShutdownServerTest::~CShutdownServerTest() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CShutdownServerTest::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CShutdownServerTest::ExecuteL() + { + LogHeader( _L("Shutdown Server") ); + + ShutdownServerL(); + WaitForServerToTerminate(); + + //we are done + return ETrue; + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/SizeTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,170 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class for all test cases class member functions +* +*/ + + +//#include <BAUTILS.H> +#include "SizeTests.h" +//#include <ismsgstorepropertykeys.h> +//#include "messagestoreclientserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + +CSizeTests* CSizeTests::NewL( CStifLogger* aLog ) + { + CSizeTests* self = new(ELeave) CSizeTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CSizeTests::CSizeTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CSizeTests::~CSizeTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CSizeTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CSizeTests::ExecuteL() + { + LogHeader( _L("Size") ); + + CMsgStoreAccount* account = CMsgStoreAccount::NewLC( 1234, KNullDesC ); //+1 + CMsgStoreMailBox* mailBox = iMsgStore->CreateAccountL( *account ); + CleanupStack::PushL( mailBox ); //+2 + + CMsgStorePropertyContainer* bigProperties = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( bigProperties ); //+3 + + TBuf8<1000> buf; + buf.Fill( 'X', 1000 ); + + // 100K properties + for( TInt i = 0; i < 100; i++ ) + { + TBuf8<20> propertyName; + propertyName.Format( _L8("property%i"), &propertyName ); + + bigProperties->AddPropertyL( propertyName, buf ); + } + + iLog->Log( _L("Case %d: Create a folder with big properties"), iCaseId++ ); + + + + TMsgStoreId folderId = mailBox->CreateFolderL( mailBox->Id(), *bigProperties ); + + CMsgStoreFolder* folder = mailBox->FolderL( folderId ); + ComparePropertiesL( *folder, *bigProperties ); + delete folder; + + RPointerArray<CMsgStoreFolder> folders; + mailBox->FoldersL( folders ); + ComparePropertiesL( *folders[folders.Count()-1], *bigProperties ); + folders.ResetAndDestroy(); + + iLog->Log( _L("Case %d: Create a message with big properties"), iCaseId++ ); + + CMsgStoreMessage* message = mailBox->CreateMessageL( folderId, *bigProperties ); + CleanupStack::PushL( message ); //+4 + message->CommitL(); + + CMsgStoreMessage* message2 = mailBox->FetchMessageL( message->Id(), folderId ); + ComparePropertiesL( *message2, *bigProperties ); + delete message2; + + iLog->Log( _L("Case %d: Create an attachment with big properties"), iCaseId++ ); + + CMsgStoreMessagePart* attachment = message->AddChildPartL( *bigProperties ); + CleanupStack::PushL( attachment ); //+5 + + CMsgStoreMessagePart* attachment2 = message->AddChildPartL( *bigProperties ); + ComparePropertiesL( *attachment2, *bigProperties ); + delete attachment2; + + RPointerArray<CMsgStoreMessagePart> attachments; + message->ChildPartsL( attachments ); + ComparePropertiesL( *attachments[0], *bigProperties ); + attachments.ResetAndDestroy(); + + iLog->Log( _L("Case %d: Add large content to message with Appends"), iCaseId++ ); + + buf.Fill( 'C', 1000 ); + for( TInt i = 0; i < 100; i++ ) + { + message->AppendToContentL( buf ); + } // end for + + buf.Copy( _L8("D") ); + message->AppendToContentL( buf ); + + iLog->Log( _L("Case %d: Fetch large content to buffer"), iCaseId++ ); + + RBuf8 heapBuf; + heapBuf.CleanupClosePushL(); //+6 + heapBuf.CreateL( 100002 ); + + message->FetchContentToBufferL( heapBuf ); + + CheckCondition( _L( "content OK"), heapBuf.Length() == 100001 && heapBuf[0] == 'C' && + heapBuf[99999] == 'C' && heapBuf[100000] == 'D' ); + + iLog->Log( _L("Case %d: Fetch large content to file"), iCaseId++ ); + + _LIT( KFilename, "c:\\content_test.txt" ); + message->FetchContentToFileL( KFilename ); + + iLog->Log( _L("Case %d: Add large content to attachment with file"), iCaseId++ ); + + attachment->ReplaceContentWithFileL( KFilename ); + + iLog->Log( _L("Case %d: Fetch large content to buffer"), iCaseId++ ); + + heapBuf.FillZ(); + + message->FetchContentToBufferL( heapBuf ); + + CheckCondition( _L( "content OK"), heapBuf.Length() == 100001 && heapBuf[0] == 'C' && + heapBuf[99999] == 'C' && heapBuf[100000] == 'D' ); + + + CleanupStack::PopAndDestroy(6); + + //we are done + return ETrue; + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/SortTests.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,854 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: implements all sorting related test cases +* +*/ + + +//#include <BAUTILS.H> +#include <e32math.h> +#include <tz.h> +#include "SortTests.h" +//#include <ismsgstorepropertykeys.h> +//#include "messagestoreclientserver.h" + +const TInt32 KOwner1 = 1234; +_LIT(KAccount1, "My Account"); +_LIT(KInbox, "inbox"); + +// ============================ MEMBER FUNCTIONS =============================== + +CSortTests* CSortTests::NewL( CStifLogger* aLog ) + { + CSortTests* self = new(ELeave) CSortTests( aLog ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CSortTests::CSortTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CSortTests::~CSortTests() + { + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CSortTests::ConstructL() + { + CAsyncTestCaseBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// ExecuteL : start executing the test case +// ----------------------------------------------------------------------------- +TBool CSortTests::ExecuteL() + { + LogHeader( _L("Sort") ); + + TInt msgCount = 200; + + iLog->Log( _L(" Create %d messages"), msgCount ); + DoCreateMessagesL( msgCount ); + + //Open Account + CMsgStoreAccount* account = CMsgStoreAccount::NewLC( KOwner1, KAccount1 ); //+1 + CMsgStoreMailBox* mailBox = iMsgStore->OpenAccountL( *account ); + CleanupStack::PushL( mailBox ); //+2 + + TUint total, unread; + mailBox->TotalMessageCountsL( total, unread ); + iLog->Log( _L(" Total msg=%u, unread=%u"), total, unread); + + RPointerArray<CMsgStoreFolder> folders; + + mailBox->FoldersL( mailBox->Id(), folders ); + + TMsgStoreId inboxId = 0; + for ( TInt ii = 0 ; ii < folders.Count() ; ii++ ) + { + CMsgStoreFolder* folder = folders[ii]; + TUint index = 0; + if ( folder->FindProperty( KMsgStorePropertyName, index ) ) + { + if ( folder->PropertyValueDesL( index ) == KInbox ) + { + //found inbox + inboxId = folder->Id(); + break; + } + } + } + folders.ResetAndDestroy(); + + if ( inboxId == 0 ) + { + User::Leave( KErrNotFound ); + } + + + RArray<RMsgStoreSortCriteria> criteriaArray; + RPointerArray<CMsgStoreSortResultIterator> iteratorArray; + RArray<TMsgStoreId> curIdArray; + RArray<TBool> hasMoreArray; + RArray<TMsgStoreIteratorDirection> checkDirectionArray; + RArray<TInt> bucketSizeArray; + +// UpdateText( 2, _L("Start sorting") ); + + RPointerArray<CMsgStorePropertyContainer> results; + + //test each sort by field + for ( TInt i = 0 ; i < 10 ; i++ ) + { + RMsgStoreSortCriteria criteria; + criteria.iFolderId = inboxId; + criteria.AddResultPropertyL( KMsgStorePropertyReceivedAt ); + criteria.AddResultPropertyL( KMsgStorePropertyFlags ); + criteria.AddResultPropertyL( KMsgStorePropertyMessageSizeOnServer ); + criteria.AddResultPropertyL( KMsgStorePropertyFrom ); + criteria.AddResultPropertyL( KMsgStorePropertyTo ); + criteria.AddResultPropertyL( KMsgStorePropertySubject ); + + switch( i ) + { + case 0: + //sort by received date + iLog->Log( _L("Case %d: Sort By: ReceivedData, Order: Desc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortByReceivedDate; + criteria.iSortOrder = EMsgStoreSortDescending; + break; + + case 1: + //sort by EMsgStoreSortByPriority + iLog->Log( _L("Case %d: Sort By: Priority, Order: Desc/Desc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortByPriority; + criteria.iSortOrder = EMsgStoreSortDescending; //primary = DESC + criteria.iSecondarySortOrder = EMsgStoreSortDescending; //secondary = DESC + break; + + case 2: + //sort by EMsgStoreSortByFlagStatus + iLog->Log( _L("Case %d: Sort By: Flag, Order: Desc/Asc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortByFlagStatus; + criteria.iSortOrder = EMsgStoreSortDescending; //Primary = DESC + criteria.iSecondarySortOrder = EMsgStoreSortAscending; //secondary = ASC + break; + + case 3: + //sort by EMsgStoreSortByUnRead + iLog->Log( _L("Case %d: Sort By: Unread, Order: Asc/Desc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortByUnRead; + criteria.iSortOrder = EMsgStoreSortAscending; //Primary = ASC + criteria.iSecondarySortOrder = EMsgStoreSortDescending; //Secondary = DESC + break; + + case 4: + //sort by EMsgStoreSortByAttachment + iLog->Log( _L("Case %d: Sort By: Attachment, Order: Asc/Asc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortByAttachment; + criteria.iSortOrder = EMsgStoreSortAscending; //Primary = ASC + criteria.iSecondarySortOrder = EMsgStoreSortAscending; //Secondary = ASC + break; + + case 5: + //sort by EMsgStoreSortBySize + iLog->Log( _L("Case %d: Sort By: Size, Order: Desc/Desc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortBySize; + criteria.iSortOrder = EMsgStoreSortDescending; //Primary = DESC + criteria.iSecondarySortOrder = EMsgStoreSortDescending; //Secondary = DESC + break; + + case 6: + //sort by EMsgStoreSortBySender + iLog->Log( _L("Case %d: Sort By: Sender, Order: Desc/Desc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortBySender; + criteria.iSortOrder = EMsgStoreSortDescending; //Primary = DESC + criteria.iSecondarySortOrder = EMsgStoreSortDescending; //Secondary = DESC + break; + + case 7: + //sort by EMsgStoreSortByTo + iLog->Log( _L("Case %d: Sort By: Recipient, Order: Desc/Desc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortByRecipient; + criteria.iSortOrder = EMsgStoreSortDescending; //Primary = DESC + criteria.iSecondarySortOrder = EMsgStoreSortDescending; //Secondary = DESC + break; + + case 8: + //sort by EMsgStoreSortBySubject + iLog->Log( _L("Case %d: Sort By: Subject, Order: Asc/Desc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortBySubject; + criteria.iSortOrder = EMsgStoreSortAscending; //Primary = ASC + criteria.iSecondarySortOrder = EMsgStoreSortDescending; //Secondary = DESC + break; + + case 9: + //sort by EMsgStoreSortBySubject + iLog->Log( _L("Case %d: Sort By: Subject, Order: Asc/Desc"), iCaseId++ ); + criteria.iSortBy = EMsgStoreSortBySubject; + criteria.iSortOrder = EMsgStoreSortAscending; //Primary = ASC + criteria.iSecondarySortOrder = EMsgStoreSortDescending; //Secondary = DESC + break; + + default: + break; + } + + criteriaArray.Append( criteria ); + + //set the direction + TMsgStoreIteratorDirection direction = static_cast<TMsgStoreIteratorDirection>(i % 2); //forward (next) or backward (previous) + checkDirectionArray.Append( direction ); + + //initialize currentId, if forward, start from the top, if backward, start from the bottom + TMsgStoreId curId = ( direction == EMsgStoreIteratorForward ) ? KMsgStoreSortResultTop : KMsgStoreSortResultBottom ; + curIdArray.Append( curId ); + + //initialze hasMore to true + hasMoreArray.Append(ETrue); + + CMsgStoreSortResultIterator* iterator = mailBox->SortL( criteria, (i % 2 ? ETrue : EFalse) ); + + for( TInt jj = 0; jj < 10; jj++ ) + { + Yield( 25000 ); + } + + if ( i != 5 && i <= 8 ) + { + iLog->Log( _L("Case %d: Test GroupCountL"), iCaseId++ ); + + RArray<TUint> itemCounts; + CleanupClosePushL( itemCounts ); + TInt count = iterator->GroupCountL( itemCounts ); + iLog->Log( _L(" GroupCount=%d"), count ); + + CleanupStack::PopAndDestroy( &itemCounts ); + } + + TBool hasMore = EFalse; + TInt bucketSize = 20; + + //get the results + do { + results.ResetAndDestroy(); + + TTime startTime; + startTime.HomeTime(); + + TInt startId = curIdArray[i]; + + if ( checkDirectionArray[i] == EMsgStoreIteratorForward ) + { + + if ( i == 9 ) + { + iLog->Log( _L("Case %d: Calling NextL(string)"), iCaseId++ ); + hasMore = iterator->NextL( _L("nzz") , bucketSize, results ); + } + else + { + iLog->Log( _L("Case %d: Calling NextL"), iCaseId++ ); + hasMore = iterator->NextL( curIdArray[i] , bucketSize, results ); + } + } + else + { + if ( i == 9 ) + { + iLog->Log( _L("Case %d: Calling PreviousL(string)"), iCaseId++ ); + hasMore = iterator->PreviousL( _L("nzz") , bucketSize, results ); + } + else + { + iLog->Log( _L("Case %d: Calling PreviousL()"), iCaseId++ ); + hasMore = iterator->PreviousL( curIdArray[i] , bucketSize, results ); + } + } + + iLog->Log( _L(" Comparing results") ); + curIdArray[i] = CompareSortResultsL( criteriaArray[i], checkDirectionArray[i], results ); + + //TEST SkipAndNext() and SkupAndPrevioud + if ( i >= 0 && i <= 8 ) + { + RPointerArray<CMsgStorePropertyContainer> skipResults; + + startTime.HomeTime(); + + TBool hasNextGroup = ETrue; + if ( checkDirectionArray[i] == EMsgStoreIteratorForward ) + { + iLog->Log( _L("Case %d: Testing SkipAndNextL()"), iCaseId++ ); + + hasNextGroup = iterator->SkipAndNextL( startId , bucketSize, skipResults ); + } + else + { + iLog->Log( _L("Case %d: Testing SkipAndPreviousL()"), iCaseId++ ); + + hasNextGroup = iterator->SkipAndPreviousL( startId, bucketSize, skipResults ); + } + iLog->Log( _L(" Skip returns %d"), hasNextGroup); + + iLog->Log( _L(" Comparing results") ); + CompareSortResultsL( criteriaArray[i], checkDirectionArray[i], skipResults ); + skipResults.ResetAndDestroy(); + } + + if ( bucketSize == 100 ) + { + hasMore = EFalse; + } + else + { + bucketSize += 10; + } + + //add a message while there are sorting sessions + if ( bucketSize == 30 ) + { + iLog->Log( _L("Case %d: Add messages while sort session is open"), iCaseId++ ); + CreateRandomMessagesL( mailBox, inboxId, 2, ETrue, ETrue); + } + else if ( bucketSize == 40 ) + { + //delete iMatches[0] + iLog->Log( _L("Case %d: Delete message while sort session is open"), iCaseId++ ); + mailBox->DeleteMessageL( iMatches[0], inboxId ); + } + else if ( bucketSize == 50 ) + { + iLog->Log( _L("Case %d: Update message while sort session is open"), iCaseId++ ); + CMsgStoreMessage* msg = mailBox->FetchMessageL( iMatches[1], inboxId ); + CleanupStack::PushL( msg ); //+msg + + TTime time; + time.HomeTime(); + TInt64 seed = time.Int64(); + + TInt64 date = Math::Rand( seed ); + TTime randTime( date ); + msg->AddOrUpdatePropertyL( KMsgStorePropertyReceivedAt, randTime ); + + TUint32 flags = Math::Rand( seed ); + msg->AddOrUpdatePropertyL( KMsgStorePropertyFlags, (TUint32) flags ); + + TUint32 size = Math::Rand( seed ); + msg->AddOrUpdatePropertyL( KMsgStorePropertyMessageSizeOnServer, (TUint32) size ); + TBuf<30> subject; + CreateRandomString( subject, 30, seed ); + msg->AddOrUpdatePropertyL( KMsgStorePropertySubject, subject ); + + TBuf<6> fname, lname; + CreateRandomString( fname, 6, seed ); + CreateRandomString( lname, 6, seed ); + RMsgStoreAddress address; + address.iDisplayName.Create( 50 ); + address.iEmailAddress.Create( 50 ); + + address.iDisplayName.Format( _L("%S %S"), &fname, &lname ); + address.iEmailAddress.Format( _L("%S.%S@%S"), &fname, &lname, &_L("nokia.com")); + msg->AddOrUpdatePropertyL( KMsgStorePropertyFrom, address ); + + address.iDisplayName.Append(_L("TO")); + msg->AddOrUpdatePropertyL( KMsgStorePropertyTo, address ); + + msg->StorePropertiesL(); + + //iLog->Log( _L(" msgId=%x, flags=%x, size=%d, date=%Ld"), msg->Id(), flags, size, date ); + //iLog->Log( _L(" subject=%S"), &subject ); + + address.Close(); + CleanupStack::PopAndDestroy( msg ); + } + + //update iMatches[1] + + } while ( hasMore ); + + + //testing IdsAndFlags + iLog->Log( _L("Case %d: Testing IdsAndFlagsL()"), iCaseId++ ); + RArray<TMsgStoreIdAndFlag> idsAndFlags; + iterator->IdsAndFlagsL( idsAndFlags ); + + iLog->Log( _L(" IdsAndFlagsL returned %d objects"), idsAndFlags.Count() ); + + idsAndFlags.Reset(); + + //testing get sorted MessageIds + iLog->Log( _L("Case %d: Testing MessageIdsL()"), iCaseId++ ); + RArray<TMsgStoreId> ids; + //start sorting + iterator->MessageIdsL( ids ); + + iLog->Log( _L(" MessageIds returned %d objects"), ids.Count() ); + + ids.Reset(); + + //testing IdsAndGroupCount + iLog->Log( _L("Case %d: Testing IdsAndGroupCountL()"), iCaseId++ ); + RArray<TUint> itemCounts; + CleanupClosePushL( itemCounts ); + + iterator->IdsAndGroupCountL( ids, itemCounts ); + + iLog->Log( _L(" GroupCount=%d"), itemCounts.Count() ); + + //if ( itemCounts.Count() > 0 ) + // { + // TInt needNToBeMod8 = 8 - itemCounts.Count() % 8; + // if ( needNToBeMod8 != 8 ) + // { + // for ( TInt i = 0 ; i < needNToBeMod8 ; i++ ) + // { + // itemCounts.Append(0); + // } + // } + // + // for ( TInt i = 0 ; i < itemCounts.Count() ; i += 8 ) + // { + // iLog->Log( _L(" counts: %d, %d, %d, %d, %d, %d, %d, %d"), + // itemCounts[i], itemCounts[i+1], itemCounts[i+2], itemCounts[i+3], + // itemCounts[i+4], itemCounts[i+5], itemCounts[i+6], itemCounts[i+7] ); + // } + // } + + CleanupStack::PopAndDestroy( &itemCounts ); + + iLog->Log( _L(" MessageIds returned %d objects"), ids.Count() ); + + ids.Reset(); + + iLog->Log( _L("Case %d: Testing IndexOfL()"), iCaseId++ ); + //add a message after the iterator has been created + CreateRandomMessagesL( mailBox, inboxId, 1, ETrue, ETrue ); + TInt index = iterator->IndexOfL( iMatches[0] ); + + iLog->Log( _L(" id=%08x, index=%d"), iMatches[0], index); + + delete iterator; + bucketSizeArray.Append( bucketSize ); + } //end for + + results.ResetAndDestroy(); + iMatches.Reset(); + + + CMsgStoreAccount* account2 = CMsgStoreAccount::NewLC( 9999, _L("") ); //+3 + CMsgStoreMailBox* mailBox2; + TRAPD(err, mailBox2 = iMsgStore->OpenAccountL( *account2 ) ) + if ( err != KErrNone ) + { + mailBox2 = iMsgStore->CreateAccountL( *account2 ); + } + CleanupStack::PushL( mailBox2 ); //+4 + CMsgStorePropertyContainer* prop2 = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( prop2 ); //+5 + + TMsgStoreId folder2; + + for ( TInt i = 0 ; i < 2 ; i++ ) + { + + folder2 = mailBox2->CreateFolderL( mailBox2->Id(), *prop2 ); + + CreateRandomMessagesL( mailBox2, folder2, 50 ); + + criteriaArray[0].iFolderId = folder2; + criteriaArray[criteriaArray.Count()-1].iFolderId = folder2; + + CMsgStoreSortResultIterator* iterator1 = mailBox2->SortL( criteriaArray[0] ); + CMsgStoreSortResultIterator* iterator2 = mailBox2->SortL( criteriaArray[criteriaArray.Count()-1] ); + + iterator1->NextL( KMsgStoreSortResultTop, 20, results ); + CheckCondition( _L("traverse halfway"), results.Count() == 20 ); + results.ResetAndDestroy(); + + //now we have two sort session, one traversed to half way, one not travesed yet + if ( i == 0 ) + { + iLog->Log( _L("Case %d: Testing delete folder while iterator is open"), iCaseId++ ); + //delete the + mailBox2->DeleteFolderL( folder2 ); + } + else + { + //delete the + iLog->Log( _L("Case %d: Testing delete mailbox while iterator is open"), iCaseId++ ); + iMsgStore->DeleteAccountL( *account2 ); + } + + TBool hasMore = iterator1->NextL( KMsgStoreSortResultTop , 20, results ); + CheckCondition( _L("hasMore==EFalse"), !hasMore ); + CheckCondition( _L("no result"), results.Count() == 0 ); + + + hasMore = iterator2->NextL( _L("nzz") , 20, results ); + CheckCondition( _L("hasMore==EFalse"), !hasMore ); + CheckCondition( _L("no result"), results.Count() == 0 ); + + delete iterator1; + delete iterator2; + } + + for ( int i = 0 ; i < criteriaArray.Count() ; i++ ) + { + criteriaArray[i].Close(); + } + + criteriaArray.Close(); + iteratorArray.ResetAndDestroy(); + curIdArray.Close(); + hasMoreArray.Close(); + checkDirectionArray.Close(); + bucketSizeArray.Close(); + + CleanupStack::PopAndDestroy( 5 ); + + //we are done + return ETrue; + } + + +void CSortTests::DoCreateMessagesL( TInt aMsgCount ) + { + iLog->Log( _L(" >> DoCreateMessages") ); + + TBool isNew = ETrue; + + CMsgStore* session = CMsgStore::NewL(); //+1 + CleanupStack::PushL( session ); + + CMsgStoreAccount* account = CMsgStoreAccount::NewLC( KOwner1, KAccount1 ); //+2 + CMsgStoreMailBox* mailBox = NULL; + TRAPD( err, mailBox = session->CreateAccountL( *account ) ); + if ( err != KErrNone ) + { + mailBox = session->OpenAccountL( *account ); + isNew = EFalse; + } + CleanupStack::PushL( mailBox ); //+3 + + TMsgStoreId inboxId; + + if ( isNew ) + { + CMsgStorePropertyContainer* prop = CMsgStorePropertyContainer::NewL(); + CleanupStack::PushL( prop ); + + inboxId = mailBox->CreateFolderL( mailBox->Id(), *prop ); + + CleanupStack::PopAndDestroy( prop ); + + CMsgStoreFolder* folder = mailBox->FolderL( inboxId ); + CleanupStack::PushL( folder ); + + folder->AddPropertyL( KMsgStorePropertyName, KInbox ); + folder->StorePropertiesL(); + + CleanupStack::PopAndDestroy( folder ); + } + else + { + RPointerArray<CMsgStoreFolder> folders; + + mailBox->FoldersL( mailBox->Id(), folders ); + + for ( int i = 0 ; i < folders.Count() ; i++ ) + { + CMsgStoreFolder* folder = folders[i]; + TUint index = 0; + if ( folder->FindProperty( KMsgStorePropertyName, index ) ) + { + if ( folder->PropertyValueDesL( index ) == KInbox ) + { + //found inbox + inboxId = folder->Id(); + break; + } + } + } + folders.ResetAndDestroy(); + } + + CreateRandomMessagesL( mailBox, inboxId, aMsgCount ); + + CleanupStack::PopAndDestroy( 3 ); + iLog->Log( _L(" << DoCreateMessages") ); + } + +TMsgStoreId CSortTests::CompareSortResultsL( RMsgStoreSortCriteria aCriteria, + TMsgStoreIteratorDirection aDirection, + const RPointerArray<CMsgStorePropertyContainer>& aResults ) + { + iLog->Log( _L(" >> CompareSortResultsL") ); + iLog->Log( _L(" result count=%d"), aResults.Count() ); + + TMsgStoreId lastMsgId; + TUint index; + TInt64 curVal1, curVal2, nextVal1, nextVal2; + TUint size; + RBuf curString, nextString; + curString.Create(100); + nextString.Create(100); + TBuf<100> timeString; + + TBool checkSecondaryOrder = EFalse; + TMsgStoreSortOrder compareOrder1, compareOrder2; + + if ( ( aCriteria.iSortOrder == EMsgStoreSortDescending && aDirection == EMsgStoreIteratorForward ) || + ( aCriteria.iSortOrder == EMsgStoreSortAscending && aDirection == EMsgStoreIteratorBackward ) ) + { + compareOrder1 = EMsgStoreSortDescending; + curVal1 = nextVal1 = KMaxTInt64; + curString.AppendFill(TChar('z'), 100); + } + else + { + compareOrder1 = EMsgStoreSortAscending; + curVal1 = nextVal1 = KMinTInt64; + curString.AppendFill(TChar('!'), 100); + } + + if ( aCriteria.iSortBy != EMsgStoreSortByReceivedDate ) + { + checkSecondaryOrder = ETrue; + if ( ( aCriteria.iSecondarySortOrder == EMsgStoreSortDescending && aDirection == EMsgStoreIteratorForward ) || + ( aCriteria.iSecondarySortOrder == EMsgStoreSortAscending && aDirection == EMsgStoreIteratorBackward ) ) + { + compareOrder2 = EMsgStoreSortDescending; + curVal2 = nextVal2 = KMaxTInt64; + } + else + { + compareOrder2 = EMsgStoreSortAscending; + curVal2 = nextVal2 = KMinTInt64; + } + } + + RTz timeZoneServer; + User::LeaveIfError( timeZoneServer.Connect() ); + CleanupClosePushL( timeZoneServer ); //+timeZoneServer + + for ( int i = 0 ; i < aResults.Count() ; i++ ) + { + CMsgStorePropertyContainer* msg = aResults[i]; + + CheckCondition( _L("received date property exists"), msg->FindProperty( KMsgStorePropertyReceivedAt, index ), EFalse ); + TTime time; + msg->PropertyValueTimeL( index, time ); + timeZoneServer.ConvertToLocalTime( time ); + + CheckCondition( _L("flags property exists"), msg->FindProperty( KMsgStorePropertyFlags, index ), EFalse ); + TUint32 flags; + flags = msg->PropertyValueUint32L( index ); + + switch( aCriteria.iSortBy ) + { + case EMsgStoreSortByReceivedDate: + time.FormatL( timeString, _L("%F%M/%D/%Y %H:%T:%S") ); + nextVal1 = time.Int64(); + //iLog->Log( _L(" msg id=%x, received date=%S"), msg->Id(), &timeString); + break; + + case EMsgStoreSortByPriority: + nextVal1 = 0; + if ( flags & EMsgStoreFlag_Important ) + { + nextVal1 = 1; + } + else if ( flags & EMsgStoreFlag_Low ) + { + nextVal1 = -1; + } + nextVal2 = time.Int64(); + break; + + case EMsgStoreSortByFlagStatus: + nextVal1 = 0; + if ( flags & EMsgStoreFlag_FollowUp ) + { + nextVal1 = 2; + } + else if ( flags & EMsgStoreFlag_FollowUpComplete ) + { + nextVal1 = 1; + } + nextVal2 = time.Int64(); + break; + + case EMsgStoreSortByUnRead: + nextVal1 = flags & ( EMsgStoreFlag_Read | EMsgStoreFlag_Read_Locally ); + nextVal2 = time.Int64(); + //iLog->Log( _L(" msg id=%x, readFlag=%Ld date=%Ld"), msg->Id(), nextVal1, nextVal2); + break; + + case EMsgStoreSortByAttachment: + nextVal1 = flags & EMsgStoreFlag_Attachments; + nextVal2 = time.Int64(); + //iLog->Log( _L(" msg id=%x, attachmentFlag=%Ld date=%Ld"), msg->Id(), nextVal1, nextVal2); + break; + + case EMsgStoreSortBySize: + size = 0; + if ( msg->FindProperty( KMsgStorePropertyMessageSizeOnServer, index ) ) + { + size = msg->PropertyValueUint32L( index ); + } + nextVal1 = size; + nextVal2 = time.Int64(); + //iLog->Log( _L(" msg id=%x, size=%Ld date=%Ld"), msg->Id(), nextVal1, nextVal2); + break; + + case EMsgStoreSortBySender: + { + CheckCondition( _L("from property exists"), msg->FindProperty( KMsgStorePropertyFrom, index ), EFalse ); + RMsgStoreAddress address; + msg->PropertyValueAddressL( index, address ); + nextString.Copy( address.iDisplayName ); + nextString.Append( address.iEmailAddress ); + address.Close(); + nextVal2 = time.Int64(); + //iLog->Log( _L(" msg id=%x, date=%Ld from=%S"), msg->Id(), nextVal2, &nextString ); + } + break; + + case EMsgStoreSortByRecipient: + { + CheckCondition( _L("to property exists"), msg->FindProperty( KMsgStorePropertyTo, index ), EFalse ); + RMsgStoreAddress address; + msg->PropertyValueAddressL( index, address ); + nextString.Copy( address.iDisplayName ); + nextString.Append( address.iEmailAddress ); + address.Close(); + nextVal2 = time.Int64(); + //iLog->Log( _L(" msg id=%x, date=%Ld to=%S"), msg->Id(), nextVal2, &nextString ); + } + break; + + case EMsgStoreSortBySubject: + { + CheckCondition( _L("subject property exists"), msg->FindProperty( KMsgStorePropertySubject, index ), EFalse ); + const TDesC& subject = msg->PropertyValueDesL( index ); + nextVal2 = time.Int64(); + //iLog->Log( _L(" msg id=%x, date=%Ld subj=%S"), msg->Id(), nextVal2, &subject ); + + //get rid of the "Alpha:" "AlphaAlpha:" "AlphaAlphaAlpha:" + nextString.Copy( subject ); + TPtr16 ptr = nextString.MidTPtr(0); + TBool prefixFound = ETrue; + while ( prefixFound ) + { + ptr.TrimLeft(); + TInt pos = ptr.Locate( TChar(':') ); + if ( pos > 0 && pos <= 3 ) + { + for ( TInt i = 0; i < pos; i++ ) + { + TChar ch = ptr[i]; + if ( !ch.IsAlpha() ) + { + prefixFound = EFalse; + break; + } + } + if ( prefixFound ) + { + ptr = ptr.Mid( pos + 1 ); + } + } + else + { + prefixFound = EFalse; + } + } + + nextString.Copy( ptr ); + } + break; + + default: + break; + } + + TInt primaryOrder = 0; + if ( aCriteria.iSortBy == EMsgStoreSortBySender || + aCriteria.iSortBy == EMsgStoreSortByRecipient || + aCriteria.iSortBy == EMsgStoreSortBySubject ) + { + primaryOrder = nextString.CompareC( curString, 1, NULL ); + } + else + { + primaryOrder = ( nextVal1 < curVal1 ? -1 : ( nextVal1 == curVal1 ? 0 : 1 ) ); + } + + if ( compareOrder1 == EMsgStoreSortDescending ) + { + CheckCondition( _L("primary order"), primaryOrder <= 0, EFalse ); + } + else + { + CheckCondition( _L("primary order"), primaryOrder >= 0, EFalse ); + } + + if ( checkSecondaryOrder && primaryOrder == 0 ) + { + //compare the secondary order + if ( compareOrder2 == EMsgStoreSortDescending ) + { + CheckCondition( _L("2nd value order"), nextVal2 <= curVal2, EFalse ); + } + else + { + CheckCondition( _L("2nd value order"), nextVal2 >= curVal2, EFalse ); + } + } + + curVal1 = nextVal1; + curVal2 = nextVal2; + curString.Copy( nextString ); + + if ( i == aResults.Count() - 1 ) + { + lastMsgId = msg->Id(); + } + } + + CleanupStack::PopAndDestroy( &timeZoneServer ); + + curString.Close(); + nextString.Close(); + + iLog->Log( _L(" << CompareSortResultsL - PASSED") ); + + return lastMsgId; + + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/t_msgstore.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,443 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: t_msgstore class member functions +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <Stiftestinterface.h> +#include "t_msgstore.h" +#include <SettingServerClient.h> + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ?function_name ?description. +// ?description +// Returns: ?value_1: ?description +// ?value_n: ?description_line1 +// ?description_line2 +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg) // ?description + { + + ?code // ?comment + + // ?comment + ?code + } +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Ct_msgstore::Ct_msgstore +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +Ct_msgstore::Ct_msgstore() + { + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::ConstructL +// Symbian 2nd phase constructor can leave. +// +// Note: If OOM test case uses STIF Logger, then STIF Logger must be created +// with static buffer size parameter (aStaticBufferSize). Otherwise Logger +// allocates memory from heap and therefore causes error situations with OOM +// testing. For more information about STIF Logger construction, see STIF Users +// Guide. +// ----------------------------------------------------------------------------- +// +void Ct_msgstore::ConstructL() + { + //Read logger settings to check whether test case name is to be + //appended to log file name. + RSettingServer settingServer; + TInt ret = settingServer.Connect(); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Struct to StifLogger settigs. + TLoggerSettings loggerSettings; + // Parse StifLogger defaults from STIF initialization file. + ret = settingServer.GetLoggerSettings(loggerSettings); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Close Setting server session + settingServer.Close(); + iAddTestCaseTitleToLogName = loggerSettings.iAddTestCaseTitle; + + iStdLog = CStifLogger::NewL( Kt_msgstoreLogPath, + Kt_msgstoreLogFile); + iLog = iStdLog; + + // Sample how to use logging + _LIT( KLogStart, "t_msgstore logging starts!" ); + iLog->Log( KLogStart ); + + iVersionLogged = EFalse; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +Ct_msgstore* Ct_msgstore::NewL() + { + Ct_msgstore* self = new (ELeave) Ct_msgstore; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + + } + +// Destructor +Ct_msgstore::~Ct_msgstore() + { + iLog = NULL; + delete iStdLog; + iStdLog = NULL; + delete iTCLog; + iTCLog = NULL; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::InitL +// InitL is used to initialize the Test Module. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::InitL( + TFileName& /*aIniFile*/, + TBool /*aFirstTime*/ ) + { + return KErrNone; + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::GetTestCasesL +// GetTestCases is used to inquire test cases from the Test Module. Test +// cases are stored to array of test cases. The Test Framework will be +// the owner of the data in the RPointerArray after GetTestCases return +// and it does the memory deallocation. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::GetTestCasesL( + const TFileName& /*aConfig*/, + RPointerArray<TTestCaseInfo>& aTestCases ) + { + + // Loop through all test cases and create new + // TTestCaseInfo items and append items to aTestCase array + for( TInt i = 0; Case(i).iMethod != NULL; i++ ) + { + + // Allocate new TTestCaseInfo from heap for a testcase definition. + TTestCaseInfo* newCase = new( ELeave ) TTestCaseInfo(); + + // PushL TTestCaseInfo to CleanupStack. + CleanupStack::PushL( newCase ); + + // Set number for the testcase. + // When the testcase is run, this comes as a parameter to RunTestCaseL. + newCase->iCaseNumber = i; + + // Set title for the test case. This is shown in UI to user. + newCase->iTitle.Copy( Case(i).iCaseName ); + + // Append TTestCaseInfo to the testcase array. After appended + // successfully the TTestCaseInfo object is owned (and freed) + // by the TestServer. + User::LeaveIfError(aTestCases.Append ( newCase ) ); + + // Pop TTestCaseInfo from the CleanupStack. + CleanupStack::Pop( newCase ); + + } + + return KErrNone; + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::RunTestCaseL +// RunTestCaseL is used to run an individual test case specified +// by aTestCase. Test cases that can be run may be requested from +// Test Module by GetTestCases method before calling RunTestCase. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::RunTestCaseL( + const TInt aCaseNumber, + const TFileName& /*aConfig*/, + TTestResult& aResult ) + { + if(!iVersionLogged) + { + SendTestModuleVersion(); + iVersionLogged = ETrue; + } + + // Return value + TInt execStatus = KErrNone; + + // Get the pointer to test case function + TCaseInfo tmp = Case ( aCaseNumber ); + + _LIT( KLogStartTC, "Starting testcase [%S]" ); + iLog->Log( KLogStartTC, &tmp.iCaseName); + + // Check that case number was valid + if ( tmp.iMethod != NULL ) + { + //Open new log file with test case title in file name + if(iAddTestCaseTitleToLogName) + { + //Delete test case logger if exists + if(iTCLog) + { + delete iTCLog; + iTCLog = NULL; + } + + TFileName logFileName; + TName title; + TestModuleIf().GetTestCaseTitleL(title); + + logFileName.Format(Kt_msgstoreLogFileWithTitle, &title); + + iTCLog = CStifLogger::NewL(Kt_msgstoreLogPath, + logFileName); + iLog = iTCLog; + } + + // Valid case was found, call it via function pointer + iMethod = tmp.iMethod; + //execStatus = ( this->*iMethod )( aResult ); + TRAPD(err, execStatus = ( this->*iMethod )( aResult )); + if(iAddTestCaseTitleToLogName) + { + //Restore standard log and destroy test case logger + iLog = iStdLog; + delete iTCLog; //Close test case log + iTCLog = NULL; + } + User::LeaveIfError(err); + } + else + { + // Valid case was not found, return error. + execStatus = KErrNotFound; + } + + // Return case execution status (not the result of the case execution) + return execStatus; + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::OOMTestQueryL +// Used to check if a particular test case should be run in OOM conditions and +// which memory allocations should fail. +// ----------------------------------------------------------------------------- +// +TBool Ct_msgstore::OOMTestQueryL( + const TFileName& /* aTestCaseFile */, + const TInt aCaseNumber, + TOOMFailureType& /* aFailureType */, + TInt& aFirstMemFailure, + TInt& aLastMemFailure ) + { + _LIT( KLogOOMTestQueryL, "Ct_msgstore::OOMTestQueryL" ); + iLog->Log( KLogOOMTestQueryL ); + + aFirstMemFailure = Case( aCaseNumber ).iFirstMemoryAllocation; + aLastMemFailure = Case( aCaseNumber ).iLastMemoryAllocation; + + return Case( aCaseNumber ).iIsOOMTest; + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::OOMTestInitializeL +// Used to perform the test environment setup for a particular OOM test case. +// Test Modules may use the initialization file to read parameters for Test +// Module initialization but they can also have their own configure file or +// some other routine to initialize themselves. +// +// NOTE: User may add implementation for OOM test environment initialization. +// Usually no implementation is required. +// ----------------------------------------------------------------------------- +// +void Ct_msgstore::OOMTestInitializeL( + const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */ ) + { + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::OOMHandleWarningL +// In some cases the heap memory allocation should be skipped, either due to +// problems in the OS code or components used by the code being tested, or even +// inside the tested components which are implemented this way on purpose (by +// design), so it is important to give the tester a way to bypass allocation +// failures. +// +// NOTE: User may add implementation for OOM test warning handling. Usually no +// implementation is required. +// ----------------------------------------------------------------------------- +// +void Ct_msgstore::OOMHandleWarningL( + const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */, + TInt& /* aFailNextValue */ ) + { + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::OOMTestFinalizeL +// Used to perform the test environment cleanup for a particular OOM test case. +// +// NOTE: User may add implementation for OOM test environment finalization. +// Usually no implementation is required. +// ----------------------------------------------------------------------------- +// +void Ct_msgstore::OOMTestFinalizeL( + const TFileName& /* aTestCaseFile */, + const TInt /* aCaseNumber */ ) + { + } + +//----------------------------------------------------------------------------- +// Ct_msgstore::SendTestModuleVersion +// Method used to send version of test module +//----------------------------------------------------------------------------- +// +void Ct_msgstore::SendTestModuleVersion() + { + TVersion moduleVersion; + moduleVersion.iMajor = TEST_MODULE_VERSION_MAJOR; + moduleVersion.iMinor = TEST_MODULE_VERSION_MINOR; + moduleVersion.iBuild = TEST_MODULE_VERSION_BUILD; + + TFileName moduleName; + moduleName = _L("t_msgstore.dll"); + + TBool newVersionOfMethod = ETrue; + TestModuleIf().SendTestModuleVersion(moduleVersion, moduleName, newVersionOfMethod); + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// LibEntryL is a polymorphic Dll entry point +// Returns: CTestModuleBase*: Pointer to Test Module object +// ----------------------------------------------------------------------------- +// +EXPORT_C CTestModuleBase* LibEntryL() + { + return Ct_msgstore::NewL(); + + } + +// ----------------------------------------------------------------------------- +// SetRequirements handles test module parameters(implements evolution +// version 1 for test module's heap and stack sizes configuring). +// Returns: TInt: Symbian error code. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt SetRequirements( CTestModuleParam*& /*aTestModuleParam*/, + TUint32& /*aParameterValid*/ ) + { + + /* --------------------------------- NOTE --------------------------------- + USER PANICS occurs in test thread creation when: + 1) "The panic occurs when the value of the stack size is negative." + 2) "The panic occurs if the minimum heap size specified is less + than KMinHeapSize". + KMinHeapSize: "Functions that require a new heap to be allocated will + either panic, or will reset the required heap size to this value if + a smaller heap size is specified". + 3) "The panic occurs if the minimum heap size specified is greater than + the maximum size to which the heap can grow". + Other: + 1) Make sure that your hardware or Symbian OS is supporting given sizes. + e.g. Hardware might support only sizes that are divisible by four. + ------------------------------- NOTE end ------------------------------- */ + + // Normally STIF uses default heap and stack sizes for test thread, see: + // KTestThreadMinHeap, KTestThreadMinHeap and KStackSize. + // If needed heap and stack sizes can be configured here by user. Remove + // comments and define sizes. + +/* + aParameterValid = KStifTestModuleParameterChanged; + + CTestModuleParamVer01* param = CTestModuleParamVer01::NewL(); + // Stack size + param->iTestThreadStackSize= 16384; // 16K stack + // Heap sizes + param->iTestThreadMinHeap = 4096; // 4K heap min + param->iTestThreadMaxHeap = 1048576;// 1M heap max + + aTestModuleParam = param; +*/ + return KErrNone; + + } + + +// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/tsrc/message_store_test/src/t_msgstoreCases.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,629 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: implementation of test cases methods. +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include <e32math.h> +#include "t_msgstore.h" +#include "mailboxtests.h" +#include "propertytests.h" +#include "foldertests.h" +#include "messagetests.h" +#include "parttests.h" +#include "observertests.h" +#include "contenttests.h" +#include "mrutests.h" +#include "searchtests.h" +#include "sorttests.h" +#include "sizetests.h" +#include "DbCorruptTests.h" +#include "shutdownservertest.h" +#include "EncryptionTests.h" + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ?function_name ?description. +// ?description +// Returns: ?value_1: ?description +// ?value_n: ?description_line1 +// ?description_line2 +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg) // ?description + { + + ?code // ?comment + + // ?comment + ?code + } +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Ct_msgstore::Case +// Returns a test case by number. +// +// This function contains an array of all available test cases +// i.e pair of case name and test function. If case specified by parameter +// aCaseNumber is found from array, then that item is returned. +// +// The reason for this rather complicated function is to specify all the +// test cases only in one place. It is not necessary to understand how +// function pointers to class member functions works when adding new test +// cases. See function body for instructions how to add new test case. +// ----------------------------------------------------------------------------- +// +const TCaseInfo Ct_msgstore::Case ( + const TInt aCaseNumber ) const + { + + /** + * To add new test cases, implement new test case function and add new + * line to KCases array specify the name of the case and the function + * doing the test case + * In practice, do following + * 1) Make copy of existing test case function and change its name + * and functionality. Note that the function must be added to + * t_msgstore.cpp file and to t_msgstore.h + * header file. + * + * 2) Add entry to following KCases array either by using: + * + * 2.1: FUNCENTRY or ENTRY macro + * ENTRY macro takes two parameters: test case name and test case + * function name. + * + * FUNCENTRY macro takes only test case function name as a parameter and + * uses that as a test case name and test case function name. + * + * Or + * + * 2.2: OOM_FUNCENTRY or OOM_ENTRY macro. Note that these macros are used + * only with OOM (Out-Of-Memory) testing! + * + * OOM_ENTRY macro takes five parameters: test case name, test case + * function name, TBool which specifies is method supposed to be run using + * OOM conditions, TInt value for first heap memory allocation failure and + * TInt value for last heap memory allocation failure. + * + * OOM_FUNCENTRY macro takes test case function name as a parameter and uses + * that as a test case name, TBool which specifies is method supposed to be + * run using OOM conditions, TInt value for first heap memory allocation + * failure and TInt value for last heap memory allocation failure. + */ + + static TCaseInfoInternal const KCases[] = + { + // [test cases entries] - do not remove + + // NOTE: When compiled to GCCE, there must be Classname:: + // declaration in front of the method name, e.g. + // Ct_msgstore::PrintTest. Otherwise the compiler + // gives errors. + ENTRY( "Mailbox Tests", Ct_msgstore::MailboxTestsL ), + ENTRY( "Property Tests", Ct_msgstore::PropertyTestsL ), + ENTRY( "Folder Tests", Ct_msgstore::FolderTestsL ), + ENTRY( "Message Tests", Ct_msgstore::MessageTestsL ), + ENTRY( "Database Corruption Test", Ct_msgstore::DbCorruptTestsL ), + ENTRY( "Part Tests", Ct_msgstore::PartTestsL ), + ENTRY( "Observer Tests", Ct_msgstore::ObserverTestsL ), + ENTRY( "Content Tests", Ct_msgstore::ContentTestsL ), + ENTRY( "Mru Tests", Ct_msgstore::MruTestsL ), + ENTRY( "Search Tests", Ct_msgstore::SearchTestsL ), + ENTRY( "Sort Tests", Ct_msgstore::SortTestsL ), + ENTRY( "Encryption Tests", Ct_msgstore::EncryptionTestsL ), + ENTRY( "Size Tests", Ct_msgstore::SizeTestsL ), + // Example how to use OOM functionality + //OOM_ENTRY( "Loop test with OOM", Ct_msgstore::LoopTest, ETrue, 2, 3), + //OOM_FUNCENTRY( Ct_msgstore::PrintTest, ETrue, 1, 3 ), + }; + + // Verify that case number is valid + if( (TUint) aCaseNumber >= sizeof( KCases ) / + sizeof( TCaseInfoInternal ) ) + { + // Invalid case, construct empty object + TCaseInfo null( (const TText*) L"" ); + null.iMethod = NULL; + null.iIsOOMTest = EFalse; + null.iFirstMemoryAllocation = 0; + null.iLastMemoryAllocation = 0; + return null; + } + + // Construct TCaseInfo object and return it + TCaseInfo tmp ( KCases[ aCaseNumber ].iCaseName ); + tmp.iMethod = KCases[ aCaseNumber ].iMethod; + tmp.iIsOOMTest = KCases[ aCaseNumber ].iIsOOMTest; + tmp.iFirstMemoryAllocation = KCases[ aCaseNumber ].iFirstMemoryAllocation; + tmp.iLastMemoryAllocation = KCases[ aCaseNumber ].iLastMemoryAllocation; + return tmp; + + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::MailboxTests +// Test Mailbox operations. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::MailboxTestsL( TTestResult& aResult ) + { + _LIT( KMailboxTests, "Mailbox Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KMailboxTests, KEnter ); + + // Run test cases + CMailboxTests* testCase = CMailboxTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KMailboxTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Mailbox tests passed" ); + _LIT( KFailDescription, "Mailbox tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::PropertyTests +// Test Property related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::PropertyTestsL( TTestResult& aResult ) + { + _LIT( KPropertyTests, "Property Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KPropertyTests, KEnter ); + + // Run test cases + CPropertyTests* testCase = CPropertyTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KPropertyTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Property tests passed" ); + _LIT( KFailDescription, "Property tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::FolderTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::FolderTestsL( TTestResult& aResult ) + { + _LIT( KFolderTests, "Folder Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KFolderTests, KEnter ); + + // Run test cases + CFolderTests* testCase = CFolderTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KFolderTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Folder tests passed" ); + _LIT( KFailDescription, "Folder tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::MessageTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::MessageTestsL( TTestResult& aResult ) + { + _LIT( KMessageTests, "Message Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KMessageTests, KEnter ); + + // Run test cases + CMessageTests* testCase = CMessageTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KMessageTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Message tests passed" ); + _LIT( KFailDescription, "Message tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// Ct_msgstore::PartTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::PartTestsL( TTestResult& aResult ) + { + _LIT( KPartTests, "Part Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KPartTests, KEnter ); + + // Run test cases + CPartTests* testCase = CPartTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KPartTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Part tests passed" ); + _LIT( KFailDescription, "Part tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::ObserverTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::ObserverTestsL( TTestResult& aResult ) + { + _LIT( KObserverTests, "Observer Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KObserverTests, KEnter ); + + // Run test cases + CObserverTests* testCase = CObserverTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KObserverTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Observer tests passed" ); + _LIT( KFailDescription, "Observer tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::ContentTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::ContentTestsL( TTestResult& aResult ) + { + _LIT( KContentTests, "Content Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KContentTests, KEnter ); + + // Run test cases + CContentTests* testCase = CContentTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KContentTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Content tests passed" ); + _LIT( KFailDescription, "Content tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// Ct_msgstore::MruTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::MruTestsL( TTestResult& aResult ) + { + _LIT( KMruTests, "Mru Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KMruTests, KEnter ); + + // Run test cases + CMruTests* testCase = CMruTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KMruTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "MRU tests passed" ); + _LIT( KFailDescription, "MRU tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::SearchTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::SearchTestsL( TTestResult& aResult ) + { + _LIT( KSearchTests, "Search Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KSearchTests, KEnter ); + + // Run test cases + CSearchTests* testCase = CSearchTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KSearchTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Search tests passed" ); + _LIT( KFailDescription, "Search tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::SortTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::SortTestsL( TTestResult& aResult ) + { + _LIT( KSortTests, "Sort Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KSortTests, KEnter ); + + // Run test cases + CSortTests* testCase = CSortTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KSortTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Sort tests passed" ); + _LIT( KFailDescription, "Sort tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::SizeTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::EncryptionTestsL( TTestResult& aResult ) + { + _LIT( KEncryptionTests, "Encryption Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KEncryptionTests, KEnter ); + + // Run test cases + CEncryptionTests* testCase = CEncryptionTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KEncryptionTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Encryption tests passed" ); + _LIT( KFailDescription, "Encryption tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::SizeTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::SizeTestsL( TTestResult& aResult ) + { + _LIT( KSizeTests, "Size Tests" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KSizeTests, KEnter ); + + // Run test cases + CSizeTests* testCase = CSizeTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KSizeTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Size tests passed" ); + _LIT( KFailDescription, "Size tests failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Ct_msgstore::DbCorruptTests +// Test Folder related features. +// ----------------------------------------------------------------------------- +// +TInt Ct_msgstore::DbCorruptTestsL( TTestResult& aResult ) + { + _LIT( KDbCorruptTests, "Database Corruption Test" ); + _LIT( KEnter, "Enter" ); + _LIT( KExit, "Exit" ); + + TestModuleIf().Printf( 0, KDbCorruptTests, KEnter ); + + // Run test cases + CDbCorruptTests* testCase = CDbCorruptTests::NewL( iLog ); + CActiveScheduler::Start(); + + TInt result = testCase->Result(); + + delete testCase; + + TestModuleIf().Printf( 0, KDbCorruptTests, KExit ); + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KPassDescription, "Database Corruption Tests test passed" ); + _LIT( KFailDescription, "Database Corruption Tests test failed" ); + aResult.SetResult( result, (result==KErrNone ? KPassDescription : KFailDescription) ); + + // Case was executed + return KErrNone; + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// ?function_name implements... +// ?implementation_description. +// Returns: ?value_1: ?description +// ?value_n: ?description +// ?description +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg ) // ?description + { + + ?code + + } +*/ +// [End of File] - do not remove
--- a/emailuis/emailui/data/FreestyleEmailUi.rss Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/data/FreestyleEmailUi.rss Thu Jan 07 12:38:38 2010 +0200 @@ -304,10 +304,9 @@ AVKON_BUTTON_STATE { helptxt = qtn_fse_message_list_options_expand_all; - txt = qtn_fse_message_list_options_expand_all; -// bmpfile = EMAILUI_ICON_FILE; -// bmpid=EMbmFreestyleemailuiQgn_indi_tb_expand_all; -// bmpmask=EMbmFreestyleemailuiQgn_indi_tb_expand_all_mask; + bmpfile = EMAILUI_ICON_FILE; + bmpid=EMbmFreestyleemailuiQgn_indi_tb_expand_all; + bmpmask=EMbmFreestyleemailuiQgn_indi_tb_expand_all_mask; } }; }; @@ -324,10 +323,9 @@ AVKON_BUTTON_STATE { helptxt = qtn_fse_message_list_options_collapse_all; - txt = qtn_fse_message_list_options_collapse_all; -// bmpfile = EMAILUI_ICON_FILE; -// bmpid=EMbmFreestyleemailuiQgn_indi_tb_collapse_all; -// bmpmask=EMbmFreestyleemailuiQgn_indi_tb_collapse_all_mask; + bmpfile = EMAILUI_ICON_FILE; + bmpid=EMbmFreestyleemailuiQgn_indi_tb_collapse_all; + bmpmask=EMbmFreestyleemailuiQgn_indi_tb_collapse_all_mask; } }; }; @@ -496,39 +494,25 @@ } }; }; - }, - TBAR_CTRL - { - type = EAknCtButton; - id = EFsEmailUiTbCmdForward; - control = AVKON_BUTTON - { - flags = KAknButtonRequestExitOnButtonUpEvent; - states = - { - AVKON_BUTTON_STATE - { - txt = qtn_fse_tb_ext_forward; - bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_forward; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_forward_mask; - } - }; - }; - } + } }; // eof extension items }; // eof AVKON_TOOLBAR_EXTENSION control }, TBAR_CTRL { type = EAknCtButton; + id = EFsEmailUiTbCmdForward; control = AVKON_BUTTON { - flags = KAknButtonSizeFitText; + flags = KAknButtonRequestExitOnButtonUpEvent; states = { AVKON_BUTTON_STATE { + helptxt = qtn_fse_tb_ext_forward; + bmpfile = EMAILUI_ICON_FILE; + bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_forward; + bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_forward_mask; } }; }; @@ -567,60 +551,8 @@ { TBAR_CTRL { - type = EAknCtToolbarExtension; - id = EFsEmailUiTbCmdActions; - control = AVKON_TOOLBAR_EXTENSION - { - helptxt = qtn_fse_tb_actions; - bmpFile = EMAILUI_ICON_FILE; - bmpId = EMbmFreestyleemailuiQgn_indi_tb_email_extend; - bmpMask = EMbmFreestyleemailuiQgn_indi_tb_email_extend_mask; - items = - { - TBAR_CTRL - { - type = EAknCtButton; - id = EFsEmailUiTbCmdReply; - control = AVKON_BUTTON - { - flags = KAknButtonSizeFitText; - states = - { - AVKON_BUTTON_STATE - { - txt = qtn_fse_tb_ext_reply; - bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_reply; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_reply_mask; - } - }; - }; - }, - TBAR_CTRL - { - type = EAknCtButton; - id = EFsEmailUiTbCmdForward; - control = AVKON_BUTTON - { - flags = KAknButtonRequestExitOnButtonUpEvent; - states = - { - AVKON_BUTTON_STATE - { - txt = qtn_fse_tb_ext_forward; - bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_forward; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_forward_mask; - } - }; - }; - } - }; // eof extension items - }; // eof AVKON_TOOLBAR_EXTENSION control - }, - TBAR_CTRL - { type = EAknCtButton; + id = EFsEmailUiTbCmdReply; control = AVKON_BUTTON { flags = KAknButtonSizeFitText; @@ -628,6 +560,29 @@ { AVKON_BUTTON_STATE { + helptxt = qtn_fse_tb_ext_reply; + bmpfile = EMAILUI_ICON_FILE; + bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_reply; + bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_reply_mask; + } + }; + }; + }, + TBAR_CTRL + { + type = EAknCtButton; + id = EFsEmailUiTbCmdForward; + control = AVKON_BUTTON + { + flags = KAknButtonRequestExitOnButtonUpEvent; + states = + { + AVKON_BUTTON_STATE + { + helptxt = qtn_fse_tb_ext_forward; + bmpfile = EMAILUI_ICON_FILE; + bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_forward; + bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_forward_mask; } }; }; @@ -1002,6 +957,7 @@ RESOURCE TBUF r_freestyle_email_fetch_from_remote_query { buf=qtn_fse_query_no_phone_number_found_search_server; } RESOURCE TBUF r_freestyle_email_query_sync_status_go_online { buf=qtn_fse_launcher_options_go_online; } RESOURCE TBUF r_freestyle_email_query_sync_status_go_offline { buf=qtn_fse_launcher_options_go_offline; } +RESOURCE TBUF r_freestyle_email_mail_deleted { buf=qtn_fse_mail_deleted_note; } // ** Added 26.2.2008 ** RESOURCE TBUF r_freestyle_email_confirm_note_sending_queued { buf=qtn_fse_confirm_note_sending_queued; } RESOURCE TBUF r_freestyle_email_confirm_note_queued_until_online { buf=qtn_fse_confirm_note_queued_until_online; } @@ -1157,7 +1113,7 @@ RESOURCE TBUF r_freestyle_email_ui_dropdown_list_drafts { buf=qtn_fse_message_list_draft; } RESOURCE TBUF r_freestyle_email_ui_dropdown_list_sent { buf=qtn_fse_message_list_sent; } RESOURCE TBUF r_freestyle_email_ui_dropdown_list_deleted { buf=qtn_fse_message_list_deleted_items; } -RESOURCE TBUF r_freestyle_email_ui_dropdown_list_more_folders { buf=gtn_cmail_command_area_select_folders; } +RESOURCE TBUF r_freestyle_email_ui_dropdown_list_more_folders { buf=qtn_cmail_command_area_select_folders; } RESOURCE TBUF r_freestyle_email_ui_folder_list_message_count { buf=qtn_fse_folder_list_message_count; } RESOURCE TBUF r_freestyle_email_ui_folder_list_message_count_with_unread { buf=qtn_fse_folder_list_message_count_with_unread; } @@ -2756,6 +2712,11 @@ { buf = qtn_mail_launcher_settings_delete_multiple_mailboxes_query; } + +RESOURCE TBUF r_command_area_new_email + { + buf = qtn_cmail_command_area_new; + } // ----------------------------------------------------------------------------- // r_delete_mailboxes_multi_selection_query @@ -2831,6 +2792,24 @@ } }; } + +//----------------------------------------------------------------------------- +// Stylus long tap pop-up menu in launcher grid view. +//----------------------------------------------------------------------------- +// +RESOURCE STYLUS_POPUP_MENU r_stylus_popup_menu_launcher_grid_view + { + items = + { + STYLUS_POPUP_MENU_ITEM + { + // Delete mailbox. + txt = qtn_mail_options_delete_mailbox; + command = EFsEmailUiCmdDeleteSelectedMailbox; + } + }; + } + #include "FreestyleEmailUiGlobalSettings.rssi" #include "FreestyleEmailUiSettingsList.rssi" #include "FreestyleEmailUiSendAttachmentList.rssi"
--- a/emailuis/emailui/data/html/email.html Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/data/html/email.html Thu Jan 07 12:38:38 2010 +0200 @@ -1,10 +1,10 @@ <html> -<frameset rows="10%,*" border=0> +<frameset rows="10%,*" border=0 id="headerBody"> <frame src="header.html" > <frame src="temp/body.html" > </frameset> -</html> \ No newline at end of file +</html>
--- a/emailuis/emailui/data/html/header.js Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/data/html/header.js Thu Jan 07 12:38:38 2010 +0200 @@ -1,11 +1,13 @@ function collapseHeader() { handleHeaderDisplay( "header_table", "table_initial" ) + parent.document.getElementById('headerBody').rows = '10%,*'; } function expandHeader() { handleHeaderDisplay( "table_initial", "header_table" ) + parent.document.getElementById('headerBody').rows = '40%,*'; } function handleHeaderDisplay( tableToHide, tableToShow )
--- a/emailuis/emailui/data/iconlist.txt Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/data/iconlist.txt Thu Jan 07 12:38:38 2010 +0200 @@ -61,6 +61,8 @@ -c16,8 qgn_indi_cmail_unread_replied_high_prio.svg -c16,8 qgn_indi_cmail_unread_replied_low_prio.svg -c16,8 qgn_indi_cmail_attachment.svg +-c16,8 qgn_indi_navi_follow_up_complete.svg +-c16,8 qgn_indi_navi_follow_up.svg -c16,8 qgn_indi_cmail_viewer_follow_up_complete.svg -c16,8 qgn_indi_cmail_viewer_follow_up.svg -c16,8 qgn_indi_cmail_launcher_info.svg @@ -164,3 +166,19 @@ -c16,8 qgn_prop_group_collapsed.svg -c16,8 qgn_indi_tb_email_extend.svg -c16,8 qgn_indi_tb_email_reply_all.svg +-c16,8 qgn_prop_email_sort_attach_asc.svg +-c16,8 qgn_prop_email_sort_attach_desc.svg +-c16,8 qgn_prop_email_sort_date_asc.svg +-c16,8 qgn_prop_email_sort_date_desc.svg +-c16,8 qgn_prop_email_sort_follow_asc.svg +-c16,8 qgn_prop_email_sort_follow_desc.svg +-c16,8 qgn_prop_email_sort_priority_asc.svg +-c16,8 qgn_prop_email_sort_priority_desc.svg +-c16,8 qgn_prop_email_sort_sender_asc.svg +-c16,8 qgn_prop_email_sort_sender_desc.svg +-c16,8 qgn_prop_email_sort_subject_asc.svg +-c16,8 qgn_prop_email_sort_subject_desc.svg +-c16,8 qgn_prop_email_sort_unread_asc.svg +-c16,8 qgn_prop_email_sort_unread_desc.svg +-c16,8 qgn_indi_tb_collapse_all.svg +-c16,8 qgn_indi_tb_expand_all.svg
--- a/emailuis/emailui/group/FreestyleEmailUiIcons.mk Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/group/FreestyleEmailUiIcons.mk Thu Jan 07 12:38:38 2010 +0200 @@ -106,8 +106,8 @@ /c16,8 $(SOURCEDIR)\qgn_indi_cmail_unread_replied_high_prio.svg \ /c16,8 $(SOURCEDIR)\qgn_indi_cmail_unread_replied_low_prio.svg \ /c16,8 $(SOURCEDIR)\qgn_indi_cmail_attachment.svg \ - /c16,8 $(SOURCEDIR)\qgn_indi_cmail_viewer_follow_up_complete.svg \ - /c16,8 $(SOURCEDIR)\qgn_indi_cmail_viewer_follow_up.svg \ + /c16,8 $(SOURCEDIR)\qgn_indi_navi_follow_up_complete.svg \ + /c16,8 $(SOURCEDIR)\qgn_indi_navi_follow_up.svg \ /c16,8 $(SOURCEDIR)\qgn_indi_cmail_launcher_info.svg \ /c16,8 $(SOURCEDIR)\qgn_indi_cmail_launcher_remote_lookup.svg \ /c16,8 $(SOURCEDIR)\qgn_indi_cmail_launcher_inbox.svg \
--- a/emailuis/emailui/inc/FSComposerFetchLogic.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FSComposerFetchLogic.h Thu Jan 07 12:38:38 2010 +0200 @@ -48,7 +48,9 @@ class MComposerFetchLogicCallback { public: - virtual void FetchLogicComplete( TComposerFetchState aState, TInt aError ) = 0; + // Returns ETrue if the corresponding CFsComposerFetchLogic object has + // been deleted. + virtual TBool FetchLogicComplete( TComposerFetchState aState, TInt aError ) = 0; };
--- a/emailuis/emailui/inc/FreestyleEmailUi.hrh Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUi.hrh Thu Jan 07 12:38:38 2010 +0200 @@ -121,6 +121,7 @@ { EFsEmailUiCmdOpen = 2000, EFsEmailUiCmdDeleteMailbox, + EFsEmailUiCmdDeleteSelectedMailbox, EFsEmailUiCmdExit, EFsEmailUiCmdSync, EFsEmailUiCmdSyncAll,
--- a/emailuis/emailui/inc/FreestyleEmailUiAppui.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiAppui.h Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -14,11 +14,11 @@ * Description: FreestyleEmailUiAppUi class definition * */ - + #ifndef __FREESTYLEEMAILUI_APPUI_H__ #define __FREESTYLEEMAILUI_APPUI_H__ - + // SYSTEM INCLUDES #include <aknViewAppUi.h> //<cmail> SF @@ -48,7 +48,7 @@ #include "FreestyleEmailUiPropertySubscriber.h" #include "FreestyleEmailUiConstants.h" -enum TForcedStatus +enum TForcedStatus { ENoForce = 0, EForceToSync, @@ -142,7 +142,7 @@ void ProcessCommandL( TInt aCommand ); // </cmail> void HandleCommandL( TInt aCommand ); - + // View switching functions void EnterFsEmailViewL( TUid aViewId ); void EnterFsEmailViewL( TUid aViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage ); @@ -157,12 +157,12 @@ * Tries to activate the local view where the current view was navigated from. * Activates the grid view if no other previous view available. * @return UID of the view to be activated - */ + */ TUid ReturnToPreviousViewL( const TDesC8& aCustomMessage = KNullDesC8 ); void ReturnFromHtmlViewerL( TBool aMessageWasDeleted = EFalse ); - // Clears the navigation history used with Back functionality. + // Clears the navigation history used with Back functionality. // Thus, next call to ReturnToPreviousViewL() will return to the main grid. void EraseViewHistory(); @@ -175,7 +175,7 @@ CFsEmailUiViewBase* PreviousActiveView(); // Tells if plugin settings view is currently open TBool IsPluginSettingsViewActive(); - + // getter to generic components CFSEmailUiLayoutHandler* LayoutHandler(); CFreestyleEmailUiTextureManager* FsTextureManager(); @@ -183,9 +183,9 @@ // Functions used by grid and viewer TInt NewEmailsInModelL(); - TInt EmailsInModelL(); + TInt EmailsInModelL(); TInt EmailIndexInModel(); - + /** * LaunchEditorL * Launch editor with the given address in TO-field and focus in MSG-field @@ -193,7 +193,7 @@ * is not transferred. */ void LaunchEditorL( CFSMailAddress* aToAddress ); - + /** * LaunchEditorL * Launch editor @@ -201,10 +201,10 @@ * @param aParams Editor launch parameters */ void LaunchEditorL( TEditorLaunchMode aMode, const TEditorLaunchParams& aParams ); - + CFSMailClient* GetMailClient(); CFSEmailCRHandler* GetCRHandler(); - + // Gets active mailbox pointer from the UI // Ownership IS NOT transferred to the callers CFSMailBox* GetActiveMailbox(); @@ -215,11 +215,11 @@ TFSMailMsgId GetActiveBoxInboxId(); TFSMailMsgId GetActiveMailboxId(); - + /** * Show folder list or sort list as control bar popup list. - * - * @param aCurrentSortOrder Current sort order in mail list + * + * @param aCurrentSortCriteria Current sort criteria in mail list * @param aFolderId/Type Folder id/type of the currently active mail folder * @param aCallback Callback pointer to use when reporting user selection * @param aButton Selected control bar button, used when positioning the list @@ -227,21 +227,21 @@ void ShowFolderListInPopupL( const TFSMailMsgId aFolderType, MFSEmailUiFolderListCallback* aCallback, MFsControlButtonInterface* aButton ); - void ShowSortListInPopupL( const TFSMailSortField aCurrentSortOrder, + void ShowSortListInPopupL( const TFSMailSortCriteria aCurrentSortCriteria, const TFSFolderType aFolderType, MFSEmailUiSortListCallback* aCallback, MFsControlButtonInterface* aButton ); void FolderPopupClosed(); - + // Transition effects for Alf layouts, call these in doactivate and dodeactivate. TBool ViewSwitchingOngoing(); - + // Force Sync on active mailbox. void SyncActiveMailBoxL(); - + // Stop mailbox sync void StopActiveMailBoxSyncL(); - + // From sync observer void RequestResponseL( TFSProgress aEvent, TInt aRequestId ); @@ -249,19 +249,20 @@ * Helper method to be called from Settings. Launches mailbox setup wizard. */ void LaunchWizardL(); - + // Overriden exit void Exit(); void ExitNow(); const CFSEmailUiShortcutBinding& ShortcutBinding() const; - + // Navigation functions, used mainly from viewer TBool IsNextMsgAvailable( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId, TFSMailMsgId& aFoundNextMsgFolder ); TBool IsPreviousMsgAvailable( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId, TFSMailMsgId& aFoundPrevMsgFolder ); TInt MoveToNextMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId ); TInt MoveToPreviousMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId ); + TInt MoveToPreviousMsgAfterDeleteL( TFSMailMsgId aFoundPreviousMsgId ); /** Returns document handler. */ CDocumentHandler& DocumentHandler(); @@ -300,41 +301,41 @@ // MessageReader implementation void StartReadingEmailsL(); TBool MessageReaderSupportsFreestyle(); - + static TBool AppUiExitOngoing(); - // Meeting request viewer instance, owned by the appui - CESMRIcalViewer* MrViewerInstanceL(); + // Meeting request viewer instance, owned by the appui + CESMRIcalViewer* MrViewerInstanceL(); // Get Mail viewer instance, owned by the AppUi - CFsEmailUiHtmlViewerView& MailViewer(); - + CFsEmailUiHtmlViewerView& MailViewer(); + // Get Folder list instance, owned by the AppUi CFSEmailUiFolderListVisualiser& FolderList(); - + // Get Launcher grid instance, owned by the AppUi CFSEmailUiLauncherGridVisualiser& LauncherGrid(); - + // View loading in idle TInt ViewLoadIdleCallbackFunctionL(); - + /** - * Sets the manual mailbox syncronisation/connection flag if the + * Sets the manual mailbox syncronisation/connection flag if the * user chose to synchorise/connect mail boxes from the menu */ void ManualMailBoxSync( TBool aManualMailBoxSync ); void ManualMailBoxSyncAll( TBool aManualMailBoxSyncAll ); void ManualMailBoxConnectAll( TBool aManualMailBoxConnectAll ); void ManualMailBoxDisconnectAll( TBool aManualMailBoxConnectAll ); - - // For showing mailbox query + + // For showing mailbox query void GridStarted( TBool aStartedFromOds ); void ShowMailboxQueryL(); - + void DoAutoConnectL(); - + CFSEmailDownloadInfoMediator* DownloadInfoMediator(); - + // <cmail> TDisplayMode DisplayMode() const; // </cmail> @@ -348,7 +349,7 @@ public: //from MFSMailEventObserver /** - * Framework event message. + * Framework event message. * Used here to catch the events thrown from new mailbox creation process. * * @param aEvent One of pre-defined events in TFSMailEvent @@ -357,10 +358,10 @@ * @param aParam2 intepretation is event specific (see TFSMailEvent descriptions) * @param aParam3 intepretation is event specific (see TFSMailEvent descriptions) */ - void EventL( TFSMailEvent aEvent, TFSMailMsgId aMailbox, + void EventL( TFSMailEvent aEvent, TFSMailMsgId aMailbox, TAny* aParam1, TAny* aParam2, TAny* aParam3); - -public: + +public: void HandleSessionEventL( TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3 ); public: // MIAUpdateObserver @@ -368,7 +369,7 @@ virtual void UpdateQueryComplete( TInt aErrorCode, TBool aUpdateNow ); virtual void UpdateComplete( TInt aErrorCode, CIAUpdateResult* aResultDetails ); -public: +public: /** * StartEndKeyCapture @@ -389,30 +390,29 @@ * @return instance of correct navidecorator. NULL if aView doesn't match. */ CAknNavigationDecorator* NaviDecoratorL( const TUid aViewId ); - + public: - - virtual void TimerEventL( CFSEmailUiGenericTimer* aTriggeredTimer ); - + /** - * CancelFocusRemovalTimer - * Cancels focus removal timer - */ - void CancelFocusRemovalTimer(); - + * From MFSEmailUiGenericTimerCallback. + * Generic timer event callback. + */ + virtual void TimerEventL( CFSEmailUiGenericTimer* aTriggeredTimer ); + /** - * StartFocusRemovalTimer - * Starts focus removal timer - * @return whether or not timer was active already. + * Sets visibility for focus. + * + * @param aVisible EFalse if focus should be hidden. + * @return whether or not focus was already visible. */ - TBool StartFocusRemovalTimer(); - + TBool SetFocusVisibility( TBool aVisible ); + /** - * IsTimerFocusShown - * Used for finding out if the timer focus is already visible - * @return whether or not the timer focus is visible. + * IsFocusShown + * Used for finding out if focus is visible. + * @return whether or not the focus is visible. */ - TBool IsTimerFocusShown() const; + TBool IsFocusShown() const; public: // From MFreestyleEmailUiPropertyChangedObserver. @@ -420,45 +420,45 @@ void PropertyChangedL( TInt aValue ); -protected: +protected: TKeyResponse HandleKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ); void HandleResourceChangeL(TInt aType); - void HandleWsEventL(const TWsEvent &aEvent, + void HandleWsEventL(const TWsEvent &aEvent, CCoeControl *aDestination); - + void HandleForegroundEventL( TBool aForeground ); MCoeMessageObserver::TMessageResponse HandleMessageL( TUint32 aClientHandleOfTargetWindowGroup, TUid aMessageUid, const TDesC8& aMessageParameters ); - + private: void DoHandleResourceChangeL(TInt aType); void UpdateSettingsListModelL(); CAlfTexture& LoadItemIconL( TInt aUid ); - void ProvideBitmapL(TInt aId, CFbsBitmap*& aBitmap, + void ProvideBitmapL(TInt aId, CFbsBitmap*& aBitmap, CFbsBitmap*& aMaskBitmap); - + /** * Helper method for launching a setup wizard, or handling data received from one. */ void DoWizardStartupActionsL(); - + TBool IsViewInHistoryStack( TUid aViewId ) const; - + void ReturnToViewL( TUid aViewId, TUid aCustomMessageId = TUid::Null(), const TDesC8& aCustomMessage = KNullDesC8 ); - + // Checks updates from IAD client void CheckUpdatesL(); void AllUpdateActivitiesCompleted(); // This async callback functionality is needed because UI and app construction - // cannot jam while the new mailbox query has been displayed + // cannot jam while the new mailbox query has been displayed static TInt DisplayCreateQueryL( TAny* aSelfPtr ); void DisplayCreateMailboxQueryL(); - + // Send self to background. void SendToBackground(); - + /* * Called from ConstructL during start of application. * Constructs navipane(s) that are used by different views. @@ -469,32 +469,26 @@ void CreateStatusPaneIndicatorsL(); // Delete custom status pane indicators void DeleteStatusPaneIndicators(); - - /* - * FocusTimerCallBack - * Called when focus removal timer expires - */ - static TInt FocusTimerCallBack(TAny* aAny); - - /* - * DoFocusTimerCallBack - * Called when focus removal timer expires - */ - TInt DoFocusTimerCallBack(); - - + + // Load specified resource file, file name may (and should) contain wild + // cards. aFilePath should contain drive letter if some specific drive + // is wanted to be searched first. Returns the resource file offset of the + // found file. Leaves if resource file not found. + TInt LoadResourceFileL( const TDesC& aFileName, + const TDesC& aFilePath ); + private: // ALF environment NOTE: Display removed from Alfred version CAlfEnv* iEnv; - + // Pointers to current and previous active views CFsEmailUiViewBase* iCurrentActiveView; // not owned CFsEmailUiViewBase* iPreviousActiveView; // not owned CStack<CFsEmailUiViewBase, EFalse>* iNavigationHistory; // items not owned - + CFSEmailDownloadInfoMediator* iDwnldMediator; - - // Pointers to actual display control groups containing UI elements + + // Pointers to actual display control groups containing UI elements CAlfControlGroup* iGridControlGroup; CAlfControlGroup* iMailListControlGroup; CAlfControlGroup* iEmailViewerControlGroup; @@ -508,7 +502,7 @@ CAlfControlGroup* iSearchResultControlGroup; CAlfControlGroup* iStatusIndicatorControlGroup; CAlfControlGroup* iHtmlViewerControlGroup; - + // FS Email UI specific layout handler object CFSEmailUiLayoutHandler* iLayoutHandler; @@ -516,13 +510,13 @@ //<cmail> layout manager doesn't exists in cmail //CFsLayoutManager* iLayoutManager; //</cmail> - + // FS Email UI specific texture mngr object CFreestyleEmailUiTextureManager* iFsTextureManager; // Main UI grid control and view CFSEmailUiLauncherGrid* iMainUiGrid; - CFSEmailUiLauncherGridVisualiser* iMainUiGridVisualiser; + CFSEmailUiLauncherGridVisualiser* iMainUiGridVisualiser; // Mail view CFSEmailUiMailListVisualiser* iMailListVisualiser; @@ -541,11 +535,11 @@ // Folder list view CFSEmailUiFolderListVisualiser* iFolderListVisualiser; - + // Attachment list CFSEmailUiAttachmentsListVisualiser* iAttachmentListVisualiser; CFreestyleEmailUiAttachmentsListControl* iAttachmentHanlerControl; - + // Download manager removed. // Search result list view @@ -557,74 +551,74 @@ // Mailclient, list of mailboxes, active mailbox and // latest opened folder CFSMailClient* iMailClient; - + // Active mailbox, pointer owned by the APP UI! CFSMailBox* iActiveMailbox; TFSMailMsgId iActiveBoxInboxId; TFSMailMsgId iActiveMailboxId; - + // Mail sending progress dialog CAknProgressDialog* iSendingProgressDialog; CEikProgressInfo* iSendingProgressInfo; - + // Phonebook engine and resource handle TInt iPhCltResHandle; - + // Central repository handler CFSEmailCRHandler* iCRHandler; - + // End key capture handles TInt32 iEndCaptureHandle; TInt32 iEndUpDownCaptureHandle; - + CMsvSession* iMsvSession; CFSEmailUiActionMenu* iActionMenuHandler; - + RArray<TFSMailMsgId> iSubscribedMailBoxes; RArray<TUint> iSubscribedMailBoxesIds; - + // Helper class for keyboard shortcut handling CFSEmailUiShortcutBinding* iShortcutBinder; - + CFSEmailUiWizardObserver* iWizardObserver; CDocumentHandler* iDocumentHandler; CFsEmailFileHandleShutter* iFileHandleShutter; TBool iConstructComplete; - + TInt iSyncStatusReqId; - + TBool iIsForeground; - + CIdle* iViewLoadIdle; TCallBack* iViewLoadIdleCallback; TBool iIsCaptured; - - CVPbkContactManager* iVpkContactManager; - + + CVPbkContactManager* iVpkContactManager; + //This is used to pass needed information to messagereader HBufC8* iCustomMessageToMessageReader; - - // Meeting request viewer instance - CESMRIcalViewer* iMRViewer; - - // Flag to be used to disable online/offline note in automated + + // Meeting request viewer instance + CESMRIcalViewer* iMRViewer; + + // Flag to be used to disable online/offline note in automated // Mailbob online TBool iAutomatedMailBoxOnline; - + // Value indicating that msg reader is supported, KErrNone if supported. TInt iMsgReaderIsSupported; // For IAD CIAUpdate* iUpdateClient; CIAUpdateParameters* iUpdateParameters; - + // For feature manager TBool iFeatureManagerInitialized; - + //ETrue if user started the sync/connect all TBool iManualMailBoxSync; TBool iManualMailBoxSyncAll; @@ -633,33 +627,33 @@ // ETrue if the screen layout has chaged while the application was on background TBool iPendingLayoutSwitch; - + // Startup mailbox creation query flag. - TBool iStartupQueryShown; + TBool iStartupQueryShown; TBool iGridStarted; - TBool iGridFirstStartFromOds; + TBool iGridFirstStartFromOds; TBool iSettingsViewActive; TBool iIADUpdateCompleted; - - CFSEmailUiAutosyncMonitor* iAutoSyncMonitor; - + + CFSEmailUiAutosyncMonitor* iAutoSyncMonitor; + // Async callback for create mailbox query - // This is needed because query can not stop execution of UI construction + // This is needed because query can not stop execution of UI construction CAsyncCallBack* iNewBoxQueryAsyncCallback; - // Exit guardian. + // Exit guardian. CEUiExitGuardian* iExitGuardian; // navipane decorator // (used at least in mail viewer) CAknNavigationDecorator* iNaviDecorator2MailViewer; - + // Resource file offset for message editor external resources TInt iMsgEditorResourceOffset; - + // Resource file offset for FSMailServer external resources TInt iFSMailServerResourceOffset; - + // Custom status pane indicators CCustomStatuspaneIndicators* iStatusPaneIndicators; TBool iConnectionStatusVisible; @@ -676,10 +670,9 @@ // For handling the flip state. CFreestyleEmailUiPropertySubscriber* iPropertySubscriber; TBool iFlipOpen; - - // Timer for focus removal purposes. Owned - CPeriodic* iFocusTimer; + /// Focus visibility state + TBool iFocusVisible; }; @@ -690,7 +683,7 @@ class CFSEmailUiAutosyncMonitor : public CActive { public: - enum TNetworkStatus + enum TNetworkStatus { EStatusUnknown = 0, EHomenetwork, @@ -704,24 +697,24 @@ ERequestingNetworkStatus, EDone }; - + static CFSEmailUiAutosyncMonitor* NewL( CFreestyleEmailUiAppUi& aAppUi ); ~CFSEmailUiAutosyncMonitor(); - public: + public: void StartMonitoring( ); void StopMonitoring( ); - private: + private: void RunL(); void DoCancel(); TInt RunError( TInt aError ); - + private: CFSEmailUiAutosyncMonitor( CFreestyleEmailUiAppUi& aAppUi ); - void ConstructL(); + void ConstructL(); - private: + private: TMonitoringStatus iMonitoringStatus; CFreestyleEmailUiAppUi& iAppUi; RTelServer iServer;
--- a/emailuis/emailui/inc/FreestyleEmailUiFolderListVisualiser.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiFolderListVisualiser.h Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -15,12 +15,12 @@ * */ - - + + #ifndef __FREESTYLEEMAILUI_FOLDERLISTVISUALISER_H__ #define __FREESTYLEEMAILUI_FOLDERLISTVISUALISER_H__ - + #include <e32base.h> //<cmail> @@ -37,6 +37,7 @@ class CAlfTextVisual; class CAlfGridLayout; class CAlfImageVisual; +class CAlfShadowBorderBrush; class CAlfDeckLayout; class CAlfAnchorLayout; class CFSEmailUiFolderListControl; @@ -65,11 +66,8 @@ class CAlfFrameBrush; -//REMOVE WHEN DONE TESTING -//class CSimpleAOTest; -// <cmail> Touch -class CFSEmailUiFolderListVisualiser : public CFsEmailUiViewBase, public MFsTreeListObserver -// </cmail> +class CFSEmailUiFolderListVisualiser : public CFsEmailUiViewBase, + public MFsTreeListObserver { public: // Data types enum TExpandCollapseType @@ -78,7 +76,7 @@ EFolderListCollapse, EFolderListAutomatic }; - + public: // Construction and destruction /** * Destructor @@ -98,26 +96,20 @@ CFreestyleEmailUiAppUi& aAppUi ); static CFSEmailUiFolderListVisualiser* NewLC( CAlfEnv& aEnv, CAlfControlGroup& aControlGroup, - CFreestyleEmailUiAppUi& aAppUi ); + CFreestyleEmailUiAppUi& aAppUi ); public: // From base class CAknView void DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane); void HandleCommandL( TInt aCommand ); TUid Id() const; - // <cmail> Toolbar - /* - void ChildDoActivateL( const TVwsViewId& aPrevViewId, - TUid aCustomMessageId, - const TDesC8& aCustomMessage );*/ - // </cmail> Toolbar - void ChildDoDeactivate(); + void ChildDoDeactivate(); void DoTransitionEffect( TBool aDirectionOut ); void GetParentLayoutsL( RPointerArray<CAlfVisual>& aLayoutArray ) const; public: // Own public functions - + virtual TBool HandleWsEventL( const TWsEvent& aEvent ); - + // Handle foreground event (called by FreestyleEmailUiMailListVisualiser) void HandleForegroundEventL(); @@ -133,17 +125,15 @@ * @return ETrue if event was consumed, otherwise EFalse */ TBool OfferEventL( const TAlfEvent& aEvent ); - - // <cmail> Touch + /** - * Handling pointer events. + * Handling pointer events. * * @param aEvent Event forwarded from control * @return ETrue if event was consumed, otherwise EFalse */ TBool HandlePointerEventL(const TAlfEvent& aEvent); - // </cmail> - + /** * Expands or collpases the currently highlighted folder */ @@ -166,23 +156,23 @@ void ShowInPopupL( const TFSMailMsgId aFolderId, MFSEmailUiFolderListCallback* aCallback, MFsControlButtonInterface* aButton = NULL ); - + /** * Quick and dirty solution to show the sort list with the same list. * Could be changed to some more elegant implementation (e.g. folder list * and sort list derive from some generic control base class that * implements the common operations), if time permits. * - * @param aCurrentSortOrder Current sort order in mail list + * @param aCurrentSortCriteria Current sort criteria in mail list * @param aFolderType Folder type of the currently visible folder in mail list * @param aCallback Call back to inform the result of the sort order query * @param aButton Control bar button from where the popup is opened */ - void ShowSortListPopupL( const TFSMailSortField aCurrentSortOrder, + void ShowSortListPopupL( const TFSMailSortCriteria aCurrentSortCriteria, const TFSFolderType aFolderType, MFSEmailUiSortListCallback* aCallback, MFsControlButtonInterface* aButton = NULL ); - + /** * Does a horizontal scroll for the list if needed * @@ -194,37 +184,42 @@ /** * Function to check whether folder list is displaying popup - */ + */ TBool IsPopupShown(); /** * Function to hide popup - */ + */ void HidePopupL(); - + /** * From MFsTreeListObserver */ -// <cmail> Touch - void TreeListEventL( const TFsTreeListEvent aEvent, + void TreeListEventL( const TFsTreeListEvent aEvent, const TFsTreeItemId aId = KFsTreeNoneID ); -// </cmail> // <cmail> Receiving online/offline events void HandleMailBoxEventL( TFSMailEvent aEvent, TFSMailMsgId aMailbox, TAny* aParam1, TAny* aParam2, TAny* aParam3 ); // </cmail> -// <cmail> Toolbar + + /** + * From CFsEmailUiViewBase + * This method is called from the appui when the focus state is changed. + * + * @param aVisible Indicates if focus should become visible or removed + */ + void FocusVisibilityChange( TBool aVisible ); private: // from - + /** * @see CFsEmailUiViewBase::ChildDoActivateL */ void ChildDoActivateL( const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage ); - + /** * @see CFsEmailUiViewBase::OfferToolbarEventL */ @@ -234,9 +229,7 @@ * @see CFsEmailUiViewBase::ToolbarResourceId */ TInt ToolbarResourceId() const; - -// </cmail> Toolbar - + private: // Private functions /** @@ -249,19 +242,17 @@ * positive if first parameter is greater than second */ static TInt CompareFolders( const CFSMailFolder& aFirst, const CFSMailFolder& aSecond ); - + // Construction CFSEmailUiFolderListVisualiser( CAlfEnv& aEnv, CFreestyleEmailUiAppUi &aAppUi, CAlfControlGroup& aControlGroup ); void ConstructL(); void LoadIconsL(); // Internal functions used when showing and hiding the list - // <cmail> //void DoShowInPopupL(); void DoShowInPopupL( MFsControlButtonInterface* aButton, MFSEmailUiFolderListCallback* aFolderCallback, MFSEmailUiSortListCallback* aSortCallback ); - // </cmail> void PrepareFolderListL(); void PopulateFolderListL(); void PopulateFolderListDeferred(); @@ -270,15 +261,13 @@ // Recreate list content void UpdateFolderListL(); void UpdateSortListL(); - + // View layout handling and item position calculation void UpdateListSizeAttributes(); void ResizeListIcons(); void ResizeListItemsL(); void AdaptScreenRectToListContent(); - // <cmail> void AdjustWidthByContent( TRect& aRect ) const; - // </cmail> void SetAnchors(); void SetItemVisualizerPropertiesL( MFsTreeItemVisualizer* aItemVisualizer ); @@ -287,9 +276,6 @@ TRect RightListRectInThisResolution(); TRect FolderListRectInThisResolution(); TRect SortListRectInThisResolution(); - // <cmail> - //void PopupListWidthHeightInThisResolution( TInt& aWidth, TInt& aHeight ); - // </cmail> // Handle the selection or cancelation of the list void HandleSelectionL( TFSEmailUiCtrlBarResponse aSelection ); @@ -303,7 +289,7 @@ void AppendMoreFoldersL(); void AppendMailboxesL(); void AppendSeparatorLineL(); - + // Append sort list data void AppendSortListItemsL(); @@ -313,29 +299,29 @@ TBool aRefreshLastItem ); TFsTreeItemId AppendNodeFolderL( CFSMailFolder* aFolder, TFsTreeItemId aParentNode ); TFsTreeItemId AppendLeafFolderL( CFSMailFolder* aFolder, TFsTreeItemId aParentNode, TBool aAllowRefresh ); - + TFsTreeItemId AppendNodeToListFromResourceL( TInt aResourceId, TFsTreeItemId aParentNode, CAlfTexture* aIcon, TUint aUnreadCnt = 0); - + TFsTreeItemId AppendNodeToListL( TDesC* aItemData, TFsTreeItemId aParentNode, CAlfTexture* aIcon, TUint aUnreadCnt); - TFsTreeItemId AppendItemToListFromResourceL( TInt aResourceId, + TFsTreeItemId AppendItemToListFromResourceL( TInt aResourceId, TFsTreeItemId aParentNode, CAlfTexture* aIcon, TBool aAllowRefresh, TUint aUnreadCnt = 0); - - TFsTreeItemId AppendItemToListL( TDesC* aItemData, + + TFsTreeItemId AppendItemToListL( TDesC* aItemData, TFsTreeItemId aParentNode, CAlfTexture* aIcon, TBool aAllowRefresh, TUint aUnreadCnt = 0); - + void CreatePlainItemLC2( const TDesC* aItemDataBuff, CFsTreePlainOneLineItemData* &aItemData, CFsTreePlainOneLineItemVisualizer* &aItemVisualizer, @@ -371,28 +357,28 @@ // Check wheter all list nodes are expanded or collapsed TBool AllNodesCollapsed() const; TBool AllNodesExpanded( TFsTreeItemId aParentNodeId = KFsTreeRootID ) const; - + // Recursive function to get item's root level parent TFsTreeItemId GetRootParent( const TFsTreeItemId aItemId ) const; - + void DoFirstStartL(); - //<cmail> void SetHeaderTextAttributesL(); void ConnectToMailboxL(); void DisconnectFromMailboxL(); TBool CbaButtonPressed( TPoint aPosition ); void GetCbaRects( TRect& aLeftCbaRect, TRect& aRightCbaRect ); TBool IsAreaSideRightPaneActive(); - //</cmail> - + private: - + // Array of list item infos RPointerArray< CFsTreePlainOneLineItemData > iListItemDatas; - + private: // Typedefs and member variables // Array type for the list icons typedef RPointerArray<CAlfTexture> TFsEmailFolderListIconArray; + // Array type for the sort list icons + typedef RPointerArray<CAlfTexture> TFsEmailSortListIconArray; // ALF environment CAlfEnv& iEnv; @@ -407,15 +393,11 @@ CAlfImageVisual* iListBgImageVisual; CAlfImageVisual* iHeaderImageVisual; CAlfTextVisual* iHeaderTextVisual; - // <cmail> - //CAlfImageBrush* iBackgroundBrush; CAlfFrameBrush* iBackgroundBrush; - // </cmail> - -// <cmail> Touch + CAlfShadowBorderBrush* iShadowBrush; + // ALF visual for background CAlfVisual* iFaderVisual; -// </cmail> // Pointers to control and model CFSEmailUiFolderListControl* iControl; // not owned (owned by ALF env) @@ -424,13 +406,13 @@ // Callback pointers MFSEmailUiFolderListCallback* iCallback; MFSEmailUiSortListCallback* iSortListCallback; - + // Type of the currently visible folder in mail list TFSFolderType iCurrentFolderType; - + // Custom message ID passed in view activation TUid iCustomMessageId; - + // List/view size attributes TRect iScreenRect; TRect iCtrlButtonRect; @@ -440,12 +422,12 @@ TInt iListSeparatorHeight; TSize iListIconSize; TSize iPreviousListIconSize; - + TPoint iPadding; - + // ETrue if list shown in fullscreen TBool iFullScreen; - + // List id of the "More folders" item in folder list TFsTreeItemId iMoreFoldersItemId; @@ -460,20 +442,23 @@ // Folder list icons, items not owned (are owned by texture manager) TFsEmailFolderListIconArray iIconArray; + + // Sort list icons, items not owned (are owned by texture manager) + TFsEmailSortListIconArray iSortIconArray; // Previously selected items TFSMailMsgId iLatestSelectedMoveFolderId; TFSMailMsgId iCurrentFolderId; - TFSMailSortField iCurrentSortOrder; - + TFSMailSortCriteria iCurrentSortCriteria; + // Pointers to list items (and nodes) RPointerArray<MFsTreeItemVisualizer> iListItemVisulizers; - + // Previous level in list, used in horizontal scrolling TInt iPreviousListLevel; - + TBool iFirstStartCompleted; - + TBool iPopupListShown; //For header text caption @@ -485,12 +470,12 @@ TBool iWaitingToGoOnline; // Do we need to connect the mailbox before showing the folder list TBool iNoConnectNeeded; - + // Should we use expansion animation for the next transition effect TBool iAnimateNextActivation; - + CAsyncCallBack* iAsyncCallback; - + TBool iConsumeUntilNextUpEvent; };
--- a/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h Thu Jan 07 12:38:38 2010 +0200 @@ -67,6 +67,7 @@ void Draw( const TRect& aRect ) const; void SizeChanged(); TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ); + void HandleResourceChange(TInt aType); // from base class MBrCtlSpecialLoadObserver
--- a/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerView.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerView.h Thu Jan 07 12:38:38 2010 +0200 @@ -291,6 +291,12 @@ TFetchedType iStartAsyncFetchType; + // <cmail> + // Email forwarding initiated (so don't cancel fetch of message parts + // during deactivation). + TBool iForwardingMessage; + // </cmail> + // Wait note stuff //<cmail> //CAknWaitNoteWrapper* iAsyncWaitNote;
--- a/emailuis/emailui/inc/FreestyleEmailUiLauncherGridVisualiser.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiLauncherGridVisualiser.h Thu Jan 07 12:38:38 2010 +0200 @@ -41,11 +41,11 @@ #include "FSEmailLauncherItem.h" #include "freestyleemailuimailboxdeleter.h" -// FORWARD DECLARATIONS -// <cmail> +// FORWARD DECLARATIONS class CBrushAnimation; -// </cmail> class CFsAlfScrollbarLayout; +class CAknStylusPopUpMenu; + class TFSLauncherGridMailboxStatus { @@ -199,7 +199,8 @@ void MailboxDeletionComplete(); -private: // methods +private: // New methods. + CFSEmailUiLauncherGridVisualiser(CAlfEnv& aEnv, CFSEmailUiLauncherGrid* aControl, CFreestyleEmailUiAppUi* aAppUi, @@ -234,12 +235,19 @@ * Reduces item's icon size. */ void ResizeItemIcon( TBool aReduce ); - + /** - * Handles the focus removal of CFSEmailUiLauncherGridVisualiser - * @param aShow Indicates if focus should become visible or removed + * Handles the focus state changes of CFSEmailUiLauncherGridVisualiser + * @param aVisible Indicates if focus should become visible or removed */ - void HandleTimerFocusStateChange( TBool aShow ); + void FocusVisibilityChange( TBool aVisible ); + + /** + * Launches and displays the pop-up menu invoked by a long tap event. + * @param aItemId The ID of the item for which to open the menu. + */ + void LaunchStylusPopupMenu( const TInt aItemId ); + private: // data types @@ -384,6 +392,15 @@ // Mailbox deleter - handles deletion of one or more mailboxes. CFSEmailUiMailboxDeleter* iMailboxDeleter; + + // A pop-up menu that is invoked by long tap events. Used for e.g. + // deleting mail boxes. + CAknStylusPopUpMenu* iStylusPopUpMenu; + TBool iStylusPopUpMenuLaunched; + + // Contains the ID of a selected mailbox. Used for deleting mailboxes + // with long tap pop-up menu. + TFSMailMsgId iMailboxToDelete; }; #endif // __FREESTYLEEMAILUI_MAINGRIDUIVISUALISER_H__
--- a/emailuis/emailui/inc/FreestyleEmailUiLayoutData.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiLayoutData.h Thu Jan 07 12:38:38 2010 +0200 @@ -208,6 +208,9 @@ static const TInt KListTextMarqueeStartDelay = 1500; // Milliseconds static const TInt KListTextMarqueeSpeedRepeats = 0; // repeats +// Border widths. +const TInt KSelectorBorderWidth( 8 ); + // Compose screen specific layout constants // these are constants for all zoom levels const TInt KAifLabelMarginHorizontal = 9; @@ -223,7 +226,8 @@ const TInt KIconWidthAttachment = 14; const TInt KIconHeightAttachment = 17; const TInt KInputFieldRoundingRadius = 3; -const TSize KInputFieldRoundingSize( KInputFieldRoundingRadius*2, KInputFieldRoundingRadius*2 ); +const TSize KInputFieldRoundingSize( KInputFieldRoundingRadius * 2, + KInputFieldRoundingRadius * 2 ); // these are defined for each zoom level // normal zoom level @@ -238,6 +242,7 @@ const TInt KIconMarginAttachmentVertical = KIconMarginPriorityVertical; const TInt KLabelFontHeightPx = 14; const TInt KEditorFontHeightPx = 17; + // small zoom level const TInt KAifHeightSmall = 40; const TInt KAifLabelMarginVerticalSmall = 3; @@ -250,6 +255,7 @@ const TInt KIconMarginAttachmentVerticalSmall = KIconMarginPriorityVerticalSmall; const TInt KLabelFontHeightPxSmall = 13; const TInt KEditorFontHeightPxSmall = 15; + // large zoom level const TInt KAifHeightLarge = 52; const TInt KAifLabelMarginVerticalLarge = 5; @@ -333,6 +339,7 @@ // Maximum number of contacts included in the Predictive contact search popup. // Number is limited to enhance performance in case of large contact DB. static const TInt KMaxPcsMatches = 50; + // Predictive contact search popup colors static const TRgb KPcsPopupHighlightColor( 0,200,200 ); static const TRgb KPcsPopupDimmedFontColor( 192,192,192 ); @@ -349,7 +356,8 @@ static const TInt KViewerHighlightTextureSize = 1; static const TInt KControlBarArrowTextureXSize = 12; static const TInt KControlBarArrowTextureYSize = 17; + + #endif // __FREESTYLEEMAILUI_LAYOUTDATA_H__ - // End of File
--- a/emailuis/emailui/inc/FreestyleEmailUiLayoutHandler.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiLayoutHandler.h Thu Jan 07 12:38:38 2010 +0200 @@ -78,10 +78,10 @@ // One line node and item height TInt OneLineListNodeHeight() const; TInt OneLineListItemHeight() const; + TInt TwoLineListItemHeight() const; // <cmail> // Folder list item heigh TInt FolderListOneLineItemHeight( const TBool& aFullscreen ) const; - // </cmail> // Mail icon size TSize MailIconSizeInThisResolution() const; @@ -98,9 +98,8 @@ // Scroll pane list item size TSize FolderListItemSizeInThisResolution( const TRect& aParent ) const; - // <cmail> // Drop down menu rect - TRect DropDownMenuListRect( const TDropDownMenuSide aSide ) const; + TRect DropDownMenuListRect( const TDropDownMenuSide aSide, TBool aStretch = ETrue ) const; // </cmail> // Folder list pane indentation in pixels @@ -111,7 +110,7 @@ // FS Email UI fonts, returns font style. Calling // View may set text visual style using SetTextStyle( CAlfTextStyle.Id() ) - CAlfTextStyle* FSTextStyleFromIdL( TFSEmailFont aFontId ); // <cmail> const removed due to changes in method + CAlfTextStyle* FSTextStyleFromIdL( TFSEmailFont aFontId ); // Control bar list padding TPoint ControlBarListPadding() const; @@ -126,11 +125,6 @@ // Control bar height TInt ControlBarHeight() const; - // <cmail> Platform layout change - // Control bar text height - //TInt ControlBarTextHeight() const; - // </cmail> Platform layout change - // List fade effect times TInt ListFadeInEffectTime() const; TInt ListFadeOutEffectTime() const; @@ -187,8 +181,7 @@ // List items font heigjht in twips global zoom level TInt ListItemFontHeightInTwips( const TBool aPopup = EFalse ) const; - - // Logical font id's for viewer fonts + // Logical font id's for viewer fonts TAknLogicalFontId ViewerTitleFontAknLogicalFontId() const; TAknLogicalFontId ViewerTextFontAknLogicalFontId() const; @@ -272,26 +265,15 @@ TInt ControlBarArrowTextureXSize() const; TInt ControlBarArrowTextureYSize() const; -// <cmail> Use layout data instead of hardcoded values TRect GetControlBarMailboxIconRect() const; - TPoint GetControlBarMailboxIconPos() const; - TSize GetControlBarMailboxIconSize() const; - + TRect GetControlBarNewEmailButtonRect() const; TRect GetControlBarFolderListButtonRect() const; - TPoint GetControlBarFolderListButtonPos() const; - TSize GetControlBarFolderListButtonSize() const; - TRect GetControlBarSortButtonRect() const; - TPoint GetControlBarSortButtonPos() const; - TSize GetControlBarSortButtonSize() const; - TRect GetControlBarConnectionIconRect() const; - TPoint GetControlBarConnectionIconPos() const; - TSize GetControlBarConnectionIconSize() const; TRect GetControlBarRect() const; - TRect GetListRect() const; + TRect GetListRect( TBool aControlsOnTop = EFalse ) const; CAlfTextStyle& FSTextStyleFromLayoutL( const TAknTextComponentLayout& aLayout ); //<cmail>
--- a/emailuis/emailui/inc/FreestyleEmailUiMailListVisualiser.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiMailListVisualiser.h Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Symbian Foundation License v1.0" @@ -11,12 +11,12 @@ * * Contributors: * -* Description: FreestyleEmailUi double line list visualiser definition +* Description: FreestyleEmailUi double line list visualiser definition * */ - - + + #ifndef __FREESTYLEEMAILUI_MAILLISTVISUALISER_H__ #define __FREESTYLEEMAILUI_MAILLISTVISUALISER_H__ @@ -89,13 +89,13 @@ struct STimeDateFormats { - TDateFormat iDateFormat; + TDateFormat iDateFormat; TChar iDateSeparator; TTimeFormat iTimeFormat; TChar iTimeSeparator; TLocalePos iAmPmPosition; }; - + enum TMailListUiControls { EControlBarComponent=0, @@ -117,9 +117,9 @@ }; // <cmail> -class CFSEmailUiMailListVisualiser : public CFsEmailUiViewBase, - public MFsControlBarObserver, - public MFSEmailUiFolderListCallback, +class CFSEmailUiMailListVisualiser : public CFsEmailUiViewBase, + public MFsControlBarObserver, + public MFSEmailUiFolderListCallback, public MFSEmailUiSortListCallback, public MFsTreeListObserver, public MFSEmailUiContactHandlerObserver, @@ -136,16 +136,16 @@ void DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane); // Refresh the whole list void RefreshL( TFSMailMsgId* aFocusToMessage = NULL ); - // From view - TUid Id() const; + // From view + TUid Id() const; // <cmail> Toolbar /*void DoActivateL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage);*/ // </cmail> Toolbar TInt NewEmailsInModelL() const; - TInt EmailsInModelL() const; - CFSEmailUiMailListModel* Model(); + TInt EmailsInModelL() const; + CFSEmailUiMailListModel* Model(); // Current active folder TFSMailMsgId FolderId(); // Dynamic variant switch, called by appui @@ -154,100 +154,104 @@ // Handle foregroundevent void HandleForegroundEventL(); // Sets softkeys - void SetViewSoftkeysL( TInt aResourceId ); + void SetViewSoftkeysL( TInt aResourceId ); void SetMskL(); // Highlighted index TInt HighlightedIndex() const; void SetHighlightedIndexL( TInt aWantedIndex ); // Event handling forwarded from control - TBool OfferEventL( const TAlfEvent& aEvent ); + TBool OfferEventL( const TAlfEvent& aEvent ); // <cmail> /** - * Open highlighted mail or node. + * Open highlighted mail or node. * (Touchwork: Called from touch manager) */ void DoHandleListItemOpenL(); /** - * Open folderlist or shortlist. + * Open folderlist or shortlist. * (Touchwork: Called from touch manager) - * - * @param TInt button id. (shortlist or folderlist) + * + * @param TInt button id. (shortlist or folderlist) */ void DoHandleControlBarOpenL( TInt aControlBarButtonId ); /** - * Open action menu. + * Open action menu. * (Touchwork: Called from touch manager) */ void DoHandleListItemLongTapL(); /** - * Get control which is currently focused. + * Get control which is currently focused. * (Touchwork: Called from touch manager) - * + * * @return TInt id of control */ - TInt GetFocusedControl() const; + TInt GetFocusedControl() const; /** - * Set control bar as focused control. + * Set control bar as focused control. * (Touchwork: Called from touch manager) */ void SetControlBarFocusedL(); /** - * Set tree list as focused control. + * Set tree list as focused control. * (Touchwork: Called from touch manager) */ - void SetTreeListFocusedL(); + void SetTreeListFocusedL(); /** - * Helper function for disable controls to send - * any events. + * Helper function for disable controls to send + * any events. * (Touchwork) - * - * @param TBool state of controls. + * + * @param TBool state of controls. */ void DisableMailList( TBool aValue ); // </cmail> - + // Command handling void HandleCommandL(TInt aCommand); - // Read status + // Read status void ChangeReadStatusOfHighlightedL( TBool aRead ); void ChangeReadStatusOfMarkedL( TBool aRead ); void ChangeReadStatusOfIndexL( TBool aRead, TInt aIndex ); - // Delete messages - void DeleteMessagesL(); + // Delete messages + void DeleteMessagesL(); // Move to drafts void MoveMessagesToDraftsL(); - + // From base class MFSEmailUiFolderListCallback // Handle folder list selection void FolderSelectedL( TFSMailMsgId aSelectedFolderId, TFSEmailUiCtrlBarResponse aResponse ); void MailboxSelectedL( TFSMailMsgId aSelectedFolderId ); TRect FolderButtonRect(); - + // From base class MFSEmailUiSortListCallback void SortOrderChangedL( TFSMailSortField aSortField, TFSEmailUiCtrlBarResponse aResponse ); TRect SortButtonRect(); - + + // Update theme colors + void UpdateTheme(); + // Navigation functions, used mainly from viewer TBool IsNextMsgAvailable( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId, TFSMailMsgId& aFoundNextMsgFolder ) const; TBool IsPreviousMsgAvailable( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId, TFSMailMsgId& aFoundPrevMsgFolder ) const; TInt MoveToNextMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId ); TInt MoveToPreviousMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId ); - + TInt MoveToPreviousMsgAfterDeleteL( TFSMailMsgId aFoundPreviousMsgId ); + /** - * Sets the manual mailbox syncronisation flag if the user chose + * Sets the manual mailbox syncronisation flag if the user chose * to synchorise mail box from the menu */ void ManualMailBoxSync( TBool aManualMailBoxSync ); - + // Returns ETrue if mailbox is syncronizing and EFalse if not TBool GetLatestSyncState(); @@ -277,14 +281,14 @@ * Called when CDateChangeTimer completes. This happens when either when date * changes or when user alters the system time. Redraws the list to ensure that * time stamp texts in emails and nodes are up-to-date. - */ + */ void NotifyDateChangedL(); // <cmail> TPoint ActionMenuPosition(); // </cmail> - + private: // from - + /** * @see CFsEmailUiViewBase::ChildDoActivateL */ @@ -295,9 +299,9 @@ void GetParentLayoutsL( RPointerArray<CAlfVisual>& aLayoutArray ) const; /** * @see CFsEmailUiViewBase::SetStatusBarLayout - */ + */ void SetStatusBarLayout(); - + private: // Private functions CFSEmailUiMailListVisualiser( CAlfEnv& aEnv, CFreestyleEmailUiAppUi* aAppUi, CAlfControlGroup& aMailListControlGroup ); @@ -306,48 +310,49 @@ // Refresh funcions void InsertNewMessagesL( const RArray<TFSMailMsgId>& aMessages ); void InsertNewMessageL( CFSMailMessage* aNewMessage, const TBool aAllowRefresh ); // ownership is transferred - + void RefreshListItemsL(); // Refresh the list order only void RefreshOrderL(); - + // To start refreshing asynchronously void RefreshDeferred( TFSMailMsgId* aFocusToMessage = NULL ); static TInt DoRefresh( TAny* aSelfPtr ); void CompletePendingRefresh(); - + // Create and insert one list node item according to given model item. // Omitting the argument aChildIdx causes the new node to be appended at the end of the list. TFsTreeItemId InsertNodeItemL( TInt aModelIndex, TInt aChildIndex = KErrNotFound, const TBool aAllowRefresh = EFalse ); // Create and insert one list item according the given model item. The item is added under the given node. // Omitting the argument aChildIdx causes the new item to be appended as last child of the node. TFsTreeItemId InsertListItemL( TInt aModelIndex, TFsTreeItemId aParentNodeId, TInt aChildIdx = KErrNotFound, TBool aAllowRefresh = ETrue ); - + // Mail model update void UpdateMailListModelL(); void CreateModelItemsL( RPointerArray<CFSMailMessage>& aMessages ); - + // Create title divider model item for the given message. Separator text depends on active sorting mode. CFSEmailUiMailListModelItem* CreateSeparatorModelItemLC( CFSMailMessage& aMessage ) const; - + // Checks if the given messages belong under the same title divider. This depends on the currect sorting mode. TBool MessagesBelongUnderSameSeparatorL( const CFSMailMessage& aMessage1, const CFSMailMessage& aMessage2 ) const; - - // Rescale UI + + // Rescale UI void SetMailListLayoutAnchors(); // Control bar functions void CreateControlBarLayoutL(); void ScaleControlBarL(); void SetSortButtonTextAndIconL(); + HBufC* GetSortButtonTextLC(); void HandleControlBarEvent( TFsControlBarEvent aEvent, TInt aData ); // Followup flag void SetMessageFollowupFlagL(); void CreatePlainNodeL( const TDesC* aItemDataBuff, - CFsTreePlainOneLineNodeData* &aItemData, - CFsTreePlainOneLineNodeVisualizer* &aNodeVisualizer ) const; + CFsTreePlainOneLineNodeData* &aItemData, + CFsTreePlainOneLineNodeVisualizer* &aNodeVisualizer ) const; // Move messages to folder TInt MoveMsgsToFolderL( const TFSMailMsgId& aDestinationFolderId ); @@ -361,7 +366,7 @@ void MarkAllItemsL(); void UnmarkAllItemsL(); TInt CountMarkedItemsL(); - + void MarkMessagesIfFoundL( const RArray<TFSMailMsgId>& aMessageIDs ); // Message deletion internal functions @@ -371,19 +376,19 @@ // Helper functions to access model data TFSMailMsgId MsgIdFromIndex( TInt aItemIdx ) const; - CFSMailMessage& MsgPtrFromListIdL( TFsTreeItemId aListId ); - const CFSMailMessage& MsgPtrFromListIdL( TFsTreeItemId aListId ) const; + CFSMailMessage& MsgPtrFromListIdL( TFsTreeItemId aListId ); + const CFSMailMessage& MsgPtrFromListIdL( TFsTreeItemId aListId ) const; - // Item data and visualiser helper functions - MFsTreeItemData* ItemDataFromItemId( TFsTreeItemId aItemId ); + // Item data and visualiser helper functions + MFsTreeItemData* ItemDataFromItemId( TFsTreeItemId aItemId ); MFsTreeItemVisualizer* ItemVisualiserFromItemId( TFsTreeItemId aItemId ); - + // Helpers to get the ordinal of a message in the iModel TInt ItemIndexFromMessageId( const TFSMailMsgId& aMessageId ) const; TInt NextMessageIndex( TInt aCurMsgIdx ) const; TInt PreviousMessageIndex( TInt aCurMsgIdx ) const; TInt ModelIndexFromListId( TFsTreeItemId aItemId ) const; - + // Open highlighted mail void OpenHighlightedMailL(); void OpenMailItemL( TFsTreeItemId aMailItem ); @@ -394,52 +399,52 @@ // Shortcut specific toggles void ShortcutReadUnreadToggleL(); void ShortcutCollapseExpandAllToggleL(); - + // Utility functions to check if all nodes are expanded or collapsed TBool AllNodesCollapsed() const; TBool AllNodesExpanded() const; - + // Utility functions to check if mark as read/unread options should be available in menus TBool IsMarkAsReadAvailableL() const; TBool IsMarkAsUnreadAvailableL() const; - + // Utility function to get list of entries which will be targeted by the Actions menu commands. // The list contains either marked entries or the focused message entry or is empty. void GetActionsTargetEntriesL( RFsTreeItemIdList& aListItems ) const; - + // Action menu specific functions void LaunchActionMenuL(); void HandleActionMenuCommandL( TActionMenuCustomItemId itemId ); void LaunchStylusPopupMenuL(); - + // Compose, reply, reply all and forward void CreateNewMsgL(); void ReplyL( CFSMailMessage* aMsgPtr ); void ReplyAllL( CFSMailMessage* aMsgPtr ); void ForwardL( CFSMailMessage* aMsgPtr ); void DoReplyForwardL( TEditorLaunchMode aMode, CFSMailMessage* aMsgPtr = NULL ); - + // Some misc housekeeping functions void RemoveUnnecessaryNodesL(); - void UpdateMailListSettingsL(); + void UpdateMailListSettingsL(); void UpdateMailListTimeDateSettings(); STimeDateFormats MailListTimeDateSettings(); // Request to update list item data from given message pointer void UpdateItemDataL( CFsTreePlainTwoLineItemData* aData, const CFSMailMessage* aMsgPtr ); - + // Request to update preview pane data for list id with msg ptr void UpdatePreviewPaneTextForItemL( TFsTreeItemId aListItemId, CFSMailMessage* aMsgPtr ); void UpdatePreviewPaneTextForItemL( CFsTreePlainTwoLineItemData* aTwoLineItemData, CFSMailMessage* aMsgPtr ); void UpdatePreviewPaneTextIfNecessaryL( TFsTreeItemId aListItemId, TBool aUpdateItem = ETrue ); - + // Sender/Recipient text depending on the mail folder HBufC* GetListFirstTextLineL( const CFSMailMessage* aMsgPtr ); // Reload message pointer from mail client and update list item contents to match it. Item is // removed if it isn't valid anymore. void UpdateItemAtIndexL( TInt aIndex ); - + // Check validity of highlighted msg and remove from list if needed // EFalse indicates that mail was not valid anymore. TBool CheckValidityOfHighlightedMsgL(); @@ -461,27 +466,27 @@ // Gives the parent node if the item has one. Returns KErrNotFound if no parent node available. TFsTreeItemId ParentNode( TFsTreeItemId aItemId ) const; - + // Either marks or unmarks the current item depending on the current marking state // as stored in iListMarkItemsState. Used for marking when shift is depressed while // scrolling. Returns ETrue if the highlighted item is markable. TBool DoScrollMarkUnmarkL(); - + /** * Mark/unmark items under current separator. - * + * * @param aMarked If ETrue mark all items else unmark. * @param aSeparatorId Id of the separator. */ void MarkItemsUnderSeparatorL( TBool aMarked, TInt aSeparatorId ); - + //When maillist is activated this method handles the connection icon change void ConnectionIconHandling(); - + void SetListAndCtrlBarFocusL(); - + void SetMailListItemsExtendedL(); - + void DoFirstStartL(); // Called when flip state is changed @@ -489,44 +494,58 @@ /** * Handles the focus state changes - * @param aShow Indicates if focus should become visible or removed + * @param aVisible Indicates if focus should become visible or removed + */ + void FocusVisibilityChange( TBool aVisible ); + + /** + * Update texts in command area buttons */ - void HandleTimerFocusStateChange( TBool aShow ); + void UpdateButtonTextsL(); + + /** + * Tests whether a point is inside the control. + * + * @param aControl Control that is tested. + * @param aPoint Point in display coordinates. + * + * @return <code>ETrue</code>, if the point is inside one of the + * control's visuals. Otherwise <code>EFalse</code>. + */ + TBool HitTest( const CAlfControl& aControl, const TPoint& aPoint ) const; private: // data types - + private: // Private objects // Reference to Alf environment CAlfEnv& iEnv; // Mail list updater timer // Timer delays mail update to prevent unnesessary redraw events - CMailListUpdater* iMailListUpdater; + CMailListUpdater* iMailListUpdater; // Msg moved note timer - CMsgMovedNoteTimer* iMsgNoteTimer; + CMsgMovedNoteTimer* iMsgNoteTimer; // Screen layout uses iMailListControl CAlfAnchorLayout* iScreenAnchorLayout; // Control bar control and layout and store visual pointer CFsControlBar* iControlBarControl; CAlfVisual* iControlBarVisual; - CAlfDeckLayout* iControlBarLayout; + CAlfDeckLayout* iControlBarLayout; // Mail List control and layout CFreestyleEmailUiMailListControl* iMailListControl; CAlfDeckLayout* iListLayout; -// <cmail> this feature is waiting for title divider bg graphics CAlfImageVisual* iTitleDividerBgVisual; -// </cmail> - CFSEmailUiMailListModel* iModel; + CFSEmailUiMailListModel* iModel; CFsTreeList* iMailList; CFsTreeVisualizerBase* iMailTreeListVisualizer; - TInt iNumSlots; + TInt iNumSlots; CFSMailFolder* iMailFolder; - TInt iNewEmailsInModel; - RArray<SMailListItem> iTreeItemArray; + TInt iNewEmailsInModel; + RArray<SMailListItem> iTreeItemArray; RArray<TInt> iButtonsIds; TInt iFocusedControl; TBool iToolbarInUse; - TInt iListMode; + TInt iListMode; TInt iNodesInUse; TInt iNewEmailButtonId; TInt iFolderListButtonId; @@ -535,9 +554,9 @@ MFsControlButtonInterface* iIconButton; MFsControlButtonInterface* iNewEmailButton; MFsControlButtonInterface* iFolderListButton; - MFsControlButtonInterface* iSortButton; - TBool iThisViewActive; - CPbkxContactActionMenu* iActionMenu; + MFsControlButtonInterface* iSortButton; + TBool iThisViewActive; + CPbkxContactActionMenu* iActionMenu; TFSMailSortCriteria iCurrentSortCriteria; // Set to indicate whether items should be marked or unmarked TBool iListMarkItemsState; @@ -564,16 +583,16 @@ CDateChangeTimer* iDateChangeTimer; TBool iFirstStartCompleted; // generic use async callback object - CAsyncCallBack* iAsyncCallback; + CAsyncCallBack* iAsyncCallback; // async callback for deferred redrawing CAsyncCallBack* iAsyncRedrawer; TFSMailMsgId iMsgToFocusAfterRedraw; + HBufC* iNewEmailText; - //<cmail> - CEUiEmailListTouchManager* iTouchManager; - //</cmail> - CAknStylusPopUpMenu* iStylusPopUpMenu; - + CEUiEmailListTouchManager* iTouchManager; + CAknStylusPopUpMenu* iStylusPopUpMenu; + TBool iStylusPopUpMenuLaunched; + TBool iShowReplyAll; }; @@ -598,7 +617,7 @@ CAknWaitDialog* iWaitNote; }; -// Delayd note timer +// Delayd note timer class CMsgMovedNoteTimer : public CTimer { public: @@ -626,12 +645,12 @@ ~CDateChangeTimer(); void Start(); void RunL(); - + protected: CDateChangeTimer( CFSEmailUiMailListVisualiser& aMailListVisualiser ); - + private: CFSEmailUiMailListVisualiser& iMailListVisualiser; }; -#endif +#endif
--- a/emailuis/emailui/inc/FreestyleEmailUiMsgDetailsVisualiser.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiMsgDetailsVisualiser.h Thu Jan 07 12:38:38 2010 +0200 @@ -300,9 +300,8 @@ CFSEmailUiMsgDetailsControl* iControl; // Not owned, owned by ALF env CFSEmailUiMsgDetailsModel* iModel; // Owned - // Lists screen rect and item/node heights + // Lists screen rect and node heights TRect iScreenRect; - TInt iListItemHeight; TInt iListNodeHeight; // Nodes that can be focused at startup
--- a/emailuis/emailui/inc/FreestyleEmailUiSearchListVisualiser.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiSearchListVisualiser.h Thu Jan 07 12:38:38 2010 +0200 @@ -112,7 +112,8 @@ TBool IsPreviousMsgAvailable( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId, TFSMailMsgId& aFoundPrevMsgFolder ) const; TInt MoveToNextMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId ); TInt MoveToPreviousMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId ); - + TInt MoveToPreviousMsgAfterDeleteL( TFSMailMsgId aFoundPreviousMsgId ); + public: // from MFSMailBoxSearchObserver void MatchFoundL( CFSMailMessage* aMatchMessage ); void SearchCompletedL(); @@ -176,9 +177,9 @@ /** * Handles the focus state changes - * @param aShow Indicates if focus should become visible or removed + * @param aVisible Indicates if focus should become visible or removed */ - void HandleTimerFocusStateChange( TBool aShow ); + void FocusVisibilityChange( TBool aVisible ); private: CFSEmailUiSearchListVisualiser( CFreestyleEmailUiAppUi* aAppUi, CAlfEnv& aEnv, CAlfControlGroup& aSearchListControlGroup );
--- a/emailuis/emailui/inc/FreestyleEmailUiTextureManager.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiTextureManager.h Thu Jan 07 12:38:38 2010 +0200 @@ -49,6 +49,7 @@ EListTextureNodeCollapsed, EListTextureControlButton, EListTextureMailboxDefaultIcon, + EListTextureNewEmailDefaultIcon, EListControlBarMailboxDefaultIcon, EBackgroundTextureViewerHeading, EBackgroundTextureBar, @@ -156,8 +157,21 @@ EFolderListDeletedItemsTexturePopup, EFolderListServerFoldersTexturePopup, EFolderListEmailAccountTexturePopup, - - + // SORT LIST ICONS + ESortListAttachmentAscTexture, + ESortListAttachmentDescTexture, + ESortListDateAscTexture, + ESortListDateDescTexture, + ESortListFollowAscTexture, + ESortListFollowDescTexture, + ESortListPriorityAscTexture, + ESortListPriorityDescTexture, + ESortListSenderAscTexture, + ESortListSenderDescTexture, + ESortListSubjectAscTexture, + ESortListSubjectDescTexture, + ESortListUnreadAscTexture, + ESortListUnreadDescTexture, // STATUS INDICATOR ICONS ETextureStatusFirst, // non-texture
--- a/emailuis/emailui/inc/FreestyleEmailUiViewBase.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiViewBase.h Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -15,7 +15,7 @@ * The class is not intended for instantation. * */ - + #ifndef __FREESTYLEEMAILUI_VIEWBASE_H__ #define __FREESTYLEEMAILUI_VIEWBASE_H__ @@ -42,7 +42,7 @@ EScreenLayoutChanged, EOther }; - + public: // from CAknView // dummy implementation for the base class abstact functions are needed to be able to define a constructor TUid Id() const; @@ -50,17 +50,17 @@ // <cmail> Toolbar private: - + virtual void DoActivateL( const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage ); // </cmail> Toolbar - + /** * Inherited classes should NOT override this. The should override ChildDoDeactivate() instead. */ void DoDeactivate(); - + public: // new functions /** * Returns a handle to the control group assosiated to this view, as given in the class constructor. @@ -94,7 +94,7 @@ virtual TBool IsPreviousMsgAvailable( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId, TFSMailMsgId& aFoundPrevMsgFolder ) const; virtual TInt MoveToNextMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId ); virtual TInt MoveToPreviousMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId ); - + virtual TInt MoveToPreviousMsgAfterDeleteL( TFSMailMsgId aFoundPreviousMsgId ); /** * Do the transition effect for the view if effects are enabled. */ @@ -104,19 +104,19 @@ * Prepares application exit. This is called by AppUi during cleanup before AppUi's destructor */ virtual void PrepareExitL(); - + /** * Called when flip state changes. */ virtual void FlipStateChangedL( TBool aKeyboardFlipOpen ); /** - * This method is called from the appui when the focus removal timer expires. - * Each inherited view should implement own method for focus removal - * @param aShow Indicates if focus should become visible or removed + * This method is called from the appui when the focus state is changed. + * Each inherited view should implement own method for focus handling + * @param aVisible Indicates if focus should become visible or removed */ - virtual void HandleTimerFocusStateChange( TBool aShow); - + virtual void FocusVisibilityChange( TBool aVisible ); + protected: // methods /** @@ -126,7 +126,7 @@ virtual void HandleForegroundEventL(); /** - * Inherited classes should override this instead of DoDeactivate() + * Inherited classes should override this instead of DoDeactivate() * to do the view deactivation */ virtual void ChildDoDeactivate() = 0; @@ -135,7 +135,7 @@ * Make control group of the view visible and set to accept input. */ virtual void ActivateControlGroup( TInt aDelay = 0 ); - + /** * Make control group of the view invisible and set to ignore input. */ @@ -146,7 +146,7 @@ * some special tricks for transition effects */ virtual void DoTransitionEffect( TBool aDirectionOut ); - + /** * Inheriting Alfred views should override this and return their parent * layout(s) in array given as parameter. Default implementation @@ -166,7 +166,7 @@ * (some long opening view is to be opened next) */ void SetNextTransitionOutLong( TBool aLongTransitionOut ); - + TBool IsNextTransitionOutLong(); /** @@ -175,14 +175,14 @@ * It doesn't hurt to call this also from views which cannot be externally activated. */ void ViewEntered( const TVwsViewId& aPrevViewId ); - + /** * Derived classes should call this to do backwards navigation e.g. when user * presses "Back" button. This returns to the previous view, and in case the view * was activated externally, takes FsEmail to background and brings the previous * application to foreground. */ - virtual void NavigateBackL(); + virtual void NavigateBackL(); /** * Derived classes can call this utility function to set the middle soft key @@ -191,23 +191,23 @@ void ChangeMskCommandL( TInt aLabelResourceId ); // <cmail> Toolbar -protected: // toobar changes - +protected: // toobar changes + /** * @see CAknView::DoActivateL */ - virtual void ChildDoActivateL( + virtual void ChildDoActivateL( const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage ) = 0; - + /** * Return view's toolbar resource id. */ virtual TInt ToolbarResourceId() const; - + /** - * Called when whole toolbar needs to be updated. Creates and sets new + * Called when whole toolbar needs to be updated. Creates and sets new * toolbar by calling ToolbarResourceId() method. */ void UpdateToolbarL(); @@ -217,10 +217,10 @@ * view. * @param aResourceId Resource ID of the toolbar. * @param aDimmedItems Array of items that will be dimmed. - */ + */ virtual void GetInitiallyDimmedItemsL( const TInt aResourceId, RArray<TInt>& aDimmedItems ) const; - + /** * Replaces single toolbar item with item from resource file. Control * must be of AVKON_BUTTON type. @@ -236,7 +236,7 @@ * Removes single toolbar item from toolbar. */ void RemoveToolbarItem( const TInt aRemoveId ); - + /** * Hides toolbar. */ @@ -251,13 +251,13 @@ * Dim/undim toolbar item. */ void SetToolbarItemDimmed( const TInt aCommandId, const TBool aDimmed ); - + /** * Returns ETrue if view has toolbar. */ virtual TBool HasToolbar() const; - -protected: // Single click changes + +protected: // Single click changes /** * Return current state of the focus visibility * @return ETrue if the focus should be shown @@ -269,34 +269,34 @@ * Inherited classes can override this and set desired status bar layout. */ virtual void SetStatusBarLayout(); - + protected: // from MAknToolbarObserver - + /** * @see MAknToolbarObserver::OfferToolbarEventL */ void OfferToolbarEventL( TInt aCommand ); // </cmail> Toolbar - + protected: // construction - + CFsEmailUiViewBase( CAlfControlGroup& aControlGroup, CFreestyleEmailUiAppUi& aAppUi ); - + /** * Return view active status. ETrue if the view is currently activated, EFalse otherwise. */ TBool IsViewActive() const; - + private: /** * Sets view's active status. Private to protect calling from inherited classes. */ void SetViewActive( const TBool aActive ); - + protected: // data - + CAlfControlGroup& iControlGroup; CFreestyleEmailUiAppUi& iAppUi; @@ -305,9 +305,9 @@ // Is focus visible TBool iFocusVisible; - + private: // data - + TUid iPreviousAppUid; // ID of the mailbox which was active before this view was activated from an external application TFSMailMsgId iActiveMailboxBeforeExternalActivation;
--- a/emailuis/emailui/inc/FreestyleMessageHeaderHTML.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/FreestyleMessageHeaderHTML.h Thu Jan 07 12:38:38 2010 +0200 @@ -32,11 +32,11 @@ class CFreestyleMessageHeaderHTML : public CBase { public: - IMPORT_C static void ExportL( CFSMailMessage& aMailMessage, RWriteStream& aWriteStream ); - IMPORT_C static void ExportL( CFSMailMessage& aMailMessage, RFile& aFile ); - IMPORT_C static void ExportL( CFSMailMessage& aMailMessage, RFs& aFs, const TPath& aFilePath); + IMPORT_C static void ExportL( CFSMailMessage& aMailMessage, RWriteStream& aWriteStream, TInt aVisibleWidth ); + IMPORT_C static void ExportL( CFSMailMessage& aMailMessage, RFile& aFile, TInt aVisibleWidth ); + IMPORT_C static void ExportL( CFSMailMessage& aMailMessage, RFs& aFs, const TPath& aFilePath, TInt aVisibleWidth ); - IMPORT_C static CFreestyleMessageHeaderHTML* NewL( CFSMailMessage& aMailMessage ); + IMPORT_C static CFreestyleMessageHeaderHTML* NewL( CFSMailMessage& aMailMessage, TInt aVisibleWidth ); ~CFreestyleMessageHeaderHTML(); @@ -45,7 +45,7 @@ IMPORT_C void ExportL( RFs& aFs, const TPath& aFilePath) const; private: - CFreestyleMessageHeaderHTML( CFSMailMessage& aMailMessage ); + CFreestyleMessageHeaderHTML( CFSMailMessage& aMailMessage, TInt aVisibleWidth ); void ConstructL(); void HTMLStartL( RWriteStream& aWriteStream ) const; @@ -70,7 +70,10 @@ void ExportEmailAddressesL( RWriteStream& aWriteStream, FreestyleMessageHeaderURLFactory::TEmailAddressType aEmailAddressType, - const RPointerArray<CFSMailAddress>& aEmailAddresses ) const; + const RPointerArray<CFSMailAddress>& aEmailAddresses, + const TDesC8& aRowId, + const TDesC8& aTableId, + TInt aHeaderTextResourceId ) const; void AddEmailAddressL( RWriteStream& aWriteStream, FreestyleMessageHeaderURLFactory::TEmailAddressType aEmailAddressType, @@ -107,6 +110,7 @@ private: CFSMailMessage& iMailMessage; + TInt iVisibleWidth; RPointerArray<CFSMailMessagePart> iAttachments; };
--- a/emailuis/emailui/inc/freestyleemailuimailboxdeleter.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/freestyleemailuimailboxdeleter.h Thu Jan 07 12:38:38 2010 +0200 @@ -91,6 +91,13 @@ */ void DeleteMailboxL(); + /** + * Deletes the given mailbox. Displays also a confirmation dialog. + * @param aMailboxId The ID of the mail box to delete. + */ + void DeleteMailboxL( const TFSMailMsgId& aMailboxId ); + + protected: // from MProgressDialogCallback void DialogDismissedL( TInt aButtonId ); @@ -107,7 +114,15 @@ MFSEmailUiMailboxDeleteObserver& aObserver ); private: - + + /** + * Returns the mailboxes that can be deleted. Note that the given array is + * left in the clean up stack. + * @param aMailboxes The array where the mailboxes are added to. + * @return The number of deletable mailboxes found. + */ + TInt GetDeletableMailboxesLC( RPointerArray<CFSMailBox>& aMailboxes ); + /** * Deletes a single mailbox. * @param aMailboxes Array containing the mailbox to be deleted. @@ -123,6 +138,12 @@ TBool DeleteMultipleMailboxesL( const RPointerArray<CFSMailBox>& aMailboxes ); /** + * Deletes the selected mailboxes i.e. those of which IDs are in the + * iMailboxesToDelete array. + */ + void DoDeleteSelectedMailboxesL(); + + /** * Confirms mailbox deletion. Behavior depends on the number of mailboxes * to be deleted. aMailboxName is not used if aCount > 1. * @param aCount Number of mailboxes to be removed.
--- a/emailuis/emailui/inc/ncsaifeditor.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/ncsaifeditor.h Thu Jan 07 12:38:38 2010 +0200 @@ -36,7 +36,7 @@ { public: // constructors/destructor - CNcsAifEditor( MNcsFieldSizeObserver* aSizeObserver ); + CNcsAifEditor( MNcsFieldSizeObserver* aSizeObserver, const TDesC& aCaptionText ); void ConstructL( const CCoeControl* aParent, TInt aNumberOfLines, @@ -47,6 +47,7 @@ public: // from CoeControl TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ); + void HandlePointerEventL( const TPointerEvent& aPointerEvent ); public: // from MEikEdwinObserver @@ -178,7 +179,8 @@ const CNcsAifEntry* aEntry, TInt& aNrOfMatchesInText, TInt& aNrOfMatchesInEntryArray ); - + void CompleteEntryL(); + private: // data RPointerArray<CNcsAifEntry> iArray; @@ -193,6 +195,8 @@ // Flag indicating whether add the leftover text to the end of the field TBool iAddLeftover; + TCursorSelection iTextSelection; + TBool iPartialRemove; };
--- a/emailuis/emailui/inc/ncscomposeview.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/ncscomposeview.h Thu Jan 07 12:38:38 2010 +0200 @@ -163,7 +163,7 @@ public: // from MComposerFetchLogicCallback - void FetchLogicComplete( TComposerFetchState aState, TInt aError ); + TBool FetchLogicComplete( TComposerFetchState aState, TInt aError ); public: // new functions
--- a/emailuis/emailui/inc/ncseditor.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/inc/ncseditor.h Thu Jan 07 12:38:38 2010 +0200 @@ -34,14 +34,15 @@ /** * CNcsEditor */ -class CNcsEditor : public CEikRichTextEditor, public MNcsControl +class CNcsEditor : public CEikRichTextEditor, public MNcsControl, public MCoeCaptionRetrieverForFep { public: // construction and destruction CNcsEditor( MNcsFieldSizeObserver* aSizeObserver = NULL, TBool aHeaderField = ETrue, - TNcsEditorUsage aEditorUsage = ENcsEditorDefault ); + TNcsEditorUsage aEditorUsage = ENcsEditorDefault, + const TDesC& aCaptionText = TPtrC() ); void ConstructL( const CCoeControl* aParent, TInt aNumberOfLines, @@ -136,8 +137,12 @@ virtual void EditObserver( TInt aStart, TInt aExtent ); -private: // methods used internally - +public: // CEikEdwin + TCoeInputCapabilities InputCapabilities() const; +public: // MCoeCaptionRetrieverForFep + void GetCaptionForFep(TDes& aCaption) const; + +private: // methods used internally // <cmail> Platform layout change void UpdateFontL(); // </cmail> Platform layout change @@ -181,6 +186,9 @@ // Real screen rectangle TRect iRealRect; + + // Caption text for virtual ITU-T + HBufC* iCaptionText; };
--- a/emailuis/emailui/loc/freestyleemailui.loc Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/loc/freestyleemailui.loc Thu Jan 07 12:38:38 2010 +0200 @@ -2593,4 +2593,22 @@ // l:main_sp_fs_ctrlbar_ddmenu_pane_t1 // r:TB9.2 // -#define gtn_cmail_command_area_select_folders "Select folders" +#define qtn_cmail_command_area_select_folders "Select folders" + +// d:Create a new email from command area button +// l:main_sp_fs_ctrlbar_ddmenu_pane_t1 +// r:TB9.2 +// +#define qtn_cmail_command_area_new "New" + +// d:Submenu option for the 150% zoom level in HTML viewer +// l:list_single_popup_submenu_pane_t1/opt1 +// r:5250+ +// +#define qtn_fse_zoom_level_150_percent "150%" + +// d:Mail deleted notification +// l:popup_note_window +// r:TB9.2 +// +#define qtn_fse_mail_deleted_note "Mail deleted"
--- a/emailuis/emailui/sis/commonemail.pkg Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/sis/commonemail.pkg Thu Jan 07 12:38:38 2010 +0200 @@ -52,7 +52,7 @@ ;----------------------------------------------------------------------------- ; MfE plugin installed as embedded sisx-package ;------------------------- -@"..\..\..\..\..\complementary\eas\sis\eas_engine.sisx",(0x20012BE9) +@"\ext\app\eas\sis\eas_engine.sisx",(0x20012BE9) ;----------------------------------------------------------------------------- ; Actual common email files to be installed @@ -132,10 +132,7 @@ "\epoc32\release\armv5\urel\cmailhandlerplugin.dll" - "c:\sys\bin\cmailhandlerplugin.dll" "\epoc32\data\Z\Resource\Plugins\cmailhandlerplugin.rsc" - "c:\resource\plugins\cmailhandlerplugin.rsc" "\epoc32\data\z\resource\apps\cmailhandlerplugin.mif" - "c:\resource\apps\cmailhandlerplugin.mif" - -; Change path to normal resource path (not ECom res) when fixed in cmailhandlerplugin code -; Uncomment in TB 9.2 branch after 5250+ branched -;"\epoc32\data\Z\Resource\Plugins\emailwidget.rsc" - "c:\resource\plugins\emailwidget.rsc" +"\epoc32\data\Z\resource\apps\emailwidget.rsc" - "c:\resource\apps\emailwidget.rsc" ; ipservices "\epoc32\release\armv5\urel\ipssosplugin.dll" - "c:\sys\bin\ipssosplugin.dll"
--- a/emailuis/emailui/sis/commonemail_loc.pkg Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/sis/commonemail_loc.pkg Thu Jan 07 12:38:38 2010 +0200 @@ -52,7 +52,7 @@ ;----------------------------------------------------------------------------- ; MfE plugin installed as embedded sisx-package ;------------------------- -@"..\..\..\..\..\complementary\eas\sis\eas_engine_loc.sisx",(0x20012BE9) +@"\ext\app\eas\sis\eas_engine_loc.sisx",(0x20012BE9) ;----------------------------------------------------------------------------- ; Actual common email files to be installed @@ -135,10 +135,8 @@ "\epoc32\release\armv5\urel\cmailhandlerplugin.dll" - "c:\sys\bin\cmailhandlerplugin.dll" "\epoc32\data\Z\Resource\Plugins\cmailhandlerplugin.rsc" - "c:\resource\plugins\cmailhandlerplugin.rsc" "\epoc32\data\z\resource\apps\cmailhandlerplugin.mif" - "c:\resource\apps\cmailhandlerplugin.mif" - -; Change path to normal resource path (not ECom res) when fixed in cmailhandlerplugin code -; Uncomment in TB 9.2 branch after 5250+ branched -;"\epoc32\data\Z\Resource\Plugins\emailwidget.rsc" - "c:\resource\plugins\emailwidget.rsc" +; Following line is localized, so this Engineering English line is commented out +;"\epoc32\data\Z\resource\apps\emailwidget.rsc" - "c:\resource\apps\emailwidget.rsc" ; ipservices "\epoc32\release\armv5\urel\ipssosplugin.dll" - "c:\sys\bin\ipssosplugin.dll" @@ -259,6 +257,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r01" - "c:\resource\apps\freestyleemailui.r01" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r01" - "c:\resource\apps\gsemailsettingsplugin.r01" "\epoc32\data\z\resource\apps\fsmailserver.r01" - "c:\resource\apps\fsmailserver.r01" + "\epoc32\data\z\resource\apps\emailwidget.r01" - "c:\resource\apps\emailwidget.r01" "\epoc32\data\z\resource\ipssossettings.r01" - "c:\resource\ipssossettings.r01" "\epoc32\data\z\resource\apps\fscpocplugin.r01" - "c:\resource\apps\fscpocplugin.r01" "\epoc32\data\z\resource\apps\fsccallplugin.r01" - "c:\resource\apps\fsccallplugin.r01" @@ -274,6 +273,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r02" - "c:\resource\apps\freestyleemailui.r02" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r02" - "c:\resource\apps\gsemailsettingsplugin.r02" "\epoc32\data\z\resource\apps\fsmailserver.r02" - "c:\resource\apps\fsmailserver.r02" + "\epoc32\data\z\resource\apps\emailwidget.r02" - "c:\resource\apps\emailwidget.r02" "\epoc32\data\z\resource\ipssossettings.r02" - "c:\resource\ipssossettings.r02" "\epoc32\data\z\resource\apps\fscpocplugin.r02" - "c:\resource\apps\fscpocplugin.r02" "\epoc32\data\z\resource\apps\fsccallplugin.r02" - "c:\resource\apps\fsccallplugin.r02" @@ -289,6 +289,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r03" - "c:\resource\apps\freestyleemailui.r03" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r03" - "c:\resource\apps\gsemailsettingsplugin.r03" "\epoc32\data\z\resource\apps\fsmailserver.r03" - "c:\resource\apps\fsmailserver.r03" + "\epoc32\data\z\resource\apps\emailwidget.r03" - "c:\resource\apps\emailwidget.r03" "\epoc32\data\z\resource\ipssossettings.r03" - "c:\resource\ipssossettings.r03" "\epoc32\data\z\resource\apps\fscpocplugin.r03" - "c:\resource\apps\fscpocplugin.r03" "\epoc32\data\z\resource\apps\fsccallplugin.r03" - "c:\resource\apps\fsccallplugin.r03" @@ -304,6 +305,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r04" - "c:\resource\apps\freestyleemailui.r04" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r04" - "c:\resource\apps\gsemailsettingsplugin.r04" "\epoc32\data\z\resource\apps\fsmailserver.r04" - "c:\resource\apps\fsmailserver.r04" + "\epoc32\data\z\resource\apps\emailwidget.r04" - "c:\resource\apps\emailwidget.r04" "\epoc32\data\z\resource\ipssossettings.r04" - "c:\resource\ipssossettings.r04" "\epoc32\data\z\resource\apps\fscpocplugin.r04" - "c:\resource\apps\fscpocplugin.r04" "\epoc32\data\z\resource\apps\fsccallplugin.r04" - "c:\resource\apps\fsccallplugin.r04" @@ -319,6 +321,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r05" - "c:\resource\apps\freestyleemailui.r05" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r05" - "c:\resource\apps\gsemailsettingsplugin.r05" "\epoc32\data\z\resource\apps\fsmailserver.r05" - "c:\resource\apps\fsmailserver.r05" + "\epoc32\data\z\resource\apps\emailwidget.r05" - "c:\resource\apps\emailwidget.r05" "\epoc32\data\z\resource\ipssossettings.r05" - "c:\resource\ipssossettings.r05" "\epoc32\data\z\resource\apps\fscpocplugin.r05" - "c:\resource\apps\fscpocplugin.r05" "\epoc32\data\z\resource\apps\fsccallplugin.r05" - "c:\resource\apps\fsccallplugin.r05" @@ -334,6 +337,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r06" - "c:\resource\apps\freestyleemailui.r06" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r06" - "c:\resource\apps\gsemailsettingsplugin.r06" "\epoc32\data\z\resource\apps\fsmailserver.r06" - "c:\resource\apps\fsmailserver.r06" + "\epoc32\data\z\resource\apps\emailwidget.r06" - "c:\resource\apps\emailwidget.r06" "\epoc32\data\z\resource\ipssossettings.r06" - "c:\resource\ipssossettings.r06" "\epoc32\data\z\resource\apps\fscpocplugin.r06" - "c:\resource\apps\fscpocplugin.r06" "\epoc32\data\z\resource\apps\fsccallplugin.r06" - "c:\resource\apps\fsccallplugin.r06" @@ -349,6 +353,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r07" - "c:\resource\apps\freestyleemailui.r07" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r07" - "c:\resource\apps\gsemailsettingsplugin.r07" "\epoc32\data\z\resource\apps\fsmailserver.r07" - "c:\resource\apps\fsmailserver.r07" + "\epoc32\data\z\resource\apps\emailwidget.r07" - "c:\resource\apps\emailwidget.r07" "\epoc32\data\z\resource\ipssossettings.r07" - "c:\resource\ipssossettings.r07" "\epoc32\data\z\resource\apps\fscpocplugin.r07" - "c:\resource\apps\fscpocplugin.r07" "\epoc32\data\z\resource\apps\fsccallplugin.r07" - "c:\resource\apps\fsccallplugin.r07" @@ -364,6 +369,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r08" - "c:\resource\apps\freestyleemailui.r08" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r08" - "c:\resource\apps\gsemailsettingsplugin.r08" "\epoc32\data\z\resource\apps\fsmailserver.r08" - "c:\resource\apps\fsmailserver.r08" + "\epoc32\data\z\resource\apps\emailwidget.r08" - "c:\resource\apps\emailwidget.r08" "\epoc32\data\z\resource\ipssossettings.r08" - "c:\resource\ipssossettings.r08" "\epoc32\data\z\resource\apps\fscpocplugin.r08" - "c:\resource\apps\fscpocplugin.r08" "\epoc32\data\z\resource\apps\fsccallplugin.r08" - "c:\resource\apps\fsccallplugin.r08" @@ -379,6 +385,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r09" - "c:\resource\apps\freestyleemailui.r09" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r09" - "c:\resource\apps\gsemailsettingsplugin.r09" "\epoc32\data\z\resource\apps\fsmailserver.r09" - "c:\resource\apps\fsmailserver.r09" + "\epoc32\data\z\resource\apps\emailwidget.r09" - "c:\resource\apps\emailwidget.r09" "\epoc32\data\z\resource\ipssossettings.r09" - "c:\resource\ipssossettings.r09" "\epoc32\data\z\resource\apps\fscpocplugin.r09" - "c:\resource\apps\fscpocplugin.r09" "\epoc32\data\z\resource\apps\fsccallplugin.r09" - "c:\resource\apps\fsccallplugin.r09" @@ -394,6 +401,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r10" - "c:\resource\apps\freestyleemailui.r10" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r10" - "c:\resource\apps\gsemailsettingsplugin.r10" "\epoc32\data\z\resource\apps\fsmailserver.r10" - "c:\resource\apps\fsmailserver.r10" + "\epoc32\data\z\resource\apps\emailwidget.r10" - "c:\resource\apps\emailwidget.r10" "\epoc32\data\z\resource\ipssossettings.r10" - "c:\resource\ipssossettings.r10" "\epoc32\data\z\resource\apps\fscpocplugin.r10" - "c:\resource\apps\fscpocplugin.r10" "\epoc32\data\z\resource\apps\fsccallplugin.r10" - "c:\resource\apps\fsccallplugin.r10" @@ -409,6 +417,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r13" - "c:\resource\apps\freestyleemailui.r13" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r13" - "c:\resource\apps\gsemailsettingsplugin.r13" "\epoc32\data\z\resource\apps\fsmailserver.r13" - "c:\resource\apps\fsmailserver.r13" + "\epoc32\data\z\resource\apps\emailwidget.r13" - "c:\resource\apps\emailwidget.r13" "\epoc32\data\z\resource\ipssossettings.r13" - "c:\resource\ipssossettings.r13" "\epoc32\data\z\resource\apps\fscpocplugin.r13" - "c:\resource\apps\fscpocplugin.r13" "\epoc32\data\z\resource\apps\fsccallplugin.r13" - "c:\resource\apps\fsccallplugin.r13" @@ -424,6 +433,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r14" - "c:\resource\apps\freestyleemailui.r14" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r14" - "c:\resource\apps\gsemailsettingsplugin.r14" "\epoc32\data\z\resource\apps\fsmailserver.r14" - "c:\resource\apps\fsmailserver.r14" + "\epoc32\data\z\resource\apps\emailwidget.r14" - "c:\resource\apps\emailwidget.r14" "\epoc32\data\z\resource\ipssossettings.r14" - "c:\resource\ipssossettings.r14" "\epoc32\data\z\resource\apps\fscpocplugin.r14" - "c:\resource\apps\fscpocplugin.r14" "\epoc32\data\z\resource\apps\fsccallplugin.r14" - "c:\resource\apps\fsccallplugin.r14" @@ -439,6 +449,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r15" - "c:\resource\apps\freestyleemailui.r15" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r15" - "c:\resource\apps\gsemailsettingsplugin.r15" "\epoc32\data\z\resource\apps\fsmailserver.r15" - "c:\resource\apps\fsmailserver.r15" + "\epoc32\data\z\resource\apps\emailwidget.r15" - "c:\resource\apps\emailwidget.r15" "\epoc32\data\z\resource\ipssossettings.r15" - "c:\resource\ipssossettings.r15" "\epoc32\data\z\resource\apps\fscpocplugin.r15" - "c:\resource\apps\fscpocplugin.r15" "\epoc32\data\z\resource\apps\fsccallplugin.r15" - "c:\resource\apps\fsccallplugin.r15" @@ -454,6 +465,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r16" - "c:\resource\apps\freestyleemailui.r16" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r16" - "c:\resource\apps\gsemailsettingsplugin.r16" "\epoc32\data\z\resource\apps\fsmailserver.r16" - "c:\resource\apps\fsmailserver.r16" + "\epoc32\data\z\resource\apps\emailwidget.r16" - "c:\resource\apps\emailwidget.r16" "\epoc32\data\z\resource\ipssossettings.r16" - "c:\resource\ipssossettings.r16" "\epoc32\data\z\resource\apps\fscpocplugin.r16" - "c:\resource\apps\fscpocplugin.r16" "\epoc32\data\z\resource\apps\fsccallplugin.r16" - "c:\resource\apps\fsccallplugin.r16" @@ -469,6 +481,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r17" - "c:\resource\apps\freestyleemailui.r17" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r17" - "c:\resource\apps\gsemailsettingsplugin.r17" "\epoc32\data\z\resource\apps\fsmailserver.r17" - "c:\resource\apps\fsmailserver.r17" + "\epoc32\data\z\resource\apps\emailwidget.r17" - "c:\resource\apps\emailwidget.r17" "\epoc32\data\z\resource\ipssossettings.r17" - "c:\resource\ipssossettings.r17" "\epoc32\data\z\resource\apps\fscpocplugin.r17" - "c:\resource\apps\fscpocplugin.r17" "\epoc32\data\z\resource\apps\fsccallplugin.r17" - "c:\resource\apps\fsccallplugin.r17" @@ -484,6 +497,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r18" - "c:\resource\apps\freestyleemailui.r18" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r18" - "c:\resource\apps\gsemailsettingsplugin.r18" "\epoc32\data\z\resource\apps\fsmailserver.r18" - "c:\resource\apps\fsmailserver.r18" + "\epoc32\data\z\resource\apps\emailwidget.r18" - "c:\resource\apps\emailwidget.r18" "\epoc32\data\z\resource\ipssossettings.r18" - "c:\resource\ipssossettings.r18" "\epoc32\data\z\resource\apps\fscpocplugin.r18" - "c:\resource\apps\fscpocplugin.r18" "\epoc32\data\z\resource\apps\fsccallplugin.r18" - "c:\resource\apps\fsccallplugin.r18" @@ -499,6 +513,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r25" - "c:\resource\apps\freestyleemailui.r25" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r25" - "c:\resource\apps\gsemailsettingsplugin.r25" "\epoc32\data\z\resource\apps\fsmailserver.r25" - "c:\resource\apps\fsmailserver.r25" + "\epoc32\data\z\resource\apps\emailwidget.r25" - "c:\resource\apps\emailwidget.r25" "\epoc32\data\z\resource\ipssossettings.r25" - "c:\resource\ipssossettings.r25" "\epoc32\data\z\resource\apps\fscpocplugin.r25" - "c:\resource\apps\fscpocplugin.r25" "\epoc32\data\z\resource\apps\fsccallplugin.r25" - "c:\resource\apps\fsccallplugin.r25" @@ -514,6 +529,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r26" - "c:\resource\apps\freestyleemailui.r26" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r26" - "c:\resource\apps\gsemailsettingsplugin.r26" "\epoc32\data\z\resource\apps\fsmailserver.r26" - "c:\resource\apps\fsmailserver.r26" + "\epoc32\data\z\resource\apps\emailwidget.r26" - "c:\resource\apps\emailwidget.r26" "\epoc32\data\z\resource\ipssossettings.r26" - "c:\resource\ipssossettings.r26" "\epoc32\data\z\resource\apps\fscpocplugin.r26" - "c:\resource\apps\fscpocplugin.r26" "\epoc32\data\z\resource\apps\fsccallplugin.r26" - "c:\resource\apps\fsccallplugin.r26" @@ -529,6 +545,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r27" - "c:\resource\apps\freestyleemailui.r27" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r27" - "c:\resource\apps\gsemailsettingsplugin.r27" "\epoc32\data\z\resource\apps\fsmailserver.r27" - "c:\resource\apps\fsmailserver.r27" + "\epoc32\data\z\resource\apps\emailwidget.r27" - "c:\resource\apps\emailwidget.r27" "\epoc32\data\z\resource\ipssossettings.r27" - "c:\resource\ipssossettings.r27" "\epoc32\data\z\resource\apps\fscpocplugin.r27" - "c:\resource\apps\fscpocplugin.r27" "\epoc32\data\z\resource\apps\fsccallplugin.r27" - "c:\resource\apps\fsccallplugin.r27" @@ -544,6 +561,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r28" - "c:\resource\apps\freestyleemailui.r28" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r28" - "c:\resource\apps\gsemailsettingsplugin.r28" "\epoc32\data\z\resource\apps\fsmailserver.r28" - "c:\resource\apps\fsmailserver.r28" + "\epoc32\data\z\resource\apps\emailwidget.r28" - "c:\resource\apps\emailwidget.r28" "\epoc32\data\z\resource\ipssossettings.r28" - "c:\resource\ipssossettings.r28" "\epoc32\data\z\resource\apps\fscpocplugin.r28" - "c:\resource\apps\fscpocplugin.r28" "\epoc32\data\z\resource\apps\fsccallplugin.r28" - "c:\resource\apps\fsccallplugin.r28" @@ -559,6 +577,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r29" - "c:\resource\apps\freestyleemailui.r29" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r29" - "c:\resource\apps\gsemailsettingsplugin.r29" "\epoc32\data\z\resource\apps\fsmailserver.r29" - "c:\resource\apps\fsmailserver.r29" + "\epoc32\data\z\resource\apps\emailwidget.r29" - "c:\resource\apps\emailwidget.r29" "\epoc32\data\z\resource\ipssossettings.r29" - "c:\resource\ipssossettings.r29" "\epoc32\data\z\resource\apps\fscpocplugin.r29" - "c:\resource\apps\fscpocplugin.r29" "\epoc32\data\z\resource\apps\fsccallplugin.r29" - "c:\resource\apps\fsccallplugin.r29" @@ -574,6 +593,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r30" - "c:\resource\apps\freestyleemailui.r30" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r30" - "c:\resource\apps\gsemailsettingsplugin.r30" "\epoc32\data\z\resource\apps\fsmailserver.r30" - "c:\resource\apps\fsmailserver.r30" + "\epoc32\data\z\resource\apps\emailwidget.r30" - "c:\resource\apps\emailwidget.r30" "\epoc32\data\z\resource\ipssossettings.r30" - "c:\resource\ipssossettings.r30" "\epoc32\data\z\resource\apps\fscpocplugin.r30" - "c:\resource\apps\fscpocplugin.r30" "\epoc32\data\z\resource\apps\fsccallplugin.r30" - "c:\resource\apps\fsccallplugin.r30" @@ -589,6 +609,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r31" - "c:\resource\apps\freestyleemailui.r31" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r31" - "c:\resource\apps\gsemailsettingsplugin.r31" "\epoc32\data\z\resource\apps\fsmailserver.r31" - "c:\resource\apps\fsmailserver.r31" + "\epoc32\data\z\resource\apps\emailwidget.r31" - "c:\resource\apps\emailwidget.r31" "\epoc32\data\z\resource\ipssossettings.r31" - "c:\resource\ipssossettings.r31" "\epoc32\data\z\resource\apps\fscpocplugin.r31" - "c:\resource\apps\fscpocplugin.r31" "\epoc32\data\z\resource\apps\fsccallplugin.r31" - "c:\resource\apps\fsccallplugin.r31" @@ -604,6 +625,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r32" - "c:\resource\apps\freestyleemailui.r32" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r32" - "c:\resource\apps\gsemailsettingsplugin.r32" "\epoc32\data\z\resource\apps\fsmailserver.r32" - "c:\resource\apps\fsmailserver.r32" + "\epoc32\data\z\resource\apps\emailwidget.r32" - "c:\resource\apps\emailwidget.r32" "\epoc32\data\z\resource\ipssossettings.r32" - "c:\resource\ipssossettings.r32" "\epoc32\data\z\resource\apps\fscpocplugin.r32" - "c:\resource\apps\fscpocplugin.r32" "\epoc32\data\z\resource\apps\fsccallplugin.r32" - "c:\resource\apps\fsccallplugin.r32" @@ -619,6 +641,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r33" - "c:\resource\apps\freestyleemailui.r33" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r33" - "c:\resource\apps\gsemailsettingsplugin.r33" "\epoc32\data\z\resource\apps\fsmailserver.r33" - "c:\resource\apps\fsmailserver.r33" + "\epoc32\data\z\resource\apps\emailwidget.r33" - "c:\resource\apps\emailwidget.r33" "\epoc32\data\z\resource\ipssossettings.r33" - "c:\resource\ipssossettings.r33" "\epoc32\data\z\resource\apps\fscpocplugin.r33" - "c:\resource\apps\fscpocplugin.r33" "\epoc32\data\z\resource\apps\fsccallplugin.r33" - "c:\resource\apps\fsccallplugin.r33" @@ -634,6 +657,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r37" - "c:\resource\apps\freestyleemailui.r37" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r37" - "c:\resource\apps\gsemailsettingsplugin.r37" "\epoc32\data\z\resource\apps\fsmailserver.r37" - "c:\resource\apps\fsmailserver.r37" + "\epoc32\data\z\resource\apps\emailwidget.r37" - "c:\resource\apps\emailwidget.r37" "\epoc32\data\z\resource\ipssossettings.r37" - "c:\resource\ipssossettings.r37" "\epoc32\data\z\resource\apps\fscpocplugin.r37" - "c:\resource\apps\fscpocplugin.r37" "\epoc32\data\z\resource\apps\fsccallplugin.r37" - "c:\resource\apps\fsccallplugin.r37" @@ -649,6 +673,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r39" - "c:\resource\apps\freestyleemailui.r39" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r39" - "c:\resource\apps\gsemailsettingsplugin.r39" "\epoc32\data\z\resource\apps\fsmailserver.r39" - "c:\resource\apps\fsmailserver.r39" + "\epoc32\data\z\resource\apps\emailwidget.r39" - "c:\resource\apps\emailwidget.r39" "\epoc32\data\z\resource\ipssossettings.r39" - "c:\resource\ipssossettings.r39" "\epoc32\data\z\resource\apps\fscpocplugin.r39" - "c:\resource\apps\fscpocplugin.r39" "\epoc32\data\z\resource\apps\fsccallplugin.r39" - "c:\resource\apps\fsccallplugin.r39" @@ -664,6 +689,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r42" - "c:\resource\apps\freestyleemailui.r42" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r42" - "c:\resource\apps\gsemailsettingsplugin.r42" "\epoc32\data\z\resource\apps\fsmailserver.r42" - "c:\resource\apps\fsmailserver.r42" + "\epoc32\data\z\resource\apps\emailwidget.r42" - "c:\resource\apps\emailwidget.r42" "\epoc32\data\z\resource\ipssossettings.r42" - "c:\resource\ipssossettings.r42" "\epoc32\data\z\resource\apps\fscpocplugin.r42" - "c:\resource\apps\fscpocplugin.r42" "\epoc32\data\z\resource\apps\fsccallplugin.r42" - "c:\resource\apps\fsccallplugin.r42" @@ -679,6 +705,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r44" - "c:\resource\apps\freestyleemailui.r44" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r44" - "c:\resource\apps\gsemailsettingsplugin.r44" "\epoc32\data\z\resource\apps\fsmailserver.r44" - "c:\resource\apps\fsmailserver.r44" + "\epoc32\data\z\resource\apps\emailwidget.r44" - "c:\resource\apps\emailwidget.r44" "\epoc32\data\z\resource\ipssossettings.r44" - "c:\resource\ipssossettings.r44" "\epoc32\data\z\resource\apps\fscpocplugin.r44" - "c:\resource\apps\fscpocplugin.r44" "\epoc32\data\z\resource\apps\fsccallplugin.r44" - "c:\resource\apps\fsccallplugin.r44" @@ -694,6 +721,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r45" - "c:\resource\apps\freestyleemailui.r45" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r45" - "c:\resource\apps\gsemailsettingsplugin.r45" "\epoc32\data\z\resource\apps\fsmailserver.r45" - "c:\resource\apps\fsmailserver.r45" + "\epoc32\data\z\resource\apps\emailwidget.r45" - "c:\resource\apps\emailwidget.r45" "\epoc32\data\z\resource\ipssossettings.r45" - "c:\resource\ipssossettings.r45" "\epoc32\data\z\resource\apps\fscpocplugin.r45" - "c:\resource\apps\fscpocplugin.r45" "\epoc32\data\z\resource\apps\fsccallplugin.r45" - "c:\resource\apps\fsccallplugin.r45" @@ -709,6 +737,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r49" - "c:\resource\apps\freestyleemailui.r49" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r49" - "c:\resource\apps\gsemailsettingsplugin.r49" "\epoc32\data\z\resource\apps\fsmailserver.r49" - "c:\resource\apps\fsmailserver.r49" + "\epoc32\data\z\resource\apps\emailwidget.r49" - "c:\resource\apps\emailwidget.r49" "\epoc32\data\z\resource\ipssossettings.r49" - "c:\resource\ipssossettings.r49" "\epoc32\data\z\resource\apps\fscpocplugin.r49" - "c:\resource\apps\fscpocplugin.r49" "\epoc32\data\z\resource\apps\fsccallplugin.r49" - "c:\resource\apps\fsccallplugin.r49" @@ -724,6 +753,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r50" - "c:\resource\apps\freestyleemailui.r50" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r50" - "c:\resource\apps\gsemailsettingsplugin.r50" "\epoc32\data\z\resource\apps\fsmailserver.r50" - "c:\resource\apps\fsmailserver.r50" + "\epoc32\data\z\resource\apps\emailwidget.r50" - "c:\resource\apps\emailwidget.r50" "\epoc32\data\z\resource\ipssossettings.r50" - "c:\resource\ipssossettings.r50" "\epoc32\data\z\resource\apps\fscpocplugin.r50" - "c:\resource\apps\fscpocplugin.r50" "\epoc32\data\z\resource\apps\fsccallplugin.r50" - "c:\resource\apps\fsccallplugin.r50" @@ -739,6 +769,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r51" - "c:\resource\apps\freestyleemailui.r51" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r51" - "c:\resource\apps\gsemailsettingsplugin.r51" "\epoc32\data\z\resource\apps\fsmailserver.r51" - "c:\resource\apps\fsmailserver.r51" + "\epoc32\data\z\resource\apps\emailwidget.r51" - "c:\resource\apps\emailwidget.r51" "\epoc32\data\z\resource\ipssossettings.r51" - "c:\resource\ipssossettings.r51" "\epoc32\data\z\resource\apps\fscpocplugin.r51" - "c:\resource\apps\fscpocplugin.r51" "\epoc32\data\z\resource\apps\fsccallplugin.r51" - "c:\resource\apps\fsccallplugin.r51" @@ -754,6 +785,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r54" - "c:\resource\apps\freestyleemailui.r54" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r54" - "c:\resource\apps\gsemailsettingsplugin.r54" "\epoc32\data\z\resource\apps\fsmailserver.r54" - "c:\resource\apps\fsmailserver.r54" + "\epoc32\data\z\resource\apps\emailwidget.r54" - "c:\resource\apps\emailwidget.r54" "\epoc32\data\z\resource\ipssossettings.r54" - "c:\resource\ipssossettings.r54" "\epoc32\data\z\resource\apps\fscpocplugin.r54" - "c:\resource\apps\fscpocplugin.r54" "\epoc32\data\z\resource\apps\fsccallplugin.r54" - "c:\resource\apps\fsccallplugin.r54" @@ -769,6 +801,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r57" - "c:\resource\apps\freestyleemailui.r57" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r57" - "c:\resource\apps\gsemailsettingsplugin.r57" "\epoc32\data\z\resource\apps\fsmailserver.r57" - "c:\resource\apps\fsmailserver.r57" + "\epoc32\data\z\resource\apps\emailwidget.r57" - "c:\resource\apps\emailwidget.r57" "\epoc32\data\z\resource\ipssossettings.r57" - "c:\resource\ipssossettings.r57" "\epoc32\data\z\resource\apps\fscpocplugin.r57" - "c:\resource\apps\fscpocplugin.r57" "\epoc32\data\z\resource\apps\fsccallplugin.r57" - "c:\resource\apps\fsccallplugin.r57" @@ -784,6 +817,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r59" - "c:\resource\apps\freestyleemailui.r59" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r59" - "c:\resource\apps\gsemailsettingsplugin.r59" "\epoc32\data\z\resource\apps\fsmailserver.r59" - "c:\resource\apps\fsmailserver.r59" + "\epoc32\data\z\resource\apps\emailwidget.r59" - "c:\resource\apps\emailwidget.r59" "\epoc32\data\z\resource\ipssossettings.r59" - "c:\resource\ipssossettings.r59" "\epoc32\data\z\resource\apps\fscpocplugin.r59" - "c:\resource\apps\fscpocplugin.r59" "\epoc32\data\z\resource\apps\fsccallplugin.r59" - "c:\resource\apps\fsccallplugin.r59" @@ -799,6 +833,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r67" - "c:\resource\apps\freestyleemailui.r67" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r67" - "c:\resource\apps\gsemailsettingsplugin.r67" "\epoc32\data\z\resource\apps\fsmailserver.r67" - "c:\resource\apps\fsmailserver.r67" + "\epoc32\data\z\resource\apps\emailwidget.r67" - "c:\resource\apps\emailwidget.r67" "\epoc32\data\z\resource\ipssossettings.r67" - "c:\resource\ipssossettings.r67" "\epoc32\data\z\resource\apps\fscpocplugin.r67" - "c:\resource\apps\fscpocplugin.r67" "\epoc32\data\z\resource\apps\fsccallplugin.r67" - "c:\resource\apps\fsccallplugin.r67" @@ -814,6 +849,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r68" - "c:\resource\apps\freestyleemailui.r68" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r68" - "c:\resource\apps\gsemailsettingsplugin.r68" "\epoc32\data\z\resource\apps\fsmailserver.r68" - "c:\resource\apps\fsmailserver.r68" + "\epoc32\data\z\resource\apps\emailwidget.r68" - "c:\resource\apps\emailwidget.r68" "\epoc32\data\z\resource\ipssossettings.r68" - "c:\resource\ipssossettings.r68" "\epoc32\data\z\resource\apps\fscpocplugin.r68" - "c:\resource\apps\fscpocplugin.r68" "\epoc32\data\z\resource\apps\fsccallplugin.r68" - "c:\resource\apps\fsccallplugin.r68" @@ -829,6 +865,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r70" - "c:\resource\apps\freestyleemailui.r70" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r70" - "c:\resource\apps\gsemailsettingsplugin.r70" "\epoc32\data\z\resource\apps\fsmailserver.r70" - "c:\resource\apps\fsmailserver.r70" + "\epoc32\data\z\resource\apps\emailwidget.r70" - "c:\resource\apps\emailwidget.r70" "\epoc32\data\z\resource\ipssossettings.r70" - "c:\resource\ipssossettings.r70" "\epoc32\data\z\resource\apps\fscpocplugin.r70" - "c:\resource\apps\fscpocplugin.r70" "\epoc32\data\z\resource\apps\fsccallplugin.r70" - "c:\resource\apps\fsccallplugin.r70" @@ -844,6 +881,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r76" - "c:\resource\apps\freestyleemailui.r76" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r76" - "c:\resource\apps\gsemailsettingsplugin.r76" "\epoc32\data\z\resource\apps\fsmailserver.r76" - "c:\resource\apps\fsmailserver.r76" + "\epoc32\data\z\resource\apps\emailwidget.r76" - "c:\resource\apps\emailwidget.r76" "\epoc32\data\z\resource\ipssossettings.r76" - "c:\resource\ipssossettings.r76" "\epoc32\data\z\resource\apps\fscpocplugin.r76" - "c:\resource\apps\fscpocplugin.r76" "\epoc32\data\z\resource\apps\fsccallplugin.r76" - "c:\resource\apps\fsccallplugin.r76" @@ -859,6 +897,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r78" - "c:\resource\apps\freestyleemailui.r78" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r78" - "c:\resource\apps\gsemailsettingsplugin.r78" "\epoc32\data\z\resource\apps\fsmailserver.r78" - "c:\resource\apps\fsmailserver.r78" + "\epoc32\data\z\resource\apps\emailwidget.r78" - "c:\resource\apps\emailwidget.r78" "\epoc32\data\z\resource\ipssossettings.r78" - "c:\resource\ipssossettings.r78" "\epoc32\data\z\resource\apps\fscpocplugin.r78" - "c:\resource\apps\fscpocplugin.r78" "\epoc32\data\z\resource\apps\fsccallplugin.r78" - "c:\resource\apps\fsccallplugin.r78" @@ -874,6 +913,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r79" - "c:\resource\apps\freestyleemailui.r79" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r79" - "c:\resource\apps\gsemailsettingsplugin.r79" "\epoc32\data\z\resource\apps\fsmailserver.r79" - "c:\resource\apps\fsmailserver.r79" + "\epoc32\data\z\resource\apps\emailwidget.r79" - "c:\resource\apps\emailwidget.r79" "\epoc32\data\z\resource\ipssossettings.r79" - "c:\resource\ipssossettings.r79" "\epoc32\data\z\resource\apps\fscpocplugin.r79" - "c:\resource\apps\fscpocplugin.r79" "\epoc32\data\z\resource\apps\fsccallplugin.r79" - "c:\resource\apps\fsccallplugin.r79" @@ -889,6 +929,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r83" - "c:\resource\apps\freestyleemailui.r83" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r83" - "c:\resource\apps\gsemailsettingsplugin.r83" "\epoc32\data\z\resource\apps\fsmailserver.r83" - "c:\resource\apps\fsmailserver.r83" + "\epoc32\data\z\resource\apps\emailwidget.r83" - "c:\resource\apps\emailwidget.r83" "\epoc32\data\z\resource\ipssossettings.r83" - "c:\resource\ipssossettings.r83" "\epoc32\data\z\resource\apps\fscpocplugin.r83" - "c:\resource\apps\fscpocplugin.r83" "\epoc32\data\z\resource\apps\fsccallplugin.r83" - "c:\resource\apps\fsccallplugin.r83" @@ -904,6 +945,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r93" - "c:\resource\apps\freestyleemailui.r93" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r93" - "c:\resource\apps\gsemailsettingsplugin.r93" "\epoc32\data\z\resource\apps\fsmailserver.r93" - "c:\resource\apps\fsmailserver.r93" + "\epoc32\data\z\resource\apps\emailwidget.r93" - "c:\resource\apps\emailwidget.r93" "\epoc32\data\z\resource\ipssossettings.r93" - "c:\resource\ipssossettings.r93" "\epoc32\data\z\resource\apps\fscpocplugin.r93" - "c:\resource\apps\fscpocplugin.r93" "\epoc32\data\z\resource\apps\fsccallplugin.r93" - "c:\resource\apps\fsccallplugin.r93" @@ -919,6 +961,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r94" - "c:\resource\apps\freestyleemailui.r94" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r94" - "c:\resource\apps\gsemailsettingsplugin.r94" "\epoc32\data\z\resource\apps\fsmailserver.r94" - "c:\resource\apps\fsmailserver.r94" + "\epoc32\data\z\resource\apps\emailwidget.r94" - "c:\resource\apps\emailwidget.r94" "\epoc32\data\z\resource\ipssossettings.r94" - "c:\resource\ipssossettings.r94" "\epoc32\data\z\resource\apps\fscpocplugin.r94" - "c:\resource\apps\fscpocplugin.r94" "\epoc32\data\z\resource\apps\fsccallplugin.r94" - "c:\resource\apps\fsccallplugin.r94" @@ -934,6 +977,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r96" - "c:\resource\apps\freestyleemailui.r96" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r96" - "c:\resource\apps\gsemailsettingsplugin.r96" "\epoc32\data\z\resource\apps\fsmailserver.r96" - "c:\resource\apps\fsmailserver.r96" + "\epoc32\data\z\resource\apps\emailwidget.r96" - "c:\resource\apps\emailwidget.r96" "\epoc32\data\z\resource\ipssossettings.r96" - "c:\resource\ipssossettings.r96" "\epoc32\data\z\resource\apps\fscpocplugin.r96" - "c:\resource\apps\fscpocplugin.r96" "\epoc32\data\z\resource\apps\fsccallplugin.r96" - "c:\resource\apps\fsccallplugin.r96" @@ -949,6 +993,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r102" - "c:\resource\apps\freestyleemailui.r102" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r102" - "c:\resource\apps\gsemailsettingsplugin.r102" "\epoc32\data\z\resource\apps\fsmailserver.r102" - "c:\resource\apps\fsmailserver.r102" + "\epoc32\data\z\resource\apps\emailwidget.r102" - "c:\resource\apps\emailwidget.r102" "\epoc32\data\z\resource\ipssossettings.r102" - "c:\resource\ipssossettings.r102" "\epoc32\data\z\resource\apps\fscpocplugin.r102" - "c:\resource\apps\fscpocplugin.r102" "\epoc32\data\z\resource\apps\fsccallplugin.r102" - "c:\resource\apps\fsccallplugin.r102" @@ -964,6 +1009,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r103" - "c:\resource\apps\freestyleemailui.r103" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r103" - "c:\resource\apps\gsemailsettingsplugin.r103" "\epoc32\data\z\resource\apps\fsmailserver.r103" - "c:\resource\apps\fsmailserver.r103" + "\epoc32\data\z\resource\apps\emailwidget.r103" - "c:\resource\apps\emailwidget.r103" "\epoc32\data\z\resource\ipssossettings.r103" - "c:\resource\ipssossettings.r103" "\epoc32\data\z\resource\apps\fscpocplugin.r103" - "c:\resource\apps\fscpocplugin.r103" "\epoc32\data\z\resource\apps\fsccallplugin.r103" - "c:\resource\apps\fsccallplugin.r103" @@ -979,6 +1025,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r129" - "c:\resource\apps\freestyleemailui.r129" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r129" - "c:\resource\apps\gsemailsettingsplugin.r129" "\epoc32\data\z\resource\apps\fsmailserver.r129" - "c:\resource\apps\fsmailserver.r129" + "\epoc32\data\z\resource\apps\emailwidget.r129" - "c:\resource\apps\emailwidget.r129" "\epoc32\data\z\resource\ipssossettings.r129" - "c:\resource\ipssossettings.r129" "\epoc32\data\z\resource\apps\fscpocplugin.r129" - "c:\resource\apps\fscpocplugin.r129" "\epoc32\data\z\resource\apps\fsccallplugin.r129" - "c:\resource\apps\fsccallplugin.r129" @@ -994,6 +1041,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r157" - "c:\resource\apps\freestyleemailui.r157" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r157" - "c:\resource\apps\gsemailsettingsplugin.r157" "\epoc32\data\z\resource\apps\fsmailserver.r157" - "c:\resource\apps\fsmailserver.r157" + "\epoc32\data\z\resource\apps\emailwidget.r157" - "c:\resource\apps\emailwidget.r157" "\epoc32\data\z\resource\ipssossettings.r157" - "c:\resource\ipssossettings.r157" "\epoc32\data\z\resource\apps\fscpocplugin.r157" - "c:\resource\apps\fscpocplugin.r157" "\epoc32\data\z\resource\apps\fsccallplugin.r157" - "c:\resource\apps\fsccallplugin.r157" @@ -1009,6 +1057,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r158" - "c:\resource\apps\freestyleemailui.r158" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r158" - "c:\resource\apps\gsemailsettingsplugin.r158" "\epoc32\data\z\resource\apps\fsmailserver.r158" - "c:\resource\apps\fsmailserver.r158" + "\epoc32\data\z\resource\apps\emailwidget.r158" - "c:\resource\apps\emailwidget.r158" "\epoc32\data\z\resource\ipssossettings.r158" - "c:\resource\ipssossettings.r158" "\epoc32\data\z\resource\apps\fscpocplugin.r158" - "c:\resource\apps\fscpocplugin.r158" "\epoc32\data\z\resource\apps\fsccallplugin.r158" - "c:\resource\apps\fsccallplugin.r158" @@ -1024,6 +1073,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r159" - "c:\resource\apps\freestyleemailui.r159" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r159" - "c:\resource\apps\gsemailsettingsplugin.r159" "\epoc32\data\z\resource\apps\fsmailserver.r159" - "c:\resource\apps\fsmailserver.r159" + "\epoc32\data\z\resource\apps\emailwidget.r159" - "c:\resource\apps\emailwidget.r159" "\epoc32\data\z\resource\ipssossettings.r159" - "c:\resource\ipssossettings.r159" "\epoc32\data\z\resource\apps\fscpocplugin.r159" - "c:\resource\apps\fscpocplugin.r159" "\epoc32\data\z\resource\apps\fsccallplugin.r159" - "c:\resource\apps\fsccallplugin.r159" @@ -1039,6 +1089,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r160" - "c:\resource\apps\freestyleemailui.r160" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r160" - "c:\resource\apps\gsemailsettingsplugin.r160" "\epoc32\data\z\resource\apps\fsmailserver.r160" - "c:\resource\apps\fsmailserver.r160" + "\epoc32\data\z\resource\apps\emailwidget.r160" - "c:\resource\apps\emailwidget.r160" "\epoc32\data\z\resource\ipssossettings.r160" - "c:\resource\ipssossettings.r160" "\epoc32\data\z\resource\apps\fscpocplugin.r160" - "c:\resource\apps\fscpocplugin.r160" "\epoc32\data\z\resource\apps\fsccallplugin.r160" - "c:\resource\apps\fsccallplugin.r160" @@ -1054,6 +1105,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r161" - "c:\resource\apps\freestyleemailui.r161" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r161" - "c:\resource\apps\gsemailsettingsplugin.r161" "\epoc32\data\z\resource\apps\fsmailserver.r161" - "c:\resource\apps\fsmailserver.r161" + "\epoc32\data\z\resource\apps\emailwidget.r161" - "c:\resource\apps\emailwidget.r161" "\epoc32\data\z\resource\ipssossettings.r161" - "c:\resource\ipssossettings.r161" "\epoc32\data\z\resource\apps\fscpocplugin.r161" - "c:\resource\apps\fscpocplugin.r161" "\epoc32\data\z\resource\apps\fsccallplugin.r161" - "c:\resource\apps\fsccallplugin.r161" @@ -1069,6 +1121,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r326" - "c:\resource\apps\freestyleemailui.r326" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r326" - "c:\resource\apps\gsemailsettingsplugin.r326" "\epoc32\data\z\resource\apps\fsmailserver.r326" - "c:\resource\apps\fsmailserver.r326" + "\epoc32\data\z\resource\apps\emailwidget.r326" - "c:\resource\apps\emailwidget.r326" "\epoc32\data\z\resource\ipssossettings.r326" - "c:\resource\ipssossettings.r326" "\epoc32\data\z\resource\apps\fscpocplugin.r326" - "c:\resource\apps\fscpocplugin.r326" "\epoc32\data\z\resource\apps\fsccallplugin.r326" - "c:\resource\apps\fsccallplugin.r326" @@ -1084,6 +1137,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r327" - "c:\resource\apps\freestyleemailui.r327" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r327" - "c:\resource\apps\gsemailsettingsplugin.r327" "\epoc32\data\z\resource\apps\fsmailserver.r327" - "c:\resource\apps\fsmailserver.r327" + "\epoc32\data\z\resource\apps\emailwidget.r327" - "c:\resource\apps\emailwidget.r327" "\epoc32\data\z\resource\ipssossettings.r327" - "c:\resource\ipssossettings.r327" "\epoc32\data\z\resource\apps\fscpocplugin.r327" - "c:\resource\apps\fscpocplugin.r327" "\epoc32\data\z\resource\apps\fsccallplugin.r327" - "c:\resource\apps\fsccallplugin.r327"
--- a/emailuis/emailui/sis/commonemail_udeb.pkg Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/sis/commonemail_udeb.pkg Thu Jan 07 12:38:38 2010 +0200 @@ -40,7 +40,7 @@ ;----------------------------------------------------------------------------- ; MfE plugin installed as embedded sisx-package ;------------------------- -@"..\..\..\..\..\complementary\eas\sis\eas_engine_udeb.sisx",(0x20012BE9) +@"\ext\app\eas\sis\eas_engine_udeb.sisx",(0x20012BE9) ;----------------------------------------------------------------------------- ; Actual common email files to be installed @@ -120,10 +120,7 @@ "\epoc32\release\armv5\udeb\cmailhandlerplugin.dll" - "c:\sys\bin\cmailhandlerplugin.dll" "\epoc32\data\Z\Resource\Plugins\cmailhandlerplugin.rsc" - "c:\resource\plugins\cmailhandlerplugin.rsc" "\epoc32\data\z\resource\apps\cmailhandlerplugin.mif" - "c:\resource\apps\cmailhandlerplugin.mif" - -; Change path to normal resource path (not ECom res) when fixed in cmailhandlerplugin code -; Uncomment in TB 9.2 branch after 5250+ branched -;"\epoc32\data\Z\Resource\Plugins\emailwidget.rsc" - "c:\resource\plugins\emailwidget.rsc" +"\epoc32\data\Z\resource\apps\emailwidget.rsc" - "c:\resource\apps\emailwidget.rsc" ; ipservices "\epoc32\release\armv5\udeb\ipssosplugin.dll" - "c:\sys\bin\ipssosplugin.dll"
--- a/emailuis/emailui/sis/commonemail_udeb_loc.pkg Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/sis/commonemail_udeb_loc.pkg Thu Jan 07 12:38:38 2010 +0200 @@ -40,7 +40,7 @@ ;----------------------------------------------------------------------------- ; MfE plugin installed as embedded sisx-package ;------------------------- -@"..\..\..\..\..\complementary\eas\sis\eas_engine_udeb_loc.sisx",(0x20012BE9) +@"\ext\app\eas\sis\eas_engine_udeb_loc.sisx",(0x20012BE9) ;----------------------------------------------------------------------------- ; Actual common email files to be installed @@ -123,10 +123,8 @@ "\epoc32\release\armv5\udeb\cmailhandlerplugin.dll" - "c:\sys\bin\cmailhandlerplugin.dll" "\epoc32\data\Z\Resource\Plugins\cmailhandlerplugin.rsc" - "c:\resource\plugins\cmailhandlerplugin.rsc" "\epoc32\data\z\resource\apps\cmailhandlerplugin.mif" - "c:\resource\apps\cmailhandlerplugin.mif" - -; Change path to normal resource path (not ECom res) when fixed in cmailhandlerplugin code -; Uncomment in TB 9.2 branch after 5250+ branched -;"\epoc32\data\Z\Resource\Plugins\emailwidget.rsc" - "c:\resource\plugins\emailwidget.rsc" +; Following line is localized, so this Engineering English line is commented out +;"\epoc32\data\Z\resource\apps\emailwidget.rsc" - "c:\resource\apps\emailwidget.rsc" ; ipservices "\epoc32\release\armv5\udeb\ipssosplugin.dll" - "c:\sys\bin\ipssosplugin.dll" @@ -247,6 +245,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r01" - "c:\resource\apps\freestyleemailui.r01" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r01" - "c:\resource\apps\gsemailsettingsplugin.r01" "\epoc32\data\z\resource\apps\fsmailserver.r01" - "c:\resource\apps\fsmailserver.r01" + "\epoc32\data\z\resource\apps\emailwidget.r01" - "c:\resource\apps\emailwidget.r01" "\epoc32\data\z\resource\ipssossettings.r01" - "c:\resource\ipssossettings.r01" "\epoc32\data\z\resource\apps\fscpocplugin.r01" - "c:\resource\apps\fscpocplugin.r01" "\epoc32\data\z\resource\apps\fsccallplugin.r01" - "c:\resource\apps\fsccallplugin.r01" @@ -262,6 +261,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r02" - "c:\resource\apps\freestyleemailui.r02" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r02" - "c:\resource\apps\gsemailsettingsplugin.r02" "\epoc32\data\z\resource\apps\fsmailserver.r02" - "c:\resource\apps\fsmailserver.r02" + "\epoc32\data\z\resource\apps\emailwidget.r02" - "c:\resource\apps\emailwidget.r02" "\epoc32\data\z\resource\ipssossettings.r02" - "c:\resource\ipssossettings.r02" "\epoc32\data\z\resource\apps\fscpocplugin.r02" - "c:\resource\apps\fscpocplugin.r02" "\epoc32\data\z\resource\apps\fsccallplugin.r02" - "c:\resource\apps\fsccallplugin.r02" @@ -277,6 +277,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r03" - "c:\resource\apps\freestyleemailui.r03" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r03" - "c:\resource\apps\gsemailsettingsplugin.r03" "\epoc32\data\z\resource\apps\fsmailserver.r03" - "c:\resource\apps\fsmailserver.r03" + "\epoc32\data\z\resource\apps\emailwidget.r03" - "c:\resource\apps\emailwidget.r03" "\epoc32\data\z\resource\ipssossettings.r03" - "c:\resource\ipssossettings.r03" "\epoc32\data\z\resource\apps\fscpocplugin.r03" - "c:\resource\apps\fscpocplugin.r03" "\epoc32\data\z\resource\apps\fsccallplugin.r03" - "c:\resource\apps\fsccallplugin.r03" @@ -292,6 +293,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r04" - "c:\resource\apps\freestyleemailui.r04" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r04" - "c:\resource\apps\gsemailsettingsplugin.r04" "\epoc32\data\z\resource\apps\fsmailserver.r04" - "c:\resource\apps\fsmailserver.r04" + "\epoc32\data\z\resource\apps\emailwidget.r04" - "c:\resource\apps\emailwidget.r04" "\epoc32\data\z\resource\ipssossettings.r04" - "c:\resource\ipssossettings.r04" "\epoc32\data\z\resource\apps\fscpocplugin.r04" - "c:\resource\apps\fscpocplugin.r04" "\epoc32\data\z\resource\apps\fsccallplugin.r04" - "c:\resource\apps\fsccallplugin.r04" @@ -307,6 +309,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r05" - "c:\resource\apps\freestyleemailui.r05" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r05" - "c:\resource\apps\gsemailsettingsplugin.r05" "\epoc32\data\z\resource\apps\fsmailserver.r05" - "c:\resource\apps\fsmailserver.r05" + "\epoc32\data\z\resource\apps\emailwidget.r05" - "c:\resource\apps\emailwidget.r05" "\epoc32\data\z\resource\ipssossettings.r05" - "c:\resource\ipssossettings.r05" "\epoc32\data\z\resource\apps\fscpocplugin.r05" - "c:\resource\apps\fscpocplugin.r05" "\epoc32\data\z\resource\apps\fsccallplugin.r05" - "c:\resource\apps\fsccallplugin.r05" @@ -322,6 +325,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r06" - "c:\resource\apps\freestyleemailui.r06" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r06" - "c:\resource\apps\gsemailsettingsplugin.r06" "\epoc32\data\z\resource\apps\fsmailserver.r06" - "c:\resource\apps\fsmailserver.r06" + "\epoc32\data\z\resource\apps\emailwidget.r06" - "c:\resource\apps\emailwidget.r06" "\epoc32\data\z\resource\ipssossettings.r06" - "c:\resource\ipssossettings.r06" "\epoc32\data\z\resource\apps\fscpocplugin.r06" - "c:\resource\apps\fscpocplugin.r06" "\epoc32\data\z\resource\apps\fsccallplugin.r06" - "c:\resource\apps\fsccallplugin.r06" @@ -337,6 +341,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r07" - "c:\resource\apps\freestyleemailui.r07" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r07" - "c:\resource\apps\gsemailsettingsplugin.r07" "\epoc32\data\z\resource\apps\fsmailserver.r07" - "c:\resource\apps\fsmailserver.r07" + "\epoc32\data\z\resource\apps\emailwidget.r07" - "c:\resource\apps\emailwidget.r07" "\epoc32\data\z\resource\ipssossettings.r07" - "c:\resource\ipssossettings.r07" "\epoc32\data\z\resource\apps\fscpocplugin.r07" - "c:\resource\apps\fscpocplugin.r07" "\epoc32\data\z\resource\apps\fsccallplugin.r07" - "c:\resource\apps\fsccallplugin.r07" @@ -352,6 +357,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r08" - "c:\resource\apps\freestyleemailui.r08" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r08" - "c:\resource\apps\gsemailsettingsplugin.r08" "\epoc32\data\z\resource\apps\fsmailserver.r08" - "c:\resource\apps\fsmailserver.r08" + "\epoc32\data\z\resource\apps\emailwidget.r08" - "c:\resource\apps\emailwidget.r08" "\epoc32\data\z\resource\ipssossettings.r08" - "c:\resource\ipssossettings.r08" "\epoc32\data\z\resource\apps\fscpocplugin.r08" - "c:\resource\apps\fscpocplugin.r08" "\epoc32\data\z\resource\apps\fsccallplugin.r08" - "c:\resource\apps\fsccallplugin.r08" @@ -367,6 +373,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r09" - "c:\resource\apps\freestyleemailui.r09" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r09" - "c:\resource\apps\gsemailsettingsplugin.r09" "\epoc32\data\z\resource\apps\fsmailserver.r09" - "c:\resource\apps\fsmailserver.r09" + "\epoc32\data\z\resource\apps\emailwidget.r09" - "c:\resource\apps\emailwidget.r09" "\epoc32\data\z\resource\ipssossettings.r09" - "c:\resource\ipssossettings.r09" "\epoc32\data\z\resource\apps\fscpocplugin.r09" - "c:\resource\apps\fscpocplugin.r09" "\epoc32\data\z\resource\apps\fsccallplugin.r09" - "c:\resource\apps\fsccallplugin.r09" @@ -382,6 +389,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r10" - "c:\resource\apps\freestyleemailui.r10" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r10" - "c:\resource\apps\gsemailsettingsplugin.r10" "\epoc32\data\z\resource\apps\fsmailserver.r10" - "c:\resource\apps\fsmailserver.r10" + "\epoc32\data\z\resource\apps\emailwidget.r10" - "c:\resource\apps\emailwidget.r10" "\epoc32\data\z\resource\ipssossettings.r10" - "c:\resource\ipssossettings.r10" "\epoc32\data\z\resource\apps\fscpocplugin.r10" - "c:\resource\apps\fscpocplugin.r10" "\epoc32\data\z\resource\apps\fsccallplugin.r10" - "c:\resource\apps\fsccallplugin.r10" @@ -397,6 +405,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r13" - "c:\resource\apps\freestyleemailui.r13" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r13" - "c:\resource\apps\gsemailsettingsplugin.r13" "\epoc32\data\z\resource\apps\fsmailserver.r13" - "c:\resource\apps\fsmailserver.r13" + "\epoc32\data\z\resource\apps\emailwidget.r13" - "c:\resource\apps\emailwidget.r13" "\epoc32\data\z\resource\ipssossettings.r13" - "c:\resource\ipssossettings.r13" "\epoc32\data\z\resource\apps\fscpocplugin.r13" - "c:\resource\apps\fscpocplugin.r13" "\epoc32\data\z\resource\apps\fsccallplugin.r13" - "c:\resource\apps\fsccallplugin.r13" @@ -412,6 +421,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r14" - "c:\resource\apps\freestyleemailui.r14" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r14" - "c:\resource\apps\gsemailsettingsplugin.r14" "\epoc32\data\z\resource\apps\fsmailserver.r14" - "c:\resource\apps\fsmailserver.r14" + "\epoc32\data\z\resource\apps\emailwidget.r14" - "c:\resource\apps\emailwidget.r14" "\epoc32\data\z\resource\ipssossettings.r14" - "c:\resource\ipssossettings.r14" "\epoc32\data\z\resource\apps\fscpocplugin.r14" - "c:\resource\apps\fscpocplugin.r14" "\epoc32\data\z\resource\apps\fsccallplugin.r14" - "c:\resource\apps\fsccallplugin.r14" @@ -427,6 +437,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r15" - "c:\resource\apps\freestyleemailui.r15" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r15" - "c:\resource\apps\gsemailsettingsplugin.r15" "\epoc32\data\z\resource\apps\fsmailserver.r15" - "c:\resource\apps\fsmailserver.r15" + "\epoc32\data\z\resource\apps\emailwidget.r15" - "c:\resource\apps\emailwidget.r15" "\epoc32\data\z\resource\ipssossettings.r15" - "c:\resource\ipssossettings.r15" "\epoc32\data\z\resource\apps\fscpocplugin.r15" - "c:\resource\apps\fscpocplugin.r15" "\epoc32\data\z\resource\apps\fsccallplugin.r15" - "c:\resource\apps\fsccallplugin.r15" @@ -442,6 +453,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r16" - "c:\resource\apps\freestyleemailui.r16" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r16" - "c:\resource\apps\gsemailsettingsplugin.r16" "\epoc32\data\z\resource\apps\fsmailserver.r16" - "c:\resource\apps\fsmailserver.r16" + "\epoc32\data\z\resource\apps\emailwidget.r16" - "c:\resource\apps\emailwidget.r16" "\epoc32\data\z\resource\ipssossettings.r16" - "c:\resource\ipssossettings.r16" "\epoc32\data\z\resource\apps\fscpocplugin.r16" - "c:\resource\apps\fscpocplugin.r16" "\epoc32\data\z\resource\apps\fsccallplugin.r16" - "c:\resource\apps\fsccallplugin.r16" @@ -457,6 +469,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r17" - "c:\resource\apps\freestyleemailui.r17" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r17" - "c:\resource\apps\gsemailsettingsplugin.r17" "\epoc32\data\z\resource\apps\fsmailserver.r17" - "c:\resource\apps\fsmailserver.r17" + "\epoc32\data\z\resource\apps\emailwidget.r17" - "c:\resource\apps\emailwidget.r17" "\epoc32\data\z\resource\ipssossettings.r17" - "c:\resource\ipssossettings.r17" "\epoc32\data\z\resource\apps\fscpocplugin.r17" - "c:\resource\apps\fscpocplugin.r17" "\epoc32\data\z\resource\apps\fsccallplugin.r17" - "c:\resource\apps\fsccallplugin.r17" @@ -472,6 +485,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r18" - "c:\resource\apps\freestyleemailui.r18" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r18" - "c:\resource\apps\gsemailsettingsplugin.r18" "\epoc32\data\z\resource\apps\fsmailserver.r18" - "c:\resource\apps\fsmailserver.r18" + "\epoc32\data\z\resource\apps\emailwidget.r18" - "c:\resource\apps\emailwidget.r18" "\epoc32\data\z\resource\ipssossettings.r18" - "c:\resource\ipssossettings.r18" "\epoc32\data\z\resource\apps\fscpocplugin.r18" - "c:\resource\apps\fscpocplugin.r18" "\epoc32\data\z\resource\apps\fsccallplugin.r18" - "c:\resource\apps\fsccallplugin.r18" @@ -487,6 +501,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r25" - "c:\resource\apps\freestyleemailui.r25" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r25" - "c:\resource\apps\gsemailsettingsplugin.r25" "\epoc32\data\z\resource\apps\fsmailserver.r25" - "c:\resource\apps\fsmailserver.r25" + "\epoc32\data\z\resource\apps\emailwidget.r25" - "c:\resource\apps\emailwidget.r25" "\epoc32\data\z\resource\ipssossettings.r25" - "c:\resource\ipssossettings.r25" "\epoc32\data\z\resource\apps\fscpocplugin.r25" - "c:\resource\apps\fscpocplugin.r25" "\epoc32\data\z\resource\apps\fsccallplugin.r25" - "c:\resource\apps\fsccallplugin.r25" @@ -502,6 +517,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r26" - "c:\resource\apps\freestyleemailui.r26" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r26" - "c:\resource\apps\gsemailsettingsplugin.r26" "\epoc32\data\z\resource\apps\fsmailserver.r26" - "c:\resource\apps\fsmailserver.r26" + "\epoc32\data\z\resource\apps\emailwidget.r26" - "c:\resource\apps\emailwidget.r26" "\epoc32\data\z\resource\ipssossettings.r26" - "c:\resource\ipssossettings.r26" "\epoc32\data\z\resource\apps\fscpocplugin.r26" - "c:\resource\apps\fscpocplugin.r26" "\epoc32\data\z\resource\apps\fsccallplugin.r26" - "c:\resource\apps\fsccallplugin.r26" @@ -517,6 +533,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r27" - "c:\resource\apps\freestyleemailui.r27" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r27" - "c:\resource\apps\gsemailsettingsplugin.r27" "\epoc32\data\z\resource\apps\fsmailserver.r27" - "c:\resource\apps\fsmailserver.r27" + "\epoc32\data\z\resource\apps\emailwidget.r27" - "c:\resource\apps\emailwidget.r27" "\epoc32\data\z\resource\ipssossettings.r27" - "c:\resource\ipssossettings.r27" "\epoc32\data\z\resource\apps\fscpocplugin.r27" - "c:\resource\apps\fscpocplugin.r27" "\epoc32\data\z\resource\apps\fsccallplugin.r27" - "c:\resource\apps\fsccallplugin.r27" @@ -532,6 +549,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r28" - "c:\resource\apps\freestyleemailui.r28" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r28" - "c:\resource\apps\gsemailsettingsplugin.r28" "\epoc32\data\z\resource\apps\fsmailserver.r28" - "c:\resource\apps\fsmailserver.r28" + "\epoc32\data\z\resource\apps\emailwidget.r28" - "c:\resource\apps\emailwidget.r28" "\epoc32\data\z\resource\ipssossettings.r28" - "c:\resource\ipssossettings.r28" "\epoc32\data\z\resource\apps\fscpocplugin.r28" - "c:\resource\apps\fscpocplugin.r28" "\epoc32\data\z\resource\apps\fsccallplugin.r28" - "c:\resource\apps\fsccallplugin.r28" @@ -547,6 +565,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r29" - "c:\resource\apps\freestyleemailui.r29" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r29" - "c:\resource\apps\gsemailsettingsplugin.r29" "\epoc32\data\z\resource\apps\fsmailserver.r29" - "c:\resource\apps\fsmailserver.r29" + "\epoc32\data\z\resource\apps\emailwidget.r29" - "c:\resource\apps\emailwidget.r29" "\epoc32\data\z\resource\ipssossettings.r29" - "c:\resource\ipssossettings.r29" "\epoc32\data\z\resource\apps\fscpocplugin.r29" - "c:\resource\apps\fscpocplugin.r29" "\epoc32\data\z\resource\apps\fsccallplugin.r29" - "c:\resource\apps\fsccallplugin.r29" @@ -562,6 +581,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r30" - "c:\resource\apps\freestyleemailui.r30" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r30" - "c:\resource\apps\gsemailsettingsplugin.r30" "\epoc32\data\z\resource\apps\fsmailserver.r30" - "c:\resource\apps\fsmailserver.r30" + "\epoc32\data\z\resource\apps\emailwidget.r30" - "c:\resource\apps\emailwidget.r30" "\epoc32\data\z\resource\ipssossettings.r30" - "c:\resource\ipssossettings.r30" "\epoc32\data\z\resource\apps\fscpocplugin.r30" - "c:\resource\apps\fscpocplugin.r30" "\epoc32\data\z\resource\apps\fsccallplugin.r30" - "c:\resource\apps\fsccallplugin.r30" @@ -577,6 +597,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r31" - "c:\resource\apps\freestyleemailui.r31" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r31" - "c:\resource\apps\gsemailsettingsplugin.r31" "\epoc32\data\z\resource\apps\fsmailserver.r31" - "c:\resource\apps\fsmailserver.r31" + "\epoc32\data\z\resource\apps\emailwidget.r31" - "c:\resource\apps\emailwidget.r31" "\epoc32\data\z\resource\ipssossettings.r31" - "c:\resource\ipssossettings.r31" "\epoc32\data\z\resource\apps\fscpocplugin.r31" - "c:\resource\apps\fscpocplugin.r31" "\epoc32\data\z\resource\apps\fsccallplugin.r31" - "c:\resource\apps\fsccallplugin.r31" @@ -592,6 +613,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r32" - "c:\resource\apps\freestyleemailui.r32" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r32" - "c:\resource\apps\gsemailsettingsplugin.r32" "\epoc32\data\z\resource\apps\fsmailserver.r32" - "c:\resource\apps\fsmailserver.r32" + "\epoc32\data\z\resource\apps\emailwidget.r32" - "c:\resource\apps\emailwidget.r32" "\epoc32\data\z\resource\ipssossettings.r32" - "c:\resource\ipssossettings.r32" "\epoc32\data\z\resource\apps\fscpocplugin.r32" - "c:\resource\apps\fscpocplugin.r32" "\epoc32\data\z\resource\apps\fsccallplugin.r32" - "c:\resource\apps\fsccallplugin.r32" @@ -607,6 +629,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r33" - "c:\resource\apps\freestyleemailui.r33" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r33" - "c:\resource\apps\gsemailsettingsplugin.r33" "\epoc32\data\z\resource\apps\fsmailserver.r33" - "c:\resource\apps\fsmailserver.r33" + "\epoc32\data\z\resource\apps\emailwidget.r33" - "c:\resource\apps\emailwidget.r33" "\epoc32\data\z\resource\ipssossettings.r33" - "c:\resource\ipssossettings.r33" "\epoc32\data\z\resource\apps\fscpocplugin.r33" - "c:\resource\apps\fscpocplugin.r33" "\epoc32\data\z\resource\apps\fsccallplugin.r33" - "c:\resource\apps\fsccallplugin.r33" @@ -622,6 +645,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r37" - "c:\resource\apps\freestyleemailui.r37" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r37" - "c:\resource\apps\gsemailsettingsplugin.r37" "\epoc32\data\z\resource\apps\fsmailserver.r37" - "c:\resource\apps\fsmailserver.r37" + "\epoc32\data\z\resource\apps\emailwidget.r37" - "c:\resource\apps\emailwidget.r37" "\epoc32\data\z\resource\ipssossettings.r37" - "c:\resource\ipssossettings.r37" "\epoc32\data\z\resource\apps\fscpocplugin.r37" - "c:\resource\apps\fscpocplugin.r37" "\epoc32\data\z\resource\apps\fsccallplugin.r37" - "c:\resource\apps\fsccallplugin.r37" @@ -637,6 +661,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r39" - "c:\resource\apps\freestyleemailui.r39" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r39" - "c:\resource\apps\gsemailsettingsplugin.r39" "\epoc32\data\z\resource\apps\fsmailserver.r39" - "c:\resource\apps\fsmailserver.r39" + "\epoc32\data\z\resource\apps\emailwidget.r39" - "c:\resource\apps\emailwidget.r39" "\epoc32\data\z\resource\ipssossettings.r39" - "c:\resource\ipssossettings.r39" "\epoc32\data\z\resource\apps\fscpocplugin.r39" - "c:\resource\apps\fscpocplugin.r39" "\epoc32\data\z\resource\apps\fsccallplugin.r39" - "c:\resource\apps\fsccallplugin.r39" @@ -652,6 +677,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r42" - "c:\resource\apps\freestyleemailui.r42" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r42" - "c:\resource\apps\gsemailsettingsplugin.r42" "\epoc32\data\z\resource\apps\fsmailserver.r42" - "c:\resource\apps\fsmailserver.r42" + "\epoc32\data\z\resource\apps\emailwidget.r42" - "c:\resource\apps\emailwidget.r42" "\epoc32\data\z\resource\ipssossettings.r42" - "c:\resource\ipssossettings.r42" "\epoc32\data\z\resource\apps\fscpocplugin.r42" - "c:\resource\apps\fscpocplugin.r42" "\epoc32\data\z\resource\apps\fsccallplugin.r42" - "c:\resource\apps\fsccallplugin.r42" @@ -667,6 +693,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r44" - "c:\resource\apps\freestyleemailui.r44" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r44" - "c:\resource\apps\gsemailsettingsplugin.r44" "\epoc32\data\z\resource\apps\fsmailserver.r44" - "c:\resource\apps\fsmailserver.r44" + "\epoc32\data\z\resource\apps\emailwidget.r44" - "c:\resource\apps\emailwidget.r44" "\epoc32\data\z\resource\ipssossettings.r44" - "c:\resource\ipssossettings.r44" "\epoc32\data\z\resource\apps\fscpocplugin.r44" - "c:\resource\apps\fscpocplugin.r44" "\epoc32\data\z\resource\apps\fsccallplugin.r44" - "c:\resource\apps\fsccallplugin.r44" @@ -682,6 +709,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r45" - "c:\resource\apps\freestyleemailui.r45" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r45" - "c:\resource\apps\gsemailsettingsplugin.r45" "\epoc32\data\z\resource\apps\fsmailserver.r45" - "c:\resource\apps\fsmailserver.r45" + "\epoc32\data\z\resource\apps\emailwidget.r45" - "c:\resource\apps\emailwidget.r45" "\epoc32\data\z\resource\ipssossettings.r45" - "c:\resource\ipssossettings.r45" "\epoc32\data\z\resource\apps\fscpocplugin.r45" - "c:\resource\apps\fscpocplugin.r45" "\epoc32\data\z\resource\apps\fsccallplugin.r45" - "c:\resource\apps\fsccallplugin.r45" @@ -697,6 +725,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r49" - "c:\resource\apps\freestyleemailui.r49" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r49" - "c:\resource\apps\gsemailsettingsplugin.r49" "\epoc32\data\z\resource\apps\fsmailserver.r49" - "c:\resource\apps\fsmailserver.r49" + "\epoc32\data\z\resource\apps\emailwidget.r49" - "c:\resource\apps\emailwidget.r49" "\epoc32\data\z\resource\ipssossettings.r49" - "c:\resource\ipssossettings.r49" "\epoc32\data\z\resource\apps\fscpocplugin.r49" - "c:\resource\apps\fscpocplugin.r49" "\epoc32\data\z\resource\apps\fsccallplugin.r49" - "c:\resource\apps\fsccallplugin.r49" @@ -712,6 +741,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r50" - "c:\resource\apps\freestyleemailui.r50" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r50" - "c:\resource\apps\gsemailsettingsplugin.r50" "\epoc32\data\z\resource\apps\fsmailserver.r50" - "c:\resource\apps\fsmailserver.r50" + "\epoc32\data\z\resource\apps\emailwidget.r50" - "c:\resource\apps\emailwidget.r50" "\epoc32\data\z\resource\ipssossettings.r50" - "c:\resource\ipssossettings.r50" "\epoc32\data\z\resource\apps\fscpocplugin.r50" - "c:\resource\apps\fscpocplugin.r50" "\epoc32\data\z\resource\apps\fsccallplugin.r50" - "c:\resource\apps\fsccallplugin.r50" @@ -727,6 +757,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r51" - "c:\resource\apps\freestyleemailui.r51" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r51" - "c:\resource\apps\gsemailsettingsplugin.r51" "\epoc32\data\z\resource\apps\fsmailserver.r51" - "c:\resource\apps\fsmailserver.r51" + "\epoc32\data\z\resource\apps\emailwidget.r51" - "c:\resource\apps\emailwidget.r51" "\epoc32\data\z\resource\ipssossettings.r51" - "c:\resource\ipssossettings.r51" "\epoc32\data\z\resource\apps\fscpocplugin.r51" - "c:\resource\apps\fscpocplugin.r51" "\epoc32\data\z\resource\apps\fsccallplugin.r51" - "c:\resource\apps\fsccallplugin.r51" @@ -742,6 +773,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r54" - "c:\resource\apps\freestyleemailui.r54" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r54" - "c:\resource\apps\gsemailsettingsplugin.r54" "\epoc32\data\z\resource\apps\fsmailserver.r54" - "c:\resource\apps\fsmailserver.r54" + "\epoc32\data\z\resource\apps\emailwidget.r54" - "c:\resource\apps\emailwidget.r54" "\epoc32\data\z\resource\ipssossettings.r54" - "c:\resource\ipssossettings.r54" "\epoc32\data\z\resource\apps\fscpocplugin.r54" - "c:\resource\apps\fscpocplugin.r54" "\epoc32\data\z\resource\apps\fsccallplugin.r54" - "c:\resource\apps\fsccallplugin.r54" @@ -757,6 +789,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r57" - "c:\resource\apps\freestyleemailui.r57" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r57" - "c:\resource\apps\gsemailsettingsplugin.r57" "\epoc32\data\z\resource\apps\fsmailserver.r57" - "c:\resource\apps\fsmailserver.r57" + "\epoc32\data\z\resource\apps\emailwidget.r57" - "c:\resource\apps\emailwidget.r57" "\epoc32\data\z\resource\ipssossettings.r57" - "c:\resource\ipssossettings.r57" "\epoc32\data\z\resource\apps\fscpocplugin.r57" - "c:\resource\apps\fscpocplugin.r57" "\epoc32\data\z\resource\apps\fsccallplugin.r57" - "c:\resource\apps\fsccallplugin.r57" @@ -772,6 +805,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r59" - "c:\resource\apps\freestyleemailui.r59" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r59" - "c:\resource\apps\gsemailsettingsplugin.r59" "\epoc32\data\z\resource\apps\fsmailserver.r59" - "c:\resource\apps\fsmailserver.r59" + "\epoc32\data\z\resource\apps\emailwidget.r59" - "c:\resource\apps\emailwidget.r59" "\epoc32\data\z\resource\ipssossettings.r59" - "c:\resource\ipssossettings.r59" "\epoc32\data\z\resource\apps\fscpocplugin.r59" - "c:\resource\apps\fscpocplugin.r59" "\epoc32\data\z\resource\apps\fsccallplugin.r59" - "c:\resource\apps\fsccallplugin.r59" @@ -787,6 +821,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r67" - "c:\resource\apps\freestyleemailui.r67" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r67" - "c:\resource\apps\gsemailsettingsplugin.r67" "\epoc32\data\z\resource\apps\fsmailserver.r67" - "c:\resource\apps\fsmailserver.r67" + "\epoc32\data\z\resource\apps\emailwidget.r67" - "c:\resource\apps\emailwidget.r67" "\epoc32\data\z\resource\ipssossettings.r67" - "c:\resource\ipssossettings.r67" "\epoc32\data\z\resource\apps\fscpocplugin.r67" - "c:\resource\apps\fscpocplugin.r67" "\epoc32\data\z\resource\apps\fsccallplugin.r67" - "c:\resource\apps\fsccallplugin.r67" @@ -802,6 +837,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r68" - "c:\resource\apps\freestyleemailui.r68" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r68" - "c:\resource\apps\gsemailsettingsplugin.r68" "\epoc32\data\z\resource\apps\fsmailserver.r68" - "c:\resource\apps\fsmailserver.r68" + "\epoc32\data\z\resource\apps\emailwidget.r68" - "c:\resource\apps\emailwidget.r68" "\epoc32\data\z\resource\ipssossettings.r68" - "c:\resource\ipssossettings.r68" "\epoc32\data\z\resource\apps\fscpocplugin.r68" - "c:\resource\apps\fscpocplugin.r68" "\epoc32\data\z\resource\apps\fsccallplugin.r68" - "c:\resource\apps\fsccallplugin.r68" @@ -817,6 +853,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r70" - "c:\resource\apps\freestyleemailui.r70" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r70" - "c:\resource\apps\gsemailsettingsplugin.r70" "\epoc32\data\z\resource\apps\fsmailserver.r70" - "c:\resource\apps\fsmailserver.r70" + "\epoc32\data\z\resource\apps\emailwidget.r70" - "c:\resource\apps\emailwidget.r70" "\epoc32\data\z\resource\ipssossettings.r70" - "c:\resource\ipssossettings.r70" "\epoc32\data\z\resource\apps\fscpocplugin.r70" - "c:\resource\apps\fscpocplugin.r70" "\epoc32\data\z\resource\apps\fsccallplugin.r70" - "c:\resource\apps\fsccallplugin.r70" @@ -832,6 +869,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r76" - "c:\resource\apps\freestyleemailui.r76" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r76" - "c:\resource\apps\gsemailsettingsplugin.r76" "\epoc32\data\z\resource\apps\fsmailserver.r76" - "c:\resource\apps\fsmailserver.r76" + "\epoc32\data\z\resource\apps\emailwidget.r76" - "c:\resource\apps\emailwidget.r76" "\epoc32\data\z\resource\ipssossettings.r76" - "c:\resource\ipssossettings.r76" "\epoc32\data\z\resource\apps\fscpocplugin.r76" - "c:\resource\apps\fscpocplugin.r76" "\epoc32\data\z\resource\apps\fsccallplugin.r76" - "c:\resource\apps\fsccallplugin.r76" @@ -847,6 +885,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r78" - "c:\resource\apps\freestyleemailui.r78" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r78" - "c:\resource\apps\gsemailsettingsplugin.r78" "\epoc32\data\z\resource\apps\fsmailserver.r78" - "c:\resource\apps\fsmailserver.r78" + "\epoc32\data\z\resource\apps\emailwidget.r78" - "c:\resource\apps\emailwidget.r78" "\epoc32\data\z\resource\ipssossettings.r78" - "c:\resource\ipssossettings.r78" "\epoc32\data\z\resource\apps\fscpocplugin.r78" - "c:\resource\apps\fscpocplugin.r78" "\epoc32\data\z\resource\apps\fsccallplugin.r78" - "c:\resource\apps\fsccallplugin.r78" @@ -862,6 +901,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r79" - "c:\resource\apps\freestyleemailui.r79" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r79" - "c:\resource\apps\gsemailsettingsplugin.r79" "\epoc32\data\z\resource\apps\fsmailserver.r79" - "c:\resource\apps\fsmailserver.r79" + "\epoc32\data\z\resource\apps\emailwidget.r79" - "c:\resource\apps\emailwidget.r79" "\epoc32\data\z\resource\ipssossettings.r79" - "c:\resource\ipssossettings.r79" "\epoc32\data\z\resource\apps\fscpocplugin.r79" - "c:\resource\apps\fscpocplugin.r79" "\epoc32\data\z\resource\apps\fsccallplugin.r79" - "c:\resource\apps\fsccallplugin.r79" @@ -877,6 +917,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r83" - "c:\resource\apps\freestyleemailui.r83" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r83" - "c:\resource\apps\gsemailsettingsplugin.r83" "\epoc32\data\z\resource\apps\fsmailserver.r83" - "c:\resource\apps\fsmailserver.r83" + "\epoc32\data\z\resource\apps\emailwidget.r83" - "c:\resource\apps\emailwidget.r83" "\epoc32\data\z\resource\ipssossettings.r83" - "c:\resource\ipssossettings.r83" "\epoc32\data\z\resource\apps\fscpocplugin.r83" - "c:\resource\apps\fscpocplugin.r83" "\epoc32\data\z\resource\apps\fsccallplugin.r83" - "c:\resource\apps\fsccallplugin.r83" @@ -892,6 +933,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r93" - "c:\resource\apps\freestyleemailui.r93" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r93" - "c:\resource\apps\gsemailsettingsplugin.r93" "\epoc32\data\z\resource\apps\fsmailserver.r93" - "c:\resource\apps\fsmailserver.r93" + "\epoc32\data\z\resource\apps\emailwidget.r93" - "c:\resource\apps\emailwidget.r93" "\epoc32\data\z\resource\ipssossettings.r93" - "c:\resource\ipssossettings.r93" "\epoc32\data\z\resource\apps\fscpocplugin.r93" - "c:\resource\apps\fscpocplugin.r93" "\epoc32\data\z\resource\apps\fsccallplugin.r93" - "c:\resource\apps\fsccallplugin.r93" @@ -907,6 +949,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r94" - "c:\resource\apps\freestyleemailui.r94" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r94" - "c:\resource\apps\gsemailsettingsplugin.r94" "\epoc32\data\z\resource\apps\fsmailserver.r94" - "c:\resource\apps\fsmailserver.r94" + "\epoc32\data\z\resource\apps\emailwidget.r94" - "c:\resource\apps\emailwidget.r94" "\epoc32\data\z\resource\ipssossettings.r94" - "c:\resource\ipssossettings.r94" "\epoc32\data\z\resource\apps\fscpocplugin.r94" - "c:\resource\apps\fscpocplugin.r94" "\epoc32\data\z\resource\apps\fsccallplugin.r94" - "c:\resource\apps\fsccallplugin.r94" @@ -922,6 +965,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r96" - "c:\resource\apps\freestyleemailui.r96" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r96" - "c:\resource\apps\gsemailsettingsplugin.r96" "\epoc32\data\z\resource\apps\fsmailserver.r96" - "c:\resource\apps\fsmailserver.r96" + "\epoc32\data\z\resource\apps\emailwidget.r96" - "c:\resource\apps\emailwidget.r96" "\epoc32\data\z\resource\ipssossettings.r96" - "c:\resource\ipssossettings.r96" "\epoc32\data\z\resource\apps\fscpocplugin.r96" - "c:\resource\apps\fscpocplugin.r96" "\epoc32\data\z\resource\apps\fsccallplugin.r96" - "c:\resource\apps\fsccallplugin.r96" @@ -937,6 +981,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r102" - "c:\resource\apps\freestyleemailui.r102" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r102" - "c:\resource\apps\gsemailsettingsplugin.r102" "\epoc32\data\z\resource\apps\fsmailserver.r102" - "c:\resource\apps\fsmailserver.r102" + "\epoc32\data\z\resource\apps\emailwidget.r102" - "c:\resource\apps\emailwidget.r102" "\epoc32\data\z\resource\ipssossettings.r102" - "c:\resource\ipssossettings.r102" "\epoc32\data\z\resource\apps\fscpocplugin.r102" - "c:\resource\apps\fscpocplugin.r102" "\epoc32\data\z\resource\apps\fsccallplugin.r102" - "c:\resource\apps\fsccallplugin.r102" @@ -952,6 +997,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r103" - "c:\resource\apps\freestyleemailui.r103" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r103" - "c:\resource\apps\gsemailsettingsplugin.r103" "\epoc32\data\z\resource\apps\fsmailserver.r103" - "c:\resource\apps\fsmailserver.r103" + "\epoc32\data\z\resource\apps\emailwidget.r103" - "c:\resource\apps\emailwidget.r103" "\epoc32\data\z\resource\ipssossettings.r103" - "c:\resource\ipssossettings.r103" "\epoc32\data\z\resource\apps\fscpocplugin.r103" - "c:\resource\apps\fscpocplugin.r103" "\epoc32\data\z\resource\apps\fsccallplugin.r103" - "c:\resource\apps\fsccallplugin.r103" @@ -967,6 +1013,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r129" - "c:\resource\apps\freestyleemailui.r129" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r129" - "c:\resource\apps\gsemailsettingsplugin.r129" "\epoc32\data\z\resource\apps\fsmailserver.r129" - "c:\resource\apps\fsmailserver.r129" + "\epoc32\data\z\resource\apps\emailwidget.r129" - "c:\resource\apps\emailwidget.r129" "\epoc32\data\z\resource\ipssossettings.r129" - "c:\resource\ipssossettings.r129" "\epoc32\data\z\resource\apps\fscpocplugin.r129" - "c:\resource\apps\fscpocplugin.r129" "\epoc32\data\z\resource\apps\fsccallplugin.r129" - "c:\resource\apps\fsccallplugin.r129" @@ -982,6 +1029,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r157" - "c:\resource\apps\freestyleemailui.r157" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r157" - "c:\resource\apps\gsemailsettingsplugin.r157" "\epoc32\data\z\resource\apps\fsmailserver.r157" - "c:\resource\apps\fsmailserver.r157" + "\epoc32\data\z\resource\apps\emailwidget.r157" - "c:\resource\apps\emailwidget.r157" "\epoc32\data\z\resource\ipssossettings.r157" - "c:\resource\ipssossettings.r157" "\epoc32\data\z\resource\apps\fscpocplugin.r157" - "c:\resource\apps\fscpocplugin.r157" "\epoc32\data\z\resource\apps\fsccallplugin.r157" - "c:\resource\apps\fsccallplugin.r157" @@ -997,6 +1045,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r158" - "c:\resource\apps\freestyleemailui.r158" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r158" - "c:\resource\apps\gsemailsettingsplugin.r158" "\epoc32\data\z\resource\apps\fsmailserver.r158" - "c:\resource\apps\fsmailserver.r158" + "\epoc32\data\z\resource\apps\emailwidget.r158" - "c:\resource\apps\emailwidget.r158" "\epoc32\data\z\resource\ipssossettings.r158" - "c:\resource\ipssossettings.r158" "\epoc32\data\z\resource\apps\fscpocplugin.r158" - "c:\resource\apps\fscpocplugin.r158" "\epoc32\data\z\resource\apps\fsccallplugin.r158" - "c:\resource\apps\fsccallplugin.r158" @@ -1012,6 +1061,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r159" - "c:\resource\apps\freestyleemailui.r159" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r159" - "c:\resource\apps\gsemailsettingsplugin.r159" "\epoc32\data\z\resource\apps\fsmailserver.r159" - "c:\resource\apps\fsmailserver.r159" + "\epoc32\data\z\resource\apps\emailwidget.r159" - "c:\resource\apps\emailwidget.r159" "\epoc32\data\z\resource\ipssossettings.r159" - "c:\resource\ipssossettings.r159" "\epoc32\data\z\resource\apps\fscpocplugin.r159" - "c:\resource\apps\fscpocplugin.r159" "\epoc32\data\z\resource\apps\fsccallplugin.r159" - "c:\resource\apps\fsccallplugin.r159" @@ -1027,6 +1077,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r160" - "c:\resource\apps\freestyleemailui.r160" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r160" - "c:\resource\apps\gsemailsettingsplugin.r160" "\epoc32\data\z\resource\apps\fsmailserver.r160" - "c:\resource\apps\fsmailserver.r160" + "\epoc32\data\z\resource\apps\emailwidget.r160" - "c:\resource\apps\emailwidget.r160" "\epoc32\data\z\resource\ipssossettings.r160" - "c:\resource\ipssossettings.r160" "\epoc32\data\z\resource\apps\fscpocplugin.r160" - "c:\resource\apps\fscpocplugin.r160" "\epoc32\data\z\resource\apps\fsccallplugin.r160" - "c:\resource\apps\fsccallplugin.r160" @@ -1042,6 +1093,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r161" - "c:\resource\apps\freestyleemailui.r161" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r161" - "c:\resource\apps\gsemailsettingsplugin.r161" "\epoc32\data\z\resource\apps\fsmailserver.r161" - "c:\resource\apps\fsmailserver.r161" + "\epoc32\data\z\resource\apps\emailwidget.r161" - "c:\resource\apps\emailwidget.r161" "\epoc32\data\z\resource\ipssossettings.r161" - "c:\resource\ipssossettings.r161" "\epoc32\data\z\resource\apps\fscpocplugin.r161" - "c:\resource\apps\fscpocplugin.r161" "\epoc32\data\z\resource\apps\fsccallplugin.r161" - "c:\resource\apps\fsccallplugin.r161" @@ -1057,6 +1109,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r326" - "c:\resource\apps\freestyleemailui.r326" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r326" - "c:\resource\apps\gsemailsettingsplugin.r326" "\epoc32\data\z\resource\apps\fsmailserver.r326" - "c:\resource\apps\fsmailserver.r326" + "\epoc32\data\z\resource\apps\emailwidget.r326" - "c:\resource\apps\emailwidget.r326" "\epoc32\data\z\resource\ipssossettings.r326" - "c:\resource\ipssossettings.r326" "\epoc32\data\z\resource\apps\fscpocplugin.r326" - "c:\resource\apps\fscpocplugin.r326" "\epoc32\data\z\resource\apps\fsccallplugin.r326" - "c:\resource\apps\fsccallplugin.r326" @@ -1072,6 +1125,7 @@ "\epoc32\data\z\resource\apps\freestyleemailui.r327" - "c:\resource\apps\freestyleemailui.r327" "\epoc32\data\z\resource\apps\gsemailsettingsplugin.r327" - "c:\resource\apps\gsemailsettingsplugin.r327" "\epoc32\data\z\resource\apps\fsmailserver.r327" - "c:\resource\apps\fsmailserver.r327" + "\epoc32\data\z\resource\apps\emailwidget.r327" - "c:\resource\apps\emailwidget.r327" "\epoc32\data\z\resource\ipssossettings.r327" - "c:\resource\ipssossettings.r327" "\epoc32\data\z\resource\apps\fscpocplugin.r327" - "c:\resource\apps\fscpocplugin.r327" "\epoc32\data\z\resource\apps\fsccallplugin.r327" - "c:\resource\apps\fsccallplugin.r327"
--- a/emailuis/emailui/src/FSComposerFetchLogic.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FSComposerFetchLogic.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -205,33 +205,35 @@ { FUNC_LOG; - if ( !iError && aEvent.iError ) + // Ignore all responses when cancelling is in progress. + if ( !iFetchingCancelGoingOn ) { - // Cancel all fetching when first error occurs - iError = aEvent.iError; - if(!iFetchingCancelGoingOn) //<cmail> if cancelling not going on, start now + if ( !iError && aEvent.iError ) + { + // Cancel all fetching when first error occurs + iError = aEvent.iError; CancelFetchings(); - } + } + else if ( TFsEmailUiUtility::IsCompleteOrCancelEvent( aEvent ) ) + { + // Remove the completed/failed download item + for ( TInt i=0; i<iParts.Count(); i++ ) + { + if ( iParts[i] == aPart ) + { + iParts.Remove( i ); + break; + } + } - if ( TFsEmailUiUtility::IsCompleteOrCancelEvent( aEvent ) ) - { - // Remove the completed/failed download item - for ( TInt i=0; i<iParts.Count(); i++ ) - { - if ( iParts[i] == aPart ) - { - iParts.Remove( i ); - break; - } - } - - // If last part just got removed, then move on - if ( !iParts.Count() ) - { - Complete(); + // If last part just got removed, then move on + if ( !iParts.Count() ) + { + Complete(); + } } } - } + } // ----------------------------------------------------------------------------- @@ -578,32 +580,28 @@ } // message part downloads - //<cmail> during consecutive calls to CancelDownloadL, iParts contents don't remain same. - // changing this so that it works even with varying contents in iParts - TInt count = iParts.Count(); - TInt currentCount = count; - while (count) + if ( iAppUi.DownloadInfoMediator() ) { - TInt error( KErrNone ); - if ( iAppUi.DownloadInfoMediator() ) - { - TRAP( error, iAppUi.DownloadInfoMediator()->CancelDownloadL( iParts[0].iMessagePartId ) ); - currentCount = iParts.Count(); - if(currentCount>=count) - iParts.Remove(0); - count = currentCount; - //</cmail> - } - if ( error ) + // Note that we don't bother removing anything from iParts now; they + // will be cleaned up later. + for ( TInt i = iParts.Count() - 1; i >= 0; i-- ) { + TRAP_IGNORE( iAppUi.DownloadInfoMediator()->CancelDownloadL( iParts[i].iMessagePartId ) ); } } + //<cmail> - if(!iRequestCompleted) + if( !iRequestCompleted ) { - iObserver.FetchLogicComplete( iState, KErrCancel ); + if ( iObserver.FetchLogicComplete( iState, KErrCancel )) + { + // If the observer deleted this object, don't try to do anything + // else. + return; + } iRequestCompleted = ETrue; //so that no stray events from plugins can cause panic } + iFetchingCancelGoingOn = EFalse; //</cmail> }
--- a/emailuis/emailui/src/FreestyleEmailDownloadInformationMediator.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailDownloadInformationMediator.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -730,7 +730,7 @@ { FUNC_LOG; // go through all observers - for ( TInt j=0; j<iObserverArray.Count(); j++) + for ( TInt j=iObserverArray.Count()-1; j>=0; j--) { // if observer is observing this message if ( iObserverArray[j].iMessageId == aPart.iMessageId )
--- a/emailuis/emailui/src/FreestyleEmailUiAppui.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiAppui.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -134,10 +134,10 @@ _LIT( KMsgReaderFsDll,"freestylemessagescanner.dll"); // DLL provided by msg reader. _LIT( KPhoneModuleName, "Phonetsy.tsy"); _LIT( KPhoneName, "DefaultPhone"); -// Message editor resources -_LIT( KMsgEditorAppUiResourceFileName, "z:msgeditorappui.rsc" ); -// FSMailServer resources -_LIT( KFSMailServerResourceFileName, "z:fsmailserver.rsc" ); +// Message editor resource file with wild cards +_LIT( KMsgEditorAppUiResourceFileName, "msgeditorappui.r*" ); +// FSMailServer resource file with path and wild cards +_LIT( KFSMailServerResourceFileNameWithPath, "\\resource\\apps\\fsmailserver.r*" ); // 6 seconds const TTimeIntervalMicroSeconds32 KIdleTimeInterval = 6000000; @@ -152,6 +152,8 @@ const TUint KConnectionStatusIconRotationInterval = 100; const TInt KConnectionStatusIconRotationAmount = 18; +// Length of the drive letter descriptor (e.g. "c:") +const TInt KDriveDescLength = 2; // --------------------------------------------------------------------------- // C++ constructor. @@ -170,6 +172,44 @@ } // --------------------------------------------------------------------------- +// Load specified resource file, file name may (and should) contain wild cards +// --------------------------------------------------------------------------- +// +TInt CFreestyleEmailUiAppUi::LoadResourceFileL( + const TDesC& aFileName, + const TDesC& aFilePath ) + { + FUNC_LOG; + + TFindFile search( iCoeEnv->FsSession() ); + CDir* dirList = NULL; + TInt err = search.FindWildByDir( aFileName, aFilePath, dirList ); + + if ( err == KErrNone ) + { + // After succesfull FindWildByDir; dirList contains list of found file + // names and search.File() returns the drive and path of the file(s) + if ( dirList->Count() > 0 ) + { + TParse parse; + parse.Set( (*dirList)[0].iName, &search.File(), NULL ); + TFileName nearestFile( parse.FullName() ); + BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), nearestFile ); + delete dirList; + + INFO_1( "Load resource: %S", &nearestFile ); + // Return the resource file offset if file loaded succesfully + return iEikonEnv->AddResourceFileL( nearestFile ); + } + delete dirList; + } + + // Leave if resource file is not found + User::Leave( err ); + return 0; // To avoid compiler warnings + } + +// --------------------------------------------------------------------------- // ConstructL is called by the application framework // --------------------------------------------------------------------------- // @@ -177,23 +217,19 @@ { FUNC_LOG; - // for debug builds create log file directory automatically -#ifdef _DEBUG - _LIT( KDebugLogDir, "c:\\logs\\FreestyleEmailUi\\" ); - BaflUtils::EnsurePathExistsL( iEikonEnv->FsSession(), KDebugLogDir ); -#endif - - // Add message editor resources (needed for ENote fetch) - TParse parse; - parse.Set( KMsgEditorAppUiResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL ); - TFileName fileName( parse.FullName() ); - BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), fileName ); - iMsgEditorResourceOffset = iEikonEnv->AddResourceFileL( fileName ); - // Add FSMailServer resources - parse.Set( KFSMailServerResourceFileName, &KDC_APP_RESOURCE_DIR, NULL ); - fileName = parse.FullName(); - BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), fileName ); - iFSMailServerResourceOffset = iEikonEnv->AddResourceFileL( fileName ); + // Load message editor resources (needed for ENote fetch) + iMsgEditorResourceOffset = LoadResourceFileL( + KMsgEditorAppUiResourceFileName, + KDC_RESOURCE_FILES_DIR ); + + // Load FSMailServer resource file, search first the same drive from where + // our process is loaded as FSMailServer should be installed in same drive + RProcess ownProcess; + TFileName ownProcessName( ownProcess.FileName() ); + ownProcess.Close(); + iFSMailServerResourceOffset = LoadResourceFileL( + KFSMailServerResourceFileNameWithPath, + ownProcessName.LeftTPtr( KDriveDescLength ) ); // flag indicating whether we are in AppUi::ConstructL // workaround for compose view loadbackgroundcontext sending skin changed events @@ -216,7 +252,7 @@ // state changed events. The initial state will be reported in construction iPropertySubscriber = CFreestyleEmailUiPropertySubscriber::NewL( KPSUidHWRM, KHWRMFlipStatus, *this ); - + // Create Document Handler instance iDocumentHandler = CDocumentHandler::NewL(); iFileHandleShutter = CFsEmailFileHandleShutter::NewL(*iDocumentHandler); @@ -235,7 +271,7 @@ // Set up layouthandler iLayoutHandler = CFSEmailUiLayoutHandler::NewL( *iEnv ); iLayoutHandler->ScreenResolutionChanged(); - + // Create mail client, list mailboxes iMailClient = CFSMailClient::NewL(); @@ -248,7 +284,7 @@ // New mailbox query async callback iNewBoxQueryAsyncCallback = new (ELeave) CAsyncCallBack( CActive::EPriorityStandard ); - iNewBoxQueryAsyncCallback->Set( TCallBack( DisplayCreateQueryL, this ) ); + iNewBoxQueryAsyncCallback->Set( TCallBack( DisplayCreateQueryL, this ) ); iActionMenuHandler = CFSEmailUiActionMenu::NewL( this ); @@ -334,19 +370,18 @@ iWizardObserver = CFSEmailUiWizardObserver::NewL( this, iMainUiGridVisualiser ); iConstructComplete = ETrue; + iExitGuardian = CEUiExitGuardian::NewL( *this ); + + iConnectionStatusVisible = ETrue; + // Create custom statuspane indicators object, which shows priority and followup flags + CreateStatusPaneIndicatorsL(); + iConnectionStatusIconAnimTimer = CFSEmailUiGenericTimer::NewL(this, CActive::EPriorityLow); + // this includes a wait note where code running will be pending // until a certain callback event is received // -> thus keep this last in this method! iWizardObserver->DoWizardStartupActionsL(); - - iExitGuardian = CEUiExitGuardian::NewL( *this ); - - iConnectionStatusVisible = ETrue; - // Create custom statuspane indicators object, which shows priority and followup flags - CreateStatusPaneIndicatorsL(); - iConnectionStatusIconAnimTimer = CFSEmailUiGenericTimer::NewL(this, CActive::EPriorityLow); - iFocusTimer = CPeriodic::New(CActive::EPriorityIdle); - } + } // Functions loads some views as delayed to reduce startup time TInt CFreestyleEmailUiAppUi::ViewLoadIdleCallbackFunctionL() @@ -389,7 +424,7 @@ CFreestyleEmailUiAppUi::~CFreestyleEmailUiAppUi() { FUNC_LOG; - + if ( iMsgEditorResourceOffset ) { iEikonEnv->DeleteResourceFile( iMsgEditorResourceOffset ); @@ -409,7 +444,7 @@ delete iPropertySubscriber; DeleteStatusPaneIndicators(); - + if ( iAutoSyncMonitor ) { iAutoSyncMonitor->StopMonitoring(); @@ -492,17 +527,10 @@ // destroys the Download Information mediator // Destruction must be done here as other Tls data depends on it. CFSEmailDownloadInfoMediator::Destroy(); - + delete iNaviDecorator2MailViewer; - + delete iConnectionStatusIconAnimTimer; - - if (iFocusTimer) - { - CancelFocusRemovalTimer(); - delete iFocusTimer; - } - } @@ -590,10 +618,10 @@ FUNC_LOG; // Check if we just returned from a plugin settings view. In that case, the current active view // and view history must be updated here (because RetrunToPreviousViewL() has not been used). - if ( iSettingsViewActive ) + if ( iSettingsViewActive ) { iSettingsViewActive = EFalse; - + // Set the iCurrentActiveView pointer if ( iNavigationHistory->IsEmpty() ) { @@ -662,7 +690,7 @@ { // Message deleted, remove mail viewer from the stack // => view returns directly mail list (or any other view where the viewer was started from) - + TMailListActivationData tmp; tmp.iRequestRefresh = ETrue; const TPckgBuf<TMailListActivationData> pkgOut( tmp ); @@ -677,7 +705,7 @@ TUid CFreestyleEmailUiAppUi::ReturnToPreviousViewL( const TDesC8& aCustomMessage /*= KNullDesC8*/ ) { FUNC_LOG; - iPreviousActiveView = iCurrentActiveView; + iPreviousActiveView = iCurrentActiveView; CFsDelayedLoader::InstanceL()->GetContactHandlerL()->Reset(); // Set the iCurrentActiveView pointer if ( iNavigationHistory->IsEmpty() ) @@ -812,13 +840,13 @@ } void CFreestyleEmailUiAppUi::ShowSortListInPopupL( - const TFSMailSortField aCurrentSortOrder, + const TFSMailSortCriteria aCurrentSortCriteria, const TFSFolderType aFolderType, MFSEmailUiSortListCallback* aCallback, MFsControlButtonInterface* aButton ) { FUNC_LOG; - iFolderListVisualiser->ShowSortListPopupL( aCurrentSortOrder, aFolderType, aCallback, aButton ); + iFolderListVisualiser->ShowSortListPopupL( aCurrentSortCriteria, aFolderType, aCallback, aButton ); iCurrentActiveView->ControlGroup().SetAcceptInput( EFalse ); iEnv->Send( TAlfGroupCommand(*iFolderListControlGroup, EAlfOpShow, &Display()), 0 ); @@ -836,15 +864,15 @@ void CFreestyleEmailUiAppUi::ProcessCommandL( TInt aCommand ) { FUNC_LOG; - + // For a reason unknown compose view propagates a leave when the options // menu open -command is sent to it during the time when it has started // the view deactivation but not yet completed that. It causes unnecessay - // leave notes in a complete normal use cases in the emulator. To remove + // leave notes in a complete normal use cases in the emulator. To remove // the notes but keep the regression risk at minimum (ie. not do any major // refactoring) trap the leave here. Propagate other leaves normally. TRAPD( err, CAknViewAppUi::ProcessCommandL( aCommand ) ); - + if ( err != KErrNcsComposeViewNotReady ) { User::LeaveIfError( err ); @@ -899,7 +927,7 @@ // First, prepare viewer, search list and composer for exit, destroys mailbox object before // This exit preparation should be moved to base class in the future. - if ( iMsgDetailsVisualiser ) + if ( iMsgDetailsVisualiser ) { iMsgDetailsVisualiser->PrepareForExit(); } @@ -949,7 +977,7 @@ } iSubscribedMailBoxesIds.Reset(); iSubscribedMailBoxes.Reset(); - + if ( iMailClient ) { iMailClient->RemoveObserver( *this ); @@ -1042,9 +1070,9 @@ const TInt KAknFullOrPartialForegroundGained = 0x10281F36; const TInt KAknFullOrPartialForegroundLost = 0x10281F37; #endif - + TBool closeMenu = EFalse; - + // Let folder list visualizer to handle event first because if the popup // is showed, that needs to be closed when pointer click happens outside of the // popup rect and also following pointer up event has to be consumed @@ -1052,7 +1080,7 @@ { return; } - + TInt key = aEvent.Key()->iScanCode; // <cmail> // to disable voice commands during creating new mail message @@ -1079,16 +1107,16 @@ } //} //<cmail> } - + TInt keyCode = aEvent.Key()->iCode; - - if ( EKeyQwertyOn == keyCode || + + if ( EKeyQwertyOn == keyCode || EKeyQwertyOff == keyCode ) { - // Close menu when keyboard is opened or closed. + // Close menu when keyboard is opened or closed. closeMenu = ETrue; } - + switch ( aEvent.Type() ) { case KAknFullOrPartialForegroundLost: @@ -1115,12 +1143,12 @@ default: break; } - + // Close menu if ( closeMenu && iCurrentActiveView != NULL ) { CEikMenuBar* menu = iCurrentActiveView->MenuBar(); - + if ( menu != NULL ) { if ( menu->IsDisplayed() ) @@ -1129,7 +1157,7 @@ } } } - + CAknAppUi::HandleWsEventL(aEvent, aDestination); } @@ -1185,8 +1213,8 @@ // { // CAlfEnv::Static()->NotifySkinChangedL(); // } - - + + if( aType == KEikDynamicLayoutVariantSwitch || aType == KAknsMessageSkinChange) { TRect screenRect; @@ -1489,17 +1517,17 @@ FUNC_LOG; // Set flag iAutomatedMailBoxOnline = EFalse; - + // Try to get the mailbox CFSMailBox* newActiveBox = iMailClient->GetMailBoxByUidL( aActiveMailboxId ); User::LeaveIfNull( newActiveBox ); - + // Replace active mailbox of the application if getting the mailbox was succesful delete iActiveMailbox; iActiveMailbox = newActiveBox; - iActiveMailboxId = iActiveMailbox->GetId(); - iActiveBoxInboxId = iActiveMailbox->GetStandardFolderId( EFSInbox ); + iActiveMailboxId = iActiveMailbox->GetId(); + iActiveBoxInboxId = iActiveMailbox->GetStandardFolderId( EFSInbox ); SubscribeMailboxL( iActiveMailboxId ); @@ -1567,7 +1595,7 @@ TBool CFreestyleEmailUiAppUi::MessageReaderSupportsFreestyle() { FUNC_LOG; - // Check availability of Reader if necessary. Msg reader cannot be installed + // Check availability of Reader if necessary. Msg reader cannot be installed // from sisx so checking is done only once. KErrGeneral at startup. if ( iMsgReaderIsSupported == KErrGeneral ) { @@ -1766,7 +1794,7 @@ TAny* aParam1, TAny* aParam2, TAny* aParam3 ) { FUNC_LOG; - + if (iExitGuardian) { iExitGuardian->EnterLC(); @@ -1844,17 +1872,8 @@ { ManualMailBoxSyncAll(EFalse); } - else if (iManualMailBoxSync) - { - TDesC* mbName(0); - CFSMailBox* mb = GetActiveMailbox(); - if ( mb ) - { - mbName = &mb->GetName(); - } - } } - break; + break; case SyncError: { // error occured during "Connect" or "Send and receive" operation @@ -1870,7 +1889,7 @@ ManualMailBoxSync( EFalse ); } } - break; + break; case FinishedSuccessfully: case SyncCancelled: case Idle: @@ -1881,10 +1900,6 @@ case PushChannelOffBecauseBatteryIsLow: { - CFSMailBox* mb = iMailClient->GetMailBoxByUidL( aMailbox ); - CleanupStack::PushL( mb ); - TDesC* mbName = &mb->GetName(); - CleanupStack::PopAndDestroy( mb ); } break; } //switch @@ -2054,7 +2069,19 @@ } return ret; } - + +// Move to previous message when the current message is deleted in viewer +TInt CFreestyleEmailUiAppUi::MoveToPreviousMsgAfterDeleteL( TFSMailMsgId aFoundPreviousMsgId ) + { + FUNC_LOG; + TInt ret(KErrNotFound); + if ( !iNavigationHistory->IsEmpty() ) + { + iNavigationHistory->Head()->MoveToPreviousMsgAfterDeleteL( aFoundPreviousMsgId ); + } + return ret; + } + CDocumentHandler& CFreestyleEmailUiAppUi::DocumentHandler() { FUNC_LOG; @@ -2172,7 +2199,7 @@ { FUNC_LOG; iForcedConnectionStatus = aForcedStatus; - + if ( iConnectionStatusVisible ) { // Get connection status of the current mailbox @@ -2193,7 +2220,7 @@ CAknTitlePane* titlePane = NULL; TRAP_IGNORE( titlePane = (CAknTitlePane*)StatusPane()->ControlL( titlePaneUid ) ); - + // Set connection icon iConnectionStatusIconAnimTimer->Stop(); iConnectionIconBitmap = 0; @@ -2217,14 +2244,14 @@ { TRAP_IGNORE( FsTextureManager()->ProvideBitmapL( EStatusTextureConnected, iConnectionIconBitmap, iConnectionIconMask ) ); - } + } } else // EFSMailBoxOffline { TRAP_IGNORE( FsTextureManager()->ProvideBitmapL( EStatusTextureDisconnectedGeneral, iConnectionIconBitmap, iConnectionIconMask ) ); } - + if ( iConnectionIconBitmap ) { AknIconUtils::SetSize( iConnectionIconBitmap, iconSize, EAspectRatioNotPreserved ); @@ -2444,7 +2471,7 @@ { FUNC_LOG; CFreestyleEmailUiAppUi* self = static_cast<CFreestyleEmailUiAppUi*>( aSelfPtr ); - + if (self->AppUiExitOngoing()) { return KErrNone; @@ -2457,14 +2484,14 @@ return KErrNone; } } - + TRAPD( err, self->DisplayCreateMailboxQueryL() ); - + if (err == KLeaveExit) { User::Leave(err); } - + return err; } @@ -2491,21 +2518,21 @@ if ( task.Exists() ) { // Send self to background - task.SendToBackground(); + task.SendToBackground(); } iSwitchingToBackground = EFalse; } // ----------------------------------------------------------------------------- -// +// // ----------------------------------------------------------------------------- void CFreestyleEmailUiAppUi::ConstructNaviPaneL() { FUNC_LOG; - CAknNavigationControlContainer* naviPaneContainer = - static_cast<CAknNavigationControlContainer*>( + CAknNavigationControlContainer* naviPaneContainer = + static_cast<CAknNavigationControlContainer*>( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ); // Following navipane is for mailviewer view @@ -2513,27 +2540,27 @@ { // Constructing a decorator with own decorated control, // which is (currently an empty) container. - CFreestyleEmailUiNaviPaneControlContainer2MailViewer* c = + CFreestyleEmailUiNaviPaneControlContainer2MailViewer* c = CFreestyleEmailUiNaviPaneControlContainer2MailViewer::NewL(); c->SetContainerWindowL( *naviPaneContainer ); iNaviDecorator2MailViewer = CAknNavigationDecorator::NewL( naviPaneContainer, - c, + c, CAknNavigationDecorator::ENotSpecified ); - + // In order to get navi arrows visible, they must be set visible AND not dimmed... iNaviDecorator2MailViewer->SetContainerWindowL( *naviPaneContainer ); iNaviDecorator2MailViewer->MakeScrollButtonVisible( ETrue ); iNaviDecorator2MailViewer->SetScrollButtonDimmed( CAknNavigationDecorator::ELeftButton, EFalse ); iNaviDecorator2MailViewer->SetScrollButtonDimmed( CAknNavigationDecorator::ERightButton, EFalse ); - + iNaviDecorator2MailViewer->SetComponentsToInheritVisibility( ETrue ); naviPaneContainer->PushL( *iNaviDecorator2MailViewer ); } } // ----------------------------------------------------------------------------- -// +// // ----------------------------------------------------------------------------- CAknNavigationDecorator* CFreestyleEmailUiAppUi::NaviDecoratorL( const TUid aViewId ) { @@ -2566,7 +2593,7 @@ CAknTitlePane* titlePane = NULL; TRAP_IGNORE( titlePane = (CAknTitlePane*)StatusPane()->ControlL( titlePaneUid ) ); - + TSize iconSize = LayoutHandler()->statusPaneIconSize(); iConnectionStatusIconAngle += KConnectionStatusIconRotationAmount; AknIconUtils::SetSizeAndRotation(iConnectionIconBitmap, iconSize, EAspectRatioNotPreserved, iConnectionStatusIconAngle); @@ -2578,80 +2605,37 @@ } // ----------------------------------------------------------------------------- -// CFreestyleEmailUiAppUi::CancelFocusRemovalTimer +// CFreestyleEmailUiAppUi::SetFocusVisibility // ----------------------------------------------------------------------------- -void CFreestyleEmailUiAppUi::CancelFocusRemovalTimer() +TBool CFreestyleEmailUiAppUi::SetFocusVisibility( TBool aVisible ) { - TBool wasActive = iFocusTimer->IsActive(); - iFocusTimer->Cancel(); - + FUNC_LOG; + TBool oldFocusState( iFocusVisible ); + iFocusVisible = aVisible; CFsEmailUiViewBase* activeView = CurrentActiveView(); - if( wasActive && activeView ) + if ( /*oldFocusState != aVisible &&*/ activeView ) { - activeView->HandleTimerFocusStateChange( EFalse ); + activeView->FocusVisibilityChange( aVisible ); } - } - -// ----------------------------------------------------------------------------- -// CFreestyleEmailUiAppUi::StartFocusRemovalTimer -// ----------------------------------------------------------------------------- - -TBool CFreestyleEmailUiAppUi::StartFocusRemovalTimer() - { - TBool wasActive = iFocusTimer->IsActive(); - iFocusTimer->Cancel(); - // Start the timer and calls FocusTimerCallBack when the timer expires - iFocusTimer->Start(KIdleTimeInterval, KIdleTimeInterval, - TCallBack(FocusTimerCallBack, this)); - - CFsEmailUiViewBase* activeView = CurrentActiveView(); - if ( !wasActive && activeView ) - { - activeView->HandleTimerFocusStateChange( ETrue ); - } - - return wasActive; + // If popup is visible inform it also. + if( iFolderListVisualiser && iFolderListVisualiser->IsPopupShown() ) + { + iFolderListVisualiser->FocusVisibilityChange( aVisible ); + } + return oldFocusState; } // ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -TInt CFreestyleEmailUiAppUi::FocusTimerCallBack(TAny* aAny) - { - CFreestyleEmailUiAppUi* self = - static_cast<CFreestyleEmailUiAppUi*>( aAny ); - - return self->DoFocusTimerCallBack(); - } -// ----------------------------------------------------------------------------- -// +// // ----------------------------------------------------------------------------- -TInt CFreestyleEmailUiAppUi::DoFocusTimerCallBack() +TBool CFreestyleEmailUiAppUi::IsFocusShown() const { - iFocusTimer->Cancel(); - CFsEmailUiViewBase* activeView = CurrentActiveView(); - - // Call the HandleTimerFocusStateChange of currently active so that it hides - // its focus. - if ( activeView ) - { - activeView->HandleTimerFocusStateChange( EFalse ); - } - - return KErrNone; + FUNC_LOG; + return iFocusVisible; } -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -TBool CFreestyleEmailUiAppUi::IsTimerFocusShown() const - { - return iFocusTimer->IsActive(); - } - - -// PUBLIC METHODS FROM MFREESTYLEEMAILUIPROPERTYCHANGEDOBSERVER +// PUBLIC METHODS FROM MFREESTYLEEMAILUIPROPERTYCHANGEDOBSERVER // ----------------------------------------------------------------------------- // From MFreestyleEmailUiPropertyChangedObserver. @@ -2669,7 +2653,7 @@ { iFlipOpen = EFalse; } - + CFsEmailUiViewBase* activeView = CurrentActiveView(); if ( activeView ) {
--- a/emailuis/emailui/src/FreestyleEmailUiFolderListVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiFolderListVisualiser.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -15,7 +15,6 @@ * */ - // SYSTEM INCLUDES #include "emailtrace.h" #include <AknUtils.h> @@ -32,6 +31,7 @@ #include <alf/alftextvisual.h> #include <alf/alfcontrolgroup.h> #include <alf/alfbrusharray.h> +#include <alf/alfshadowborderbrush.h> #include <alf/alfevent.h> #include <alf/alfframebrush.h> #include <alf/alfstatic.h> @@ -75,9 +75,6 @@ #include "ESMailSettingsPlugin.h" #include "FreestyleEmailUiStatusIndicator.h" -// REMOVE WHEN DONE TESTING: -//#include "CSimpleAOTest.h" - // Defines the order of the folders in UI enum TFSEmailUiFolderListPriorities { @@ -103,11 +100,33 @@ EFolderListIconEmailAccount }; +// Defines the order of the sort list icons in the sort icon array +enum TFsEmailUiSortListIcons + { + ESortListAttachmentAscIcon = 0, + ESortListAttachmentDescIcon, + ESortListDateAscIcon, + ESortListDateDescIcon, + ESortListFollowAscIcon, + ESortListFollowDescIcon, + ESortListPriorityAscIcon, + ESortListPriorityDescIcon, + ESortListSenderAscIcon, + ESortListSenderDescIcon, + ESortListSubjectAscIcon, + ESortListSubjectDescIcon, + ESortListUnreadAscIcon, + ESortListUnreadDescIcon + }; + // List level for the root folders static const TInt KListRootLevel( 1 ); // List supports three levels, so basically root folder + two levels of subfolders static const TInt KListLastBasicLevel( KListRootLevel + 2 ); +const TInt KDefaultShadowBorderWidth( 15 ); +const TReal KShadowBorderOpacity( 0.08 ); + // Constants for drawing header text const TReal KFSHeaderTextBackgroundOpacity = 0.3f; const TAlfTimedValue KFSVisible( 1 ); @@ -149,8 +168,8 @@ // Constructor // --------------------------------------------------------------------------- // -CFSEmailUiFolderListVisualiser::CFSEmailUiFolderListVisualiser( CAlfEnv& aEnv, - CFreestyleEmailUiAppUi& aAppUi, +CFSEmailUiFolderListVisualiser::CFSEmailUiFolderListVisualiser( CAlfEnv& aEnv, + CFreestyleEmailUiAppUi& aAppUi, CAlfControlGroup& aControlGroup ) : CFsEmailUiViewBase( aControlGroup, aAppUi ), iEnv( aEnv ), @@ -162,7 +181,7 @@ { FUNC_LOG; } - + // --------------------------------------------------------------------------- // Destructor // --------------------------------------------------------------------------- @@ -176,15 +195,18 @@ delete iBackgroundBrush; iBackgroundBrush = NULL; + delete iShadowBrush; + // No need for ResetAndDestroy because list items are owned by generic list iListItemVisulizers.Close(); - + //delete iNotifierTest; - + delete iTreeList; iTreeList = NULL; - + iIconArray.Close(); + iSortIconArray.Close(); if ( iAsyncCallback ) { @@ -218,19 +240,19 @@ FUNC_LOG; iControl = CFSEmailUiFolderListControl::NewL( iEnv, *this ); iModel = new (ELeave) CFSEmailUiFolderListModel(); - + UpdateListSizeAttributes(); //LoadIconsL(); - + TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); iFaderLayout = CAlfDeckLayout::AddNewL( *iControl ); iFaderLayout->SetRect( mainPaneRect ); - + iParentLayout = CAlfAnchorLayout::AddNewL( *iControl ); iParentLayout->SetRect( iScreenRect ); iParentLayout->SetFlags( EAlfVisualFlagManualLayout ); - + iParentLayout->EnableBrushesL(); SetAnchors(); @@ -238,13 +260,13 @@ iHeaderLayout = CAlfDeckLayout::AddNewL( *iControl, iParentLayout ); iHeaderLayout->SetFlags( EAlfVisualFlagAutomaticLocaleMirroringEnabled ); - + iHeaderTextVisual = CAlfTextVisual::AddNewL( *iControl, iHeaderLayout ); iHeaderTextVisual->SetWrapping( CAlfTextVisual::ELineWrapTruncate ); iHeaderTextVisual->SetTextL( KNullDesC ); - + TRgb headerTextColor( KRgbBlack ); - AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), + AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), headerTextColor, KAknsIIDFsTextColors, EAknsCIFsTextColorsCG10 ); iHeaderTextVisual->SetColor( headerTextColor ); iHeaderTextVisual->SetTextStyle( iAppUi.LayoutHandler()-> @@ -261,7 +283,7 @@ iHeaderTextVisual->SetOpacity( KFSInvisible ); iHeaderLayout->SetOpacity( KFSInvisible ); - + iListLayout = CAlfDeckLayout::AddNewL( *iControl, iParentLayout ); iListLayout->SetFlags(EAlfVisualFlagLayoutUpdateNotification|EAlfVisualFlagAutomaticLocaleMirroringEnabled); @@ -272,14 +294,14 @@ iTreeVisualizer->SetFadeOutEffectTime( iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime() ); iTreeVisualizer->SetItemSeparatorSize( TSize(0, 0) ); iTreeVisualizer->SetExpandCollapseAllOnLongTap( EFalse ); - + iTreeList = CFsTreeList::NewL( *iTreeVisualizer, iEnv ); - + // Compared to S60 3.2.3 in S60 5.0 Alf offers the key events in // opposite order. ControlGroup().AppendL( iControl ); - ControlGroup().AppendL( iTreeList->TreeControl() ); - + ControlGroup().AppendL( iTreeList->TreeControl() ); + iTreeList->AddObserverL(*this); iTreeList->SetLoopingType( EFsTreeListLoopingJumpToFirstLast ); @@ -296,9 +318,9 @@ iTreeVisualizer->SetSelectorPropertiesL( iAppUi.FsTextureManager()->NewListSelectorBrushL(), 1.0, CFsTreeVisualizerBase::EFsSelectorMoveSmoothly ); - + iAsyncCallback = new (ELeave) CAsyncCallBack( CActive::EPriorityStandard ); - + //iNotifierTest = CSimpleAOTest::NewL(); iFirstStartCompleted = ETrue; } @@ -312,7 +334,7 @@ { FUNC_LOG; return FolderListId; - } + } // --------------------------------------------------------------------------- // CFSEmailUiFolderListVisualiser::PrepareFolderListL @@ -335,16 +357,16 @@ // Show empty screen when offline CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); - + if( iModel->Count() == 0 ) { cba->SetCommandSetL( R_FREESTYLE_EMAUIL_UI_SK_OPTIONS_BACK ); } - + if( iMoveOrCopyInitiated ) { - iTreeVisualizer->SetEmptyListTextL( KNullDesC ); - iTreeVisualizer->RefreshListViewL(); + iTreeVisualizer->SetEmptyListTextL( KNullDesC ); + iTreeVisualizer->RefreshListViewL(); } } @@ -377,19 +399,19 @@ iParentLayout->SetRect(iScreenRect); CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); - + if( iModel->Count() > 0 ) { cba->SetCommandSetL( R_FREESTYLE_EMAUIL_UI_SK_OPTIONS_BACK__SELECT ); } - + if( iMoveOrCopyInitiated ) { - HBufC* emptyListText = StringLoader::LoadLC( + HBufC* emptyListText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FOLDER_LIST_NO_FOLDERS_AVAILABLE ); iTreeVisualizer->SetEmptyListTextL( *emptyListText ); CleanupStack::PopAndDestroy( emptyListText ); - + iTreeVisualizer->RefreshListViewL(); } } @@ -418,7 +440,7 @@ FUNC_LOG; CFSEmailUiFolderListVisualiser* self = static_cast< CFSEmailUiFolderListVisualiser* >( aSelfPtr ); - TRAPD( err, + TRAPD( err, self->PopulateFolderListL(); if ( self->iCustomMessageId == KFolderListMoveMessage || self->iCustomMessageId == KFolderListMoveMessages || @@ -448,7 +470,7 @@ void CFSEmailUiFolderListVisualiser::HidePopupL() { FUNC_LOG; - + iParentLayout->SetRect( iCtrlButtonRect, iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime() ); TAlfTimedValue bgOpacity; @@ -511,36 +533,36 @@ // CFSEmailUiFolderListVisualiser::DoShowInPopupL // --------------------------------------------------------------------------- // -/*void CFSEmailUiFolderListVisualiser::DoShowInPopupL()*/ void CFSEmailUiFolderListVisualiser::DoShowInPopupL( MFsControlButtonInterface* aButton, MFSEmailUiFolderListCallback* aFolderCallback, MFSEmailUiSortListCallback* aSortCallback ) { FUNC_LOG; - + if ( ( aFolderCallback == NULL && aSortCallback == NULL ) || aButton == NULL ) { return; } - + // In case of popup we are not moving or copying messages, // so there's no need to connect the mailbox iNoConnectNeeded = ETrue; - + iCallback = aFolderCallback; iSortListCallback = aSortCallback; const TPoint buttonPos( aButton->Pos().Target() ); const TSize buttonSize( aButton->Size().Target().AsSize() ); // TRect from where to start the transformation effect - iCtrlButtonRect.SetRect( buttonPos, buttonSize ); + TRect cbr = iAppUi.LayoutHandler()->GetControlBarRect(); + iCtrlButtonRect.SetRect( buttonPos + cbr.iTl, buttonSize ); iFullScreen = EFalse; LoadIconsL(); - + if ( !iFirstStartCompleted ) { DoFirstStartL(); @@ -561,7 +583,7 @@ PrepareFolderListL(); PopulateFolderListL(); - const TInt paddingValue( + const TInt paddingValue( iAppUi.LayoutHandler()->DropDownMenuListPadding() ); const TAlfMetric paddingMetric( paddingValue ); iParentLayout->SetPadding( paddingMetric ); @@ -576,23 +598,32 @@ iBackgroundBrush->SetFrameRectsL( outerRect, iScreenRect ); } - // Append brush if it's not yet appended. Currently this is our only - // brush so if brush count is more than zero, this brush is already - // appended. If other brush(es) are added later, this implementation - // need to be changed. - if ( iParentLayout->Brushes()->Count() == 0 ) - { - // Keep the ownership of the brush to avoid unneeded object - // deletion / reconstruction - iParentLayout->Brushes()->AppendL( iBackgroundBrush, EAlfDoesNotHaveOwnership ); - } + // Append brush if it's not yet appended. Currently this is our only + // brush so if brush count is more than zero, this brush is already + // appended. If other brush(es) are added later, this implementation + // need to be changed. + if ( iParentLayout->Brushes()->Count() == 0 ) + { + // Keep the ownership of the brush to avoid unneeded object + // deletion / reconstruction + iParentLayout->Brushes()->AppendL( iBackgroundBrush, EAlfDoesNotHaveOwnership ); + } + if( !iShadowBrush ) + { + iShadowBrush = CAlfShadowBorderBrush::NewL( + iEnv, TAlfMetric( KDefaultShadowBorderWidth ) ); + iShadowBrush->SetOpacity( KShadowBorderOpacity ); + iShadowBrush->SetLayer( EAlfBrushLayerBackground ); + iParentLayout->Brushes()->AppendL( iShadowBrush, + EAlfDoesNotHaveOwnership ); + } + SetPopupSoftkeysL(); // SetRect need to be called also here, otherwise the list layout might // be wrong in mirrored layout - //iParentLayout->SetRect( iScreenRect ); iParentLayout->SetRect( iCtrlButtonRect ); - + opacity.SetValueNow( 1 ); //opacity.SetTarget( 1, iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime() ); iParentLayout->SetOpacity( opacity ); @@ -601,6 +632,8 @@ iTreeList->DisableKineticScrolling( ETrue ); iTreeList->ShowListL( ETrue ); iTreeList->SetFocusedL( ETrue ); + iFocusVisible = iAppUi.IsFocusShown(); + iTreeVisualizer->SetFocusVisibility( iFocusVisible ); iPopupListShown = ETrue; } @@ -624,13 +657,13 @@ // --------------------------------------------------------------------------- // void CFSEmailUiFolderListVisualiser::ShowSortListPopupL( - const TFSMailSortField aCurrentSortOrder, + const TFSMailSortCriteria aCurrentSortCriteria, const TFSFolderType aFolderType, MFSEmailUiSortListCallback* aCallback, MFsControlButtonInterface* aButton ) { FUNC_LOG; - iCurrentSortOrder = aCurrentSortOrder; + iCurrentSortCriteria = aCurrentSortCriteria; iCurrentFolderType = aFolderType; DoShowInPopupL( aButton, NULL, aCallback ); } @@ -647,7 +680,7 @@ iFullScreen = ETrue; LoadIconsL(); - + if ( !iFirstStartCompleted ) { DoFirstStartL(); @@ -655,7 +688,7 @@ // Set title pane text iAppUi.SetActiveMailboxNameToStatusPaneL(); - + // Different effect is used when opening folder selection list iAnimateNextActivation = ( aCustomMessageId == KFolderListSelectFolder ); @@ -736,7 +769,7 @@ iTitleCaptionVisible = EFalse; iHeaderTextVisual->SetOpacity( KFSInvisible ); } - + // Set flag for moving or copying iMoveOrCopyInitiated = (aCustomMessageId == KFolderListMoveMessage || aCustomMessageId == KFolderListMoveMessages || @@ -749,16 +782,16 @@ viewData.Copy( aCustomMessage ); iCallback = viewData().iCallback; iCurrentFolderType = viewData().iSourceFolderType; - + iTreeList->HideListL(); - + // Clear padding when shown in full screen const TAlfMetric padding( 0 ); iParentLayout->SetPadding( padding ); iListLayout->SetPadding( padding ); - + PrepareFolderListL(); - + // Remove need to be called for all brushes before Reset, otherwise the // brush resources are not completely freed from server side -> brushes // keep "hanging" there and make future drawing slower. @@ -767,19 +800,19 @@ iParentLayout->Brushes()->Remove( 0 ); } iParentLayout->Brushes()->Reset(); - + TAlfTimedValue layoutOpacity = iHeaderLayout->Opacity(); layoutOpacity.SetTarget( 1, iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime()/2 ); iHeaderLayout->SetOpacity( layoutOpacity ); - + TAlfTimedValue bgImageOpacity = iListBgImageVisual->Opacity(); bgImageOpacity.SetTarget( 1, iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime()/2 ); iListBgImageVisual->SetOpacity( bgImageOpacity ); - + // Reset the variables used in horizontal scrolling iPreviousListRect = iListLayout->DisplayRectTarget(); iPreviousListLevel = KListRootLevel; - + iParentLayout->SetRect( iScreenRect ); iTreeList->ShowListL(); @@ -792,7 +825,7 @@ CFSMailBox* mb = iAppUi.GetActiveMailbox(); // Just in case, shouldn't happen User::LeaveIfNull( mb ); - + TFSMailBoxStatus onlineStatus = mb->GetMailBoxStatus(); // If we are not moving or copying messages, there's no need to connect @@ -825,6 +858,7 @@ // is needed for this operation, so we need to connect first ConnectToMailboxL(); } + FocusVisibilityChange( iAppUi.IsFocusShown() ); } // --------------------------------------------------------------------------- @@ -858,7 +892,7 @@ { return R_FREESTYLE_EMAIL_UI_TOOLBAR_FOLDER_LIST; } - + // --------------------------------------------------------------------------- // Deactivate this view // --------------------------------------------------------------------------- @@ -883,15 +917,27 @@ FUNC_LOG; if ( iFirstStartCompleted ) // Safety { - for ( TInt i=0; i < iModel->Count() ; i++ ) - { - CFSEmailUiFolderListItem* modelItem = iModel->ItemByIndex( i ); - if ( modelItem && ( modelItem->iSortField == iCurrentSortOrder ) ) - { - iTreeVisualizer->SetFocusedItemL( modelItem->iListId, EFalse ); - break; - } - } + for ( TInt i = 0; i < iModel->Count(); i++ ) + { + CFSEmailUiFolderListItem* modelItem = iModel->ItemByIndex( i ); + if ( modelItem && ( modelItem->iSortField == iCurrentSortCriteria.iField ) ) + { + iTreeVisualizer->SetFocusedItemL( modelItem->iListId, EFalse ); + break; + } + } + + // Bold the focused item's text + TInt arraySize = iListItemVisulizers.Count(); + for( TInt i = 0; i < arraySize; i++ ) + { + TFsTreeItemId id = iTreeList->FocusedItem(); + if ( iListItemVisulizers[ i ] == &( iTreeList->ItemVisualizer( id ) ) ) + { + iListItemVisulizers[i]->SetTextBold( ETrue ); + break; + } + } } } @@ -913,7 +959,7 @@ if ( modelItem && ( modelItem->iFolderId == iCurrentFolderId ) ) { itemToFocus = modelItem->iListId; - break; + break; } } iTreeVisualizer->SetFocusedItemL( itemToFocus, EFalse ); @@ -939,7 +985,7 @@ { match = ETrue; iTreeVisualizer->SetFocusedItemL( modelItem->iListId ); - break; + break; } } @@ -963,17 +1009,39 @@ TBool CFSEmailUiFolderListVisualiser::OfferEventL(const TAlfEvent& aEvent) { FUNC_LOG; - TBool result( EFalse ); + TBool result( EFalse ); if ( aEvent.IsKeyEvent() && aEvent.Code() == EEventKey ) { // Swap left and right with mirrored layout - TInt scanCode = aEvent.KeyEvent().iScanCode; + TInt scanCode( aEvent.KeyEvent().iScanCode ); if ( AknLayoutUtils::LayoutMirrored() ) { - if ( scanCode == EStdKeyLeftArrow ) scanCode = EStdKeyRightArrow; - else if ( scanCode == EStdKeyRightArrow ) scanCode = EStdKeyLeftArrow; + if( scanCode == EStdKeyLeftArrow ) + { + scanCode = EStdKeyRightArrow; + } + else if( scanCode == EStdKeyRightArrow ) + { + scanCode = EStdKeyLeftArrow; + } } - + + // Handle possible focus visibility change + if( ( scanCode == EStdKeyRightArrow ) || + ( scanCode == EStdKeyLeftArrow ) || + ( scanCode == EStdKeyUpArrow ) || + ( scanCode == EStdKeyDownArrow ) || + ( scanCode == EStdKeyEnter ) || + ( scanCode == EStdKeyDeviceA ) || + ( scanCode == EStdKeyDevice3 ) ) + { + // If the focus was not active already, ignore the key press + if( !iAppUi.SetFocusVisibility( ETrue ) ) + { + return ETrue; + } + } + switch ( scanCode ) { case EStdKeyDevice3: // CENTER CLICK @@ -997,7 +1065,7 @@ { HandleSelectionL( EFSEmailUiCtrlBarResponseSwitchList ); } - } + } break; case EStdKeyRightArrow: @@ -1017,7 +1085,7 @@ default: // Check keyboard shortcuts. - TInt shortcutCommand = + TInt shortcutCommand = iAppUi.ShortcutBinding().CommandForShortcutKey( aEvent.KeyEvent(), CFSEmailUiShortcutBinding::EContextFolderList ); if ( shortcutCommand != KErrNotFound ) @@ -1027,27 +1095,43 @@ } break; } - } + } return result; } // --------------------------------------------------------------------------- // CFSEmailUiFolderListVisualiser::HandlePointerEventL // --------------------------------------------------------------------------- -// +// TBool CFSEmailUiFolderListVisualiser::HandlePointerEventL(const TAlfEvent& aEvent) { - // Handle pointer events to fadervisual. If the list is shown in popup, then - // the popup will be closed. - if ((aEvent.Visual() == iFaderVisual || aEvent.Visual() == iFaderLayout) && aEvent.PointerEvent().iType == TPointerEvent::EButton1Down && iPopupListShown) + TBool eventHandled( EFalse ); + + if( ( aEvent.Visual() == iFaderVisual || aEvent.Visual() == iFaderLayout ) && + ( aEvent.PointerEvent().iType == TPointerEvent::EButton1Down ) && + ( iPopupListShown ) ) { + iAppUi.SetFocusVisibility( EFalse ); HandleSelectionL( EFSEmailUiCtrlBarResponseCancel ); + eventHandled = ETrue; } else { - return iTreeList->TreeControl()->OfferEventL(aEvent); + // Handle pointer events to fadervisual. If the list is shown in popup, + // then the popup will be closed. + if( ( aEvent.IsPointerEvent() ) && + ( aEvent.PointerEvent().iType == TPointerEvent::EButton1Up ) ) + { + eventHandled = iTreeList->TreeControl()->OfferEventL(aEvent); + // Hide focus visibility always after pointer up event. + iAppUi.SetFocusVisibility( EFalse ); + } + else + { + eventHandled = iTreeList->TreeControl()->OfferEventL(aEvent); + } } - return ETrue; + return eventHandled; } // --------------------------------------------------------------------------- @@ -1065,20 +1149,20 @@ if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) ) { // remove help support in pf5250 - aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue); + aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue); } - + // OFFLINE/ONLINE MENU SELECTION if( iMoveOrCopyInitiated ) { TFSMailBoxStatus onlineStatus = iAppUi.GetActiveMailbox()->GetMailBoxStatus(); - aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, onlineStatus == EFSMailBoxOnline ); - aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, onlineStatus == EFSMailBoxOffline ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, onlineStatus == EFSMailBoxOnline ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, onlineStatus == EFSMailBoxOffline ); } else { - aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue ); - aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, ETrue ); } // select option @@ -1087,16 +1171,16 @@ aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsCollapseAll, AllNodesCollapsed() ); aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsExpandAll, AllNodesExpanded() ); } - + // Add shortcut hints - iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane, + iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane, CFSEmailUiShortcutBinding::EContextFolderList ); } } // --------------------------------------------------------------------------- -// +// // --------------------------------------------------------------------------- // void CFSEmailUiFolderListVisualiser::HandleSelectionL( TFSEmailUiCtrlBarResponse aSelection ) @@ -1107,7 +1191,7 @@ { return; } - + TBool popupHiddenAlready(EFalse); switch( aSelection ) { @@ -1144,7 +1228,7 @@ iAppUi.FolderPopupClosed(); } - + if ( !iFullScreen && iSortListCallback ) { iSortListCallback->SortOrderChangedL( EFSMailDontCare, aSelection ); @@ -1184,7 +1268,7 @@ } // --------------------------------------------------------------------------- -// Override the default transition effect in case full screen mode is launched +// Override the default transition effect in case full screen mode is launched // from popup mode. // --------------------------------------------------------------------------- // @@ -1195,12 +1279,12 @@ { TInt rectTransitionTime = iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime(); TInt opacityTransitionTime = iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime() / 2; - + TAlfTimedValue opacity; opacity.SetValueNow( 0 ); opacity.SetTarget( 1, opacityTransitionTime ); iParentLayout->SetOpacity( opacity ); - + // Do animated enlargening from popup window rect to full screen rect iParentLayout->SetRect( FolderListRectInThisResolution() ); iParentLayout->SetRect( iScreenRect, rectTransitionTime ); @@ -1236,6 +1320,15 @@ { // Key presses case EAknSoftkeySelect: + { + // If focus is not visible, make it visible + // otherwise fall through ( call HandleSelectionL ) + if( !iFocusVisible ) + { + iAppUi.SetFocusVisibility( ETrue ); + break; + } + } case EAknSoftkeyOpen: case EFsEmailUiCmdOpen: case EFsEmailUiCmdSelect: @@ -1243,7 +1336,7 @@ HandleSelectionL( EFSEmailUiCtrlBarResponseSelect ); } break; - + case EAknSoftkeyBack: case EEikBidCancel: { @@ -1282,7 +1375,7 @@ case EFsEmailUiCmdActionsExpandAll: { - TFsTreeItemId prevId = iTreeList->FocusedItem(); + TFsTreeItemId prevId = iTreeList->FocusedItem(); iTreeVisualizer->ExpandAllL(); if ( prevId != KFsTreeRootID && prevId != KFsTreeNoneID ) { @@ -1297,7 +1390,7 @@ activationData.iAccount = iAppUi.GetActiveMailbox()->GetId(); activationData.iSubviewId = 1; activationData.iLaunchFolderSettings = ETrue; - + TUid pluginUid = iAppUi.GetActiveMailbox()->GetSettingsUid(); // register plugin view if not exists so that activation can be made if ( !iAppUi.View( pluginUid ) ) @@ -1305,12 +1398,12 @@ CESMailSettingsPlugin* plugin = CESMailSettingsPlugin::NewL( pluginUid ); CleanupStack::PushL( plugin ); iAppUi.AddViewL( plugin ); - CleanupStack::Pop( plugin ); + CleanupStack::Pop( plugin ); } TUid messageId = TUid::Uid( CESMailSettingsPlugin::EActivateMailSettingsSubview ); const TPckgBuf<CESMailSettingsPlugin::TSubViewActivationData> pluginMessagePkg( activationData ); iAppUi.EnterPluginSettingsViewL( pluginUid, messageId, pluginMessagePkg ); - + // Hide list to avoid it flashing when returning back iTreeList->HideListL(); } @@ -1324,7 +1417,7 @@ case EFsEmailUiCmdExit: { - iAppUi.Exit(); + iAppUi.Exit(); } break; @@ -1333,20 +1426,20 @@ GoToTopL(); } break; - + case EFsEmailUiCmdGoToBottom: { GoToBottomL(); } break; - + case EFsEmailUiCmdPageUp: { TKeyEvent simEvent = { EKeyPageUp, EStdKeyPageUp, 0, 0 }; iCoeEnv->SimulateKeyEventL( simEvent, EEventKey ); } break; - + case EFsEmailUiCmdPageDown: { TKeyEvent simEvent = { EKeyPageDown, EStdKeyPageDown, 0, 0 }; @@ -1361,15 +1454,15 @@ HandleCommandL( EFsEmailUiCmdActionsCollapseAll ); } else - { + { HandleCommandL( EFsEmailUiCmdActionsExpandAll ); } } break; - + default: break; - } + } } } @@ -1386,18 +1479,18 @@ { return ETrue; } - + if( focusedItem == iMoreFoldersItemId ) { //HidePopupL(); iFullScreen = ETrue; - TFolderListActivationData tmp; + TFolderListActivationData tmp; tmp.iCallback = iCallback; const TPckgBuf<TFolderListActivationData> pkgOut( tmp ); iAppUi.EnterFsEmailViewL( FolderListId, KFolderListSelectFolder, pkgOut ); - + return EFalse; } @@ -1406,20 +1499,20 @@ { return EFalse; } - + if( iCallback ) { const TFSMailMsgId& selectedFolderId = modelItem->iFolderId; const TFSMailMsgId& selectedMailboxId = modelItem->iMailboxId; if( !selectedFolderId.IsNullId() ) { - if ( iCustomMessageId == KFolderListMoveMessage || + if ( iCustomMessageId == KFolderListMoveMessage || iCustomMessageId == KFolderListMoveMessages || iCustomMessageId == KFolderListCopyMessage || iCustomMessageId == KFolderListCopyMessages ) { iLatestSelectedMoveFolderId = selectedFolderId; - } + } iCallback->FolderSelectedL( selectedFolderId, EFSEmailUiCtrlBarResponseSelect ); } else if( !selectedMailboxId.IsNullId() ) @@ -1437,7 +1530,7 @@ // same callback is not reused unintentionally. iSortListCallback = NULL; } - + return ETrue; } @@ -1446,12 +1539,12 @@ // Append node to list by getting the item data from resource // --------------------------------------------------------------------------- // -void CFSEmailUiFolderListVisualiser::SetHeaderTextByResourceIdL( +void CFSEmailUiFolderListVisualiser::SetHeaderTextByResourceIdL( TInt aResourceId ) { FUNC_LOG; if ( iFirstStartCompleted ) // Safety - { + { HBufC* headingText = StringLoader::LoadLC( aResourceId ); SetHeaderTextAttributesL(); iHeaderTextVisual->SetTextL( *headingText ); @@ -1469,12 +1562,12 @@ void CFSEmailUiFolderListVisualiser::SetHeaderTextAttributesL() { iHeaderTextVisual->SetOpacity( KFSVisible ); - CAlfTextStyle* textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( + CAlfTextStyle* textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeNormalBold ); iHeaderTextVisual->SetTextStyle ( textStyle->Id() ); iHeaderTextVisual->SetColor( iAppUi.LayoutHandler()-> ListNormalStateTextSkinColor() ); - iHeaderTextVisual->SetPadding( + iHeaderTextVisual->SetPadding( iAppUi.LayoutHandler()->TitleCaptionPadding() ); if( iHeaderTextVisual->Brushes() ) @@ -1496,11 +1589,8 @@ // void CFSEmailUiFolderListVisualiser::ConnectToMailboxL() { - CFSMailBox* mb = iAppUi.GetActiveMailbox(); - TDesC* mbName = &mb->GetName(); - + CFSMailBox* mb = iAppUi.GetActiveMailbox(); iWaitingToGoOnline = ETrue; - mb->GoOnlineL(); } @@ -1512,7 +1602,6 @@ void CFSEmailUiFolderListVisualiser::DisconnectFromMailboxL() { iAppUi.GetActiveMailbox()->GoOfflineL(); - iWaitingToGoOnline = EFalse; } @@ -1533,22 +1622,22 @@ { // Append lines to the model AppendActiveMailboxFoldersL(); - + // Update toolbar button statuses. UpdateToolbarButtons(); } else - { + { //Mailboxes needed to be at the top followed by seperator - AppendMailboxesL(); - + AppendMailboxesL(); + // Append lines to the model followed by seperator AppendActiveMailboxFoldersL(); AppendSeparatorLineL(); - - // Append the folder list view selector - AppendMoreFoldersL(); - } + + // Append the folder list view selector + AppendMoreFoldersL(); + } } } @@ -1567,7 +1656,7 @@ iModel->RemoveAll(); iMoreFoldersItemId = KFsTreeNoneID; // Append lines to the model - AppendSortListItemsL(); + AppendSortListItemsL(); } } @@ -1584,7 +1673,7 @@ if( iActiveMailbox ) { AppendSubfoldersL( TFSMailMsgId(), KFsTreeRootID, ETrue ); - } + } } } @@ -1608,7 +1697,7 @@ { TDesC& nameOfFirst = aFirst.GetFolderName(); TDesC& nameOfSecond = aSecond.GetFolderName(); - + return nameOfFirst.CompareC( nameOfSecond ); } } @@ -1646,50 +1735,99 @@ void CFSEmailUiFolderListVisualiser::AppendSortListItemsL() { FUNC_LOG; - TFsTreeItemId itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_DATE, KFsTreeRootID, NULL, EFalse ); + + // Select correct icon depending on the selected sort criteria + CAlfTexture* icon( NULL ); + icon = iCurrentSortCriteria.iField == EFSMailSortByDate ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListDateDescIcon ] : + iSortIconArray[ ESortListDateAscIcon ] : + iSortIconArray[ ESortListDateDescIcon ]; + + TFsTreeItemId itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_DATE, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByDate ); - + switch( iCurrentFolderType ) { case EFSSentFolder: case EFSDraftsFolder: case EFSOutbox: { - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_RECIPIENT, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortByRecipient ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListSenderDescIcon ] : + iSortIconArray[ ESortListSenderAscIcon ] : + iSortIconArray[ ESortListSenderDescIcon ]; + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_RECIPIENT, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByRecipient ); } break; - + default: { - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_SENDER, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortBySender ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListSenderDescIcon ] : + iSortIconArray[ ESortListSenderAscIcon ] : + iSortIconArray[ ESortListSenderDescIcon ]; + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_SENDER, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortBySender ); } break; } - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_SUBJECT, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortBySubject ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListSubjectDescIcon ] : + iSortIconArray[ ESortListSubjectAscIcon ] : + iSortIconArray[ ESortListSubjectDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_SUBJECT, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortBySubject ); if ( TFsEmailUiUtility::IsFollowUpSupported( *iAppUi.GetActiveMailbox() ) ) { - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_FLAG, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortByFlagStatus ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListFollowDescIcon ] : + iSortIconArray[ ESortListFollowAscIcon ] : + iSortIconArray[ ESortListFollowDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_FLAG, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByFlagStatus ); } - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_PRIORITY, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortByPriority ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListPriorityDescIcon ] : + iSortIconArray[ ESortListPriorityAscIcon ] : + iSortIconArray[ ESortListPriorityDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_PRIORITY, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByPriority ); if ( iCurrentFolderType != EFSSentFolder && iCurrentFolderType != EFSDraftsFolder && iCurrentFolderType != EFSOutbox ) { - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_UNREAD, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortByUnread ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListUnreadDescIcon ] : + iSortIconArray[ ESortListUnreadAscIcon ] : + iSortIconArray[ ESortListUnreadDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_UNREAD, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByUnread ); } // Allow scroll bar refresh only for the last item - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_ATTACHMENT, KFsTreeRootID, NULL, ETrue ); + icon = iCurrentSortCriteria.iField == EFSMailSortByAttachment ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListAttachmentDescIcon ] : + iSortIconArray[ ESortListAttachmentAscIcon ] : + iSortIconArray[ ESortListAttachmentDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_ATTACHMENT, KFsTreeRootID, icon, ETrue ); iModel->AppendL( itemId, EFSMailSortByAttachment ); } @@ -1705,7 +1843,7 @@ CleanupResetAndDestroyClosePushL( folders ); iActiveMailbox->ListFolders( aFolder, folders ); - + TLinearOrder<CFSMailFolder> order( CFSEmailUiFolderListVisualiser::CompareFolders ); folders.Sort( order ); @@ -1723,7 +1861,7 @@ folders.Remove(i); } } - + TBool allowItemRefresh = EFalse; while( folders.Count() > 0 ) { @@ -1796,12 +1934,12 @@ } else { - aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_INBOX; + aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_INBOX; // Get branded mailbox icon aIcon = &iAppUi.FsTextureManager()->TextureByMailboxIdL( iActiveMailbox->GetId().PluginId(), iActiveMailbox->GetId().Id(), - iListIconSize); - } + iListIconSize); + } found = ETrue; } else if( aFolderType == EFSOutbox ) @@ -1814,7 +1952,7 @@ else { aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_OUTBOX; - } + } found = ETrue; } else if( aFolderType == EFSDraftsFolder ) @@ -1827,7 +1965,7 @@ else { aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_DRAFTS; - } + } found = ETrue; } else if( aFolderType == EFSSentFolder ) @@ -1853,7 +1991,7 @@ else { aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_DELETED; - } + } found = ETrue; } return found; @@ -1867,7 +2005,7 @@ CFSMailFolder* aFolder ) const { FUNC_LOG; - if( iCustomMessageId == KFolderListMoveMessage || + if( iCustomMessageId == KFolderListMoveMessage || iCustomMessageId == KFolderListMoveMessages ) { // When moving or copying message(s), hide Outbox from list @@ -1926,7 +2064,7 @@ if( iFullScreen ) { // For other folders get the name from the folder object - + nodeId = AppendNodeToListL( &aFolder->GetFolderName(), aParentNode, @@ -1983,25 +2121,25 @@ CleanupResetAndDestroyClosePushL( mailboxes ); TFSMailMsgId id; iAppUi.GetMailClient()->ListMailBoxes( id, mailboxes ); - + TInt count = mailboxes.Count(); while( mailboxes.Count() > 0 ) - { + { if( !( mailboxes[0]->GetId() == iAppUi.GetActiveMailboxId() ) ) { MFSMailBrandManager& brandManager = iAppUi.GetMailClient()->GetBrandManagerL(); - + CAlfTexture* mailBoxTexture; CGulIcon* mailboxIcon( NULL ); - TRAPD( err, mailboxIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailboxes[0]->GetId() ) ); + TRAPD( err, mailboxIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailboxes[0]->GetId() ) ); if ( err == KErrNone && mailboxIcon ) { CleanupStack::PushL( mailboxIcon ); AknIconUtils::SetSize(mailboxIcon->Bitmap(), iListIconSize); - AknIconUtils::SetSize(mailboxIcon->Mask(), iListIconSize); - - // Create texture into TextureManager, If not already existing + AknIconUtils::SetSize(mailboxIcon->Mask(), iListIconSize); + + // Create texture into TextureManager, If not already existing iAppUi.FsTextureManager()->CreateBrandedMailboxTexture( mailboxIcon, mailboxes[0]->GetId().PluginId(), mailboxes[0]->GetId().Id(), @@ -2009,8 +2147,8 @@ // Get branded mailbox icon mailBoxTexture = &iAppUi.FsTextureManager()->TextureByMailboxIdL( mailboxes[0]->GetId().PluginId(), mailboxes[0]->GetId().Id(), - iListIconSize); - + iListIconSize); + CleanupStack::PopAndDestroy( mailboxIcon ); } else @@ -2037,9 +2175,9 @@ // to model anymore, so we need to delete it here in all cases iModel->AppendL( itemId, mailboxes[0] ); } - + } - + delete mailboxes[0]; mailboxes.Remove(0); } @@ -2047,8 +2185,8 @@ if( count > 1 ) { AppendSeparatorLineL(); - } - + } + CleanupStack::PopAndDestroy( &mailboxes ); } @@ -2064,14 +2202,14 @@ CFsSeparatorVisualizer* visualizer( NULL ); visualizer = CFsSeparatorVisualizer::NewL(*iTreeList->TreeControl()); - + // We use the default size of the separator, but we need to save it // here to have it available later when calculating the list height iListSeparatorHeight = visualizer->Size().iHeight; - + // This should never be the last item in the list, so disable the refresh iTreeList->InsertItemL( *data, *visualizer, KFsTreeRootID, KErrNotFound, EFalse); - + iModel->IncreaseSeparatorCount(); } @@ -2114,7 +2252,7 @@ FUNC_LOG; CFsTreePlainOneLineNodeData* plainItemData; CFsTreePlainOneLineNodeVisualizer* plainNodeVisualizer; - + HBufC* itemDispName = HBufC::NewLC(aItemData->Length() + KFmtUnRdCntMaxLength); itemDispName->Des().Copy(*aItemData); if( aUnreadCnt > 0 ) @@ -2122,7 +2260,7 @@ itemDispName->Des().AppendFormat(KFormatUnreadCnt, aUnreadCnt); } CreatePlainNodeLC2( itemDispName, plainItemData, plainNodeVisualizer, aIcon ); - + // We assume that node can never be the last item to be drawn, there will // always be leaf folder under it. So we can always deny scroll bar update. TFsTreeItemId nodeId = iTreeList->InsertNodeL( *plainItemData, *plainNodeVisualizer, aParentNode, KErrNotFound, EFalse); @@ -2141,7 +2279,7 @@ // Append leaf to list by getting the item data from resource // --------------------------------------------------------------------------- // -TFsTreeItemId CFSEmailUiFolderListVisualiser::AppendItemToListFromResourceL( TInt aResourceId, +TFsTreeItemId CFSEmailUiFolderListVisualiser::AppendItemToListFromResourceL( TInt aResourceId, TFsTreeItemId aParentNode, CAlfTexture* aIcon, TBool aAllowRefresh, @@ -2149,7 +2287,7 @@ { FUNC_LOG; HBufC* headingText = StringLoader::LoadLC( aResourceId ); - + TFsTreeItemId itemId = AppendItemToListL( headingText, aParentNode, aIcon, aAllowRefresh, aUnreadCnt); CleanupStack::PopAndDestroy( headingText ); @@ -2161,7 +2299,7 @@ // Append leaf to list // --------------------------------------------------------------------------- // -TFsTreeItemId CFSEmailUiFolderListVisualiser::AppendItemToListL( TDesC* aItemData, +TFsTreeItemId CFSEmailUiFolderListVisualiser::AppendItemToListL( TDesC* aItemData, TFsTreeItemId aParentNode, CAlfTexture* aIcon, TBool aAllowRefresh, @@ -2170,7 +2308,7 @@ FUNC_LOG; CFsTreePlainOneLineItemData* plainItemData; CFsTreePlainOneLineItemVisualizer* plainItemVisualizer; - + HBufC* itemDispName = HBufC::NewLC(aItemData->Length() + KFmtUnRdCntMaxLength); itemDispName->Des().Copy(*aItemData); if( aUnreadCnt > 0 ) @@ -2178,8 +2316,8 @@ itemDispName->Des().AppendFormat(KFormatUnreadCnt, aUnreadCnt); } CreatePlainItemLC2( itemDispName, plainItemData, plainItemVisualizer, aIcon ); - - + + TFsTreeItemId itemId = iTreeList->InsertItemL( *plainItemData, *plainItemVisualizer, aParentNode, KErrNotFound, aAllowRefresh); CleanupStack::Pop( 2 ); // plainItemData & plainItemVisualizer CleanupStack::PopAndDestroy( itemDispName ); @@ -2187,7 +2325,7 @@ { iListItemVisulizers.Append( plainItemVisualizer ); } - + return itemId; } @@ -2203,7 +2341,7 @@ FUNC_LOG; aItemData = CFsTreePlainOneLineItemData::NewL(); CleanupStack::PushL( aItemData ); - + aItemData->SetDataL( *aItemDataBuff ); if( aIcon ) { @@ -2220,8 +2358,9 @@ } else { - aItemVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EPopupLayout ); + aItemVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EPopupLayout ); } + SetItemVisualizerPropertiesL( aItemVisualizer ); } @@ -2237,17 +2376,17 @@ FUNC_LOG; aItemData = CFsTreePlainOneLineNodeData::NewL(); CleanupStack::PushL( aItemData ); - + aItemData->SetDataL( *aItemDataBuff ); if( aIcon ) { aItemData->SetIconExpanded( *aIcon ); aItemData->SetIconCollapsed( *aIcon ); } - + aNodeVisualizer = CFsTreePlainOneLineNodeVisualizer::NewL( *iTreeList->TreeControl() ); CleanupStack::PushL( aNodeVisualizer ); - + // Set folder view specific layouts to be used if ( iFullScreen ) { @@ -2255,11 +2394,11 @@ } else { - aNodeVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EPopupLayout ); + aNodeVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EPopupLayout ); } SetItemVisualizerPropertiesL( aNodeVisualizer ); } - + void CFSEmailUiFolderListVisualiser::SetItemVisualizerPropertiesL( MFsTreeItemVisualizer* aItemVisualizer ) { FUNC_LOG; @@ -2276,7 +2415,7 @@ aItemVisualizer->SetExtendable( EFalse ); - // Set correct skin text colors for the list items + // Set correct skin text colors for the list items TRgb focusedColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor(); // If list is in full screen, it has general list background, so we use // general list text color. If it's not in full screen, we use dropdown @@ -2290,10 +2429,10 @@ { normalColor = iAppUi.LayoutHandler()->DropdownMenuTextColor(); } - + aItemVisualizer->SetFocusedStateTextColor( focusedColor ); aItemVisualizer->SetNormalStateTextColor( normalColor ); - + // Set font size aItemVisualizer->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips( !iFullScreen ) ); // Set node bolded @@ -2323,7 +2462,7 @@ TRect popupRect( iScreenRect ); // translate to screen coorinates popupRect.Move( iEnv.PrimaryDisplay().VisibleArea().iTl ); - // check if the event happened outside of the popup + // check if the event happened outside of the popup if ( !popupRect.Contains( position ) ) { HandleSelectionL( EFSEmailUiCtrlBarResponseCancel ); @@ -2339,7 +2478,7 @@ } eventHandled = ETrue; } - } + } return eventHandled; } @@ -2457,19 +2596,22 @@ } else { + TRect cbr = iAppUi.LayoutHandler()->GetControlBarRect(); if( iCallback ) { iCtrlButtonRect = iCallback->FolderButtonRect(); + iCtrlButtonRect.Move( cbr.iTl ); iScreenRect = FolderListRectInThisResolution(); } else if ( iSortListCallback ) { iCtrlButtonRect = iSortListCallback->SortButtonRect(); - iScreenRect = SortListRectInThisResolution(); + iCtrlButtonRect.Move( cbr.iTl ); + iScreenRect = SortListRectInThisResolution(); } else { - // Do nothing. This happens if HandleDynamicVariantSwitch() is called while the popup list is not visible. + // Do nothing. This happens if HandleDynamicVariantSwitch() is called while the popup list is not visible. } } iListIconSize = iAppUi.LayoutHandler()->FolderListIconSize( !iFullScreen ); @@ -2511,8 +2653,8 @@ FUNC_LOG; iIconArray.Reset(); if ( iFullScreen ) - { - // NOTE: Must be appended same order as are in TFsEmailUiFolderListIcons! + { + // NOTE: Must be appended same order as are in TFsEmailUiFolderListIcons! iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListInboxTexture ) ); // EFolderListIconInbox iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListInboxSubfoldersTexture ) ); // EFolderListIconInboxSubfolders iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListOutboxTexture ) ); // EFolderListIconOutbox @@ -2525,7 +2667,7 @@ } else { - // NOTE: Must be appended same order as are in TFsEmailUiFolderListIcons! + // NOTE: Must be appended same order as are in TFsEmailUiFolderListIcons! iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListInboxTexturePopup ) ); // EFolderListIconInbox iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListInboxSubfoldersTexturePopup ) ); // EFolderListIconInboxSubfolders iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListOutboxTexturePopup ) ); // EFolderListIconOutbox @@ -2534,7 +2676,23 @@ iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListDeletedItemsTexturePopup ) ); // EFolderListIconDeleted iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListServerFoldersTexturePopup ) ); // EFolderListIconServerFolders iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListMoreFoldersTexturePopup ) ); // EFolderListIconMoreFolders - iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListEmailAccountTexturePopup ) ); // EFolderListIconEmailAccount + iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListEmailAccountTexturePopup ) ); // EFolderListIconEmailAccount + + // NOTE: Must be appended same order as are in TFsEmailUiSortListIcons! + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListAttachmentAscTexture ) ); // ESortListAttachmentAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListAttachmentDescTexture ) ); // ESortListAttachmentDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListDateAscTexture ) ); // ESortListDateAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListDateDescTexture ) ); // ESortListDateDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListFollowAscTexture ) ); // ESortListFollowAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListFollowDescTexture ) ); // ESortListFollowDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListPriorityAscTexture ) ); // ESortListPriorityAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListPriorityDescTexture ) ); // ESortListPriorityDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListSenderAscTexture ) ); // ESortListSenderAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListSenderDescTexture ) ); // ESortListSenderDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListSubjectAscTexture ) ); // ESortListSubjectAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListSubjectDescTexture ) ); // ESortListSubjectDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListUnreadAscTexture ) ); // ESortListUnreadAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListUnreadDescTexture ) ); // ESortListUnreadDescIcon } } @@ -2561,6 +2719,13 @@ // array, instead those are owned by texture manager. So // those should be resized by other means. But currently // there is no way to do it (see above comment). + + // Then resize sort list icons + TInt arraySizeSort = iSortIconArray.Count(); + for( TInt i = 0; i < arraySizeSort; i++ ) + { + iSortIconArray[i]->Size().SetSize( iListIconSize.iWidth, iListIconSize.iHeight ); + } } } @@ -2586,15 +2751,15 @@ { FUNC_LOG; const TInt popupHeight( iScreenRect.Height() ); - const TInt separatorHeight( iListSeparatorHeight * + const TInt separatorHeight( iListSeparatorHeight * iModel->SeparatorCount() ); - const TInt itemCount( iTreeList->Count() - iModel->SeparatorCount() ); - TInt visibleItemCount( ( popupHeight - separatorHeight ) / - iListItemHeight ); - visibleItemCount = Min( visibleItemCount, itemCount ); - iScreenRect.SetHeight( visibleItemCount * iListItemHeight + - separatorHeight + - iAppUi.LayoutHandler()->DropDownMenuListPadding() * 2 + + const TInt itemCount( iTreeList->Count() - iModel->SeparatorCount() ); + TInt visibleItemCount( ( popupHeight - separatorHeight ) / + iListItemHeight ); + visibleItemCount = Min( visibleItemCount, itemCount ); + iScreenRect.SetHeight( visibleItemCount * iListItemHeight + + separatorHeight + + iAppUi.LayoutHandler()->DropDownMenuListPadding() * 2 + iAppUi.LayoutHandler()->ControlBarListPadding().iY ); AdjustWidthByContent( iScreenRect ); } @@ -2605,17 +2770,19 @@ // void CFSEmailUiFolderListVisualiser::AdjustWidthByContent( TRect& aRect ) const { + const TRect oldButtonRect( iScreenRect ); const TInt buttonWidth( iCtrlButtonRect.Width() ); const TInt currentWidth( aRect.Width() ); // only do adjusting if the buttonWidth is smaller than current popup width if ( buttonWidth < currentWidth ) { + TBool landscape( Layout_Meta_Data::IsLandscapeOrientation() ); TAknLayoutRect scrollPane; scrollPane.LayoutRect( aRect, AknLayoutScalable_Apps::sp_fs_scroll_pane_cp01( 6 ) ); const TInt scrollPaneWidth( scrollPane.Rect().Width() ); - + TAknLayoutText textLayout; textLayout.LayoutText( aRect, AknLayoutScalable_Apps::list_single_dyc_row_text_pane_t1( 0 ) ); @@ -2674,6 +2841,12 @@ aRect.Move( -aRect.iTl.iX + iCtrlButtonRect.iTl.iX, 0 ); } } + + // Keep the right edge position unchanged + if( landscape ) + { + aRect.Move( oldButtonRect.iBr.iX - aRect.iBr.iX, 0 ); + } } } } @@ -2698,10 +2871,10 @@ { iListHeaderHeight = 0; } - + TSize mainPaneSize; AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EMainPane, mainPaneSize); - + // Set anchor for background visual iParentLayout->SetAnchor(EAlfAnchorTopLeft, 0, @@ -2717,7 +2890,7 @@ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, TAlfTimedPoint(mainPaneSize.iWidth,mainPaneSize.iHeight)); - + // Set anchor for header text visual iParentLayout->SetAnchor(EAlfAnchorTopLeft, 1, @@ -2764,7 +2937,7 @@ if ( topLevelCount ) { TFsTreeItemId topId = iTreeList->Child(KFsTreeRootID, 0); - iTreeVisualizer->SetFocusedItemL( topId ); + iTreeVisualizer->SetFocusedItemL( topId ); } } @@ -2778,17 +2951,17 @@ // There may be arbitrary number of nested sub folders. Make sure we focus // the bottommost visible subfolder. TFsTreeItemId bottomId = KFsTreeRootID; - - while ( iTreeList->IsNode(bottomId) && + + while ( iTreeList->IsNode(bottomId) && iTreeList->IsExpanded(bottomId) && iTreeList->CountChildren(bottomId) ) { bottomId = iTreeList->Child( bottomId, iTreeList->CountChildren(bottomId)-1 ); } - + if ( bottomId != KFsTreeRootID ) { - iTreeVisualizer->SetFocusedItemL( bottomId ); + iTreeVisualizer->SetFocusedItemL( bottomId ); } } @@ -2813,7 +2986,7 @@ FUNC_LOG; TFsTreeItemId itemId = KFsTreeNoneID; TInt count = iTreeList->CountChildren(KFsTreeRootID); - + // If top level is collapsed, then everything is collapsed. There's no need // to crawl any deeper in the tree hierarchy. for ( TInt i=0 ; i<count ; ++i ) @@ -2825,7 +2998,7 @@ return EFalse; } } - + return ETrue; } @@ -2838,10 +3011,10 @@ FUNC_LOG; // We must crawl through the whole tree to see, if there are any collapsed nodes // at any level. We do this with recursive depth-first-search. - + TFsTreeItemId itemId = KFsTreeNoneID; TInt count = iTreeList->CountChildren(aParentNodeId); - + for ( TInt i=0 ; i<count ; ++i ) { itemId = iTreeList->Child( aParentNodeId, i ); @@ -2854,7 +3027,7 @@ } } } - + return ETrue; } @@ -2875,27 +3048,27 @@ { // Get the list level TUint level = iTreeList->Level( focusedId ); - + // Little optimisation, handle all levels up to KListLastBasicLevel // as root level because horizontal scroll amount is same for all if( level <= KListLastBasicLevel ) { level = KListRootLevel; } - + // Recalculate the list rect only if level has changed or if // recalculation is forced by parameter (e.g. in case of // dynamic variant switch) if( ( level != iPreviousListLevel ) || aForceRecalculation ) { TRect listRect = iListLayout->DisplayRectTarget(); - + // Calulate list rect by taking x-coordinates from iScreenRect // and y-coordinates from list layouts target rect (to take // into account the list header) listRect.SetRect( iScreenRect.iTl.iX, listRect.iTl.iY, iScreenRect.iBr.iX, listRect.iBr.iY ); - + if( level > KListLastBasicLevel ) { // Calculate rect according to current level @@ -2903,7 +3076,7 @@ listRect.SetWidth( iScreenRect.Width() + rectChange ); listRect.Move( -rectChange, 0 ); } - + // Set the list rect only if it has changed from previous // (because list refresh causes a little twitch) if( listRect != iPreviousListRect ) @@ -2912,7 +3085,7 @@ iTreeVisualizer->RefreshListViewL(); iPreviousListRect = listRect; } - + iPreviousListLevel = level; } } @@ -2977,6 +3150,16 @@ Toolbar()->SetItemDimmed( EFsEmailUiTbCmdExpandAll, ETrue, ETrue ); break; } + case EFsFocusVisibilityChange: + { + iAppUi.SetFocusVisibility( EFalse ); + break; + } + default: + { + // No need to handle other events. + break; + } } } @@ -2989,24 +3172,26 @@ TFSMailMsgId aMailboxId, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ ) { FUNC_LOG; - + // Handle the event - if ( iMoveOrCopyInitiated && - iFirstStartCompleted && + if ( iMoveOrCopyInitiated && + iFirstStartCompleted && aMailboxId == iAppUi.GetActiveMailboxId() && - iAppUi.CurrentActiveView() == this ) + iAppUi.CurrentActiveView() == this ) { - if ( aEvent == TFSEventMailboxOnline ) + if ( aEvent == TFSEventMailboxOnline ) { if( iWaitingToGoOnline ) { PrepareFolderListL(); PopulateFolderListL(); - + if ( iModel->Count() ) { - SetFocusToLatestMovedFolderL(); + SetFocusToLatestMovedFolderL(); } + iTreeList->SetFocusedL( ETrue ); + iWaitingToGoOnline = EFalse; } } else if ( aEvent == TFSEventMailboxOffline ) @@ -3022,6 +3207,17 @@ } // --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiFolderListVisualiser::FocusVisibilityChange( TBool aVisible ) + { + FUNC_LOG; + CFsEmailUiViewBase::FocusVisibilityChange( aVisible ); + iTreeVisualizer->SetFocusVisibility( aVisible ); + } + +// --------------------------------------------------------------------------- // CbaButtonPressed // Check if aPosition is on CBA touch area // --------------------------------------------------------------------------- @@ -3029,7 +3225,7 @@ TBool CFSEmailUiFolderListVisualiser::CbaButtonPressed( TPoint aPosition ) { TBool cbaPressed( EFalse ); - + TRect leftCbaRect = TRect(); TRect rightCbaRect = TRect(); GetCbaRects( leftCbaRect, rightCbaRect ); @@ -3049,7 +3245,7 @@ // void CFSEmailUiFolderListVisualiser::GetCbaRects( TRect& aLeftCbaRect, TRect& aRightCbaRect ) { - TBool rightPaneActive( IsAreaSideRightPaneActive() ); + TBool rightPaneActive( IsAreaSideRightPaneActive() ); TBool bskLandscape( Layout_Meta_Data::IsLandscapeOrientation() && !rightPaneActive ); TRect screen; @@ -3058,9 +3254,9 @@ { TAknWindowComponentLayout rightAreaLayout( AknLayoutScalable_Avkon::area_side_right_pane( 0 ) ); - + TAknLayoutRect layoutRect; - // Read right (top in landscape) softkey layout. + // Read right (top in landscape) softkey layout. layoutRect.LayoutRect( screen, TAknWindowComponentLayout::Compose( @@ -3068,7 +3264,7 @@ AknLayoutScalable_Avkon::sctrl_sk_bottom_pane() ).LayoutLine() ); TRect bottomSKRect( layoutRect.Rect() ); - // Read left (bottom in landscape) softkey layout. + // Read left (bottom in landscape) softkey layout. layoutRect.LayoutRect( screen, TAknWindowComponentLayout::Compose( @@ -3084,10 +3280,10 @@ layoutRect.LayoutRect( topSKRect, AknLayoutScalable_Avkon::aid_touch_sctrl_top().LayoutLine() ); - aRightCbaRect = layoutRect.Rect(); + aRightCbaRect = layoutRect.Rect(); } else - { + { TAknWindowComponentLayout applicationWindow( AknLayoutScalable_Avkon::application_window( 0 ) ); TAknLayoutRect cbarect; @@ -3099,7 +3295,7 @@ AknLayoutScalable_Avkon::area_bottom_pane( bskLandscape ? 2 : 1 ), AknLayoutScalable_Avkon::control_pane() ) ).LayoutLine() ); aLeftCbaRect = cbarect.Rect(); - } + } } // --------------------------------------------------------------------------- @@ -3112,8 +3308,8 @@ // Currently the widescreen status pane layout is in use only // when pen input (touch) is enabled. TBool result = EFalse; - - if ( Layout_Meta_Data::IsLandscapeOrientation() && + + if ( Layout_Meta_Data::IsLandscapeOrientation() && Layout_Meta_Data::IsPenEnabled() ) { if ( iAvkonEnv->StatusPaneResIdForCurrentLayout(
--- a/emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -213,13 +213,14 @@ // insert email header into email.html file // CFreestyleMessageHeaderHTML will replace contents of email.html // So, no need to clear the contents - CFreestyleMessageHeaderHTML::ExportL( *iMessage, iFs, headerHtmlFile ); + CFreestyleMessageHeaderHTML::ExportL( *iMessage, iFs, headerHtmlFile, iAppUi.ClientRect().Width() ); // Remove all previously created files from temporary HTML folder EmptyTempHtmlFolderL(); CFSMailMessagePart* htmlBodyPart = iMessage->HtmlBodyPartL(); + TBool bodyPartAvailable( EFalse ); if ( htmlBodyPart ) { CleanupStack::PushL( htmlBodyPart ); @@ -229,6 +230,7 @@ // Copy html body part to email html file CopyFileToHtmlFileL( htmlFile, KBodyHtmlFile, *htmlBodyPart ); + bodyPartAvailable = ETrue; CleanupStack::PopAndDestroy( &htmlFile ); CleanupStack::PopAndDestroy( htmlBodyPart ); @@ -254,6 +256,7 @@ contentBuffer8->Des().Copy(*contentBuffer); CopyFileToHtmlFileL( *contentBuffer8, KBodyHtmlFile, *textBodyPart ); + bodyPartAvailable = ETrue; CleanupStack::PopAndDestroy( contentBuffer8 ); CleanupStack::PopAndDestroy( contentBuffer ); @@ -262,10 +265,13 @@ } // pass the emailHtmlFile to the browser for it to load - TPath emailHtmlFile; - emailHtmlFile.Copy( iHtmlFolderPath ); - emailHtmlFile.Append( KMessageHtmlFile ); - LoadContentFromFileL( emailHtmlFile ); + if ( bodyPartAvailable ) + { + TPath emailHtmlFile; + emailHtmlFile.Copy( iHtmlFolderPath ); + emailHtmlFile.Append( KMessageHtmlFile ); + LoadContentFromFileL( emailHtmlFile ); + } } // --------------------------------------------------------------------------- @@ -996,7 +1002,7 @@ User::LeaveIfError( targetFile.Replace( iFs, aFileName, EFileWrite ) ); - HBufC8* charSet = GetCharacterSetL( aHtmlBodyPart ); + HBufC8* charSet = GetCharacterSetL( aHtmlBodyPart ); CleanupStack::PushL( charSet ); User::LeaveIfError( targetFile.Write( KHtmlHeader1 ) ); @@ -1008,24 +1014,24 @@ // Write the original content for(int i=0;i<aContent.Length();i++) { - if( i==aContent.Length()-1 ) - { - aContent.Mid( i,1 ).CompareC( _L8("\x01" ) )==0 ? - User::LeaveIfError( targetFile.Write( _L8("<br>") ) ): - User::LeaveIfError( targetFile.Write( aContent.Mid(i,1) ) ); - } - else - { - if(aContent.Mid( i,1 ).CompareC( _L8("\x01" ) )==0 || - aContent.Mid( i,2 ).CompareC( _L8("\x0D\x0A" ) )==0 ) - { - User::LeaveIfError( targetFile.Write( _L8("<br>") )); - } - else - { - User::LeaveIfError( targetFile.Write( aContent.Mid(i,1) ) ); - } - } + if( i==aContent.Length()-1 ) + { + aContent.Mid( i,1 ).CompareC( _L8("\x01" ) )==0 ? + User::LeaveIfError( targetFile.Write( _L8("<br>") ) ): + User::LeaveIfError( targetFile.Write( aContent.Mid(i,1) ) ); + } + else + { + if(aContent.Mid( i,1 ).CompareC( _L8("\x01" ) )==0 || + aContent.Mid( i,2 ).CompareC( _L8("\x0D\x0A" ) )==0 ) + { + User::LeaveIfError( targetFile.Write( _L8("<br>") )); + } + else + { + User::LeaveIfError( targetFile.Write( aContent.Mid(i,1) ) ); + } + } } INFO("Add end tags"); User::LeaveIfError( targetFile.Write( KHtmlEndTags ) ); @@ -1102,3 +1108,30 @@ TRAP_IGNORE( iBrCtlInterface->LoadDataL(KHTMLDataScheme, KHTMLEmptyContent, _L8("text/html"), uid) ); } } + +void CFsEmailUiHtmlViewerContainer::HandleResourceChange( TInt aType ) + { + CCoeControl::HandleResourceChange( aType ); + + if ( aType == CFsEmailUiViewBase::EScreenLayoutChanged ) + { + // only update header if we get a layout change from email ui + if ( iMessage ) + { + // update the width in header part and reload + TPath headerHtmlFile; + headerHtmlFile.Copy( iHtmlFolderPath ); + headerHtmlFile.Append( KHeaderHtmlFile ); + + TRAP_IGNORE( CFreestyleMessageHeaderHTML::ExportL( *iMessage, iFs, headerHtmlFile, iAppUi.ClientRect().Width() ) ) + + TPath emailHtmlFile; + emailHtmlFile.Copy( iHtmlFolderPath ); + emailHtmlFile.Append( KMessageHtmlFile ); + + TRAP_IGNORE( LoadContentFromFileL( emailHtmlFile ) ) + + SetRect( iAppUi.ClientRect() ); + } + } + }
--- a/emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -129,6 +129,7 @@ iOpenMessages = new (ELeave) CStack<CFSMailMessage, ETrue>(); iEmbeddedMessages = new (ELeave) CStack<CFSMailMessage, EFalse>(); iNextOrPrevMessageSelected = EFalse; + iForwardingMessage = EFalse; } // ----------------------------------------------------------------------------- @@ -290,6 +291,7 @@ iContainer->ResetContent(); } + iForwardingMessage = ETrue; iAppUi.LaunchEditorL( KEditorCmdForward, params ); } } @@ -647,7 +649,7 @@ else{ iAttachmentsListModel->UpdateListL( iOpenMessages->Head() ); } - + TRAPD( error, LoadContentFromMailMessageL( iOpenMessages->Head() ) ); if ( error == KErrNotFound || error == KErrInUse || error == KErrLocked ) @@ -703,7 +705,7 @@ iAppUi.SetTitlePaneTextL(*emailAddress); CleanupStack::PopAndDestroy(emailAddress); } - CleanupStack::PopAndDestroy( displayName ); + CleanupStack::PopAndDestroy( displayName ); } } @@ -736,6 +738,7 @@ } } iNextOrPrevMessageSelected = EFalse; + iForwardingMessage = EFalse; } // ----------------------------------------------------------------------------- @@ -814,8 +817,14 @@ void CFsEmailUiHtmlViewerView::ChildDoDeactivate() { FUNC_LOG; - CancelFetchings(); - + // Don't cancel fetching the message parts when forwarding the message: + // it would also cancel the fetchings initiated by the forwarding, + // causing the forwarding to abort. + if ( !iForwardingMessage ) + { + CancelFetchings(); + } + if ( iContainer ) { HideContainer(); @@ -1036,13 +1045,13 @@ } -void CFsEmailUiHtmlViewerView::HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType /*aType*/ ) +void CFsEmailUiHtmlViewerView::HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType aType ) { FUNC_LOG; - + if ( iContainer ) { - iContainer->SetRect( ClientRect() ); + iContainer->HandleResourceChange( aType ); } } @@ -1112,22 +1121,45 @@ HideContainer(); iContainer->ResetContent(); } - + RArray<TFSMailMsgId> msgIds; CleanupClosePushL( msgIds ); - msgIds.Append( iMessage->GetMessageId() ); + TFSMailMsgId currentMsgId = iMessage->GetMessageId(); + msgIds.Append( currentMsgId ); TFSMailMsgId mailBox = iMessage->GetMailBoxId(); - TFSMailMsgId folderId = iMessage->GetFolderId(); + TFSMailMsgId folderId = iMessage->GetFolderId(); + + //Get the id and check if there is a previous message available + TFSMailMsgId prevMsgId; + TFSMailMsgId prevMsgFolderId; + + //Get the previous message if it exists + TBool available = iAppUi.IsPreviousMsgAvailable( currentMsgId, + prevMsgId, + prevMsgFolderId ); + + //Delete the message iAppUi.GetMailClient()->DeleteMessagesByUidL( mailBox, folderId, msgIds ); CleanupStack::PopAndDestroy( &msgIds ); // Notify appui of deleted mail item - SendEventToAppUiL( TFSEventMailDeleted ); - + SendEventToAppUiL( TFSEventMailDeleted ); + if ( iAppUi.CurrentActiveView()->Id() == HtmlViewerId ) - { - NavigateBackL(); - } + { + //Open the previous message or navigate back to list viewer + if ( available ) + { + iAppUi.MoveToPreviousMsgAfterDeleteL( prevMsgId ); + } + else + { + ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); + NavigateBackL(); + } + //inform user that mail is deleted + TFsEmailUiUtility::ShowGlobalInfoNoteL( R_FREESTYLE_EMAIL_MAIL_DELETED ); + } } } @@ -1140,11 +1172,10 @@ TFSMailMsgId aMailbox, TAny* aParam1, TAny* /*aParam2*/, TAny* /*aParam3*/ ) { FUNC_LOG; - if ( /*iFirstStartCompleted &&*/ iMessage && aMailbox.Id() == iAppUi.GetActiveMailboxId().Id() && aEvent == TFSEventMailDeleted && aParam1 ) // Safety, in list events that only concern active mailbox are handled { - TFSMailMsgId curMsgId = iMessage->GetMessageId(); + TFSMailMsgId curMsgId = iMessage->GetMessageId(); RArray<TFSMailMsgId>* removedEntries = static_cast<RArray<TFSMailMsgId>*>( aParam1 ); // <cmail> break-keyword should be used only in switch-clauses TBool cont = ETrue; @@ -1152,13 +1183,12 @@ for ( TInt i = 0 ; i < removedEntries->Count() && cont; i++ ) { if ( curMsgId == ( *removedEntries )[i] ) - { - ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); - NavigateBackL(); + { cont = EFalse; - } - } + } + } } + if (iMessage && aMailbox.Id() == iAppUi.GetActiveMailboxId().Id() && aEvent == TFSEventNewMail) { UpdateNaviPaneL(); @@ -1389,7 +1419,26 @@ HBufC* textData = aEmailAddress.AllocLC(); CFSMailBox* mailBox = iAppUi.GetMailClient()->GetMailBoxByUidL( iMessage->GetMailBoxId() ); CleanupStack::PushL( mailBox ); + + //UI options Delete and Actions dimmed in Remote Lookup. + const TInt resourceId(ToolbarResourceId()); + RArray<TInt> dimmedItems; + CleanupClosePushL(dimmedItems); + GetInitiallyDimmedItemsL(resourceId, dimmedItems); // get the currently dimmed buttons + + SetToolbarItemDimmed( EFsEmailUiTbCmdActions, ETrue); + SetToolbarItemDimmed( EFsEmailUiTbCmdDelete, ETrue); + CFsDelayedLoader::InstanceL()->GetContactHandlerL()->LaunchRemoteLookupWithQueryL( *mailBox, *textData ); + + SetToolbarItemDimmed( EFsEmailUiTbCmdActions, EFalse); + SetToolbarItemDimmed( EFsEmailUiTbCmdDelete, EFalse); + + for (TInt i = 0; i < dimmedItems.Count(); i++) // restore the buttons + { + SetToolbarItemDimmed(dimmedItems[i], ETrue); + } + CleanupStack::PopAndDestroy(); // dimmedItems.Close() CleanupStack::PopAndDestroy( mailBox ); CleanupStack::PopAndDestroy( textData ); } @@ -2459,11 +2508,16 @@ case EESMRCmdDownloadAttachment: case EESMRCmdDownloadAllAttachments: { + if(iAttachmentsListModel == NULL) + { + iAttachmentsListModel = CFSEmailUiAttachmentsListModel::NewL( iAppUi, *this ); + iAttachmentsListModel->UpdateListL( iOpenMessages->Head() ); + } // Check that message has attachments to display if ( messagePtr->IsFlagSet( EFSMsgFlag_Attachments ) ) { iOpResult.iResultCode = KErrNone; - //StartDowloadingAttachmentsL(); + DownloadAllAttachmentsL(); CompletePendingMrCommand(); } } @@ -2471,6 +2525,11 @@ case EESMRCmdSaveAttachment: case EESMRCmdSaveAllAttachments: { + if(iAttachmentsListModel == NULL) + { + iAttachmentsListModel = CFSEmailUiAttachmentsListModel::NewL( iAppUi, *this ); + iAttachmentsListModel->UpdateListL( iOpenMessages->Head() ); + } // Check that message has attachments to display if ( messagePtr->IsFlagSet( EFSMsgFlag_Attachments ) ) { @@ -2777,21 +2836,28 @@ TFSMailMsgId currentMsgId = iMessage->GetMessageId(); TFSMailMsgId tmpMsgId; TFSMailMsgId tmpMsgFolderId; + CAknNavigationDecorator::TScrollButton nextButton = CAknNavigationDecorator::ERightButton; + CAknNavigationDecorator::TScrollButton prevButton = CAknNavigationDecorator::ELeftButton; + if (AknLayoutUtils::LayoutMirrored()) + { + nextButton = CAknNavigationDecorator::ELeftButton; + prevButton = CAknNavigationDecorator::ERightButton; + } if ( iAppUi.IsNextMsgAvailable( currentMsgId, tmpMsgId, tmpMsgFolderId ) ) { - naviDecorator->SetScrollButtonDimmed( CAknNavigationDecorator::ERightButton, EFalse ); + naviDecorator->SetScrollButtonDimmed( nextButton, EFalse ); } else { - naviDecorator->SetScrollButtonDimmed( CAknNavigationDecorator::ERightButton, ETrue ); + naviDecorator->SetScrollButtonDimmed( nextButton, ETrue ); } if ( iAppUi.IsPreviousMsgAvailable( currentMsgId, tmpMsgId, tmpMsgFolderId ) ) { - naviDecorator->SetScrollButtonDimmed( CAknNavigationDecorator::ELeftButton, EFalse ); + naviDecorator->SetScrollButtonDimmed( prevButton, EFalse ); } else { - naviDecorator->SetScrollButtonDimmed( CAknNavigationDecorator::ELeftButton, ETrue ); + naviDecorator->SetScrollButtonDimmed( prevButton, ETrue ); } // Set this view's navipane to the top of the navipane control stack @@ -2847,7 +2913,12 @@ { naviDecorator->SetNaviDecoratorObserver( NULL ); } - if( aEventID == MAknNaviDecoratorObserver::EAknNaviDecoratorEventRightTabArrow ) + MAknNaviDecoratorObserver::TAknNaviDecoratorEvents nextButton = MAknNaviDecoratorObserver::EAknNaviDecoratorEventRightTabArrow; + if (AknLayoutUtils::LayoutMirrored()) + { + nextButton = MAknNaviDecoratorObserver::EAknNaviDecoratorEventLeftTabArrow; + } + if( aEventID == nextButton ) { ShowNextMessageL(); }
--- a/emailuis/emailui/src/FreestyleEmailUiLauncherGridVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiLauncherGridVisualiser.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -27,25 +27,21 @@ #include <e32math.h> #include <FreestyleEmailUi.rsg> #include <touchlogicalfeedback.h> -// <cmail> SF path changes #include <alf/alfutil.h> #include <alf/alfenv.h> #include <alf/alfevent.h> #include <alf/alftextvisual.h> -//</cmail> -#include <aknnotewrappers.h> +#include <aknnotewrappers.h> #include <freestyleemailui.mbg> #include <gulicon.h> -//<cmail> +#include <akntoolbar.h> #include "CFSMailMessage.h" #include <alf/alfframebrush.h> #include "CFSMailBox.h" #include "CFSMailClient.h" -//</cmail> #include <hlplch.h> #include <akntitle.h> #include <centralrepository.h> -//<cmail> #include <alf/alfanchorlayout.h> #include <alf/alfbrusharray.h> #include <alf/alfstatic.h> @@ -53,16 +49,13 @@ #include <alf/alfconstants.h> #include "fsalfscrollbarlayout.h" #include <csxhelp/cmail.hlp.hrh> -//</cmail> #include <featmgr.h> -//</cmail> #include <aknmessagequerydialog.h> -// <cmail> Use layout data instead of hard-coded values +#include <aknstyluspopupmenu.h> #include <aknlayoutscalable_avkon.cdl.h> #include <aknlayoutscalable_apps.cdl.h> #include <layoutmetadata.cdl.h> -// </cmail> // INTERNAL INCLUDE FILES #include "FSEmailBuildFlags.h" @@ -88,14 +81,12 @@ const TInt KStartupAnimationTime = 0; const TReal KScaleSelected = 1.0; const TReal KScaleNotSelected = 0.77; -// <cmail> Use layout data instead of hard-coded values -// </cmail> CFSEmailUiLauncherGridVisualiser* CFSEmailUiLauncherGridVisualiser::NewL(CAlfEnv& aEnv, - CFSEmailUiLauncherGrid* aControl, + CFSEmailUiLauncherGrid* aControl, CFreestyleEmailUiAppUi* aAppUi, - CAlfControlGroup& aControlGroup, + CAlfControlGroup& aControlGroup, TInt aColumns, TInt aRows) { FUNC_LOG; @@ -104,10 +95,10 @@ return self; } -CFSEmailUiLauncherGridVisualiser* CFSEmailUiLauncherGridVisualiser::NewLC(CAlfEnv& aEnv, - CFSEmailUiLauncherGrid* aControl, +CFSEmailUiLauncherGridVisualiser* CFSEmailUiLauncherGridVisualiser::NewLC(CAlfEnv& aEnv, + CFSEmailUiLauncherGrid* aControl, CFreestyleEmailUiAppUi* aAppUi, - CAlfControlGroup& aControlGroup, + CAlfControlGroup& aControlGroup, TInt aColumns, TInt aRows) { FUNC_LOG; @@ -117,12 +108,12 @@ return self; } -CFSEmailUiLauncherGridVisualiser::CFSEmailUiLauncherGridVisualiser(CAlfEnv& aEnv, - CFSEmailUiLauncherGrid* aControl, +CFSEmailUiLauncherGridVisualiser::CFSEmailUiLauncherGridVisualiser(CAlfEnv& aEnv, + CFSEmailUiLauncherGrid* aControl, CFreestyleEmailUiAppUi* aAppUi, CAlfControlGroup& aControlGroup) : CFsEmailUiViewBase(aControlGroup, *aAppUi), - iEnv( aEnv ), + iEnv( aEnv ), iVisibleRows( 0 ), iVisibleColumns( 0 ), iRowCount( 0 ), @@ -149,84 +140,100 @@ iConstructionCompleted = EFalse; iDoubleClickLock = EFalse; iUiOperationLaunched = EFalse; - + iMailboxDeleter = CFSEmailUiMailboxDeleter::NewL( *iAppUi.GetMailClient(), *this ); } +// ---------------------------------------------------------------------------- // CFSEmailUiLauncherGridVisualiser::DoFirstStartL() -// Purpose of this function is to do first start only when grid is -// really needed to be shown. Implemented to make app startuo faster. +// Purpose of this function is to do first start only when grid is really +// needed to be shown. Implemented to make app startup faster. +// ---------------------------------------------------------------------------- +// void CFSEmailUiLauncherGridVisualiser::DoFirstStartL() { FUNC_LOG; iPluginIdIconIdPairs.Reset(); -// <cmail> Use layout data instead of hard-coded values TRect mainPaneRect; - AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); - + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + mainPaneRect ); + TAknLayoutRect scrollBarRect; - scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar()); + scrollBarRect.LayoutRect( mainPaneRect, + AknLayoutScalable_Avkon::aid_size_touch_scroll_bar() ); TRect gridRect = mainPaneRect; gridRect.iBr.iX -= scrollBarRect.Rect().Width(); - + TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; - iVisibleRows = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastRow() + 1; - iVisibleColumns = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastColumn() + 1; -// </cmail> - + iVisibleRows = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits( var ).LastRow() + 1; + iVisibleColumns = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits( var ).LastColumn() + 1; + iStartupAnimation = ETrue; iCurrentLevel.iSelected = KDefaultSelection; CAlfTextureManager& manager = iEnv.TextureManager(); - iParentLayout = CAlfDeckLayout::AddNewL(*iControl); - iParentLayout->SetFlags(EAlfVisualFlagLayoutUpdateNotification); + iParentLayout = CAlfDeckLayout::AddNewL( *iControl ); + iParentLayout->SetFlags( EAlfVisualFlagLayoutUpdateNotification ); // Widget layout divides the screen between grid and scroll bar iWidgetLayout = CAlfAnchorLayout::AddNewL( *iControl, iParentLayout ); - //<cmail> - TSize displaySize = mainPaneRect.Size(); //iControl->DisplayArea().Size(); - //</cmail> + TSize displaySize = mainPaneRect.Size(); iWidgetLayout->SetSize( displaySize ); - + // Constructed here, updated later, #0 item in iWidgetLayout ConstructScrollbarL( iWidgetLayout ); - // Grid layout is constructed here, #1 item in iWidgetLayout - iCurrentLevel.iGridLayout = CAlfGridLayout::AddNewL( *iControl, iVisibleColumns, iVisibleRows, iWidgetLayout ); + // Grid layout is constructed here, #1 item in iWidgetLayout + iCurrentLevel.iGridLayout = + CAlfGridLayout::AddNewL( *iControl, iVisibleColumns, iVisibleRows, + iWidgetLayout ); iCurrentLevel.iGridLayout->EnableScrollingL( ETrue ); iCurrentLevel.iGridLayout->SetFlags( EAlfVisualFlagAutomaticLocaleMirroringEnabled ); - + // Selector is added to iGridLayout - iSelector = iControl->AppendLayoutL( EAlfLayoutTypeLayout, iCurrentLevel.iGridLayout ); + iSelector = iControl->AppendLayoutL( EAlfLayoutTypeLayout, + iCurrentLevel.iGridLayout ); iSelector->SetFlags( EAlfVisualFlagManualLayout ); - - iRingMovementXFunc = CAlfTableMappingFunction::NewL(iEnv); - iRingMovementYFunc = CAlfTableMappingFunction::NewL(iEnv); + + iRingMovementXFunc = CAlfTableMappingFunction::NewL( iEnv ); + iRingMovementYFunc = CAlfTableMappingFunction::NewL( iEnv ); TAlfTimedPoint selectorPos = iSelector->Pos(); selectorPos.iX.SetMappingFunctionIdentifier( iRingMovementXFunc->MappingFunctionIdentifier() ); - selectorPos.iY.SetMappingFunctionIdentifier( iRingMovementYFunc->MappingFunctionIdentifier() ); + selectorPos.iY.SetMappingFunctionIdentifier( iRingMovementYFunc->MappingFunctionIdentifier() ); iSelector->SetPos( selectorPos ); - + UpdateFocusVisibility(); iSelectorImageVisual = CAlfImageVisual::AddNewL( *iControl, iSelector ); iSelectorImageVisual->SetScaleMode( CAlfImageVisual::EScaleFit ); -// <cmail> Use layout data instead of hard-coded values + + // Use layout data instead of hard-coded values iSelectorImageVisual->SetSize( iAppUi.LayoutHandler()->SelectorVisualSizeInThisResolution() ); TAknLayoutRect itemRect; - itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var,0,0)); + itemRect.LayoutRect( gridRect, + AknLayoutScalable_Apps::cell_cmail_l_pane( var, 0, 0 ) ); iSelectorImageVisual->SetSize( itemRect.Rect().Size() ); -// </cmail> - iSelectorImageVisual->EnableBrushesL(); CAlfFrameBrush* brush = iAppUi.FsTextureManager()->GridSelectorBrushL(); iSelectorImageVisual->Brushes()->AppendL( brush, EAlfDoesNotHaveOwnership ); iStartupEffectStyle = EFalse; - + iAiwSHandler = CAiwServiceHandler::NewL(); iAiwSHandler->AttachL( R_AIW_INTEREST_LAUNCH_SETUP_WIZARD ); + if( !iStylusPopUpMenu ) + { + // Construct the long tap pop-up menu. + TPoint point( 0, 0 ); + iStylusPopUpMenu = CAknStylusPopUpMenu::NewL( this , point ); + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC( reader, + R_STYLUS_POPUP_MENU_LAUNCHER_GRID_VIEW ); + iStylusPopUpMenu->ConstructFromResourceL( reader ); + CleanupStack::PopAndDestroy(); // reader + } + // Initial visual layout update is done when the view gets activated. iRefreshNeeded = ETrue; @@ -246,7 +253,7 @@ iItemIdInButtonDownEvent.iLaunchSelection = EFalse; UpdateFocusVisibility(); - + if( !IsFocusShown() ) { // No items are focused anymore. Shrink the icon. @@ -296,18 +303,17 @@ delete iRingMovementYFunc; delete iModel; delete iAiwSHandler; - // <cmail> delete iScrollbar; - // </cmail> delete iMailboxDeleter; + delete iStylusPopUpMenu; } void CFSEmailUiLauncherGridVisualiser::CreateModelL() { FUNC_LOG; - + RArray<TBool> itemInModel; - CleanupClosePushL( itemInModel ); + CleanupClosePushL( itemInModel ); iIconArray.Reset(); iPluginTextureId = EGridPluginIconFirst; @@ -316,7 +322,7 @@ delete iModel; iModel = NULL; iModel = new (ELeave) CFSEmailUiLauncherGridModel(); - iModel->ConstructL(); + iModel->ConstructL(); CAlfTexture* iconTexture = 0; // Get item ordering from resources @@ -333,24 +339,24 @@ TInt count = reader.ReadInt16(); -// <cmail> Use layout data instead of hard-coded values +// <cmail> Use layout data instead of hard-coded values TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); - + TAknLayoutRect scrollBarRect; scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar()); TRect gridRect = mainPaneRect; gridRect.iBr.iX -= scrollBarRect.Rect().Width(); - + TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; TAknLayoutRect itemRect; itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var,0,0)); - + TAknLayoutRect gridIconLRect; gridIconLRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var)); TSize iconSize = gridIconLRect.Rect().Size(); // </cmail> - + for ( TInt itemIndex = 0; itemIndex < count; itemIndex++ ) { TInt itemId = reader.ReadInt16(); @@ -358,10 +364,10 @@ { case EDefaultMailboxItem: { - + RPointerArray<CFSMailBox> mailBoxes; CleanupResetAndDestroyClosePushL( mailBoxes ); - TFSMailMsgId id; + TFSMailMsgId id; TInt err = iAppUi.GetMailClient()->ListMailBoxes( id, mailBoxes ); @@ -370,13 +376,13 @@ { // Try to get branded graphic CGulIcon* mbIcon(0); - TRAPD( err, mbIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailBoxes[0]->GetId() ) ); + TRAPD( err, mbIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailBoxes[0]->GetId() ) ); if ( err == KErrNone && mbIcon ) { CleanupStack::PushL( mbIcon ); AknIconUtils::SetSize(mbIcon->Bitmap(), iconSize); - AknIconUtils::SetSize(mbIcon->Mask(), iconSize); - + AknIconUtils::SetSize(mbIcon->Mask(), iconSize); + // Create texture into TextureManager, If not already existing // Note: size(0,0) means original icon size iAppUi.FsTextureManager()->CreateBrandedMailboxTexture( mbIcon, @@ -390,10 +396,10 @@ CleanupStack::PopAndDestroy( mbIcon ); } - else + else { - iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridInboxTexture ); - } + iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridInboxTexture ); + } iIconArray.AppendL( iconTexture ); @@ -405,8 +411,8 @@ mailBoxes[0]->GetName(), *iconTexture, mailBoxes[0]->GetId(), - mailBoxes[0]->GetStandardFolderId( EFSInbox ) ); - + mailBoxes[0]->GetStandardFolderId( EFSInbox ) ); + iAppUi.SubscribeMailboxL( mailBoxes[0]->GetId() ); } @@ -417,22 +423,22 @@ { RPointerArray<CFSMailBox> mailBoxes; CleanupResetAndDestroyClosePushL( mailBoxes ); - TFSMailMsgId id; + TFSMailMsgId id; TInt err = iAppUi.GetMailClient()->ListMailBoxes( id, mailBoxes ); - + for ( TInt i = 1; i < mailBoxes.Count(); i++ ) { // Try to get branded graphic CGulIcon* mbIcon(0); - TRAPD( err, mbIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailBoxes[i]->GetId() ) ); + TRAPD( err, mbIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailBoxes[i]->GetId() ) ); if ( err == KErrNone && mbIcon ) { CleanupStack::PushL( mbIcon ); AknIconUtils::SetSize(mbIcon->Bitmap(), iconSize); - AknIconUtils::SetSize(mbIcon->Mask(), iconSize); - + AknIconUtils::SetSize(mbIcon->Mask(), iconSize); + // Create texture into TextureManager, If not already existing iAppUi.FsTextureManager()->CreateBrandedMailboxTexture( mbIcon, mailBoxes[i]->GetId().PluginId(), @@ -444,11 +450,11 @@ TSize(0,0)); CleanupStack::PopAndDestroy( mbIcon ); } - else + else { - iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridInboxTexture ); + iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridInboxTexture ); } - iIconArray.AppendL( iconTexture ); + iIconArray.AppendL( iconTexture ); // Branded mailbox name is nowadays set in new mailbox event // handling, so we don't need to use brand manager here anymore. iModel->AddL( @@ -458,10 +464,10 @@ *iconTexture, mailBoxes[i]->GetId(), mailBoxes[i]->GetStandardFolderId( EFSInbox ) ); - + iAppUi.SubscribeMailboxL( mailBoxes[i]->GetId() ); } - + CleanupStack::PopAndDestroy( &mailBoxes ); } break; @@ -469,11 +475,11 @@ { RPointerArray<CFSMailBox> mailBoxes; CleanupResetAndDestroyClosePushL( mailBoxes ); - TFSMailMsgId id; + TFSMailMsgId id; TInt err = iAppUi.GetMailClient()->ListMailBoxes( id, mailBoxes ); - + for ( TInt i = 0; i < mailBoxes.Count(); i++ ) { if ( TFsEmailUiUtility::IsRemoteLookupSupported( *mailBoxes[i] ) ) @@ -496,7 +502,7 @@ iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridSettingsTexture ); iModel->AddL(EShortcut, ESettingsItem, *text, *iconTexture ); CleanupStack::PopAndDestroy( text ); - iIconArray.AppendL( iconTexture ); + iIconArray.AppendL( iconTexture ); } break; case EAddNewMailboxItem: @@ -505,19 +511,19 @@ iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridAddNewBoxTexture ); iModel->AddL(EShortcut, EAddNewMailboxItem, *text, *iconTexture ); CleanupStack::PopAndDestroy( text ); - iIconArray.AppendL( iconTexture ); + iIconArray.AppendL( iconTexture ); } break; case EHelpItem: { - // remove help support in pf5250 + // remove help support in pf5250 if (! FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) ) { HBufC* text = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_GRIDITEM_HELP ); iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridHelpTexture ); iModel->AddL(EShortcut, EHelpItem, *text, *iconTexture ); CleanupStack::PopAndDestroy( text ); - iIconArray.AppendL( iconTexture ); + iIconArray.AppendL( iconTexture ); } } break; @@ -533,7 +539,7 @@ if ( iLauncherItems[i]->Id() == itemId ) { itemInModel[i] = ETrue; - AddItemToModelL( iLauncherItems[i], i ); + AddItemToModelL( iLauncherItems[i], i ); break; } } @@ -554,7 +560,7 @@ AddItemToModelL( iLauncherItems[i], i ); } } - + CleanupStack::PopAndDestroy( &itemInModel ); } @@ -585,14 +591,9 @@ TUid CFSEmailUiLauncherGridVisualiser::Id() const { FUNC_LOG; - return AppGridId; - } + return AppGridId; + } -// <cmail> Toolbar -/* -void CFSEmailUiLauncherGridVisualiser::DoActivateL(const TVwsViewId& aPrevViewId, - TUid aCustomMessageId, - const TDesC8& aCustomMessage)*/ void CFSEmailUiLauncherGridVisualiser::ChildDoActivateL(const TVwsViewId& aPrevViewId, TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/) @@ -602,7 +603,12 @@ { DoFirstStartL(); } - + + if( iAppUi.CurrentFixedToolbar() ) + { + iAppUi.CurrentFixedToolbar()->SetToolbarVisibility( EFalse ); + } + // For initial mailbox query TBool startedFromOds = EFalse; // NULL wizard started parameter every time when activated again. @@ -634,7 +640,7 @@ { iAppUi.EnterFsEmailViewL( iAppUi.CurrentActiveView()->Id() ); } - + return; } @@ -651,23 +657,23 @@ } SetDefaultStatusPaneTextL(); - + // Mailbox query is called here but shown only once in appui if needed // doNotshowQuery is ETrue when started from wizard if ( !iFirstStartComplete ) { iFirstStartComplete = ETrue; iAppUi.GridStarted( startedFromOds ); - iAppUi.ShowMailboxQueryL(); + iAppUi.ShowMailboxQueryL(); } - // <cmail> + // <cmail> else { // Ensure that FSMailServer is running, but don't do it on first // activation, as it's done anyway in AppUi's ConstructL TFsEmailUiUtility::EnsureFsMailServerIsRunning( iEikonEnv->WsSession() ); } - + if( iRowCount > iVisibleRows ) { iScrollbar->MakeVisible(ETrue); @@ -676,41 +682,38 @@ { iScrollbar->MakeVisible(EFalse); } - + iAppUi.HideTitlePaneConnectionStatus(); - + // Erase the navigation history when main grid activated. This is the default view // of the application and back navigation is never possible from here. The view stack // might be in inconsistent state because of some unexpected error in view switching. // Erasing the history helps recovering from such situations. iAppUi.EraseViewHistory(); - + FocusVisibilityChange( iAppUi.IsFocusShown() ); UpdateFocusVisibility(); } -// </cmail> Toolbar void CFSEmailUiLauncherGridVisualiser::ChildDoDeactivate() { FUNC_LOG; iScrollbar->MakeVisible(EFalse); - // </cmail> } - void CFSEmailUiLauncherGridVisualiser::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane) { FUNC_LOG; - + if ( aResourceId == R_FSEMAILUI_MAINUIGRID_MENUPANE ) { if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) ) { // remove help support in pf5250 - aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue); + aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue); } - + TFSLauncherGridMailboxStatus mbStatus = CheckMailboxStatusL(); - + // Checks if a device has a keyboard or not. if( !iKeyboardFlipOpen ) { @@ -719,7 +722,7 @@ // If no mailboxes configured, dim all mailbox related items. aMenuPane->SetItemDimmed( EFsEmailUiCmdDeleteMailbox, ETrue ); } - + aMenuPane->SetItemDimmed( EFsEmailUiCmdOpen, ETrue ); aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue ); aMenuPane->SetItemDimmed( EFsEmailUiCmdSyncAll, ETrue ); @@ -732,15 +735,15 @@ } else { - // <cmail> - aMenuPane->SetItemDimmed( EFsEmailUiCmdAbout, ETrue ); + // <cmail> + aMenuPane->SetItemDimmed( EFsEmailUiCmdAbout, ETrue ); // </cmail> - + if( mbStatus.iMailboxCount <= 0 ) { // If no mailboxes configured, dimm all mailbox related items aMenuPane->SetItemDimmed( EFsEmailUiCmdDeleteMailbox, ETrue ); - aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelSync, ETrue); + aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelSync, ETrue); aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue ); aMenuPane->SetItemDimmed( EFsEmailUiCmdSyncAll, ETrue ); aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue ); @@ -756,7 +759,7 @@ // All mailboxes are already not syncing aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelSync, ETrue ); } - + // Handle items related to sync starting if( mbStatus.iMailboxesSyncing == mbStatus.iMailboxCount ) { @@ -774,7 +777,7 @@ // Several mailboxes configured, dimm "Synchronise" aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue ); } - + // Handle items related to online if( mbStatus.iMailboxesOnline == mbStatus.iMailboxCount ) { @@ -792,11 +795,11 @@ // Several mailboxes configured, dimm "Connect" aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue ); } - + // Handle pop accounts that can't sync RPointerArray<CFSMailBox> mailBoxes; CleanupResetAndDestroyClosePushL( mailBoxes ); - TFSMailMsgId id; + TFSMailMsgId id; bool onlyPop = true; TInt err = iAppUi.GetMailClient()->ListMailBoxes( id, @@ -815,7 +818,7 @@ aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue ); aMenuPane->SetItemDimmed( EFsEmailUiCmdSyncAll, ETrue ); } - + CleanupStack::PopAndDestroy( &mailBoxes ); // Handle items related to offline @@ -838,58 +841,54 @@ } // Add shortcut hints - iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane, - CFSEmailUiShortcutBinding::EContextMainGrid ); + iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane, + CFSEmailUiShortcutBinding::EContextMainGrid ); } } } -void CFSEmailUiLauncherGridVisualiser::HandleCommandL(TInt aCommand) +void CFSEmailUiLauncherGridVisualiser::HandleCommandL( TInt aCommand ) { FUNC_LOG; + switch ( aCommand ) { case EAknSoftkeyOpen: { - if (!iAppUi.IsTimerFocusShown()) + if( !iAppUi.IsFocusShown() ) { - int wasActive = iAppUi.StartFocusRemovalTimer(); - - if (!wasActive) - { - UpdateFocusVisibility(); - ResizeItemIcon( EFalse ); - } - + // No need to handle return value + iAppUi.SetFocusVisibility( ETrue ); + UpdateFocusVisibility(); + ResizeItemIcon( EFalse ); break; } } case EFsEmailUiCmdOpen: { SelectL(); + break; } - break; -// <cmail> Hiding is disabled in Cmail -// case EFsEmailUiCmdHide: -// { -// TApaTaskList taskList( iEikonEnv->WsSession() ); -// TApaTask task = taskList.FindApp( KFSEmailUiUid ); -// if ( task.Exists() ) -// { -// task.SendToBackground(); // Send self to background -// } -// } -// break; -// </cmail> case EFsEmailUiCmdDeleteMailbox: { + // Deletion by using the option menu. iMailboxDeleter->DeleteMailboxL(); break; - } + } + case EFsEmailUiCmdDeleteSelectedMailbox: + { + // Deletion by using the long tap pop-up menu. + iMailboxDeleter->DeleteMailboxL( iMailboxToDelete ); + + // Hide the focus. + iAppUi.SetFocusVisibility( EFalse ); + HandleButtonReleaseEvent(); // Finishes the focus removal. + break; + } case EFsEmailUiCmdSync: case EFsEmailUiCmdSyncAll: { - if (aCommand == EFsEmailUiCmdSyncAll) + if (aCommand == EFsEmailUiCmdSyncAll) { iAppUi.ManualMailBoxSyncAll(ETrue); } @@ -899,7 +898,7 @@ } RPointerArray<CFSMailBox> mailBoxes; CleanupResetAndDestroyClosePushL( mailBoxes ); - TFSMailMsgId id; + TFSMailMsgId id; TInt err = iAppUi.GetMailClient()->ListMailBoxes( id, mailBoxes ); @@ -907,9 +906,7 @@ for ( TInt i = 0; i < mailBoxes.Count(); i++ ) { iAppUi.SubscribeMailboxL( mailBoxes[i]->GetId() ); - // <cmail> mailBoxes[i]->GetMailBoxStatus(); - // </cmail> mailBoxes[i]->RefreshNowL( iAppUi ); } @@ -920,7 +917,7 @@ { RPointerArray<CFSMailBox> mailBoxes; CleanupResetAndDestroyClosePushL( mailBoxes ); - TFSMailMsgId id; + TFSMailMsgId id; TInt err = iAppUi.GetMailClient()->ListMailBoxes( id, mailBoxes ); @@ -938,13 +935,13 @@ case EFsEmailUiCmdGoOffline: case EFsEmailUiCmdGoOfflineAll: { - if (aCommand == EFsEmailUiCmdGoOfflineAll) + if (aCommand == EFsEmailUiCmdGoOfflineAll) { iAppUi.ManualMailBoxDisconnectAll(ETrue); } RPointerArray<CFSMailBox> mailBoxes; CleanupResetAndDestroyClosePushL( mailBoxes ); - TFSMailMsgId id; + TFSMailMsgId id; TInt err = iAppUi.GetMailClient()->ListMailBoxes( id, mailBoxes ); @@ -961,7 +958,7 @@ case EFsEmailUiCmdGoOnline: case EFsEmailUiCmdGoOnlineAll: { - if (aCommand == EFsEmailUiCmdGoOnlineAll) + if (aCommand == EFsEmailUiCmdGoOnlineAll) { iAppUi.ManualMailBoxConnectAll(ETrue); } @@ -983,7 +980,7 @@ break; case EFsEmailUiCmdAbout: { - DisplayProductInfoL(); + DisplayProductInfoL(); } break; case EFsEmailUiCmdHelp: @@ -991,9 +988,14 @@ TFsEmailUiUtility::LaunchHelpL( KFSE_HLP_LAUNCHER_GRID ); } break; - // <cmail> + case KErrCancel: + { + // The pop-up menu was closed. Hide the focus. + iAppUi.SetFocusVisibility( EFalse ); + HandleButtonReleaseEvent(); // Finishes the focus removal. + break; + } case EFsEmailUiCmdHide: - // </cmail> case EEikCmdExit: case EAknSoftkeyExit: case EFsEmailUiCmdExit: @@ -1003,21 +1005,21 @@ break; default: break; - } + } // switch ( aCommand ) } - + TBool CFSEmailUiLauncherGridVisualiser::OfferEventL(const TAlfEvent& aEvent) { FUNC_LOG; if ( aEvent.IsKeyEvent() && aEvent.Code() == EEventKey ) - { + { // If wait note is being shown while a mailbox is being created, // then do not react to key presses. if ( iWizardWaitnoteShown ) { return ETrue; // key consumed } - + // Swap right and left controls in mirrored layout TInt scanCode = aEvent.KeyEvent().iScanCode; if ( AknLayoutUtils::LayoutMirrored() ) @@ -1025,17 +1027,17 @@ if (scanCode == EStdKeyRightArrow) scanCode = EStdKeyLeftArrow; else if (scanCode == EStdKeyLeftArrow ) scanCode = EStdKeyRightArrow; } - - if ((scanCode == EStdKeyRightArrow) - || (scanCode == EStdKeyLeftArrow) - || (scanCode == EStdKeyUpArrow) + + if ((scanCode == EStdKeyRightArrow) + || (scanCode == EStdKeyLeftArrow) + || (scanCode == EStdKeyUpArrow) || (scanCode == EStdKeyDownArrow) || (scanCode == EStdKeyEnter) || (scanCode == EStdKeyDeviceA) || (scanCode ==EStdKeyDevice3)) { - TBool wasActive = iAppUi.StartFocusRemovalTimer(); - if (!wasActive) + + if ( !iAppUi.SetFocusVisibility( ETrue ) ) { // focus is now activated. ignore key press. UpdateFocusVisibility(); @@ -1043,7 +1045,7 @@ return ETrue; } } - + switch(scanCode) { case EStdKeyRightArrow: @@ -1062,11 +1064,11 @@ case EStdKeyDeviceA: case EStdKeyDevice3: HandleButtonReleaseEvent(); - SelectL(); + SelectL(); return ETrue; default: // Check keyboard shortcuts. - TInt shortcutCommand = + TInt shortcutCommand = iAppUi.ShortcutBinding().CommandForShortcutKey( aEvent.KeyEvent(), CFSEmailUiShortcutBinding::EContextMainGrid ); if ( shortcutCommand != KErrNotFound ) @@ -1080,45 +1082,55 @@ return EFalse; // was not consumed } -// <cmail> + // --------------------------------------------------------------------------- // CFSEmailUiLauncherGridVisualiser::HandlePointerEventL // // --------------------------------------------------------------------------- -// -TBool CFSEmailUiLauncherGridVisualiser::HandlePointerEventL(const TAlfEvent& aEvent) +// +TBool CFSEmailUiLauncherGridVisualiser::HandlePointerEventL( + const TAlfEvent& aEvent ) { FUNC_LOG; TBool result( EFalse ); TInt currentlyFocused( iCurrentLevel.iSelected ); TPointerEvent::TType type = aEvent.PointerEvent().iType; TInt id = FindPointedItem( aEvent ); + if( KErrNotFound != id ) { + // The event coordinates correspond with an item. switch( type ) { case TPointerEvent::EButton1Down: { iItemIdInButtonDownEvent.iItemId = id; iItemIdInButtonDownEvent.iLaunchSelection = ETrue; - UpdateFocusVisibility(); - SetFocusedItemL( id ); + UpdateFocusVisibility(); break; } case TPointerEvent::EButton1Up: { + if ( iStylusPopUpMenuLaunched ) + { + // A pop-up menu was launched. Do not open the selected + // item. + iStylusPopUpMenuLaunched = EFalse; + break; + } + + // Hide focus always after pointer up event. + iAppUi.SetFocusVisibility( EFalse ); + // If key was released on item that had focus // trigger selection. if( iItemIdInButtonDownEvent.iItemId == id && iItemIdInButtonDownEvent.iLaunchSelection ) { - // keyboard focus is now hidden - iAppUi.CancelFocusRemovalTimer(); - HandleButtonReleaseEvent(); - - // LAUNCH OPENING. This may leave if user cancels the operation + // LAUNCH OPENING. This may leave if user cancels the + // operation SelectL(); } else @@ -1146,11 +1158,28 @@ } break; } + case TPointerEvent::EButtonRepeat: + { + // Long tap. + // Check the type of the currently selected item. + TInt itemType = iCurrentLevel.iItems[id].iId; + + if ( itemType == EDefaultMailboxItem || + itemType == EOtherMailboxItems ) + { + // The selected item is a mail box. Launch the pop-up + // menu. + LaunchStylusPopupMenu( id ); + } + + break; + } default: { break; } } + result = ETrue; } // if event do not concern any of items. @@ -1158,6 +1187,7 @@ { iItemIdInButtonDownEvent.iLaunchSelection = EFalse; ResizeItemIcon( ETrue ); + switch( type ) { case TPointerEvent::EButton1Down: @@ -1168,6 +1198,8 @@ } case TPointerEvent::EButton1Up: { + // Hide focus always after pointer up event. + iAppUi.SetFocusVisibility( EFalse ); iItemIdInButtonDownEvent.iItemId = KErrNotFound; HandleButtonReleaseEvent(); break; @@ -1178,6 +1210,15 @@ } } } + else + { + if( aEvent.IsPointerEvent() && aEvent.PointerUp() ) + { + // Hide focus always after pointer up event. + iAppUi.SetFocusVisibility( EFalse ); + } + } + return result; } @@ -1185,24 +1226,24 @@ // CFSEmailUiLauncherGridVisualiser::FindPointedItem // // --------------------------------------------------------------------------- -// +// TInt CFSEmailUiLauncherGridVisualiser::FindPointedItem( const TAlfEvent& aEvent ) { FUNC_LOG; - TInt result = KErrNotFound; - - TInt count = iCurrentLevel.iItemVisualData.Count(); + TInt result = KErrNotFound; + + TInt count = iCurrentLevel.iItemVisualData.Count(); const TPoint pos = aEvent.PointerEvent().iParentPosition; - + for(TInt a = 0; count > a; a++) { - const TRect rect(iCurrentLevel.iItemVisualData[a].iBase->DisplayRect()); + const TRect rect(iCurrentLevel.iItemVisualData[a].iBase->DisplayRect()); if(rect.Contains( pos )) { result = a; - break; - } - } + break; + } + } return result; } @@ -1210,16 +1251,15 @@ // CFSEmailUiLauncherGridVisualiser::SetFocusedItemL // // --------------------------------------------------------------------------- -// +// void CFSEmailUiLauncherGridVisualiser::SetFocusedItemL( TInt aId ) { FUNC_LOG; TInt oldSelection = iCurrentLevel.iSelected; - + HandleRowMovement( EDirectionTouch, aId ); - - FocusItem( EFalse, oldSelection ); -// iCurrentLevel.iSelected = aId; + + FocusItem( EFalse, oldSelection ); FocusItem( ETrue, iCurrentLevel.iSelected ); MoveSelectorToCurrentItem( EDirectionTouch ); } @@ -1229,11 +1269,11 @@ FUNC_LOG; // NULL double click flag just be sure that the UI does not // go into state that wizard cannot be started. - iDoubleClickLock = EFalse; + iDoubleClickLock = EFalse; // Store old selection TInt oldSelection = iCurrentLevel.iSelected; TInt itemCount = iCurrentLevel.iItemVisualData.Count(); - + HandleRowMovement( aDir, iCurrentLevel.iSelected ); // Set the correct icon focuses (i.e. enlarged) @@ -1253,7 +1293,7 @@ FUNC_LOG; // NULL double click flag just be sure that the UI does not // go into state that wizard cannot be started. - iDoubleClickLock = EFalse; + iDoubleClickLock = EFalse; // Store old selection TInt oldSelection = iCurrentLevel.iSelected; TInt itemCount = iCurrentLevel.iItemVisualData.Count(); @@ -1291,7 +1331,7 @@ if ( iCurrentLevel.iSelected < 0 ) { iCurrentLevel.iSelected += (iRowCount*iVisibleColumns); - if ( iCurrentLevel.iSelected >= itemCount ) + if ( iCurrentLevel.iSelected >= itemCount ) { // Wrapping is about to move the cursor on empty spot. // To be consistent with S60 app grid, move selection to the last item. @@ -1321,11 +1361,11 @@ case EDirectionNone: break; - + case EDirectionTouch: - iCurrentLevel.iSelected = aSelected; + iCurrentLevel.iSelected = aSelected; break; - + } if ( iCurrentLevel.iSelected < 0 ) @@ -1344,7 +1384,7 @@ ScrollToRow( y ); } -// </cmail> + void CFSEmailUiLauncherGridVisualiser::MoveSelectorToCurrentItem( TDirection aDir ) { @@ -1363,7 +1403,7 @@ TPoint ringWrapOffset( 0, 0 ); const TInt KGridWrapWidth = (iVisibleColumns+2)*iColumnWidth; const TInt KGridWrapHeight = (iRowCount+2)*iRowHeight; - + if ( aDir == EDirectionRight && ( targetPos.iX <= curPos.iX || iCurrentLevel.iSelected == 0 ) ) { ringWrapOffset.iX = KGridWrapWidth; @@ -1402,7 +1442,7 @@ // Invalid item index return; } - + if( aHasFocus && ( IsFocusShown() || iItemIdInButtonDownEvent.iItemId >= 0 ) ) { TAlfTimedValue scaleValue; @@ -1458,7 +1498,7 @@ offset = iFirstVisibleRow * iRowHeight; - + TAlfTimedPoint alfScrollOffset; alfScrollOffset.iY.SetTarget( offset , KScrollTransitionTimeMs ); iCurrentLevel.iGridLayout->SetScrollOffset(alfScrollOffset); @@ -1466,7 +1506,7 @@ iScrollbarModel.SetFocusPosition(iFirstVisibleRow); TRAP_IGNORE( iScrollbar->SetModelL(&iScrollbarModel) ); iScrollbar->DrawNow(); -// </cmail> +// </cmail> } void CFSEmailUiLauncherGridVisualiser::RefreshLauncherViewL() @@ -1489,13 +1529,13 @@ FocusItem( ETrue, iCurrentLevel.iSelected ); } UpdateScrollBarRangeL(); - } + } } TBool CFSEmailUiLauncherGridVisualiser::UiOperationLaunched() { FUNC_LOG; - return iUiOperationLaunched; + return iUiOperationLaunched; } void CFSEmailUiLauncherGridVisualiser::PopulateL( TLevel& aLevel ) @@ -1506,30 +1546,30 @@ for( TInt i = 0; i < aLevel.iItemVisualData.Count(); i++ ) { aLevel.iItemVisualData[i].iBase->RemoveAndDestroyAllD(); - } + } aLevel.iItemVisualData.Reset(); aLevel.iItems.Reset(); - -// <cmail> Use layout data instead of hard-coded values + +// <cmail> Use layout data instead of hard-coded values TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); - + TAknLayoutRect scrollBarRect; scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar()); TRect gridRect = mainPaneRect; gridRect.iBr.iX -= scrollBarRect.Rect().Width(); - + TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; - + TAknLayoutRect itemRect; itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0)); TRect itemrc = itemRect.Rect(); itemrc.SetRect(TPoint(0,0), itemRect.Rect().Size()); - + TAknLayoutRect gridIconRect; gridIconRect.LayoutRect(itemrc, AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var)); - + TAknLayoutText gridText; gridText.LayoutText(itemrc, AknLayoutScalable_Apps::cell_cmail_l_pane_t1(var)); // </cmail> @@ -1537,7 +1577,7 @@ if( aLevel.iParent >= 0 ) { iModel->FindChildren( aLevel.iParent, aLevel.iItems ); - + for( TInt i = 0; i < aLevel.iItems.Count(); i++ ) { TItemVisualData newItem; @@ -1545,7 +1585,7 @@ newItem.iBase = CAlfAnchorLayout::AddNewL( *iControl, aLevel.iGridLayout ); newItem.iBase->SetTactileFeedbackL( ETouchEventStylusDown, ETouchFeedbackBasic ); -// <cmail> Use layout data instead of hard-coded values +// <cmail> Use layout data instead of hard-coded values // Set anchors for text newItem.iBase->SetAnchor( EAlfAnchorTopLeft, @@ -1589,20 +1629,20 @@ TRgb itemColor (KRgbGray); // text #9 application grid unfocused application title texts #215 if( AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), - itemColor, KAknsIIDQsnTextColors, + itemColor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG9 ) != KErrNone ) { - itemColor = gridText.Color();//iAppUi.LayoutHandler()->ListNormalStateTextSkinColor(); + itemColor = gridText.Color();//iAppUi.LayoutHandler()->ListNormalStateTextSkinColor(); } newItem.iText->SetColor(itemColor); // </cmail> - - newItem.iText->SetTextL( *aLevel.iItems[i].iCaption ); - + + newItem.iText->SetTextL( *aLevel.iItems[i].iCaption ); + TAlfTimedValue opacity; opacity.SetValueNow ( KDefaultCaptionOpacity ); newItem.iText->SetOpacity( opacity ); - + newItem.iText->SetTextStyle( iAppUi.LayoutHandler()->FSTextStyleFromLayoutL(AknLayoutScalable_Apps::cell_cmail_l_pane_t1(var)).Id() );//FSTextStyleFromIdL( EFSFontTypeSmall )->Id() ); newItem.iText->SetWrapping( CAlfTextVisual::ELineWrapTruncate ); newItem.iText->SetAlign( EAlfAlignHCenter, EAlfAlignVTop ); @@ -1612,7 +1652,7 @@ newItem.iImage->SetImage( TAlfImage( *aLevel.iItems[i].iIconTexture ) ); newItem.iImage->SetFlag( EAlfVisualFlagManualSize ); -// <cmail> Use layout data instead of hard-coded values +// <cmail> Use layout data instead of hard-coded values newItem.iImage->SetSize( gridIconRect.Rect().Size() ); newItem.iImage->SetScale( KScaleNotSelected ); // </cmail> @@ -1621,7 +1661,7 @@ } } -// <cmail> Use layout data instead of hard-coded values +// <cmail> Use layout data instead of hard-coded values // Set columns and rows //iVisibleColumns = iAppUi.LayoutHandler()->GridColumnsInThisResolution(); //iVisibleRows = iAppUi.LayoutHandler()->GridRowsInThisResolution(); @@ -1641,7 +1681,7 @@ { iItemIdInButtonDownEvent.iItemId = KErrNotFound; UpdateFocusVisibility(); - + CFSEmailLauncherItem* launcherItem = iCurrentLevel.iItems[iCurrentLevel.iSelected].iLauncherItem; if ( launcherItem ) @@ -1657,12 +1697,12 @@ case EOtherMailboxItems: { TMailListActivationData tmp; - tmp.iFolderId = iCurrentLevel.iItems[iCurrentLevel.iSelected].iMailBoxInboxId; - tmp.iMailBoxId = iCurrentLevel.iItems[iCurrentLevel.iSelected].iMailBoxId; + tmp.iFolderId = iCurrentLevel.iItems[iCurrentLevel.iSelected].iMailBoxInboxId; + tmp.iMailBoxId = iCurrentLevel.iItems[iCurrentLevel.iSelected].iMailBoxId; const TPckgBuf<TMailListActivationData> pkgOut( tmp ); iAppUi.ShowTitlePaneConnectionStatus(); iAppUi.EnterFsEmailViewL( MailListId, KStartListWithFolderId, pkgOut ); - } + } break; case EDirectoryItem: { @@ -1671,14 +1711,14 @@ if ( !iDoubleClickLock ) { // Lock to make sure that wizard is not started twice in a row - iDoubleClickLock = ETrue; + iDoubleClickLock = ETrue; RPointerArray<CFSMailBox> mailBoxes; CleanupResetAndDestroyClosePushL( mailBoxes ); - TFSMailMsgId id; + TFSMailMsgId id; TInt err = iAppUi.GetMailClient()->ListMailBoxes( id, mailBoxes ); - + // Remove mailboxes that doesn't support RCL for ( TInt i = mailBoxes.Count()-1; i >= 0 ; i-- ) { @@ -1705,9 +1745,9 @@ if ( mailBox ) { CFsDelayedLoader::InstanceL()->GetContactHandlerL()->LaunchRemoteLookupL( *mailBox ); - } + } iDoubleClickLock = EFalse; - CleanupStack::PopAndDestroy( &mailBoxes ); + CleanupStack::PopAndDestroy( &mailBoxes ); } } break; @@ -1715,7 +1755,7 @@ { TInt tmp = 0; const TPckgBuf<TInt> pkgBuf( tmp ); - iAppUi.EnterFsEmailViewL( + iAppUi.EnterFsEmailViewL( SettingsViewId, TUid::Uid(KMailSettingsOpenMainList), pkgBuf ); @@ -1727,7 +1767,7 @@ // wizard would crash without this if ( !iDoubleClickLock ) { - iDoubleClickLock = ETrue; + iDoubleClickLock = ETrue; LaunchWizardL(); } } @@ -1744,9 +1784,9 @@ } break; default: - return; + return; } - } + } } } @@ -1760,7 +1800,7 @@ // Toggle safety lock always when receiving foreground back. if ( iFirstStartComplete && iDoubleClickLock ) { - iDoubleClickLock = EFalse; + iDoubleClickLock = EFalse; } } @@ -1788,10 +1828,10 @@ TInt selectedOption; CAknListQueryDialog* dlg = new ( ELeave ) CAknListQueryDialog( &selectedOption ); dlg->PrepareLC( R_FSEMAILUI_LAUNCHER_GRID_MAILBOX_SELECTION_DIALOG ); - + dlg->SetItemTextArray( array ); dlg->SetOwnershipType( ELbmDoesNotOwnItemArray ); - + CFSMailBox* mailbox = NULL; if( dlg->RunLD() ) { @@ -1802,7 +1842,7 @@ mailbox = aMailBoxes[selectedOption]; } } - + CleanupStack::PopAndDestroy( array ); return mailbox; } @@ -1825,20 +1865,20 @@ } iAiwSHandler->ExecuteServiceCmdL( KAiwCmdSettingWizardFsEmail.iUid, - iAiwSHandler->InParamListL(), + iAiwSHandler->InParamListL(), iAiwSHandler->OutParamListL() ); } void CFSEmailUiLauncherGridVisualiser::GoToInboxL( TFSMailMsgId& aMailboxId, TFSMailMsgId& aMailboxInboxId ) { FUNC_LOG; - TMailListActivationData tmp; - + TMailListActivationData tmp; + tmp.iMailBoxId = aMailboxId; tmp.iFolderId = aMailboxInboxId; - - const TPckgBuf<TMailListActivationData> pkgOut( tmp ); - + + const TPckgBuf<TMailListActivationData> pkgOut( tmp ); + iAppUi.EnterFsEmailViewL( MailListId, KStartListWithFolderId, pkgOut ); } @@ -1851,23 +1891,23 @@ TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; - + TAknLayoutRect scrollBarRect; scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar()); TRect gridRect = mainPaneRect; gridRect.iBr.iX -= scrollBarRect.Rect().Width(); - + TAknLayoutRect itemRect; itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0)); - + TAknLayoutRect gridIconRect; gridIconRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var)); - + //TInt gridIconSize = iAppUi.LayoutHandler()->GridIconSize(); TSize iconSize = gridIconRect.Rect().Size(); //iconSize.SetSize( gridIconSize, gridIconSize ); // </cmail> - + // Scale bitmaps for( TInt i = 0 ; i < iIconArray.Count() ; i++ ) { @@ -1877,7 +1917,7 @@ for ( TInt item = 0; item < iCurrentLevel.iItemVisualData.Count() ; item++ ) { iCurrentLevel.iItemVisualData[item].iImage->SetSize( iconSize ); - } + } } } @@ -1894,61 +1934,61 @@ // <cmail> Use layout data instead of hard-coded values TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); - + TAknLayoutRect scrollBarRect; scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar()); TRect gridRect = mainPaneRect; gridRect.iBr.iX -= scrollBarRect.Rect().Width(); - + TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; - + TAknLayoutRect itemRect; itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0)); - + TAknLayoutRect gridIconRect; gridIconRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var)); - + TSize iconSize = gridIconRect.Rect().Size(); // </cmail> - + const CFbsBitmap* bitmap = launcherItemIcon->Bitmap(); - const CFbsBitmap* mask = launcherItemIcon->Mask(); + const CFbsBitmap* mask = launcherItemIcon->Mask(); // First add plugin id and icon id pair to array, needed in provide bitmap TPluginIdIconIdPair idPair; idPair.iPluginArrayIndex = aPluginArrayIndex; - idPair.iIconId = iPluginTextureId; - iPluginIdIconIdPairs.Append( idPair ); + idPair.iIconId = iPluginTextureId; + iPluginIdIconIdPairs.Append( idPair ); // Create texture, goes to provide bitmap - CAlfTexture* texture = &CAlfStatic::Env().TextureManager().CreateTextureL( iPluginTextureId, this, EAlfTextureFlagDefault ); - // Update texture id - iPluginTextureId++; // Id is updated dynamically + CAlfTexture* texture = &CAlfStatic::Env().TextureManager().CreateTextureL( iPluginTextureId, this, EAlfTextureFlagDefault ); + // Update texture id + iPluginTextureId++; // Id is updated dynamically // Set initiel size // <cmail> Use layout data instead of hard-coded values //TSize iconSize(iAppUi.LayoutHandler()->GridIconSize(), iAppUi.LayoutHandler()->GridIconSize() ); // <cmail> - texture->Size().SetSize( iconSize.iHeight, iconSize.iWidth ); + texture->Size().SetSize( iconSize.iHeight, iconSize.iWidth ); iModel->AddL( EShortcut, aItem->Id(), *launcherItemText, *texture, 0, - aItem ); - iIconArray.AppendL( texture ); + aItem ); + iIconArray.AppendL( texture ); } else { CAlfTexture* texture = &iAppUi.FsTextureManager()->TextureByIndex( EGridInboxTexture ); - + iModel->AddL( EShortcut, aItem->Id(), *launcherItemText, *texture, 0, - aItem ); + aItem ); iIconArray.AppendL( texture ); } @@ -1962,12 +2002,12 @@ if ( iConstructionCompleted ) { iCurrentLevel.iParent = 0; - + // <cmail> Use layout data instead of hard-coded values TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; - + TAknLayoutRect scrollBarRect; // <cmail> // scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar()); @@ -1975,16 +2015,16 @@ // </cmail> TRect gridRect = mainPaneRect; gridRect.iBr.iX -= scrollBarRect.Rect().Width(); - + TAknLayoutRect cellRect; cellRect.LayoutRect(gridRect, AknLayoutScalable_Apps::aid_size_cell_cmail_l(var, 0, 0)); - + TAknLayoutRect itemRect; itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0)); - + TAknLayoutRect gridIconRect; gridIconRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var)); - + TAknLayoutRect selectorRect; selectorRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::grid_highlight_pane_cp018(var)); @@ -1992,10 +2032,10 @@ iSelectorImageVisual->SetSize( selectorRect.Rect().Size() ); // layoutHandler->SelectorVisualSizeInThisResolution() ); TSize displaySize = mainPaneRect.Size();//iControl->DisplayArea().Size(); - + TInt columns = iVisibleColumns = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastColumn() + 1; //layoutHandler->GridColumnsInThisResolution(); TInt rows = iVisibleRows = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastRow() + 1; //layoutHandler->GridRowsInThisResolution(); - + // </cmail> iCurrentLevel.iGridLayout->SetSize( gridRect.Size() ); @@ -2016,7 +2056,7 @@ iScrollbar->MakeVisible(EFalse); } // </cmail> - + TInt scrollbarTopLeftX = displaySize.iWidth - scrollbarWidth; TInt scrollbarTopLeftY = 0; TInt scrollbarBottomRightX = displaySize.iWidth; @@ -2050,17 +2090,17 @@ TAlfTimedPoint( scrollbarTopLeftX, scrollbarTopLeftY ) ); iWidgetLayout->SetAnchor( EAlfAnchorBottomRight, - 0, + 0, EAlfAnchorOriginLeft, EAlfAnchorOriginTop, EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, TAlfTimedPoint( scrollbarBottomRightX, scrollbarBottomRightY ) ); - + // Set anchors for the grid iWidgetLayout->SetAnchor( EAlfAnchorTopLeft, - 1, + 1, EAlfAnchorOriginLeft, EAlfAnchorOriginTop, EAlfAnchorMetricAbsolute, @@ -2068,7 +2108,7 @@ TAlfTimedPoint( gridTopLeftX, gridTopLeftY ) ); iWidgetLayout->SetAnchor( EAlfAnchorBottomRight, - 1, + 1, EAlfAnchorOriginLeft, EAlfAnchorOriginTop, EAlfAnchorMetricAbsolute, @@ -2076,9 +2116,9 @@ TAlfTimedPoint( gridBottomRightX, gridBottomRightY ) ); iParentLayout->UpdateChildrenLayout(); - + TSize gridSize = iCurrentLevel.iGridLayout->Size().IntTarget().AsSize(); - iColumnWidth = gridSize.iWidth / iVisibleColumns; + iColumnWidth = gridSize.iWidth / iVisibleColumns; iRowHeight = gridSize.iHeight / iVisibleRows; // Selector ring wrap limits can be calculated when row and column sizes are known. @@ -2104,9 +2144,9 @@ iRingMovementXFuncMappingDataProvider.SetEnd((iVisibleColumns+1)*iColumnWidth); iRingMovementYFuncMappingDataProvider.SetStart(-iRowHeight); iRingMovementYFuncMappingDataProvider.SetEnd((iRowCount+1)*iRowHeight); - + iRingMovementXFunc->SetMappingTableValues( -(iVisibleColumns+2)*iColumnWidth, (iVisibleColumns*2+2)*iColumnWidth, &iRingMovementXFuncMappingDataProvider ); - iRingMovementYFunc->SetMappingTableValues( -(iRowCount+2)*iRowHeight, (iRowCount*2+2)*iRowHeight, &iRingMovementYFuncMappingDataProvider ); + iRingMovementYFunc->SetMappingTableValues( -(iRowCount+2)*iRowHeight, (iRowCount*2+2)*iRowHeight, &iRingMovementYFuncMappingDataProvider ); } } @@ -2123,13 +2163,13 @@ HBufC* text_7 = StringLoader::LoadLC( R_DISCLAIMER_PART_7 ); HBufC* text_8 = StringLoader::LoadLC( R_DISCLAIMER_PART_8 ); HBufC* text_9 = StringLoader::LoadLC( R_DISCLAIMER_PART_9 ); - HBufC* text_10 = StringLoader::LoadLC( R_DISCLAIMER_PART_10 ); + HBufC* text_10 = StringLoader::LoadLC( R_DISCLAIMER_PART_10 ); HBufC* text_11 = StringLoader::LoadLC( R_DISCLAIMER_PART_11 ); - + //Create a buffer for dialog content - HBufC* text = HBufC::NewLC( text_1->Length() + text_2->Length() + text_3->Length() + - text_4->Length() + text_5->Length() + text_6->Length() + - text_7->Length() + text_8->Length() + text_9->Length() + + HBufC* text = HBufC::NewLC( text_1->Length() + text_2->Length() + text_3->Length() + + text_4->Length() + text_5->Length() + text_6->Length() + + text_7->Length() + text_8->Length() + text_9->Length() + text_10->Length() + text_11->Length() ); //Copy the disclaimer text parts to dialog content text->Des() += *text_1; @@ -2142,8 +2182,8 @@ text->Des() += *text_8; text->Des() += *text_9; text->Des() += *text_10; - text->Des() += *text_11; - + text->Des() += *text_11; + CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL( *text ); CleanupStack::PopAndDestroy( text ); CleanupStack::PopAndDestroy( text_11 ); @@ -2158,21 +2198,21 @@ CleanupStack::PopAndDestroy( text_2 ); CleanupStack::PopAndDestroy( text_1 ); dlg->PrepareLC( R_DISCLAIMER_MESSAGE ); - + //Create heading for the dialog, load and create the heading text CAknPopupHeadingPane* headingPane = dlg->Heading(); HBufC* appName = StringLoader::LoadLC(R_FSEMAIL_APP_NAME ); HBufC* version = StringLoader::LoadLC( R_DISCLAIMER_FSEMAIL_VERSION ); HBufC* title = HBufC::NewLC(version->Length() + appName->Length() + 1); - title->Des() += *appName; + title->Des() += *appName; title->Des() += KSpace; title->Des() += *version; headingPane->SetTextL( *title ); CleanupStack::PopAndDestroy( title ); CleanupStack::PopAndDestroy( version ); - CleanupStack::PopAndDestroy( appName ); + CleanupStack::PopAndDestroy( appName ); dlg->ButtonGroupContainer().SetCommandSetL( R_AVKON_SOFTKEYS_OK_EMPTY ); - //show dialog + //show dialog TInt ret = dlg->RunLD(); } @@ -2185,25 +2225,23 @@ if ( iConstructionCompleted ) { iItemIdInButtonDownEvent.iItemId = KErrNotFound; - - // <cmail> Use layout data instead of hard-coded values + TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; - + TAknLayoutRect scrollBarRect; scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar()); TRect gridRect = mainPaneRect; gridRect.iBr.iX -= scrollBarRect.Rect().Width(); - + TAknLayoutRect cellRect; cellRect.LayoutRect(gridRect, AknLayoutScalable_Apps::aid_size_cell_cmail_l(var, 0, 0)); - + TSize displaySize = cellRect.Rect().Size(); - // </cmail> iParentLayout->SetSize( displaySize ); - RescaleIconsL(); - VisualLayoutUpdatedL(); + RescaleIconsL(); + VisualLayoutUpdatedL(); UpdateFocusVisibility(); } @@ -2213,7 +2251,7 @@ { FUNC_LOG; iRefreshNeeded = ETrue; - + CFsEmailUiViewBase::HandleDynamicVariantSwitchOnBackgroundL( aType ); } @@ -2245,7 +2283,7 @@ TRect scrollbarRect = aParent->DisplayRectTarget(); scrollbarRect.Move(mainPaneRect.iTl); iScrollbar->SetRect(scrollbarRect); - + iScrollbar->MakeVisible(EFalse); iScrollbar->SetModelL(&iScrollbarModel); } @@ -2253,7 +2291,7 @@ void CFSEmailUiLauncherGridVisualiser::UpdateScrollBarRangeL() { FUNC_LOG; - + iScrollbarModel.SetScrollSpan(iRowCount); iScrollbarModel.SetWindowSize(iVisibleRows); iScrollbarModel.SetFocusPosition(iFirstVisibleRow); @@ -2267,7 +2305,7 @@ const TInt KScrollTransitionTimeMs = KSelectTransitionTimeMs; if (aScrollBar == iScrollbar) { - + switch( aEventType ) { case EEikScrollHome : @@ -2290,7 +2328,7 @@ void CFSEmailUiLauncherGridVisualiser::UpdateLauncherItemListL() { FUNC_LOG; - + // Read info about all implementations into infoArray RImplInfoPtrArray infoArray; CleanupResetAndDestroyClosePushL( infoArray ); @@ -2310,7 +2348,7 @@ for ( TInt infoIndex = 0; infoIndex < infoCount; infoIndex++ ) { TUid implementationUid = infoArray[infoIndex]->ImplementationUid(); - + // Check whether item can be found from current laucher items TBool itemFound = EFalse; for ( TInt itemIndex = 0; itemIndex < iLauncherItemUids.Count(); itemIndex++ ) @@ -2353,7 +2391,7 @@ CleanupStack::PopAndDestroy( &infoArray ); } -/** +/** * Sets application title when leaving this view */ void CFSEmailUiLauncherGridVisualiser::SetDefaultStatusPaneTextL() @@ -2368,7 +2406,7 @@ iWizardWaitnoteShown = aWaitnoteShown; } -/** +/** * Check status of all configured mailboxes */ TFSLauncherGridMailboxStatus CFSEmailUiLauncherGridVisualiser::CheckMailboxStatusL() @@ -2376,7 +2414,7 @@ FUNC_LOG; RPointerArray<CFSMailBox> mailBoxes; CleanupResetAndDestroyClosePushL( mailBoxes ); - TFSMailMsgId id; + TFSMailMsgId id; TInt err = iAppUi.GetMailClient()->ListMailBoxes( id, mailBoxes ); @@ -2385,7 +2423,7 @@ returnStatus.iMailboxCount = mailBoxes.Count(); // Reset counters returnStatus.iMailboxesOnline = returnStatus.iMailboxesOffline = returnStatus.iMailboxesSyncing = 0; - + for ( TInt i = 0; i < mailBoxes.Count(); i++ ) { // First check online/offline status @@ -2398,7 +2436,7 @@ { returnStatus.iMailboxesOnline++; } - + // Then check sync state TSSMailSyncState latestSyncstate = mailBoxes[i]->CurrentSyncState(); if( latestSyncstate == InboxSyncing || @@ -2408,12 +2446,12 @@ returnStatus.iMailboxesSyncing++; } } - + CleanupStack::PopAndDestroy( &mailBoxes ); return returnStatus; } -// Bitmap provider for grid ecom plugins icons +// Bitmap provider for grid ecom plugins icons void CFSEmailUiLauncherGridVisualiser::ProvideBitmapL(TInt aId, CFbsBitmap*& aBitmap, CFbsBitmap*& aMaskBitmap) { FUNC_LOG; @@ -2421,31 +2459,31 @@ TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; - + TAknLayoutRect scrollBarRect; scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar()); TRect gridRect = mainPaneRect; gridRect.iBr.iX -= scrollBarRect.Rect().Width(); - + TAknLayoutRect itemRect; itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0)); - + TAknLayoutRect gridIconRect; gridIconRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var)); -// </cmail> - - CAknIcon* launcherItemIcon(0); +// </cmail> + + CAknIcon* launcherItemIcon(0); for ( TInt i=0; i<iPluginIdIconIdPairs.Count(); i++ ) { if ( aId == iPluginIdIconIdPairs[i].iIconId ) { launcherItemIcon = iLauncherItems[iPluginIdIconIdPairs[i].iPluginArrayIndex]->Icon(); - } + } } - + if ( launcherItemIcon ) { -// <cmail> Use layout data instead of hard-coded values +// <cmail> Use layout data instead of hard-coded values // Set bitmap size //TSize iconSize(iAppUi.LayoutHandler()->GridIconSize(), iAppUi.LayoutHandler()->GridIconSize() ); @@ -2460,15 +2498,15 @@ { AknIconUtils::DisableCompression( launcherItemIcon->Mask()); AknIconUtils::SetSize( launcherItemIcon->Mask(), iconSize, EAspectRatioPreserved ); - } + } // Create duplicate sof original for alf CFbsBitmap* bitmap = new (ELeave) CFbsBitmap; - bitmap->Duplicate( launcherItemIcon->Bitmap()->Handle() ); + bitmap->Duplicate( launcherItemIcon->Bitmap()->Handle() ); CFbsBitmap* mask = new (ELeave) CFbsBitmap; - mask->Duplicate( launcherItemIcon->Mask()->Handle() ); - + mask->Duplicate( launcherItemIcon->Mask()->Handle() ); + aBitmap = bitmap; - aMaskBitmap = mask; + aMaskBitmap = mask; } else { @@ -2483,7 +2521,7 @@ iDoubleClickLock = EFalse; } -TReal32 CFSEmailUiLauncherGridVisualiser::TRingMovementFuncMappingDataProvider::MapValue(TReal32 aValue, TInt /*aMode*/) const +TReal32 CFSEmailUiLauncherGridVisualiser::TRingMovementFuncMappingDataProvider::MapValue(TReal32 aValue, TInt /*aMode*/) const { FUNC_LOG; AlfUtil::WrapValue(aValue, iStart, iEnd); @@ -2497,7 +2535,7 @@ { TAlfTimedPoint selectorPos; selectorPos.iX.SetMappingFunctionIdentifier( 0 ); - selectorPos.iY.SetMappingFunctionIdentifier( 0 ); + selectorPos.iY.SetMappingFunctionIdentifier( 0 ); iSelector->SetPos( selectorPos ); } } @@ -2507,7 +2545,7 @@ if( iSelector ) { TAlfTimedValue selectorOpacity; - if( IsFocusShown() || iItemIdInButtonDownEvent.iItemId >= 0 ) + if( IsFocusShown() || iItemIdInButtonDownEvent.iItemId >= 0 ) { selectorOpacity.SetValueNow( 1 ); } @@ -2527,16 +2565,39 @@ void CFSEmailUiLauncherGridVisualiser::MailboxDeletionComplete() { - TRAP_IGNORE( HandleContentChangeL() ); + TRAP_IGNORE( HandleContentChangeL() ); } -void CFSEmailUiLauncherGridVisualiser::HandleTimerFocusStateChange( TBool aShow ) +void CFSEmailUiLauncherGridVisualiser::FocusVisibilityChange( TBool aVisible ) + { + CFsEmailUiViewBase::FocusVisibilityChange( aVisible ); + UpdateFocusVisibility(); + ResizeItemIcon( !aVisible ); + } + + +// ---------------------------------------------------------------------------- +// LaunchStylusPopupMenuL() +// Launches and displays the pop-up menu invoked by a long tap event. +// ---------------------------------------------------------------------------- +// +void CFSEmailUiLauncherGridVisualiser::LaunchStylusPopupMenu( + const TInt aItemId ) { - CFsEmailUiViewBase::HandleTimerFocusStateChange( aShow ); - if (!aShow) - { - UpdateFocusVisibility(); - ResizeItemIcon( ETrue ); - } + // Get the ID of the mailbox in case the user wants to delete it. + iMailboxToDelete = iCurrentLevel.iItems[aItemId].iMailBoxId; + + // Get the item position and use it to determine the position of the menu. + const TRect rect( + iCurrentLevel.iItemVisualData[aItemId].iBase->DisplayRect() ); + TPoint position( rect.iTl.iX + rect.Width() / 2, + rect.iTl.iY + rect.Height() / 2 ); + iStylusPopUpMenu->SetPosition( position ); + + // Display the menu. + iStylusPopUpMenu->ShowMenu(); + iStylusPopUpMenuLaunched = ETrue; } -// End of file + + +// End of file.
--- a/emailuis/emailui/src/FreestyleEmailUiLayoutHandler.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiLayoutHandler.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -18,29 +18,24 @@ // SYSTEM INCLUDE FILES #include "emailtrace.h" -//#include <aknutils.h> <cmail> -// <cmail> SF #include <alf/alftextstylemanager.h> #include <AknsUtils.h> #include <AknsSkinInstance.h> #include <alf/alfstatic.h> -// <cmail> Platform layout change #include <aknlayoutscalable_apps.cdl.h> #include <aknlayoutscalable_avkon.cdl.h> #include <layoutmetadata.cdl.h> -// </cmail> // For generic treelist layout data setting -//<cmail> #include "fstreelist.h" -//</cmail> // INTERNAL INCLUDE FILES #include "FreestyleEmailUiLayoutHandler.h" #include "FreestyleEmailUiLayoutData.h" -// <cmail> Platform layout change +const TInt KPopupMargin = 8; + template< typename T > TUint32 GeneralHash( const T& aValue ) { @@ -52,7 +47,6 @@ { return TPckgC< T >( aP1 ) == TPckgC< T >( aP2 ); } -// </cmail> Platform layout change // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::CFSEmailUiLayoutHandler @@ -106,10 +100,7 @@ CFSEmailUiLayoutHandler::~CFSEmailUiLayoutHandler() { FUNC_LOG; -// <cmail> Platform layout change DeleteTextStyles(); -// </cmail> Platform layout change - // <cmail> if ( iNormalTextStyle != KErrNotFound ) { CAlfStatic::Env().TextStyleManager().DeleteTextStyle( @@ -125,7 +116,6 @@ CAlfStatic::Env().TextStyleManager().DeleteTextStyle( iSmallTextStyle ); } - // </cmail> } // ----------------------------------------------------------------------------- @@ -147,29 +137,6 @@ TScreenOrientation CFSEmailUiLayoutHandler::ScreenOrientation() const { FUNC_LOG; - /* - TScreenOrientation orientation = EPortrait; - switch ( iScreenResolution ) - { - case ELowResLandscape: - case EQvgaLandscape: - case EDrLandscape: - case EVgaLandscape: - case EHvgaLandscape: - case EWideLandscape: - orientation = ELandscape; - break; - case ELowResPortrait: - case EQvgaPortrait: - case EDrPortrait: - case EVgaPortrait: - case EHvgaPortrait: - default: - orientation = EPortrait; - break; - } - - return orientation;*/ return Layout_Meta_Data::IsLandscapeOrientation() ? ELandscape : EPortrait; } @@ -315,14 +282,6 @@ { textColor = KRgbBlack; } - /* - // Should use EAknsCIFsTextColorsCG3 if background is white - if ( AknsUtils::GetCachedColor( skin, textColor, - KAknsIIDFsTextColors, EAknsCIFsTextColorsCG3 ) != KErrNone ) - { - textColor = KRgbBlack; - } -*/ return textColor; } @@ -351,104 +310,16 @@ gridIconLRect.LayoutRect( itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1( 0 ) ); TSize iconSize = gridIconLRect.Rect().Size(); return iconSize; -/* - TInt iconSize(0); - switch ( iScreenResolution ) - { - case EQvgaPortrait: - iconSize = KGridIconSizeInQvgaPort; - break; - case EQvgaLandscape: - iconSize = KGridIconSizeInQvgaLand; - break; - case EVgaPortrait: - iconSize = KGridIconSizeInVgaPort; - break; - case EVgaLandscape: - iconSize = KGridIconSizeInVgaLand; - break; - case EHvgaPortrait: - iconSize = KGridIconSizeInHvgaPort; - break; - case EHvgaLandscape: - iconSize = KGridIconSizeInHvgaLand; - break; - case EWideLandscape: - iconSize = KGridIconSizeInWideLand; - break; - case EDrPortrait: - iconSize = KGridIconSizeInDoubleResPort; - break; - case EDrLandscape: - default: - iconSize = KGridIconSizeInDoubleResLand; - break; - } - return iconSize;*/ -// </cmail> } TSize CFSEmailUiLayoutHandler::MailIconSizeInThisResolution() const { FUNC_LOG; -// <cmail> Use layout data instead of hard-coded values TAknLayoutRect rect; rect.LayoutRect( TRect( 0, 0, 0, 0 ), AknLayoutScalable_Apps::list_single_dyc_row_pane_g1( 0 ).LayoutLine() ); return rect.Rect().Size(); - /*TSize mailListIconSize(0,0); - switch ( iScreenResolution ) - { - case EQvgaPortrait: - mailListIconSize = KMailListIconSizeInQvgaPort; - break; - case EQvgaLandscape: - mailListIconSize = KMailListIconSizeInQvgaLand; - break; - case EVgaPortrait: - mailListIconSize = KMailListIconSizeInVgaPort; - break; - case EVgaLandscape: - mailListIconSize = KMailListIconSizeInVgaLand; - break; - case EHvgaPortrait: - mailListIconSize = KMailListIconSizeInHvgaPort; - break; - case EHvgaLandscape: - mailListIconSize = KMailListIconSizeInHvgaLand; - break; - case EWideLandscape: - mailListIconSize = KMailListIconSizeInWideLand; - break; - case EDrPortrait: - mailListIconSize = KMailListIconSizeInDoubleResPort; - break; - case EDrLandscape: - default: - mailListIconSize = KMailListIconSizeInDoubleResLand; - break; - } - TAknUiZoom zoomLevel(EAknUiZoomNormal); - CAknEnv::Static()->GetCurrentGlobalUiZoom( zoomLevel ); - switch ( zoomLevel ) - { - // Make icon a little bit smaller in small zoom - case EAknUiZoomSmall: - { - mailListIconSize.iHeight-=2; - mailListIconSize.iWidth-=2; - } - break; - case EAknUiZoomLarge: - case EAknUiZoomNormal: - default: - { - } - break; - } - return mailListIconSize;*/ -// </cmail> Use layout data instead of hard-coded values } @@ -483,7 +354,7 @@ AknLayoutScalable_Apps::list_single_dyc_row_pane( 0 ), AknLayoutScalable_Apps::list_single_dyc_row_pane_g1( 0 ) ) ); TAknLayoutRect paneG1; - paneG1.LayoutRect( DropDownMenuListRect( ELeft ), g1Layout.LayoutLine() ); + paneG1.LayoutRect( DropDownMenuListRect( ELeft, EFalse ), g1Layout.LayoutLine() ); return paneG1.Rect().Size(); } else @@ -503,7 +374,6 @@ } } -// <cmail> // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::FolderListPaneRectInThisResolution // Folder list pane rect, taken from Avkon layouts @@ -516,7 +386,6 @@ itemRect.LayoutRect(aParent, AknLayoutScalable_Avkon::listscroll_gen_pane(0,0,0)); return itemRect.Rect(); } -// </cmail> // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::FolderListIndentation @@ -547,14 +416,13 @@ return itemRect.Rect().Size(); } -// <cmail> // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::DropDownMenuListRect // Selector ring image visual size // ----------------------------------------------------------------------------- // TRect CFSEmailUiLayoutHandler::DropDownMenuListRect( - const TDropDownMenuSide aSide ) const + const TDropDownMenuSide aSide, TBool aStretch ) const { FUNC_LOG; TRect mainPaneRect; @@ -562,7 +430,8 @@ mainPaneRect ); mainPaneRect.Move( 0, -mainPaneRect.iTl.iY ); TInt variety( aSide == ELeft ? 0 : 1 ); - if ( Layout_Meta_Data::IsLandscapeOrientation() ) + TBool landscape = Layout_Meta_Data::IsLandscapeOrientation(); + if ( landscape ) { // landscape orientation variety is portrait + 2 variety += 2; @@ -576,10 +445,62 @@ TAknLayoutRect menuPane; menuPane.LayoutRect( mainPaneRect, ddMenuPane.LayoutLine() ); - return menuPane.Rect(); + TRect rect = menuPane.Rect(); + if ( aStretch ) + { + rect.iBr.iY = mainPaneRect.iBr.iY; + + if( !landscape ) // landscape layout occupy the right side of the display + { + rect.iBr.iY -= ControlBarHeight(); + } + } + + // Calculate the placement next to the button (below or left side) + TRect buttonRect; + TRect cbr = GetControlBarRect(); + if( aSide == ELeft ) + { + buttonRect = GetControlBarFolderListButtonRect(); + } + else + { + buttonRect = GetControlBarSortButtonRect(); + } + buttonRect.Move( cbr.iTl ); // relative to control bar + if( landscape ) + { + TSize menuSize = rect.Size(); + + // position left from the button + rect.SetRect( TPoint( buttonRect.iTl.iX - menuSize.iWidth, + buttonRect.Center().iY - menuSize.iHeight / 2 ), menuSize ); + } + else + { + // position below the button + rect.Move( 0, buttonRect.iBr.iY - rect.iTl.iY ); + } + + // keep the popup menu inside the screen area + if( landscape ) + { + if( rect.iTl.iX < KPopupMargin ) + { + rect.Move( KPopupMargin - rect.iTl.iX , 0 ); + } + if( rect.iBr.iY > mainPaneRect.iBr.iY - KPopupMargin ) + { + rect.Move( 0, mainPaneRect.iBr.iY - rect.iBr.iY - KPopupMargin ); + } + } + if( rect.iTl.iY < KPopupMargin ) + { + rect.iTl.iY = KPopupMargin; + } + return rect; } -// </cmail> // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::SelectorVisualSizeInThisResolution @@ -637,7 +558,7 @@ TRect mainPaneRect; TAknLayoutRect listItem; AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); - listItem.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::list_single_dyc_row_pane( 0 ) ); + listItem.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::list_single_fs_dyc_pane( 0 ) ); return listItem.Rect().Height(); //</cmail> } @@ -651,15 +572,22 @@ TInt CFSEmailUiLayoutHandler::OneLineListItemHeight() const { FUNC_LOG; - //<cmail> TRect mainPaneRect; TAknLayoutRect listItem; AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); - listItem.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::list_single_dyc_row_pane( 0 ) ); + listItem.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::list_single_fs_dyc_pane( 0 ) ); return listItem.Rect().Height(); - //</cmail> } +TInt CFSEmailUiLayoutHandler::TwoLineListItemHeight() const + { + TRect mainPaneRect; + TAknLayoutRect listItem; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); + listItem.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::list_single_fs_dyc_pane( 1 ) ); + return listItem.Rect().Height(); + } + //<cmail> // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::FolderListOneLineItemHeight @@ -693,33 +621,13 @@ TInt CFSEmailUiLayoutHandler::ControlBarHeight() const { FUNC_LOG; - //<cmail> TRect mainPaneRect; TAknLayoutRect ctrlBarRect; AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); ctrlBarRect.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane( 0 ) ); return ctrlBarRect.Rect().Height(); - //</cmail> } -// ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::ControlBarHeight -// Control bar text height in twips -// ----------------------------------------------------------------------------- -// -/* -TInt CFSEmailUiLayoutHandler::ControlBarTextHeight() const - { - TRect mainPaneRect; - TAknLayoutText ctrlBarText; - TInt orientation( Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0 ); - AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); - ctrlBarText.LayoutText( mainPaneRect, AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane_t1( orientation ) ); - return ctrlBarText.Font()->FontSpecInTwips().iHeight; - } -*/ -//</cmail> Platform layout change - // <cmail> changes to avoid unnecessary creating new text styles objects. CAlfTextStyle* CFSEmailUiLayoutHandler::FSTextStyleFromIdL( TFSEmailFont aFontId ) { @@ -1515,16 +1423,13 @@ return layoutRect.Rect().Size(); // </cmail> Platform layout changes } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ViewerActionMenuIconMargin // ----------------------------------------------------------------------------- TInt CFSEmailUiLayoutHandler::ViewerActionMenuIconMargin() const { FUNC_LOG; - // <cmail> Platform layout changes - /* - return KViewerActionMenuIconMargin; - */ if (AknLayoutUtils::LayoutMirrored()) { TAknLayoutRect layoutRect; @@ -1541,8 +1446,8 @@ layoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::list_single_cmail_header_detail_pane_g2( 0 ) ); return Abs( x - layoutRect.Rect().iBr.iX ); } - // </cmail> Platform layout changes } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ViewerSelectorOpacity // ----------------------------------------------------------------------------- @@ -1551,30 +1456,19 @@ FUNC_LOG; return KViewerSelectorOpacity; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ViewerRightMarginInPixels // ----------------------------------------------------------------------------- TInt CFSEmailUiLayoutHandler::ViewerRightMarginInPixels() const { FUNC_LOG; - // <cmail> Platform layout changes - /* - if ( AknLayoutUtils::LayoutMirrored() ) - { - return KViewerLeftMarginWidthInPixels; - } - else - { - return KViewerRightMarginWidthInPixels; - } - */ const TRect cmailPaneRect( ListCmailPaneRect() ); TAknLayoutRect layoutRect; layoutRect.LayoutRect( cmailPaneRect, AknLayoutScalable_Apps::list_single_cmail_header_caption_pane() ); TAknLayoutText captionTextRect; captionTextRect.LayoutText( layoutRect.Rect(), AknLayoutScalable_Apps::list_single_cmail_header_caption_pane_t1() ); return Abs( cmailPaneRect.iBr.iX - captionTextRect.TextRect().iBr.iX ); - // </cmail> Platform layout changes } // ----------------------------------------------------------------------------- @@ -1583,24 +1477,12 @@ TInt CFSEmailUiLayoutHandler::ViewerLeftMarginInPixels() const { FUNC_LOG; - // <cmail> Platform layout changes - /* - if ( AknLayoutUtils::LayoutMirrored() ) - { - return KViewerRightMarginWidthInPixels; - } - else - { - return KViewerLeftMarginWidthInPixels; - } - */ const TRect cmailPaneRect( ListCmailPaneRect() ); TAknLayoutRect layoutRect; layoutRect.LayoutRect( cmailPaneRect, AknLayoutScalable_Apps::list_single_cmail_header_caption_pane() ); TAknLayoutText captionTextRect; captionTextRect.LayoutText( layoutRect.Rect(), AknLayoutScalable_Apps::list_single_cmail_header_caption_pane_t1() ); return Abs( cmailPaneRect.iTl.iX - captionTextRect.TextRect().iTl.iX ); - // </cmail> Platform layout changes } // ----------------------------------------------------------------------------- @@ -1630,6 +1512,7 @@ } return sizeWithCurrentResolution; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ViewerWaterMarkPositionFromBottomRightCornerInThisResolution // ----------------------------------------------------------------------------- @@ -1657,6 +1540,7 @@ } return placeFromBottomRightCorner; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ComposerFieldBorderColor // ----------------------------------------------------------------------------- @@ -1673,6 +1557,7 @@ FUNC_LOG; return GetSkinColor( KAknsIIDFsOtherColors, EAknsCIFsOtherColorsCG12, KRgbWhite ); } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ComposerHeaderFieldTextColor // ----------------------------------------------------------------------------- @@ -1681,6 +1566,7 @@ FUNC_LOG; return GetSkinColor( KAknsIIDFsTextColors, EAknsCIFsTextColorsCG4, KRgbBlack ); } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ComposerBodyFieldTextColor // ----------------------------------------------------------------------------- @@ -1689,6 +1575,7 @@ FUNC_LOG; return GetSkinColor( KAknsIIDFsTextColors, EAknsCIFsTextColorsCG3, KRgbBlack ); } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ComposerDimmedTextColor // ----------------------------------------------------------------------------- @@ -1697,6 +1584,7 @@ FUNC_LOG; return GetSkinColor( KAknsIIDFsTextColors, EAknsCIFsTextColorsCG18, KRgbGray ); } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::MaxPcsMatches // ----------------------------------------------------------------------------- @@ -1705,6 +1593,7 @@ FUNC_LOG; return KMaxPcsMatches; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::PcsPopupHighlightColor // ----------------------------------------------------------------------------- @@ -1713,6 +1602,7 @@ FUNC_LOG; return KPcsPopupHighlightColor; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::PcsPopupDimmedFontColor // ----------------------------------------------------------------------------- @@ -1721,20 +1611,18 @@ FUNC_LOG; return KPcsPopupDimmedFontColor; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ListTextureNodeExpandedSize // ----------------------------------------------------------------------------- TInt CFSEmailUiLayoutHandler::ListTextureNodeExpandedSize() const { FUNC_LOG; - //<cmail> TRect mainPaneRect; TAknLayoutRect listItem; AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); listItem.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::list_single_dyc_row_pane_g1( 0 ) ); return listItem.Rect().Height(); - //return KListTextureNodeExpandedSize; - //</cmail> } // ----------------------------------------------------------------------------- @@ -1765,22 +1653,18 @@ TInt CFSEmailUiLayoutHandler::ListControlBarMailboxDefaultIconSize() const { FUNC_LOG; - // <cmail> Platform layout change - //return KListControlBarMailboxDefaultIconSize; - return GetControlBarMailboxIconSize().iWidth; - // </cmail> Platform layout change + return GetControlBarMailboxIconRect().Size().iWidth; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::EMailListBarBgIconSize // ----------------------------------------------------------------------------- TInt CFSEmailUiLayoutHandler::EMailListBarBgIconSize() const { FUNC_LOG; - // <cmail> Platform layout change return GetControlBarRect().Size().iHeight; - //return KEMailListBarBgIconSize; - // </cmail> } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ListTextureMailboxDefaultIconSize // ----------------------------------------------------------------------------- @@ -1789,24 +1673,22 @@ FUNC_LOG; return KListTextureMailboxDefaultIconSize; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::EListTextureSelectorSize // ----------------------------------------------------------------------------- TInt CFSEmailUiLayoutHandler::EListTextureSelectorSize() const { FUNC_LOG; - // <cmail> Platform layout change return OneLineListItemHeight(); - //return KEListTextureSelectorSize; - // </cmail> } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ListControlMenuIconSize // ----------------------------------------------------------------------------- TInt CFSEmailUiLayoutHandler::ListControlMenuIconSize() const { FUNC_LOG; - // <cmail> Platform layout change TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); mainPaneRect.Move(-mainPaneRect.iTl); @@ -1815,13 +1697,11 @@ TAknLayoutRect iconRect; iconRect.LayoutRect(controlBarRect.Rect(), AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane_g1(0)); return iconRect.Rect().Height(); - //return KListControlMenuIconSize; - // </cmail> } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::AttachmentIconSize // ----------------------------------------------------------------------------- -// <cmail> TSize CFSEmailUiLayoutHandler::AttachmentIconSize() const { FUNC_LOG; @@ -1829,9 +1709,8 @@ rect.LayoutRect( TRect(0,0,0,0), AknLayoutScalable_Apps::list_single_dyc_row_pane_g1( 0 ).LayoutLine() ); return rect.Rect().Size(); - //return KAttachmentIconSize; -// </cmail> } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ViewerHighlightTextureSize // ----------------------------------------------------------------------------- @@ -1840,6 +1719,7 @@ FUNC_LOG; return KViewerHighlightTextureSize; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ControlBarArrowTextureXSize // ----------------------------------------------------------------------------- @@ -1848,6 +1728,7 @@ FUNC_LOG; return KControlBarArrowTextureXSize; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::ControlBarArrowTextureYSize // ----------------------------------------------------------------------------- @@ -1856,6 +1737,7 @@ FUNC_LOG; return KControlBarArrowTextureYSize; } + // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::GetSkinColor // ----------------------------------------------------------------------------- @@ -1879,8 +1761,6 @@ return color; } -// <cmail> Use layout data instead of hardcoded values - // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::GetControlBarMailboxIconRect // ----------------------------------------------------------------------------- @@ -1901,25 +1781,38 @@ { iconRect.LayoutRect(controlBarRect.Rect(), AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane_g1(0)); } + return iconRect.Rect(); } // ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::GetControlBarMailboxIconPos -// ----------------------------------------------------------------------------- -TPoint CFSEmailUiLayoutHandler::GetControlBarMailboxIconPos() const +TRect CFSEmailUiLayoutHandler::GetControlBarNewEmailButtonRect() const { FUNC_LOG; - return GetControlBarMailboxIconRect().iTl; - } - -// ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::GetControlBarMailboxIconSize -// ----------------------------------------------------------------------------- -TSize CFSEmailUiLayoutHandler::GetControlBarMailboxIconSize() const - { - FUNC_LOG; - return GetControlBarMailboxIconRect().Size(); + TAknLayoutRect iconRect; + TRect cbr = GetControlBarRect(); + if( Layout_Meta_Data::IsLandscapeOrientation() ) + { + iconRect.LayoutRect( cbr, + AknLayoutScalable_Apps::cmail_ddmenu_btn02_pane(3) ); + } + else + { + if ( AknLayoutUtils::LayoutMirrored() ) + { + iconRect.LayoutRect( cbr, + AknLayoutScalable_Apps::cmail_ddmenu_btn03_pane(2) ); + } + else + { + iconRect.LayoutRect( cbr, + AknLayoutScalable_Apps::cmail_ddmenu_btn01_pane(2) ); + } + } + + TRect rect = iconRect.Rect(); + rect.Move( -cbr.iTl ); + return rect; } // ----------------------------------------------------------------------------- @@ -1928,39 +1821,23 @@ TRect CFSEmailUiLayoutHandler::GetControlBarFolderListButtonRect() const { FUNC_LOG; - TRect mainPaneRect; - AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); - mainPaneRect.Move(-mainPaneRect.iTl); - TAknLayoutRect controlBarRect; - controlBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane(0)); + TAknLayoutRect folderListButtonRect; - if ( AknLayoutUtils::LayoutMirrored() ) + TRect cbr = GetControlBarRect(); + if( Layout_Meta_Data::IsLandscapeOrientation() ) { - folderListButtonRect.LayoutRect(controlBarRect.Rect(), AknLayoutScalable_Apps::main_sp_fs_ctrlbar_button_pane_cp01(0)); + folderListButtonRect.LayoutRect( cbr, + AknLayoutScalable_Apps::cmail_ddmenu_btn02_pane_cp1(3) ); } else { - folderListButtonRect.LayoutRect(controlBarRect.Rect(), AknLayoutScalable_Apps::main_sp_fs_ctrlbar_ddmenu_pane(0)); + folderListButtonRect.LayoutRect( cbr, + AknLayoutScalable_Apps::cmail_ddmenu_btn02_pane(2) ); } - return folderListButtonRect.Rect(); - } - -// ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::GetControlBarFolderListButtonPos -// ----------------------------------------------------------------------------- -TPoint CFSEmailUiLayoutHandler::GetControlBarFolderListButtonPos() const - { - FUNC_LOG; - return GetControlBarFolderListButtonRect().iTl; - } - -// ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::GetControlBarFolderListButtonSize -// ----------------------------------------------------------------------------- -TSize CFSEmailUiLayoutHandler::GetControlBarFolderListButtonSize() const - { - FUNC_LOG; - return GetControlBarFolderListButtonRect().Size(); + + TRect rect = folderListButtonRect.Rect(); + rect.Move( -cbr.iTl ); + return rect; } // ----------------------------------------------------------------------------- @@ -1969,39 +1846,31 @@ TRect CFSEmailUiLayoutHandler::GetControlBarSortButtonRect() const { FUNC_LOG; - TRect mainPaneRect; - AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); - mainPaneRect.Move(-mainPaneRect.iTl); - TAknLayoutRect controlBarRect; - controlBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane(0)); + TAknLayoutRect sortButtonRect; - if ( AknLayoutUtils::LayoutMirrored() ) + TRect cbr = GetControlBarRect(); + if( Layout_Meta_Data::IsLandscapeOrientation() ) { - sortButtonRect.LayoutRect(controlBarRect.Rect(), AknLayoutScalable_Apps::main_sp_fs_ctrlbar_ddmenu_pane(0)); + sortButtonRect.LayoutRect( cbr, + AknLayoutScalable_Apps::cmail_ddmenu_btn02_pane_cp2(3) ); } else { - sortButtonRect.LayoutRect(controlBarRect.Rect(), AknLayoutScalable_Apps::main_sp_fs_ctrlbar_button_pane_cp01(0)); - } - return sortButtonRect.Rect(); - } - -// ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::GetControlBarSortButtonPos -// ----------------------------------------------------------------------------- -TPoint CFSEmailUiLayoutHandler::GetControlBarSortButtonPos() const - { - FUNC_LOG; - return GetControlBarSortButtonRect().iTl; - } - -// ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::GetControlBarSortButtonSize -// ----------------------------------------------------------------------------- -TSize CFSEmailUiLayoutHandler::GetControlBarSortButtonSize() const - { - FUNC_LOG; - return GetControlBarSortButtonRect().Size(); + if ( AknLayoutUtils::LayoutMirrored() ) + { + sortButtonRect.LayoutRect( cbr, + AknLayoutScalable_Apps::cmail_ddmenu_btn01_pane(2) ); + } + else + { + sortButtonRect.LayoutRect( cbr, + AknLayoutScalable_Apps::cmail_ddmenu_btn03_pane(2) ); + } + } + + TRect r = sortButtonRect.Rect(); + r.Move( -cbr.iTl ); + return r; } // ----------------------------------------------------------------------------- @@ -2016,7 +1885,7 @@ TAknLayoutRect controlBarRect; controlBarRect.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane(0 ) ); TAknLayoutRect iconRect; - // <cmail> + if ( AknLayoutUtils::LayoutMirrored() ) { iconRect.LayoutRect( controlBarRect.Rect(), AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane_g1( 0 ) ); @@ -2025,55 +1894,64 @@ { iconRect.LayoutRect( controlBarRect.Rect(), AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane_g2( 0 ) ); } - // </cmail> + return iconRect.Rect(); } // ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::GetControlBarConnectionIconPos -// ----------------------------------------------------------------------------- -TPoint CFSEmailUiLayoutHandler::GetControlBarConnectionIconPos() const - { - FUNC_LOG; - return GetControlBarConnectionIconRect().iTl; - } - -// ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::GetControlBarConnectionIconSize -// ----------------------------------------------------------------------------- -TSize CFSEmailUiLayoutHandler::GetControlBarConnectionIconSize() const - { - FUNC_LOG; - return GetControlBarConnectionIconRect().Size(); - } - -// ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::GetControlBarRect // ----------------------------------------------------------------------------- TRect CFSEmailUiLayoutHandler::GetControlBarRect() const { FUNC_LOG; - //TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; //<cmail> + TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 3 : 2; + TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); mainPaneRect.Move(-mainPaneRect.iTl); + + TRect emailRect = mainPaneRect; + TAknLayoutRect emailPaneRect; + emailPaneRect.LayoutRect(mainPaneRect, + AknLayoutScalable_Apps::main_sp_fs_email_pane()); + emailRect = emailPaneRect.Rect(); + TAknLayoutRect controlBarRect; - controlBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane(0)); //<cmail> - return controlBarRect.Rect(); + controlBarRect.LayoutRect( emailRect, + AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane(var)); + TRect rect = controlBarRect.Rect(); + + return rect; } // ----------------------------------------------------------------------------- -// CFSEmailUiLayoutHandler::GetControlBarRect +// CFSEmailUiLayoutHandler::GetListRect // ----------------------------------------------------------------------------- -TRect CFSEmailUiLayoutHandler::GetListRect() const +TRect CFSEmailUiLayoutHandler::GetListRect( TBool aControlsOnTop ) const { FUNC_LOG; + TBool landscape = Layout_Meta_Data::IsLandscapeOrientation(); + TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 3 : 2; + TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); mainPaneRect.Move(-mainPaneRect.iTl); + TAknLayoutRect listRect; - listRect.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::main_sp_fs_listscroll_pane_te_cp01( 0 ) ); - return listRect.Rect(); + listRect.LayoutRect( mainPaneRect, + AknLayoutScalable_Apps::main_sp_fs_listscroll_pane_te_cp01( var )); + TRect rect = listRect.Rect(); + + // if control bar is required, reserve space on top of the listbox + if( aControlsOnTop && landscape ) + { + TAknLayoutRect listRect2; + listRect2.LayoutRect( mainPaneRect, + AknLayoutScalable_Apps::main_sp_fs_listscroll_pane_te_cp01( 0 )); + rect.Intersection(listRect2.Rect()); + } + + return rect; } // ----------------------------------------------------------------------------- @@ -2082,7 +1960,6 @@ TAknLayoutText CFSEmailUiLayoutHandler::GetSearchListHeaderTextLayout() const { FUNC_LOG; - //TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); mainPaneRect.Move(-mainPaneRect.iTl); @@ -2159,10 +2036,6 @@ return layoutRect.Rect(); } -// </cmail> Platform layout change - -// <cmail> new methods - // ----------------------------------------------------------------------------- // CFSEmailUiLayoutHandler::TitleCaptionPadding // @@ -2244,7 +2117,5 @@ return Abs( menuListPaneRect.iTl.iY - menuPaneRect.iTl.iY ); } -// </cmail> - // End of file
--- a/emailuis/emailui/src/FreestyleEmailUiMailListModel.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiMailListModel.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -467,11 +467,11 @@ break; case EFSMailSortByUnread: { - TInt compVal1 = 1; - if ( message1.IsFlagSet(EFSMsgFlag_Read) ) { compVal1 = 0; } + TInt compVal1 = 0; + if ( message1.IsFlagSet(EFSMsgFlag_Read) ) { compVal1 = 1; } - TInt compVal2 = 1; - if ( message2.IsFlagSet(EFSMsgFlag_Read) ) { compVal2 = 0; } + TInt compVal2 = 0; + if ( message2.IsFlagSet(EFSMsgFlag_Read) ) { compVal2 = 1; } retVal = compVal1 - compVal2; }
--- a/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -39,22 +39,17 @@ #include "fstreeplaintwolineitemvisualizer.h" #include "CFSMailCommon.h" #include "ceuiemaillisttouchmanager.h" -//</cmail> #include "FSEmailBuildFlags.h" -//<cmail> #include "cfsccontactactionmenu.h" #include "mfsccontactactionmenumodel.h" -//</cmail> #include <hlplch.h> #include <AknIconArray.h> -// <cmail> SF #include <alf/alfdecklayout.h> #include <alf/alfcontrolgroup.h> #include <alf/alfframebrush.h> #include <alf/alfevent.h> #include <alf/alfstatic.h> -// </cmail> #include <aknnotewrappers.h> #include <msvapi.h> @@ -76,6 +71,7 @@ #include "cesmricalviewer.h" //</cmail> #include <aknstyluspopupmenu.h> +#include <akntoolbar.h> // INTERNAL INCLUDES #include "FreestyleEmailUiUtilities.h" @@ -103,15 +99,7 @@ // CONST VALUES const TInt KControlBarTransitionTime = 250; -//<cmail> -//const TInt KFirstButtonStartPosX = 25; -//const TInt KControlBarMailboxIconWidth = 20; -//const TInt KControlButtonPosY = 3; -//const TInt KControlButtonSeparation = 10; -//</cmail> const TInt KMaxPreviewPaneLength = 60; -//const TInt KInitialPreviewUpdate = 5; -//const TInt KSyncIconTimerDelay = 18000; const TInt KMsgUpdaterTimerDelay = 2500000; // Time to update list, 2,5sec static const TInt KMsgDeletionWaitNoteAmount = 5; _LIT( KMissingPreviewDataMarker, "..." ); @@ -252,6 +240,8 @@ iControlBarControl->SetSelectorImageL( cbSelectorBrush ); CleanupStack::Pop( cbSelectorBrush ); // ownership transferred to control bar + iNewEmailText = StringLoader::LoadL( R_COMMAND_AREA_NEW_EMAIL ); + // Set menu, mark and background icons iMailTreeListVisualizer->SetMarkIcon( iAppUi.FsTextureManager()->TextureByIndex( EListControlMarkIcon ) ); iMailTreeListVisualizer->SetMenuIcon( iAppUi.FsTextureManager()->TextureByIndex( EListControlMenuIcon ) ); @@ -299,7 +289,8 @@ : CFsEmailUiViewBase( aMailListControlGroup, *aAppUi ), iEnv( aEnv ), iListMarkItemsState( ETrue ), //Initlly list has no markings - iMoveToFolderOngoing( EFalse ) + iMoveToFolderOngoing( EFalse ), + iStylusPopUpMenuLaunched( EFalse ) { FUNC_LOG; } @@ -311,7 +302,6 @@ CFSEmailUiMailListVisualiser::~CFSEmailUiMailListVisualiser() { FUNC_LOG; - //<cmail> if ( iMailFolder ) { delete iMailFolder; @@ -320,8 +310,8 @@ delete iTouchManager; delete iStylusPopUpMenu; - //</cmail> delete iMailList; + delete iNewEmailText; // Don't construct this anywhere else than in constructor. // Don't delete anywhere else thatn here to avoid NULL checks. @@ -463,7 +453,7 @@ { FUNC_LOG; // New Items - CFSEmailUiMailListModelItem* newItem(NULL); + CFSEmailUiMailListModelItem* newItem = NULL; // Draw first separator if there are messages. if ( aMessages.Count() && iNodesInUse == EListControlSeparatorEnabled ) @@ -951,11 +941,6 @@ // // --------------------------------------------------------------------------- // -// <cmail> Toolbar -/*void CFSEmailUiMailListVisualiser::DoActivateL(const TVwsViewId& aPrevViewId, - TUid aCustomMessageId, - const TDesC8& aCustomMessage)*/ -// </cmail> Toolbar void CFSEmailUiMailListVisualiser::ChildDoActivateL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage) @@ -983,6 +968,11 @@ forwardNavigation = ETrue; } + if( iAppUi.CurrentFixedToolbar() ) + { + iAppUi.CurrentFixedToolbar()->SetToolbarVisibility( EFalse ); + } + // Set control bar and list layout size always in activation TRect clientRect = iAppUi.ClientRect(); iScreenAnchorLayout->SetSize( clientRect.Size() ); @@ -1167,10 +1157,9 @@ // Check sync icon timer and sync status ConnectionIconHandling(); -// <cmail> iMailList->HideListL(); iMailList->ShowListL(); -// </cmail> + // REBUILD TREE LIST IF NECESSARY if ( refreshNeeded ) { @@ -1189,14 +1178,7 @@ else { // hide & show list to force it to adept to changed screen size - // <cmail> - /*if ( iCurrentClientRect != clientRect ) - { - iMailList->HideListL(); - iMailList->ShowListL(); */ - SetListAndCtrlBarFocusL(); // ShowListL() makes list focused and this may need to be reverted -// } - // </cmail> + SetListAndCtrlBarFocusL(); // ShowListL() makes list focused and this may need to be reverted UnmarkAllItemsL(); if ( aCustomMessageId == TUid::Uid(KMailSettingsReturnFromPluginSettings) ) @@ -1221,14 +1203,20 @@ // Inform MR observer if needed, special MR case, returning from attachment list iAppUi.MailViewer().CompletePendingMrCommand(); -// <cmail> + //Make sure that correct component is set to focused. if ( iFocusedControl == EMailListComponent ) + { SetTreeListFocusedL(); + } else + { SetControlBarFocusedL(); -// </cmail> - + iControlBarControl->MakeSelectorVisible( iAppUi.IsFocusShown() ); + } + UpdateButtonTextsL(); + + FocusVisibilityChange( iAppUi.IsFocusShown() ); iAppUi.ShowTitlePaneConnectionStatus(); } @@ -1238,10 +1226,17 @@ // void CFSEmailUiMailListVisualiser::SetStatusBarLayout() { - if ( StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT ) + TInt res = R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT; + if( Layout_Meta_Data::IsLandscapeOrientation() ) + { + // landscape must use different layout + res = R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT; + } + + if ( StatusPane()->CurrentLayoutResId() != res ) { TRAP_IGNORE( - StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT )); + StatusPane()->SwitchLayoutL( res )); } } @@ -1539,6 +1534,14 @@ // moving from outbox is not allowed otherwise aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsMove, ETrue ); } + else if ( currentFolderType == EFSDraftsFolder ) + { + // move from drafts to drafts is not allowed + aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsMoveToDrafts, ETrue ); + // moving from drafts folder is not allowed + aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsMove, ETrue ); + } + // Handle rest of the folders else { @@ -2438,9 +2441,15 @@ if ( iFirstStartCompleted ) // Safety { + if ( aType == EScreenLayoutChanged ) + { + SetStatusBarLayout(); + UpdateButtonTextsL(); + } + if ( aType == ESkinChanged ) { - iSkinChanged = ETrue; + UpdateTheme(); } else { @@ -2469,17 +2478,91 @@ // // --------------------------------------------------------------------------- // -void CFSEmailUiMailListVisualiser::HandleDynamicVariantSwitchOnBackgroundL( CFsEmailUiViewBase::TDynamicSwitchType aType ) +void CFSEmailUiMailListVisualiser::HandleDynamicVariantSwitchOnBackgroundL( + CFsEmailUiViewBase::TDynamicSwitchType aType ) { FUNC_LOG; CFsEmailUiViewBase::HandleDynamicVariantSwitchOnBackgroundL( aType ); if ( aType == ESkinChanged ) { - iSkinChanged = ETrue; + UpdateTheme(); + } + else if ( aType == EScreenLayoutChanged ) + { + UpdateButtonTextsL(); + } + } + +// --------------------------------------------------------------------------- +// Update texts for command area buttons +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateButtonTextsL() + { + if ( !Layout_Meta_Data::IsLandscapeOrientation() ) + { + // No texts in portrait mode + iNewEmailButton->SetTextL( KNullDesC() ); + iSortButton->SetTextL( KNullDesC() ); + } + else + { + // Set button text if necessary + HBufC* buttonText = GetSortButtonTextLC(); + if ( buttonText ) + { + iSortButton->SetTextL( *buttonText ); + CleanupStack::PopAndDestroy( buttonText ); + } + + iNewEmailButton->SetTextL( *iNewEmailText ); } } // --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CFSEmailUiMailListVisualiser::HitTest( + const CAlfControl& aControl, const TPoint& aPoint ) const + { + FUNC_LOG; + TBool contains( EFalse ); + const TInt visualCount( aControl.VisualCount() ); + for( TInt index( 0 ); index < visualCount && !contains; ++index ) + { + TRect rect( aControl.Visual( index ).DisplayRectTarget() ); + if( rect.Contains( aPoint ) ) + { + contains = ETrue; + } + } + return contains; + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateTheme() + { + iSkinChanged = ETrue; + + TRgb focusedTextColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor(); + TRgb normalTextColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor(); + + iNewEmailButton->SetNormalTextColor( normalTextColor ); + iNewEmailButton->SetFocusedTextColor( focusedTextColor ); + + iFolderListButton->SetNormalTextColor( normalTextColor ); + iFolderListButton->SetFocusedTextColor( focusedTextColor ); + + iSortButton->SetNormalTextColor( normalTextColor ); + iSortButton->SetFocusedTextColor( focusedTextColor ); + } + +// --------------------------------------------------------------------------- // HandleForegroundEventL // Function checks in foregroundevent that whether settings have changed and // If there is a need to refresh the list. @@ -2597,13 +2680,27 @@ CleanupClosePushL( actionTargetItems ); GetActionsTargetEntriesL( actionTargetItems ); - switch(aCommand) + // Check if the focus needs to be removed. + if ( aCommand == KErrCancel || aCommand == EFsEmailUiCmdActionsDelete || + aCommand == EFsEmailUiCmdMarkAsRead || + aCommand == EFsEmailUiCmdMarkAsUnread || + aCommand == EFsEmailUiCmdActionsMove || + aCommand == EFsEmailUiCmdMarkUnmarkToggle ) + { + // We end up here if the user selects an option from the pop up menu + // or exits the menu by tapping outside of it's area. + // Remove the focus from a list item if an item is focused. + iStylusPopUpMenuLaunched = EFalse; + FocusVisibilityChange( EFalse ); + } + + switch ( aCommand ) { case EAknSoftkeyOpen: { - if (!iAppUi.IsTimerFocusShown()) + if( !iAppUi.IsFocusShown() ) { - iAppUi.StartFocusRemovalTimer(); + iAppUi.SetFocusVisibility( ETrue ); break; } } @@ -2626,12 +2723,12 @@ break; case EAknSoftkeyChange: { - if (!iAppUi.IsTimerFocusShown()) + if( !iAppUi.IsFocusShown() ) { - iAppUi.StartFocusRemovalTimer(); + iAppUi.SetFocusVisibility( ETrue ); break; } - if ( iFocusedControl == EControlBarComponent ) + if( iFocusedControl == EControlBarComponent ) { TInt focusedButtonId = iControlBarControl->GetFocusedButton()->Id(); if ( focusedButtonId == iFolderListButtonId ) @@ -2642,7 +2739,7 @@ //</cmail> iAppUi.ShowFolderListInPopupL( FolderId(), this, iFolderListButton ); } - else if ( focusedButtonId == iSortButtonId ) + else if( focusedButtonId == iSortButtonId ) { TFSFolderType folderType; if( iMailFolder ) @@ -2662,7 +2759,7 @@ //Set touchmanager not active for preventing getting events. DisableMailList(ETrue); //</cmail> - iAppUi.ShowSortListInPopupL( iCurrentSortCriteria.iField, folderType, this, iSortButton ); + iAppUi.ShowSortListInPopupL( iCurrentSortCriteria, folderType, this, iSortButton ); // <cmail> // } // </cmail> @@ -2834,7 +2931,6 @@ { DeleteMessagesL(); } - UnmarkAllItemsL(); } break; case EFsEmailUiCmdCompose: @@ -2920,9 +3016,9 @@ } break; case EFsEmailUiCmdCollapse: - if (!iAppUi.IsTimerFocusShown()) + if( !iAppUi.IsFocusShown() ) { - iAppUi.StartFocusRemovalTimer(); + iAppUi.SetFocusVisibility( ETrue ); break; } // Safety check, ignore command if the list is empty @@ -2932,9 +3028,9 @@ } break; case EFsEmailUiCmdExpand: - if (!iAppUi.IsTimerFocusShown()) + if( !iAppUi.IsFocusShown() ) { - iAppUi.StartFocusRemovalTimer(); + iAppUi.SetFocusVisibility( ETrue ); break; } // Safety check, ignore command if the list is empty @@ -3005,8 +3101,6 @@ if ( supportsSync ) { iAppUi.StopActiveMailBoxSyncL(); - CFSMailBox* mb = iAppUi.GetActiveMailbox(); - TDesC* mbName = &mb->GetName(); } } break; @@ -3018,7 +3112,6 @@ case EFsEmailUiCmdGoOnline: { CFSMailBox* mb = iAppUi.GetActiveMailbox(); - TDesC* mbName = &mb->GetName(); iAppUi.ManualMailBoxSync( ETrue ); mb->GoOnlineL(); } @@ -3078,6 +3171,21 @@ TFSMailMsgId folderID; folderID.SetNullId(); // Selection is popped up with NULL MoveMsgsToFolderL( folderID ); + + TBool supportsSync = iAppUi.GetActiveMailbox()->HasCapability( EFSMBoxCapaSupportsSync ); + if ( supportsSync ) + { + //If synchronizing is ongoing and a new sync is started we ignore it + if(!GetLatestSyncState()) + { + iAppUi.SyncActiveMailBoxL(); + + // Sync the mailbox + ManualMailBoxSync(ETrue); + + iAppUi.ManualMailBoxSync( ETrue ); + } + } } break; case EFsEmailUiCmdActionsMoveToDrafts: @@ -3115,12 +3223,6 @@ { HandleCommandL(EFsEmailUiCmdMarkMark); } - } - else if ( item->ModelItemType() == ETypeSeparator ) - { - // Mark items. - MarkItemsUnderSeparatorL( ETrue, HighlightedIndex() ); - iListMarkItemsState = ETrue; // Enable mark mode } } } @@ -3128,6 +3230,7 @@ case EFsEmailUiCmdGoToSwitchFolder: { iControlBarControl->SetFocusByIdL( iFolderListButtonId ); + iControlBarControl->MakeSelectorVisible( IsFocusShown() ); iFocusedControl = EControlBarComponent; iMailList->SetFocusedL( EFalse ); } @@ -3135,6 +3238,7 @@ case EFsEmailUiCmdGoToSwitchSorting: { iControlBarControl->SetFocusByIdL( iSortButtonId ); + iControlBarControl->MakeSelectorVisible( IsFocusShown() ); iFocusedControl = EControlBarComponent; iMailList->SetFocusedL( EFalse ); } @@ -3203,8 +3307,11 @@ } break; default: + { + // No default action. + } break; - } + } // switch ( aCommand ) CleanupStack::PopAndDestroy( &actionTargetItems ); } @@ -3575,23 +3682,39 @@ // Only handle key events if ( aEvent.IsPointerEvent() ) { - switch( iFocusedControl ) + if( aEvent.PointerDown() ) { - case EMailListComponent: + // If pointer down event was made on control bar area + // focus needs to be changed to control bar control, if it + // didn't already have focus. + if( HitTest( *iControlBarControl, aEvent.PointerEvent().iPosition ) ) { - result = iMailList->TreeControl()->OfferEventL( aEvent ); - break; + if( iFocusedControl != EControlBarComponent ) + { + SetControlBarFocusedL(); + } } - case EControlBarComponent: + else { - result = static_cast<CAlfControl*>( - iControlBarControl )->OfferEventL( aEvent ); - break; + // if pointer up event was not made on control bar area + // then focus need to be set to mail list component if it + // didn't already have focus. + if( iFocusedControl != EMailListComponent ) + { + SetTreeListFocusedL(); + } } - default: - { - break; - } + } + + // Offer event to focused control. + if( iFocusedControl == EMailListComponent ) + { + result = iMailList->TreeControl()->OfferEventL( aEvent ); + } + else // iFocusedControl == EControlBarComponent + { + result = static_cast<CAlfControl*>( + iControlBarControl )->OfferEventL( aEvent ); } } return result; @@ -3601,8 +3724,14 @@ // Swap right and left controls in mirrored layout if ( AknLayoutUtils::LayoutMirrored() ) { - if ( scanCode == EStdKeyRightArrow ) scanCode = EStdKeyLeftArrow; - else if ( scanCode == EStdKeyLeftArrow ) scanCode = EStdKeyRightArrow; + if ( scanCode == EStdKeyRightArrow ) + { + scanCode = EStdKeyLeftArrow; + } + else if ( scanCode == EStdKeyLeftArrow ) + { + scanCode = EStdKeyRightArrow; + } } // Toggle mark items state when shift key is pressed or released @@ -3705,10 +3834,9 @@ || (scanCode == EStdKeyDeviceA) || (scanCode ==EStdKeyDevice3)) { - TBool wasActive = iAppUi.StartFocusRemovalTimer(); // If the focus was not active already, ignore the key press - if( !wasActive ) + if( !iAppUi.SetFocusVisibility( ETrue ) ) { return ETrue; } @@ -3790,7 +3918,7 @@ //Set touchmanager not active for preventing getting events. DisableMailList(ETrue); //</cmail> - iAppUi.ShowSortListInPopupL( iCurrentSortCriteria.iField, folderType, this, iSortButton ); + iAppUi.ShowSortListInPopupL( iCurrentSortCriteria, folderType, this, iSortButton ); } else { @@ -3806,7 +3934,6 @@ break; case EStdKeyLeftArrow: { - iControlBarControl->MakeSelectorVisible( IsFocusShown() ); if( iControlBarControl && iFocusedControl == EMailListComponent ) { HandleCommandL( EFsEmailUiCmdGoToSwitchSorting ); @@ -3815,8 +3942,8 @@ else if( ( iControlBarControl ) && ( iFocusedControl == EControlBarComponent ) ) { - TInt focusedButtonId = iControlBarControl->GetFocusedButton()->Id(); + iControlBarControl->MakeSelectorVisible( IsFocusShown() ); if ( focusedButtonId == iFolderListButtonId ) { if ( iModel->Count() ) @@ -3846,7 +3973,6 @@ break; case EStdKeyRightArrow: { - iControlBarControl->MakeSelectorVisible( IsFocusShown() ); // Show toolbar if there is data on the list // <cmail> if ( iFocusedControl == EMailListComponent && iModel->Count() ) @@ -3868,6 +3994,7 @@ ( iFocusedControl == EControlBarComponent ) ) { TInt focusedButtonId = iControlBarControl->GetFocusedButton()->Id(); + iControlBarControl->MakeSelectorVisible( IsFocusShown() ); if ( focusedButtonId == iFolderListButtonId ) { iFocusedControl = EControlBarComponent; @@ -4137,7 +4264,7 @@ { //Set touchmanager not active for preventing getting events. DisableMailList(ETrue); - iAppUi.ShowSortListInPopupL( iCurrentSortCriteria.iField, folderType, this, iSortButton ); + iAppUi.ShowSortListInPopupL( iCurrentSortCriteria, folderType, this, iSortButton ); } else { @@ -4217,15 +4344,26 @@ // CFSEmailUiMailListVisualiser::HandleTimerFocusStateChange // ----------------------------------------------------------------------------- // -void CFSEmailUiMailListVisualiser::HandleTimerFocusStateChange( TBool aShow ) +void CFSEmailUiMailListVisualiser::FocusVisibilityChange( TBool aVisible ) { FUNC_LOG; - CFsEmailUiViewBase::HandleTimerFocusStateChange( aShow ); + + CFsEmailUiViewBase::FocusVisibilityChange( aVisible ); + if( iFocusedControl == EControlBarComponent ) { - iControlBarControl->MakeSelectorVisible( aShow ); + iControlBarControl->MakeSelectorVisible( aVisible ); } - iMailTreeListVisualizer->SetFocusVisibility( aShow ); + + if ( iStylusPopUpMenuLaunched && !aVisible ) + { + // Do not allow to remove the focus from a list element if the pop up + // menu was just launched. + iStylusPopUpMenuLaunched = EFalse; + return; + } + + iMailTreeListVisualizer->SetFocusVisibility( aVisible ); } // --------------------------------------------------------------------------- @@ -4445,25 +4583,43 @@ void CFSEmailUiMailListVisualiser::HandleControlBarEvent( TFsControlBarEvent aEvent, TInt aData ) { FUNC_LOG; - if ( aEvent == EEventFocusLostAtBottom || - aEvent == EEventFocusLostAtSide ) - { - iFocusedControl = EMailListComponent; - TRAP_IGNORE( iMailList->SetFocusedL( ETrue ) ); - } - else if ( aEvent == EEventFocusGained ) - { - } - else if ( aEvent == EEventButtonPressed ) - { - // Handle 2 control buttons - if ( aData == iFolderListButtonId ) - { - } - else if ( aData == iSortButtonId ) - { - } - } + + switch( aEvent ) + { + case EEventFocusLostAtBottom: + case EEventFocusLostAtSide: + { + iFocusedControl = EMailListComponent; + TRAP_IGNORE( iMailList->SetFocusedL( ETrue ) ); + break; + } + case EEventFocusGained: + { + break; + } + case EEventButtonPressed: + { + // Handle 2 control buttons + if ( aData == iFolderListButtonId ) + { + } + else if ( aData == iSortButtonId ) + { + } + break; + } + case EEventFocusVisibilityChanged: + { + // Hide focus after button release + iAppUi.SetFocusVisibility( EFalse ); + break; + } + default: + { + // No need to handle other events + break; + } + } } // --------------------------------------------------------------------------- @@ -4474,35 +4630,27 @@ void CFSEmailUiMailListVisualiser::CreateControlBarLayoutL() { FUNC_LOG; - TRect screenRect = iAppUi.ClientRect(); - iControlBarControl->SetWidthL( screenRect.Width() ); - //<cmail> ?? - //TInt normalButtonWidth = ( screenRect.Width() - KFirstButtonStartPosX*2 - 10 ) / 2; - //</cmail> - // Mailbox icon - iImageButtonId = iControlBarControl->AddButtonL( ECBTypeIconOnly ); - iIconButton = iControlBarControl->ButtonById( iImageButtonId ); -// <cmail> Use layout data instead of hardcoded values - const TRect iconButtonRect( iAppUi.LayoutHandler()->GetControlBarMailboxIconRect() ); - iIconButton->SetPos( iconButtonRect.iTl ); - iIconButton->SetSize( iconButtonRect.Size() ); - ControlGroup().AppendL(iIconButton->AsAlfControl()); -// </cmail> + iControlBarControl->SetRectL( iAppUi.LayoutHandler()->GetControlBarRect() ); + + // New email button + iNewEmailButtonId = iControlBarControl->AddButtonL( ECBTypeOneLineLabelIconA ); + iNewEmailButton = iControlBarControl->ButtonById( iNewEmailButtonId ); + const TRect mailButtonRect( iAppUi.LayoutHandler()->GetControlBarNewEmailButtonRect() ); + iNewEmailButton->SetPos( mailButtonRect.iTl ); + iNewEmailButton->SetSize( mailButtonRect.Size() ); + ControlGroup().AppendL(iNewEmailButton->AsAlfControl()); // Folder list button - iFolderListButtonId = iControlBarControl->AddButtonL( ECBTypeOneLineLabelIconB ); + iFolderListButtonId = iControlBarControl->AddButtonL( ECBTypeOneLineLabelIconA ); iFolderListButton = iControlBarControl->ButtonById( iFolderListButtonId ); -// <cmail> Use layout data instead of hardcoded values const TRect folderButtonRect( iAppUi.LayoutHandler()->GetControlBarFolderListButtonRect() ); iFolderListButton->SetPos( folderButtonRect.iTl ); iFolderListButton->SetSize( folderButtonRect.Size() ); ControlGroup().AppendL(iFolderListButton->AsAlfControl()); -// </cmail> // Sort order button - iSortButtonId = iControlBarControl->AddButtonL( ECBTypeOneLineLabelIconB ); + iSortButtonId = iControlBarControl->AddButtonL( ECBTypeOneLineLabelIconA ); iSortButton = iControlBarControl->ButtonById( iSortButtonId ); -// <cmail> Use layout data instead of hardcoded values const TRect sortButtonRect( iAppUi.LayoutHandler()->GetControlBarSortButtonRect() ); iSortButton->SetPos( sortButtonRect.iTl ); iSortButton->SetSize( sortButtonRect.Size() ); @@ -4515,6 +4663,17 @@ { horizontalAlign = EAlfAlignHRight; } + + // Icons and sort button text + iFolderListButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EListControlBarMailboxDefaultIcon ) ); + iNewEmailButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNewEmailDefaultIcon ) ); + SetSortButtonTextAndIconL(); + + iNewEmailButton->SetElemAlignL( + ECBElemIconA, + EAlfAlignHCenter, + EAlfAlignVCenter ); + iFolderListButton->SetElemAlignL( ECBElemLabelFirstLine, horizontalAlign, @@ -4523,22 +4682,15 @@ ECBElemLabelFirstLine, horizontalAlign, EAlfAlignVCenter ); + iSortButton->SetElemAlignL( + ECBElemIconA, + EAlfAlignHCenter, + EAlfAlignVCenter ); // Show the buttons - iIconButton->ClearBackgroundColor(); - iIconButton->SetDimmed(); + iNewEmailButton->ShowButtonL(); iFolderListButton->ShowButtonL(); iSortButton->ShowButtonL(); - - // Button background images - iFolderListButton->ClearBackgroundColor(); - iSortButton->ClearBackgroundColor(); - - // Icons and sort button text - iIconButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EListControlBarMailboxDefaultIcon ) ); - SetSortButtonTextAndIconL(); - - //iControlBarControl->SetSelectorBorders(-2,-2,-2,-2 ); // CHECKLATER - commented out 'cause fixing things is hard - check later to replace (?) it } // --------------------------------------------------------------------------- @@ -4551,13 +4703,12 @@ FUNC_LOG; TRect screenRect = iAppUi.ClientRect(); - // First set widht and height - iControlBarControl->SetHeightL( iAppUi.LayoutHandler()->ControlBarHeight() ); - iControlBarControl->SetWidthL( screenRect.Width() ); - - const TRect iconButtonRect( iAppUi.LayoutHandler()->GetControlBarMailboxIconRect() ); - iIconButton->SetPos( iconButtonRect.iTl ); - iIconButton->SetSize( iconButtonRect.Size() ); + // First set pos, widht and height + iControlBarControl->SetRectL( iAppUi.LayoutHandler()->GetControlBarRect() ); + + const TRect newEmailButtonRect( iAppUi.LayoutHandler()->GetControlBarNewEmailButtonRect() ); + iNewEmailButton->SetPos( newEmailButtonRect.iTl ); + iNewEmailButton->SetSize( newEmailButtonRect.Size() ); const TRect folderButtonRect( iAppUi.LayoutHandler()->GetControlBarFolderListButtonRect() ); iFolderListButton->SetPos( folderButtonRect.iTl ); @@ -4567,57 +4718,18 @@ iSortButton->SetPos( sortButtonRect.iTl ); iSortButton->SetSize( sortButtonRect.Size() ); - // Bar background - CAlfTexture& barBg = iAppUi.FsTextureManager()->TextureByIndex( EMailListBarBgIcon ); - TSize cbBgSize; - cbBgSize.SetSize( screenRect.Width(), iAppUi.LayoutHandler()->ControlBarHeight() ); - barBg.Size().SetSize( cbBgSize.iWidth, cbBgSize.iHeight ); - // <cmail> S60 Skin support - //iControlBarControl->SetBackgroundImageL( barBg ); - //</cmail> - - // Button background - CAlfTexture& buttonBg = iAppUi.FsTextureManager()->TextureByIndex( EListTextureControlButton ); - //<cmail> - buttonBg.Size().SetSize( iAppUi.LayoutHandler()->GetControlBarFolderListButtonSize().iWidth, iAppUi.LayoutHandler()->GetControlBarFolderListButtonSize().iHeight ); - //</cmail> - - // construct main text display window -// <cmail> Use layout data instead of hard-coded values -// const CFont* font = iEikonEnv->NormalFont(); -// TFontSpec fontSpec = font->FontSpecInTwips(); - //fontSpec.iHeight = iAppUi.LayoutHandler()->ControlBarTextHeight(); - TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; TAknLayoutText textLayout; textLayout.LayoutText(TRect(0,0,0,0), AknLayoutScalable_Apps::main_sp_fs_ctrlbar_ddmenu_pane_t1(var)); + iNewEmailButton->SetTextFontL( textLayout.Font()->FontSpecInTwips() ); iFolderListButton->SetTextFontL( textLayout.Font()->FontSpecInTwips() ); iSortButton->SetTextFontL( textLayout.Font()->FontSpecInTwips() ); -// </cmail> - - TRgb normalStateButtonTextColor( KRgbBlack ); - AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), - normalStateButtonTextColor, KAknsIIDFsTextColors, EAknsCIFsTextColorsCG6 ); - - iFolderListButton->SetNormalTextColor( normalStateButtonTextColor ); - iFolderListButton->SetFocusedTextColor( iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor() ); - - iSortButton->SetNormalTextColor( normalStateButtonTextColor ); - iSortButton->SetFocusedTextColor( iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor() ); - - CAlfImageBrush* folderBtnBrush = iAppUi.FsTextureManager()->NewControlBarButtonBgBrushLC(); - iFolderListButton->SetBackgroundImageL( folderBtnBrush ); - CleanupStack::Pop( folderBtnBrush ); - - CAlfImageBrush* sortBtnBrush = iAppUi.FsTextureManager()->NewControlBarButtonBgBrushLC(); - iSortButton->SetBackgroundImageL( sortBtnBrush ); - CleanupStack::Pop( sortBtnBrush ); - - iIconButton->ShowButtonL(); + + UpdateTheme(); + + iNewEmailButton->ShowButtonL(); iFolderListButton->ShowButtonL(); iSortButton->ShowButtonL(); - - iFolderListButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EControlBarDescendingArrowTexture ), ECBElemIconB ); } // --------------------------------------------------------------------------- @@ -4628,22 +4740,112 @@ void CFSEmailUiMailListVisualiser::SetSortButtonTextAndIconL() { FUNC_LOG; - HBufC* buttonText(0); + + // Set button text if necessary + HBufC* buttonText = GetSortButtonTextLC(); + + if ( !Layout_Meta_Data::IsLandscapeOrientation() ) + { + if ( buttonText ) + { + buttonText->Des().Zero(); + } + } + + if ( buttonText ) + { + iSortButton->SetTextL( *buttonText ); + } + CleanupStack::PopAndDestroy( buttonText ); + + // Set icon + TFSEmailUiTextures textureIndex( ETextureFirst ); + switch ( iCurrentSortCriteria.iField ) { case EFSMailSortBySubject: { - buttonText = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SORT_BY_SUBJECT ); + textureIndex = iCurrentSortCriteria.iOrder == EFSMailAscending ? + ESortListSubjectDescTexture : + ESortListSubjectAscTexture; } break; case EFSMailSortByAttachment: { - buttonText = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SORT_BY_ATTACHMENT ); + textureIndex = iCurrentSortCriteria.iOrder == EFSMailAscending ? + ESortListAttachmentDescTexture : + ESortListAttachmentAscTexture; } break; case EFSMailSortByFlagStatus: { - buttonText = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SORT_BY_FLAG ); + textureIndex = iCurrentSortCriteria.iOrder == EFSMailAscending ? + ESortListFollowDescTexture : + ESortListFollowAscTexture; + } + break; + case EFSMailSortByRecipient: + case EFSMailSortBySender: + { + textureIndex = iCurrentSortCriteria.iOrder == EFSMailAscending ? + ESortListSenderDescTexture : + ESortListSenderAscTexture; + } + break; + case EFSMailSortByPriority: + { + textureIndex = iCurrentSortCriteria.iOrder == EFSMailAscending ? + ESortListPriorityDescTexture : + ESortListPriorityAscTexture; + } + break; + case EFSMailSortByUnread: + { + textureIndex = iCurrentSortCriteria.iOrder == EFSMailAscending ? + ESortListUnreadDescTexture : + ESortListUnreadAscTexture; + } + break; + case EFSMailSortByDate: + default: + { + textureIndex = iCurrentSortCriteria.iOrder == EFSMailAscending ? + ESortListDateDescTexture : + ESortListDateAscTexture; + } + break; + } + + iSortButton->SetIconL( + iAppUi.FsTextureManager()->TextureByIndex( textureIndex ), + ECBElemIconA ); + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +HBufC* CFSEmailUiMailListVisualiser::GetSortButtonTextLC() + { + FUNC_LOG; + HBufC* buttonText( 0 ); + + switch ( iCurrentSortCriteria.iField ) + { + case EFSMailSortBySubject: + { + buttonText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SORT_BY_SUBJECT ); + } + break; + case EFSMailSortByAttachment: + { + buttonText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SORT_BY_ATTACHMENT ); + } + break; + case EFSMailSortByFlagStatus: + { + buttonText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SORT_BY_FLAG ); } break; case EFSMailSortByRecipient: @@ -4660,47 +4862,33 @@ case EFSDraftsFolder: case EFSOutbox: { - buttonText = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SORT_BY_RECIPIENT ); + buttonText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SORT_BY_RECIPIENT ); } break; default: - buttonText = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SORT_BY_SENDER ); + buttonText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SORT_BY_SENDER ); break; } } break; case EFSMailSortByPriority: { - buttonText = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SORT_BY_PRIORITY ); + buttonText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SORT_BY_PRIORITY ); } break; case EFSMailSortByUnread: { - buttonText = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SORT_BY_UNREAD ); + buttonText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SORT_BY_UNREAD ); } break; case EFSMailSortByDate: default: { - buttonText = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SORT_BY_DATE ); + buttonText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SORT_BY_DATE ); } break; - } - if ( buttonText ) - { - CleanupStack::PushL( buttonText ); - iSortButton->SetTextL( *buttonText ); - CleanupStack::PopAndDestroy( buttonText ); - } - if ( iCurrentSortCriteria.iOrder == EFSMailAscending ) - { - iSortButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EControlBarAscendingArrowTexture ), ECBElemIconB ); - } - else - { - iSortButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EControlBarDescendingArrowTexture ), ECBElemIconB ); - } + return buttonText; } // --------------------------------------------------------------------------- @@ -5345,21 +5533,21 @@ if ( aListId != KFsTreeNoneID ) { - // Substitute node ID with ID of its first child - if ( iMailList->IsNode( aListId ) && iMailList->CountChildren( aListId ) ) - { - aListId = iMailList->Child( aListId, 0 ); - } - // Find corresponding message from the model - for ( TInt i=0 ; i<iModel->Count() ; i++ ) + const TInt modelCount( iModel->Count() ); + for( TInt i( 0 ) ; i < modelCount ; ++i ) { CFSEmailUiMailListModelItem* item = - static_cast<CFSEmailUiMailListModelItem*>( iModel->Item(i) ); - if ( item->ModelItemType() == ETypeMailItem && - aListId == item->CorrespondingListId() ) + static_cast<CFSEmailUiMailListModelItem*>( iModel->Item( i ) ); + if ( aListId == item->CorrespondingListId() ) { msgId = item->MessagePtr().GetMessageId(); + // if list id points to separator + // set flag on. This is made for improving focus handling. + if( item->ModelItemType() == ETypeSeparator ) + { + msgId.SetSeparator( ETrue ); + } break; } } @@ -5469,15 +5657,27 @@ // operator implementation; it doesn't check the iNullId flag at all. if( !aMessageId.IsNullId() ) { - for ( TInt i=0; i<iModel->Count() ; i++ ) + const TInt modelCount( iModel->Count() ); + for ( TInt i( 0 ); i < modelCount ; ++i ) { CFSEmailUiMailListModelItem* item = - static_cast<CFSEmailUiMailListModelItem*>( iModel->Item(i) ); - if ( item->ModelItemType() == ETypeMailItem && - aMessageId == item->MessagePtr().GetMessageId() ) + static_cast<CFSEmailUiMailListModelItem*>( iModel->Item( i ) ); + if ( aMessageId == item->MessagePtr().GetMessageId() ) { - idx = i; - break; + TModelItemType itemType = item->ModelItemType(); + TBool separator( aMessageId.IsSeparator() ); + + // Because separator and the first message after separator + // have same message id, we need to separate these cases + // and that is made with separator flag which is stored to + // TFSMailMsgId object. If separator flag is on item need to be + // separator if it is not on item needs to be mail item. + if( ( separator && itemType == ETypeSeparator ) || + ( !separator && itemType == ETypeMailItem ) ) + { + idx = i; + break; + } } } } @@ -5610,7 +5810,7 @@ if ( iModel->Count() ) </cmail> */ { - iAppUi.ShowSortListInPopupL( iCurrentSortCriteria.iField, folderType, this, iSortButton ); + iAppUi.ShowSortListInPopupL( iCurrentSortCriteria, folderType, this, iSortButton ); } } return; @@ -6377,8 +6577,10 @@ // Set the position for the popup iStylusPopUpMenu->SetPosition( ActionMenuPosition() ); - // Display the popup + // Display the popup and set the flag to indicate that the menu was + // launched. iStylusPopUpMenu->ShowMenu(); + iStylusPopUpMenuLaunched = ETrue; } // --------------------------------------------------------------------------- @@ -6631,8 +6833,6 @@ //If sync was started by user, show the synchronisation indicator if ( iManualMailBoxSync ) { - CFSMailBox* mb = iAppUi.GetActiveMailbox(); - TDesC* mbName = &mb->GetName(); ManualMailBoxSync(EFalse); } } @@ -6643,17 +6843,40 @@ } } -void CFSEmailUiMailListVisualiser::TreeListEventL( const TFsTreeListEvent aEvent, const TFsTreeItemId aId ) +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::TreeListEventL( + const TFsTreeListEvent aEvent, const TFsTreeItemId aId ) { FUNC_LOG; - if ( aEvent == MFsTreeListObserver::EFsTreeListItemWillGetFocused && aId != KFsTreeNoneID ) - {//EFalse - do not call UpdateItem directly, new text will be drawn when item gets focus - UpdatePreviewPaneTextIfNecessaryL( aId, EFalse ); - } - else if ( aEvent == MFsTreeListObserver::EFsTreeListItemTouchFocused ) - { - - } + switch( aEvent ) + { + case EFsTreeListItemWillGetFocused: + { + if( aId != KFsTreeNoneID ) + { + UpdatePreviewPaneTextIfNecessaryL( aId, EFalse ); + } + break; + } + case EFsTreeListItemTouchFocused: + { + break; + } + case EFsFocusVisibilityChange: + { + iAppUi.SetFocusVisibility( EFalse ); + break; + } + default: + { + // Do not handle other events + break; + } + + } } // --------------------------------------------------------------------------- @@ -6736,7 +6959,7 @@ { CleanupStack::PushL( mailBoxIcon ); //<cmail> - TSize defaultIconSize(iAppUi.LayoutHandler()->GetControlBarMailboxIconSize()); + TSize defaultIconSize(iAppUi.LayoutHandler()->GetControlBarMailboxIconRect().Size()); //</cmail> AknIconUtils::SetSize(mailBoxIcon->Bitmap(), defaultIconSize); AknIconUtils::SetSize(mailBoxIcon->Mask(), defaultIconSize); @@ -6749,12 +6972,12 @@ iMailBoxIconTexture = &iAppUi.FsTextureManager()->TextureByMailboxIdL( iAppUi.GetActiveMailboxId().PluginId(), iAppUi.GetActiveMailboxId().Id(), defaultIconSize ); - iIconButton->SetIconL( *iMailBoxIconTexture ); + iFolderListButton->SetIconL( *iMailBoxIconTexture ); CleanupStack::PopAndDestroy( mailBoxIcon ); } else { - iIconButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EListControlBarMailboxDefaultIcon ) ); + iFolderListButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EListControlBarMailboxDefaultIcon ) ); } } @@ -6953,7 +7176,8 @@ ChangeReadStatusOfHighlightedL( ETrue ); aFoundPreviousMsgId = MsgIdFromIndex( prevIdx ); ret = KErrNone; - } + } + if ( ret == KErrNone ) { OpenHighlightedMailL(); @@ -6961,6 +7185,27 @@ return ret; } +TInt CFSEmailUiMailListVisualiser::MoveToPreviousMsgAfterDeleteL( TFSMailMsgId aFoundPreviousMsgId ) + { + FUNC_LOG; + TInt ret(KErrNotFound); + + TInt idx = ItemIndexFromMessageId( aFoundPreviousMsgId ); + if ( idx >= 0 ) + { + // Focus the previous message + iMailTreeListVisualizer->SetFocusedItemL( iTreeItemArray[idx].iListItemId, EFalse ); + ChangeReadStatusOfHighlightedL( ETrue ); + ret = KErrNone; + } + + if ( ret == KErrNone ) + { + OpenHighlightedMailL(); + } + + return ret; + } void CFSEmailUiMailListVisualiser::ManualMailBoxSync( TBool aManualMailBoxSync ) { @@ -7014,6 +7259,11 @@ } else { + if ( iStylusPopUpMenuLaunched ) + { + return; + } + iMailList->SetFocusedL( EFalse ); TInt focusedBtnId = KErrNotFound; MFsControlButtonInterface* focusedBtn = iControlBarControl->GetFocusedButton(); @@ -7147,7 +7397,7 @@ { CFSEmailUiMailListModelItem* item = static_cast<CFSEmailUiMailListModelItem*>(iMailListVisualiser->iModel->Item( highlightedIndexBeforeUpdate ) ); - if ( item->ModelItemType() == ETypeMailItem ) + if ( item && item->ModelItemType() == ETypeMailItem ) { msgIdBeforeRefresh = item->MessagePtr().GetMessageId(); }
--- a/emailuis/emailui/src/FreestyleEmailUiMailViewerRichText.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiMailViewerRichText.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -12,7 +12,7 @@ * Contributors: * * Description: FreestyleEmailUi mail viewer rich text implementation -* Version : %version: 47 % +* Version : %version: 48 % * */ @@ -423,8 +423,8 @@ imageImage, mask, iconFile, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up_mask, + EMbmFreestyleemailuiQgn_indi_navi_follow_up, + EMbmFreestyleemailuiQgn_indi_navi_follow_up_mask, KRgbBlack ); AknIconUtils::DisableCompression( imageImage ); AknIconUtils::DisableCompression( mask ); @@ -441,8 +441,8 @@ imageImage, mask, iconFile, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up_complete, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up_complete_mask, + EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete, + EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete_mask, KRgbBlack ); AknIconUtils::DisableCompression( imageImage ); AknIconUtils::DisableCompression( mask );
--- a/emailuis/emailui/src/FreestyleEmailUiMsgDetailsVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiMsgDetailsVisualiser.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -12,7 +12,7 @@ * Contributors: * * Description : FreestyleEmailUi message details view implementation -* Version : %version: 44 % +* Version : %version: 45 % * */ @@ -1030,6 +1030,7 @@ aItemVisualizer = CFsTreePlainOneLineItemVisualizer::NewL(*iTreeList->TreeControl()); CleanupStack::PushL( aItemVisualizer ); aItemVisualizer->SetExtendable( EFalse ); // One line items are obviously not extendable + aItemVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EFolderLayout ); SetItemVisualizerCommonProperties( *aItemVisualizer ); } @@ -1049,6 +1050,7 @@ CleanupStack::PushL( aItemVisualizer ); aItemVisualizer->SetExtendable( ETrue ); // All two line items are extendable aItemVisualizer->SetMenu( NULL ); + aItemVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EFolderLayout ); SetItemVisualizerCommonProperties( *aItemVisualizer ); } @@ -1056,17 +1058,14 @@ void CFSEmailUiMsgDetailsVisualiser::SetItemVisualizerCommonProperties( MFsTreeItemVisualizer& aItemVisualizer ) { FUNC_LOG; - aItemVisualizer.SetSize(TSize(iScreenRect.Width(), iListItemHeight)); - aItemVisualizer.SetExtendedSize(TSize(iScreenRect.Width(), 2*iListItemHeight)); + aItemVisualizer.SetSize(TSize(iScreenRect.Width(), iAppUi.LayoutHandler()->OneLineListItemHeight())); + aItemVisualizer.SetExtendedSize(TSize(iScreenRect.Width(), iAppUi.LayoutHandler()->TwoLineListItemHeight())); // Set correct skin text colors for the list items TRgb focusedColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor(); TRgb normalColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor(); aItemVisualizer.SetFocusedStateTextColor( focusedColor ); - aItemVisualizer.SetNormalStateTextColor( normalColor ); - - // Set font size - aItemVisualizer.SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() ); + aItemVisualizer.SetNormalStateTextColor( normalColor ); } void CFSEmailUiMsgDetailsVisualiser::CreatePlainNodeLC2( const TDesC& aItemDataBuff, @@ -1109,7 +1108,7 @@ // Temporary fix for EASV-7GJFVD //aNodeVisualizer.SetBackgroundColorL( iAppUi.LayoutHandler()->ListNodeBackgroundColor() ); - + } TFsTreeItemId CFSEmailUiMsgDetailsVisualiser::AppendHeadingToListL( TInt aResourceId ) @@ -1586,7 +1585,7 @@ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, iScreenRect ); iScreenRect.SetRect( 0, 0, iScreenRect.Width(), iScreenRect.Height() ); - iListItemHeight = iAppUi.LayoutHandler()->OneLineListItemHeight(); + iListNodeHeight = iAppUi.LayoutHandler()->OneLineListNodeHeight(); } }
--- a/emailuis/emailui/src/FreestyleEmailUiSearchListVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiSearchListVisualiser.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -53,6 +53,7 @@ #include <alf/alfcommand.h> #include <aknnotewrappers.h> // <cmail> +#include <layoutmetadata.cdl.h> #include <aknlayoutscalable_apps.cdl.h> // </cmail> #include <featmgr.h> @@ -431,6 +432,7 @@ // <cmail> Touch iSearchList->SetFocusedL(ETrue); + FocusVisibilityChange( iAppUi.IsFocusShown() ); // </cmail> } @@ -734,6 +736,11 @@ CFsEmailUiViewBase::HandleDynamicVariantSwitchL( aType ); if ( iFirstStartCompleted ) // Safety { + if ( aType == EScreenLayoutChanged ) + { + SetStatusBarLayout(); + } + if ( iSearchTreeListVisualizer ) { TRgb normalColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor(); @@ -760,13 +767,14 @@ } // ----------------------------------------------------------------------------- -// CFSEmailUiSearchListVisualiser::HandleTimerFocusStateChange +// CFSEmailUiSearchListVisualiser::FocusVisibilityChange // ----------------------------------------------------------------------------- // -void CFSEmailUiSearchListVisualiser::HandleTimerFocusStateChange( TBool aShow ) +void CFSEmailUiSearchListVisualiser::FocusVisibilityChange( + TBool aVisible ) { - CFsEmailUiViewBase::HandleTimerFocusStateChange( aShow ); - iSearchTreeListVisualizer->SetFocusVisibility( aShow ); + CFsEmailUiViewBase::FocusVisibilityChange( aVisible ); + iSearchTreeListVisualizer->SetFocusVisibility( aVisible ); } // --------------------------------------------------------------------------- @@ -776,11 +784,18 @@ // void CFSEmailUiSearchListVisualiser::SetStatusBarLayout() { - if ( StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT ) - { - TRAP_IGNORE( - StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT )); - } + TInt res = R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT; + if( Layout_Meta_Data::IsLandscapeOrientation() ) + { + // landscape must use different layout + res = R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT; + } + + if ( StatusPane()->CurrentLayoutResId() != res ) + { + TRAP_IGNORE( + StatusPane()->SwitchLayoutL( res )); + } } void CFSEmailUiSearchListVisualiser::HandleCommandL( TInt aCommand ) @@ -909,6 +924,11 @@ } break; case EAknSoftkeyOpen: + if (!iAppUi.IsFocusShown()) + { + iAppUi.SetFocusVisibility( ETrue); + break; + } case EFsEmailUiCmdOpen: { if ( iSearchList->Count() ) @@ -1152,7 +1172,22 @@ if ( scanCode == EStdKeyRightArrow ) scanCode = EStdKeyLeftArrow; else if ( scanCode == EStdKeyLeftArrow ) scanCode = EStdKeyRightArrow; } - + // Handle possible focus visibility change + if ((scanCode == EStdKeyRightArrow) + || (scanCode == EStdKeyLeftArrow) + || (scanCode == EStdKeyUpArrow) + || (scanCode == EStdKeyDownArrow) + || (scanCode == EStdKeyEnter) + || (scanCode == EStdKeyDeviceA) + || (scanCode == EStdKeyDevice3)) + { + // If the focus was not active already, ignore the key press + if( !iAppUi.SetFocusVisibility( ETrue ) ) + { + return ETrue; + } + + } switch ( scanCode ) { case EStdKeyDevice3: // CENTER CLICK @@ -1242,7 +1277,6 @@ // There's no need to mirror anything manually here. // BAR BACGROUND IMAGE - //<cmail> platform layout changes TRect contBarRect = iAppUi.LayoutHandler()->GetControlBarRect(); TPoint& tl( contBarRect.iTl ); iScreenAnchorLayout->SetAnchor(EAlfAnchorTopLeft, 0, @@ -1254,23 +1288,8 @@ EAlfAnchorOriginLeft, EAlfAnchorOriginTop, EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, TAlfTimedPoint( br.iX, br.iY )); - //</cmail> - - // LOOKING GLASS IMAGE - //<cmail> search magnifier icon removed from cmail - /*TRect searchIconRect( iAppUi.LayoutHandler()->GetControlBarMailboxIconRect() ); - const TPoint& tl( searchIconRect.iTl ); - iScreenAnchorLayout->SetAnchor(EAlfAnchorTopLeft, 1, - EAlfAnchorOriginLeft, EAlfAnchorOriginTop, - EAlfAnchorMetricRelativeToSize, EAlfAnchorMetricRelativeToSize, - TAlfTimedPoint(0, 0 )); - iScreenAnchorLayout->SetAnchor(EAlfAnchorBottomRight, 1, - EAlfAnchorOriginLeft, EAlfAnchorOriginTop, - EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, - TAlfTimedPoint(KSearchIconWidth, iAppUi.LayoutHandler()->ControlBarHeight()));*/ // TEXT - //<cmail> platform layout changes TRect textRect = iAppUi.LayoutHandler()->GetSearchListHeaderTextLayout().TextRect(); tl = textRect.iTl; iScreenAnchorLayout->SetAnchor(EAlfAnchorTopLeft, 1, @@ -1282,10 +1301,8 @@ EAlfAnchorOriginLeft, EAlfAnchorOriginTop, EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, TAlfTimedPoint( br.iX, br.iY )); - //</cmail> - //<cmail> platform layout changes - TRect listRect = iAppUi.LayoutHandler()->GetListRect(); + TRect listRect = iAppUi.LayoutHandler()->GetListRect( ETrue ); iScreenAnchorLayout->SetAnchor(EAlfAnchorTopLeft, 2, EAlfAnchorOriginLeft, EAlfAnchorOriginTop, EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, @@ -1294,7 +1311,6 @@ EAlfAnchorOriginLeft, EAlfAnchorOriginTop, EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, TAlfTimedPoint(listRect.iBr.iX, listRect.iBr.iY)); - //</cmail> } @@ -2282,6 +2298,7 @@ aFoundPreviousMsgId = MsgIdFromIndex( prevIdx ); ret = KErrNone; } + if ( ret == KErrNone ) { OpenHighlightedMailL(); @@ -2289,6 +2306,27 @@ return ret; } +TInt CFSEmailUiSearchListVisualiser::MoveToPreviousMsgAfterDeleteL( TFSMailMsgId aFoundPreviousMsgId ) + { + FUNC_LOG; + TInt ret(KErrNotFound); + + TInt idx = ItemIndexFromMessageId( aFoundPreviousMsgId ); + if ( idx >= 0 ) + { + // Focus the previous message + iSearchTreeListVisualizer->SetFocusedItemL( iSearchListItemArray[idx].iSearchListItemId ); + ChangeReadStatusOfHighlightedL( ETrue ); + ret = KErrNone; + } + + if ( ret == KErrNone ) + { + OpenHighlightedMailL(); + } + + return ret; + } // Helper functions to get highlighted message id and folder id TFSMailMsgId CFSEmailUiSearchListVisualiser::HighlightedMessageFolderId() @@ -2348,6 +2386,11 @@ SetMskL(); break; } + case MFsTreeListObserver::EFsFocusVisibilityChange: + { + iAppUi.SetFocusVisibility( EFalse ); + break; + } case MFsTreeListObserver::EFsTreeListItemTouchFocused: default: //Just ignore rest of events
--- a/emailuis/emailui/src/FreestyleEmailUiSettingsList.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiSettingsList.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -558,6 +558,10 @@ iPIMListActivation = ETrue; SetSelectedMainListIndex( index ); CreatePluginPIMListL( iSelectedPluginSettings ); + // Update the title pane, needed for touch support + HBufC* text = CreateTitlePaneTextLC(); + iAppUi.SetTitlePaneTextL( *text ); + CleanupStack::PopAndDestroy( text ); } else // index < 0; this should never happen { @@ -1292,7 +1296,6 @@ { // get mailbox name and insert it to listBox CFSMailBox* mailBox = mailBoxes[i]; - TDesC& name = mailBox->GetName(); // Does mailbox have settings plugin if ( mailBox->GetSettingsUid() != TUid::Null() ) {
--- a/emailuis/emailui/src/FreestyleEmailUiTextureManager.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiTextureManager.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -201,25 +201,29 @@ { FUNC_LOG; - // Use FS specific skin ID if it's found, otherwise use general list highlight. - // This need to be checked before CHuiFrameBrush::NewL as it never leaves - // even if the skin ID is not found. Another option would be to try first with - // FS specific skin ID, TRAP SetFrameRectsL-function call, and if it leaves, - // then recreate frame brush with general skin ID and recall SetFrameRectsL. + // Use FS specific skin ID if it's found, otherwise use general list + // highlight. This need to be checked before CHuiFrameBrush::NewL as it + // never leaves even if the skin ID is not found. Another option would be + // to try first with FS specific skin ID, TRAP SetFrameRectsL-function + // call, and if it leaves, then recreate frame brush with general skin ID + // and recall SetFrameRectsL. TAknsItemID skinId = KAknsIIDQgnFsList; - CAknsItemData* temp = AknsUtils::SkinInstance()->GetCachedItemData( skinId ); + CAknsItemData* temp = + AknsUtils::SkinInstance()->GetCachedItemData( skinId ); + if( !temp ) { skinId = KAknsIIDQsnFrList; } - CAlfFrameBrush* frameBrush(0); + CAlfFrameBrush* frameBrush( 0 ); frameBrush = CAlfFrameBrush::NewLC( *iEnv, skinId ); - TRect testOuterRect(0,0,300,80); - TRect testInnerRect(4,4,296,76); + TRect outerRect( 0, 0, 300, 80 ); + TRect innerRect( outerRect ); + innerRect.Shrink( KSelectorBorderWidth, KSelectorBorderWidth ); - frameBrush->SetFrameRectsL(testInnerRect, testOuterRect); + frameBrush->SetFrameRectsL( innerRect, outerRect ); return frameBrush; } @@ -235,15 +239,23 @@ CAlfFrameBrush* CFreestyleEmailUiTextureManager::NewListSelectorBrushL() { FUNC_LOG; - if(!iNewFrameBrush) - { - iNewFrameBrush = CAlfFrameBrush::NewLC( *iEnv, KAknsIIDQsnFrList, -2, -1 ); - CleanupStack::Pop( iNewFrameBrush ); // frameBrush - const TRect testOuterRect(0,0,300,80); - TRect testInnerRect( testOuterRect ); - testInnerRect.Shrink( 10, 10 ); - iNewFrameBrush->SetFrameRectsL(testInnerRect, testOuterRect); - } + + if ( iNewFrameBrush ) + { + // A brush is already constructed. Do return it. + return iNewFrameBrush; + } + + iNewFrameBrush = CAlfFrameBrush::NewL( *iEnv, KAknsIIDQsnFrList, + /* aEdgeOffsetX */ -2, + /* aEdgeOffsetY */ -1 ); + + const TRect outerRect( 0, 0, 300, 80 ); + TRect innerRect( outerRect ); + innerRect.Shrink( 10, 10 ); + + iNewFrameBrush->SetFrameRectsL( innerRect, outerRect); + return iNewFrameBrush; } // </cmail> @@ -633,6 +645,16 @@ scalemode = EAspectRatioNotPreserved; } break; + case EListTextureNewEmailDefaultIcon: + { + TInt tempsize = iAppUi->LayoutHandler()->ListControlBarMailboxDefaultIconSize(); + iconSize.SetSize( tempsize, tempsize ); + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_indi_tb_email_new, + EMbmFreestyleemailuiQgn_indi_tb_email_new_mask ); + } + break; + // MESSAGE TEXTURE READING STARTS HERE // case EMessageReadIcon: @@ -1012,8 +1034,8 @@ bitmap, mask, iconFileName, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up_mask, + EMbmFreestyleemailuiQgn_indi_navi_follow_up, + EMbmFreestyleemailuiQgn_indi_navi_follow_up_mask, KRgbBlack ); } break; @@ -1029,8 +1051,8 @@ bitmap, mask, iconFileName, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up_complete, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up_complete_mask, + EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete, + EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete_mask, KRgbBlack ); } break; @@ -1283,6 +1305,126 @@ } break; + // FOLDER LIST ICON READING STOPS HERE + // + + // SORT LIST ICON READING STARTS HERE + // + case ESortListAttachmentAscTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_attach_asc, + EMbmFreestyleemailuiQgn_prop_email_sort_attach_asc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListAttachmentAscTexture ); + } + break; + case ESortListAttachmentDescTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_attach_desc, + EMbmFreestyleemailuiQgn_prop_email_sort_attach_desc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListAttachmentDescTexture ); + } + break; + case ESortListDateAscTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_date_asc, + EMbmFreestyleemailuiQgn_prop_email_sort_date_asc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListDateAscTexture ); + } + break; + case ESortListDateDescTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_date_desc, + EMbmFreestyleemailuiQgn_prop_email_sort_date_desc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListDateDescTexture ); + } + break; + case ESortListFollowAscTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_follow_asc, + EMbmFreestyleemailuiQgn_prop_email_sort_follow_asc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListFollowAscTexture ); + } + break; + case ESortListFollowDescTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_follow_desc, + EMbmFreestyleemailuiQgn_prop_email_sort_follow_desc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListFollowDescTexture ); + } + break; + case ESortListPriorityAscTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_priority_asc, + EMbmFreestyleemailuiQgn_prop_email_sort_priority_asc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListPriorityAscTexture ); + } + break; + case ESortListPriorityDescTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_priority_desc, + EMbmFreestyleemailuiQgn_prop_email_sort_priority_desc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListPriorityDescTexture ); + } + break; + case ESortListSenderAscTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_sender_asc, + EMbmFreestyleemailuiQgn_prop_email_sort_sender_asc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListSenderAscTexture ); + } + break; + case ESortListSenderDescTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_sender_desc, + EMbmFreestyleemailuiQgn_prop_email_sort_sender_desc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListSenderDescTexture ); + } + break; + case ESortListSubjectAscTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_subject_asc, + EMbmFreestyleemailuiQgn_prop_email_sort_subject_asc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListSubjectAscTexture ); + } + break; + case ESortListSubjectDescTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_subject_desc, + EMbmFreestyleemailuiQgn_prop_email_sort_subject_desc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListSubjectDescTexture ); + } + break; + case ESortListUnreadAscTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_unread_asc, + EMbmFreestyleemailuiQgn_prop_email_sort_unread_asc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListUnreadAscTexture ); + } + break; + case ESortListUnreadDescTexture: + { + AknIconUtils::CreateIconL( bitmap, mask, iconFileName, + EMbmFreestyleemailuiQgn_prop_email_sort_unread_desc, + EMbmFreestyleemailuiQgn_prop_email_sort_unread_desc_mask ); + iconSize = iAppUi->LayoutHandler()->FolderListIconSize( aId == ESortListUnreadDescTexture ); + } + break; + // SORT LIST ICON READING STOPS HERE + // + // ATTACHMENT ICONS STARTS HERE // //<cmail> @@ -1775,6 +1917,14 @@ break; case EListTextureControlButton: ; break; case EListTextureMailboxDefaultIcon: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( EListTextureMailboxDefaultIcon, this, EAlfTextureFlagDefault); break; + case EListTextureNewEmailDefaultIcon: + { + iTextures[aTextureId] = + &CAlfStatic::Env().TextureManager().CreateTextureL( + EListTextureNewEmailDefaultIcon, this, + EAlfTextureFlagDefault ); + break; + } case EListControlBarMailboxDefaultIcon: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( EListControlBarMailboxDefaultIcon, this, EAlfTextureFlagDefault); break; case EBackgroundTextureViewerHeading: ; break; case EBackgroundTextureBar: ; break; @@ -1915,6 +2065,22 @@ case EFolderListServerFoldersTexturePopup: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( EFolderListServerFoldersTexturePopup, this, EAlfTextureFlagRetainResolution); break; case EFolderListEmailAccountTexturePopup: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( EFolderListEmailAccountTexturePopup, this, EAlfTextureFlagRetainResolution); break; + // SORT LIST ICONS + case ESortListAttachmentAscTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListAttachmentAscTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListAttachmentDescTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListAttachmentDescTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListDateAscTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListDateAscTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListDateDescTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListDateDescTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListFollowAscTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListFollowAscTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListFollowDescTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListFollowDescTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListPriorityAscTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListPriorityAscTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListPriorityDescTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListPriorityDescTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListSenderAscTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListSenderAscTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListSenderDescTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListSenderDescTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListSubjectAscTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListSubjectAscTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListSubjectDescTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListSubjectDescTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListUnreadAscTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListUnreadAscTexture, this, EAlfTextureFlagRetainResolution); break; + case ESortListUnreadDescTexture: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( ESortListUnreadDescTexture, this, EAlfTextureFlagRetainResolution); break; + // STATUS INDICATOR ICONS case EStatusTextureSynchronising: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( EStatusTextureSynchronising, this, EAlfTextureFlagRetainResolution); break; case EStatusTextureConnected: iTextures[aTextureId] = &CAlfStatic::Env().TextureManager().CreateTextureL( EStatusTextureConnected, this, EAlfTextureFlagRetainResolution); break;
--- a/emailuis/emailui/src/FreestyleEmailUiUtilities.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiUtilities.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -1014,8 +1014,8 @@ iconBitmap, iconMaskBitmap, iconFileName, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up_mask, + EMbmFreestyleemailuiQgn_indi_navi_follow_up, + EMbmFreestyleemailuiQgn_indi_navi_follow_up_mask, KRgbBlack ); AknIconUtils::SetSize(iconBitmap, defaultIconSize ); AknIconUtils::SetSize(iconMaskBitmap, defaultIconSize); @@ -1034,8 +1034,8 @@ iconBitmap, iconMaskBitmap, iconFileName, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up_complete, - EMbmFreestyleemailuiQgn_indi_cmail_viewer_follow_up_complete_mask, + EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete, + EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete_mask, KRgbBlack ); AknIconUtils::SetSize(iconBitmap, defaultIconSize ); AknIconUtils::SetSize(iconMaskBitmap, defaultIconSize);
--- a/emailuis/emailui/src/FreestyleEmailUiViewBase.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiViewBase.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -15,7 +15,7 @@ * The class is not intended for instantation. * */ - + // <cmail> SF #include "emailtrace.h" @@ -41,7 +41,7 @@ // --------------------------------------------------------------------------- // -CFsEmailUiViewBase::CFsEmailUiViewBase( CAlfControlGroup& aControlGroup, +CFsEmailUiViewBase::CFsEmailUiViewBase( CAlfControlGroup& aControlGroup, CFreestyleEmailUiAppUi& aAppUi ) : iControlGroup( aControlGroup ), iAppUi( aAppUi ) { @@ -67,13 +67,12 @@ TUid aCustomMessageId, const TDesC8& aCustomMessage ) { - FUNC_LOG; + FUNC_LOG; SetViewActive( ETrue ); - //<cmail> + SetStatusBarLayout(); iAppUi.StatusPane()->DrawNow(); - //</cmail> - iFocusVisible = iAppUi.IsTimerFocusShown(); - + iFocusVisible = iAppUi.IsFocusShown(); + // fix view stack in case of external activation if ( aPrevViewId.iAppUid != KFSEmailUiUid ) { @@ -98,20 +97,18 @@ } previousView->DoTransition( ETrue ); // fade out prev view } - + // Clear the flag of long transition effect SetNextTransitionOutLong( EFalse ); UpdateToolbarL(); - SetStatusBarLayout(); - // Make sure Alfred display is of correct size (there is some problems with toolbar) TRect metricsRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, metricsRect); CAlfEnv::Static()->PrimaryDisplay().ForceSetVisibleArea(metricsRect); - + // Finally call child classes activation method - TRAPD( error, ChildDoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage) ); + TRAPD( error, ChildDoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage) ); if ( !error ) { // View activated succesfully. Change visible control group, but not @@ -162,7 +159,7 @@ // --------------------------------------------------------------------------- // -void CFsEmailUiViewBase::GetInitiallyDimmedItemsL( +void CFsEmailUiViewBase::GetInitiallyDimmedItemsL( const TInt /*aResourceId*/, RArray<TInt>& aDimmedItems ) const { FUNC_LOG; @@ -222,21 +219,21 @@ void CFsEmailUiViewBase::DoDeactivate() { FUNC_LOG; - SetViewActive( EFalse ); + SetViewActive( EFalse ); HideToolbar(); - + // Make control group ignore input and hide it if it's not already fading out. DeactivateControlGroup(); // do view specific deactivation ChildDoDeactivate(); - + // Return to another app in case this view was activated externally if ( iSendToBackgroundOnDeactivation ) { iSendToBackgroundOnDeactivation = EFalse; - + // Try to bring calling external app into foreground if found TApaTaskList taskList( iEikonEnv->WsSession() ); TApaTask prevAppTask = taskList.FindApp( iPreviousAppUid ); @@ -271,11 +268,11 @@ // some special tricks for transition effects // void CFsEmailUiViewBase::DoTransitionEffect( TBool aDirectionOut ) - { + { FUNC_LOG; RPointerArray<CAlfVisual> layoutArray; TRAP_IGNORE( GetParentLayoutsL( layoutArray ) ); - + // For views that return valid parent layout(s), use the fade effect, // for all other views, use the showing/hiding of control groups for ( TInt i = 0 ; i < layoutArray.Count() ; i++ ) @@ -290,7 +287,7 @@ { FadeVisual( layoutArray[i], ETrue, ETrue ); } - + FadeVisual( layoutArray[i], aDirectionOut ); } } @@ -315,13 +312,13 @@ CAlfVisual* aVisual, TBool aFadeDirectionOut, TBool aImmediate /*= EFalse*/) - { + { FUNC_LOG; // Check that we are not exiting and is fade effect activated if ( !iAppUi.AppUiExitOngoing() ) { TInt effectTime = 0; - + if ( !aImmediate && iAppUi.LayoutHandler() ) { if( aFadeDirectionOut ) @@ -333,18 +330,18 @@ effectTime = iAppUi.LayoutHandler()->ViewFadeInEffectTime(); } } - + if ( aFadeDirectionOut && IsNextTransitionOutLong() ) { effectTime = effectTime * 2; } - + // Initialize for out fading TAlfTimedValue timedValue( 0, effectTime ); // Check value and initialze for in fading if set if ( !aFadeDirectionOut ) { - timedValue.SetTarget( 1, effectTime ); + timedValue.SetTarget( 1, effectTime ); } aVisual->SetOpacity( timedValue ); } @@ -376,16 +373,16 @@ if ( !iAppUi.AppUiExitOngoing() ) { TAlfGroupCommand showCmd( ControlGroup(), EAlfOpShow, &iAppUi.Display() ); - iAppUi.AlfEnv().Send( showCmd, aDelay ); + iAppUi.AlfEnv().Send( showCmd, aDelay ); ControlGroup().SetAcceptInput( ETrue ); - + // Status indicator is "always on top" while visible /*if ( iAppUi.StatusIndicator() && iAppUi.StatusIndicator()->IsVisible() ) { CAlfControlGroup& indicatorGroup = iAppUi.AlfEnv().ControlGroup( KStatusIndicatorDisplayGroup ); TAlfGroupCommand indicShowCmd( indicatorGroup, EAlfOpShow, &iAppUi.Display() ); - iAppUi.AlfEnv().Send( indicShowCmd, 0 ); - indicatorGroup.SetAcceptInput( EFalse ); + iAppUi.AlfEnv().Send( indicShowCmd, 0 ); + indicatorGroup.SetAcceptInput( EFalse ); }*/ } } @@ -396,12 +393,12 @@ { FUNC_LOG; const TReal32 KDelta = 0.01; // floating point comparison tolerance - + if ( !iAppUi.AppUiExitOngoing() ) { ControlGroup().SetAcceptInput( EFalse ); - - // Hide the control group immediately only if it's not already faded or + + // Hide the control group immediately only if it's not already faded or // fading out. This is to not interfere with the cross fading effect. RPointerArray<CAlfVisual> layoutArray; TRAP_IGNORE( GetParentLayoutsL( layoutArray ) ); @@ -409,14 +406,14 @@ TInt fadingCount = 0; for ( TInt i = 0 ; i < layoutCount ; ++i ) { - CAlfVisual* layout = layoutArray[i]; + CAlfVisual* layout = layoutArray[i]; if ( layout && layout->Opacity().Target() < KDelta ) { fadingCount++; } } layoutArray.Close(); - + if ( !layoutCount || fadingCount != layoutCount ) { iAppUi.AlfEnv().CancelCommands( &ControlGroup(), EAlfOpShow ); @@ -458,16 +455,16 @@ void CFsEmailUiViewBase::HandleDynamicVariantSwitchL( TDynamicSwitchType aType ) { FUNC_LOG; -// <cmail> Toolbar +// <cmail> Toolbar switch (aType) { case EScreenLayoutChanged: - UpdateToolbarL(); + UpdateToolbarL(); break; } -// </cmail> Toolbar +// </cmail> Toolbar // Inherited classes should override this to react to skin and layout changes - + #ifdef __WINSCW__ // For emulator testing: landscape mode is "flip open" FlipStateChangedL( Layout_Meta_Data::IsLandscapeOrientation() ); @@ -481,7 +478,7 @@ FUNC_LOG; // Inherited classes should override this to react to skin and layout changes // which happen while the view is on background - + #ifdef __WINSCW__ // For emulator testing: landscape mode is "flip open" FlipStateChangedL( Layout_Meta_Data::IsLandscapeOrientation() ); @@ -490,7 +487,7 @@ // --------------------------------------------------------------------------- // -TBool CFsEmailUiViewBase::IsNextMsgAvailable( TFSMailMsgId /*aCurrentMsgId*/, +TBool CFsEmailUiViewBase::IsNextMsgAvailable( TFSMailMsgId /*aCurrentMsgId*/, TFSMailMsgId& /*aFoundNextMsgId*/, TFSMailMsgId& /*aFoundNextMsgFolderId*/ ) const { @@ -500,7 +497,7 @@ // --------------------------------------------------------------------------- // -TBool CFsEmailUiViewBase::IsPreviousMsgAvailable( TFSMailMsgId /*aCurrentMsgId*/, +TBool CFsEmailUiViewBase::IsPreviousMsgAvailable( TFSMailMsgId /*aCurrentMsgId*/, TFSMailMsgId& /*aFoundPreviousMsgId*/, TFSMailMsgId& /*aFoundPrevMsgFolderId*/ ) const { @@ -519,13 +516,21 @@ // --------------------------------------------------------------------------- // -TInt CFsEmailUiViewBase::MoveToPreviousMsgL( TFSMailMsgId /*aCurrentMsgId*/, +TInt CFsEmailUiViewBase::MoveToPreviousMsgL( TFSMailMsgId /*aCurrentMsgId*/, TFSMailMsgId& /*aFoundPreviousMsgId*/ ) { FUNC_LOG; return KErrNotFound; } +// --------------------------------------------------------------------------- +// +TInt CFsEmailUiViewBase::MoveToPreviousMsgAfterDeleteL( TFSMailMsgId /*aFoundPreviousMsgId*/ ) + { + FUNC_LOG; + return KErrNotFound; + } + //--------------------------------------------------------------------------- // Concrete view class may override //--------------------------------------------------------------------------- @@ -599,9 +604,9 @@ { FUNC_LOG; CEikButtonGroupContainer* cba = Cba(); - if ( cba ) + if ( cba ) { - cba->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition, + cba->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition, aLabelResourceId ); cba->DrawDeferred(); } @@ -619,11 +624,11 @@ // ----------------------------------------------------------------------------- // CFsEmailUiViewBase::ToolbarResourceId -// +// // ----------------------------------------------------------------------------- TInt CFsEmailUiViewBase::ToolbarResourceId() const { - FUNC_LOG; + FUNC_LOG; return R_FREESTYLE_EMAIL_UI_TOOLBAR_BLANK; } @@ -675,11 +680,9 @@ // ----------------------------------------------------------------------------- // CFsEmailUiViewBase::HandleTimerFocusStateChange // ----------------------------------------------------------------------------- -void CFsEmailUiViewBase::HandleTimerFocusStateChange(TBool aShow) +void CFsEmailUiViewBase::FocusVisibilityChange( TBool aVisible ) { - iFocusVisible = aShow; + iFocusVisible = aVisible; } - // end of file -
--- a/emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -46,7 +46,6 @@ _LIT8( KBccFieldName, "bcc_field"); _LIT8( KSentFieldName, "sent_field"); _LIT8( KSubjectFieldName, "subject_field"); -_LIT8( KAttachmentFieldName, "attachment_field"); _LIT8( KToImageName, "to_img"); _LIT8( KCcImageName, "cc_img"); @@ -58,34 +57,36 @@ _LIT8( KSpace8, " "); _LIT8( KMetaHeader, "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n" ); -const TInt KMaxEventLength = 256; +const TInt KMaxEventLength( 256 ); +const TInt KFreestyleMessageHeaderHTMLRightMarginInPx( 10 ); +const TInt KFreestyleMessageHeaderHTMLMaxBufferSizeForWidth( 5 ); -EXPORT_C CFreestyleMessageHeaderHTML* CFreestyleMessageHeaderHTML::NewL( CFSMailMessage& aMailMessage ) +EXPORT_C CFreestyleMessageHeaderHTML* CFreestyleMessageHeaderHTML::NewL( CFSMailMessage& aMailMessage, TInt aVisibleWidth ) { - CFreestyleMessageHeaderHTML* self = new (ELeave) CFreestyleMessageHeaderHTML( aMailMessage ); + CFreestyleMessageHeaderHTML* self = new (ELeave) CFreestyleMessageHeaderHTML( aMailMessage, aVisibleWidth ); self->ConstructL(); return self; } -EXPORT_C void CFreestyleMessageHeaderHTML::ExportL( CFSMailMessage& aMailMessage, RWriteStream& aWriteStream ) +EXPORT_C void CFreestyleMessageHeaderHTML::ExportL( CFSMailMessage& aMailMessage, RWriteStream& aWriteStream, TInt aVisibleWidth ) { - CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage ); + CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage, aVisibleWidth ); CleanupStack::PushL( headerHtml ); headerHtml->ExportL( aWriteStream ); CleanupStack::PopAndDestroy( headerHtml ); } -EXPORT_C void CFreestyleMessageHeaderHTML::ExportL( CFSMailMessage& aMailMessage, RFile& aFile ) +EXPORT_C void CFreestyleMessageHeaderHTML::ExportL( CFSMailMessage& aMailMessage, RFile& aFile, TInt aVisibleWidth ) { - CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage ); + CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage, aVisibleWidth ); CleanupStack::PushL( headerHtml ); headerHtml->ExportL( aFile ); CleanupStack::PopAndDestroy( headerHtml ); } -EXPORT_C void CFreestyleMessageHeaderHTML::ExportL( CFSMailMessage& aMailMessage, RFs& aFs, const TPath& aFilePath) +EXPORT_C void CFreestyleMessageHeaderHTML::ExportL( CFSMailMessage& aMailMessage, RFs& aFs, const TPath& aFilePath, TInt aVisibleWidth ) { - CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage ); + CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage, aVisibleWidth ); CleanupStack::PushL( headerHtml ); headerHtml->ExportL( aFs, aFilePath ); CleanupStack::PopAndDestroy( headerHtml ); @@ -122,11 +123,12 @@ CleanupStack::PopAndDestroy( &fwstream ); } -CFreestyleMessageHeaderHTML::CFreestyleMessageHeaderHTML( CFSMailMessage& aMailMessage ) +CFreestyleMessageHeaderHTML::CFreestyleMessageHeaderHTML( CFSMailMessage& aMailMessage, TInt aVisibleWidth ) : iMailMessage( aMailMessage ) { - } - + iVisibleWidth = aVisibleWidth - KFreestyleMessageHeaderHTMLRightMarginInPx; + } + void CFreestyleMessageHeaderHTML::ConstructL() { iMailMessage.AttachmentListL( iAttachments ); @@ -184,10 +186,10 @@ ExportToL( aWriteStream ); ExportCcL( aWriteStream ); ExportBccL( aWriteStream ); - ExportAttachmentsL( aWriteStream ); ExportSentTimeL( aWriteStream ); ExportSubjectL( aWriteStream ); EndHeaderTableL( aWriteStream ); + ExportAttachmentsL( aWriteStream ); HTMLBodyEndL( aWriteStream ); } @@ -198,14 +200,24 @@ } void CFreestyleMessageHeaderHTML::ExportInitialTableL( RWriteStream& aWriteStream ) const { - aWriteStream.WriteL(_L8("<table id=\"table_initial\" border=\"0\" width=\"50%\">\n")); - aWriteStream.WriteL(_L8("<tr>\n")); + + // set the width, using the visible screen width + TBuf8<KFreestyleMessageHeaderHTMLMaxBufferSizeForWidth> tableWidth; + tableWidth.AppendNum( iVisibleWidth ); + aWriteStream.WriteL(_L8("<table id=\"table_initial\" border=\"0\" width=\"")); + aWriteStream.WriteL( tableWidth ); + aWriteStream.WriteL( _L8("px\">\n")); + - // Add "show details" image - aWriteStream.WriteL(_L8("<td width=\"1\" valign=middle><image id=\"detail_img\" border=\"0\" src=\"plus.gif\" onClick=\"expandHeader()\" ></td>\n")); - - //Sent time - aWriteStream.WriteL(_L8("<td id=\"sent_initial\" valign=bottom>")); + // start first row: table with the sent info and the '+' icon + aWriteStream.WriteL(_L8("<tr><td><table id=\"table_sent_and_plus\" border=\"0\" width=\"")); + aWriteStream.WriteL( tableWidth ); + aWriteStream.WriteL( _L8("px\">\n")); + + aWriteStream.WriteL(_L8("<tr>\n")); + + // add Sent time and date + aWriteStream.WriteL(_L8("<td id=\"sent_initial\" align=\"left\" valign=\"bottom\">")); HBufC* dateText = TFsEmailUiUtility::DateTextFromMsgLC( &iMailMessage ); HBufC* timeText = TFsEmailUiUtility::TimeTextFromMsgLC( &iMailMessage ); @@ -223,29 +235,32 @@ CleanupStack::PopAndDestroy( sentTimeText ); CleanupStack::PopAndDestroy( timeText ); CleanupStack::PopAndDestroy( dateText ); - - aWriteStream.WriteL(_L8("</td>\n</tr>\n")); - aWriteStream.WriteL(_L8("<tr id=\"subject_initial\">\n")); + + aWriteStream.WriteL(_L8("</td>\n")); + + // add "show details" image on the same line as Sent time and date + aWriteStream.WriteL(_L8("<td width=\"1\" valign=\"top\" align=\"right\" style=\"padding: 0px 10px 0px 0px;\"><image id=\"detail_img\" border=\"0\" src=\"plus.gif\" onClick=\"expandHeader()\" ></td>\n")); + + // finish first row + aWriteStream.WriteL(_L8("</tr>\n")); + aWriteStream.WriteL(_L8("</table></td></tr>\n")); - if ( iAttachments.Count() > 0 ) - { - aWriteStream.WriteL(_L8("<td width=\"1\" align=left><image src=\"")); - aWriteStream.WriteL(KAttachementIconGeneral); - aWriteStream.WriteL(_L8("\" ></td>\n")); - } - else - { - aWriteStream.WriteL(_L8("<td></td>\n")); - } - aWriteStream.WriteL(_L8("<td valign=middle><b>")); - //Subject + //============================= + // start second row which contains subject + aWriteStream.WriteL(_L8("<tr>\n")); + aWriteStream.WriteL(_L8("<td id=\"subject_initial\" align=\"left\"><b>")); + HBufC8* subject8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( iMailMessage.GetSubject() ); CleanupStack::PushL( subject8 ); aWriteStream.WriteL( *subject8 ); CleanupStack::PopAndDestroy( subject8 ); - aWriteStream.WriteL(_L8("</b></td>\n</tr>\n</table>\n")); - + aWriteStream.WriteL(_L8("</b></td>\n")); + aWriteStream.WriteL(_L8("</tr>\n")); // finish subject row + + // end table_initial + aWriteStream.WriteL(_L8("</table>\n")); + aWriteStream.CommitL(); } void CFreestyleMessageHeaderHTML::HTMLBodyEndL( RWriteStream& aWriteStream ) const @@ -258,7 +273,7 @@ { aWriteStream.WriteL( _L8("<tr id=\"") ); aWriteStream.WriteL( KSubjectFieldName ); - aWriteStream.WriteL( _L8("\">\n") ); + aWriteStream.WriteL( _L8("\">") ); aWriteStream.WriteL( _L8("<td width=\"1\">") ); @@ -267,9 +282,11 @@ aWriteStream.WriteL( *subjectHeadingText ); CleanupStack::PopAndDestroy( subjectHeadingText ); aWriteStream.WriteL( _L8("</b>") ); - aWriteStream.WriteL( _L8("</td>\n") ); + aWriteStream.WriteL( _L8("</td>") ); aWriteStream.WriteL( _L8("</tr>\n") ); - aWriteStream.WriteL( _L8("<tr>\n") ); + + // subject text + aWriteStream.WriteL( _L8("<tr>") ); aWriteStream.WriteL( _L8("<td>") ); HBufC8* subject8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( iMailMessage.GetSubject() ); @@ -277,8 +294,7 @@ aWriteStream.WriteL( *subject8 ); CleanupStack::PopAndDestroy( subject8 ); - aWriteStream.WriteL( _L8("</td>\n") ); - + aWriteStream.WriteL( _L8("</td>") ); aWriteStream.WriteL( _L8("</tr>\n") ); aWriteStream.CommitL(); @@ -293,26 +309,30 @@ { froms.AppendL( from ); } - ExportEmailAddressesL(aWriteStream, FreestyleMessageHeaderURLFactory::EEmailAddressTypeFrom, froms ); + ExportEmailAddressesL( aWriteStream, FreestyleMessageHeaderURLFactory::EEmailAddressTypeFrom, froms, + KFromFieldName, KFromTableName, R_FREESTYLE_EMAIL_UI_VIEWER_FROM ); CleanupStack::PopAndDestroy( &froms ); } void CFreestyleMessageHeaderHTML::ExportToL( RWriteStream& aWriteStream ) const { RPointerArray<CFSMailAddress>& recipients = iMailMessage.GetToRecipients(); - ExportEmailAddressesL( aWriteStream, FreestyleMessageHeaderURLFactory::EEmailAddressTypeTo, recipients ); + ExportEmailAddressesL( aWriteStream, FreestyleMessageHeaderURLFactory::EEmailAddressTypeTo, recipients, + KToFieldName, KToTableName, R_FREESTYLE_EMAIL_UI_VIEWER_TO ); } void CFreestyleMessageHeaderHTML::ExportCcL( RWriteStream& aWriteStream ) const { RPointerArray<CFSMailAddress>& recipients = iMailMessage.GetCCRecipients(); - ExportEmailAddressesL( aWriteStream, FreestyleMessageHeaderURLFactory::EEmailAddressTypeCc, recipients ); + ExportEmailAddressesL( aWriteStream, FreestyleMessageHeaderURLFactory::EEmailAddressTypeCc, recipients, + KCcFieldName, KCcTableName, R_FREESTYLE_EMAIL_UI_VIEWER_CC ); } void CFreestyleMessageHeaderHTML::ExportBccL( RWriteStream& aWriteStream ) const { RPointerArray<CFSMailAddress>& recipients = iMailMessage.GetBCCRecipients(); - ExportEmailAddressesL( aWriteStream, FreestyleMessageHeaderURLFactory::EEmailAddressTypeBcc, recipients ); + ExportEmailAddressesL( aWriteStream, FreestyleMessageHeaderURLFactory::EEmailAddressTypeBcc, recipients, + KBccFieldName, KBccTableName, R_FREESTYLE_EMAIL_UI_VIEWER_BCC ); } void CFreestyleMessageHeaderHTML::ExportSentTimeL( RWriteStream& aWriteStream ) const @@ -320,7 +340,7 @@ aWriteStream.WriteL( _L8("<tr id=\"") ); aWriteStream.WriteL( KSentFieldName ); - aWriteStream.WriteL( _L8("\">\n") ); + aWriteStream.WriteL( _L8("\">") ); aWriteStream.WriteL( _L8("<td width=\"1\">") ); @@ -329,10 +349,10 @@ aWriteStream.WriteL( *sentHeadingText ); CleanupStack::PopAndDestroy( sentHeadingText ); aWriteStream.WriteL( _L8("</b>") ); - aWriteStream.WriteL( _L8("</td>\n") ); + aWriteStream.WriteL( _L8("</td>") ); aWriteStream.WriteL( _L8("</tr>\n") ); - aWriteStream.WriteL( _L8("<tr>\n") ); + aWriteStream.WriteL( _L8("<tr>") ); aWriteStream.WriteL( _L8("<td>") ); HBufC* dateText = TFsEmailUiUtility::DateTextFromMsgLC( &iMailMessage ); @@ -352,7 +372,7 @@ CleanupStack::PopAndDestroy( timeText ); CleanupStack::PopAndDestroy( dateText ); - aWriteStream.WriteL( _L8("</td>\n") ); + aWriteStream.WriteL( _L8("</td>") ); aWriteStream.WriteL( _L8("</tr>\n") ); @@ -361,150 +381,77 @@ void CFreestyleMessageHeaderHTML::ExportAttachmentsL( RWriteStream& aWriteStream ) const { - if ( iAttachments.Count() > 0 ) + + TInt attachmentsCount( iAttachments.Count() ); + if ( attachmentsCount ) { - aWriteStream.WriteL( _L8("<tr id=\"") ); - aWriteStream.WriteL( KAttachmentFieldName ); - aWriteStream.WriteL( _L8("\">\n") ); - - aWriteStream.WriteL( _L8("<td width=\"1\">") ); - aWriteStream.WriteL( _L8("<b>") ); + // The attachments table consists of one row that contains 2 cells + // first cell contains the attachment icon + // second cell contains a table which contains the attachments list - HBufC8* attachmentHeadingText = HeadingTextLC( R_FREESTYLE_EMAIL_UI_VIEWER_ATTACHMENT, iAttachments.Count()); - aWriteStream.WriteL( *attachmentHeadingText ); - CleanupStack::PopAndDestroy( attachmentHeadingText ); - - - aWriteStream.WriteL( _L8(":</b>") ); - aWriteStream.WriteL( _L8("</td>\n") ); - aWriteStream.WriteL( _L8("</tr>\n") ); - - + // start attachments table + aWriteStream.WriteL( _L8("<table id=\"") ); + aWriteStream.WriteL( KAttachmentTableName ); + aWriteStream.WriteL( _L8("\" border=\"0\" width=\"100%\">\n") ); // width is set at 100% intentionally + + // start row + aWriteStream.WriteL( _L8("<tr>\n") ); + + // add attachment icon + aWriteStream.WriteL( _L8("<td width=\"1\" valign=\"top\" align=\"right\"><image src=\"") ); + aWriteStream.WriteL( KAttachementIconGeneral ); + aWriteStream.WriteL( _L8("\" ></td>\n") ); + + // start table of attachments as a table within a cell aWriteStream.WriteL( _L8("<td>\n") ); - StartTableL( aWriteStream, KAttachmentTableName ); - for (TInt i=0; i<iAttachments.Count(); i++) + aWriteStream.WriteL(_L8("<table id=\"table_attachments_list\" border=\"0\" width=\"100%\">\n")); + for (TInt i=0; i < attachmentsCount; i++) { AddAttachmentL( aWriteStream, *iAttachments[i] ); } - EndTableL( aWriteStream ); + + aWriteStream.WriteL(_L8("</table>\n")); // end table_attachments_list aWriteStream.WriteL( _L8("</td>\n") ); - + aWriteStream.WriteL( _L8("</tr>\n") ); + aWriteStream.WriteL(_L8("</table>\n")); // end attachments table } } -void CFreestyleMessageHeaderHTML::ExportEmailAddressesL( RWriteStream& aWriteStream, - FreestyleMessageHeaderURLFactory::TEmailAddressType aEmailAddressType, - const RPointerArray<CFSMailAddress>& aEmailAddresses ) const +void CFreestyleMessageHeaderHTML::ExportEmailAddressesL( RWriteStream& aWriteStream, + FreestyleMessageHeaderURLFactory::TEmailAddressType aEmailAddressType, + const RPointerArray<CFSMailAddress>& aEmailAddresses, + const TDesC8& aRowId, + const TDesC8& /*aTableId*/, + TInt aHeaderTextResourceId ) const { - if (aEmailAddresses.Count() == 0) - { - return; - } - - aWriteStream.WriteL( _L8("<tr id=\"") ); - switch ( aEmailAddressType ) + if ( aEmailAddresses.Count() ) { - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeFrom: - aWriteStream.WriteL( KFromFieldName ); - break; - - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeTo: - aWriteStream.WriteL( KToFieldName ); - break; - - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeCc: - aWriteStream.WriteL( KCcFieldName ); - break; - - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeBcc: - aWriteStream.WriteL( KBccFieldName ); - break; - - default: - User::Leave( KErrNotSupported ); - } - aWriteStream.WriteL( _L8("\">\n") ); - - - aWriteStream.WriteL( _L8("<td width=\"1\">") ); - aWriteStream.WriteL( _L8("<b>") ); - - switch ( aEmailAddressType ) - { - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeFrom: + // begin table row + aWriteStream.WriteL( _L8("<tr id=\"")); + aWriteStream.WriteL( aRowId ); + aWriteStream.WriteL( _L8("\">") ); + + // heading text + aWriteStream.WriteL( _L8("<td><b>")); + HBufC8* headingText = HeadingTextLC( aHeaderTextResourceId ); + aWriteStream.WriteL( *headingText ); + CleanupStack::PopAndDestroy( headingText ); + aWriteStream.WriteL( _L8("</b></td>")); + + aWriteStream.WriteL( _L8("</tr>\n") ); // end table row + + // add addresses, one address per row + TInt count( aEmailAddresses.Count() ); + for (TInt i = 0; i < count; ++i ) { - HBufC8* fromHeadingText = HeadingTextLC( R_FREESTYLE_EMAIL_UI_VIEWER_FROM ); - aWriteStream.WriteL( *fromHeadingText ); - CleanupStack::PopAndDestroy( fromHeadingText ); + aWriteStream.WriteL( _L8("<tr><td style=\"padding: 0px 0px 7px 0px;\">") ); + AddEmailAddressL (aWriteStream, aEmailAddressType, *aEmailAddresses[i] ); + aWriteStream.WriteL( _L8("</td></tr>\n") ); } - break; - - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeTo: - { - HBufC8* toHeadingText = HeadingTextLC( R_FREESTYLE_EMAIL_UI_VIEWER_TO ); - aWriteStream.WriteL( *toHeadingText ); - CleanupStack::PopAndDestroy( toHeadingText ); - } - break; - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeCc: - { - HBufC8* ccHeadingText = HeadingTextLC( R_FREESTYLE_EMAIL_UI_VIEWER_CC ); - aWriteStream.WriteL( *ccHeadingText ); - CleanupStack::PopAndDestroy( ccHeadingText ); - } - break; - - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeBcc: - { - HBufC8* bccHeadingText = HeadingTextLC( R_FREESTYLE_EMAIL_UI_VIEWER_BCC ); - aWriteStream.WriteL( *bccHeadingText ); - CleanupStack::PopAndDestroy( bccHeadingText ); - } - break; - - default: - User::Leave( KErrNotSupported ); + aWriteStream.CommitL(); } - aWriteStream.WriteL( _L8("</b>") ); - aWriteStream.WriteL( _L8("</td>\n") ); - aWriteStream.WriteL( _L8("</tr>\n") ); - - aWriteStream.WriteL( _L8("<tr>\n") ); - aWriteStream.WriteL( _L8("<td>") ); - - switch ( aEmailAddressType ) - { - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeTo: - StartTableL( aWriteStream, KToTableName ); - break; - - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeCc: - StartTableL( aWriteStream, KCcTableName ); - break; - - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeBcc: - StartTableL( aWriteStream, KBccTableName ); - break; - case FreestyleMessageHeaderURLFactory::EEmailAddressTypeFrom: - StartTableL( aWriteStream, KFromTableName ); - break; - - default: - User::Leave( KErrNotSupported ); - } - for ( TInt i=0; i<aEmailAddresses.Count(); i++ ) - { - aWriteStream.WriteL( _L8("<tr><td>") ); - AddEmailAddressL (aWriteStream, aEmailAddressType, *aEmailAddresses[i] ); - aWriteStream.WriteL( _L8("</td></tr>\n") ); - } - - EndTableL( aWriteStream ); - aWriteStream.WriteL( _L8("</td>\n") ); - aWriteStream.WriteL( _L8("</tr>\n") ); - aWriteStream.CommitL(); } void CFreestyleMessageHeaderHTML::AddEmailAddressL( RWriteStream& aWriteStream, @@ -542,7 +489,7 @@ void CFreestyleMessageHeaderHTML::AddAttachmentL( RWriteStream& aWriteStream, CFSMailMessagePart& aAttachment ) const { - aWriteStream.WriteL( _L8("<tr><td>") ); + aWriteStream.WriteL( _L8("<tr><td style=\"padding: 0px 0px 7px 0px;\">") ); // pad bottom to allow some space between the lines TUint id = aAttachment.GetPartId().Id(); TBuf<32> itemId; @@ -568,10 +515,10 @@ TUint sizeInKB = size / 1024; if ( size % 1024 ) - { - // round up - ++sizeInKB; - } + { + // round up + ++sizeInKB; + } TBuf8<32> sizeText; sizeText.Append( KSpace8 ); @@ -639,12 +586,21 @@ aWriteStream.WriteL( aTableId ); // use style="display:none" so that full header table is hidden initially - aWriteStream.WriteL( _L8("\" border=\"0\" width=\"50%\" style=\"display: none\">\n") ); + aWriteStream.WriteL( _L8("\" border=\"0\" width=\"100%\" style=\"display: none\">\n") ); + - // Add "hide details" image - aWriteStream.WriteL(_L8("<tr>\n")); - aWriteStream.WriteL(_L8("<td width=\"1\" valign=middle><image id=\"hideDetails_img\" border=\"0\" src=\"minus.gif\" onClick=\"collapseHeader()\"></td>\n")); - aWriteStream.WriteL(_L8("</tr>\n")); + TBuf8<KFreestyleMessageHeaderHTMLMaxBufferSizeForWidth> tableWidth; + tableWidth.AppendNum( iVisibleWidth ); + + // Add "hide details" image as its own table with its own width + aWriteStream.WriteL( _L8("<tr><td>\n")); + aWriteStream.WriteL(_L8("<table id =\"table_minus_icon\" border=\"0\" width=\"")); + aWriteStream.WriteL( tableWidth ); + aWriteStream.WriteL( _L8("px\">\n")); + aWriteStream.WriteL( _L8("<tr>\n")); + aWriteStream.WriteL( _L8("<td valign=\"top\" align=\"right\" style=\"padding: 0px 10px 0px 0px;\"><image id=\"hideDetails_img\" border=\"0\" src=\"minus.gif\" onClick=\"collapseHeader()\"></td>\n")); + aWriteStream.WriteL( _L8("</tr>\n")); + aWriteStream.WriteL( _L8("</table></td></tr>\n")); aWriteStream.CommitL(); } @@ -780,3 +736,6 @@ aWriteStream.WriteL( _L8("</div>\n") ); aWriteStream.CommitL(); } + + +
--- a/emailuis/emailui/src/FreestyleMessageHeaderURLEventHandler.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleMessageHeaderURLEventHandler.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -191,7 +191,22 @@ if ( found == KErrNotFound ) { - User::Leave( KErrNotFound ); + // Probably, only the headers were downloaded. Check if attachments + // were downloaded later. + iAttachmentsListModel->UpdateListL( iMailMessage ); + for (TInt i=0; i<iAttachmentsListModel->GetModel().Count(); i++) + { + if ( iAttachmentsListModel->GetModel()[i].partData.iMessagePartId.Id() == id ) + { + found = i; + break; + } + } + + if ( found == KErrNotFound ) + { + User::Leave( KErrNotFound ); + } } return iAttachmentsListModel->GetModel()[found]; @@ -217,7 +232,7 @@ if ( iView.IsEmbeddedMsgSavingAllowed() || !iAttachmentsListModel->IsMessage( aAttachment ) ) { CFSEmailUiActionMenu::AddCustomItemL( FsEActionAttachmentSave ); - } + } } else
--- a/emailuis/emailui/src/freestyleemailuimailboxdeleter.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/freestyleemailuimailboxdeleter.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -81,68 +81,127 @@ // allows the user to mark multiple mailboxes for deletion if aId is NullId. // --------------------------------------------------------------------------- // - void CFSEmailUiMailboxDeleter::DeleteMailboxL() { - // Make sure that FSMailServer is running so that the mailboxes will also - // be removed from MCE. - TFsEmailUiUtility::EnsureFsMailServerIsRunning( CCoeEnv::Static()->WsSession() ); + iMailboxesToDelete.Reset(); + // Get the deletable mailboxes. + RPointerArray<CFSMailBox> mailboxes; + const TInt mailboxCount = GetDeletableMailboxesLC( mailboxes ); + + TBool res( EFalse ); + + if( mailboxCount == 1 ) + { + res = DeleteSingleMailboxL( mailboxes ); + } + else if( mailboxCount > 1 ) + { + res = DeleteMultipleMailboxesL( mailboxes ); + } + + CleanupStack::PopAndDestroy(); // mailboxes + + if ( res ) + { + DoDeleteSelectedMailboxesL(); + } + } + +// --------------------------------------------------------------------------- +// DeleteMailboxL() +// Deletes the given mailbox. Displays also a confirmation dialog. +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailboxDeleter::DeleteMailboxL( const TFSMailMsgId& aMailboxId ) + { iMailboxesToDelete.Reset(); - // Get mailbox count + // Get the deletable mailboxes. RPointerArray<CFSMailBox> mailboxes; - CleanupResetAndDestroyClosePushL( mailboxes ); + const TInt mailboxCount = GetDeletableMailboxesLC( mailboxes ); + + // Make sure that it is allowed to delete the mailbox with the given ID. + CFSMailBox* mailbox = NULL; + + for ( TInt i( 0 ); i < mailboxCount; ++i ) + { + mailbox = mailboxes[i]; + + if ( mailbox && mailbox->GetId() == aMailboxId ) + { + // The mailbox can be deleted. + break; + } + + mailbox = NULL; + } + + if ( !mailbox ) + { + // Either no mailbox with the given ID exist or it is not allowed to + // be deleted. + // TODO Display an error message? + CleanupStack::PopAndDestroy(); // mailboxes + return; + } + + TBool response = ConfirmMailboxDeletionL( 1, mailbox->GetName() ); + CleanupStack::PopAndDestroy(); // mailboxes + + if ( !response ) + { + // User did not confirm the deletion. + return; + } + iMailboxesToDelete.AppendL( aMailboxId ); + DoDeleteSelectedMailboxesL(); + } + + +// --------------------------------------------------------------------------- +// GetDeletableMailboxesLC() +// Returns the mailboxes that can be deleted. +// --------------------------------------------------------------------------- +// +TInt CFSEmailUiMailboxDeleter::GetDeletableMailboxesLC( + RPointerArray<CFSMailBox>& aMailboxes ) + { + // Make sure that FSMailServer is running so that the mailboxes will also + // be removed from MCE. + TFsEmailUiUtility::EnsureFsMailServerIsRunning( + CCoeEnv::Static()->WsSession() ); + + CleanupResetAndDestroyClosePushL( aMailboxes ); + + // Get the mailboxes. TFSMailMsgId id; - User::LeaveIfError( iMailClient.ListMailBoxes( id, mailboxes ) ); - - CFSMailBox* mailBox = NULL; + User::LeaveIfError( iMailClient.ListMailBoxes( id, aMailboxes ) ); + + CFSMailBox* mailbox = NULL; // Filter out mailboxes that can't be deleted. - for( TInt i(0); i < mailboxes.Count(); ) + const TInt mailboxCount( aMailboxes.Count() ); + + for( TInt i( 0 ); i < mailboxCount; ) { - mailBox = mailboxes[i]; - if( !mailBox->HasCapability( EFSMBoxCapaCanBeDeleted ) ) + mailbox = aMailboxes[i]; + + if( !mailbox->HasCapability( EFSMBoxCapaCanBeDeleted ) ) { - delete mailBox; - mailboxes.Remove( i ); + delete mailbox; + aMailboxes.Remove( i ); } else { ++i; } } - - TBool res( EFalse ); - - if( mailboxes.Count() == 1 ) - { - res = DeleteSingleMailboxL( mailboxes ); - } - else if( mailboxes.Count() > 1 ) - { - res = DeleteMultipleMailboxesL( mailboxes ); - } - CleanupStack::PopAndDestroy(); // mailboxes - - if( res && ( iMailboxesToDelete.Count() > 0 ) ) - { - // Start wait note. - iWaitDialog = new (ELeave) CAknWaitDialog( - (REINTERPRET_CAST(CEikDialog**, &iWaitDialog)), EFalse ); - iWaitDialog->PrepareLC( R_FS_WAIT_NOTE_REMOVING_MAILBOX ); - iWaitDialog->SetCallback( this ); - iWaitDialog->RunLD(); + return aMailboxes.Count(); + } - // Set email indicator off. - TFsEmailUiUtility::ToggleEmailIconL(EFalse); - - // Delete first mailbox in queue. - DoDeleteNextMailboxL(); - } - } // --------------------------------------------------------------------------- // DeleteSingleMailboxL @@ -162,6 +221,7 @@ return res; } + // --------------------------------------------------------------------------- // DeleteMultipleMailboxesL // --------------------------------------------------------------------------- @@ -216,6 +276,36 @@ return res; } + +// --------------------------------------------------------------------------- +// DoDeleteSelectedMailboxesL() +// Deletes the selected mailboxes i.e. those of which IDs are in the +// iMailboxesToDelete array. +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailboxDeleter::DoDeleteSelectedMailboxesL() + { + if ( iMailboxesToDelete.Count() < 1 ) + { + // Nothing to delete! + return; + } + + // Start wait note. + iWaitDialog = new ( ELeave ) CAknWaitDialog( + ( REINTERPRET_CAST( CEikDialog**, &iWaitDialog ) ), EFalse ); + iWaitDialog->PrepareLC( R_FS_WAIT_NOTE_REMOVING_MAILBOX ); + iWaitDialog->SetCallback( this ); + iWaitDialog->RunLD(); + + // Set email indicator off. + TFsEmailUiUtility::ToggleEmailIconL( EFalse ); + + // Delete first mailbox in queue. + DoDeleteNextMailboxL(); + } + + // --------------------------------------------------------------------------- // CreateMarkIconLC // ---------------------------------------------------------------------------
--- a/emailuis/emailui/src/ncsaddressinputfield.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/ncsaddressinputfield.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -95,11 +95,12 @@ // Create label //Load the label string HBufC* aTextBuf = StringLoader::LoadLC( aLabelTextId ); - //<cmail> - CreateControlsL( aTextBuf ? aTextBuf->Des() : TPtrC() ); - //</cmail> + + TPtrC captionText = aTextBuf ? aTextBuf->Des() : TPtrC(); + CreateControlsL( captionText ); - iTextEditor = new ( ELeave ) CNcsAifEditor( iSizeObserver ); + iTextEditor = new ( ELeave ) CNcsAifEditor( iSizeObserver, + captionText ); // iTextEditor is not completely constructed until in SetContainerWindowL() iTextEditor->SetPopupList(iAddressPopupList);
--- a/emailuis/emailui/src/ncsaifeditor.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/ncsaifeditor.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -219,8 +219,8 @@ // --------------------------------------------------------------------------- // CNcsAifEditor::CNcsAifEditor( - MNcsFieldSizeObserver* aSizeObserver ) - : CNcsEditor( aSizeObserver, ETrue, ENcsEditorAddress ), iAddressPopupList( NULL ), + MNcsFieldSizeObserver* aSizeObserver, const TDesC& aCaptionText ) + : CNcsEditor( aSizeObserver, ETrue, ENcsEditorAddress, aCaptionText ), iAddressPopupList( NULL ), iAddLeftover( ETrue ) { FUNC_LOG; @@ -346,7 +346,7 @@ CleanupStack::PopAndDestroy( text ); } - + iTextSelection = Selection(); ret = CNcsEditor::OfferKeyEventL( aKeyEvent, aType ); } return ret; @@ -375,6 +375,7 @@ } else if ( aEventType == MEikEdwinObserver::EEventNavigation ) { + iTextSelection = Selection(); HandleNavigationEventL(); } } @@ -396,31 +397,7 @@ // move the cursor for us. Then we check if it's in an entry. if ( aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow ) { - // make sure there is really some text inputted - TInt cursorPos( CursorPos() ); - - TCursorSelection selection = NonEntryTextAtPos( cursorPos ); - - TInt length( selection.Length() ); - - HBufC* text = HBufC::NewLC( length ); - TPtr ptr = text->Des(); - - if( selection.LowerPos() >= 0 ) - { - Text()->Extract( ptr, selection.LowerPos(), length ); - ptr.Trim(); - - // complete the entry - if( ptr.Length() > 0 ) - { - Text()->InsertL( selection.HigherPos(), KCharAddressDelimeterSemiColon ); - HandleTextChangedL(); - HandleTextUpdateL( TCursorSelection(selection.LowerPos(), selection.HigherPos() + 1) ); - } - } - - CleanupStack::PopAndDestroy( text ); + CompleteEntryL(); response = CNcsEditor::OfferKeyEventL( aKeyEvent,aType ); if ( response == EKeyWasConsumed ) @@ -1063,8 +1040,9 @@ { TInt matchesInText; TInt matchesInArray; - TInt arrayItemCurPos( iArray[i]->LowerPos() ); - + TInt arrayItemLowPos( iArray[i]->LowerPos() ); + TInt arrayItemHighPos( iArray[i]->HigherPos()); + GetMatchingEntryCountsL( iArray[i], matchesInText, matchesInArray ); // Entry is removed if: @@ -1074,13 +1052,18 @@ // In b) case the correct duplicate is the one that is in current // cursor position (or one off due to possible whitespace). if ( 0 == matchesInText || - ( matchesInText < matchesInArray && - ( currentCursorPos == arrayItemCurPos || - (1 + currentCursorPos) == arrayItemCurPos ) ) ) + ( matchesInText < matchesInArray ) && + ( currentCursorPos >= arrayItemLowPos && + currentCursorPos <= arrayItemHighPos )) { delete iArray[i]; iArray.Remove(i); removedEntryIndex = i; + if ( iTextSelection.iAnchorPos != iTextSelection.iCursorPos && + iTextSelection.HigherPos() < arrayItemHighPos ) + { + iPartialRemove = ETrue; + } } } @@ -1270,16 +1253,19 @@ const TInt entryCount = iArray.Count(); for ( TInt ii = entryCount - 1; ii >= 0; --ii ) { - TBool duplicateFound = EFalse; - for ( TInt jj = ii - 1; jj >= 0; --jj ) + if ( ii > 0 ) { - if ( iArray[ii]->IsSameDN( *iArray[jj] ) ) + TBool duplicateFound = EFalse; + for ( TInt jj = ii - 1; jj >= 0; --jj ) { - duplicateFound = ETrue; - iArray[jj]->SetDupL( ETrue ); + if ( iArray[ii]->IsSameDN( *iArray[jj] ) ) + { + duplicateFound = ETrue; + iArray[jj]->SetDupL( ETrue ); + } } + iArray[ii]->SetDupL( duplicateFound ); } - iArray[ii]->SetDupL( duplicateFound ); } } @@ -1332,9 +1318,13 @@ // add line feed after new entry TInt cursorPos( CursorPos() ); - Text()->InsertL( cursorPos, TChar(CEditableText::ELineBreak) ); + if ( !iPartialRemove ) + { + Text()->InsertL( cursorPos, TChar(CEditableText::ELineBreak) ); + } HandleTextChangedL(); - SetCursorPosL( cursorPos + 1, EFalse ); + SetCursorPosL( cursorPos + 1, EFalse ); + iPartialRemove = EFalse; } else { @@ -1604,5 +1594,78 @@ } } +// ----------------------------------------------------------------------------- +// CNcsAifEditor::HandlePointerEventL() +// Handles pointer events +// ----------------------------------------------------------------------------- +// +void CNcsAifEditor::HandlePointerEventL( const TPointerEvent& aPointerEvent ) + { + FUNC_LOG; + + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + CTextLayout* textLayout = TextLayout(); + TInt cursorPos = CursorPos(); + TPoint touchPoint( aPointerEvent.iPosition ); + + //adjust touch point to mach editor coordinates + touchPoint.iX -= Position().iX; + + TInt pointerLineNbr = textLayout->GetLineNumber( textLayout->XyPosToDocPosL( touchPoint )); + TInt cursorLineNbr = textLayout->GetLineNumber( cursorPos ); + + + if ( pointerLineNbr != cursorLineNbr ) + { + CompleteEntryL(); + + // We're moving to a new line. + CNcsAifEntry* entry = NULL; + entry = GetEntryAt( CursorPos() ); + if ( entry ) + { + SetSelectionL( entry->iCursorPos, entry->iAnchorPos ); + } + } + } + + CEikEdwin::HandlePointerEventL( aPointerEvent ); + } + + +// ----------------------------------------------------------------------------- +// CNcsAifEditor::CompleteEntryL() +// Adds semicolol to the of the entry +// ----------------------------------------------------------------------------- +// +void CNcsAifEditor::CompleteEntryL() + { + // make sure there is really some text inputted + TInt cursorPos( CursorPos() ); + + TCursorSelection selection = NonEntryTextAtPos( cursorPos ); + + TInt length( selection.Length() ); + + HBufC* text = HBufC::NewLC( length ); + TPtr ptr = text->Des(); + + if( selection.LowerPos() >= 0 ) + { + Text()->Extract( ptr, selection.LowerPos(), length ); + ptr.Trim(); + + // complete the entry + if( ptr.Length() > 0 ) + { + Text()->InsertL( selection.HigherPos(), KCharAddressDelimeterSemiColon ); + HandleTextChangedL(); + HandleTextUpdateL( TCursorSelection(selection.LowerPos(), selection.HigherPos() + 1) ); + } + } + + CleanupStack::PopAndDestroy( text ); + } // End of File
--- a/emailuis/emailui/src/ncscomposeview.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/ncscomposeview.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -2671,9 +2671,10 @@ // CNcsComposeView::FetchLogicComplete // ----------------------------------------------------------------------------- // -void CNcsComposeView::FetchLogicComplete( TComposerFetchState /*aState*/, TInt aError ) +TBool CNcsComposeView::FetchLogicComplete( TComposerFetchState /*aState*/, TInt aError ) { FUNC_LOG; + TBool result = EFalse; if ( iFirstStartCompleted ) // Safety { if ( !aError ) @@ -2686,6 +2687,7 @@ // something went wrong DoSafeExit(ENoSave); iMailFetchingErrCode = aError; + result = ETrue; } } if ( iFetchWaitDialog && !iFetchDialogCancelled ) @@ -2693,6 +2695,7 @@ TRAP_IGNORE(iFetchWaitDialog->ProcessFinishedL()); iFetchWaitDialog = NULL; } + return result; } // -----------------------------------------------------------------------------
--- a/emailuis/emailui/src/ncscomposeviewcontainer.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/ncscomposeviewcontainer.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -760,6 +760,8 @@ iMessageEditorMinHeigth = messageLineHeigth; } + UpdateFieldPosition( NULL ); + TRAP_IGNORE( UpdateScrollBarL() ); DrawNow(); @@ -1100,9 +1102,17 @@ { FUNC_LOG; + // If in 'To' field, go to msg. field + if(!iMessageField->IsFocused()) + { + SetFocusToMessageFieldL(); + } TInt pos = iMessageField->CursorPos(); TCursorSelection selIns( pos, pos ); iMessageField->InsertDeleteCharsL( pos, aText, selIns ); + //Fix for error EFTG-7Y63XG, moving cursor to the end of inserted text + pos += aText.Length(); + iMessageField->SetCursorPosL(pos,EFalse); DrawDeferred(); } @@ -1762,20 +1772,12 @@ void CNcsComposeViewContainer::HandleLayoutChangeL() { FUNC_LOG; - // <cmail> Platform layout change - const TRect rect( NcsUtility::ListscrollPaneRect() ); + TRect rect = iView.ClientRect(); SetRect( rect ); - // </cmail> Platform layout change if ( iHeader ) { iHeader->HandleDynamicVariantSwitchL(); } - // <cmail> Platform layout change - //TRect rect = iView.ClientRect(); - //SetApplicationRect( rect ); - //SetRect( rect ); - //UpdateScreenPositionL(); - // </cmail> Platform layout change UpdateScrollBarL(); }
--- a/emailuis/emailui/src/ncseditor.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/ncseditor.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -42,7 +42,8 @@ // CNcsEditor::CNcsEditor( MNcsFieldSizeObserver* aSizeObserver, TBool aHeaderField, - TNcsEditorUsage aEditorUsage ) : + TNcsEditorUsage aEditorUsage, + const TDesC& aCaptionText ) : MNcsControl( aSizeObserver ), iPreviousFontHeight( -1 ), iPreviousLineSpacingInTwips( -1 ), @@ -50,7 +51,8 @@ iHeaderField( aHeaderField ), iNcsFontType ( NcsUtility::ENcsHeaderDetailFont ), iEditorUsage( aEditorUsage ), - iRealRect( 0, 0, 0, 0 ) + iRealRect( 0, 0, 0, 0 ), + iCaptionText( aCaptionText.Alloc() ) { FUNC_LOG; } @@ -90,6 +92,7 @@ { delete iEditorCustomDrawer; } + delete iCaptionText; } // ----------------------------------------------------------------------------- @@ -687,3 +690,21 @@ iEditorCustomDrawer->UpdateLayout( GetLayout() ); } } + +void CNcsEditor::GetCaptionForFep(TDes& aCaption) const + { + const TInt maximumLength = aCaption.MaxLength(); + if ( iCaptionText && (iCaptionText->Length() < maximumLength) ) + { + TPtr ptr = iCaptionText->Des(); + aCaption.Copy( ptr ); + } + } + +TCoeInputCapabilities CNcsEditor::InputCapabilities() const + { + TCoeInputCapabilities caps = CEikEdwin::InputCapabilities(); + TCoeInputCapabilities caps2 = TCoeInputCapabilities(TCoeInputCapabilities::ENone, NULL, const_cast<CNcsEditor*>(this)); + caps.MergeWith(caps2); + return caps; + }
--- a/emailuis/emailui/src/ncsheadercontainer.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/ncsheadercontainer.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -364,15 +364,20 @@ CCoeControl* pNewCtrl= clicked; if (pOldCtrl != pNewCtrl) - { + { // Unfocus the control if ( pOldCtrl ) { - CommitFieldL( pOldCtrl ); pOldCtrl->SetFocus( EFalse, ENoDrawNow ); } pNewCtrl->SetFocus( ETrue, ENoDrawNow ); + // Commit changes to previously focused field. + if ( pOldCtrl ) + { + CommitFieldL( pOldCtrl ); + } + // If the attachments label has changed focus if ( pOldCtrl == iAttachmentField || pNewCtrl == iAttachmentField ) {
--- a/emailuis/emailui/src/ncssubjectfield.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/ncssubjectfield.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -80,13 +80,16 @@ FUNC_LOG; // Create label HBufC* aTextBuf = StringLoader::LoadLC( aLabelTextId ); + TPtrC captionText = aTextBuf ? aTextBuf->Des() : TPtrC(); iLabel = new ( ELeave ) CNcsLabel( *this, NULL ); - iLabel->SetTextL( aTextBuf->Des() ); - CleanupStack::PopAndDestroy( aTextBuf ); - // S60 Skin support + iLabel->SetTextL( captionText ); + + // S60 Skin support iLabel->SetBrushStyle(CWindowGc::ENullBrush); - iTextEditor = new ( ELeave ) CNcsEditor( iSizeObserver, ETrue, ENcsEditorSubject ); + iTextEditor = new ( ELeave ) CNcsEditor( iSizeObserver, ETrue, ENcsEditorSubject, captionText ); + CleanupStack::PopAndDestroy( aTextBuf ); + // iTextEditor is not completely constructed until in SetContainerWindowL() iFocusChangeHandler = new (ELeave) CAsyncCallBack( CActive::EPriorityStandard ); }
--- a/emailuis/uicomponents/inc/fscontrolbar.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/inc/fscontrolbar.h Thu Jan 07 12:38:38 2010 +0200 @@ -137,6 +137,11 @@ IMPORT_C MFsControlButtonInterface* GetFocusedButton() const; /** + * Set position and size + */ + virtual void SetRectL( const TRect& aRect ); + + /** * Sets height of the bar in pixels. * * @param aHeight new height of the bar.
--- a/emailuis/uicomponents/inc/fscontrolbarmodel.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/inc/fscontrolbarmodel.h Thu Jan 07 12:38:38 2010 +0200 @@ -193,12 +193,22 @@ void SetHeight( TInt aHeight ); /** + * Set bar's rect + */ + void SetRect( const TRect& aRect ); + + /** * Get size of the controlbar. * * @return Size of the controlbar. */ TSize Size() const; + /** + * Get top-left position + */ + TPoint Pos() const; + private: /** @@ -249,6 +259,10 @@ */ TBool iHeightUseDefault; + /** + * Top-left position + */ + TPoint iTl; };
--- a/emailuis/uicomponents/inc/fscontrolbarobserver.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/inc/fscontrolbarobserver.h Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -46,8 +46,9 @@ EEventButton, // <cmail> Touch EEventButtonReleased, - EEventButtonTouched + EEventButtonTouched, // </cmail> + EEventFocusVisibilityChanged }; public:
--- a/emailuis/uicomponents/inc/fscontrolbarvisualiser.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/inc/fscontrolbarvisualiser.h Thu Jan 07 12:38:38 2010 +0200 @@ -54,8 +54,7 @@ * @param aModel Model of control bar. */ static CFsControlBarVisualiser* NewL( - CFsControlBar& aParentControl, - CFsControlBarModel& aModel ); + CFsControlBar& aParentControl, CFsControlBarModel& aModel ); /** * Destructor
--- a/emailuis/uicomponents/inc/fscontrolbuttonobserver.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/inc/fscontrolbuttonobserver.h Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -41,8 +41,9 @@ // <cmail> Touch EEventButtonDimmStateChanged, EEventButtonTouchPressed, - EEventButtonTouchReleased + EEventButtonTouchReleased, // </cmail> + EFocusVisibilityChange }; public:
--- a/emailuis/uicomponents/inc/fscontrolbuttonvisualiser.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/inc/fscontrolbuttonvisualiser.h Thu Jan 07 12:38:38 2010 +0200 @@ -29,6 +29,8 @@ class CAlfControl; class CAlfVisual; class CAlfLayout; +class CAlfBrush; +class CAlfFrameBrush; class CAlfTextVisual; class CAlfGridLayout; class CAlfDeckLayout; @@ -39,6 +41,7 @@ class CAlfTexture; class CAlfGradientBrush; class CAlfImageBrush; +class CAlfShadowBorderBrush; class CFsControlButtonModel; class CFsControlButtonLayoutData; class CFsTextStyleManager; @@ -80,6 +83,11 @@ IMPORT_C virtual void InitializeL( CFsControlButtonModel& aButtonModel ); /** + * Called when the colors etc should be refreshed + */ + virtual void UpdateVisualThemeL(); + + /** * Refreshes button on the display. */ IMPORT_C virtual void Refresh(); @@ -455,7 +463,23 @@ * Brush with background image. * Owned. */ - CAlfImageBrush* iBgBrush; + CAlfBrush* iBgBrush; + + /** + * Default brush for background. Owned. + */ + CAlfFrameBrush* iDefaultBgBrush; + + /** + * ETrue if default theme background is used + */ + TBool iUseDefaultBackground; + + /** + * Brush for shadowed button borders. + * Owned. + */ + CAlfShadowBorderBrush* iShadowBorderBrush; /** * Layout of the parent control. @@ -520,6 +544,10 @@ */ TBool iDrawFocus; + /** + * Show dropdown shadow for buttons + */ + TBool iShowShadow; };
--- a/emailuis/uicomponents/inc/fstreelistobserver.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/inc/fstreelistobserver.h Thu Jan 07 12:38:38 2010 +0200 @@ -245,9 +245,12 @@ /** * Event generated when all nodes are expanded. */ - EFsTreeListExpandedAll - + EFsTreeListExpandedAll, // </cmail> + /** + * Handle focus visibility changes + */ + EFsFocusVisibilityChange }; public:
--- a/emailuis/uicomponents/inc/fstreevisualizerobserver.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/inc/fstreevisualizerobserver.h Thu Jan 07 12:38:38 2010 +0200 @@ -114,8 +114,12 @@ /** * Event generated when all nodes are expanded. */ - EFsTreeListExpandedAll + EFsTreeListExpandedAll, // </cmail> + /** + * Change focus visibility + */ + EFsChangeFocusVisibility }; public:
--- a/emailuis/uicomponents/src/fscontrolbar.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fscontrolbar.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -336,6 +336,15 @@ iVisualiser->UpdateSizeL(); } +// --------------------------------------------------------------------------- +// Set rect for control bar +// --------------------------------------------------------------------------- +// +void CFsControlBar::SetRectL( const TRect& aRect ) + { + iModel->SetRect( aRect ); + iVisualiser->UpdateSizeL(); + } // --------------------------------------------------------------------------- // Retrieves width of the bar in pixels. @@ -616,6 +625,8 @@ { button = iModel->PrevButton( iSelectedButton ); ChangeFocusL( button ); + // Always after keypress focus needs to be shown. + MakeSelectorVisible( ETrue ); eventHandled = ETrue; break; } @@ -624,6 +635,8 @@ { button = iModel->NextButton( iSelectedButton ); ChangeFocusL( button ); + // Always after keypress focus needs to be shown. + MakeSelectorVisible( ETrue ); eventHandled = ETrue; break; } @@ -631,7 +644,7 @@ case EStdKeyDownArrow: { LooseFocus( - MFsControlBarObserver::EEventFocusLostAtBottom ); + MFsControlBarObserver::EEventFocusLostAtBottom ); eventHandled = ETrue; break; } @@ -713,6 +726,9 @@ // <cmail> Touch case EEventButtonTouchReleased: { + // Notify that button is released, focus can be hidden. + NotifyObservers( MFsControlBarObserver::EEventFocusVisibilityChanged ); + if (iTouchEnabled && iTouchWasEnabled) { if( aButtonId > KErrNotFound )
--- a/emailuis/uicomponents/src/fscontrolbarmodel.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fscontrolbarmodel.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -496,6 +496,26 @@ } } +// --------------------------------------------------------------------------- +// Set new position and size +// --------------------------------------------------------------------------- +// +void CFsControlBarModel::SetRect( const TRect& aRect ) + { + iSize = aRect.Size(); + iWidthUseDefault = EFalse; + iHeightUseDefault = EFalse; + iTl = aRect.iTl; + } + +// --------------------------------------------------------------------------- +// Get top-left position of the bar +// --------------------------------------------------------------------------- +// +TPoint CFsControlBarModel::Pos() const + { + return iTl; + } // --------------------------------------------------------------------------- // Sets width in pixels of controlbar and refreshes control.
--- a/emailuis/uicomponents/src/fscontrolbarvisualiser.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fscontrolbarvisualiser.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -289,6 +289,7 @@ { FUNC_LOG; iBarLayout->SetSize( iModel.Size() ); + iBarLayout->SetPos( iModel.Pos() ); RefreshL(); } @@ -334,7 +335,6 @@ { iSelector->Brushes()->Remove( iSelector->Brushes()->Count() - 1 ); } - iSelector->Brushes()->AppendL( aSelectorBrush, EAlfDoesNotHaveOwnership ); iSelector->SetOpacity( aOpacity ); @@ -395,11 +395,10 @@ TBool aShow, TBool aFromTouch ) { FUNC_LOG; - TReal32 opacity( 0 ); if( aShow ) { - opacity = 1; + opacity = KFsSelectorOpacity; } if( iSelector ) { @@ -429,7 +428,7 @@ TBool aFastDraw ) { FUNC_LOG; - CFsControlButtonVisualiser* vis( NULL ); + CFsControlButtonVisualiser* vis = NULL; // set selector's delay TInt transitionTime( aFastDraw ? 0 : iModel.SelectorTransitionTime() ); @@ -483,6 +482,7 @@ size += TSize( KFsSelectorPaddingLeft + KFsSelectorPaddingRight, KFsSelectorPaddingTop + KFsSelectorPaddingBottom ); + // Hides transition when item selected via touch if( iTouchPressed ) { transitionTime = 0; @@ -529,7 +529,7 @@ void CFsControlBarVisualiser::HideSelector() { FUNC_LOG; - iLastSelectedButton = -1; + iLastSelectedButton = KErrNotFound; if ( iSelector ) { // Flags used because otherwise it would generate a callback here
--- a/emailuis/uicomponents/src/fscontrolbutton.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fscontrolbutton.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -614,8 +614,7 @@ if ( aEvent.KeyEvent().iScanCode == EStdKeyDevice3 ) { iParent.HandleButtonEvent( - MFsControlButtonObserver::EEventButtonPressed, - -1 ); + MFsControlButtonObserver::EEventButtonPressed, -1 ); result = ETrue; } break; @@ -643,8 +642,7 @@ if ( aEvent.KeyEvent().iScanCode == EStdKeyDevice3 ) { iParent.HandleButtonEvent( - MFsControlButtonObserver::EEventButtonReleased, - -1 ); + MFsControlButtonObserver::EEventButtonReleased, -1 ); result = ETrue; } break;
--- a/emailuis/uicomponents/src/fscontrolbuttonvisualiser.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fscontrolbuttonvisualiser.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -15,8 +15,6 @@ * */ - -//<cmail> SF #include "emailtrace.h" #include <alf/alfcontrol.h> #include <alf/alfdecklayout.h> @@ -29,9 +27,9 @@ #include <alf/alfgradientbrush.h> #include <alf/alfframebrush.h> #include <alf/alfimagebrush.h> +#include <alf/alfshadowborderbrush.h> #include <alf/alfbrusharray.h> #include <alf/alftextstyle.h> -//</cmail> #include <AknsConstants.h> #include <AknUtils.h> #include <touchlogicalfeedback.h> @@ -44,6 +42,9 @@ #include "fscontrolbar.h" const TInt KFsDefaultFontStyle = EAlfTextStyleNormal; +const TInt KDefaultShadowBorderWidth( 8 ); +const TReal KShadowBorderOpacity( 0.08 ); +const TInt KButtonBorderSize( 8 ); // ======== MEMBER FUNCTIONS ======== @@ -148,6 +149,7 @@ } delete iBgColorBrush; + delete iShadowBorderBrush; delete iTextFontSpec; } @@ -168,18 +170,62 @@ if ( !iBgColorBrush ) { iBgColorBrush = CAlfGradientBrush::NewL( iParent->Env() ); - SetBackgroundColor( iButtonModel->TextColor( - CFsControlButtonModel::EButtonBackground ) ); - iButtonLayout->Brushes()->AppendL( - iBgColorBrush, EAlfDoesNotHaveOwnership ); + if( iShowShadow ) + { + iBgColorBrush->SetOpacity( KShadowBorderOpacity ); + iBgColorBrush->SetColor(KRgbBlack); + } + else + { + iBgColorBrush->SetOpacity( 0 ); + } + + iBgColorBrush->SetLayer( EAlfBrushLayerBackground ); + iButtonLayout->Brushes()->AppendL( iBgColorBrush, + EAlfDoesNotHaveOwnership ); } + iUseDefaultBackground = ETrue; + + // Add a shadow border brush to outline the buttons with a shadowed border. + if ( iShowShadow && !iShadowBorderBrush ) + { + iShadowBorderBrush = CAlfShadowBorderBrush::NewL( + iParent->Env(), TAlfMetric( KDefaultShadowBorderWidth ) ); + iShadowBorderBrush->SetOpacity( KShadowBorderOpacity ); + iShadowBorderBrush->SetLayer( EAlfBrushLayerBackground ); + iButtonLayout->Brushes()->AppendL( iShadowBorderBrush, + EAlfDoesNotHaveOwnership ); + } + + UpdateVisualThemeL(); + // create needed visuals CreateButtonVisualsL(); UpdateBarLayout(); } +// --------------------------------------------------------------------------- +// CFsControlButtonVisualiser::UpdateVisualThemeL +// --------------------------------------------------------------------------- +// +void CFsControlButtonVisualiser::UpdateVisualThemeL() + { + if( iUseDefaultBackground ) + { + ClearBackgroundImage(); + iDefaultBgBrush = CAlfFrameBrush::NewL( iParent->Env(), KAknsIIDQsnFrButtonTb ); + iBgBrush = iDefaultBgBrush; + iButtonLayout->Brushes()->AppendL( iBgBrush, EAlfDoesNotHaveOwnership ); + UpdateBarLayout(); + } + else if ( iBgColorBrush ) + { + SetBackgroundColor( iButtonModel->TextColor( + CFsControlButtonModel::EButtonBackground ) ); + } + } // --------------------------------------------------------------------------- // From class CFsControlButtonVisualiserBase. @@ -338,9 +384,10 @@ // As the ownership of the new brush is gained the pointer can't be lost. CleanupStack::PushL( aImage ); - iButtonLayout->Brushes()->AppendL( aImage, EAlfDoesNotHaveOwnership ); + iButtonLayout->Brushes()->InsertL( 0, aImage, EAlfDoesNotHaveOwnership ); CleanupStack::Pop( aImage ); + iUseDefaultBackground = EFalse; iBgBrush = aImage; } @@ -365,7 +412,10 @@ EXPORT_C void CFsControlButtonVisualiser::ClearBackgroundColor() { FUNC_LOG; - iBgColorBrush->SetOpacity( 0 ); + if( iBgColorBrush ) + { + iBgColorBrush->SetOpacity( 0 ); + } } @@ -389,6 +439,7 @@ } delete iBgBrush; iBgBrush = NULL; + iDefaultBgBrush = NULL; } } @@ -631,6 +682,16 @@ // Same size for the content iButtonContentLayout->SetSize( iButtonModel->Size() ); + if( iDefaultBgBrush ) + { + TSize size = iButtonModel->Size(); + TRect fullRect = TRect( size ); + TRect innerRect = fullRect; + innerRect.Shrink( KButtonBorderSize,KButtonBorderSize ); + TRAP_IGNORE( + iDefaultBgBrush->SetFrameRectsL( innerRect, fullRect ); ); + } + if ( iLabelFirstLine ) { iLabelFirstLine->SetWrapping( textWrapping ); @@ -828,7 +889,7 @@ if ( iTextStyleManager ) { ResolveCharFormat( charFormat, iLabelFirstLine ); - charFormat.iFontPresentation.iUnderline = EUnderlineOn; + charFormat.iFontPresentation.iUnderline = EUnderlineOff; TRAPD( leaveErr, styleId = iTextStyleManager->GetStyleIDL( charFormat ) ); // Use modified style if possible, otherwise use the default @@ -850,7 +911,7 @@ if ( iTextStyleManager ) { ResolveCharFormat( charFormat, iLabelSecondLine ); - charFormat.iFontPresentation.iUnderline = EUnderlineOn; + charFormat.iFontPresentation.iUnderline = EUnderlineOff; TRAPD( leaveErr, styleId = iTextStyleManager->GetStyleIDL( charFormat ) ); // Use modified style if possible, otherwise use the default @@ -954,10 +1015,7 @@ iIconAContainer = CAlfLayout::AddNewL( *iParent, iButtonContentLayout ); iIconA = CAlfImageVisual::AddNewL( *iParent, iIconAContainer ); - // <cmail> Platform layout change - //iIconA->SetScaleMode( CAlfImageVisual::EScaleNormal ); - iIconA->SetScaleMode( CAlfImageVisual::EScaleFit ); - // </cmail> Platform layout change + iIconA->SetScaleMode( CAlfImageVisual::EScaleFitInside ); iIconAContainer->SetClipping( ETrue ); } @@ -1008,6 +1066,7 @@ EXPORT_C TInt CFsControlButtonVisualiser::CalculateButtonSize() { FUNC_LOG; + if ( iButtonModel->ContainsElement( ECBElemLabelFirstLine ) ) { // to get correct value from ExpandRectWithContent method @@ -1021,7 +1080,7 @@ TRect textRect( 0, 0, padding.iTl.iX + padding.iBr.iX + size.iWidth, padding.iTl.iY + padding.iBr.iY + size.iHeight ); - + if ( iButtonModel->ContainsElement( ECBElemLabelSndLine ) ) { // to get correct value from ExpandRectWithContent method @@ -1096,7 +1155,7 @@ return iIconBContainer->Size().Target().iX; } - return iButtonContentLayout->Size().Target().iX;; + return iButtonContentLayout->Size().Target().iX; } @@ -1171,40 +1230,26 @@ CFsLayoutManager::EFsLmMainSpFsCtrlbarDdmenuPaneG1, iconB, 1 ); break; - - //<CMAIL> As a device user, I want Message List items to follow platform layouts to be consistent with other apps - - /* - REMOVED, Not needed anymore. - - case ECBTypeTwoLinesLabelOnly: - text1 = TRect(0,0,60,20); - text2 = TRect(0,0,60,20); - break; - case ECBTypeTwoLinesLabelIconA: - iconA = TRect(0,0,16,16); - text1 = TRect(0,0,60,20); - text2 = TRect(0,0,60,20); - break; - case ECBTypeTwoLinesLabelIconB: - text1 = TRect(0,0,60,20); - text2 = TRect(0,0,60,20); - iconB = TRect(0,0,16,16); - break; - case ECBTypeTwoLinesLabelTwoIcons: - iconA = TRect(0,0,16,16); - text1 = TRect(0,0,60,20); - text2 = TRect(0,0,60,20); - iconB = TRect(0,0,16,16); - break; - */ - //<CMAIL> - default: break; } - - // <cmail> Platform layout changes + + // Buttons have different sizes so adapt the used rectangle dynamically + TSize buttonSize = iButtonModel->Size(); + buttonSize -= TPoint( KButtonBorderSize, KButtonBorderSize ); // shrink frame border size + + // If there is no text in the button, center the icon to the button + if( !iLabelFirstLine || iLabelFirstLine->Text().Length() == 0 ) + { + TSize oldIconSize = iconA.Size(); + iconA.SetRect( TPoint( + iconA.iTl .iX + ( buttonSize.iWidth - oldIconSize.iWidth ) / 2, + iconA.iTl .iY + ( buttonSize.iHeight - oldIconSize.iHeight ) / 2 ), + oldIconSize ); + } + iconA.SetHeight( buttonSize.iHeight ); + text1.SetHeight( buttonSize.iHeight ); + if ( iButtonModel->ContainsElement( ECBElemIconA ) ) { const TSize& size( iconA.Size() );
--- a/emailuis/uicomponents/src/fstextviewerselectsmanager.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fstextviewerselectsmanager.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -107,9 +107,13 @@ } } - select->SetId( aId ); - select->AppendVisualL( aVisual ); - iSelects.AppendL( select ); + + if (select) + { + select->SetId( aId ); + select->AppendVisualL( aVisual ); + iSelects.AppendL( select ); + } } else {
--- a/emailuis/uicomponents/src/fstreelist.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fstreelist.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -1019,7 +1019,11 @@ break; } // </cmail> - + case MFsTreeVisualizerObserver::EFsChangeFocusVisibility: + { + listEvent = MFsTreeListObserver::EFsFocusVisibilityChange; + break; + } default: { return;
--- a/emailuis/uicomponents/src/fstreenodevisualizerbase.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fstreenodevisualizerbase.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -258,7 +258,7 @@ FUNC_LOG; if ( iFlags & KFsTreeListItemManagedLayout ) { - CFsLayoutManager::TFsLayoutMetrics normalSizeMetrics (CFsLayoutManager::EFsLmListSingleDycRowPane); + CFsLayoutManager::TFsLayoutMetrics normalSizeMetrics (CFsLayoutManager::EFsLmListSingleFsDycPane); TRect parentLayoutRect(0,0,0,0); TSize size(0,0); TBool retVal(EFalse);
--- a/emailuis/uicomponents/src/fstreeplainonelineitemvisualizer.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fstreeplainonelineitemvisualizer.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -223,6 +223,10 @@ } TRect currentSize = iSize; + if ( !IsLayoutHintSet( EFolderLayout ) ) + { + CFsLayoutManager::LayoutMetricsRect(currentSize, CFsLayoutManager::EFsLmListSingleDycRowPane, currentSize); + } if (CFsLayoutManager::IsMirrored()) { currentSize.iBr = currentSize.iBr - TPoint(aIndentation, 0); @@ -572,8 +576,12 @@ } } - iTextMarquee->StopScrolling(); - iTextVisual->SetWrapping(CAlfTextVisual::ELineWrapTruncate); + iTextMarquee->StopScrolling(); + + if ( iTextVisual ) + { + iTextVisual->SetWrapping(CAlfTextVisual::ELineWrapTruncate); + } } } }
--- a/emailuis/uicomponents/src/fstreeplainonelinenodevisualizer.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fstreeplainonelinenodevisualizer.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -407,13 +407,17 @@ iSize );*/ CFsLayoutManager::LayoutMetricsSize( parentLayoutRect, - CFsLayoutManager::EFsLmListSingleDycRowPane, + CFsLayoutManager::EFsLmListSingleFsDycPane, iSize ); // </cmail> Platform layout change } //one line node is not extendable TRect currentSize = iSize; + if ( !IsLayoutHintSet( EFolderLayout ) ) + { + CFsLayoutManager::LayoutMetricsRect(currentSize, CFsLayoutManager::EFsLmListSingleDycRowPane, currentSize); + } if (CFsLayoutManager::IsMirrored()) { currentSize.iBr = currentSize.iBr - TPoint(aIndentation, 0); @@ -788,7 +792,11 @@ } iTextMarquee->StopScrolling(); - iTextVisual->SetWrapping(CAlfTextVisual::ELineWrapTruncate); + + if ( iTextVisual ) + { + iTextVisual->SetWrapping(CAlfTextVisual::ELineWrapTruncate); + } } } }
--- a/emailuis/uicomponents/src/fstreeplaintwolineitemvisualizer.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fstreeplaintwolineitemvisualizer.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -12,7 +12,7 @@ * Contributors: * * Description : A visualizer for data items with plain text. -* Version : %version: tr1sido#12 % +* Version : %version: tr1sido#14 % * */ @@ -305,7 +305,7 @@ TInt exSizeVariety( 1 ); TInt preSizeVariety( 2 ); TInt flagIconVariety( 0 ); - TInt flagIconRow( 0 ); + TInt flagIconRow( 1 ); CFsLayoutManager::TFsLayoutMetrics firstLineTextParentMetrics = @@ -1439,8 +1439,11 @@ } else { - opacity.SetValueNow(0.0f); - iIconMarked->SetOpacity(opacity); + if (iIconMarked) + { + opacity.SetValueNow(0.0f); + iIconMarked->SetOpacity(opacity); + } } if ( iPreviewPaneTextVisual )
--- a/emailuis/uicomponents/src/fstreevisualizerbase.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/uicomponents/src/fstreevisualizerbase.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -19,9 +19,6 @@ //////SYSTEM INCLUDES #include "emailtrace.h" #include <AknUtils.h> -//<cmail> removed __FS_ALFRED_SUPPORT flag -//#include <fsconfig.h> -//</cmail> removed __FS_ALFRED_SUPPORT flag #include <StringLoader.h> #include <avkon.rsg> // R_AVKON_EMPTY_POPUP_LIST_TEXT #include <centralrepository.h> @@ -1526,12 +1523,12 @@ // void CFsTreeVisualizerBase::SetFocusVisibility( TBool aShow ) { - if( iFocusVisible != aShow ) + if ( iFocusVisible != aShow ) { iFocusVisible = aShow; TRAP_IGNORE( - MakeSelectorVisibleL(aShow); - UpdateItemL(iFocusedItem); ); + MakeSelectorVisibleL( aShow ); + UpdateItemL( iFocusedItem ); ); } } @@ -1578,18 +1575,15 @@ { eventHandled = ETrue; iTouchPressed = EFalse; - UpdateItemL( iFocusedItem ); - if( !IsFocusShown() ) - { - MakeSelectorVisibleL( EFalse ); - } + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsChangeFocusVisibility ); INFO_2( "EButton1Up (%d, %d)", pos.iX, pos.iY ); - if( !iDragHandler->IsFlicking() ) - { - iPhysics->StopPhysics(); - } - iDragHandler->PointerUp( aEvent.PointerEvent(), id ); } + if( !iDragHandler->IsFlicking() ) + { + iPhysics->StopPhysics(); + } + iDragHandler->PointerUp( aEvent.PointerEvent(), id ); break; } case TPointerEvent::EDrag: @@ -1623,6 +1617,11 @@ } } } + else + { + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsChangeFocusVisibility ); + } } return eventHandled; } @@ -1682,34 +1681,41 @@ // Sets the specified item as focused. // --------------------------------------------------------------------------- // -void CFsTreeVisualizerBase::SetFocusedItemL(const TFsTreeItemId aItemId, - TBool /*aCheckFocus*/) +void CFsTreeVisualizerBase::SetFocusedItemL( const TFsTreeItemId aItemId, + TBool /*aCheckFocus*/ ) { FUNC_LOG; MFsTreeItemVisualizer* visualizer = NULL; - if (aItemId != iFocusedItem) - { - visualizer = iTreeData->ItemVisualizer(iFocusedItem); - if (visualizer) + + if ( aItemId != iFocusedItem ) + { + visualizer = iTreeData->ItemVisualizer( iFocusedItem ); + + if ( visualizer ) { - visualizer->UpdateL(iTreeData->ItemData(iFocusedItem), EFalse, - iTreeData->Level(iFocusedItem), iMarkIcon, iMenuIcon, 0); + visualizer->UpdateL( iTreeData->ItemData( iFocusedItem ), EFalse, + iTreeData->Level( iFocusedItem ), iMarkIcon, iMenuIcon, 0 ); } + iFocusedItem = aItemId; } - visualizer = iTreeData->ItemVisualizer(iFocusedItem); - if (visualizer) + + visualizer = iTreeData->ItemVisualizer( iFocusedItem ); + + if ( visualizer ) { TBool focused = IsFocusShown(); - visualizer->UpdateL(iTreeData->ItemData(iFocusedItem), focused, - iTreeData->Level(iFocusedItem), iMarkIcon, iMenuIcon, 0); - } - if (iFocusedItem != KFsTreeNoneID) + visualizer->UpdateL( iTreeData->ItemData( iFocusedItem ), focused, + iTreeData->Level( iFocusedItem ), iMarkIcon, iMenuIcon, 0 ); + } + + if ( iFocusedItem != KFsTreeNoneID ) { UpdateSelectorVisualL(); - if (!iViewPort.ItemFullyVisible(iFocusedItem)) + + if ( !iViewPort.ItemFullyVisible( iFocusedItem ) ) { - iViewPort.ScrollItemToViewL(iFocusedItem); + iViewPort.ScrollItemToViewL( iFocusedItem ); } } } @@ -2558,7 +2564,6 @@ iWatermarkLayout->Brushes()->Reset(); iWatermarkLayout->SetFlag(EAlfVisualChanged); } - } CAlfGradientBrush* backgroundBrush = CAlfGradientBrush::NewL( iOwnerControl->Env()); @@ -2566,6 +2571,7 @@ backgroundBrush->SetColor(aColor); iWatermarkLayout->Brushes()->AppendL(backgroundBrush, EAlfHasOwnership); + } } // --------------------------------------------------------------------------- @@ -3616,6 +3622,7 @@ { iScrollbarModel.SetFocusPosition(iViewPort.Position().iY); iScrollBar->SetModelL(&iScrollbarModel); + iScrollBar->DrawNow(); } } @@ -3642,6 +3649,7 @@ iScrollbarModel.SetWindowSize(pageSize); iScrollbarModel.SetFocusPosition(iViewPort.Position().iY); iScrollBar->SetModelL(&iScrollbarModel); + iScrollBar->DrawNow(); RArray<TInt> columns; CleanupClosePushL(columns); @@ -3650,15 +3658,32 @@ == EFsTreeVisible) { iScrollBar->SetRect(scrollPane); - columns.AppendL(listPane.Width()); - columns.AppendL(scrollPane.Width()); + if (AknLayoutUtils::LayoutMirrored()) + { + columns.AppendL(scrollPane.Width()); + columns.AppendL(listPane.Width()); + } + else + { + columns.AppendL(listPane.Width()); + columns.AppendL(scrollPane.Width()); + } iComponentLayout->SetColumnsL(columns); iScrollBar->MakeVisible(ETrue); updateLayouts = ETrue; } else if (!iViewPort.IsScrollBarNeeded()) { - columns.AppendL(listPane.Width()); + if (AknLayoutUtils::LayoutMirrored()) + { + columns.AppendL(0); + columns.AppendL(listPane.Width()); + } + else + { + columns.AppendL(listPane.Width()); + columns.AppendL(0); + } iComponentLayout->SetColumnsL(columns); iScrollBar->MakeVisible(EFalse); updateLayouts = ETrue; @@ -3922,59 +3947,64 @@ void CFsTreeVisualizerBase::UpdateSelectorVisualL(TInt /*aTime*/) { FUNC_LOG; - if (iSelectorVisual) - { - if (iFocusedItem == KFsTreeNoneID || !iFlags.IsSet(EListFocused) || !IsFocusShown()) + + if ( iSelectorVisual ) + { + if ( iFocusedItem == KFsTreeNoneID || + !iFlags.IsSet( EListFocused ) || !IsFocusShown() ) { TAlfTimedValue opacity; - opacity.SetValueNow(0.0f); - iSelectorVisual->SetOpacity(opacity); + opacity.SetValueNow( 0.0f ); + iSelectorVisual->SetOpacity( opacity ); } else { //check if item is visible - MFsTreeItemVisualizer* vis(NULL); - - iListLayout->SetFlag(EAlfVisualFlagFreezeLayout); - iListItemBackgroundLayout->SetFlag(EAlfVisualFlagFreezeLayout); - - TRect itemRect(iViewPort.ItemRect(iFocusedItem)); - if (itemRect.Height()) + MFsTreeItemVisualizer* vis( NULL ); + + iListLayout->SetFlag( EAlfVisualFlagFreezeLayout ); + iListItemBackgroundLayout->SetFlag( EAlfVisualFlagFreezeLayout ); + + TRect itemRect( iViewPort.ItemRect( iFocusedItem ) ); + + if ( itemRect.Height() ) { TSize currSize; currSize.iWidth = iListLayout->Size().iX.Target() - 2 * iListLayout->PaddingInPixels().iTl.iX; currSize.iHeight = itemRect.Height(); - iSelectorVisual->SetSize(currSize, 0); + iSelectorVisual->SetSize( currSize, 0 ); TAlfRealPoint pNow; pNow.iY = itemRect.iTl.iY; pNow.iX = iListLayout->PaddingInPixels().iTl.iX; - iSelectorVisual->SetPos(pNow, 0); - - TAlfTimedValue opacity(iSelectorOpacity, 0); - iSelectorVisual->SetOpacity(opacity); - if (iMarqueeType != EFsTextMarqueeNone) + iSelectorVisual->SetPos( pNow, 0 ); + + TAlfTimedValue opacity( iSelectorOpacity, 0 ); + iSelectorVisual->SetOpacity( opacity ); + iFocusVisible = ETrue; + + if ( iMarqueeType != EFsTextMarqueeNone ) { - vis = iTreeData->ItemVisualizer(iFocusedItem); - vis->MarqueeL(iMarqueeType, iMarqueeSpeed, - iMarqueStartDelay, iMarqueCycleStartDelay, - iMarqueeRepetitions); + vis = iTreeData->ItemVisualizer( iFocusedItem ); + vis->MarqueeL( iMarqueeType, iMarqueeSpeed, + iMarqueStartDelay, iMarqueCycleStartDelay, + iMarqueeRepetitions ); } } else { TAlfTimedValue opacity; - opacity.SetValueNow(0.0f); - iSelectorVisual->SetOpacity(opacity); + opacity.SetValueNow( 0.0f ); + iSelectorVisual->SetOpacity( opacity ); } - iListLayout->ClearFlag(EAlfVisualFlagFreezeLayout); - iListItemBackgroundLayout->ClearFlag(EAlfVisualFlagFreezeLayout); + iListLayout->ClearFlag( EAlfVisualFlagFreezeLayout ); + iListItemBackgroundLayout->ClearFlag( EAlfVisualFlagFreezeLayout ); } } - else if (iFocusedItem != KFsTreeNoneID && iFlags.IsSet(EListFocused)) - { - MakeSelectorVisibleL(ETrue); + else if ( iFocusedItem != KFsTreeNoneID && iFlags.IsSet( EListFocused ) ) + { + MakeSelectorVisibleL( ETrue ); } } @@ -4622,8 +4652,18 @@ iComponentLayout->EnableBrushesL(); iComponentLayout->UpdateChildrenLayout(); - iListDeck = CAlfDeckLayout::AddNewL(*iOwnerControl, iComponentLayout); - + if (AknLayoutUtils::LayoutMirrored()) + { + iDummyScrollbar = CAlfImageVisual::AddNewL(*iOwnerControl); + iComponentLayout->Append(iDummyScrollbar); + iListDeck = CAlfDeckLayout::AddNewL(*iOwnerControl, iComponentLayout); + } + else + { + iListDeck = CAlfDeckLayout::AddNewL(*iOwnerControl, iComponentLayout); + iDummyScrollbar = CAlfImageVisual::AddNewL(*iOwnerControl); + iComponentLayout->Append(iDummyScrollbar); + } iListItemBackgroundLayout = CAlfFlowLayout::AddNewL(*iOwnerControl, iListDeck); iListItemBackgroundLayout->SetFlowDirection(CAlfFlowLayout::EFlowVertical); @@ -4667,9 +4707,6 @@ iScrollBar->MakeVisible(EFalse); iScrollBar->SetModelL(&iScrollbarModel); - iDummyScrollbar = CAlfImageVisual::AddNewL(*iOwnerControl); - iComponentLayout->Append(iDummyScrollbar); - // </cmail> iFadeEffect = CFsFadeEffect::NewL(iOwnerControl, this, iRootLayout, 0); @@ -5270,6 +5307,7 @@ { return ETrue; } + return EFalse; }
--- a/emailuis/widget/emailwidgetsettings/data/emailwidgetsettings.rss Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/emailwidgetsettings/data/emailwidgetsettings.rss Thu Jan 07 12:38:38 2010 +0200 @@ -88,7 +88,7 @@ RESOURCE TBUF r_emailwidgetsettings_create_new_mailbox { - buf = "\t"qtn_hs_widget_setting_new_mailbox"\t\t"; + buf = "0\t"qtn_hs_widget_setting_new_mailbox"\t\t"; } // End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/widget/emailwidgetsettings/data/iconlist.txt Thu Jan 07 12:38:38 2010 +0200 @@ -0,0 +1,2 @@ +-c16,8 qgn_indi_cmail_drop_email_account.svg +-c16,8 qgn_prop_cmail_new_mailbox.svg
--- a/emailuis/widget/emailwidgetsettings/group/bld.inf Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/emailwidgetsettings/group/bld.inf Thu Jan 07 12:38:38 2010 +0200 @@ -21,12 +21,19 @@ PRJ_PLATFORMS DEFAULT +PRJ_MMPFILES +emailwidgetsettings.mmp + +PRJ_EXTENSIONS +START EXTENSION s60/mifconv +OPTION TARGETFILE emailwidgetsettings.mif +OPTION HEADERFILE emailwidgetsettings.mbg +OPTION SOURCEFILE ../data/iconlist.txt +END + PRJ_EXPORTS ../rom/emailwidgetsettings.iby CORE_APP_LAYER_IBY_EXPORT_PATH(emailwidgetsettings.iby) ../loc/emailwidgetsettings.loc APP_LAYER_LOC_EXPORT_PATH(emailwidgetsettings.loc) ../conf/cmailwidget.confml APP_LAYER_CONFML(cmailwidget.confml) ../conf/cmailwidget_2001E272.crml APP_LAYER_CRML(cmailwidget_2001E272.crml) - -PRJ_MMPFILES -emailwidgetsettings.mmp
--- a/emailuis/widget/emailwidgetsettings/group/emailwidgetsettings.mmp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/emailwidgetsettings/group/emailwidgetsettings.mmp Thu Jan 07 12:38:38 2010 +0200 @@ -76,5 +76,6 @@ LIBRARY centralrepository.lib LIBRARY commonengine.lib LIBRARY cmaillogger.lib +LIBRARY egul.lib // End of file
--- a/emailuis/widget/emailwidgetsettings/inc/emailwidgetsettingslistview.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/emailwidgetsettings/inc/emailwidgetsettingslistview.h Thu Jan 07 12:38:38 2010 +0200 @@ -50,6 +50,11 @@ private: void CreateCbaL(MEikCommandObserver* aObserver); void CreateListBoxL(MEikListBoxObserver* aObserver); + void SetupListIconsL(); + void AppendIconL( + CArrayPtr<CGulIcon>* aIcons, + const TInt aFileBitmapId, + const TInt aFileMaskId); TInt GetSettingToAssociateL(const TDesC& aCid); void LaunchEmailWizardL(); @@ -60,6 +65,7 @@ CEikButtonGroupContainer* iPopoutCba; CEikColumnListBox* iListBox; CDesCArrayFlat* iAccountNames; + CDesCArrayFlat* iDomains; CArrayFixFlat<TFSMailMsgId>* iAccountIds; CEmailWidgetSettingsMailboxes* iMailboxes; CEikonEnv* iEnv;
--- a/emailuis/widget/emailwidgetsettings/inc/emailwidgetsettingsmailboxes.h Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/emailwidgetsettings/inc/emailwidgetsettingsmailboxes.h Thu Jan 07 12:38:38 2010 +0200 @@ -43,18 +43,27 @@ /** * + * @param * @param */ void GetMailboxIdL(TInt aNum, TFSMailMsgId& aId ); /** * + * @param * @param */ void GetMailboxNameL( TInt aNum, TDes& aMailboxName ); /** * + * @param + * @param + */ + void GetDomainL(TInt aNum, TDes& aDomain); + + /** + * */ TInt MailboxCount();
--- a/emailuis/widget/emailwidgetsettings/rom/emailwidgetsettings.iby Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/emailwidgetsettings/rom/emailwidgetsettings.iby Thu Jan 07 12:38:38 2010 +0200 @@ -23,5 +23,6 @@ file=ABI_DIR\BUILD_DIR\emailwidgetsettings.exe PROGRAMS_DIR\emailwidgetsettings.exe data=\epoc32\data\z\private\10003a3f\apps\emailwidgetsettings_reg.rsc private\10003a3f\apps\emailwidgetsettings_reg.rsc data=DATAZ_\APP_RESOURCE_DIR\emailwidgetsettings.rsc APP_RESOURCE_DIR\emailwidgetsettings.rsc +SCALABLE_IMAGE(APP_BITMAP_DIR,APP_BITMAP_DIR,emailwidgetsettings) #endif // EMAILWIDGETSETTINGS_IBY
--- a/emailuis/widget/emailwidgetsettings/src/emailwidgetsettingslistviewcontainer.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/emailwidgetsettings/src/emailwidgetsettingslistviewcontainer.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -20,11 +20,14 @@ #include <eikmop.h> #include <bacline.h> #include <StringLoader.h> +#include <akniconarray.h> #include <emailwidgetsettings.rsg> +#include <emailwidgetsettings.mbg> #include "emailtrace.h" #include "emailwidgetsettingslistview.h" #include "cmailwidgetcenrepkeys.h" +#include "CFSMailClient.h" using namespace AknLayout; @@ -33,6 +36,7 @@ const TInt KMaxDescLen = 256; const TUid KUidWizardApp = { 0x10281c96 }; const TUid KUidEmailWizardView = { 0x10281C9A }; +_LIT( KMifPath, "z:\\resource\\apps\\emailwidgetsettings.mif"); // ======== MEMBER FUNCTIONS ======== @@ -42,6 +46,7 @@ // CEmailWidgetSettingsListViewContainer::CEmailWidgetSettingsListViewContainer() { + FUNC_LOG; } // --------------------------------------------------------------------------- @@ -69,23 +74,28 @@ // void CEmailWidgetSettingsListViewContainer::CreateListBoxL(MEikListBoxObserver* aObserver) { + FUNC_LOG; TInt count = iMailboxes->MailboxCount(); - iListBox = new(ELeave) CAknSingleStyleListBox; + iListBox = new(ELeave) CAknSingleGraphicStyleListBox; iListBox->SetContainerWindowL( *this); iListBox->ConstructL( this, EAknListBoxSelectionList ); iAccountNames = new (ELeave) CDesCArrayFlat(count + 1); + iDomains = new (ELeave) CDesCArrayFlat(count); if (count) { iAccountIds = new ( ELeave ) CArrayFixFlat<TFSMailMsgId>(count); } for (TInt i = 0; i < count; i++) { - TBuf<KMaxDescLen> name; + TBuf<KMaxDescLen> name; + TBuf<KMaxDescLen> domain; TFSMailMsgId id; iMailboxes->GetMailboxNameL(i, name); + iMailboxes->GetDomainL(i, domain); iMailboxes->GetMailboxIdL(i, id); iAccountNames->AppendL(name); + iDomains->AppendL(domain); iAccountIds->AppendL(id); } HBufC* createNewMailbox = StringLoader::LoadLC(R_EMAILWIDGETSETTINGS_CREATE_NEW_MAILBOX); @@ -93,12 +103,85 @@ CleanupStack::PopAndDestroy(createNewMailbox); iListBox->Model()->SetItemTextArray(iAccountNames); - iListBox->Model()->SetOwnershipType(ELbmDoesNotOwnItemArray); + iListBox->Model()->SetOwnershipType(ELbmDoesNotOwnItemArray); iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue); iListBox->SetBorder(TGulBorder::ESingleBlack); iListBox->CreateScrollBarFrameL(ETrue); iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); iListBox->SetListBoxObserver(aObserver); + + SetupListIconsL(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::SetupListIconsL() + { + FUNC_LOG; + CFSMailClient* mailClient = CFSMailClient::NewL(); + CleanupClosePushL(*mailClient); + MFSMailBrandManager& brandManager = mailClient->GetBrandManagerL(); + + TInt count = iMailboxes->MailboxCount(); + CArrayPtr<CGulIcon>* icons = new(ELeave) CArrayPtrFlat<CGulIcon>( count + 1 ); + CleanupStack::PushL( icons ); + + AppendIconL(icons, EMbmEmailwidgetsettingsQgn_prop_cmail_new_mailbox, + EMbmEmailwidgetsettingsQgn_prop_cmail_new_mailbox_mask); + + for (TInt i = 0; i < count; i++) + { + CGulIcon* brandIcon; + brandIcon = brandManager.GetGraphicL( EFSMailboxIcon, iDomains->MdcaPoint(i) ); + + if (brandIcon) + { + icons->AppendL(brandIcon); + } + else + { + AppendIconL(icons, EMbmEmailwidgetsettingsQgn_indi_cmail_drop_email_account, + EMbmEmailwidgetsettingsQgn_indi_cmail_drop_email_account_mask); + } + } + + // clear any previous icon array + CAknIconArray* oldIconArray = static_cast<CAknIconArray*>(iListBox->ItemDrawer()->ColumnData()->IconArray()); + if (oldIconArray) + delete oldIconArray; + + iListBox->ItemDrawer()->ColumnData()->SetIconArray(icons); + CleanupStack::Pop(icons); + CleanupStack::PopAndDestroy( mailClient ); + } + +// ----------------------------------------------------------------------------- +// CFeedsTopicContainer::AppendIconL +// +// Loads and appends an icon to the icon array. +// ----------------------------------------------------------------------------- +// + +void CEmailWidgetSettingsListViewContainer::AppendIconL( + CArrayPtr<CGulIcon>* aIcons, + const TInt aFileBitmapId, + const TInt aFileMaskId) + { + FUNC_LOG; + CGulIcon* newIcon; + CFbsBitmap* newIconBmp; + CFbsBitmap* newIconMaskBmp; + AknIconUtils::CreateIconLC( newIconBmp, newIconMaskBmp, KMifPath, + aFileBitmapId, + aFileMaskId ); + newIcon = CGulIcon::NewL(newIconBmp, newIconMaskBmp); + CleanupStack::Pop(newIconMaskBmp); + CleanupStack::Pop(newIconBmp); + CleanupStack::PushL(newIcon); + aIcons->AppendL(newIcon); + CleanupStack::Pop(newIcon); } // --------------------------------------------------------------------------- @@ -107,6 +190,7 @@ // void CEmailWidgetSettingsListViewContainer::CreateCbaL( MEikCommandObserver* aObserver ) { + FUNC_LOG; const TSize screenSize= iCoeEnv->ScreenDevice()->SizeInPixels(); iPopoutCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, CEikButtonGroupContainer::EHorizontal, aObserver, R_AVKON_SOFTKEYS_SELECT_CANCEL); @@ -119,10 +203,12 @@ // CEmailWidgetSettingsListViewContainer::~CEmailWidgetSettingsListViewContainer() { + FUNC_LOG; delete iMailboxes; delete iPopoutCba; delete iListBox; delete iAccountNames; + delete iDomains; delete iAccountIds; } @@ -132,6 +218,7 @@ // void CEmailWidgetSettingsListViewContainer::SizeChanged() { + FUNC_LOG; TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); TRect listBoxRect(mainPaneRect.Size()); @@ -144,6 +231,7 @@ // TInt CEmailWidgetSettingsListViewContainer::CountComponentControls() const { + FUNC_LOG; return iListBox ? 1 : 0; } @@ -153,6 +241,7 @@ // CCoeControl* CEmailWidgetSettingsListViewContainer::ComponentControl(TInt /*aIndex*/) const { + FUNC_LOG; return iListBox; } @@ -162,6 +251,7 @@ // TKeyResponse CEmailWidgetSettingsListViewContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) { + FUNC_LOG; return iListBox->OfferKeyEventL(aKeyEvent, aType); } @@ -171,6 +261,7 @@ // TSize CEmailWidgetSettingsListViewContainer::MinimumSize() { + FUNC_LOG; return iEikonEnv->EikAppUi()->ClientRect().Size(); } @@ -180,6 +271,7 @@ // TInt CEmailWidgetSettingsListViewContainer::CurrentIndex() const { + FUNC_LOG; return iListBox->CurrentItemIndex(); } @@ -189,6 +281,7 @@ // TTypeUid::Ptr CEmailWidgetSettingsListViewContainer::MopSupplyObject(TTypeUid aId) { + FUNC_LOG; return SupplyMopObject(aId, iPopoutCba); } @@ -198,6 +291,7 @@ // void CEmailWidgetSettingsListViewContainer::SaveSelectedL() { + FUNC_LOG; if (CurrentIndex() == iAccountNames->Count() - 1) { LaunchEmailWizardL(); @@ -280,6 +374,7 @@ // void CEmailWidgetSettingsListViewContainer::LaunchEmailWizardL() { + FUNC_LOG; if ( iEnv ) { CCoeAppUi* appui = iEnv-> EikAppUi( );
--- a/emailuis/widget/emailwidgetsettings/src/emailwidgetsettingsmailboxes.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/emailwidgetsettings/src/emailwidgetsettingsmailboxes.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -110,12 +110,38 @@ TDesC& mailboxName( mailBoxes[aNum]->GetName() ); + TBuf<3>iconIndex; + iconIndex.AppendNum(aNum+1); + + aMailboxName.Append(iconIndex); aMailboxName.Append(_L("\t")); aMailboxName.Append(mailboxName); aMailboxName.Append(_L("\t")); aMailboxName.Append(_L("\t")); - // Release allocated memory + mailBoxes.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsMailboxes::GetDomainL +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsMailboxes::GetDomainL(TInt aNum, TDes& aDomain) + { + FUNC_LOG; + // Mailboxes will be fetched to this array + RPointerArray<CFSMailBox> mailBoxes; + + // List all mailboxes + TFSMailMsgId plugin; + iMailClient->ListMailBoxes( plugin, mailBoxes ); + + CFSMailAddress& ownMailAddress( mailBoxes[aNum]->OwnMailAddress( ) ); + TDesC& mailAddress( ownMailAddress.GetEmailAddress()); + + aDomain.Append(mailAddress.Right(mailAddress.Length() - + mailAddress.FindC(_L("@"))-1)); + mailBoxes.ResetAndDestroy(); }
--- a/emailuis/widget/group/bld.inf Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/group/bld.inf Thu Jan 07 12:38:38 2010 +0200 @@ -35,6 +35,7 @@ ../xuikon/00/emailwidget.xml /epoc32/data/Z/resource/homescreen/emailwidget/xuikon/emailwidget.xml // Variant creation still disabled (see also emailwidget.dat file) //../xuikon/00/emailwidget.dtd /epoc32/data/Z/resource/homescreen/emailwidget/xuikon/emailwidget.dtd +/epoc32/s60/icons/qgn_menu_cmail.svg /epoc32/data/Z/resource/homescreen/emailwidget/hsps/qgn_menu_cmail.svg // Support for S60 localization //*****************************
--- a/emailuis/widget/hsps/00/emailwidgetconfiguration.dtd Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/hsps/00/emailwidgetconfiguration.dtd Thu Jan 07 12:38:38 2010 +0200 @@ -28,5 +28,6 @@ qtn_hscr_email.parents "ai_gene_pane_1" --> <!ENTITY qtn_hscr_email "Cmail widget"> +<!ENTITY qtn_hs_widget_mail_description "Informs of incoming mail messages"> <!-- End of File -->
--- a/emailuis/widget/hsps/00/manifest.dat Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/hsps/00/manifest.dat Thu Jan 07 12:38:38 2010 +0200 @@ -15,7 +15,9 @@ <configurationuid>0x2001E272</configurationuid> <!-- description --> + <filelogo>qgn_menu_cmail.svg</filelogo> <fullname>&qtn_hscr_email;</fullname> + <description>&qtn_hs_widget_mail_description;</description> <shortname>EW</shortname> <version>1.0</version> @@ -27,7 +29,7 @@ <!-- Locale specific resources --> <localization> - <fileresource>EW.o0000</fileresource> + <fileresource tag="xuikon">EW.o0000</fileresource> </localization> <!-- Instances of widget per one homescreen -->
--- a/emailuis/widget/loc/emailwidgetconfiguration.loc Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/loc/emailwidgetconfiguration.loc Thu Jan 07 12:38:38 2010 +0200 @@ -18,8 +18,13 @@ // d: Email widget -// l: ai_gene_pane_1_t1 +// l: listrow_wgtman_pane_t1 // w: -// r: TB9.1 +// r: TB9.2 #define qtn_hscr_email "Cmail widget" +// d: Email widget +// l: listrow_wgtman_pane_t2 +// w: +// r: TB9.2 +#define qtn_hs_widget_mail_description "Informs of incoming mail messages" \ No newline at end of file
--- a/emailuis/widget/rom/emailwidget_resources.iby Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/widget/rom/emailwidget_resources.iby Thu Jan 07 12:38:38 2010 +0200 @@ -32,6 +32,7 @@ // ... data=ZPRIVATE\200159c0\install\emailwidget\hsps\00\emailwidgetconfiguration.dtd \private\200159c0\install\emailwidget\hsps\00\emailwidgetconfiguration.dtd +data=ZPRIVATE\200159c0\install\emailwidget\hsps\00\qgn_menu_cmail.svg \private\200159c0\install\emailwidget\hsps\00\qgn_menu_cmail.svg #endif //FF_EMAIL_FRAMEWORK #endif //FF_CMAIL_INTEGRATION
--- a/ipsservices/ipssosplugin/inc/ipsplgimap4moveremoteop.h Thu Dec 17 08:39:21 2009 +0200 +++ b/ipsservices/ipssosplugin/inc/ipsplgimap4moveremoteop.h Thu Jan 07 12:38:38 2010 +0200 @@ -119,11 +119,6 @@ */ void Complete(); - - /** - * - */ - void DoMoveLocalL(); /** * @@ -144,7 +139,6 @@ TDesC8* iMoveErrorProgress; TImImap4GetMailInfo iGetMailInfo; CMsvEntrySelection* iSelection; - CMsvEntrySelection* iLocalSel; // Complete messages CMsvEntrySelection* iRemoteSel; // Incomplete messages to be fetched. TPckgBuf<TImap4CompoundProgress> iProgressBuf; TPckgBuf<TImap4SyncProgress> iSyncProgress;
--- a/ipsservices/ipssosplugin/src/ipsplgimap4moveremoteop.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/ipsservices/ipssosplugin/src/ipsplgimap4moveremoteop.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -87,7 +87,6 @@ CIpsPlgImap4MoveRemoteOp::~CIpsPlgImap4MoveRemoteOp() { FUNC_LOG; - delete iLocalSel; delete iRemoteSel; } @@ -209,7 +208,7 @@ CompleteObserver( KErrCouldNotConnect ); return; } - DoMoveLocalL(); + DoMoveRemoteL(); } break; case ELocalMsgs: @@ -253,7 +252,6 @@ User::Leave( KErrNotSupported ); } // Sort messages into complete and incomplete selections. - iLocalSel = new(ELeave) CMsvEntrySelection; iRemoteSel = new(ELeave) CMsvEntrySelection; TInt err; @@ -267,17 +265,6 @@ err = iMsvSession.GetEntry( id, service, tEntry ); if( KErrNone == err ) { - // local move is not needed, if the message is not fetched - if( tEntry.Complete() ) - { - if ( 0 < count ) - { - // service id is not added to local, - // service is already - // added in MoveMessagesL - iLocalSel->AppendL( id ); - } - } iRemoteSel->AppendL( id ); } } @@ -291,38 +278,6 @@ TRequestStatus* observer = &iObserverRequestStatus; User::RequestComplete( observer, KErrNone ); } - -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- -void CIpsPlgImap4MoveRemoteOp::DoMoveLocalL() - { - FUNC_LOG; - iState = ELocalMsgs; - iStatus = KRequestPending; - if( iLocalSel->Count() ) - { - // this gets the first msg to be moved - CMsvEntry* cEntry = iMsvSession.GetEntryL( (*iLocalSel)[0] ); - CleanupStack::PushL( cEntry ); - // find the parent of the moved message... - TMsvId parent = cEntry->Entry().Parent(); - // and use it as a context - cEntry->SetEntryL( parent ); - - delete iOperation; - iOperation = NULL; - iOperation = cEntry->MoveL( *iLocalSel, - iGetMailInfo.iDestinationFolder, - iStatus ); - CleanupStack::PopAndDestroy( cEntry ); - SetActive(); - } - else - { - SetActive(); - CompleteThis(); - } - } // ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
--- a/ipsservices/ipssosplugin/src/ipsplgimap4plugin.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/ipsservices/ipssosplugin/src/ipsplgimap4plugin.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -359,7 +359,7 @@ TPckgBuf<TImImap4GetMailInfo> optionsBuf; TImImap4GetMailInfo& options = optionsBuf(); options.iMaxEmailSize = KMaxTInt32; - options.iGetMailBodyParts = EGetImap4EmailBodyTextAndAttachments; + options.iGetMailBodyParts = EGetImap4EmailHeaders; options.iDestinationFolder = aDestinationFolderId.Id(); CIpsPlgImap4MoveRemoteOpObserver* observer =
--- a/ipsservices/ipssosplugin/src/ipsplgmsgmapper.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/ipsservices/ipssosplugin/src/ipsplgmsgmapper.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -190,25 +190,28 @@ CMsvEntry* cEntry = iSession.GetEntryL( aEntry.Id() ); CleanupStack::PushL( cEntry ); - if ( cEntry && cEntry->HasStoreL() ) - { - store = cEntry->ReadStoreL(); - CleanupStack::PushL( store ); - } - - SetEnvelopeL( cEntry, store, *result ); + if ( cEntry ) + { + if ( cEntry->HasStoreL() ) + { + store = cEntry->ReadStoreL(); + CleanupStack::PushL( store ); + } - // Apparently, this should be done only with - // EFSMsgDataStructure, but EFSMsgDataEnvelope is currently - // used by assuming that it reads also the content-type of - // the message - SetStructureL( cEntry, *result ); - - if ( store ) - { - CleanupStack::PopAndDestroy( store ); - } - CleanupStack::PopAndDestroy( cEntry ); + SetEnvelopeL( cEntry, store, *result ); + + // Apparently, this should be done only with + // EFSMsgDataStructure, but EFSMsgDataEnvelope is currently + // used by assuming that it reads also the content-type of + // the message + SetStructureL( cEntry, *result ); + + if ( store ) + { + CleanupStack::PopAndDestroy( store ); + } + CleanupStack::PopAndDestroy( cEntry ); + } break; } case EFSMsgDataIdOnly: @@ -1361,9 +1364,10 @@ } result->SetMailBoxId( aMailBoxId ); CleanupStack::PopAndDestroy(store); + + SetFetchStateL( aEntry, aMessageId.Id(), ETrue, *result ); CleanupStack::Pop( result ); } - SetFetchStateL( aEntry, aMessageId.Id(), ETrue, *result ); CleanupStack::PopAndDestroy( cEntry ); return result;
--- a/ipsservices/ipssosplugin/src/ipsplgsearch.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/ipsservices/ipssosplugin/src/ipsplgsearch.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -960,18 +960,36 @@ void CIpsPlgSearch::CollectMessagesL() { FUNC_LOG; + TMsvId mailboxId = iCurrentSearch.iMailbox.Id(); + TMsvId serviceId; + TMsvEntry tEntry; + TMsvEntry mailboxServiceEntry; + // Lets make a huge list of message id's. iEmailMessages.Reset(); const TInt folders = iCurrentSearch.iFolderIds.Count(); for ( TInt folder = 0; folder < folders; folder++ ) { - iActiveEntry->SetEntryL( iCurrentSearch.iFolderIds[folder].Id() ); + iActiveEntry->SetEntryL( iCurrentSearch.iFolderIds[folder].Id() ); + if( iActiveEntry->Entry().Parent() == KMsvLocalServiceIndexEntryIdValue ) + { + User::LeaveIfError( + iMsvSession.GetEntry( mailboxId, serviceId, tEntry ) ); + User::LeaveIfError( + iMsvSession.GetEntry( tEntry.iRelatedId, serviceId, mailboxServiceEntry ) ); + } + else + { + serviceId = mailboxId; + } + const TInt msgs = iActiveEntry->Count(); for ( TInt msg = 0; msg < msgs; msg++ ) { const TMsvEntry& entry = ( *iActiveEntry )[msg]; if ( entry.iType == KUidMsvMessageEntry && + entry.iServiceId == serviceId && ( entry.iMtm.iUid == KSenduiMtmSmtpUidValue || entry.iMtm.iUid == iPlugin.MtmId().iUid ) ) {
--- a/ipsservices/ipssossettings/src/ipssetui.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/ipsservices/ipssossettings/src/ipssetui.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -36,7 +36,8 @@ #include "ipsplgsosbaseplugin.hrh" const TInt KIpsSetOptionsMenuItemCount = 4; -_LIT( KIpsSetUiResourceFile,"z:IpsSosSettings.rsc" ); +// Resource file name and path, drive letter need to be parsed run time +_LIT( KIpsSetUiResourceFile, "\\resource\\IpsSosSettings.rsc" ); // ============================ LOCAL FUNCTIONS =============================== @@ -488,11 +489,15 @@ void CIpsSetUi::LoadResourceL() { FUNC_LOG; - TFileName fileName; + + // Load resource file from the same drive where this dll is loaded from + TFileName dllFileName; + Dll::FileName( dllFileName ); + TParse parse; - parse.Set( KIpsSetUiResourceFile, &KDC_RESOURCE_FILES_DIR, NULL ); - fileName.Copy( parse.FullName() ); - + parse.Set( KIpsSetUiResourceFile, &dllFileName, NULL ); + TFileName fileName( parse.FullName() ); + // Attempt to load the resource iResourceLoader.OpenL( fileName ); }
--- a/ipsservices/ipssossettings/src/ipssetuifinder.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/ipsservices/ipssossettings/src/ipssetuifinder.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -239,8 +239,8 @@ // Check if the item is found, and that it's enough if ( iSearchFlags & EFinderItemFound && - !iSearchFlags & EFinderSearchAll && - !iSearchFlags & EFinderResourceSearch ) + !( iSearchFlags & EFinderSearchAll ) && + !( iSearchFlags & EFinderResourceSearch ) ) { return EFalse; } @@ -251,7 +251,7 @@ // Check if the last item is in progress if ( iCurrentItem >= aMaxItems ) { - if ( !iSearchFlags & EFinderItemFound ) + if ( !( iSearchFlags & EFinderItemFound ) ) { iSearchFlags |= EFinderItemFindError; } @@ -411,7 +411,7 @@ } // Check if the subfolders need to be searched - if ( !iSearchFlags & EFinderSearchSubFolders ) + if ( !( iSearchFlags & EFinderSearchSubFolders ) ) { return EFalse; }
--- a/meetingrequest/mrentry/inc/cesmrmeetingrequestentry.h Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrentry/inc/cesmrmeetingrequestentry.h Thu Jan 07 12:38:38 2010 +0200 @@ -152,6 +152,7 @@ private: // Data /// Own: Calendar entry CCalEntry* iEntry; + CCalEntry* iBackupEntry; /// Own: Forward calendar entry CCalEntry* iForwardEntry; /// Ref: Reference to mailbox utilities
--- a/meetingrequest/mrentry/src/cesmrentryprocessor.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrentry/src/cesmrentryprocessor.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -12,7 +12,7 @@ * Contributors: * * Description : ESMR entry processor implementation -* Version : %version: tr1sido#12 % +* Version : %version: e003sa40#13 % * */ @@ -290,7 +290,7 @@ } // Check mail parameters - if ( iParams && iParams->iSpare ) + if ( iParams ) { CCalEntry* entry = &iESMREntry->Entry(); if(entry)
--- a/meetingrequest/mrentry/src/cesmrmeetingrequestentry.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrentry/src/cesmrmeetingrequestentry.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -200,6 +200,7 @@ delete iForwardEntry; delete iOrginalEntry; delete iParameterEntry; + delete iBackupEntry; } // --------------------------------------------------------------------------- @@ -242,7 +243,10 @@ aEntry, aEntry.MethodL(), ESMRHelper::ECopyFull ); - + iBackupEntry=ESMRHelper::CopyEntryL( + aEntry, + aEntry.MethodL(), + ESMRHelper::ECopyFull ); iEntry = ESMRHelper::CopyEntryL( aEntry, aEntry.MethodL(), @@ -450,7 +454,7 @@ // Ownership is transferred CCalInstance* instance = NULL; TRAPD(err, instance = InstanceL() ); - if ( KErrNotFound != err ) + if ( KErrNotFound != err&&err!=KErrNone ) { User::LeaveIfError( err ); } @@ -607,7 +611,10 @@ CleanupStack::PushL( instance ); CCalEntry::TMethod entryMethod( iEntry->MethodL() ); - + CCalEntry* iBackupEntry=ESMRHelper::CopyEntryL( + *iEntry, + entryMethod, + ESMRHelper::ECopyFull); delete iEntry; iEntry = NULL; @@ -649,7 +656,7 @@ CESMRFsMailboxUtils::NewL( iMRMailboxUtils ); CleanupStack::PushL( fsMbUtils ); - fsMbUtils->SetPhoneOwnerL( *iEntry ); + fsMbUtils->SetPhoneOwnerL( *iBackupEntry ); CleanupStack::PopAndDestroy( fsMbUtils ); fsMbUtils = NULL; @@ -679,6 +686,7 @@ iEntry->SetDescriptionL( description ); iOrginalEntry->SetDescriptionL( description ); + iEntry=ESMRHelper::CopyEntryL(*iBackupEntry,iBackupEntry->MethodL(),ESMRHelper::ECopyFull); CleanupStack::PopAndDestroy(); // entries CleanupStack::PopAndDestroy( instance );
--- a/meetingrequest/mrgui/data/esmrgui.rss Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/data/esmrgui.rss Thu Jan 07 12:38:38 2010 +0200 @@ -789,7 +789,7 @@ CBA_BUTTON { id=EAknSoftkeyDone; - txt = text_softkey_done; + txt = text_softkey_cancel; }, AVKON_CBA_BUTTON {
--- a/meetingrequest/mrgui/inc/mesmrlocationplugin.h Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/inc/mesmrlocationplugin.h Thu Jan 07 12:38:38 2010 +0200 @@ -54,9 +54,10 @@ /** * Shows map on the screen focused on the given location. * + * @param aLocation containing name for landmark * @param aLocationUrl URL containing coordinates for maps focus */ - virtual void ShowOnMapL( const TDesC& aLocationUrl ) = 0; + virtual void ShowOnMapL( const TDesC& aLocation, const TDesC& aLocationUrl ) = 0; protected:
--- a/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerdescriptionfield.h Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerdescriptionfield.h Thu Jan 07 12:38:38 2010 +0200 @@ -98,6 +98,12 @@ * Own. */ CESMRFeatureSettings* iFeatures; + + /** + * Location title. + * Own. + */ + HBufC* iLocation; }; #endif /* CESMRVIEWERDESCRIPTIONFIELD_H */
--- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" +* under the terms of the License "Symbian Foundation License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. @@ -71,6 +71,7 @@ FUNC_LOG; delete iLocationPlugin; delete iFeatures; + delete iLocation; } // --------------------------------------------------------------------------- @@ -311,7 +312,7 @@ { const CESMRRichTextLink* link = iRichTextViewer->GetSelectedLink(); - LocationPluginL().ShowOnMapL( link->Value() ); + LocationPluginL().ShowOnMapL( *iLocation, link->Value() ); } break; } @@ -396,6 +397,11 @@ CleanupStack::PopAndDestroy( description ); CleanupStack::PopAndDestroy( showOnMapBuf ); command = EESMRCmdEnableWaypointIcon; + + const TDesC& location = aEntry.Entry().LocationL(); + delete iLocation; + iLocation = NULL; + iLocation = location.AllocL(); } // No location url found. Other description text is added to field. else
--- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerattachmentsfield.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerattachmentsfield.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -386,11 +386,7 @@ { iRichTextViewer->SetFocus( aFocus ); } - else - { - //need to tell action menu that focus has changed - iRichTextViewer->ResetActionMenuL(); - } + if ( aFocus && aFocus != iFocused ) { // <cmail>
--- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerattendeesfield.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerattendeesfield.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -530,15 +530,11 @@ text.Set( name ); } - HBufC* clippedTextHBufC = ClipTextLC( text, *font, maxLineWidth ); - TPtr clippedText = clippedTextHBufC->Des(); - clippedText.Trim(); - - if ( clippedText.Length() > 0 ) + if ( text.Length() > 0 ) { CESMRRichTextLink* link = CESMRRichTextLink::NewL( buffer.Length(), - clippedText.Length() + + text.Length() + KAddressDelimeterSemiColon().Length(), addr, CESMRRichTextLink::ETypeEmail, @@ -549,15 +545,13 @@ // Append text and semicolon to buffer. buffer.ReAllocL( buffer.Length() + - clippedText.Length() + + text.Length() + KAddressDelimeterSemiColon().Length() + KNewLine().Length() ); - buffer.Append( clippedText ); + buffer.Append( text ); buffer.Append( KAddressDelimeterSemiColon ); buffer.Append( KNewLine ); - } - - CleanupStack::PopAndDestroy( clippedTextHBufC ); + } } // If there are more lines in use than KMaxLineCount and
--- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerfromfield.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerfromfield.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -330,16 +330,17 @@ if ( iRichTextViewer ) { iRichTextViewer->SetFocus( aFocus ); - } - if ( aFocus ) - { - SetMiddleSoftKeyVisible( ETrue ); - } - else - { - //need to tell action menu that focus has changed - iRichTextViewer->ResetActionMenuL(); - } + + if ( aFocus ) + { + SetMiddleSoftKeyVisible( ETrue ); + } + else + { + //need to tell action menu that focus has changed + iRichTextViewer->ResetActionMenuL(); + } + } } // ---------------------------------------------------------------------------
--- a/meetingrequest/mrgui/mrlocationplugin/inc/cesmrlocationpluginimpl.h Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/mrlocationplugin/inc/cesmrlocationpluginimpl.h Thu Jan 07 12:38:38 2010 +0200 @@ -58,7 +58,7 @@ public:// from base class MESMRLocationPlugin void SelectFromMapL( const TDesC& aSearchQuery, const TDesC& aLocationUrl ); void SearchFromMapL( const TDesC& aSearchQuery ); - void ShowOnMapL( const TDesC& aLocationUrl ); + void ShowOnMapL( const TDesC& aLocation, const TDesC& aLocationUrl ); protected: // from base class CActive void DoCancel();
--- a/meetingrequest/mrgui/mrlocationplugin/src/cesmrlocationpluginimpl.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/mrlocationplugin/src/cesmrlocationpluginimpl.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -224,7 +224,7 @@ // From class MESMRLocationPlugin. // --------------------------------------------------------------------------- // -void CESMRLocationPluginImpl::ShowOnMapL( const TDesC& aLocationUrl ) +void CESMRLocationPluginImpl::ShowOnMapL( const TDesC& aLocation, const TDesC& aLocationUrl ) { FUNC_LOG; CreateMapViewL(); @@ -233,6 +233,7 @@ RCPointerArray<CPosLandmark> landmarks; CleanupClosePushL( landmarks ); CPosLandmark* landmark = iUrlParser->CreateLandmarkFromUrlL( aLocationUrl ); + landmark->SetLandmarkNameL(aLocation); CleanupStack::PushL( landmark ); landmarks.AppendL( landmark ); CleanupStack::Pop( landmark );
--- a/meetingrequest/mrgui/src/cesmrcontactmenuurlhandler.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/src/cesmrcontactmenuurlhandler.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -37,9 +37,11 @@ #include <apgcli.h> #include <AknQueryDialog.h> #include <aknnotewrappers.h> +#include <FeatMgr.h> // for intranet application opening #include <AiwServiceHandler.h> #include <data_caging_path_literals.hrh> +#include <publicruntimeids.hrh> // DEBUG @@ -240,7 +242,8 @@ data.iText, R_QTN_MEET_REQ_VIEWER_OPTIONS_OPEN_IN_WEB ); aActionMenuPane->AddMenuItemL( data ); - if(IsServiceAvailableL(R_INTRANET_AIW_INTEREST)) + if(IsServiceAvailableL(R_INTRANET_AIW_INTEREST) && + FeatureManager::FeatureSupported( KFeatureIdFfIntranetBrowsing ) ) { data.iCommandId = command; command++;//dynamic command ids @@ -294,7 +297,8 @@ } command++;//next item in the dynamic list - if(IsServiceAvailableL(R_INTRANET_AIW_INTEREST)) + if(IsServiceAvailableL(R_INTRANET_AIW_INTEREST) && + FeatureManager::FeatureSupported( KFeatureIdFfIntranetBrowsing ) ) { if( (aCommand == KUidOpenInIntranet.iUid) || (aCommand == command)) { @@ -324,7 +328,8 @@ CreateMenuItemL( R_QTN_MEET_REQ_VIEWER_OPTIONS_OPEN_IN_WEB, KUidOpenInBrowser); - if(IsServiceAvailableL(R_INTRANET_AIW_INTEREST)) + if(IsServiceAvailableL(R_INTRANET_AIW_INTEREST) && + FeatureManager::FeatureSupported( KFeatureIdFfIntranetBrowsing ) ) { CreateMenuItemL( R_QTN_MEET_REQ_FSOPTIONS_OPEN_IN_INTRA, KUidOpenInIntranet);
--- a/meetingrequest/mrgui/src/cesmreditordialog.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/src/cesmreditordialog.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -137,8 +137,36 @@ } else { - aEntry.SetModifyingRuleL( - MESMRMeetingRequestEntry::EESMRThisOnly ); + TInt result = + CESMRListQuery::ExecuteL( aQueryType ); + + if( KErrCancel == result ) + { + // User has cancelled selecting opening the instance + User::Leave( KErrCancel ); + } + + TESMRThisOccurenceOrSeriesQuery recurrenceModRule = + static_cast<TESMRThisOccurenceOrSeriesQuery>( result ); + + switch( recurrenceModRule ) + { + case EESMRThisOccurence: + { + aEntry.SetModifyingRuleL( + MESMRMeetingRequestEntry::EESMRThisOnly ); + } + break; + case EESMRSeries: + { + aEntry.SetModifyingRuleL( + MESMRMeetingRequestEntry::EESMRAllInSeries ); + } + break; + default: + __ASSERT_DEBUG( EFalse, Panic(EESMREditDlgInvalidSeriesResult)); + break; + } } } @@ -612,7 +640,8 @@ TRAPD( err, DoProcessCommandL( aCommand ) ); if ( err != KErrNone && err != KErrCancel && - err != KErrArgument ) + err != KErrArgument&& + err !=EESMRCmdSendMR) { User::Leave(err); } @@ -673,8 +702,13 @@ case EESMRCmdCalEntryUIAddParticipants: { iView->ExternalizeL (); // no force validation - User::LeaveIfError( - iCallback.ProcessCommandWithResultL ( aCommand )); + TInt result; + TRAPD(err,result=iCallback.ProcessCommandWithResultL ( aCommand )) + if (err != EESMRCmdSendMR&&err!=KErrNone) + { + User::Leave(err); + } + User::LeaveIfError(result); TryExitL ( EESMRCmdForceExit ); break; }
--- a/meetingrequest/mrgui/src/cesmrlocationpluginhandler.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/src/cesmrlocationpluginhandler.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -175,9 +175,10 @@ TPtrC locationUrl; TInt position = iUrlParser->FindLocationUrl( description, locationUrl ); + const TDesC& location = aEntry.Entry().LocationL(); if ( position >= 0 ) { - LocationPluginL().ShowOnMapL( locationUrl ); + LocationPluginL().ShowOnMapL( location, locationUrl ); } break; }
--- a/meetingrequest/mrgui/src/cesmrmeetingtimevalidator.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/meetingrequest/mrgui/src/cesmrmeetingtimevalidator.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -397,7 +397,8 @@ TTime until; if ( iRecurrenceValue != ERecurrenceNot && - iRecurrenceValue != ERecurrenceUnknown ) + iRecurrenceValue != ERecurrenceUnknown && + iRecurrenceUntilDate && iRecurrenceUntilDate->IsVisible() ) { until = RecurrenceUntilTime();