--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pimprotocols/pbap/client/pbapcli.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,217 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Bluetooth Phone Book Access Profile (PBAP) client side API implementation. This file
+// implements the methods used to start and stop the PBAP server listening for
+// phone book client equipment (PCE) requests.
+//
+//
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+#include "pbapcli.h"
+#include "clientserver.h"
+
+
+/**
+ Start the server process which lives in its own executable and rendezvous with it.
+
+ @return KErrNone if successful, or an error code if not.
+ */
+static TInt StartServer()
+ {
+ const TUidType serverUid(KNullUid, KNullUid, KPbapServerUid);
+
+ RProcess server;
+ TInt r=server.Create(KPbapServerImg,KNullDesC,serverUid);
+
+ if (r==KErrNone)
+ {
+ TRequestStatus stat;
+ server.Rendezvous(stat);
+ if (stat!=KRequestPending)
+ {
+ server.Kill(0); // abort startup
+ }
+ else
+ {
+ server.Resume(); // logon OK - start the server
+ }
+ User::WaitForRequest(stat); // wait for start or death
+
+ // we can't use the 'exit reason' if the server panicked as this
+ // is the panic 'reason' and may be '0' which cannot be distinguished
+ // from KErrNone
+ r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int();
+ server.Close();
+ }
+ return r;
+ }
+
+
+/**
+ Standard constructor.
+ */
+EXPORT_C RPbapSession::RPbapSession()
+ {
+ }
+
+
+/**
+ Connects the client to the Bluetooth PBAP Server.
+
+ This must be used before any of the other methods listed in this API
+ section. The first client to call this method will cause the initiation of
+ the PBAP server within its own executable process. The PBAP Server will
+ only allow at most one session to be connected at any one time and any
+ subsequent attempts to Connect() to the server will result in KErrInUse
+ being returned.
+
+ Once a connection to the server has completed successfully Start() must be
+ called to allow PCE requests.
+
+ @return KErrNone if successful, a system-wide error code if not.
+ @capability None
+ */
+EXPORT_C TInt RPbapSession::Connect()
+ {
+ TInt err = CreateSession(KPbapServerName, Version());
+
+ // we will get an error if the server has not been started yet so check
+ if ((err == KErrNotFound) || (err == KErrServerTerminated))
+ {
+ err = StartServer();
+ if ((err == KErrNone) || (err == KErrAlreadyExists))
+ {
+ // attempt to create the session again
+ err = CreateSession(KPbapServerName, Version());
+ }
+ }
+
+ return err;
+ }
+
+
+/**
+ Get the PBAP server version.
+ */
+TVersion RPbapSession::Version() const
+ {
+ return TVersion(KPbapServerMajorVersionNumber,
+ KPbapServerMinorVersionNumber,
+ KPbapServerBuildVersionNumber);
+ }
+
+
+/**
+ Start listening for PCE requests (via Obex over Bluetooth) in the PBAP server.
+ If this request is successful sessions with a PCE can be established
+
+ @return KErrNone if successful, or an error code if not.
+
+ @capability LocalServices
+ @capability ReadUserData
+ */
+EXPORT_C TInt RPbapSession::Start()
+ {
+ return SendReceive(EPbapStartListening);
+ }
+
+
+/**
+ Stop listening for PCE requests to the PBAP server.
+ Once this function is called all PCE requests will fail until the next
+ successful Start() call. Calling this function during a request
+ will result in an Obex disconnect being reported to the client.
+
+ @capability LocalServices
+ @capability ReadUserData
+ */
+EXPORT_C void RPbapSession::Stop()
+ {
+ SendReceive(EPbapStopListening);
+ }
+
+
+/**
+ Sets the password required to access the PBAP server, this can be done
+ before or after a call to RPbapSession::Start.
+ When a password is set, a PCE must specify it to access the server. To
+ remove the need for the password, the PBAP server must be stopped and
+ re-started.
+
+ @return KErrNone if successful, or an error code if not.
+
+ @capability LocalServices
+ @capability ReadUserData
+ */
+EXPORT_C TInt RPbapSession::SetPassword(const TDesC& aPassword)
+ {
+ TIpcArgs args(&aPassword);
+ return SendReceive(EPbapSetPassword, args);
+ }
+
+
+/**
+ Set a heap mark in the PBAP server thread.
+
+ @capability None
+ */
+EXPORT_C TInt RPbapSession::__DbgMarkHeap()
+ {
+ return DEBUG_SEND_RECIEVE(EPbapDbgMarkHeap, TIpcArgs(TIpcArgs::ENothing));
+ }
+
+
+/**
+ Performs a heap mark check in the PBAP Server thread.
+
+ @param aCount The number of heap cells expected to be allocated at
+ the current nest level.
+ @capability None
+ */
+EXPORT_C TInt RPbapSession::__DbgCheckHeap(TInt aCount)
+ {
+ TIpcArgs args(aCount);
+ return DEBUG_SEND_RECIEVE(EPbapDbgCheckHeap, args);
+ }
+
+
+/**
+ Perfom a heap mark end check in the PBAP server thread.
+
+ @param aCount The number of heap cells expected to remain allocated
+ at the current nest level.
+ @capability None
+ */
+EXPORT_C TInt RPbapSession::__DbgMarkEnd(TInt aCount)
+ {
+ TIpcArgs args(aCount);
+ return DEBUG_SEND_RECIEVE(EPbapDbgMarkEnd, args);
+ }
+
+
+/**
+ Set a heap fail next condition in the PBAP server thread.
+
+ @param aCount Determines when the allocation will fail.
+ @capability None
+ */
+EXPORT_C TInt RPbapSession::__DbgFailNext(TInt aCount)
+ {
+ TIpcArgs args(aCount);
+ return DEBUG_SEND_RECIEVE(EPbapDbgFailNext, args);
+ }