qthighway/xqservice/src/xqserviceipcclient.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 13:18:40 +0300
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
permissions -rw-r--r--
Revision: 201015 Kit: 201018

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 2.1 of the License.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program.  If not, 
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
*
* Description:                                                         
*
*/

#ifndef XQSERVICECLIENT_H
#define XQSERVICECLIENT_H

#include <QtCore/qobject.h>

#include <xqserviceipcobserver.h>
#include <xqrequestinfo.h>

namespace QtService {
class MServiceIPCObserver;
class ServiceIPCRequest;
class ServiceFwIPCServer;
class ServiceFwIPC;
}
using namespace QtService;

#include <QtCore/qshareddata.h>
#include <QtCore/qregexp.h>

class QEventLoop;
class XQServiceChannel;
class XQServiceRequestCompletedAsync;
class XQServiceProvider;

#define	XQServiceCmd_Send		        	1
#define XQServiceCmd_ReturnValueDelivered   2

class XQServiceIpcClient : public QObject,
                           public MServiceIPCObserver
{
    Q_OBJECT
public:
    XQServiceIpcClient(const QString& ipcConName, bool isServer, 
                       bool isSync, XQServiceRequestCompletedAsync* rc,
                       const void *userData);
    ~XQServiceIpcClient();

    bool listen();
    bool connectToServer();

    bool sendChannelCommand(int cmd, const QString& ch);
    bool send(const QString& ch, const QString& msg, const QByteArray& data, QByteArray &retData,
              int cmd = XQServiceCmd_Send);
    bool cancelPendingSend(const QString& ch);
    
    bool isServer() const { return server; }

    int setCurrentRequest(ServiceIPCRequest* request);
    int setCurrentRequestAsync();
    bool completeRequest(int index, const QVariant& retValue);
    bool cancelRequest(ServiceIPCRequest* request);
    XQRequestInfo requestInfo() const;
    bool setRequestInfo(XQRequestInfo &info);
    
signals:

public slots:
    void disconnected();
    
private slots:
    // ServiceFwIPC error
    void clientError(int);
    void readyRead();
    void readDone();
    
private: // from MServiceIPCObserver
    bool handleRequest(ServiceIPCRequest *aRequest);
    void handleCancelRequest(ServiceIPCRequest* aRequest);
    void handleDeleteRequest(ServiceIPCRequest* aRequest);
    bool isEmbedded();
    
private:    
    void wait(int msec);
    ServiceIPCRequest *requestPtr(int index) const; 
    
private:
    bool server;
    bool synchronous;
    int retryCount;
    
    QEventLoop* sendSyncLoop;

    QString mIpcConName ;

    ServiceIPCRequest* cancelledRequest; 
    
    ServiceFwIPC* serviceIpc;
    ServiceFwIPCServer* serviceIpcServer;    
    
    static const int minPacketSize = 256;
    static const int retryToServerMax = 50;
    
    char outBuffer[minPacketSize];
    XQServiceRequestCompletedAsync* callBackRequestComplete;
    QObject* plugin;
    XQServiceProvider* localProvider;
	
	QByteArray iRetData;
    const void *mUserData;
    
    int lastId;
    QHash<int, ServiceIPCRequest*> requestsMap;
    
};

#endif