/* * Copyright (c) 2010-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace Swift { class CryptoProvider; class FileTransferTransporterFactory; class IncrementalBytestreamHashCalculator; class JID; class JingleContentPayload; class JingleFileTransferDescription; class JingleSession; class Timer; class TimerFactory; /** * @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() override; virtual void accept(std::shared_ptr, const FileTransferOptions& = FileTransferOptions()) override; virtual void cancel() override; private: enum State { Initial, GeneratingInitialLocalCandidates, TryingCandidates, WaitingForPeerProxyActivate, WaitingForLocalProxyActivate, WaitingForFallbackOrTerminate, Transferring, WaitingForHash, Finished }; virtual void handleSessionTerminateReceived( boost::optional reason) override; virtual void handleSessionInfoReceived(std::shared_ptr) override; virtual void handleTransportReplaceReceived( const JingleContentID&, std::shared_ptr) override; virtual void handleLocalTransportCandidatesGenerated( const std::string& s5bSessionID, const std::vector&, const std::string& dstAddr) override; void handleWriteStreamDataReceived(const std::vector& data); void stopActiveTransport(); void checkCandidateSelected(); virtual JingleContentID getContentID() const override; void checkIfAllDataReceived(); bool verifyData(); void handleWaitOnHashTimerTicked(); void handleTransferFinished(boost::optional); private: virtual void startTransferViaRemoteCandidate() override; virtual void startTransferViaLocalCandidate() override; void checkHashAndTerminate(); void stopAll(); void setState(State state); void setFinishedState(FileTransfer::State::Type, const boost::optional& error); const JID& getSender() const override; const JID& getRecipient() const override; static FileTransfer::State::Type getExternalState(State state); virtual bool hasPriorityOnCandidateTie() const override; virtual void fallback() override; virtual void startTransferring(std::shared_ptr) override; virtual bool isWaitingForPeerProxyActivate() const override; virtual bool isWaitingForLocalProxyActivate() const override; virtual bool isTryingCandidates() const override; virtual std::shared_ptr createLocalCandidateSession() override; virtual std::shared_ptr createRemoteCandidateSession() override; virtual void terminate(JinglePayload::Reason::Type reason) 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; }; }