utilities/serviceipcserver/platform/s60/serviceipcserversymbianserver.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
/**
hgs
parents:
diff changeset
     2
   This file is part of CWRT package **
hgs
parents:
diff changeset
     3
hgs
parents:
diff changeset
     4
   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). **
hgs
parents:
diff changeset
     5
hgs
parents:
diff changeset
     6
   This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     7
   it under the terms of the GNU (Lesser) General Public License as
hgs
parents:
diff changeset
     8
   published by the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     9
   This program is distributed in the hope that it will be useful, but
hgs
parents:
diff changeset
    10
   WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
hgs
parents:
diff changeset
    12
   (Lesser) General Public License for more details. You should have
hgs
parents:
diff changeset
    13
   received a copy of the GNU (Lesser) General Public License along
hgs
parents:
diff changeset
    14
   with this program. If not, see <http://www.gnu.org/licenses/>.
hgs
parents:
diff changeset
    15
*/
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "serviceipcserversymbianserver_p.h"
hgs
parents:
diff changeset
    19
#include "serviceipcserversymbiansession.h"
hgs
parents:
diff changeset
    20
#include <clientinfo.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
namespace WRT
hgs
parents:
diff changeset
    23
{
hgs
parents:
diff changeset
    24
// Server Security Policy
hgs
parents:
diff changeset
    25
const TUint KServerRangeCount = 2;
hgs
parents:
diff changeset
    26
const TInt KServerRanges[KServerRangeCount] = { 
hgs
parents:
diff changeset
    27
                0, //range is [0-1)
hgs
parents:
diff changeset
    28
                2 //range is [2-KMaxTInt] 
hgs
parents:
diff changeset
    29
                };
hgs
parents:
diff changeset
    30
const TUint8 KSeverElementsIndex[KServerRangeCount] = { 
hgs
parents:
diff changeset
    31
                0,
hgs
parents:
diff changeset
    32
                CPolicyServer::ENotSupported };
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
const CPolicyServer::TPolicyElement KServerPolicyElements[] = { {
hgs
parents:
diff changeset
    35
                _INIT_SECURITY_POLICY_C1(ECapabilityWriteDeviceData),
hgs
parents:
diff changeset
    36
                CPolicyServer::EFailClient } };
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
const CPolicyServer::TPolicy KServerPolicy = {
hgs
parents:
diff changeset
    39
                CPolicyServer::EAlwaysPass, //specifies all connect attempts should pass
hgs
parents:
diff changeset
    40
                KServerRangeCount, KServerRanges, KSeverElementsIndex,
hgs
parents:
diff changeset
    41
                KServerPolicyElements };
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
enum
hgs
parents:
diff changeset
    44
{
hgs
parents:
diff changeset
    45
    EServerPriority = CActive::EPriorityStandard
hgs
parents:
diff changeset
    46
};
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
/*!
hgs
parents:
diff changeset
    51
 \class CServiceSymbianServer
hgs
parents:
diff changeset
    52
 Symbian client server implementation
hgs
parents:
diff changeset
    53
 */
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
/*!
hgs
parents:
diff changeset
    56
 Constructor
hgs
parents:
diff changeset
    57
 */
hgs
parents:
diff changeset
    58
CServiceSymbianServer::CServiceSymbianServer() :
hgs
parents:
diff changeset
    59
    CPolicyServer(EServerPriority, KServerPolicy), m_keepServer(false)
hgs
parents:
diff changeset
    60
{
hgs
parents:
diff changeset
    61
    m_sessionIdTable = new SessionIdTable();
hgs
parents:
diff changeset
    62
}
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
/*!
hgs
parents:
diff changeset
    65
 2nd phased constructor
hgs
parents:
diff changeset
    66
 */
hgs
parents:
diff changeset
    67
void CServiceSymbianServer::ConstructL()
hgs
parents:
diff changeset
    68
{
hgs
parents:
diff changeset
    69
}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
/*!
hgs
parents:
diff changeset
    72
 Two phased constructor
hgs
parents:
diff changeset
    73
 */
hgs
parents:
diff changeset
    74
CServiceSymbianServer* CServiceSymbianServer::NewL()
hgs
parents:
diff changeset
    75
{
hgs
parents:
diff changeset
    76
    CServiceSymbianServer* self = new (ELeave) CServiceSymbianServer;
hgs
parents:
diff changeset
    77
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    78
    self->ConstructL();
hgs
parents:
diff changeset
    79
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
    80
    return self;
hgs
parents:
diff changeset
    81
}
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
/*!
hgs
parents:
diff changeset
    84
 Destructor
hgs
parents:
diff changeset
    85
 */
hgs
parents:
diff changeset
    86
CServiceSymbianServer::~CServiceSymbianServer()
hgs
parents:
diff changeset
    87
{
hgs
parents:
diff changeset
    88
    delete m_sessionIdTable;
hgs
parents:
diff changeset
    89
}
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
/*!
hgs
parents:
diff changeset
    93
 A new session is being created \n
hgs
parents:
diff changeset
    94
 Cancel the shutdown timer if it was running
hgs
parents:
diff changeset
    95
*/
hgs
parents:
diff changeset
    96
void CServiceSymbianServer::addSession()
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
{
hgs
parents:
diff changeset
    99
    ++m_sessionCount;
hgs
parents:
diff changeset
   100
    stopExitTimer();
hgs
parents:
diff changeset
   101
}
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
/*!
hgs
parents:
diff changeset
   104
 A session is being destroyed \n
hgs
parents:
diff changeset
   105
 Start the shutdown timer if it is the last session.
hgs
parents:
diff changeset
   106
*/
hgs
parents:
diff changeset
   107
void CServiceSymbianServer::closeSession()
hgs
parents:
diff changeset
   108
{
hgs
parents:
diff changeset
   109
    if ((--m_sessionCount==0) && (!m_keepServer))
hgs
parents:
diff changeset
   110
    {
hgs
parents:
diff changeset
   111
        startExitTimer();
hgs
parents:
diff changeset
   112
    }
hgs
parents:
diff changeset
   113
}
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
/*!
hgs
parents:
diff changeset
   116
 Start listening for new service requests
hgs
parents:
diff changeset
   117
 @param aServerName name of the server
hgs
parents:
diff changeset
   118
 */
hgs
parents:
diff changeset
   119
bool CServiceSymbianServer::listen(const QString& aServerName)
hgs
parents:
diff changeset
   120
{
hgs
parents:
diff changeset
   121
    bool listening(true);
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
    // Needs to be here because Q_Ptr isonly set after constructor of public
hgs
parents:
diff changeset
   124
    m_observer = Observer();
hgs
parents:
diff changeset
   125
    TPtrC serverName(reinterpret_cast<const TUint16*> (aServerName.utf16()));
hgs
parents:
diff changeset
   126
    TRAPD( err, StartL(serverName) );
hgs
parents:
diff changeset
   127
    if (err != KErrNone) {
hgs
parents:
diff changeset
   128
        listening = false;
hgs
parents:
diff changeset
   129
    }
hgs
parents:
diff changeset
   130
    // Complete the server rendezvous that th client started
hgs
parents:
diff changeset
   131
    RProcess::Rendezvous(KErrNone);
hgs
parents:
diff changeset
   132
    return listening;
hgs
parents:
diff changeset
   133
}
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
/*!
hgs
parents:
diff changeset
   136
 Shutdown the server and stop serving clients 
hgs
parents:
diff changeset
   137
 */
hgs
parents:
diff changeset
   138
void CServiceSymbianServer::disconnect()
hgs
parents:
diff changeset
   139
{
hgs
parents:
diff changeset
   140
    // Symbian Servers do not have disconnect, 
hgs
parents:
diff changeset
   141
    // the process has to exit
hgs
parents:
diff changeset
   142
}
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
/*!
hgs
parents:
diff changeset
   145
 A session is being destroyed \n
hgs
parents:
diff changeset
   146
 Start the shutdown timer if it is the last session and aKeepServer is trues.
hgs
parents:
diff changeset
   147
 @param aKeepLife to keep or disconnect IPC server when all clients are shutdown. 
hgs
parents:
diff changeset
   148
*/
hgs
parents:
diff changeset
   149
void CServiceSymbianServer::configIpcServerLifetime(bool aKeepServer)
hgs
parents:
diff changeset
   150
{
hgs
parents:
diff changeset
   151
    if ((m_keepServer) && (m_sessionCount==0) && (!aKeepServer))
hgs
parents:
diff changeset
   152
    {
hgs
parents:
diff changeset
   153
        startExitTimer();
hgs
parents:
diff changeset
   154
    }
hgs
parents:
diff changeset
   155
    m_keepServer = aKeepServer;
hgs
parents:
diff changeset
   156
}
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
/*!
hgs
parents:
diff changeset
   159
 Create a new session, derived from CPolicyServer
hgs
parents:
diff changeset
   160
 @param aVersion version of the server
hgs
parents:
diff changeset
   161
 @param aMessage message object
hgs
parents:
diff changeset
   162
 */
hgs
parents:
diff changeset
   163
CSession2* CServiceSymbianServer::NewSessionL(const TVersion& aVersion,
hgs
parents:
diff changeset
   164
                                              const RMessage2& aMessage) const
hgs
parents:
diff changeset
   165
{
hgs
parents:
diff changeset
   166
    TVersion v(1, 0, 0);
hgs
parents:
diff changeset
   167
    if (!User::QueryVersionSupported(v, aVersion)) {
hgs
parents:
diff changeset
   168
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   169
    }
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
    ClientInfo *client = new ClientInfo();
hgs
parents:
diff changeset
   172
    TSecureId sid(aMessage.Identity());
hgs
parents:
diff changeset
   173
    client->setProcessId(sid.iId);
hgs
parents:
diff changeset
   174
    client->setVendorId(aMessage.VendorId().iId);
hgs
parents:
diff changeset
   175
    RThread clientThread;
hgs
parents:
diff changeset
   176
    aMessage.ClientL(clientThread);
hgs
parents:
diff changeset
   177
    RProcess clientProc;
hgs
parents:
diff changeset
   178
    clientThread.Process(clientProc);
hgs
parents:
diff changeset
   179
    client->setName(QString::fromUtf16(clientProc.Name().Ptr(), 
hgs
parents:
diff changeset
   180
                                       clientProc.Name().Length()));
hgs
parents:
diff changeset
   181
    client->setSessionId(m_sessionIdTable->allocate());
hgs
parents:
diff changeset
   182
    // Create a new Symbian Session for the client
hgs
parents:
diff changeset
   183
    CServiceSymbianSession * session = CServiceSymbianSession::NewL(m_observer);
hgs
parents:
diff changeset
   184
    session->setClientInfo(client);
hgs
parents:
diff changeset
   185
    return session;
hgs
parents:
diff changeset
   186
}
hgs
parents:
diff changeset
   187
}
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
// END OF FILE