/* -*- 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 * * 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 #include "tubes/tubesdllapi.h" #include "tubes/packet.hxx" #include "tubes/file-transfer-helper.h" #include #include #include #include #include typedef ::std::queue TelePacketQueue; class TeleManager; /** Conference setup by TeleManager */ class TeleConference : public boost::enable_shared_from_this { 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 mpTube != NULL; } // Only for callbacks. void setTubeOfferedHandlerInvoked( bool b ) { mbTubeOfferedHandlerInvoked = b; } bool isTubeOfferedHandlerInvoked() const { return mbTubeOfferedHandlerInvoked; } static void TubeOfferedHandler(GObject* pSource, GAsyncResult* pResult, gpointer pUserData); static void TubeAcceptedHandler(GObject* pSource, GAsyncResult* pResult, gpointer pUserData); 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 spinUntilTubeEstablished(); bool setTube( GDBusConnection* pTube); rtl::OString maSessionId; TeleManager* mpManager; TpAccount* mpAccount; TpDBusTubeChannel* mpChannel; gchar* mpAddress; GDBusConnection* mpTube; guint maObjectRegistrationId; TelePacketQueue maPacketQueue; bool mbTubeOfferedHandlerInvoked : 1; // hide from the public using boost::enable_shared_from_this::shared_from_this; }; typedef boost::shared_ptr TeleConferencePtr; #endif // INCLUDED_TUBES_CONFERENCE_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */