telephonyserverplugins/common_tsy/commontsy/src/mmfax/CMmFaxExt.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
child 42 3adadc800673
equal deleted inserted replaced
-1:000000000000 0:3553901f7fa8
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 
       
    17 
       
    18 //  INCLUDE FILES
       
    19 #include <ctsy/tflogger.h>
       
    20 #include "cmmfaxext.h"
       
    21 #include "cmmphonetsy.h"
       
    22 #include "cmmlinelist.h"
       
    23 #include "cmmfaxcalltsy.h"
       
    24 #include "cmmfaxlinetsy.h"
       
    25 #include <ctsy/pluginapi/cmmdatapackage.h>
       
    26 #include "cmmcallgsmwcdmaext.h"
       
    27 
       
    28 
       
    29 // ======== MEMBER FUNCTIONS ========
       
    30 
       
    31 CMmFaxExt::CMmFaxExt(
       
    32     CMmCallTsy* aMmCall )   // call that owns this object
       
    33     : iMmCall( reinterpret_cast<CMmFaxCallTsy*>( aMmCall ) )
       
    34     {
       
    35 TFLOGSTRING2("TSY: CMmFaxExt::CMmFaxExt: Call Id:%d", iMmCall->CallId() );
       
    36     iFax           = NULL;
       
    37     iFaxSession    = NULL;
       
    38     iFaxCompletion = NULL;
       
    39     }
       
    40 
       
    41 void CMmFaxExt::ConstructL()
       
    42     {
       
    43 TFLOGSTRING("TSY: CMmFaxExt::ConstructL");
       
    44 
       
    45     // Create CMmFaxCompletion class for Fax Server.
       
    46     iFaxCompletion = new (ELeave) CMmFaxCompletion();
       
    47     iDataPortLoaned = EFalse;
       
    48     }
       
    49 
       
    50 CMmFaxExt* CMmFaxExt::NewL(
       
    51         CMmCallTsy* aMmCall )  // The call object which owns CMmFaxExt  
       
    52     {
       
    53 TFLOGSTRING("TSY: CMmFaxExt::NewL");
       
    54 
       
    55     CMmFaxExt* self = new ( ELeave ) CMmFaxExt( aMmCall );
       
    56     CleanupStack::PushL( self );
       
    57     self->ConstructL();
       
    58     CleanupStack::Pop();
       
    59 
       
    60     return self;
       
    61     }
       
    62 
       
    63 CMmFaxExt::~CMmFaxExt()
       
    64     {
       
    65     //This must execute here, if status is Idle (Fax Client API) on HangUp,
       
    66     //this will never be executed. so we do it here. It is ok to call
       
    67     //cleanup multiple times.
       
    68     CleanUpFaxServer();
       
    69 
       
    70     if ( iFax )
       
    71         {
       
    72 TFLOGSTRING("TSY: CMmFaxExt::~CMmFaxExt: deleting iFax");
       
    73         delete iFax;
       
    74         iFax = NULL;
       
    75         }
       
    76 
       
    77     if (iFaxCompletion)
       
    78         {
       
    79 TFLOGSTRING("TSY: CMmFaxExt::~CMmFaxExt: deleting iFaxCompletion");
       
    80         delete iFaxCompletion;
       
    81         iFaxCompletion = NULL;
       
    82         }
       
    83 
       
    84     // mark fax as unopened, so that it can be opened again.
       
    85 	if( iMmCall )
       
    86 		{
       
    87 		(reinterpret_cast<CMmFaxLineTsy*>( iMmCall->Line() ))->
       
    88 			iFaxOpened = EFalse;
       
    89 		}
       
    90 
       
    91     iMmCall = NULL;
       
    92     iFaxSession = NULL;
       
    93     }
       
    94 
       
    95 // ---------------------------------------------------------------------------
       
    96 // CMmFaxExt::CompleteOperation
       
    97 // Completes ongoing read/write operation on CMmFaxCompletion object.
       
    98 // Returns: None
       
    99 // ---------------------------------------------------------------------------
       
   100 //
       
   101 void CMmFaxExt::CompleteOperation(
       
   102         TInt aError ) 
       
   103     {
       
   104 TFLOGSTRING("TSY: CMmFaxExt::CompleteOperation");
       
   105      
       
   106     if ( iFaxCompletion )
       
   107         {
       
   108         iFaxCompletion->CompleteOperation( aError );
       
   109         }
       
   110     }
       
   111     
       
   112 // ---------------------------------------------------------------------------
       
   113 // CMmFaxExt::ConfigureCompletion
       
   114 // Set fax request handle to CMmFaxCompletion class object.
       
   115 // Returns: None
       
   116 // ---------------------------------------------------------------------------
       
   117 //
       
   118 void CMmFaxExt::ConfigureCompletion(
       
   119         const TTsyReqHandle aTsyReqHandle,  
       
   120         CTelObject* aTelObject )            
       
   121     {
       
   122 TFLOGSTRING("TSY: CMmFaxExt::Configure");
       
   123 
       
   124     iFaxCompletion->Configure( aTsyReqHandle, aTelObject );
       
   125     }
       
   126 
       
   127 // ---------------------------------------------------------------------------
       
   128 // CMmFaxExt::CreateFaxObject
       
   129 // Creates CMmTsyFax object and returns it.
       
   130 // Returns: Pointer to created object
       
   131 // ---------------------------------------------------------------------------
       
   132 //
       
   133 CTelObject* CMmFaxExt::OpenNewObjectByNameL(
       
   134         const TDesC& aName )  
       
   135     {
       
   136 TFLOGSTRING("TSY: CMmFaxExt::OpenNewObjectByNameL");
       
   137 
       
   138     // check the name of opened object..
       
   139     _LIT(KFaxObjectName, "FAX");
       
   140     if ( aName != KFaxObjectName )
       
   141         {
       
   142         User::Leave(KErrNotSupported);
       
   143         }
       
   144 
       
   145     //  We only want one fax object to be opened per phone.
       
   146     //  Previously only the connected call could open a fax object, so it was
       
   147     //  easy to check whether one had already been opened. Now a fax call can
       
   148     //  open a fax object at any time making it less clear how to check that
       
   149     //  no other call has opened one.
       
   150     RPhone::TLineInfo lineInfo = iMmCall->Line()->LineInfo();
       
   151     TBool& faxOpened = (reinterpret_cast<CMmFaxLineTsy*>(
       
   152         iMmCall->Owner() ))->iFaxOpened;
       
   153     if ( lineInfo.iStatus != GetCallStatus() )
       
   154         { 
       
   155 		// another fax call is in progress so this call cannot open a fax object
       
   156         User::Leave( KErrEtelNotCallOwner );
       
   157         }
       
   158 
       
   159     if ( faxOpened )
       
   160         {
       
   161         // Another call on this line has already opened fax.
       
   162         User::Leave( KErrAlreadyExists );
       
   163         }
       
   164 
       
   165 
       
   166     // create new fax object..
       
   167     iFax = CMmTsyFax::NewL( this );
       
   168 
       
   169     // set faxopened flag of the line object
       
   170     faxOpened = ETrue;
       
   171 
       
   172     return iFax;
       
   173     }
       
   174 
       
   175 // ---------------------------------------------------------------------------
       
   176 // CMmFaxExt::FaxConnectHandler
       
   177 // Checks if some another uses fax line.
       
   178 // Returns: Error value
       
   179 // ---------------------------------------------------------------------------
       
   180 //
       
   181 TInt CMmFaxExt::FaxConnectHandler()
       
   182     {
       
   183 TFLOGSTRING("TSY: CMmFaxExt::FaxConnectHandler");
       
   184 
       
   185     TInt errorCode( KErrNone );
       
   186 
       
   187     if ( (reinterpret_cast<CMmFaxLineTsy*>( iMmCall->Line() ))->iFaxOpened 
       
   188           && NULL == iFax )
       
   189         {
       
   190         iMmCall->SetUnowned();
       
   191         errorCode = KErrEtelNotFaxOwner;
       
   192         }
       
   193     else
       
   194         {
       
   195         TRAP( errorCode, GetFaxBaseL() );
       
   196         if ( KErrNone != errorCode )
       
   197             {
       
   198             iMmCall->SetUnowned();
       
   199             }
       
   200         }
       
   201     return errorCode;
       
   202     }
       
   203 
       
   204 // ---------------------------------------------------------------------------
       
   205 // CMmFaxExt::AnswerIncomingCall
       
   206 // Starts waiting for incoming fax call
       
   207 // Returns: Error value
       
   208 // ---------------------------------------------------------------------------
       
   209 //
       
   210 TInt CMmFaxExt::AnswerIncomingCall(
       
   211         const TTsyReqHandle& aTsyReqHandle ) // function identification handle
       
   212     {
       
   213 TFLOGSTRING("TSY: CMmFaxExt::AnswerIncomingCall");
       
   214     
       
   215     TInt ret( KErrGeneral );
       
   216 
       
   217     // check and set call ownership..
       
   218     MCallBaseTSY::TCallOwnership ownerShip = iMmCall->CheckOwnership( 
       
   219       aTsyReqHandle );
       
   220     if ( ownerShip == MCallBaseTSY::EOwnedUnowned 
       
   221          || ownerShip == MCallBaseTSY::EOwnedPriorityClient ) 
       
   222         {
       
   223         iMmCall->SetOwnership( aTsyReqHandle );
       
   224 
       
   225         // open faxserver library and faxserver session (iFaxSession)
       
   226         ret = FaxConnectHandler(); 
       
   227         if ( KErrNone == ret )
       
   228             {
       
   229             ret = OpenFaxServer(NULL, EWaitForRingAndReceive);
       
   230             if ( KErrNone == ret )
       
   231                 {
       
   232                 ConfigureCompletion(aTsyReqHandle, iMmCall);
       
   233                 iFaxSession->RxConnect();
       
   234                 }
       
   235             }
       
   236 
       
   237         }
       
   238     else // ownership test failed
       
   239         {
       
   240         ret = KErrEtelNotCallOwner;
       
   241         }
       
   242 
       
   243     // We don't complete erroneous request here since
       
   244     // CTsyCall::AnswerIncomingCall (calling function) does it for us..
       
   245     return ret;
       
   246     }
       
   247     
       
   248 // ---------------------------------------------------------------------------
       
   249 // CMmFaxExt::Dial
       
   250 // Start fax call connection.
       
   251 // Returns: Error value
       
   252 // ---------------------------------------------------------------------------
       
   253 //
       
   254 TInt CMmFaxExt::Dial(
       
   255         const TTsyReqHandle& aTsyReqHandle, 
       
   256         TDesC* aTelNumber )      
       
   257     {
       
   258 TFLOGSTRING("TSY: CMmFaxExt::Dial");
       
   259     
       
   260     TInt ret( KErrGeneral );
       
   261 
       
   262     // check and set call ownership..
       
   263     MCallBaseTSY::TCallOwnership ownerShip = iMmCall->CheckOwnership( 
       
   264       aTsyReqHandle );
       
   265     if( ownerShip == MCallBaseTSY::EOwnedUnowned
       
   266          || ownerShip == MCallBaseTSY::EOwnedPriorityClient ) 
       
   267         {
       
   268         iMmCall->SetOwnership( aTsyReqHandle );
       
   269 
       
   270         ret = FaxConnectHandler();
       
   271         if( KErrNone == ret )
       
   272             {
       
   273             TFaxMode faxMode;
       
   274             if( RCall::ETransmit == iFaxSettings.iMode )
       
   275                 {
       
   276                 faxMode = EDialAndTransmit;
       
   277                 }
       
   278             // we're receiving
       
   279             else    
       
   280                 {
       
   281                 if( RCall::EFaxPoll  == iFaxSettings.iFaxRetrieveType )
       
   282                     {
       
   283                     faxMode = EDialAndReceivePoll;
       
   284                     }
       
   285                 else 
       
   286                     {
       
   287                     faxMode = EDialAndReceiveFaxBack; 
       
   288                     }
       
   289                 }
       
   290 
       
   291             ret = OpenFaxServer( aTelNumber, faxMode );
       
   292             if( KErrNone == ret )
       
   293                 {
       
   294                 ConfigureCompletion( aTsyReqHandle, iMmCall );
       
   295                 if( EDialAndTransmit == faxMode )
       
   296                     {
       
   297 TFLOGSTRING("TSY: CMmFaxExt::FaxDial:TxConnect");
       
   298                     iFaxSession->TxConnect();
       
   299                     }
       
   300                 else
       
   301                     {
       
   302 TFLOGSTRING("TSY: CMmFaxExt::FaxDial:RxConnect");
       
   303                     iFaxSession->RxConnect();
       
   304                     }
       
   305                 }
       
   306             } // faxconnect
       
   307         }
       
   308     else 
       
   309         {
       
   310         // ownership test failed
       
   311         ret = KErrEtelNotCallOwner;
       
   312         }
       
   313 
       
   314     return ret;
       
   315     }
       
   316 
       
   317 // ---------------------------------------------------------------------------
       
   318 // CMmFaxExt::HangUp
       
   319 // Hangup fax call.
       
   320 // Returns:None
       
   321 // ---------------------------------------------------------------------------
       
   322 //
       
   323 void CMmFaxExt::HangUp()
       
   324     {
       
   325 TFLOGSTRING("TSY: CMmFaxExt::HangUp");
       
   326     CleanUpFaxServer();
       
   327     }
       
   328 
       
   329 // ---------------------------------------------------------------------------
       
   330 // CMmFaxExt::FaxSession
       
   331 // Returns Fax session pointer.
       
   332 // Returns:Pointer to Fax session 
       
   333 // ---------------------------------------------------------------------------
       
   334 //
       
   335 CFaxSession* CMmFaxExt::GetFaxSession()
       
   336     {
       
   337     return iFaxSession;
       
   338     }
       
   339 
       
   340 // ---------------------------------------------------------------------------
       
   341 // CMmFaxExt::GetFaxBaseL
       
   342 // Loads fax server.
       
   343 // Returns:None 
       
   344 // ---------------------------------------------------------------------------
       
   345 //
       
   346 void CMmFaxExt::GetFaxBaseL()
       
   347     {
       
   348 TFLOGSTRING("TSY: CMmFaxExt::GetFaxBaseL");
       
   349 
       
   350     TInt errorCode = iFaxServerLib.Load( KFaxServerName );
       
   351 
       
   352     if ( KErrNone == errorCode )
       
   353         {
       
   354 #if defined (_UNICODE)
       
   355             if( iFaxServerLib.Type()[1] != TUid::Uid( 
       
   356                   KUidUnicodeDynamicFaxServer ) )
       
   357                 {
       
   358                 errorCode = KErrBadLibraryEntryPoint;
       
   359                 }
       
   360 #else
       
   361             if( iFaxServerLib.Type()[1] != TUid::Uid( KUidDynamicFaxServer ) )
       
   362                 {
       
   363                 errorCode = KErrBadLibraryEntryPoint;
       
   364                 }
       
   365 #endif
       
   366         
       
   367         if ( KErrNone == errorCode )
       
   368             {   
       
   369             TFaxServerEntry libEntry = reinterpret_cast<TFaxServerEntry>(
       
   370                 iFaxServerLib.Lookup( 1 ) );
       
   371             if ( libEntry != NULL )
       
   372                 {
       
   373                 // call CFaxSession::NewL(). LibEntry may leave.
       
   374                 TRAP( errorCode, iFaxSession = (*libEntry)(); );  
       
   375                 if ( KErrNone == errorCode )
       
   376                     {
       
   377                     // fax server session has been created,
       
   378                     // Now set completion callback, it's methods called by
       
   379                     // fax server when something significant happens
       
   380                     iFaxSession->SetCallBack( iFaxCompletion );
       
   381                     }
       
   382                 else
       
   383                     {
       
   384                     // failed to create fax server session
       
   385                     iFaxServerLib.Close();
       
   386                     }
       
   387                 }
       
   388             else
       
   389                 {
       
   390                 // entry point was not found
       
   391                 errorCode = KErrBadLibraryEntryPoint;
       
   392                 iFaxServerLib.Close();
       
   393                 }
       
   394             }
       
   395         else
       
   396           {
       
   397             // Uid type test failed
       
   398             iFaxServerLib.Close();
       
   399           }
       
   400         }
       
   401     User::LeaveIfError( errorCode );
       
   402     }
       
   403 
       
   404 // ---------------------------------------------------------------------------
       
   405 // CMmFaxExt::OpenFaxServer
       
   406 // Open CFaxSession object with desired settings.
       
   407 // Returns: Error Code 
       
   408 // ---------------------------------------------------------------------------
       
   409 //
       
   410 TInt CMmFaxExt::OpenFaxServer(
       
   411         const TDesC* aTelNumber,  // phone number
       
   412         const TFaxMode aFaxMode ) // fax mode
       
   413     {
       
   414 TFLOGSTRING("TSY: CMmFaxExt::OpenFaxServer");
       
   415 
       
   416     TInt errorCode ( KErrNone );
       
   417     TFaxServerSessionSettings faxSettings;
       
   418     if ( aTelNumber )
       
   419         {
       
   420         faxSettings.iPhoneNumber.Copy( *aTelNumber );
       
   421         }
       
   422     else
       
   423         {
       
   424         faxSettings.iPhoneNumber.Zero();
       
   425         }
       
   426 
       
   427     // Dataport names
       
   428     _LIT( KDataPortPort, "DATAPORT::0" );
       
   429     _LIT( KDataPortName, "DATAPORT");
       
   430 
       
   431     faxSettings.iLogging          = ETrue;
       
   432     faxSettings.iMode             = aFaxMode;
       
   433     faxSettings.iFaxClass         = iFaxSettings.iFaxClass;
       
   434     faxSettings.iPortDriverName   = KDataPortName;
       
   435     faxSettings.iCommPortName     = KDataPortPort;
       
   436     faxSettings.iFaxId            = iFaxSettings.iFaxId;
       
   437     faxSettings.iMaxSpeed         = iFaxSettings.iMaxSpeed;
       
   438     faxSettings.iMinSpeed         = iFaxSettings.iMinSpeed;
       
   439     faxSettings.iPreferredECM     = iFaxSettings.iPreferredECM;
       
   440     faxSettings.iFaxOnDemandDelay = iFaxSettings.iFaxOnDemandDelay;
       
   441     faxSettings.iTxResolution     = iFaxSettings.iTxResolution;
       
   442     faxSettings.iTxCompression    = iFaxSettings.iTxCompression;
       
   443     faxSettings.iTxPages          = iFaxSettings.iTxPages;
       
   444     faxSettings.iRxResolution     = iFaxSettings.iRxResolution;
       
   445     faxSettings.iRxCompression    = iFaxSettings.iRxCompression;
       
   446     RFax::TProgress* faxProgress  = iMmCall->CreateFaxProgressChunk();
       
   447 
       
   448     if ( NULL == faxProgress )
       
   449         {
       
   450         errorCode = KErrEtelFaxChunkNotCreated;
       
   451         }
       
   452     else
       
   453         {
       
   454         // allocate dataport for fax...
       
   455         RCall::TCommPort commPort;
       
   456         commPort.iCsy.Copy( KDataPortName );
       
   457         commPort.iPort.Copy( KDataPortPort );
       
   458 
       
   459         //Create package
       
   460         CCallDataPackage package;
       
   461         //Set call id and call mode
       
   462         package.SetCallIdAndMode(
       
   463             iMmCall->CallId(), RMobilePhone::ECircuitDataService );
       
   464         //Pack commport
       
   465         package.PackData( &commPort );
       
   466 
       
   467         //Send request to the Domestic OS layer.
       
   468         TInt trapError( KErrNone );
       
   469         TRAP( trapError,
       
   470             errorCode = iMmCall->Phone()->MessageManager()->
       
   471                 HandleRequestL( EEtelCallLoanDataPort, &package );
       
   472             );
       
   473 
       
   474         if ( KErrNone != trapError )
       
   475             {
       
   476             //error handling, leaved.
       
   477             errorCode = trapError;
       
   478             }
       
   479 
       
   480         // if dataport is allocated, open fax server
       
   481         if (errorCode == KErrNone)
       
   482             {
       
   483             errorCode = iFaxSession->FxOpen( faxSettings, faxProgress );
       
   484 
       
   485             if (errorCode != KErrNone)
       
   486                 {
       
   487                 // error, free dataport
       
   488                 //Send request to the Domestic OS layer.
       
   489                 trapError = KErrNone;
       
   490                 TRAP( trapError,
       
   491                     errorCode = iMmCall->Phone()->MessageManager()->
       
   492                         HandleRequestL( EEtelCallRecoverDataPort, &package );
       
   493                     );
       
   494 
       
   495                 if ( KErrNone != trapError )
       
   496                     {
       
   497                     //error handling, leaved.
       
   498                     errorCode = trapError;
       
   499                     }
       
   500                 }
       
   501             else
       
   502                 {
       
   503                 iDataPortLoaned = ETrue;
       
   504                 }
       
   505             }
       
   506         }
       
   507     
       
   508     return errorCode;
       
   509     }
       
   510 
       
   511 // ---------------------------------------------------------------------------
       
   512 // CMmFaxExt::CleanUpFaxServer
       
   513 // Closes Fax Server, deletes fax progress chunk and closes Fax Server library
       
   514 // Returns: None 
       
   515 // ---------------------------------------------------------------------------
       
   516 //
       
   517 void CMmFaxExt::CleanUpFaxServer()
       
   518     {
       
   519 TFLOGSTRING("TSY: CMmFaxExt::CleanUpFaxServer");
       
   520 
       
   521     if ( iFaxSession )
       
   522         {
       
   523         iFaxSession->FxClose();
       
   524         iMmCall->DeleteFaxProgressChunk();
       
   525         iFaxServerLib.Close();
       
   526 
       
   527         if ( iDataPortLoaned )
       
   528             {
       
   529             // free dataport
       
   530             _LIT( KDataPortPort, "DATAPORT::0" );
       
   531             _LIT( KDataPortName, "DATAPORT");
       
   532 
       
   533             RCall::TCommPort commPort;
       
   534             commPort.iCsy.Copy( KDataPortName );
       
   535             commPort.iPort.Copy( KDataPortPort );
       
   536 
       
   537             //Create package
       
   538             CCallDataPackage package;
       
   539             //Set call id and call mode
       
   540             package.SetCallIdAndMode(
       
   541                 iMmCall->CallId(), RMobilePhone::ECircuitDataService );
       
   542             //Pack commport
       
   543             package.PackData( &commPort );
       
   544 
       
   545             //Send request to the Domestic OS layer.
       
   546             TRAPD( trapError,
       
   547                 iMmCall->Phone()->MessageManager()->
       
   548                     HandleRequestL( EEtelCallRecoverDataPort, &package );
       
   549                 );
       
   550             }
       
   551 
       
   552         iFaxSession = NULL;
       
   553         }
       
   554     }
       
   555     
       
   556 // ---------------------------------------------------------------------------
       
   557 // CMmFaxExt::GetFaxSettings
       
   558 // Get fax settings from CMmFaxExt class object's member variable.
       
   559 // Returns: Error Value 
       
   560 // ---------------------------------------------------------------------------
       
   561 //
       
   562  TInt CMmFaxExt::GetFaxSettings(
       
   563         RCall::TFaxSessionSettings* aSettings ) 
       
   564     {
       
   565 TFLOGSTRING("TSY: CMmFaxExt::GetFaxSettings");
       
   566     *aSettings = iFaxSettings;
       
   567     return KErrNone;
       
   568     }
       
   569 
       
   570 // ---------------------------------------------------------------------------
       
   571 // CMmFaxExt::SetFaxSettings
       
   572 // Set fax settings to CMmFaxExt class object's member variable.
       
   573 // Returns: Error Value 
       
   574 // ---------------------------------------------------------------------------
       
   575 //
       
   576  TInt CMmFaxExt::SetFaxSettings(
       
   577         const RCall::TFaxSessionSettings* aSettings ) // in: fax settings.
       
   578     {
       
   579 TFLOGSTRING("TSY: CMmFaxExt::SetFaxSettings");
       
   580         iFaxSettings = *aSettings;
       
   581         return KErrNone;
       
   582     }
       
   583 
       
   584 // ---------------------------------------------------------------------------
       
   585 // CMmFaxExt::GetCallStatus
       
   586 // Returns call status from CMmCallTsy object.
       
   587 // Returns: Call status 
       
   588 // ---------------------------------------------------------------------------
       
   589 //
       
   590 RCall::TStatus CMmFaxExt::GetCallStatus() const
       
   591     {
       
   592     return iMmCall->Status();
       
   593     }
       
   594 
       
   595 // ---------------------------------------------------------------------------
       
   596 // CMmFaxExt::GetCallStatus
       
   597 // Sets terminate flag true on CMmTsyFax object.
       
   598 // Returns:  None 
       
   599 // ---------------------------------------------------------------------------
       
   600 //
       
   601 void CMmFaxExt::DialCancel()
       
   602     {
       
   603     TFLOGSTRING("TSY: CMmFaxExt::DialCancel");
       
   604     if ( iFax ) 
       
   605         {
       
   606         iFax->Terminate();
       
   607         }
       
   608     }
       
   609 
       
   610 // ========================== OTHER EXPORTED FUNCTIONS =======================
       
   611 
       
   612 //  End of File