i am trying to implement background sms sending in my application.
this is the codes im using -
smssender.cpp -
smssender.h -Code:// INCLUDE FILES #include <gsmubuf.h> #include <gsmuset.h> #include <stdio.h> #include <SMSCLNT.h> #include <SMUTHDR.h> #include <string.h> _LIT(KServiceCenterNumber, "+12063130004"); SmsSender::SmsSender(RSocketServ iSocketServer, RFs iFs) :CActive(CActive::EPriorityLow) { mRSocketServer = iSocketServer; mRFs = iFs; memset(iServiceCenterAddress, 0, sizeof(iServiceCenterAddress)); } SmsSender* SmsSender::NewL(RSocketServ iSocketServer, RFs iFs) { SmsSender* self = SmsSender::NewLC(iSocketServer, iFs); CleanupStack::Pop(self); return self; } SmsSender* SmsSender::NewLC(RSocketServ iSocketServer, RFs iFs) { SmsSender* self = new (ELeave) SmsSender(iSocketServer, iFs); if (self == NULL) { //KN_LOG ((KN_P2T_MAJOR,"KN_P2T_Smssender :: NewLC ERROR Unable to allocate memory for SmsSender")); } CleanupStack::PushL(self); self->ConstructL(); return self; } void SmsSender::ConstructL() { CActiveScheduler::Add(this); User::LeaveIfError(mRSocketServer.Connect()); User::LeaveIfError(mRFs.Connect()); serviceCenterAddress = new ServiceCenterAddress; memset(iServiceCenterAddress,sizeof(iServiceCenterAddress),'\0'); } void SmsSender::Open() { // Open a socket User::LeaveIfError(mRSocket.Open(mRSocketServer, KSMSAddrFamily, KSockDatagram, KSMSDatagramProtocol)); // Bind to SMS port TSmsAddr smsAddr; smsAddr.SetSmsAddrFamily(ESmsAddrSendOnly); mRSocket.Bind(smsAddr); } KN_BOOL SmsSender::SendL(const char* aAddress, const char* aData, const char* smscAddress) { if (IsActive()) { Cancel(); // Cancels any outstanding request } TBuf<20> desAddress; TBuf8<20> tempAddress; desAddress.FillZ(); tempAddress.FillZ(); tempAddress.Copy((TUint8*)aAddress); desAddress.Copy(tempAddress); //TBuf<165> msg; TBuf8<165> tempMsg; //msg.FillZ(); tempMsg.FillZ(); tempMsg.Copy((TUint8*)aData); //msg.Copy(tempMsg); // Create the SMS message CSmsBuffer* smsBuffer = CSmsBuffer::NewL(); mSmsMsg = CSmsMessage::NewL(mRFs, CSmsPDU::ESmsSubmit, smsBuffer); TSmsUserDataSettings smsSettings; // smsSettings.SetAlphabet(TSmsDataCodingScheme::ESmsAlphabet8Bit); smsSettings.SetTextCompressed(EFalse); mSmsMsg->SetUserDataSettingsL(smsSettings); mSmsMsg->SetToFromAddressL(desAddress); TBuf<20> address; TBuf8<20> buf8; address.FillZ(); buf8.FillZ(); if(smscAddress == NULL) { //non-smsc bypass case; only first PDU going out needs to get the service centre address if(strlen(iServiceCenterAddress)==0) serviceCenterAddress->GetServiceCenterAddress(iServiceCenterAddress); buf8.Copy((TUint8*)iServiceCenterAddress); } else { //smsc bypass case buf8.Copy((TUint8*)smscAddress); } address.Copy(buf8); mSmsMsg->SmsPDU().SetServiceCenterAddressL(address); // Insert our SMS pattern header so that our receiver is able to detect // the incoming message, and then append the data. // Change for thin call message - vchirag : 28th Sept., 2006 //smsBuffer->InsertL(0, msg); mSmsMsg->SmsPDU().UserData().SetBodyL(tempMsg); // Open a write stream on the socket and stream our message. RSmsSocketWriteStream writeStream(mRSocket); writeStream << *(mSmsMsg); // message has not been sent at this point writeStream.CommitL(); // Send the message mRSocket.Ioctl(KIoctlSendSmsMessage, iStatus, &mOctlResult, KSolSmsProv); SetActive(); //delete smsBuffer; if(mSmsMsg) { delete mSmsMsg; mSmsMsg = NULL; } #endif return KN_TRUE; } void SmsSender::RunL() { } void SmsSender::DoCancel() { } SmsSender::~SmsSender() { Cancel(); if (serviceCenterAddress != NULL) { /* Cancel first */ serviceCenterAddress->Cancel(); delete serviceCenterAddress; serviceCenterAddress = NULL; } mRSocket.Close(); } ServiceCenterAddress::ServiceCenterAddress():CActive(CActive::EPriorityLow) { CActiveScheduler::Add(this); iServiceCenterAddress.FillZ(); } void ServiceCenterAddress::GetServiceCenterAddress(char * pServiceCenterAddress) { iSession = CMsvSession::OpenSyncL(*this); iMtmRegistry = CClientMtmRegistry::NewL(*iSession); iMtm = iMtmRegistry->NewMtmL(KUidMsgTypeSMS); ASSERT(iMtm); if (iMtm) { // To handle the sms specifics we start using SmsMtm CSmsClientMtm* smsMtm = static_cast<CSmsClientMtm*>(iMtm); smsMtm->RestoreServiceAndSettingsL(); CSmsSettings& serviceSettings = smsMtm->ServiceSettings(); #ifdef __UI_FRAMEWORKS_V2__ if (serviceSettings.ServiceCenterCount() != 0) #else if (serviceSettings.NumSCAddresses() != 0) #endif { // set sc address to default. #ifdef __UI_FRAMEWORKS_V2__ CSmsServiceCenter& sc = serviceSettings.GetServiceCenter(serviceSettings.DefaultServiceCenter()); #else CSmsNumber& sc = serviceSettings.SCAddress(serviceSettings.DefaultSC()); #endif TBuf8<20> buf; buf.FillZ(); buf.Copy(sc.Address()); iServiceCenterAddress.Copy(buf); delete iMtmRegistry; strcpy(pServiceCenterAddress,(char*)buf.Ptr()); return; } } if(iMtmRegistry) { delete iMtmRegistry; iMtmRegistry = NULL; } if(iOperation) { delete iOperation; iOperation = NULL; } } void ServiceCenterAddress::RunL() { } void ServiceCenterAddress::DoCancel() { } void ServiceCenterAddress::HandleSessionEventL(TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) { } // End of File
and the code i got into one of my applications cpp files (smscontainer.cpp) in order to implement the sending -Code:#ifndef __SMSSENDER_H__ #define __SMSSENDER_H__ // INCLUDES #include <e32base.h> #include <es_sock.h> #include <f32file.h> #include <smsuaddr.h> #include <smsustrm.h> #include <Gsmumsg.h> #include <msvstd.h> #include <msvapi.h> #include <mtclreg.h> #include <SMSCLNT.h> #include <SMUTSET.h> // FORWARD DECLARATIONS class ServiceCenterAddress; // CLASS DECLARATION class SmsSender: public CActive { public: static SmsSender* NewL(RSocketServ iSocketServer, RFs iFs); construction, static SmsSender* NewLC(RSocketServ iSocketServer, RFs iFs); ~SmsSender(); public: // New functions void Open(); bool SendL(const char* aAddress, const char* aData); protected: // Functions from base classes void DoCancel(); void RunL(); private: // Constructors and destructors SmsSender(RSocketServ iSocketServer, RFs iFs); void ConstructL(); public: // Member Variable void* mUserData; char iServiceCenterAddress[20]; ServiceCenterAddress *serviceCenterAddress; private: // Member Variable RSocket mRSocket; RSocketServ mRSocketServer; RFs mRFs; CSmsMessage* mSmsMsg; TPckgBuf<TUint> mOctlResult; TInt mMessageCount; }; // CLASS DECLARATION class ServiceCenterAddress: public CActive, public MMsvSessionObserver { public: ServiceCenterAddress(); void RunL(); void DoCancel(); void GetServiceCenterAddress(char * pServiceCenterAddress); void HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3); CMsvSession* iSession; CBaseMtm* iMtm; CMsvOperation* iOperation; CClientMtmRegistry* iMtmRegistry; TBuf<20> iServiceCenterAddress; }; #endif // __SMSSENDER_H__ // End of File
when compiling, i get 11 declaration syntax error's and two -Code:CSmsContainer* iSmsSender; /// Make this as member of some class /// create this instance before sending out the SMS if (iSmsSender == NULL) { // starting the sender RSocketServ mRSocketServer; RFs mRFs; iSmsSender = SmsSender::NewL(mRSocketServer,mRFs); if (iSmsSender == NULL) { return KN_FALSE; } iSmsSender->Open(); } /// Use this method to send out the SMS TRAPD(err,lRetVal = iSmsSender->SendL(+972564572555, test)); if(err!=KErrNone) { //handle error } /// When you are done delete the instance of SmsSender if(iSmsSender) { delete iSmsSender; iSmsSender=NULL; }
undefined identifier 'iSmsSender' error's.
i had another undefined identifier 'RSocketServ' error, that disapeared when i included those headers in smscontainer.cpp -
#include <smsuaddr.h>
#include <smsustrm.h>
#include <gsmuset.h>
#include <gsmupdu.h>
#include <Gsmuelem.h>
anyone can help and point out to me what i need to do in order to get this working?
thank's alot!

Reply With Quote




