/* * Copyright (c) 2010-2013 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace Swift { class JID; class JingleSession; class JingleContentPayload; class FileTransferTransporter; class FileTransferTransporterFactory; class TimerFactory; class Timer; class CryptoProvider; class IncrementalBytestreamHashCalculator; class JingleFileTransferDescription; class SWIFTEN_API IncomingJingleFileTransfer : public IncomingFileTransfer, public JingleFileTransfer { public: typedef boost::shared_ptr ref; IncomingJingleFileTransfer( const JID& recipient, boost::shared_ptr, boost::shared_ptr content, FileTransferTransporterFactory*, TimerFactory*, CryptoProvider*); ~IncomingJingleFileTransfer(); virtual void accept(boost::shared_ptr, const FileTransferOptions&) SWIFTEN_OVERRIDE; void cancel(); private: enum State { Initial, GeneratingInitialLocalCandidates, TryingCandidates, WaitingForPeerProxyActivate, WaitingForLocalProxyActivate, WaitingForFallbackOrTerminate, Transferring, WaitingForHash, Finished }; virtual void handleSessionTerminateReceived( boost::optional reason) SWIFTEN_OVERRIDE; virtual void handleSessionInfoReceived(boost::shared_ptr) SWIFTEN_OVERRIDE; virtual void handleTransportReplaceReceived( const JingleContentID&, boost::shared_ptr) SWIFTEN_OVERRIDE; virtual void handleLocalTransportCandidatesGenerated( const std::string& s5bSessionID, const std::vector&) SWIFTEN_OVERRIDE; void handleWriteStreamDataReceived(const std::vector& data); void stopActiveTransport(); void checkCandidateSelected(); virtual JingleContentID getContentID() const SWIFTEN_OVERRIDE; void checkIfAllDataReceived(); bool verifyData(); void handleWaitOnHashTimerTicked(); void handleTransferFinished(boost::optional); private: void startTransferViaRemoteCandidate(); void startTransferViaLocalCandidate(); void checkHashAndTerminate(); void stopAll(); void setState(State state); void setFinishedState(FileTransfer::State::Type, const boost::optional& error); const JID& getSender() const SWIFTEN_OVERRIDE; const JID& getRecipient() const SWIFTEN_OVERRIDE; static FileTransfer::State::Type getExternalState(State state); virtual bool hasPriorityOnCandidateTie() const SWIFTEN_OVERRIDE; virtual void fallback() SWIFTEN_OVERRIDE; virtual void startTransferring(boost::shared_ptr) SWIFTEN_OVERRIDE; virtual bool isWaitingForPeerProxyActivate() const SWIFTEN_OVERRIDE; virtual bool isWaitingForLocalProxyActivate() const SWIFTEN_OVERRIDE; virtual bool isTryingCandidates() const SWIFTEN_OVERRIDE; virtual boost::shared_ptr createLocalCandidateSession() SWIFTEN_OVERRIDE; virtual boost::shared_ptr createRemoteCandidateSession() SWIFTEN_OVERRIDE; virtual void terminate(JinglePayload::Reason::Type reason) SWIFTEN_OVERRIDE; private: boost::shared_ptr initialContent; CryptoProvider* crypto; State state; boost::shared_ptr description; boost::shared_ptr stream; boost::uintmax_t receivedBytes; IncrementalBytestreamHashCalculator* hashCalculator; boost::shared_ptr waitOnHashTimer; std::string hashAlgorithm; std::string hash; FileTransferOptions options; boost::bsignals::scoped_connection writeStreamDataReceivedConnection; boost::bsignals::scoped_connection waitOnHashTimerTickedConnection; boost::bsignals::connection transferFinishedConnection; }; }