| /* | 
 |  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef WEBRTC_BASE_SCHANNELADAPTER_H__ | 
 | #define WEBRTC_BASE_SCHANNELADAPTER_H__ | 
 |  | 
 | #include <string> | 
 | #include "webrtc/base/ssladapter.h" | 
 | #include "webrtc/base/messagequeue.h" | 
 | struct _SecBufferDesc; | 
 |  | 
 | namespace rtc { | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | class SChannelAdapter : public SSLAdapter, public MessageHandler { | 
 | public: | 
 |   SChannelAdapter(AsyncSocket* socket); | 
 |   virtual ~SChannelAdapter(); | 
 |  | 
 |   virtual int StartSSL(const char* hostname, bool restartable); | 
 |   virtual int Send(const void* pv, size_t cb); | 
 |   virtual int Recv(void* pv, size_t cb); | 
 |   virtual int Close(); | 
 |  | 
 |   // Note that the socket returns ST_CONNECTING while SSL is being negotiated. | 
 |   virtual ConnState GetState() const; | 
 |  | 
 | protected: | 
 |   enum SSLState { | 
 |     SSL_NONE, SSL_WAIT, SSL_CONNECTING, SSL_CONNECTED, SSL_ERROR | 
 |   }; | 
 |   struct SSLImpl; | 
 |  | 
 |   virtual void OnConnectEvent(AsyncSocket* socket); | 
 |   virtual void OnReadEvent(AsyncSocket* socket); | 
 |   virtual void OnWriteEvent(AsyncSocket* socket); | 
 |   virtual void OnCloseEvent(AsyncSocket* socket, int err); | 
 |   virtual void OnMessage(Message* pmsg); | 
 |  | 
 |   int BeginSSL(); | 
 |   int ContinueSSL(); | 
 |   int ProcessContext(long int status, _SecBufferDesc* sbd_in, | 
 |                      _SecBufferDesc* sbd_out); | 
 |   int DecryptData(); | 
 |  | 
 |   int Read(); | 
 |   int Flush(); | 
 |   void Error(const char* context, int err, bool signal = true); | 
 |   void Cleanup(); | 
 |  | 
 |   void PostEvent(); | 
 |  | 
 | private: | 
 |   SSLState state_; | 
 |   std::string ssl_host_name_; | 
 |   // If true, socket will retain SSL configuration after Close. | 
 |   bool restartable_;  | 
 |   // If true, we are delaying signalling close until all data is read. | 
 |   bool signal_close_; | 
 |   // If true, we are waiting to be woken up to signal readability or closure. | 
 |   bool message_pending_; | 
 |   SSLImpl* impl_; | 
 | }; | 
 |  | 
 | ///////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | } // namespace rtc | 
 |  | 
 | #endif // WEBRTC_BASE_SCHANNELADAPTER_H__ |