examples/ForumNokia/BluetoothPMPExample/src/ServiceAdvertiser.cpp

00001 /*
00002  * Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
00003  *    
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions are met:
00006  *    
00007  *  * Redistributions of source code must retain the above copyright notice, this
00008  *    list of conditions and the following disclaimer.
00009  *  * Redistributions in binary form must reproduce the above copyright notice,
00010  *    this list of conditions and the following disclaimer in the documentation
00011  *    and/or other materials provided with the distribution.
00012  *  * Neither the name of Nokia Corporation nor the names of its contributors
00013  *    may be used to endorse or promote products derived from this software
00014  *    without specific prior written permission.
00015  *    
00016  *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00017  *    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00018  *    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00019  *    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00020  *    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00021  *    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00022  *    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00023  *    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00024  *    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00025  *    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00026  *    
00027  *    Description:  
00028  */
00029 
00030 // INCLUDE FILES
00031 #include <btmanclient.h>
00032 #include "ServiceAdvertiser.h"
00033 
00034 // see https://www.bluetooth.org/foundry/assignnumb/document/service_discovery
00035 
00036 // service name and description for our service
00037 _LIT(KBTServiceName, "BTpmp");
00038 _LIT(KBTServiceDesc, "BTpmp");
00039 
00040 CServiceAdvertiser* CServiceAdvertiser::NewL()
00041     {
00042     CServiceAdvertiser* self = CServiceAdvertiser::NewLC();
00043     CleanupStack::Pop(self);
00044     return self;
00045     }
00046 
00047 
00048 CServiceAdvertiser* CServiceAdvertiser::NewLC()
00049     {
00050     CServiceAdvertiser* self = new (ELeave) CServiceAdvertiser();
00051     CleanupStack::PushL(self);
00052     self->ConstructL();
00053     return self;
00054     }
00055 
00056 
00057 void CServiceAdvertiser::ConstructL()
00058     {
00059     }
00060 
00061 
00062 // ----------------------------------------------------------------------------
00063 // CServiceAdvertiser::CServiceAdvertiser()
00064 //
00065 // constructor
00066 // ----------------------------------------------------------------------------
00067 CServiceAdvertiser::CServiceAdvertiser()
00068     {
00069     }
00070 
00071 
00072 // ----------------------------------------------------------------------------
00073 // CServiceAdvertiser::~CServiceAdvertiser()
00074 //
00075 // destructor
00076 // ----------------------------------------------------------------------------
00077 CServiceAdvertiser::~CServiceAdvertiser()
00078     {
00079     TRAPD(err, StopAdvertiserL());
00080     }
00081 
00082 
00083 
00084 // ----------------------------------------------------------------------------
00085 // CServiceAdvertiser::StartAdvertiserL(TInt aChannel)
00086 //
00087 // start service advertiser on given channel.  an entry to service discovery
00088 // database will be entered describing our advertised service.
00089 // ----------------------------------------------------------------------------
00090 void CServiceAdvertiser::StartAdvertiserL(TInt aChannel)
00091     {
00092     // open sdp session
00093     User::LeaveIfError(iSdp.Connect());
00094     // open sdp database session
00095     User::LeaveIfError(iSdpDB.Open(iSdp));
00096     // create a record of the correct service class
00097     TUUID serviceUUID(KBT_serviceID);
00098     iSdpDB.CreateServiceRecordL(serviceUUID, iRecord);
00099 
00100     // add a protocol to the record
00101     CSdpAttrValueDES* protocolDescriptorList = CSdpAttrValueDES::NewDESL(NULL);
00102     CleanupStack::PushL(protocolDescriptorList);
00103 
00104     TBuf8<1> channel;
00105     channel.Append((TChar)aChannel);
00106     // create protocol list for our service
00107     protocolDescriptorList
00108     ->StartListL()   //  list of protocols required for this method
00109         ->BuildDESL()
00110         ->StartListL()
00111             ->BuildUUIDL(KL2CAP)
00112         ->EndListL()
00113 
00114         ->BuildDESL()
00115         ->StartListL()
00116             ->BuildUUIDL(KRFCOMM)
00117             ->BuildUintL(channel)
00118         ->EndListL()
00119     ->EndListL();
00120 
00121     // set protocol list to the record
00122     iSdpDB.UpdateAttributeL(iRecord, KSdpAttrIdProtocolDescriptorList,
00123         *protocolDescriptorList);
00124     CleanupStack::PopAndDestroy(protocolDescriptorList);
00125 
00126     // add a name to the record
00127     iSdpDB.UpdateAttributeL(iRecord,
00128                                 KSdpAttrIdBasePrimaryLanguage +
00129                                     KSdpAttrIdOffsetServiceName,
00130                                 KBTServiceName);
00131 
00132     // add a description to the record
00133     iSdpDB.UpdateAttributeL(iRecord,
00134                                 KSdpAttrIdBasePrimaryLanguage +
00135                                     KSdpAttrIdOffsetServiceDescription,
00136                                 KBTServiceDesc);
00137 
00138     // set service available
00139     UpdateAvailabilityL(ETrue);
00140     }
00141 
00142 
00143 // ----------------------------------------------------------------------------
00144 // CServiceAdvertiser::StopAdvertiserL()
00145 //
00146 // stop service advertiser.  delete service record from service discovery
00147 // database to stop advertising.
00148 // ----------------------------------------------------------------------------
00149 void CServiceAdvertiser::StopAdvertiserL()
00150     {
00151     if ( iRecord!=0 )
00152         {
00153         // delete out record from service discovery database
00154         iSdpDB.DeleteRecordL(iRecord);
00155         // close sdp and sdp db sessions
00156         iSdpDB.Close();
00157         iSdp.Close();
00158         iRecord=0;
00159         }
00160     }
00161 
00162 
00163 // ----------------------------------------------------------------------------
00164 // CServiceAdvertiser::UpdateAvailability(TBool aAvailable)
00165 //
00166 // set availability of our advertised service.  the service record on the
00167 // service discovery database will be updated accordingly.
00168 // ----------------------------------------------------------------------------
00169 void CServiceAdvertiser::UpdateAvailabilityL(TBool aAvailable)
00170     {
00171     TInt state = aAvailable ? 0xFF : 0x00;
00172     // set availability
00173     iSdpDB.UpdateAttributeL(iRecord, KSdpAttrIdServiceAvailability, state);
00174     // mark record changed
00175     iSdpDB.UpdateAttributeL(iRecord, KSdpAttrIdServiceRecordState,
00176         ++iRecordState);
00177     }
00178 

Generated by  doxygen 1.6.2