summaryrefslogtreecommitdiff
path: root/tubes/inc/tubes/conference.hxx
blob: fca6e2ed5278f89f72914a0242c0b5f6ddfea320 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * Version: MPL 1.1 / GPLv3+ / LGPLv3+
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License or as specified alternatively below. You may obtain a copy of
 * the License at http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * Major Contributor(s):
 * Copyright (C) 2012 Red Hat, Inc., Eike Rathke <erack@redhat.com>
 *
 * All Rights Reserved.
 *
 * For minor contributions see the git repository.
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
 * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
 * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
 * instead of those above.
 */

#ifndef INCLUDED_TUBES_CONFERENCE_HXX
#define INCLUDED_TUBES_CONFERENCE_HXX

#include <sal/config.h>
#include "tubes/tubesdllapi.h"
#include "tubes/packet.hxx"
#include "tubes/file-transfer-helper.h"
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <rtl/ustring.hxx>
#include <telepathy-glib/telepathy-glib.h>
#include <dbus/dbus-glib-lowlevel.h>
#include <queue>

typedef ::std::queue<TelePacket> TelePacketQueue;

class TeleManager;

/** Conference setup by TeleManager */
class TeleConference : public boost::enable_shared_from_this<TeleConference>
{
public:

    TeleConference( TeleManager* pManager, TpAccount *pAccount, TpDBusTubeChannel* pChannel, const rtl::OString& rSessionId );
    ~TeleConference();

    /// Close channel and call finalize()
    void                    close();

    /// Unrefs, unregisters from manager and calls dtor if last reference!
    void                    finalize();

    TeleManager*            getManager() const  { return mpManager; }

    /** @param rPacket
            non-const on purpose, see TelePacket::getData()
     */
    bool                    sendPacket( TelePacket& rPacket );

    /** Pop a received packet. */
    TUBES_DLLPUBLIC bool    popPacket( TelePacket& rPacket );

    /** Queue incoming data as TelePacket */
    void                    queue( const char* pDBusSender, const char* pPacket, int nSize );
    void                    queue( TelePacket &rPacket );


    typedef void          (*FileSentCallback)( bool aSuccess, void* pUserData);
    void                    sendFile( rtl::OUString &localUri, FileSentCallback pCallback, void* pUserData);

    // --- following only to be called only by manager's callbacks ---
    // TODO: make friends instead

    void                    setChannel( TpAccount* pAccount, TpDBusTubeChannel* pChannel );
    TpDBusTubeChannel*      getChannel() const  { return mpChannel; }
    bool                    offerTube();
    bool                    acceptTube();
    /// got tube accepted on other end as well?
    bool                    isTubeOpen() const { return meTubeChannelState == TP_TUBE_CHANNEL_STATE_OPEN; }

    // Only for callbacks.
    void                    setTubeOfferedHandlerInvoked( bool b ) { mbTubeOfferedHandlerInvoked = b; }
    bool                    isTubeOfferedHandlerInvoked() const { return mbTubeOfferedHandlerInvoked; }
    bool                    isTubeChannelStateChangedToOpen() const
                                { return meTubeChannelState == TP_TUBE_CHANNEL_STATE_OPEN; };
    void                    setTubeChannelState( TpTubeChannelState eState ) { meTubeChannelState = eState; }

    static void             TubeChannelStateChangedHandler(TpChannel*, guint, void*, GObject*);
    static void             TubeOfferedHandler(TpChannel* pChannel, const gchar* pAddress, const GError* pError,
                                               gpointer pUserData, GObject*pWeakObject);
    static void             TubeAcceptedHandler(TpChannel* pChannel, const gchar* pAddress, const GError* pError,
                                               gpointer pUserData, GObject*pWeakObject);
    static void             FTReady( EmpathyFTHandler *handler, GError *error, gpointer user_data);

    static void             methodCallHandler(GDBusConnection*       pConnection,
                                              const gchar*           pSender,
                                              const gchar*           pObjectPath,
                                              const gchar*           pInterfaceName,
                                              const gchar*           pMethodName,
                                              GVariant*              pParameters,
                                              GDBusMethodInvocation* pInvocation,
                                              void*                  pUserData);

private:
    bool                    tryToOpen();
    bool                    spinUntilTubeEstablished();
    bool                    setTube( const char* pTube );

    rtl::OString            maSessionId;
    TeleManager*            mpManager;
    TpAccount*              mpAccount;
    TpDBusTubeChannel*      mpChannel;
    gchar*                  mpAddress;
    GDBusConnection*        mpTube;
    guint                   maObjectRegistrationId;
    TelePacketQueue         maPacketQueue;
    TpTubeChannelState      meTubeChannelState;

    bool                    mbTubeOfferedHandlerInvoked : 1;

    // hide from the public
    using boost::enable_shared_from_this<TeleConference>::shared_from_this;

};


typedef boost::shared_ptr<TeleConference> TeleConferencePtr;

#endif // INCLUDED_TUBES_CONFERENCE_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */