/* * Copyright (C) 2007-2010 Dmytro Bogovych * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __RELIABLE_TUNNEL_H #define __RELIABLE_TUNNEL_H #include "DataProvider.h" #include "InternetAddress.h" #include "rutil/ThreadIf.hxx" #include #include #include "../ICE/ICEReliableTransport.h" #ifdef USE_CRYPTOPP # include "../Libs/CryptoPP/blowfish.h" #endif #ifdef USE_OPENSSL # include "../Libs/openssl/include/openssl/blowfish.h" #endif class ReliableTunnel: public DataProvider, public resip::ThreadIf, public ICEImpl::ReliableTransport::Encryption { public: ReliableTunnel(const char* streamname); virtual ~ReliableTunnel(); // Returns provider RTP name virtual std::string streamName(); // Returns provider RTP profile name virtual std::string streamProfile(); // Sets destination IP address virtual void setDestinationAddress(InternetAddress& addr); // Processes incoming data virtual void processData(const void* dataBuffer, int dataSize); // This method is called by user agent to send ICE packet from mediasocket virtual void sendData(InternetAddress& destination, const void* dataBuffer, unsigned int datasize); // Updates SDP offer virtual void updateSdpOffer(resip::SdpContents::Session::Medium& sdp); // Called by user agent when session is terminated. virtual void sessionTerminated(); // Called by user agent when session is started. virtual void sessionEstablished(int conntype); // Called by user agent to save media socket for this provider virtual void setSocket(DatagramSocket& socket4, DatagramSocket& socket6); // Called by user agent to get media socket for this provider virtual DatagramSocket& socket(int family); // Called by user agent to process media stream description from remote peer. // Returns true if description is processed succesfully. Otherwise method returns false. virtual bool processSdpOffer(const resip::SdpContents::Session::Medium& media); virtual void thread(); // Enqueues outgoing packet to sending queue void queueData(const void* bufferPtr, int bufferSize); void setBandwidth(unsigned int bytesPerSecond); unsigned int bandwidth(); // Checks if there is any received application data bool hasData(); // Reads received data. If ptr is NULL - the length of available data is returned. unsigned getData(void* ptr, unsigned capacity); void setEncryptionKey(void* ptr, unsigned length); protected: // SDP's stream name std::string mStreamName; // Transport stack ICEImpl::ReliableTransport mStack; // Socket handles to operate DatagramSocket mSocket4; DatagramSocket mSocket6; // Destination IP4/6 address InternetAddress mDestination; // Win32 exit signal HANDLE mExitSignal; // Win32 "new outgoing data" signal HANDLE mDataSignal; // Mutex to protect queuing/sending outgoing data resip::Mutex mOutgoingMtx; std::vector mNewQueued; resip::Mutex mNewQueuedGuard; resip::Mutex mStackGuard; unsigned int mBandwidth; std::string mEncryptionKey; #ifdef USE_CRYPTOPP CryptoPP::BlowfishEncryption mEncryptor; CryptoPP::BlowfishDecryption mDecryptor; #endif #ifdef USE_OPENSSL BF_KEY mCipher; #endif ICEImpl::ICEByteBuffer mIncomingData; // Returns block size for encryption algorythm int blockSize(); // Encrypts dataPtr buffer inplace. dataSize must be odd to GetBlockSize() returned value. void encrypt(void* dataPtr, int dataSize); // Decrypts dataPtr buffer inplace. dataSize must be odd to GetBlockSize() returned value. void decrypt(void* dataPtr, int dataSize); // Calculates CRC unsigned crc(const void* dataptr, int datasize); void sendOutgoing(); }; #endif