00001 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). 00002 // All rights reserved. 00003 // This component and the accompanying materials are made available 00004 // under the terms of "Eclipse Public License v1.0" 00005 // which accompanies this distribution, and is available 00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". 00007 // 00008 // Initial Contributors: 00009 // Nokia Corporation - initial contribution. 00010 // 00011 // Contributors: 00012 // 00013 // Description: 00014 // This is a simple example that demonstrates the use of the SendAs v2 protocol to send messages 00015 // 00016 00017 00018 00022 #include "SendAs2Example.h" 00023 00024 _LIT(KBodyText, "You are limited only by your fears. Remember it is attitude, more than aptitude,that determines your altitude"); 00025 _LIT(KAddress1, "ban-sindhub01@ban-sindhub01.intra"); 00026 _LIT(KAddress3, "ban-sindhub01@ban-sindhub01.intra"); 00027 _LIT(KAddress4, "test1@nokia.com"); 00028 _LIT(KAlias1, "Alias1"); 00029 _LIT(KAlias2, "Alias2"); 00030 _LIT(KAccount1, " \n SendAs Account1 \n"); 00031 _LIT(KAccount2, " \n SendAs Account2 \n"); 00032 _LIT(KAccount3, " \n SendAs Account3 \n"); 00033 _LIT(KAccountNames,"\n The list of accounts present are: \n"); 00034 _LIT(KTextWelcome, " SendAs2 Example \n"); 00035 _LIT(KTextStartApp, "\n Starting the SendAs2 Example application .... \n"); 00036 _LIT(KTextPressAKey, "\n Press any key to step through the example .... \n"); 00037 _LIT(KTextConn, "\n Connecting to sendAs server .... \n"); 00038 _LIT(KTextErrInn, "\n Connection is successful\n"); 00039 _LIT(KTextErrOut, "\n\n Connection has failed\n"); 00040 _LIT(KTextCreate, "\n Creating a SendAs message .... \n"); 00041 _LIT(KTextSend, "\n Sending the sendAs message .... \n"); 00042 _LIT(KTextClose, "\n The SendAs message has been sent \n"); 00043 _LIT(KPressAnyKey, "\n Press any key.... \n"); 00044 _LIT(KExitKey, "\n Press any key to exit the application.... \n"); 00045 _LIT(KSmsClient, "SMS Client"); 00046 00051 CSendAs2Example* CSendAs2Example::NewL() 00052 { 00053 CSendAs2Example* self = new (ELeave) CSendAs2Example(); 00054 CleanupStack::PushL(self); 00055 self->ConstructL(); 00056 CleanupStack::Pop(); 00057 return self; 00058 } 00059 00063 CSendAs2Example::CSendAs2Example() 00064 { 00065 00066 } 00067 00071 void CSendAs2Example::ConstructL() 00072 { 00073 iConsole = Console::NewL(KTextWelcome,TSize(KConsFullScreen,KConsFullScreen)); 00074 iConsole->Printf ( KTextStartApp ); 00075 iConsole->Printf ( KTextPressAKey ); 00076 iConsole->Getch (); 00077 } 00078 00085 CSendAs2Example::~CSendAs2Example() 00086 { 00087 delete iSelection; 00088 iSelection = NULL; 00089 00090 delete iEntry; 00091 iEntry = NULL; 00092 00093 delete iSession; 00094 iSession = NULL; 00095 00096 delete iObserver; 00097 iObserver = NULL; 00098 00099 iSendAs.Close(); 00100 delete iConsole; 00101 } 00102 00109 void CSendAs2Example::StartL() 00110 { 00111 iObserver = new(ELeave) CDummyObserver; 00112 iSession = CMsvSession::OpenSyncL(*iObserver); 00113 00114 TMsvId aFolderId = KMsvDraftEntryId; 00115 iEntry = CMsvEntry::NewL(*iSession, aFolderId, 00116 TMsvSelectionOrdering(KMsvNoGrouping,EMsvSortByNone,ETrue)); 00117 00118 iSelection = iEntry->ChildrenL(); 00119 00120 Connect(); 00121 RSendAsMessage message; 00122 CleanMessageFolderL(); 00123 CreateL(message); 00124 DisplayAccountL(); 00125 CapabilityFilterL(); 00126 SendL(message); 00127 } 00128 00135 void CSendAs2Example::Connect() 00136 { 00137 iConsole->Printf ( KTextConn ); 00138 TInt err = iSendAs.Connect(KSendAsDefaultMessageSlots); 00139 if ( err == KErrNone) 00140 { 00141 iConsole->Printf ( KTextErrInn ); 00142 } 00143 else 00144 { 00145 iConsole->Printf ( KTextErrOut ); 00146 } 00147 } 00148 00152 void CSendAs2Example::CleanMessageFolderL() 00153 { 00154 TMsvLocalOperationProgress progress; 00155 if (iSelection->Count() > 0) 00156 { 00157 iEntry->DeleteL(*iSelection, progress); 00158 } 00159 } 00160 00165 void CSendAs2Example::CreateL( RSendAsMessage& aMessage) 00166 { 00167 00168 CSendAsMessageTypes* messageTypes = CSendAsMessageTypes::NewL(); 00169 CleanupStack::PushL(messageTypes); 00170 00171 // Filter all MTMs that can send messages. 00172 // This list can be refined by applying filters using FilterAgainstCapability. 00173 iSendAs.FilteredMessageTypesL(*messageTypes); 00174 00175 TUid sendAsMtmUid; 00176 00177 // Returning the message UID based on the message type 00178 // such as 0 for SMTP Client, 1 for SMS Client 00179 // 2 for Infrared client MTM and 3 for Bluetooth client MTM. 00180 sendAsMtmUid = messageTypes->UidFromNameL(KSmsClient); 00181 00182 CleanupStack::PopAndDestroy(messageTypes); 00183 iConsole->Printf ( KTextCreate ); 00184 00185 00186 iEntry->SetEntryL(KMsvDraftEntryId); 00187 00188 aMessage.CreateL(iSendAs, sendAsMtmUid); 00189 // Set the body text of this message using a plain descriptor. 00190 // The object must have an open message to use this method. 00191 aMessage.SetBodyTextL(KBodyText); 00192 // Add recipients to this message. 00193 aMessage.AddRecipientL(KAddress1, KAlias1, RSendAsMessage::ESendAsRecipientTo); 00194 aMessage.AddRecipientL(KAddress3, RSendAsMessage::ESendAsRecipientCc); 00195 aMessage.AddRecipientL(KAddress4, KAlias2, RSendAsMessage::ESendAsRecipientCc); 00196 00197 CMsvEntry* entry = CMsvEntry::NewL(*iSession, KMsvDraftEntryId, 00198 TMsvSelectionOrdering(KMsvNoGrouping,EMsvSortByNone,ETrue)); 00199 CleanupStack::PushL(entry); 00200 00201 // Sets the context to the specified entry. 00202 entry->SetEntryL(KMsvDraftEntryId); 00203 if(iSelection->Count() >= 1) 00204 { 00205 entry->SetEntryL((*iSelection)[0]); 00206 }; 00207 00208 CleanupStack::PopAndDestroy(entry); 00209 } 00210 00215 void CSendAs2Example::DisplayAccountL() 00216 { 00217 CSendAsAccounts* accounts = CSendAsAccounts::NewL(); 00218 CleanupStack::PushL(accounts); 00219 00220 // Append 3 new accounts and associated name pair. 00221 if(accounts->Count()==0) 00222 { 00223 accounts->AppendAccountL(KAccount1, 0xaaaaaaaa); 00224 } 00225 00226 if(accounts->Count()==1) 00227 { 00228 accounts->AppendAccountL(KAccount2, 0x55555555); 00229 } 00230 00231 if(accounts->Count()==2) 00232 { 00233 accounts->AppendAccountL(KAccount3, 0x22222222); 00234 } 00235 iConsole->Printf( KAccountNames ); 00236 iConsole->Printf ( KPressAnyKey ); 00237 iConsole->Getch (); 00238 00239 // Display the array of names of accounts for this message type 00240 for(TInt i = 0; i < 3; i++) 00241 { 00242 TPtrC array = accounts->AccountNames().MdcaPoint(i); 00243 iConsole->Printf( array ); 00244 } 00245 00246 CleanupStack::PopAndDestroy(accounts); 00247 00248 } 00249 00255 void CSendAs2Example::CapabilityFilterL() 00256 { 00257 // Get a list of MTMs available to send the message 00258 // By specifying the features that the MTMs must have. 00259 // Eg: set filter to test that KUidMtmQueryMaxBodySize >= bodySize 00260 User::LeaveIfError(iSendAs.FilterAgainstCapability(KUidMtmQuerySupportAttachments)); 00261 User::LeaveIfError(iSendAs.FilterAgainstCapability(KUidMtmQueryMaxBodySize, 0x10, RSendAs::ESendAsGreaterThan)); 00262 User::LeaveIfError(iSendAs.FilterAgainstCapability(KUidMtmQuerySupportedBody, KMtm16BitBody, RSendAs::ESendAsBitwiseAnd)); 00263 User::LeaveIfError(iSendAs.FilterAgainstCapability(KUidMtmQuerySupportedBody, KMtm16BitBody, RSendAs::ESendAsBitwiseAnd)); 00264 User::LeaveIfError(iSendAs.FilterAgainstCapability(KUidMtmQuerySupportSubject)); 00265 User::LeaveIfError(iSendAs.FilterAgainstCapability(KUidMtmQuerySupportsFolder)); 00266 User::LeaveIfError(iSendAs.FilterAgainstCapability(KUidMtmQueryMaxRecipientCount)); 00267 } 00268 00273 void CSendAs2Example::SendL(RSendAsMessage& aMessage) 00274 { 00275 iConsole->Printf ( KTextSend ); 00276 iConsole->Printf ( KPressAnyKey ); 00277 iConsole->Getch (); 00278 00279 CMsvOperationWait* wait = CMsvOperationWait::NewLC(); 00280 wait->iStatus = KRequestPending; 00281 wait->Start(); 00282 // Asynchronously send the message. 00283 // This will only be allowed to happen if the caller 00284 // holds sufficient capabilities to perform this action. 00285 // If the caller does not hold these capabilities, then 00286 // the message send will be automatically demoted to a confirmed send. 00287 aMessage.SendMessage(wait->iStatus); 00288 00289 CleanupStack::PopAndDestroy(wait); 00290 iConsole->Printf ( KTextClose ); 00291 iConsole->Printf ( KExitKey ); 00292 iConsole->Getch (); 00293 } 00294 00295 LOCAL_C void MainL() 00296 { 00297 // Creates an Active Scheduler to handle asychronous calls. 00298 CActiveScheduler* scheduler = new (ELeave) CActiveScheduler; 00299 /* 00300 If an Active Scheduler has been created, installs it . 00301 As it is an asychronous call we need to install it explicitly. 00302 */ 00303 CActiveScheduler::Install( scheduler ); 00304 00305 CSendAs2Example* app = CSendAs2Example::NewL(); 00306 CleanupStack::PushL(app); 00307 // Calls the main function in which other functions are called. 00308 app->StartL(); 00309 CleanupStack::PopAndDestroy(app); 00310 00311 delete scheduler; 00312 } 00313 00314 GLDEF_C TInt E32Main() 00315 { 00316 __UHEAP_MARK; 00317 CTrapCleanup* cleanup = CTrapCleanup::New(); 00318 if(cleanup == NULL) 00319 { 00320 return KErrNoMemory; 00321 } 00322 TRAPD(err, MainL()); 00323 if(err != KErrNone) 00324 { 00325 User::Panic(_L("failed to complete"),err); 00326 } 00327 00328 delete cleanup; 00329 __UHEAP_MARKEND; 00330 return KErrNone; 00331 }
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.