imservices/ossprotocoladaptation/src/im/cosssendmessagerequest.cpp
branchRCL_3
changeset 14 7797b2f86d2b
parent 13 b6f2a363adf7
child 16 cfe5eb8bb9ca
equal deleted inserted replaced
13:b6f2a363adf7 14:7797b2f86d2b
     1 /*
       
     2 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Send message Request to the Network Server
       
    15 *
       
    16 */
       
    17 
       
    18 #include "cosssendmessagerequest.h"
       
    19 #include <ximpprotocolconnectionhost.h>
       
    20 #include "cossprotocolconnectionmanager.h"
       
    21 #include <ximpobjectfactory.h>
       
    22 #include <ximpobjectcollection.h>
       
    23 #include <protocolpresentitygroupsdatahost.h>
       
    24 #include <presenceobjectfactory.h>
       
    25 #include <presentitygroupinfo.h>
       
    26 #include <presentitygroupmemberinfo.h>
       
    27 #include <ximpidentity.h>
       
    28 #include <ximpdatasubscriptionstate.h>
       
    29 #include <protocolpresencedatahost.h>
       
    30 #include "ossprotocolpluginlogger.h"
       
    31 #include "ossprotocloliterals.h"
       
    32 #include <stdlib.h>
       
    33 #include "stringutils.h"
       
    34 #include <string.h>
       
    35 #include "msgliterals.h"
       
    36 #include "msg_enums.h"
       
    37 #include <badesca.h>
       
    38 
       
    39 #include<imconversationinfo.h>
       
    40 #include<imerrors.hrh>
       
    41 #include "ossprotocoladaptutils.h"
       
    42 
       
    43 /**
       
    44 * operations state enums variables 
       
    45 */
       
    46 
       
    47 enum ImStates
       
    48 	{
       
    49 	RecipientOffline = 1,
       
    50 	SenderBlocked = 3,
       
    51 	NotSupported = 5,
       
    52 	  
       
    53 	// add if  required
       
    54 	};
       
    55 // ======== MEMBER FUNCTIONS ========
       
    56 
       
    57 // ---------------------------------------------------------------------------
       
    58 // COSSSendMessageRequest::COSSSendMessageRequest()
       
    59 // ---------------------------------------------------------------------------
       
    60 //
       
    61 COSSSendMessageRequest::COSSSendMessageRequest (
       
    62     MOSSProtocolConnectionManager& aConnMan,
       
    63     TXIMPRequestId aRequestId ) :
       
    64 
       
    65 		CActive ( EPriorityNormal ),
       
    66 		iRequestId ( aRequestId ),
       
    67 		iConnMan ( aConnMan )
       
    68 	{
       
    69 	LOGGER ( TXT ( "COSSSendMessageRequest::COSSSendMessageRequest Start" ) );
       
    70 	CActiveScheduler::Add ( this );
       
    71 
       
    72 	LOGGER ( TXT ( "COSSSendMessageRequest::COSSSendMessageRequest End" ) );
       
    73 	}
       
    74 
       
    75 
       
    76 // ---------------------------------------------------------------------------
       
    77 // COSSSendMessageRequest::ConstructL()
       
    78 // ---------------------------------------------------------------------------
       
    79 //
       
    80 void COSSSendMessageRequest::ConstructL()
       
    81 	{
       
    82 	LOGGER ( TXT ( "COSSSendMessageRequest::ConstructL Start-End" ) );
       
    83 
       
    84 
       
    85 	}
       
    86 
       
    87 
       
    88 // ---------------------------------------------------------------------------
       
    89 // COSSSendMessageRequest::NewL()
       
    90 // ---------------------------------------------------------------------------
       
    91 //
       
    92 COSSSendMessageRequest* COSSSendMessageRequest::NewL (
       
    93     MOSSProtocolConnectionManager& aConnMan,
       
    94     TXIMPRequestId aRequestId )
       
    95 	{
       
    96 	LOGGER ( TXT ( "COSSSendMessageRequest::NewL Start" ) );
       
    97 
       
    98 	COSSSendMessageRequest* self = new ( ELeave )
       
    99 	COSSSendMessageRequest ( aConnMan, aRequestId );
       
   100 	CleanupStack::PushL ( self );
       
   101 	self->ConstructL();
       
   102 	CleanupStack::Pop ( self );
       
   103 
       
   104 	LOGGER ( TXT ( "COSSSendMessageRequest::NewL End" ) );
       
   105 	return self;
       
   106 	}
       
   107 
       
   108 
       
   109 // ---------------------------------------------------------------------------
       
   110 // COSSSendMessageRequest::NewLC()
       
   111 // ---------------------------------------------------------------------------
       
   112 //
       
   113 COSSSendMessageRequest* COSSSendMessageRequest::NewLC (
       
   114     MOSSProtocolConnectionManager& aConnMan,
       
   115     TXIMPRequestId aRequestId )
       
   116 	{
       
   117 	LOGGER ( TXT ( "COSSSendMessageRequest::NewLC Start" ) );
       
   118 
       
   119 	COSSSendMessageRequest* self =
       
   120 	    COSSSendMessageRequest::NewL ( aConnMan, aRequestId );
       
   121 	CleanupStack::PushL ( self );
       
   122 
       
   123 	LOGGER ( TXT ( "COSSSendMessageRequest::NewLC End" ) );
       
   124 	return self;
       
   125 	}
       
   126 
       
   127 // ---------------------------------------------------------------------------
       
   128 // COSSSendMessageRequest::~COSSSendMessageRequest()
       
   129 // ---------------------------------------------------------------------------
       
   130 //
       
   131 COSSSendMessageRequest::~COSSSendMessageRequest()
       
   132 	{
       
   133 	LOGGER ( TXT ( "COSSSendMessageRequest::~COSSSendMessageRequest Start" ) );
       
   134 	LOGGER ( TXT ( "COSSSendMessageRequest::~COSSSendMessageRequest End" ) );
       
   135 	}
       
   136 
       
   137 
       
   138 // ---------------------------------------------------------------------------
       
   139 // COSSSendMessageRequest::DoCancel()
       
   140 // ---------------------------------------------------------------------------
       
   141 //
       
   142 void COSSSendMessageRequest::DoCancel()
       
   143 	{
       
   144 	}
       
   145 
       
   146 
       
   147 // ---------------------------------------------------------------------------
       
   148 // COSSSendMessageRequest::RunL()
       
   149 // ---------------------------------------------------------------------------
       
   150 //
       
   151 void COSSSendMessageRequest::RunL()
       
   152 	{
       
   153 	LOGGER ( TXT ( "COSSSendMessageRequest::RunL start" ) );
       
   154 	message_hdr_resp* msg_struct = NULL;
       
   155 	User::LeaveIfError ( iStatus.Int() );
       
   156     char* pResponse = NULL;  
       
   157 	pResponse = iConnMan.DataHandler().ResponseL ( iSendId );
       
   158 
       
   159 	msg_struct = ( message_hdr_resp* )pResponse ;
       
   160 	if( !( msg_struct->response ) )
       
   161 	{
       
   162 		switch( msg_struct->error_type )
       
   163 		{
       
   164 	
       
   165 		case RecipientOffline: //The username or password was invalid. 
       
   166 			   iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, KImApiErrRecipientNotLogged );
       
   167 		       break;
       
   168 		case SenderBlocked: //The username or password was invalid. 
       
   169 			   iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, KImApiErrSenderBlocked );
       
   170 		       break;
       
   171 		case NotSupported: //The username or password was invalid. 
       
   172 			   iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, KImErrServiceRequestTypeNotSupported );
       
   173 		       break;
       
   174 		default:  //for all other error codes like ssl related are mapped to general error
       
   175 			   iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, KImErrServiceGeneralError );
       
   176 		       break;       
       
   177 		}	
       
   178 	}
       
   179 	else
       
   180 	{
       
   181 	  iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, KErrNone );
       
   182 	}
       
   183 
       
   184 	free( pResponse );
       
   185 
       
   186 	delete this;
       
   187 
       
   188 	LOGGER ( TXT ( "COSSSendMessageRequest::RunL End" ) );
       
   189 	}
       
   190 
       
   191 
       
   192 // ---------------------------------------------------------------------------
       
   193 // COSSSendMessageRequest::RunError()
       
   194 // ---------------------------------------------------------------------------
       
   195 //
       
   196 TInt COSSSendMessageRequest::RunError ( TInt  aError )
       
   197 	{
       
   198 	LOGGER ( TXT ( "COSSSendMessageRequest::RunError Start" ) );
       
   199 
       
   200 	iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, aError );
       
   201 
       
   202 	delete this;
       
   203 	LOGGER ( TXT ( "COSSSendMessageRequest::RunError End" ) );
       
   204 	return KErrNone;
       
   205 	}
       
   206 
       
   207 // ---------------------------------------------------------------------------
       
   208 // COSSSendMessageRequest::SendMessageL()
       
   209 // ---------------------------------------------------------------------------
       
   210 //
       
   211 void COSSSendMessageRequest::SendMessageL ( const MImConversationInfo& aImMessage )
       
   212 	{
       
   213 	LOGGER ( TXT ( "COSSSendMessageRequest::SendMessageL Start" ) );
       
   214 
       
   215 	TPtrC16 message = aImMessage.TextMessage();
       
   216 	const MDesCArray& recipients = aImMessage.RecipientL();
       
   217 
       
   218 	int userLen = 0;
       
   219 	int totalLen = 0;
       
   220 
       
   221 	message_hdr_req msgHdr = {0,};
       
   222 	msgHdr.message_type = ESend_Request; 
       
   223 	totalLen += sizeof ( message_hdr_req );
       
   224 
       
   225 	RArray<charFormatData> recipientArray;	
       
   226 	for ( TInt i = 0; i < recipients.MdcaCount(); i++ )
       
   227 		{
       
   228 		TPtrC16 recipientsPtr = recipients.MdcaPoint( i );
       
   229 		charFormatData recipient = OssProtocolAdapUtils::ConvertTUint16ToCharLC( recipientsPtr );
       
   230         recipientArray.AppendL( recipient );//will get it back when writting to final buffer.
       
   231 	    userLen = recipient.dataSize;
       
   232 		totalLen += userLen;
       
   233 		}
       
   234 	totalLen++;
       
   235 	
       
   236 	charFormatData charData = OssProtocolAdapUtils::ConvertTUint16ToCharLC( message );
       
   237     char* msg = charData.data;
       
   238 	userLen = charData.dataSize;
       
   239 	totalLen += userLen;
       
   240 	
       
   241 	User::LeaveIfError ( totalLen > MAX_MSG_SIZE );
       
   242 	
       
   243 	char* outMessage = ( char* ) User::AllocLC( totalLen );
       
   244 	memset( outMessage , '\0' ,  totalLen );
       
   245 
       
   246     userLen  = 0;
       
   247 	totalLen = 0;
       
   248 	totalLen += sizeof ( message_hdr_req );
       
   249 	
       
   250 
       
   251 	memcpy( outMessage , &msgHdr , totalLen ); //copy header.
       
   252 	
       
   253 	//now copy recipients one by one.
       
   254 	TInt recipientCount = recipientArray.Count();
       
   255 	for( TInt count = 0 ; count < recipientCount ; count++)
       
   256 		{
       
   257 		charFormatData receiver = recipientArray[count];
       
   258 		userLen = receiver.dataSize;		
       
   259 		memcpy( outMessage + totalLen , receiver.data , userLen );	
       
   260 		totalLen += userLen;
       
   261 		}
       
   262 		
       
   263 	totalLen++;	
       
   264 	userLen = charData.dataSize;	
       
   265 	memcpy ( outMessage + totalLen , msg , userLen );
       
   266  
       
   267 	totalLen += userLen;
       
   268 	iSendId = iConnMan.DataHandler().SendDataL ( iStatus, outMessage, totalLen );
       
   269 
       
   270 	// signal the scheduler
       
   271 	SetActive();
       
   272 	CleanupStack::PopAndDestroy( recipientCount + 2 );//outMessage,msg,
       
   273 	recipientArray.Close();  
       
   274 	
       
   275 	LOGGER ( TXT ( "COSSSendMessageRequest::SendMessageL End" ) );
       
   276 	}
       
   277 
       
   278 // End of file