/* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once #include #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 HashElement; /** * @brief The IncomingJingleFileTransfer class contains the business logic for managing incoming * Jingle file transfers. * * Calling IncomingJingleFileTransfer::accept will start to negotiate possible transfer * methods and after a working method has been decided among peers the trasnfer is started. */ class SWIFTEN_API IncomingJingleFileTransfer : public IncomingFileTransfer, public JingleFileTransfer { public: typedef std::shared_ptr ref; IncomingJingleFileTransfer( const JID& recipient, std::shared_ptr, std::shared_ptr content, FileTransferTransporterFactory*, TimerFactory*, CryptoProvider*); virtual ~IncomingJingleFileTransfer(); virtual void accept(std::shared_ptr, const FileTransferOptions& = FileTransferOptions()) SWIFTEN_OVERRIDE; virtual void cancel() SWIFTEN_OVERRIDE; private: enum State { Initial, GeneratingInitialLocalCandidates, TryingCandidates, WaitingForPeerProxyActivate, WaitingForLocalProxyActivate, WaitingForFallbackOrTerminate, Transferring, WaitingForHash, Finished }; virtual void handleSessionTerminateReceived( boost::optional reason) SWIFTEN_OVERRIDE; virtual void handleSessionInfoReceived(std::shared_ptr) SWIFTEN_OVERRIDE; virtual void handleTransportReplaceReceived( const JingleContentID&, std::shared_ptr) SWIFTEN_OVERRIDE; virtual void handleLocalTransportCandidatesGenerated( const std::string& s5bSessionID, const std::vector&, const std::string& dstAddr) 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: virtual void startTransferViaRemoteCandidate() SWIFTEN_OVERRIDE; virtual void startTransferViaLocalCandidate() SWIFTEN_OVERRIDE; 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(std::shared_ptr) SWIFTEN_OVERRIDE; virtual bool isWaitingForPeerProxyActivate() const SWIFTEN_OVERRIDE; virtual bool isWaitingForLocalProxyActivate() const SWIFTEN_OVERRIDE; virtual bool isTryingCandidates() const SWIFTEN_OVERRIDE; virtual std::shared_ptr createLocalCandidateSession() SWIFTEN_OVERRIDE; virtual std::shared_ptr createRemoteCandidateSession() SWIFTEN_OVERRIDE; virtual void terminate(JinglePayload::Reason::Type reason) SWIFTEN_OVERRIDE; private: std::shared_ptr initialContent; CryptoProvider* crypto; State state; std::shared_ptr description; std::shared_ptr stream; boost::uintmax_t receivedBytes; IncrementalBytestreamHashCalculator* hashCalculator; std::shared_ptr waitOnHashTimer; std::map hashes; FileTransferOptions options; boost::signals2::scoped_connection writeStreamDataReceivedConnection; boost::signals2::scoped_connection waitOnHashTimerTickedConnection; boost::signals2::connection transferFinishedConnection; }; }