www.pudn.com > S60_Platform_Bluetooth_OBEX_Example.rar > btserviceadvertiser.cpp


/* Copyright (c) 2004, Nokia. All rights reserved */ 
 
 
// INCLUDE FILES 
#include  
#include  
#include  
 
#include "BTServiceSearcher.pan" 
#include "BTServiceAdvertiser.h" 
 
// ============================ MEMBER FUNCTIONS ============================== 
 
// ---------------------------------------------------------------------------- 
// CBTServiceAdvertiser::CBTServiceAdvertiser() 
// Constructor. 
// ---------------------------------------------------------------------------- 
// 
CBTServiceAdvertiser::CBTServiceAdvertiser() 
:   iRecord( 0 ),  
    iIsConnected( EFalse ) 
    { 
    // no implementation required 
    } 
 
// ---------------------------------------------------------------------------- 
// CBTServiceAdvertiser::~CBTServiceAdvertiser() 
// Destructor. 
// ---------------------------------------------------------------------------- 
// 
CBTServiceAdvertiser::~CBTServiceAdvertiser() 
    { 
    if ( IsAdvertising() ) 
        { 
        TRAPD( err,StopAdvertisingL() ); 
        if ( err != KErrNone ) 
            { 
            /** Panic Category */ 
            User::Panic( KPanicServiceAdvertiser, err ); 
            } 
        } 
 
    iSdpDatabase.Close(); 
    iSdpSession.Close(); 
    } 
 
// ---------------------------------------------------------------------------- 
// CBTServiceAdvertiser::ConnectL() 
// Connect to the SDP database. 
// ---------------------------------------------------------------------------- 
// 
void CBTServiceAdvertiser::ConnectL() 
    { 
    if ( !iIsConnected ) 
        { 
        User::LeaveIfError( iSdpSession.Connect() ); 
        User::LeaveIfError( iSdpDatabase.Open( iSdpSession ) ); 
        iIsConnected = ETrue; 
        } 
    } 
 
// ---------------------------------------------------------------------------- 
// CBTServiceAdvertiser::StartAdvertisingL() 
// Start the advertising of this service. 
// ---------------------------------------------------------------------------- 
// 
void CBTServiceAdvertiser::StartAdvertisingL( TInt aPort ) 
    { 
    if ( IsAdvertising() ) 
        { 
        // could be advertising on a different port 
        StopAdvertisingL();  
        } 
    if ( !iIsConnected ) 
        { 
        ConnectL(); 
        } 
    iSdpDatabase.CreateServiceRecordL( ServiceClass(), iRecord ); 
 
    // add a Protocol to the record 
    CSdpAttrValueDES* vProtocolDescriptor = CSdpAttrValueDES::NewDESL( NULL ); 
    CleanupStack::PushL( vProtocolDescriptor ); 
  
    BuildProtocolDescriptionL( vProtocolDescriptor,aPort ); 
 
    iSdpDatabase.UpdateAttributeL( iRecord, KSdpAttrIdProtocolDescriptorList, 
        *vProtocolDescriptor ); 
 
    CleanupStack::PopAndDestroy( vProtocolDescriptor ); 
 
    // Add a name to the record 
    iSdpDatabase.UpdateAttributeL( iRecord,  
                                  KSdpAttrIdBasePrimaryLanguage +  
                                  KSdpAttrIdOffsetServiceName,  
                                  ServiceName() ); 
 
    // Add a description to the record 
    iSdpDatabase.UpdateAttributeL( iRecord,  
                                  KSdpAttrIdBasePrimaryLanguage +  
                                  KSdpAttrIdOffsetServiceDescription,  
                                  ServiceDescription() ); 
    } 
 
// ---------------------------------------------------------------------------- 
// CBTServiceAdvertiser::UpdateAvailabilityL() 
// Update the service availability field of the service record. 
// ---------------------------------------------------------------------------- 
// 
void CBTServiceAdvertiser::UpdateAvailabilityL( TBool aIsAvailable ) 
    { 
    TUint state; 
    if ( aIsAvailable ) 
        { 
        state = 0xFF;  //  Fully unused 
        } 
    else 
        { 
        state = 0x00;  //  Fully used -> can't connect 
        } 
 
    //  Update the availibility attribute field 
    iSdpDatabase.UpdateAttributeL( iRecord,  
        KSdpAttrIdServiceAvailability, state ); 
 
    //  Mark the record as changed - by increasing its state number (version) 
    iSdpDatabase.UpdateAttributeL( iRecord,  
        KSdpAttrIdServiceRecordState, ++iRecordState ); 
    } 
 
// ---------------------------------------------------------------------------- 
// CBTServiceAdvertiser::StopAdvertisingL() 
// Stop advertising this service. Remove the record from the sdp database. 
// ---------------------------------------------------------------------------- 
// 
void CBTServiceAdvertiser::StopAdvertisingL() 
    { 
    if ( IsAdvertising() ) 
        { 
        iSdpDatabase.DeleteRecordL( iRecord ); 
        iRecord = 0; 
        } 
    } 
 
// ---------------------------------------------------------------------------- 
// CBTServiceAdvertiser::IsAdvertising() 
// Does the SDP database contain a record for this service. 
// ---------------------------------------------------------------------------- 
// 
TBool CBTServiceAdvertiser::IsAdvertising() 
    { 
    return iRecord != 0; 
    } 
 
// End of File