Add a dummy implemenation of SChannelAdapter::SetMode that makes sure that StartSSL fails if the mode is set to DTLS.

Also, update SslSocketFactory to fail if StartSSL fails.

R=juberti@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/33739004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@8014 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/base/schanneladapter.cc b/webrtc/base/schanneladapter.cc
index 9af15a7..c013b8a 100644
--- a/webrtc/base/schanneladapter.cc
+++ b/webrtc/base/schanneladapter.cc
@@ -89,7 +89,7 @@
 };
 
 SChannelAdapter::SChannelAdapter(AsyncSocket* socket)
-  : SSLAdapter(socket), state_(SSL_NONE),
+  : SSLAdapter(socket), state_(SSL_NONE), mode_(SSL_MODE_TLS),
     restartable_(false), signal_close_(false), message_pending_(false),
     impl_(new SSLImpl) {
 }
@@ -98,10 +98,20 @@
   Cleanup();
 }
 
+void
+SChannelAdapter::SetMode(SSLMode mode) {
+  // SSL_MODE_DTLS isn't supported.
+  ASSERT(mode == SSL_MODE_TLS);
+  mode_ = mode;
+}
+
 int
 SChannelAdapter::StartSSL(const char* hostname, bool restartable) {
   if (state_ != SSL_NONE)
-    return ERROR_ALREADY_INITIALIZED;
+    return -1;
+
+  if (mode_ != SSL_MODE_TLS)
+    return -1;
 
   ssl_host_name_ = hostname;
   restartable_ = restartable;
diff --git a/webrtc/base/schanneladapter.h b/webrtc/base/schanneladapter.h
index d174b59..f6f73ad 100644
--- a/webrtc/base/schanneladapter.h
+++ b/webrtc/base/schanneladapter.h
@@ -25,6 +25,7 @@
   SChannelAdapter(AsyncSocket* socket);
   virtual ~SChannelAdapter();
 
+  virtual void SetMode(SSLMode mode);
   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);
@@ -60,9 +61,10 @@
 
 private:
   SSLState state_;
+  SSLMode mode_;
   std::string ssl_host_name_;
   // If true, socket will retain SSL configuration after Close.
-  bool restartable_; 
+  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.
diff --git a/webrtc/base/sslsocketfactory.cc b/webrtc/base/sslsocketfactory.cc
index 0e37ab8..84dae0e 100644
--- a/webrtc/base/sslsocketfactory.cc
+++ b/webrtc/base/sslsocketfactory.cc
@@ -11,6 +11,7 @@
 #include "webrtc/base/autodetectproxy.h"
 #include "webrtc/base/httpcommon.h"
 #include "webrtc/base/httpcommon-inl.h"
+#include "webrtc/base/scoped_ptr.h"
 #include "webrtc/base/socketadapters.h"
 #include "webrtc/base/ssladapter.h"
 #include "webrtc/base/sslsocketfactory.h"
@@ -153,13 +154,19 @@
   }
 
   if (!hostname_.empty()) {
-    if (SSLAdapter* ssl_adapter = SSLAdapter::Create(socket)) {
-      ssl_adapter->set_ignore_bad_cert(ignore_bad_cert_);
-      ssl_adapter->StartSSL(hostname_.c_str(), true);
-      socket = ssl_adapter;
-    } else {
+    rtc::scoped_ptr<SSLAdapter> ssl_adapter(SSLAdapter::Create(socket));
+    if (!ssl_adapter) {
       LOG_F(LS_ERROR) << "SSL unavailable";
+      delete socket;
+      return NULL;
     }
+
+    ssl_adapter->set_ignore_bad_cert(ignore_bad_cert_);
+    if (ssl_adapter->StartSSL(hostname_.c_str(), true) != 0) {
+      LOG_F(LS_ERROR) << "SSL failed to start.";
+      return NULL;
+    }
+    socket = ssl_adapter.release();
   }
 
   // Regular logging occurs at the highest level