aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/smtp/MCSMTPSession.h
blob: 1330c79773e7ea52e3dce299e24b04055609dd7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#ifndef MAILCORE_MCSMTPSESSION_H

#define MAILCORE_MCSMTPSESSION_H

#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCMessageConstants.h>

#ifdef __cplusplus

namespace mailcore {
    
    class Address;
    class SMTPProgressCallback;
    class MessageBuilder;
    
    class MAILCORE_EXPORT SMTPSession : public Object {
    public:
        SMTPSession();
        virtual ~SMTPSession();
        
        virtual void setHostname(String * hostname);
        virtual String * hostname();
        
        virtual void setPort(unsigned int port);
        virtual unsigned int port();
        
        virtual void setUsername(String * username);
        virtual String * username();
        
        virtual void setPassword(String * password);
        virtual String * password();
        
        // To authenticate using OAuth2, username and oauth2token should be set.
        // auth type to use is AuthTypeOAuth2.
        virtual void setOAuth2Token(String * token);
        virtual String * OAuth2Token();
        
        virtual void setAuthType(AuthType authType);
        virtual AuthType authType();
        
        virtual void setConnectionType(ConnectionType connectionType);
        virtual ConnectionType connectionType();
        
        virtual void setTimeout(time_t timeout);
        virtual time_t timeout();
        
        virtual void setCheckCertificateEnabled(bool enabled);
        virtual bool isCheckCertificateEnabled();
        
        virtual void setUseHeloIPEnabled(bool enabled);
        virtual bool useHeloIPEnabled();

        virtual String * lastSMTPResponse();

        virtual int lastSMTPResponseCode();
        
        virtual void connect(ErrorCode * pError);
        virtual void disconnect();
        
        virtual void login(ErrorCode * pError);
        
        virtual void checkAccount(Address * from, ErrorCode * pError);
        
        virtual void sendMessage(Data * messageData, SMTPProgressCallback * callback, ErrorCode * pError);
        virtual void sendMessage(Address * from, Array * /* Address */ recipients, Data * messageData,
                                 SMTPProgressCallback * callback, ErrorCode * pError);
        virtual void sendMessage(Address * from, Array * /* Address */ recipients, String * messagePath,
                                 SMTPProgressCallback * callback, ErrorCode * pError);

        virtual void cancelMessageSending();

        virtual void setConnectionLogger(ConnectionLogger * logger);
        virtual ConnectionLogger * connectionLogger();
        
        virtual void noop(ErrorCode * pError);
        
    public: // private
        virtual void lockConnectionLogger();
        virtual void unlockConnectionLogger();
        virtual ConnectionLogger * connectionLoggerNoLock();

    private:
        String * mHostname;
        unsigned int mPort;
        String * mUsername;
        String * mPassword;
        String * mOAuth2Token;
        AuthType mAuthType;
        ConnectionType mConnectionType;
        time_t mTimeout;
        bool mCheckCertificateEnabled;
        bool mUseHeloIPEnabled;
        bool mShouldDisconnect;
        bool mSendingCancelled;
        bool mCanCancel;
        
        mailsmtp * mSmtp;
        SMTPProgressCallback * mProgressCallback;
        int mState;
        String * mLastSMTPResponse;
        int mLastLibetpanError;
        int mLastSMTPResponseCode;
        pthread_mutex_t mCancelLock;
        pthread_mutex_t mCanCancelLock;
        
        ConnectionLogger * mConnectionLogger;
        pthread_mutex_t mConnectionLoggerLock;

        bool mOutlookServer;

        void init();
        Data * dataWithFilteredBcc(Data * data);
        static void body_progress(size_t current, size_t maximum, void * context);
        void bodyProgress(unsigned int current, unsigned int maximum);
        void setup();
        void unsetup();
        void connectIfNeeded(ErrorCode * pError);
        bool checkCertificate();
        void setSendingCancelled(bool isCancelled);
        
        void sendMessage(MessageBuilder * msg, SMTPProgressCallback * callback, ErrorCode * pError);
        void internalSendMessage(Address * from, Array * /* Address */ recipients, Data * messageData,
                                 SMTPProgressCallback * callback, ErrorCode * pError);
        
    public: // private
        virtual bool isDisconnected();
        virtual void loginIfNeeded(ErrorCode * pError);
        virtual void saveLastResponse();
    };
    
}

#endif

#endif