diff options
Diffstat (limited to 'chrome')
70 files changed, 32 insertions, 6054 deletions
diff --git a/chrome/browser/sync/DEPS b/chrome/browser/sync/DEPS new file mode 100644 index 0000000..570fa48 --- /dev/null +++ b/chrome/browser/sync/DEPS @@ -0,0 +1,5 @@ +include_rules = [ + # sync_notifier depends on the common jingle notifier classes. + "+jingle/notifier", +] + diff --git a/chrome/browser/sync/engine/all_status.cc b/chrome/browser/sync/engine/all_status.cc index 73f80b9..6bf37d7 100644 --- a/chrome/browser/sync/engine/all_status.cc +++ b/chrome/browser/sync/engine/all_status.cc @@ -17,7 +17,7 @@ #include "chrome/browser/sync/sessions/session_state.h" #include "chrome/browser/sync/syncable/directory_manager.h" #include "chrome/common/deprecated/event_sys-inl.h" -#include "chrome/common/net/notifier/listener/talk_mediator.h" +#include "jingle/notifier/listener/talk_mediator.h" namespace browser_sync { diff --git a/chrome/browser/sync/engine/syncapi.cc b/chrome/browser/sync/engine/syncapi.cc index 7d70ebe..1fbb4ed 100644 --- a/chrome/browser/sync/engine/syncapi.cc +++ b/chrome/browser/sync/engine/syncapi.cc @@ -54,10 +54,10 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/deprecated/event_sys.h" #include "chrome/common/net/gaia/gaia_authenticator.h" -#include "chrome/common/net/notifier/listener/mediator_thread_impl.h" -#include "chrome/common/net/notifier/listener/notification_constants.h" -#include "chrome/common/net/notifier/listener/talk_mediator.h" -#include "chrome/common/net/notifier/listener/talk_mediator_impl.h" +#include "jingle/notifier/listener/mediator_thread_impl.h" +#include "jingle/notifier/listener/notification_constants.h" +#include "jingle/notifier/listener/talk_mediator.h" +#include "jingle/notifier/listener/talk_mediator_impl.h" #include "net/base/network_change_notifier.h" using browser_sync::AllStatus; diff --git a/chrome/browser/sync/engine/syncer_thread.cc b/chrome/browser/sync/engine/syncer_thread.cc index 01f35f6..1437dfd 100644 --- a/chrome/browser/sync/engine/syncer_thread.cc +++ b/chrome/browser/sync/engine/syncer_thread.cc @@ -22,7 +22,7 @@ #include "chrome/browser/sync/engine/syncer.h" #include "chrome/browser/sync/syncable/directory_manager.h" #include "chrome/common/chrome_switches.h" -#include "chrome/common/net/notifier/listener/notification_constants.h" +#include "jingle/notifier/listener/notification_constants.h" using std::priority_queue; using std::min; diff --git a/chrome/browser/sync/notifier/DEPS b/chrome/browser/sync/notifier/DEPS index 5125416..dd31bd4 100644 --- a/chrome/browser/sync/notifier/DEPS +++ b/chrome/browser/sync/notifier/DEPS @@ -1,6 +1,8 @@ include_rules = [ # sync_notifier depends on cacheinvalidation. "+google/cacheinvalidation", + # sync_notifier depends on the common jingle notifier classes. + "+jingle/notifier", # sync_notifier depends on the xmpp part of libjingle. "+talk/xmpp", ] diff --git a/chrome/browser/sync/notifier/cache_invalidation_packet_handler.cc b/chrome/browser/sync/notifier/cache_invalidation_packet_handler.cc index dbc3d54..fea98fe 100644 --- a/chrome/browser/sync/notifier/cache_invalidation_packet_handler.cc +++ b/chrome/browser/sync/notifier/cache_invalidation_packet_handler.cc @@ -7,8 +7,8 @@ #include "base/base64.h" #include "base/callback.h" #include "base/logging.h" -#include "chrome/common/net/notifier/listener/xml_element_util.h" #include "google/cacheinvalidation/invalidation-client.h" +#include "jingle/notifier/listener/xml_element_util.h" #include "talk/xmpp/constants.h" #include "talk/xmpp/jid.h" #include "talk/xmpp/xmppclient.h" diff --git a/chrome/browser/sync/notifier/server_notifier_thread.cc b/chrome/browser/sync/notifier/server_notifier_thread.cc index 19b2f40..ce416eb 100644 --- a/chrome/browser/sync/notifier/server_notifier_thread.cc +++ b/chrome/browser/sync/notifier/server_notifier_thread.cc @@ -9,7 +9,7 @@ #include "base/logging.h" #include "chrome/browser/sync/notifier/chrome_invalidation_client.h" -#include "chrome/common/net/notifier/listener/notification_defines.h" +#include "jingle/notifier/listener/notification_defines.h" namespace sync_notifier { diff --git a/chrome/browser/sync/notifier/server_notifier_thread.h b/chrome/browser/sync/notifier/server_notifier_thread.h index 97f5990..2f5ca1d 100644 --- a/chrome/browser/sync/notifier/server_notifier_thread.h +++ b/chrome/browser/sync/notifier/server_notifier_thread.h @@ -18,7 +18,7 @@ #include "base/scoped_ptr.h" #include "chrome/browser/sync/notifier/chrome_invalidation_client.h" #include "chrome/browser/sync/syncable/model_type.h" -#include "chrome/common/net/notifier/listener/mediator_thread_impl.h" +#include "jingle/notifier/listener/mediator_thread_impl.h" namespace sync_notifier { diff --git a/chrome/browser/sync/tools/sync_listen_notifications.cc b/chrome/browser/sync/tools/sync_listen_notifications.cc index 7e5df7c..c8f89d5 100644 --- a/chrome/browser/sync/tools/sync_listen_notifications.cc +++ b/chrome/browser/sync/tools/sync_listen_notifications.cc @@ -18,11 +18,12 @@ #include "chrome/browser/sync/notifier/chrome_system_resources.h" #include "chrome/browser/sync/sync_constants.h" #include "chrome/common/chrome_switches.h" -#include "chrome/common/net/notifier/base/task_pump.h" -#include "chrome/common/net/notifier/communicator/xmpp_socket_adapter.h" -#include "chrome/common/net/notifier/listener/listen_task.h" -#include "chrome/common/net/notifier/listener/notification_constants.h" -#include "chrome/common/net/notifier/listener/subscribe_task.h" +#include "google/cacheinvalidation/invalidation-client.h" +#include "jingle/notifier/base/task_pump.h" +#include "jingle/notifier/communicator/xmpp_socket_adapter.h" +#include "jingle/notifier/listener/listen_task.h" +#include "jingle/notifier/listener/notification_constants.h" +#include "jingle/notifier/listener/subscribe_task.h" #include "talk/base/cryptstring.h" #include "talk/base/logging.h" #include "talk/base/sigslot.h" diff --git a/chrome/browser/sync/tools/sync_tools.gyp b/chrome/browser/sync/tools/sync_tools.gyp index 124f116..6059ea8 100644 --- a/chrome/browser/sync/tools/sync_tools.gyp +++ b/chrome/browser/sync/tools/sync_tools.gyp @@ -21,8 +21,8 @@ 'dependencies': [ '<(DEPTH)/base/base.gyp:base', '<(DEPTH)/chrome/chrome.gyp:common_constants', - '<(DEPTH)/chrome/chrome.gyp:notifier', '<(DEPTH)/chrome/chrome.gyp:sync_notifier', + '<(DEPTH)/jingle/jingle.gyp:notifier', '<(DEPTH)/third_party/libjingle/libjingle.gyp:libjingle', ], }, diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 238db5c..320ab5d 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -781,13 +781,13 @@ 'dependencies': [ '../base/base.gyp:base', '../build/temp_gyp/googleurl.gyp:googleurl', + '../jingle/jingle.gyp:notifier', '../third_party/icu/icu.gyp:icuuc', '../third_party/libjingle/libjingle.gyp:libjingle', '../third_party/sqlite/sqlite.gyp:sqlite', 'browser/sync/protocol/sync_proto.gyp:sync_proto_cpp', 'common_constants', 'common_net', - 'notifier', 'sync', 'sync_notifier', ], @@ -799,98 +799,6 @@ }], ], }, - # A library for sending and receiving peer-issued notifications. - # - # TODO(akalin): Separate out the XMPP stuff from this library into - # its own library. - { - 'target_name': 'notifier', - 'type': '<(library)', - 'sources': [ - 'common/net/notifier/base/signal_thread_task.h', - 'common/net/notifier/base/ssl_adapter.h', - 'common/net/notifier/base/ssl_adapter.cc', - 'common/net/notifier/base/static_assert.h', - 'common/net/notifier/base/task_pump.cc', - 'common/net/notifier/base/task_pump.h', - 'common/net/notifier/communicator/auto_reconnect.cc', - 'common/net/notifier/communicator/auto_reconnect.h', - 'common/net/notifier/communicator/connection_options.cc', - 'common/net/notifier/communicator/connection_options.h', - 'common/net/notifier/communicator/connection_settings.cc', - 'common/net/notifier/communicator/connection_settings.h', - 'common/net/notifier/communicator/const_communicator.h', - 'common/net/notifier/communicator/gaia_token_pre_xmpp_auth.cc', - 'common/net/notifier/communicator/gaia_token_pre_xmpp_auth.h', - 'common/net/notifier/communicator/login.cc', - 'common/net/notifier/communicator/login.h', - 'common/net/notifier/communicator/login_connection_state.h', - 'common/net/notifier/communicator/login_failure.cc', - 'common/net/notifier/communicator/login_failure.h', - 'common/net/notifier/communicator/login_settings.cc', - 'common/net/notifier/communicator/login_settings.h', - 'common/net/notifier/communicator/product_info.cc', - 'common/net/notifier/communicator/product_info.h', - 'common/net/notifier/communicator/single_login_attempt.cc', - 'common/net/notifier/communicator/single_login_attempt.h', - 'common/net/notifier/communicator/ssl_socket_adapter.cc', - 'common/net/notifier/communicator/ssl_socket_adapter.h', - 'common/net/notifier/communicator/xmpp_connection_generator.cc', - 'common/net/notifier/communicator/xmpp_connection_generator.h', - 'common/net/notifier/communicator/xmpp_socket_adapter.cc', - 'common/net/notifier/communicator/xmpp_socket_adapter.h', - 'common/net/notifier/listener/listen_task.cc', - 'common/net/notifier/listener/listen_task.h', - 'common/net/notifier/listener/mediator_thread.h', - 'common/net/notifier/listener/mediator_thread_impl.cc', - 'common/net/notifier/listener/mediator_thread_impl.h', - 'common/net/notifier/listener/mediator_thread_mock.h', - 'common/net/notifier/listener/notification_constants.cc', - 'common/net/notifier/listener/notification_constants.h', - 'common/net/notifier/listener/notification_defines.h', - 'common/net/notifier/listener/send_update_task.cc', - 'common/net/notifier/listener/send_update_task.h', - 'common/net/notifier/base/sigslotrepeater.h', - 'common/net/notifier/listener/subscribe_task.cc', - 'common/net/notifier/listener/subscribe_task.h', - 'common/net/notifier/listener/talk_mediator.h', - 'common/net/notifier/listener/talk_mediator_impl.cc', - 'common/net/notifier/listener/talk_mediator_impl.h', - 'common/net/notifier/listener/xml_element_util.cc', - 'common/net/notifier/listener/xml_element_util.h', - ], - 'include_dirs': [ - '..', - '<(protoc_out_dir)', - ], - 'defines' : [ - '_CRT_SECURE_NO_WARNINGS', - '_USE_32BIT_TIME_T', - 'kXmppProductName="chromium-sync"', - ], - 'dependencies': [ - '../base/base.gyp:base', - '../net/net.gyp:net', - '../third_party/expat/expat.gyp:expat', - '../third_party/libjingle/libjingle.gyp:libjingle', - 'common_net', - ], - 'export_dependent_settings': [ - '../third_party/libjingle/libjingle.gyp:libjingle', - ], - 'conditions': [ - ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', { - 'dependencies': [ - '../build/linux/system.gyp:gtk' - ], - }], - ['OS=="linux" and chromeos==1', { - 'include_dirs': [ - '<(grit_out_dir)', - ], - }], - ], - }, { 'target_name': 'sync', 'type': '<(library)', @@ -1092,15 +1000,15 @@ '..', ], 'dependencies': [ - 'notifier', 'sync', + '../jingle/jingle.gyp:notifier', '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation', ], # This target exports a hard dependency because it depends on # cacheinvalidation (which itself has hard_dependency set). 'hard_dependency': 1, 'export_dependent_settings': [ - 'notifier', + '../jingle/jingle.gyp:notifier', '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation', ], }, diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index e956ce6..a4daba3 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1804,41 +1804,6 @@ ], # conditions }, { - 'target_name': 'notifier_unit_tests', - 'type': 'executable', - 'sources': [ - # TODO(akalin): Write our own test suite and runner. - '../base/test/run_all_unittests.cc', - '../base/test/test_suite.h', - 'common/net/notifier/listener/talk_mediator_unittest.cc', - 'common/net/notifier/listener/send_update_task_unittest.cc', - 'common/net/notifier/listener/subscribe_task_unittest.cc', - 'common/net/notifier/listener/xml_element_util_unittest.cc', - ], - 'include_dirs': [ - '..', - ], - 'dependencies': [ - 'notifier', - '../base/base.gyp:base', - '../testing/gmock.gyp:gmock', - '../testing/gtest.gyp:gtest', - '../third_party/libjingle/libjingle.gyp:libjingle', - ], - # TODO(akalin): Remove this once we have our own test suite and - # runner. - 'conditions': [ - ['OS == "linux" or OS == "freebsd" or OS == "openbsd" or OS == "solaris"', { - 'dependencies': [ - # Needed to handle the #include chain: - # base/test/test_suite.h - # gtk/gtk.h - '../build/linux/system.gyp:gtk', - ], - }], - ], - }, - { 'target_name': 'sync_unit_tests', 'type': 'executable', 'sources': [ diff --git a/chrome/common/net/notifier/DEPS b/chrome/common/net/notifier/DEPS deleted file mode 100644 index 2d7d13f..0000000 --- a/chrome/common/net/notifier/DEPS +++ /dev/null @@ -1,6 +0,0 @@ -include_rules = [ - # notifier depends on libjingle. - "+talk/base", - "+talk/xmpp", - "+talk/xmllite", -] diff --git a/chrome/common/net/notifier/base/signal_thread_task.h b/chrome/common/net/notifier/base/signal_thread_task.h deleted file mode 100644 index 4e9b2c9..0000000 --- a/chrome/common/net/notifier/base/signal_thread_task.h +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_BASE_SIGNAL_THREAD_TASK_H_ -#define CHROME_COMMON_NET_NOTIFIER_BASE_SIGNAL_THREAD_TASK_H_ - -#include "base/logging.h" -#include "talk/base/common.h" -#include "talk/base/signalthread.h" -#include "talk/base/sigslot.h" -#include "talk/base/task.h" - -namespace notifier { - -template<class T> -class SignalThreadTask : public talk_base::Task, - public sigslot::has_slots<> { - public: - // Takes ownership of signal_thread. - SignalThreadTask(talk_base::Task* task_parent, T** signal_thread) - : talk_base::Task(task_parent), - signal_thread_(NULL), - finished_(false) { - SetSignalThread(signal_thread); - } - - virtual ~SignalThreadTask() { - ClearSignalThread(); - } - - virtual void Stop() { - Task::Stop(); - ClearSignalThread(); - } - - virtual int ProcessStart() { - DCHECK_EQ(GetState(), talk_base::Task::STATE_START); - signal_thread_->SignalWorkDone.connect( - this, - &SignalThreadTask<T>::OnWorkDone); - signal_thread_->Start(); - return talk_base::Task::STATE_RESPONSE; - } - - int ProcessResponse() { - if (!finished_) { - return talk_base::Task::STATE_BLOCKED; - } - SignalWorkDone(signal_thread_); - ClearSignalThread(); - return talk_base::Task::STATE_DONE; - } - - sigslot::signal1<T*> SignalWorkDone; - - private: - // Takes ownership of signal_thread. - void SetSignalThread(T** signal_thread) { - DCHECK(!signal_thread_); - DCHECK(signal_thread); - DCHECK(*signal_thread); - // No one should be listening to the signal thread for work done. - // They should be using this class instead. Unfortunately, we - // can't verify this. - - signal_thread_ = *signal_thread; - - // Helps callers not to use signal thread after this point since this class - // has taken ownership (and avoid the error of doing - // signal_thread->Start()). - *signal_thread = NULL; - } - - void OnWorkDone(talk_base::SignalThread* signal_thread) { - DCHECK_EQ(signal_thread, signal_thread_); - finished_ = true; - Wake(); - } - - void ClearSignalThread() { - if (signal_thread_) { - // Don't wait on the thread destruction, or we may deadlock. - signal_thread_->Destroy(false); - signal_thread_ = NULL; - } - } - - T* signal_thread_; - bool finished_; - DISALLOW_COPY_AND_ASSIGN(SignalThreadTask); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_BASE_SIGNAL_THREAD_TASK_H_ diff --git a/chrome/common/net/notifier/base/sigslotrepeater.h b/chrome/common/net/notifier/base/sigslotrepeater.h deleted file mode 100644 index 45dfba1..0000000 --- a/chrome/common/net/notifier/base/sigslotrepeater.h +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_BASE_SIGSLOTREPEATER_H_ -#define CHROME_COMMON_NET_NOTIFIER_BASE_SIGSLOTREPEATER_H_ - -// Repeaters are both signals and slots, which are designed as intermediate -// pass-throughs for signals and slots which don't know about each other (for -// modularity or encapsulation). This eliminates the need to declare a signal -// handler whose sole purpose is to fire another signal. The repeater connects -// to the originating signal using the 'repeat' method. When the repeated -// signal fires, the repeater will also fire. - -#include "talk/base/sigslot.h" - -namespace sigslot { - -template<class mt_policy = SIGSLOT_DEFAULT_MT_POLICY> -class repeater0 : public signal0<mt_policy>, - public has_slots<mt_policy> { - public: - typedef signal0<mt_policy> base_type; - typedef repeater0<mt_policy> this_type; - - repeater0() { } - explicit repeater0(const this_type& s) : base_type(s) { } - - void reemit() { signal0<mt_policy>::emit(); } - void repeat(base_type &s) { s.connect(this, &this_type::reemit); } -}; - -template<class arg1_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY> -class repeater1 : public signal1<arg1_type, mt_policy>, - public has_slots<mt_policy> { - public: - typedef signal1<arg1_type, mt_policy> base_type; - typedef repeater1<arg1_type, mt_policy> this_type; - - repeater1() { } - repeater1(const this_type& s) : base_type(s) { } - - void reemit(arg1_type a1) { signal1<arg1_type, mt_policy>::emit(a1); } - void repeat(base_type& s) { s.connect(this, &this_type::reemit); } -}; - -template<class arg1_type, class arg2_type, - class mt_policy = SIGSLOT_DEFAULT_MT_POLICY> -class repeater2 : public signal2<arg1_type, arg2_type, mt_policy>, - public has_slots<mt_policy> { - public: - typedef signal2<arg1_type, arg2_type, mt_policy> base_type; - typedef repeater2<arg1_type, arg2_type, mt_policy> this_type; - - repeater2() { } - repeater2(const this_type& s) : base_type(s) { } - - void reemit(arg1_type a1, arg2_type a2) { - signal2<arg1_type, arg2_type, mt_policy>::emit(a1, a2); - } - void repeat(base_type& s) { s.connect(this, &this_type::reemit); } -}; - -template<class arg1_type, class arg2_type, class arg3_type, - class mt_policy = SIGSLOT_DEFAULT_MT_POLICY> -class repeater3 : public signal3<arg1_type, arg2_type, arg3_type, mt_policy>, - public has_slots<mt_policy> { - public: - typedef signal3<arg1_type, arg2_type, arg3_type, mt_policy> base_type; - typedef repeater3<arg1_type, arg2_type, arg3_type, mt_policy> this_type; - - repeater3() { } - repeater3(const this_type& s) : base_type(s) { } - - void reemit(arg1_type a1, arg2_type a2, arg3_type a3) { - signal3<arg1_type, arg2_type, arg3_type, mt_policy>::emit(a1, a2, a3); - } - void repeat(base_type& s) { s.connect(this, &this_type::reemit); } -}; - -} // namespace sigslot - -#endif // CHROME_COMMON_NET_NOTIFIER_BASE_SIGSLOTREPEATER_H_ diff --git a/chrome/common/net/notifier/base/ssl_adapter.cc b/chrome/common/net/notifier/base/ssl_adapter.cc deleted file mode 100644 index 9f12019..0000000 --- a/chrome/common/net/notifier/base/ssl_adapter.cc +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/base/ssl_adapter.h" - -#if defined(OS_WIN) -#include "talk/base/ssladapter.h" -#else -#include "chrome/common/net/notifier/communicator/ssl_socket_adapter.h" -#endif - -namespace notifier { - -talk_base::SSLAdapter* CreateSSLAdapter(talk_base::AsyncSocket* socket) { - talk_base::SSLAdapter* ssl_adapter = -#if defined(OS_WIN) - talk_base::SSLAdapter::Create(socket); -#else - notifier::SSLSocketAdapter::Create(socket); -#endif - DCHECK(ssl_adapter); - return ssl_adapter; -} - -} // namespace notifier - diff --git a/chrome/common/net/notifier/base/ssl_adapter.h b/chrome/common/net/notifier/base/ssl_adapter.h deleted file mode 100644 index bd39d3b..0000000 --- a/chrome/common/net/notifier/base/ssl_adapter.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_BASE_SSL_ADAPTER_H_ -#define CHROME_COMMON_NET_NOTIFIER_BASE_SSL_ADAPTER_H_ - -namespace talk_base { -class AsyncSocket; -class SSLAdapter; -} // namespace talk_base - -namespace notifier { - -// Wraps the given socket in a platform-dependent SSLAdapter -// implementation. -talk_base::SSLAdapter* CreateSSLAdapter(talk_base::AsyncSocket* socket); - -// Utility template class that overrides CreateSSLAdapter() to use the -// above function. -template <class SocketFactory> -class SSLAdapterSocketFactory : public SocketFactory { - public: - virtual talk_base::SSLAdapter* CreateSSLAdapter( - talk_base::AsyncSocket* socket) { - return ::notifier::CreateSSLAdapter(socket); - } -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_BASE_SSL_ADAPTER_H_ - diff --git a/chrome/common/net/notifier/base/static_assert.h b/chrome/common/net/notifier/base/static_assert.h deleted file mode 100644 index 5ebf335f..0000000 --- a/chrome/common/net/notifier/base/static_assert.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_BASE_STATIC_ASSERT_H_ -#define CHROME_COMMON_NET_NOTIFIER_BASE_STATIC_ASSERT_H_ - -template<bool> struct STATIC_ASSERTION_FAILURE; - -template<> struct STATIC_ASSERTION_FAILURE<true> { - enum { value = 1 }; -}; - -template<int> struct static_assert_test{}; - -#define STATIC_ASSERT(B) \ -typedef static_assert_test<\ - sizeof(STATIC_ASSERTION_FAILURE< (bool)( B ) >)>\ - static_assert_typedef_ ## __LINE__ - -#endif // CHROME_COMMON_NET_NOTIFIER_BASE_STATIC_ASSERT_H_ diff --git a/chrome/common/net/notifier/base/task_pump.cc b/chrome/common/net/notifier/base/task_pump.cc deleted file mode 100644 index 17bde88..0000000 --- a/chrome/common/net/notifier/base/task_pump.cc +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/message_loop.h" -#include "chrome/common/net/notifier/base/task_pump.h" - -namespace notifier { - -TaskPump::TaskPump() - : scoped_runnable_method_factory_( - ALLOW_THIS_IN_INITIALIZER_LIST(this)), - posted_wake_(false) {} - -TaskPump::~TaskPump() {} - -void TaskPump::WakeTasks() { - if (!posted_wake_) { - // Do the requested wake up. - MessageLoop::current()->PostTask( - FROM_HERE, - scoped_runnable_method_factory_.NewRunnableMethod( - &TaskPump::CheckAndRunTasks)); - posted_wake_ = true; - } -} - -int64 TaskPump::CurrentTime() { - // Only timeout tasks rely on this function. Since we're not using - // libjingle tasks for timeout, it's safe to return 0 here. - return 0; -} - -void TaskPump::CheckAndRunTasks() { - posted_wake_ = false; - // We shouldn't be using libjingle for timeout tasks, so we should - // have no timeout tasks at all. - - // TODO(akalin): Add HasTimeoutTask() back in TaskRunner class and - // uncomment this check. - // DCHECK(!HasTimeoutTask()) - RunTasks(); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/base/task_pump.h b/chrome/common/net/notifier/base/task_pump.h deleted file mode 100644 index 6aab9dd..0000000 --- a/chrome/common/net/notifier/base/task_pump.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_BASE_TASK_PUMP_H_ -#define CHROME_COMMON_NET_NOTIFIER_BASE_TASK_PUMP_H_ - -#include "base/task.h" -#include "talk/base/taskrunner.h" - -namespace notifier { - -class TaskPump : public talk_base::TaskRunner { - public: - TaskPump(); - - virtual ~TaskPump(); - - // talk_base::TaskRunner implementation. - virtual void WakeTasks(); - virtual int64 CurrentTime(); - - private: - void CheckAndRunTasks(); - - ScopedRunnableMethodFactory<TaskPump> scoped_runnable_method_factory_; - bool posted_wake_; - - DISALLOW_COPY_AND_ASSIGN(TaskPump); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_BASE_TASK_PUMP_H_ diff --git a/chrome/common/net/notifier/communicator/auto_reconnect.cc b/chrome/common/net/notifier/communicator/auto_reconnect.cc deleted file mode 100644 index 49edf89..0000000 --- a/chrome/common/net/notifier/communicator/auto_reconnect.cc +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/communicator/auto_reconnect.h" - -#include "base/rand_util.h" -#include "chrome/common/net/notifier/communicator/login.h" - -namespace notifier { - -const int kResetReconnectInfoDelaySec = 2; - -AutoReconnect::AutoReconnect() - : reconnect_timer_started_(false), - is_idle_(false) { - SetupReconnectInterval(); -} - -void AutoReconnect::NetworkStateChanged(bool is_alive) { - if (is_retrying() && is_alive) { - // Reconnect in 1 to 9 seconds (vary the time a little to try to avoid - // spikey behavior on network hiccups). - StartReconnectTimerWithInterval( - base::TimeDelta::FromSeconds(base::RandInt(1, 9))); - } -} - -void AutoReconnect::StartReconnectTimer() { - StartReconnectTimerWithInterval(reconnect_interval_); -} - -void AutoReconnect::StartReconnectTimerWithInterval( - base::TimeDelta interval) { - // Don't call StopReconnectTimer because we don't want other classes to - // detect that the intermediate state of the timer being stopped. - // (We're avoiding the call to SignalTimerStartStop while reconnect_timer_ is - // NULL). - reconnect_timer_.Stop(); - reconnect_timer_.Start(interval, this, &AutoReconnect::DoReconnect); - reconnect_timer_started_ = true; - SignalTimerStartStop(); -} - -void AutoReconnect::DoReconnect() { - reconnect_timer_started_ = false; - - // If timed out again, double autoreconnect time up to 30 minutes. - reconnect_interval_ *= 2; - if (reconnect_interval_ > base::TimeDelta::FromMinutes(30)) { - reconnect_interval_ = base::TimeDelta::FromMinutes(30); - } - SignalStartConnection(); -} - -void AutoReconnect::StopReconnectTimer() { - if (reconnect_timer_started_) { - reconnect_timer_started_ = false; - reconnect_timer_.Stop(); - SignalTimerStartStop(); - } -} - -void AutoReconnect::StopDelayedResetTimer() { - delayed_reset_timer_.Stop(); -} - -void AutoReconnect::ResetState() { - StopDelayedResetTimer(); - StopReconnectTimer(); - SetupReconnectInterval(); -} - -void AutoReconnect::SetupReconnectInterval() { - if (is_idle_) { - // If we were idle, start the timer over again (120 - 360 seconds). - reconnect_interval_ = - base::TimeDelta::FromSeconds(base::RandInt(120, 360)); - } else { - // If we weren't idle, try the connection 5 - 25 seconds later. - reconnect_interval_ = - base::TimeDelta::FromSeconds(base::RandInt(5, 25)); - } -} - -void AutoReconnect::OnPowerSuspend(bool suspended) { - if (suspended) { - // When the computer comes back on, ensure that the reconnect happens - // quickly (5 - 25 seconds). - reconnect_interval_ = - base::TimeDelta::FromSeconds(base::RandInt(5, 25)); - } -} - -void AutoReconnect::OnClientStateChange(LoginConnectionState state) { - // On any state change, stop the reset timer. - StopDelayedResetTimer(); - switch (state) { - case STATE_RETRYING: - // Do nothing. - break; - - case STATE_CLOSED: - // When the user has been logged out and no auto-reconnect is happening, - // then the autoreconnect intervals should be reset. - ResetState(); - break; - - case STATE_OPENING: - StopReconnectTimer(); - break; - - case STATE_OPENED: - // Reset autoreconnect timeout sequence after being connected for a bit - // of time. This helps in the case that we are connecting briefly and - // then getting disconnect like when an account hits an abuse limit. - StopReconnectTimer(); - delayed_reset_timer_.Start( - base::TimeDelta::FromSeconds(kResetReconnectInfoDelaySec), - this, &AutoReconnect::ResetState); - break; - } -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/auto_reconnect.h b/chrome/common/net/notifier/communicator/auto_reconnect.h deleted file mode 100644 index 3b914c1..0000000 --- a/chrome/common/net/notifier/communicator/auto_reconnect.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_AUTO_RECONNECT_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_AUTO_RECONNECT_H_ - -#include <string> - -#include "base/time.h" -#include "base/timer.h" -#include "chrome/common/net/notifier/communicator/login_connection_state.h" -#include "talk/base/sigslot.h" - -namespace notifier { - -class AutoReconnect : public sigslot::has_slots<> { - public: - AutoReconnect(); - void StartReconnectTimer(); - void StopReconnectTimer(); - void OnClientStateChange(LoginConnectionState state); - - void NetworkStateChanged(bool is_alive); - - // Callback when power is suspended. - void OnPowerSuspend(bool suspended); - - void set_idle(bool idle) { - is_idle_ = idle; - } - - // Returns true if the auto-retry is to be done (pending a countdown). - bool is_retrying() const { - return reconnect_timer_started_; - } - - sigslot::signal0<> SignalTimerStartStop; - sigslot::signal0<> SignalStartConnection; - - private: - void StartReconnectTimerWithInterval(base::TimeDelta interval); - void DoReconnect(); - void ResetState(); - void SetupReconnectInterval(); - void StopDelayedResetTimer(); - - base::TimeDelta reconnect_interval_; - bool reconnect_timer_started_; - base::OneShotTimer<AutoReconnect> reconnect_timer_; - base::OneShotTimer<AutoReconnect> delayed_reset_timer_; - - bool is_idle_; - DISALLOW_COPY_AND_ASSIGN(AutoReconnect); -}; - -// Wait 2 seconds until after we actually connect to reset reconnect related -// items. -// -// The reason for this delay is to avoid the situation in which buzz is trying -// to block the client due to abuse and the client responses by going into -// rapid reconnect mode, which makes the problem more severe. -extern const int kResetReconnectInfoDelaySec; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_AUTO_RECONNECT_H_ diff --git a/chrome/common/net/notifier/communicator/connection_options.cc b/chrome/common/net/notifier/communicator/connection_options.cc deleted file mode 100644 index 1e5b6e7..0000000 --- a/chrome/common/net/notifier/communicator/connection_options.cc +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/communicator/connection_options.h" - -namespace notifier { - -ConnectionOptions::ConnectionOptions() - : autodetect_proxy_(true), - auto_reconnect_(true), - proxy_port_(0), - use_proxy_auth_(0), - allow_unverified_certs_(false) { -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/connection_options.h b/chrome/common/net/notifier/communicator/connection_options.h deleted file mode 100644 index b42023b..0000000 --- a/chrome/common/net/notifier/communicator/connection_options.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_CONNECTION_OPTIONS_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_CONNECTION_OPTIONS_H_ - -#include <string> - -#include "talk/base/cryptstring.h" -#include "talk/base/helpers.h" - -namespace notifier { - -class ConnectionOptions { - public: - ConnectionOptions(); - - bool autodetect_proxy() const { return autodetect_proxy_; } - bool auto_reconnect() const { return auto_reconnect_; } - const std::string& proxy_host() const { return proxy_host_; } - int proxy_port() const { return proxy_port_; } - bool use_proxy_auth() const { return use_proxy_auth_; } - const std::string& auth_user() const { return auth_user_; } - const talk_base::CryptString& auth_pass() const { return auth_pass_; } - bool allow_unverified_certs() const { return allow_unverified_certs_; } - - void set_autodetect_proxy(bool f) { autodetect_proxy_ = f; } - void set_auto_reconnect(bool f) { auto_reconnect_ = f; } - void set_proxy_host(const std::string& val) { proxy_host_ = val; } - void set_proxy_port(int val) { proxy_port_ = val; } - void set_use_proxy_auth(bool f) { use_proxy_auth_ = f; } - void set_auth_user(const std::string& val) { auth_user_ = val; } - void set_auth_pass(const talk_base::CryptString& val) { auth_pass_ = val; } - - // Setting this to true opens a security hole, so it is *highly* recommended - // that you don't do this. - void set_allow_unverified_certs(bool allow_unverified_certs) { - allow_unverified_certs_ = allow_unverified_certs; - } - - private: - bool autodetect_proxy_; - bool auto_reconnect_; - std::string proxy_host_; - int proxy_port_; - bool use_proxy_auth_; - std::string auth_user_; - talk_base::CryptString auth_pass_; - bool allow_unverified_certs_; - // Allow the copy constructor and operator=. -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_CONNECTION_OPTIONS_H_ diff --git a/chrome/common/net/notifier/communicator/connection_settings.cc b/chrome/common/net/notifier/communicator/connection_settings.cc deleted file mode 100644 index 39005a2..0000000 --- a/chrome/common/net/notifier/communicator/connection_settings.cc +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <algorithm> -#include <deque> -#include <string> -#include <vector> - -#include "base/logging.h" -#include "chrome/common/net/notifier/communicator/connection_settings.h" -#include "talk/base/helpers.h" -#include "talk/xmpp/xmppclientsettings.h" - -namespace notifier { - -class RandomGenerator { - public: - int operator()(int ceiling) { - return static_cast<int>(talk_base::CreateRandomId() % ceiling); - } -}; - -void ConnectionSettings::FillXmppClientSettings( - buzz::XmppClientSettings* xcs) const { - DCHECK(xcs); - xcs->set_protocol(protocol_); - xcs->set_server(server_); - xcs->set_proxy(proxy_.type); - if (proxy_.type != talk_base::PROXY_NONE) { - xcs->set_proxy_host(proxy_.address.IPAsString()); - xcs->set_proxy_port(proxy_.address.port()); - } - if ((proxy_.type != talk_base::PROXY_NONE) && !proxy_.username.empty()) { - xcs->set_use_proxy_auth(true); - xcs->set_proxy_user(proxy_.username); - xcs->set_proxy_pass(proxy_.password); - } else { - xcs->set_use_proxy_auth(false); - } -} - -void ConnectionSettingsList::AddPermutations(const std::string& hostname, - const std::vector<uint32>& iplist, - int16 port, - bool special_port_magic, - bool proxy_only) { - // randomize the list. This ensures the iplist isn't always - // evaluated in the order returned by DNS - std::vector<uint32> iplist_random = iplist; - RandomGenerator rg; - std::random_shuffle(iplist_random.begin(), iplist_random.end(), rg); - - // Put generated addresses in a new deque, then append on the list_, since - // there are order dependencies and AddPermutations() may be called more - // than once. - std::deque<ConnectionSettings> list_temp; - - // Permute addresses for this server. In some cases we haven't resolved the - // to ip addresses. - talk_base::SocketAddress server(hostname, port); - if (iplist_random.empty()) { - // We couldn't pre-resolve the hostname, so let's hope it will resolve - // further down the pipeline (by a proxy, for example). - PermuteForAddress(server, special_port_magic, proxy_only, &list_temp); - } else { - // Generate a set of possibilities for each server address. - // Don't do permute duplicates. - for (size_t index = 0; index < iplist_random.size(); ++index) { - if (std::find(iplist_seen_.begin(), iplist_seen_.end(), - iplist_random[index]) != iplist_seen_.end()) { - continue; - } - iplist_seen_.push_back(iplist_random[index]); - server.SetResolvedIP(iplist_random[index]); - PermuteForAddress(server, special_port_magic, proxy_only, &list_temp); - } - } - - // Add this list to the instance list - while (list_temp.size() != 0) { - list_.push_back(list_temp[0]); - list_temp.pop_front(); - } -} - - -void ConnectionSettingsList::PermuteForAddress( - const talk_base::SocketAddress& server, - bool special_port_magic, - bool proxy_only, - std::deque<ConnectionSettings>* list_temp) { - DCHECK(list_temp); - *(template_.mutable_server()) = server; - - // Use all of the original settings - list_temp->push_back(template_); - - // Try alternate port - if (special_port_magic) { - ConnectionSettings settings(template_); - settings.set_protocol(cricket::PROTO_SSLTCP); - settings.mutable_server()->SetPort(443); - // HTTPS proxies usually require port 443, so try it first - if ((template_.proxy().type == talk_base::PROXY_HTTPS) || - (template_.proxy().type == talk_base::PROXY_UNKNOWN)) { - list_temp->push_front(settings); - } else { - list_temp->push_back(settings); - } - } - - if (!proxy_only) { - // Try without the proxy - if (template_.proxy().type != talk_base::PROXY_NONE) { - ConnectionSettings settings(template_); - settings.mutable_proxy()->type = talk_base::PROXY_NONE; - list_temp->push_back(settings); - - if (special_port_magic) { - settings.set_protocol(cricket::PROTO_SSLTCP); - settings.mutable_server()->SetPort(443); - list_temp->push_back(settings); - } - } - } -} -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/connection_settings.h b/chrome/common/net/notifier/communicator/connection_settings.h deleted file mode 100644 index fc5ef4c..0000000 --- a/chrome/common/net/notifier/communicator/connection_settings.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_CONNECTION_SETTINGS_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_CONNECTION_SETTINGS_H_ - -#include <deque> -#include <string> -#include <vector> - -#include "talk/xmpp/xmppclientsettings.h" - -namespace notifier { - -class ConnectionSettings { - public: - ConnectionSettings() : protocol_(cricket::PROTO_TCP) {} - - cricket::ProtocolType protocol() { return protocol_; } - const talk_base::SocketAddress& server() const { return server_; } - const talk_base::ProxyInfo& proxy() const { return proxy_; } - - void set_protocol(cricket::ProtocolType protocol) { protocol_ = protocol; } - talk_base::SocketAddress* mutable_server() { return &server_; } - talk_base::ProxyInfo* mutable_proxy() { return &proxy_; } - - void FillXmppClientSettings(buzz::XmppClientSettings* xcs) const; - - private: - cricket::ProtocolType protocol_; // PROTO_TCP, PROTO_SSLTCP, etc. - talk_base::SocketAddress server_; // Server. - talk_base::ProxyInfo proxy_; // Proxy info. - // Need copy constructor due to use in stl deque. -}; - -class ConnectionSettingsList { - public: - ConnectionSettingsList() {} - - void SetProxy(const talk_base::ProxyInfo& proxy) { - *(template_.mutable_proxy()) = proxy; - } - - const talk_base::ProxyInfo& proxy() const { - return template_.proxy(); - } - - int GetCount() { return list_.size(); } - ConnectionSettings* GetSettings(size_t index) { return &list_[index]; } - - void ClearPermutations() { - list_.clear(); - iplist_seen_.clear(); - } - - void AddPermutations(const std::string& hostname, - const std::vector<uint32>& iplist, - int16 port, - bool special_port_magic, - bool proxy_only); - private: - void PermuteForAddress(const talk_base::SocketAddress& server, - bool special_port_magic, - bool proxy_only, - std::deque<ConnectionSettings>* list_temp); - - ConnectionSettings template_; - std::deque<ConnectionSettings> list_; - std::vector<uint32> iplist_seen_; - DISALLOW_COPY_AND_ASSIGN(ConnectionSettingsList); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_CONNECTION_SETTINGS_H_ diff --git a/chrome/common/net/notifier/communicator/const_communicator.h b/chrome/common/net/notifier/communicator/const_communicator.h deleted file mode 100644 index 0b0a18a..0000000 --- a/chrome/common/net/notifier/communicator/const_communicator.h +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_CONST_COMMUNICATOR_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_CONST_COMMUNICATOR_H_ - -namespace notifier { -// The default port for jabber/xmpp communications. -const int kDefaultXmppPort = 5222; -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_CONST_COMMUNICATOR_H_ diff --git a/chrome/common/net/notifier/communicator/gaia_token_pre_xmpp_auth.cc b/chrome/common/net/notifier/communicator/gaia_token_pre_xmpp_auth.cc deleted file mode 100644 index 57003e8..0000000 --- a/chrome/common/net/notifier/communicator/gaia_token_pre_xmpp_auth.cc +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/communicator/gaia_token_pre_xmpp_auth.h" - -#include <algorithm> - -#include "talk/base/socketaddress.h" -#include "talk/xmpp/constants.h" -#include "talk/xmpp/saslcookiemechanism.h" - -namespace notifier { - -namespace { -const char kGaiaAuthMechanism[] = "X-GOOGLE-TOKEN"; -} // namespace - -GaiaTokenPreXmppAuth::GaiaTokenPreXmppAuth( - const std::string& username, - const std::string& token, - const std::string& token_service) - : username_(username), - token_(token), - token_service_(token_service) { } - -GaiaTokenPreXmppAuth::~GaiaTokenPreXmppAuth() { } - -void GaiaTokenPreXmppAuth::StartPreXmppAuth( - const buzz::Jid& jid, - const talk_base::SocketAddress& server, - const talk_base::CryptString& pass, - const std::string& auth_cookie) { - SignalAuthDone(); -} - -bool GaiaTokenPreXmppAuth::IsAuthDone() const { - return true; -} - -bool GaiaTokenPreXmppAuth::IsAuthorized() const { - return true; -} - -bool GaiaTokenPreXmppAuth::HadError() const { - return false; -} - -int GaiaTokenPreXmppAuth::GetError() const { - return 0; -} - -buzz::CaptchaChallenge GaiaTokenPreXmppAuth::GetCaptchaChallenge() const { - return buzz::CaptchaChallenge(); -} - -std::string GaiaTokenPreXmppAuth::GetAuthCookie() const { - return std::string(); -} - -std::string GaiaTokenPreXmppAuth::ChooseBestSaslMechanism( - const std::vector<std::string> & mechanisms, bool encrypted) { - return (std::find(mechanisms.begin(), - mechanisms.end(), kGaiaAuthMechanism) != - mechanisms.end()) ? kGaiaAuthMechanism : ""; -} - -buzz::SaslMechanism* GaiaTokenPreXmppAuth::CreateSaslMechanism( - const std::string& mechanism) { - if (mechanism != kGaiaAuthMechanism) - return NULL; - return new buzz::SaslCookieMechanism( - kGaiaAuthMechanism, username_, token_, token_service_); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/gaia_token_pre_xmpp_auth.h b/chrome/common/net/notifier/communicator/gaia_token_pre_xmpp_auth.h deleted file mode 100644 index 0eb6aa0..0000000 --- a/chrome/common/net/notifier/communicator/gaia_token_pre_xmpp_auth.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_GAIA_TOKEN_PRE_XMPP_AUTH_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_GAIA_TOKEN_PRE_XMPP_AUTH_H_ - -#include <string> -#include <vector> - -#include "talk/xmpp/prexmppauth.h" - -namespace notifier { - -// This class implements buzz::PreXmppAuth interface for token-based -// authentication in GTalk. It looks for the X-GOOGLE-TOKEN auth mechanism -// and uses that instead of the default auth mechanism (PLAIN). -class GaiaTokenPreXmppAuth : public buzz::PreXmppAuth { - public: - GaiaTokenPreXmppAuth(const std::string& username, const std::string& token, - const std::string& token_service); - - virtual ~GaiaTokenPreXmppAuth(); - - // buzz::PreXmppAuth (-buzz::SaslHandler) implementation. We stub - // all the methods out as we don't actually do any authentication at - // this point. - virtual void StartPreXmppAuth(const buzz::Jid& jid, - const talk_base::SocketAddress& server, - const talk_base::CryptString& pass, - const std::string& auth_cookie); - - virtual bool IsAuthDone() const; - - virtual bool IsAuthorized() const; - - virtual bool HadError() const; - - virtual int GetError() const; - - virtual buzz::CaptchaChallenge GetCaptchaChallenge() const; - - virtual std::string GetAuthCookie() const; - - // buzz::SaslHandler implementation. - - virtual std::string ChooseBestSaslMechanism( - const std::vector<std::string>& mechanisms, bool encrypted); - - virtual buzz::SaslMechanism* CreateSaslMechanism( - const std::string& mechanism); - - private: - std::string username_; - std::string token_; - std::string token_service_; -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_GAIA_TOKEN_PRE_XMPP_AUTH_H_ diff --git a/chrome/common/net/notifier/communicator/login.cc b/chrome/common/net/notifier/communicator/login.cc deleted file mode 100644 index f1ed19a..0000000 --- a/chrome/common/net/notifier/communicator/login.cc +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <string> - -#include "chrome/common/net/notifier/communicator/login.h" - -#include "base/logging.h" -#include "base/time.h" -#include "chrome/common/net/notifier/communicator/auto_reconnect.h" -#include "chrome/common/net/notifier/communicator/connection_options.h" -#include "chrome/common/net/notifier/communicator/login_settings.h" -#include "chrome/common/net/notifier/communicator/product_info.h" -#include "chrome/common/net/notifier/communicator/single_login_attempt.h" -#include "net/base/host_port_pair.h" -#include "talk/base/common.h" -#include "talk/base/firewallsocketserver.h" -#include "talk/base/logging.h" -#include "talk/base/physicalsocketserver.h" -#include "talk/base/taskrunner.h" -#include "talk/xmllite/xmlelement.h" -#include "talk/xmpp/asyncsocket.h" -#include "talk/xmpp/prexmppauth.h" -#include "talk/xmpp/xmppclient.h" -#include "talk/xmpp/xmppclientsettings.h" -#include "talk/xmpp/xmppengine.h" - -namespace notifier { - -// Redirect valid for 5 minutes. -static const int kRedirectTimeoutMinutes = 5; - -// Disconnect if network stays down for more than 10 seconds. -static const int kDisconnectionDelaySecs = 10; - -Login::Login(talk_base::TaskParent* parent, - const buzz::XmppClientSettings& user_settings, - const ConnectionOptions& options, - std::string lang, - net::HostResolver* host_resolver, - ServerInformation* server_list, - int server_count, - talk_base::FirewallManager* firewall, - bool proxy_only, - bool previous_login_successful) - : parent_(parent), - login_settings_(new LoginSettings(user_settings, - options, - lang, - host_resolver, - server_list, - server_count, - firewall, - proxy_only)), - single_attempt_(NULL), - successful_connection_(previous_login_successful), - state_(STATE_OPENING), - redirect_port_(0), - unexpected_disconnect_occurred_(false), - google_host_(user_settings.host()), - google_user_(user_settings.user()) { - // Hook up all the signals and observers. - net::NetworkChangeNotifier::AddObserver(this); - auto_reconnect_.SignalStartConnection.connect(this, - &Login::StartConnection); - auto_reconnect_.SignalTimerStartStop.connect( - this, - &Login::OnAutoReconnectTimerChange); - SignalClientStateChange.connect(&auto_reconnect_, - &AutoReconnect::OnClientStateChange); - SignalIdleChange.connect(&auto_reconnect_, - &AutoReconnect::set_idle); - SignalPowerSuspended.connect(&auto_reconnect_, - &AutoReconnect::OnPowerSuspend); - - // Then check the initial state of the connection. - CheckConnection(); -} - -// Defined so that the destructors are executed here (and the corresponding -// classes don't need to be included in the header file). -Login::~Login() { - if (single_attempt_) { - single_attempt_->Abort(); - single_attempt_ = NULL; - } - net::NetworkChangeNotifier::RemoveObserver(this); -} - -void Login::StartConnection() { - // If there is a server redirect, use it. - if (base::Time::Now() < - (redirect_time_ + - base::TimeDelta::FromMinutes(kRedirectTimeoutMinutes))) { - // Override server/port with redirect values. - DCHECK_NE(redirect_port_, 0); - net::HostPortPair server_override(redirect_server_, redirect_port_); - login_settings_->set_server_override(server_override); - } else { - login_settings_->clear_server_override(); - } - - if (single_attempt_) { - single_attempt_->Abort(); - single_attempt_ = NULL; - } - single_attempt_ = new SingleLoginAttempt(parent_, - login_settings_.get(), - successful_connection_); - - // Do the signaling hook-ups. - single_attempt_->SignalLoginFailure.connect(this, &Login::OnLoginFailure); - single_attempt_->SignalRedirect.connect(this, &Login::OnRedirect); - single_attempt_->SignalClientStateChange.connect( - this, - &Login::OnClientStateChange); - single_attempt_->SignalUnexpectedDisconnect.connect( - this, - &Login::OnUnexpectedDisconnect); - single_attempt_->SignalLogoff.connect( - this, - &Login::OnLogoff); - single_attempt_->SignalNeedAutoReconnect.connect( - this, - &Login::DoAutoReconnect); - SignalLogInput.repeat(single_attempt_->SignalLogInput); - SignalLogOutput.repeat(single_attempt_->SignalLogOutput); - - single_attempt_->Start(); -} - -const std::string& Login::google_host() const { - return google_host_; -} - -const std::string& Login::google_user() const { - return google_user_; -} - -const talk_base::ProxyInfo& Login::proxy() const { - return proxy_info_; -} - -void Login::OnLoginFailure(const LoginFailure& failure) { - auto_reconnect_.StopReconnectTimer(); - HandleClientStateChange(STATE_CLOSED); - SignalLoginFailure(failure); -} - -void Login::OnLogoff() { - HandleClientStateChange(STATE_CLOSED); -} - -void Login::OnClientStateChange(buzz::XmppEngine::State state) { - LoginConnectionState new_state = STATE_CLOSED; - - switch (state) { - case buzz::XmppEngine::STATE_NONE: - case buzz::XmppEngine::STATE_CLOSED: - // Ignore the closed state (because we may be trying the next dns entry). - // - // But we go to this state for other signals when there is no retry - // happening. - new_state = state_; - break; - - case buzz::XmppEngine::STATE_START: - case buzz::XmppEngine::STATE_OPENING: - new_state = STATE_OPENING; - break; - - case buzz::XmppEngine::STATE_OPEN: - new_state = STATE_OPENED; - break; - - default: - DCHECK(false); - break; - } - HandleClientStateChange(new_state); -} - -void Login::HandleClientStateChange(LoginConnectionState new_state) { - // Do we need to transition between the retrying and closed states? - if (auto_reconnect_.is_retrying()) { - if (new_state == STATE_CLOSED) { - new_state = STATE_RETRYING; - } - } else { - if (new_state == STATE_RETRYING) { - new_state = STATE_CLOSED; - } - } - - if (new_state != state_) { - state_ = new_state; - reset_unexpected_timer_.Stop(); - - if (state_ == STATE_OPENED) { - successful_connection_ = true; - - google_host_ = single_attempt_->xmpp_client()->jid().domain(); - google_user_ = single_attempt_->xmpp_client()->jid().node(); - proxy_info_ = single_attempt_->proxy(); - - reset_unexpected_timer_.Start( - base::TimeDelta::FromSeconds(kResetReconnectInfoDelaySec), - this, &Login::ResetUnexpectedDisconnect); - } - SignalClientStateChange(state_); - } -} - -void Login::OnAutoReconnectTimerChange() { - if (!single_attempt_ || !single_attempt_->xmpp_client()) { - HandleClientStateChange(STATE_CLOSED); - return; - } - OnClientStateChange(single_attempt_->xmpp_client()->GetState()); -} - -buzz::XmppClient* Login::xmpp_client() { - if (!single_attempt_) { - return NULL; - } - return single_attempt_->xmpp_client(); -} - -void Login::UseNextConnection() { - if (!single_attempt_) { - // Just in case, there is an obscure case that causes this to get called - // when there is no single_attempt_. - return; - } - single_attempt_->UseNextConnection(); -} - -void Login::UseCurrentConnection() { - if (!single_attempt_) { - // Just in case, there is an obscure case that causes this to get called - // when there is no single_attempt_. - return; - } - single_attempt_->UseCurrentConnection(); -} - -void Login::OnRedirect(const std::string& redirect_server, int redirect_port) { - DCHECK_NE(redirect_port_, 0); - - redirect_time_ = base::Time::Now(); - redirect_server_ = redirect_server; - redirect_port_ = redirect_port; - - // Drop the current connection, and start the login process again. - StartConnection(); -} - -void Login::OnUnexpectedDisconnect() { - reset_unexpected_timer_.Stop(); - - // Start the login process again. - if (unexpected_disconnect_occurred_) { - // If we already have received an unexpected disconnect recently, then our - // account may have be jailed due to abuse, so we shouldn't make the - // situation worse by trying really hard to reconnect. Instead, we'll do - // the autoreconnect route, which has exponential back-off. - DoAutoReconnect(); - return; - } - StartConnection(); - unexpected_disconnect_occurred_ = true; -} - -void Login::ResetUnexpectedDisconnect() { - unexpected_disconnect_occurred_ = false; -} - -void Login::DoAutoReconnect() { - bool allow_auto_reconnect = - login_settings_->connection_options().auto_reconnect(); - // Start the reconnect time before aborting the connection to ensure that - // AutoReconnect::is_retrying() is true, so that the Login doesn't - // transition to the CLOSED state (which would cause the reconnection timer - // to reset and not double). - if (allow_auto_reconnect) { - auto_reconnect_.StartReconnectTimer(); - } - - if (single_attempt_) { - single_attempt_->Abort(); - single_attempt_ = NULL; - } - - if (!allow_auto_reconnect) { - HandleClientStateChange(STATE_CLOSED); - return; - } -} - -void Login::OnIPAddressChanged() { - LOG(INFO) << "IP address change detected"; - CheckConnection(); -} - -void Login::CheckConnection() { - LOG(INFO) << "Checking connection"; - talk_base::PhysicalSocketServer physical; - scoped_ptr<talk_base::Socket> socket(physical.CreateSocket(SOCK_STREAM)); - bool alive = - !socket->Connect(talk_base::SocketAddress("talk.google.com", 5222)); - LOG(INFO) << "Network is " << (alive ? "alive" : "not alive"); - if (alive) { - // Our connection is up. If we have a disconnect timer going, - // stop it so we don't disconnect. - disconnect_timer_.Stop(); - } else { - // Our network connection is down. Start the disconnect timer if - // it's not already going. Don't disconnect immediately to avoid - // constant connection/disconnection due to flaky network - // interfaces. - if (!disconnect_timer_.IsRunning()) { - disconnect_timer_.Start( - base::TimeDelta::FromSeconds(kDisconnectionDelaySecs), - this, &Login::OnDisconnectTimeout); - } - } - auto_reconnect_.NetworkStateChanged(alive); -} - -void Login::OnDisconnectTimeout() { - if (state_ != STATE_OPENED) { - return; - } - - if (single_attempt_) { - single_attempt_->Abort(); - single_attempt_ = NULL; - } - - StartConnection(); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/login.h b/chrome/common/net/notifier/communicator/login.h deleted file mode 100644 index eff1cc5..0000000 --- a/chrome/common/net/notifier/communicator/login.h +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_H_ - -#include <string> - -#include "base/time.h" -#include "base/timer.h" -#include "chrome/common/net/notifier/base/sigslotrepeater.h" -#include "chrome/common/net/notifier/communicator/auto_reconnect.h" -#include "chrome/common/net/notifier/communicator/login_connection_state.h" -#include "net/base/network_change_notifier.h" -#include "talk/base/proxyinfo.h" -#include "talk/base/scoped_ptr.h" -#include "talk/base/sigslot.h" -#include "talk/xmpp/xmppengine.h" - -namespace buzz { -class XmppClient; -class XmppEngine; -class XmppClientSettings; -} // namespace buzz - -namespace net { -class HostResolver; -} // namespace net - -namespace talk_base { -class FirewallManager; -struct ProxyInfo; -class TaskParent; -} // namespace talk_base - -namespace notifier { - -class ConnectionOptions; -class LoginFailure; -class LoginSettings; -struct ServerInformation; -class SingleLoginAttempt; - -// Does the login, keeps it alive (with refreshing cookies and reattempting -// login when disconnected), figures out what actions to take on the various -// errors that may occur. -class Login : public net::NetworkChangeNotifier::Observer, - public sigslot::has_slots<> { - public: - // network_status and firewall may be NULL. - Login(talk_base::TaskParent* parent, - const buzz::XmppClientSettings& user_settings, - const ConnectionOptions& options, - std::string lang, - net::HostResolver* host_resolver, - ServerInformation* server_list, - int server_count, - talk_base::FirewallManager* firewall, - bool proxy_only, - bool previous_login_successful); - virtual ~Login(); - - LoginConnectionState connection_state() const { - return state_; - } - - void StartConnection(); - void UseNextConnection(); - void UseCurrentConnection(); - buzz::XmppClient* xmpp_client(); - - // Start the auto-reconnect. It may not do the auto-reconnect if - // auto-reconnect is turned off. - void DoAutoReconnect(); - - const LoginSettings& login_settings() const { - return *(login_settings_.get()); - } - - // Returns the best guess at the host responsible for the account (which we - // use to determine if it is a dasher account or not). - // - // After login this may return a more accurate answer, which accounts for - // open sign-up accounts. - const std::string& google_host() const; - - // Analogous to google_host but for the user account ("fred" in - // "fred@gmail.com"). - const std::string& google_user() const; - - // Returns the proxy that is being used to connect (or the default proxy - // information if all attempted connections failed). - // - // Do not call until StartConnection has been called. - const talk_base::ProxyInfo& proxy() const; - - virtual void OnIPAddressChanged(); - - sigslot::signal1<LoginConnectionState> SignalClientStateChange; - - sigslot::signal1<const LoginFailure&> SignalLoginFailure; - sigslot::repeater2<const char*, int> SignalLogInput; - sigslot::repeater2<const char*, int> SignalLogOutput; - sigslot::repeater1<bool> SignalIdleChange; - - // The creator should hook this up to a signal that indicates when the power - // is being suspended. - sigslot::repeater1<bool> SignalPowerSuspended; - - private: - void CheckConnection(); - - void OnRedirect(const std::string& redirect_server, int redirect_port); - void OnUnexpectedDisconnect(); - void OnClientStateChange(buzz::XmppEngine::State state); - void OnLoginFailure(const LoginFailure& failure); - void OnLogoff(); - void OnAutoReconnectTimerChange(); - - void HandleClientStateChange(LoginConnectionState new_state); - void ResetUnexpectedDisconnect(); - - void OnDisconnectTimeout(); - - talk_base::TaskParent* parent_; - scoped_ptr<LoginSettings> login_settings_; - AutoReconnect auto_reconnect_; - SingleLoginAttempt* single_attempt_; - bool successful_connection_; - - LoginConnectionState state_; - - // server redirect information - base::Time redirect_time_; - std::string redirect_server_; - int redirect_port_; - bool unexpected_disconnect_occurred_; - base::OneShotTimer<Login> reset_unexpected_timer_; - std::string google_host_; - std::string google_user_; - talk_base::ProxyInfo proxy_info_; - - base::OneShotTimer<Login> disconnect_timer_; - - DISALLOW_COPY_AND_ASSIGN(Login); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_H_ diff --git a/chrome/common/net/notifier/communicator/login_connection_state.h b/chrome/common/net/notifier/communicator/login_connection_state.h deleted file mode 100644 index cc57d62..0000000 --- a/chrome/common/net/notifier/communicator/login_connection_state.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// LoginConnectionState is an enum representing the state of the XMPP -// connection. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_CONNECTION_STATE_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_CONNECTION_STATE_H_ - -namespace notifier { - -enum LoginConnectionState { - STATE_CLOSED, - // Same as the closed state but indicates that a countdown is - // happening for auto-retrying the connection. - STATE_RETRYING, - STATE_OPENING, - STATE_OPENED, -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_CONNECTION_STATE_H_ diff --git a/chrome/common/net/notifier/communicator/login_failure.cc b/chrome/common/net/notifier/communicator/login_failure.cc deleted file mode 100644 index aed32bf..0000000 --- a/chrome/common/net/notifier/communicator/login_failure.cc +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/communicator/login_failure.h" - -#include "base/logging.h" - -namespace notifier { - -LoginFailure::LoginFailure(LoginError error) - : error_(error), - xmpp_error_(buzz::XmppEngine::ERROR_NONE), - subcode_(0) { -} - -LoginFailure::LoginFailure(LoginError error, - buzz::XmppEngine::Error xmpp_error, - int subcode) - : error_(error), - xmpp_error_(xmpp_error), - subcode_(subcode) { -} - -buzz::XmppEngine::Error LoginFailure::xmpp_error() const { - DCHECK_EQ(error_, XMPP_ERROR); - return xmpp_error_; -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/login_failure.h b/chrome/common/net/notifier/communicator/login_failure.h deleted file mode 100644 index 05505ce..0000000 --- a/chrome/common/net/notifier/communicator/login_failure.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_FAILURE_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_FAILURE_H_ - -#include "talk/xmpp/xmppengine.h" - -namespace notifier { - -class LoginFailure { - public: - enum LoginError { - // Check the xmpp_error for more information. - XMPP_ERROR, - - // If the certificate has expired, it usually means that the computer's - // clock isn't set correctly. - CERTIFICATE_EXPIRED_ERROR, - - // Apparently, there is a proxy that needs authentication information. - PROXY_AUTHENTICATION_ERROR, - }; - - explicit LoginFailure(LoginError error); - LoginFailure(LoginError error, - buzz::XmppEngine::Error xmpp_error, - int subcode); - - // Used as the first level of error information. - LoginError error() const { - return error_; - } - - // Returns the XmppEngine only. Valid if and only if error() == XMPP_ERROR. - // - // Handler should mimic logic from PhoneWindow::ShowConnectionError - // (except that the DiagnoseConnectionError has already been done). - buzz::XmppEngine::Error xmpp_error() const; - - private: - const LoginError error_; - const buzz::XmppEngine::Error xmpp_error_; - const int subcode_; -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_FAILURE_H_ diff --git a/chrome/common/net/notifier/communicator/login_settings.cc b/chrome/common/net/notifier/communicator/login_settings.cc deleted file mode 100644 index 23ea983..0000000 --- a/chrome/common/net/notifier/communicator/login_settings.cc +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <string> - -#include "chrome/common/net/notifier/communicator/login_settings.h" - -#include "base/logging.h" -#include "chrome/common/net/notifier/communicator/connection_options.h" -#include "chrome/common/net/notifier/communicator/xmpp_connection_generator.h" -#include "talk/base/common.h" -#include "talk/base/socketaddress.h" -#include "talk/xmpp/xmppclientsettings.h" - -namespace notifier { - -LoginSettings::LoginSettings(const buzz::XmppClientSettings& user_settings, - const ConnectionOptions& options, - const std::string& lang, - net::HostResolver* host_resolver, - ServerInformation* server_list, - int server_count, - talk_base::FirewallManager* firewall, - bool proxy_only) - : proxy_only_(proxy_only), - firewall_(firewall), - lang_(lang), - host_resolver_(host_resolver), - server_list_(new ServerInformation[server_count]), - server_count_(server_count), - user_settings_(new buzz::XmppClientSettings(user_settings)), - connection_options_(new ConnectionOptions(options)) { - // Note: firewall may be NULL. - DCHECK(server_list); - DCHECK(host_resolver); - DCHECK_GT(server_count, 0); - for (int i = 0; i < server_count_; ++i) { - server_list_[i] = server_list[i]; - } -} - -// Defined so that the destructors are executed here (and the corresponding -// classes don't need to be included in the header file). -LoginSettings::~LoginSettings() { -} - -void LoginSettings::set_server_override( - const net::HostPortPair& server) { - server_override_.reset(new ServerInformation()); - server_override_->server = server; - server_override_->special_port_magic = server_list_[0].special_port_magic; -} - -void LoginSettings::clear_server_override() { - server_override_.reset(); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/login_settings.h b/chrome/common/net/notifier/communicator/login_settings.h deleted file mode 100644 index 90eae31..0000000 --- a/chrome/common/net/notifier/communicator/login_settings.h +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_SETTINGS_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_SETTINGS_H_ -#include <string> - -#include "chrome/common/net/notifier/communicator/xmpp_connection_generator.h" -#include "talk/base/scoped_ptr.h" - -namespace buzz { -class XmppClientSettings; -} - -namespace net { -struct HostPortPair; -class HostResolver; -} - -namespace talk_base { -class FirewallManager; -class SocketAddress; -} - -namespace notifier { -class ConnectionOptions; -struct ServerInformation; - -class LoginSettings { - public: - LoginSettings(const buzz::XmppClientSettings& user_settings, - const ConnectionOptions& options, - const std::string& lang, - net::HostResolver* host_resolver, - ServerInformation* server_list, - int server_count, - talk_base::FirewallManager* firewall, - bool proxy_only); - - ~LoginSettings(); - - // Note: firewall() may return NULL. - // - // Could be a const method, but it allows - // modification of part (FirewallManager) of its state. - talk_base::FirewallManager* firewall() { - return firewall_; - } - - bool proxy_only() const { - return proxy_only_; - } - - const std::string& lang() const { - return lang_; - } - - net::HostResolver* host_resolver() { - return host_resolver_; - } - - const ServerInformation* server_list() const { - return server_override_.get() ? server_override_.get() : server_list_.get(); - } - - int server_count() const { - return server_override_.get() ? 1 : server_count_; - } - - const buzz::XmppClientSettings& user_settings() const { - return *user_settings_.get(); - } - - buzz::XmppClientSettings* modifiable_user_settings() { - return user_settings_.get(); - } - - const ConnectionOptions& connection_options() const { - return *connection_options_.get(); - } - - void set_server_override(const net::HostPortPair& server); - void clear_server_override(); - - private: - bool proxy_only_; - talk_base::FirewallManager* firewall_; - std::string lang_; - - net::HostResolver* host_resolver_; - talk_base::scoped_array<ServerInformation> server_list_; - int server_count_; - // Used to handle redirects - scoped_ptr<ServerInformation> server_override_; - - scoped_ptr<buzz::XmppClientSettings> user_settings_; - scoped_ptr<ConnectionOptions> connection_options_; - DISALLOW_COPY_AND_ASSIGN(LoginSettings); -}; -} // namespace notifier -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_LOGIN_SETTINGS_H_ diff --git a/chrome/common/net/notifier/communicator/product_info.cc b/chrome/common/net/notifier/communicator/product_info.cc deleted file mode 100644 index c1deafb..0000000 --- a/chrome/common/net/notifier/communicator/product_info.cc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <string> - -namespace notifier { -std::string GetUserAgentString() { - return kXmppProductName; -} - -std::string GetProductSignature() { - return kXmppProductName; -} -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/product_info.h b/chrome/common/net/notifier/communicator/product_info.h deleted file mode 100644 index 6144122..0000000 --- a/chrome/common/net/notifier/communicator/product_info.h +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_PRODUCT_INFO_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_PRODUCT_INFO_H_ - -#include <string> - -namespace notifier { -std::string GetUserAgentString(); -std::string GetProductSignature(); -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_PRODUCT_INFO_H_ diff --git a/chrome/common/net/notifier/communicator/single_login_attempt.cc b/chrome/common/net/notifier/communicator/single_login_attempt.cc deleted file mode 100644 index 7781c38..0000000 --- a/chrome/common/net/notifier/communicator/single_login_attempt.cc +++ /dev/null @@ -1,517 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <algorithm> -#include <string> -#include <vector> - -#include "chrome/common/net/notifier/communicator/single_login_attempt.h" - -#include "base/logging.h" -#include "chrome/common/net/notifier/communicator/connection_options.h" -#include "chrome/common/net/notifier/communicator/connection_settings.h" -#include "chrome/common/net/notifier/communicator/const_communicator.h" -#include "chrome/common/net/notifier/communicator/gaia_token_pre_xmpp_auth.h" -#include "chrome/common/net/notifier/communicator/login_failure.h" -#include "chrome/common/net/notifier/communicator/login_settings.h" -#include "chrome/common/net/notifier/communicator/product_info.h" -#include "chrome/common/net/notifier/communicator/xmpp_connection_generator.h" -#include "chrome/common/net/notifier/communicator/xmpp_socket_adapter.h" -#include "talk/base/asynchttprequest.h" -#include "talk/base/firewallsocketserver.h" -#include "talk/base/signalthread.h" -#include "talk/base/taskrunner.h" -#include "talk/base/win32socketinit.h" -#include "talk/xmllite/xmlelement.h" -#include "talk/xmpp/xmppclient.h" -#include "talk/xmpp/xmppclientsettings.h" -#include "talk/xmpp/constants.h" - -namespace notifier { - -static void GetClientErrorInformation( - buzz::XmppClient* client, - buzz::XmppEngine::Error* error, - int* subcode, - buzz::XmlElement** stream_error) { - DCHECK(client); - DCHECK(error); - DCHECK(subcode); - DCHECK(stream_error); - - *error = client->GetError(subcode); - - *stream_error = NULL; - if (*error == buzz::XmppEngine::ERROR_STREAM) { - const buzz::XmlElement* error_element = client->GetStreamError(); - if (error_element) { - *stream_error = new buzz::XmlElement(*error_element); - } - } -} - -SingleLoginAttempt::SingleLoginAttempt(talk_base::TaskParent* parent, - LoginSettings* login_settings, - bool successful_connection) - : talk_base::Task(parent), - state_(buzz::XmppEngine::STATE_NONE), - code_(buzz::XmppEngine::ERROR_NONE), - subcode_(0), - need_authentication_(false), - certificate_expired_(false), - cookie_refreshed_(false), - successful_connection_(successful_connection), - login_settings_(login_settings), - client_(NULL) { -#if defined(OS_WIN) - talk_base::EnsureWinsockInit(); -#endif - connection_generator_.reset(new XmppConnectionGenerator( - this, - login_settings_->host_resolver(), - &login_settings_->connection_options(), - login_settings_->proxy_only(), - login_settings_->server_list(), - login_settings_->server_count())); - - connection_generator_->SignalExhaustedSettings.connect( - this, - &SingleLoginAttempt::OnAttemptedAllConnections); - connection_generator_->SignalNewSettings.connect( - this, - &SingleLoginAttempt::DoLogin); -} - -SingleLoginAttempt::~SingleLoginAttempt() { - // If this assertion goes off, it means that "Stop()" didn't get called like - // it should have been. - DCHECK(!client_); -} - -bool SingleLoginAttempt::auto_reconnect() const { - return login_settings_->connection_options().auto_reconnect(); -} - -const talk_base::ProxyInfo& SingleLoginAttempt::proxy() const { - DCHECK(connection_generator_.get()); - return connection_generator_->proxy(); -} - -int SingleLoginAttempt::ProcessStart() { - DCHECK_EQ(GetState(), talk_base::Task::STATE_START); - connection_generator_->StartGenerating(); - - // After being started, this class is callback driven and does signaling from - // those callbacks (with checks to see if it is done if it may be called back - // from something that isn't a child task). - return talk_base::Task::STATE_BLOCKED; -} - -void SingleLoginAttempt::Stop() { - ClearClient(); - talk_base::Task::Stop(); - - // No more signals should happen after being stopped. This is needed because - // some of these signals happen due to other components doing signaling which - // may continue running even though this task is stopped. - SignalUnexpectedDisconnect.disconnect_all(); - SignalRedirect.disconnect_all(); - SignalLoginFailure.disconnect_all(); - SignalNeedAutoReconnect.disconnect_all(); - SignalClientStateChange.disconnect_all(); -} - -void SingleLoginAttempt::OnAttemptedAllConnections( - bool successfully_resolved_dns, - int first_dns_error) { - - // Maybe we needed proxy authentication? - if (need_authentication_) { - LoginFailure failure(LoginFailure::PROXY_AUTHENTICATION_ERROR); - SignalLoginFailure(failure); - return; - } - - if (certificate_expired_) { - LoginFailure failure(LoginFailure::CERTIFICATE_EXPIRED_ERROR); - SignalLoginFailure(failure); - return; - } - - if (!successfully_resolved_dns) { - code_ = buzz::XmppEngine::ERROR_SOCKET; - subcode_ = first_dns_error; - } - - LOG(INFO) << "Connection failed with error " << code_; - - // We were connected and we had a problem. - if (successful_connection_ && auto_reconnect()) { - SignalNeedAutoReconnect(); - // Expect to be deleted at this point. - return; - } - - DiagnoseConnectionError(); -} - -void SingleLoginAttempt::UseNextConnection() { - DCHECK(connection_generator_.get()); - ClearClient(); - connection_generator_->UseNextConnection(); -} - -void SingleLoginAttempt::UseCurrentConnection() { - DCHECK(connection_generator_.get()); - ClearClient(); - connection_generator_->UseCurrentConnection(); -} - -void SingleLoginAttempt::DoLogin( - const ConnectionSettings& connection_settings) { - if (client_) { - return; - } - - buzz::XmppClientSettings client_settings; - // Set the user settings portion. - *static_cast<buzz::XmppClientSettings*>(&client_settings) = - login_settings_->user_settings(); - // Fill in the rest of the client settings. - connection_settings.FillXmppClientSettings(&client_settings); - - client_ = new buzz::XmppClient(this); - SignalLogInput.repeat(client_->SignalLogInput); - SignalLogOutput.repeat(client_->SignalLogOutput); - - // Listen for connection progress. - client_->SignalStateChange.connect(this, - &SingleLoginAttempt::OnClientStateChange); - - // Transition to "start". - OnClientStateChange(buzz::XmppEngine::STATE_START); - // Start connecting. - client_->Connect(client_settings, login_settings_->lang(), - CreateSocket(client_settings), - CreatePreXmppAuth(client_settings)); - client_->Start(); -} - -void SingleLoginAttempt::OnAuthenticationError() { - // We can check this flag later if all connection options fail. - need_authentication_ = true; -} - -void SingleLoginAttempt::OnCertificateExpired() { - // We can check this flag later if all connection options fail. - certificate_expired_ = true; -} - -buzz::AsyncSocket* SingleLoginAttempt::CreateSocket( - const buzz::XmppClientSettings& xcs) { - bool allow_unverified_certs = - login_settings_->connection_options().allow_unverified_certs(); - XmppSocketAdapter* adapter = new XmppSocketAdapter(xcs, - allow_unverified_certs); - adapter->SignalAuthenticationError.connect( - this, - &SingleLoginAttempt::OnAuthenticationError); - if (login_settings_->firewall()) { - adapter->set_firewall(true); - } - return adapter; -} - -buzz::PreXmppAuth* SingleLoginAttempt::CreatePreXmppAuth( - const buzz::XmppClientSettings& xcs) { - buzz::Jid jid(xcs.user(), xcs.host(), buzz::STR_EMPTY); - return new GaiaTokenPreXmppAuth( - jid.Str(), xcs.auth_cookie(), xcs.token_service()); -} - -void SingleLoginAttempt::OnFreshAuthCookie(const std::string& auth_cookie) { - // Remember this is a fresh cookie. - cookie_refreshed_ = true; - - // TODO(sync): do the cookie logic (part of which is in the #if 0 below). - - // The following code is what PhoneWindow does for the equivalent method. -#if 0 - // Save cookie - AccountInfo current(account_history_.current()); - current.set_auth_cookie(auth_cookie); - account_history_.set_current(current); - - // Calc next time to refresh cookie, between 5 and 10 days. The cookie has - // 14 days of life; this gives at least 4 days of retries before the current - // cookie expires, maximizing the chance of having a valid cookie next time - // the connection servers go down. - FTULL now; - - // NOTE: The following line is win32. Address this when implementing this - // code (doing "the cookie logic"). - GetSystemTimeAsFileTime(&(now.ft)); - ULONGLONG five_days = (ULONGLONG)10000 * 1000 * 60 * 60 * 24 * 5; // 5 days - ULONGLONG random = (ULONGLONG)10000 * // get to 100 ns units - ((rand() % (5 * 24 * 60)) * (60 * 1000) + // random min. in 5 day period - (rand() % 1000) * 60); // random 1/1000th of a minute - next_cookie_refresh_ = now.ull + five_days + random; // 5-10 days -#endif -} - -void SingleLoginAttempt::DiagnoseConnectionError() { - switch (code_) { - case buzz::XmppEngine::ERROR_MISSING_USERNAME: - case buzz::XmppEngine::ERROR_NETWORK_TIMEOUT: - case buzz::XmppEngine::ERROR_DOCUMENT_CLOSED: - case buzz::XmppEngine::ERROR_BIND: - case buzz::XmppEngine::ERROR_AUTH: - case buzz::XmppEngine::ERROR_TLS: - case buzz::XmppEngine::ERROR_UNAUTHORIZED: - case buzz::XmppEngine::ERROR_VERSION: - case buzz::XmppEngine::ERROR_STREAM: - case buzz::XmppEngine::ERROR_XML: - case buzz::XmppEngine::ERROR_NONE: - default: { - LoginFailure failure(LoginFailure::XMPP_ERROR, code_, subcode_); - SignalLoginFailure(failure); - return; - } - - // The following errors require diagnosistics: - // * spurious close of connection - // * socket errors after auth - case buzz::XmppEngine::ERROR_CONNECTION_CLOSED: - case buzz::XmppEngine::ERROR_SOCKET: - break; - } - - talk_base::AsyncHttpRequest *http_request = - new talk_base::AsyncHttpRequest(GetUserAgentString()); - http_request->set_host("www.google.com"); - http_request->set_port(80); - http_request->set_secure(false); - http_request->request().path = "/"; - http_request->request().verb = talk_base::HV_GET; - - talk_base::ProxyInfo proxy; - DCHECK(connection_generator_.get()); - if (connection_generator_.get()) { - proxy = connection_generator_->proxy(); - } - http_request->set_proxy(proxy); - http_request->set_firewall(login_settings_->firewall()); - - http_request->SignalWorkDone.connect(this, - &SingleLoginAttempt::OnHttpTestDone); - http_request->Start(); - http_request->Release(); -} - -void SingleLoginAttempt::OnHttpTestDone(talk_base::SignalThread* thread) { - DCHECK(thread); - - talk_base::AsyncHttpRequest* request = - static_cast<talk_base::AsyncHttpRequest*>(thread); - - if (request->response().scode == 200) { - // We were able to do an HTTP GET of www.google.com:80 - - // - // The original error should be reported - // - LoginFailure failure(LoginFailure::XMPP_ERROR, code_, subcode_); - SignalLoginFailure(failure); - return; - } - - // Otherwise lets transmute the error into ERROR_SOCKET, and put the subcode - // as an indicator of what we think the problem might be. - -#if 0 - // TODO(sync): determine if notifier has an analogous situation. - - // - // We weren't able to do an HTTP GET of www.google.com:80 - // - GAutoupdater::Version version_logged_in(g_options.version_logged_in()); - GAutoupdater::Version version_installed(GetProductVersion().c_str()); - if (version_logged_in < version_installed) { - // - // Google Talk has been updated and can no longer connect to the Google - // Talk Service. Your firewall is probably not allowing the new version of - // Google Talk to connect to the internet. Please adjust your firewall - // settings to allow the new version of Google Talk to connect to the - // internet. - // - // We'll use the "error=1" to help figure this out for now. - // - LoginFailure failure(LoginFailure::XMPP_ERROR, - buzz::XmppEngine::ERROR_SOCKET, - 1); - SignalLoginFailure(failure); - return; - } -#endif - - // - // Any other checking we can add here? - // - - // - // Google Talk is unable to use your internet connection. Either your network - // isn't configured or Google Talk is being blocked by a local firewall. - // - // We'll use the "error=0" to help figure this out for now - // - LoginFailure failure(LoginFailure::XMPP_ERROR, - buzz::XmppEngine::ERROR_SOCKET, - 0); - SignalLoginFailure(failure); -} - -void SingleLoginAttempt::OnClientStateChange(buzz::XmppEngine::State state) { - if (state_ == state) - return; - - buzz::XmppEngine::State previous_state = state_; - state_ = state; - - switch (state) { - case buzz::XmppEngine::STATE_NONE: - case buzz::XmppEngine::STATE_START: - case buzz::XmppEngine::STATE_OPENING: - // Do nothing. - break; - case buzz::XmppEngine::STATE_OPEN: - successful_connection_ = true; - break; - case buzz::XmppEngine::STATE_CLOSED: - OnClientStateChangeClosed(previous_state); - break; - } - SignalClientStateChange(state); - if (state_ == buzz::XmppEngine::STATE_CLOSED) { - OnClientStateChange(buzz::XmppEngine::STATE_NONE); - } -} - -void SingleLoginAttempt::ClearClient() { - if (client_ != NULL) { - client_->Disconnect(); - - // If this assertion goes off, it means that the disconnect didn't occur - // properly. See SingleLoginAttempt::OnClientStateChange, - // case XmppEngine::STATE_CLOSED - DCHECK(!client_); - } -} - -void SingleLoginAttempt::OnClientStateChangeClosed( - buzz::XmppEngine::State previous_state) { - buzz::XmppEngine::Error error = buzz::XmppEngine::ERROR_NONE; - int error_subcode = 0; - buzz::XmlElement* stream_error_ptr; - GetClientErrorInformation(client_, - &error, - &error_subcode, - &stream_error_ptr); - scoped_ptr<buzz::XmlElement> stream_error(stream_error_ptr); - - client_->SignalStateChange.disconnect(this); - client_ = NULL; - - if (error == buzz::XmppEngine::ERROR_NONE) { - SignalLogoff(); - return; - } else if (previous_state == buzz::XmppEngine::STATE_OPEN) { - // Handler should attempt reconnect. - SignalUnexpectedDisconnect(); - return; - } else { - HandleConnectionError(error, error_subcode, stream_error.get()); - } -} - -void SingleLoginAttempt::HandleConnectionPasswordError() { - LOG(INFO) << "SingleLoginAttempt::HandleConnectionPasswordError"; - LoginFailure failure(LoginFailure::XMPP_ERROR, code_, subcode_); - SignalLoginFailure(failure); -} - -void SingleLoginAttempt::HandleConnectionError( - buzz::XmppEngine::Error code, - int subcode, - const buzz::XmlElement* stream_error) { - LOG(INFO) << "(" << code << ", " << subcode << ")"; - - // Save off the error code information, so we can use it to tell the user - // what went wrong if all else fails. - code_ = code; - subcode_ = subcode; - if ((code_ == buzz::XmppEngine::ERROR_UNAUTHORIZED) || - (code_ == buzz::XmppEngine::ERROR_MISSING_USERNAME)) { - // There was a problem with credentials (username/password). - HandleConnectionPasswordError(); - return; - } - - // Unexpected disconnect, - // Unreachable host, - // Or internal server binding error - - // All these are temporary problems, so continue reconnecting. - - // GaiaAuth signals this directly via SignalCertificateExpired, but - // SChannelAdapter propagates the error through SocketWindow as a socket - // error. - if (code_ == buzz::XmppEngine::ERROR_SOCKET && - subcode_ == SEC_E_CERT_EXPIRED) { - certificate_expired_ = true; - } - - login_settings_->modifiable_user_settings()->set_resource(""); - - // Look for stream::error server redirection stanza "see-other-host". - if (stream_error) { - const buzz::XmlElement* other = - stream_error->FirstNamed(buzz::QN_XSTREAM_SEE_OTHER_HOST); - if (other) { - const buzz::XmlElement* text = - stream_error->FirstNamed(buzz::QN_XSTREAM_TEXT); - if (text) { - // Yep, its a "stream:error" with "see-other-host" text, let's parse - // out the server:port, and then reconnect with that. - const std::string& redirect = text->BodyText(); - size_t colon = redirect.find(":"); - int redirect_port = kDefaultXmppPort; - std::string redirect_server; - if (colon == std::string::npos) { - redirect_server = redirect; - } else { - redirect_server = redirect.substr(0, colon); - const std::string& port_text = redirect.substr(colon + 1); - std::istringstream ist(port_text); - ist >> redirect_port; - } - // We never allow a redirect to port 0. - if (redirect_port == 0) { - redirect_port = kDefaultXmppPort; - } - SignalRedirect(redirect_server, redirect_port); - // May be deleted at this point. - return; - } - } - } - - DCHECK(connection_generator_.get()); - if (!connection_generator_.get()) { - return; - } - - // Iterate to the next possible connection (still trying to connect). - UseNextConnection(); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/single_login_attempt.h b/chrome/common/net/notifier/communicator/single_login_attempt.h deleted file mode 100644 index 245fa9d..0000000 --- a/chrome/common/net/notifier/communicator/single_login_attempt.h +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_SINGLE_LOGIN_ATTEMPT_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_SINGLE_LOGIN_ATTEMPT_H_ - -#include <string> - -#include "chrome/common/net/notifier/communicator/login.h" -#include "talk/base/scoped_ptr.h" -#include "talk/base/sigslot.h" -#include "talk/base/task.h" -#include "talk/xmpp/xmppengine.h" - -namespace buzz { -class AsyncSocket; -class PreXmppAuth; -class XmppClient; -class XmppClientSettings; -class XmppClientSettings; -} - -namespace talk_base { -class FirewallManager; -struct ProxyInfo; -class SignalThread; -class Task; -} - -namespace notifier { - -class ConnectionSettings; -class LoginFailure; -class LoginSettings; -struct ServerInformation; -class XmppConnectionGenerator; - -// Handles all of the aspects of a single login attempt (across multiple ip -// addresses) and maintainence. By containing this within one class, when -// another login attempt is made, this class will be disposed and all of the -// signalling for the previous login attempt will be cleaned up immediately. -// -// This is a task to allow for cleaning this up when a signal is being fired. -// Technically, delete this during the firing of a signal could work but it is -// fragile. -class SingleLoginAttempt : public talk_base::Task, public sigslot::has_slots<> { - public: - SingleLoginAttempt(talk_base::TaskParent* parent, - LoginSettings* login_settings, - bool successful_connection); - ~SingleLoginAttempt(); - virtual int ProcessStart(); - void UseNextConnection(); - void UseCurrentConnection(); - - buzz::XmppClient* xmpp_client() { - return client_; - } - - // Returns the proxy that is being used to connect (or the default proxy - // information if all attempted connections failed). - const talk_base::ProxyInfo& proxy() const; - - // Typically handled by creating a new SingleLoginAttempt and doing - // StartConnection. - sigslot::signal0<> SignalUnexpectedDisconnect; - - // Typically handled by storing the redirect for 5 seconds, and setting it - // into LoginSettings, then creating a new SingleLoginAttempt, and doing - // StartConnection. - // - // SignalRedirect(const std::string& redirect_server, int redirect_port); - sigslot::signal2<const std::string&, int> SignalRedirect; - - sigslot::signal0<> SignalNeedAutoReconnect; - - // SignalClientStateChange(buzz::XmppEngine::State new_state); - sigslot::signal1<buzz::XmppEngine::State> SignalClientStateChange; - - // See the LoginFailure for how to handle this. - sigslot::signal1<const LoginFailure&> SignalLoginFailure; - - // Sent when there is a graceful log-off (state goes to closed with no - // error). - sigslot::signal0<> SignalLogoff; - - sigslot::repeater2<const char*, int> SignalLogInput; - sigslot::repeater2<const char*, int> SignalLogOutput; - - protected: - virtual void Stop(); - - private: - void DoLogin(const ConnectionSettings& connection_settings); - buzz::AsyncSocket* CreateSocket(const buzz::XmppClientSettings& xcs); - static buzz::PreXmppAuth* CreatePreXmppAuth( - const buzz::XmppClientSettings& xcs); - - // Cleans up any xmpp client state to get ready for a new one. - void ClearClient(); - - void HandleConnectionError( - buzz::XmppEngine::Error code, - int subcode, - const buzz::XmlElement* stream_error); - void HandleConnectionPasswordError(); - - void DiagnoseConnectionError(); - void OnHttpTestDone(talk_base::SignalThread* thread); - - void OnAuthenticationError(); - void OnCertificateExpired(); - void OnFreshAuthCookie(const std::string& auth_cookie); - void OnClientStateChange(buzz::XmppEngine::State state); - void OnClientStateChangeClosed(buzz::XmppEngine::State previous_state); - void OnAttemptedAllConnections(bool successfully_resolved_dns, - int first_dns_error); - - bool auto_reconnect() const; - - buzz::XmppEngine::State state_; - buzz::XmppEngine::Error code_; - int subcode_; - bool need_authentication_; - bool certificate_expired_; - bool cookie_refreshed_; - bool successful_connection_; - LoginSettings* login_settings_; - buzz::XmppClient* client_; - scoped_ptr<XmppConnectionGenerator> connection_generator_; - - DISALLOW_COPY_AND_ASSIGN(SingleLoginAttempt); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_SINGLE_LOGIN_ATTEMPT_H_ diff --git a/chrome/common/net/notifier/communicator/ssl_socket_adapter.cc b/chrome/common/net/notifier/communicator/ssl_socket_adapter.cc deleted file mode 100644 index 9742283..0000000 --- a/chrome/common/net/notifier/communicator/ssl_socket_adapter.cc +++ /dev/null @@ -1,389 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/communicator/ssl_socket_adapter.h" - -#include "base/compiler_specific.h" -#include "base/message_loop.h" -#include "net/base/address_list.h" -#include "net/base/net_errors.h" -#include "net/base/ssl_config_service.h" -#include "net/base/sys_addrinfo.h" -#include "net/socket/client_socket_factory.h" -#include "net/url_request/url_request_context.h" - -namespace notifier { - -namespace { - -// Convert values from <errno.h> to values from "net/base/net_errors.h" -int MapPosixError(int err) { - // There are numerous posix error codes, but these are the ones we thus far - // find interesting. - switch (err) { - case EAGAIN: -#if EWOULDBLOCK != EAGAIN - case EWOULDBLOCK: -#endif - return net::ERR_IO_PENDING; - case ENETDOWN: - return net::ERR_INTERNET_DISCONNECTED; - case ETIMEDOUT: - return net::ERR_TIMED_OUT; - case ECONNRESET: - case ENETRESET: // Related to keep-alive - return net::ERR_CONNECTION_RESET; - case ECONNABORTED: - return net::ERR_CONNECTION_ABORTED; - case ECONNREFUSED: - return net::ERR_CONNECTION_REFUSED; - case EHOSTUNREACH: - case ENETUNREACH: - return net::ERR_ADDRESS_UNREACHABLE; - case EADDRNOTAVAIL: - return net::ERR_ADDRESS_INVALID; - case 0: - return net::OK; - default: - LOG(WARNING) << "Unknown error " << err << " mapped to net::ERR_FAILED"; - return net::ERR_FAILED; - } -} - -} // namespace - -SSLSocketAdapter* SSLSocketAdapter::Create(AsyncSocket* socket) { - return new SSLSocketAdapter(socket); -} - -SSLSocketAdapter::SSLSocketAdapter(AsyncSocket* socket) - : SSLAdapter(socket), - ignore_bad_cert_(false), - ALLOW_THIS_IN_INITIALIZER_LIST( - connected_callback_(this, &SSLSocketAdapter::OnConnected)), - ALLOW_THIS_IN_INITIALIZER_LIST( - io_callback_(this, &SSLSocketAdapter::OnIO)), - ssl_connected_(false), - state_(STATE_NONE) { - transport_socket_ = new TransportSocket(socket, this); -} - -int SSLSocketAdapter::StartSSL(const char* hostname, bool restartable) { - DCHECK(!restartable); - hostname_ = hostname; - - if (socket_->GetState() != Socket::CS_CONNECTED) { - state_ = STATE_SSL_WAIT; - return 0; - } else { - return BeginSSL(); - } -} - -int SSLSocketAdapter::BeginSSL() { - if (!MessageLoop::current()) { - // Certificate verification is done via the Chrome message loop. - // Without this check, if we don't have a chrome message loop the - // SSL connection just hangs silently. - LOG(DFATAL) << "Chrome message loop (needed by SSL certificate " - << "verification) does not exist"; - return net::ERR_UNEXPECTED; - } - - // SSLConfigService is not thread-safe, and the default values for SSLConfig - // are correct for us, so we don't use the config service to initialize this - // object. - net::SSLConfig ssl_config; - transport_socket_->set_addr(talk_base::SocketAddress(hostname_, 0)); - ssl_socket_.reset( - net::ClientSocketFactory::GetDefaultFactory()->CreateSSLClientSocket( - transport_socket_, hostname_.c_str(), ssl_config)); - - int result = ssl_socket_->Connect(&connected_callback_); - - if (result == net::ERR_IO_PENDING || result == net::OK) { - return 0; - } else { - LOG(ERROR) << "Could not start SSL: " << net::ErrorToString(result); - return result; - } -} - -int SSLSocketAdapter::Send(const void* buf, size_t len) { - if (!ssl_connected_) { - return AsyncSocketAdapter::Send(buf, len); - } else { - scoped_refptr<net::IOBuffer> transport_buf = new net::IOBuffer(len); - memcpy(transport_buf->data(), buf, len); - - int result = ssl_socket_->Write(transport_buf, len, NULL); - if (result == net::ERR_IO_PENDING) { - SetError(EWOULDBLOCK); - } - transport_buf = NULL; - return result; - } -} - -int SSLSocketAdapter::Recv(void* buf, size_t len) { - if (!ssl_connected_) { - return AsyncSocketAdapter::Recv(buf, len); - } - - switch (state_) { - case STATE_NONE: { - transport_buf_ = new net::IOBuffer(len); - int result = ssl_socket_->Read(transport_buf_, len, &io_callback_); - if (result >= 0) { - memcpy(buf, transport_buf_->data(), len); - } - - if (result == net::ERR_IO_PENDING) { - state_ = STATE_READ; - SetError(EWOULDBLOCK); - } else { - if (result < 0) { - SetError(result); - LOG(INFO) << "Socket error " << result; - } - transport_buf_ = NULL; - } - return result; - } - case STATE_READ_COMPLETE: - memcpy(buf, transport_buf_->data(), len); - transport_buf_ = NULL; - state_ = STATE_NONE; - return data_transferred_; - - case STATE_READ: - case STATE_WRITE: - case STATE_WRITE_COMPLETE: - case STATE_SSL_WAIT: - SetError(EWOULDBLOCK); - return -1; - - default: - NOTREACHED(); - break; - } - return -1; -} - -void SSLSocketAdapter::OnConnected(int result) { - if (result == net::OK) { - ssl_connected_ = true; - OnConnectEvent(this); - } else { - LOG(WARNING) << "OnConnected failed with error " << result; - } -} - -void SSLSocketAdapter::OnIO(int result) { - switch (state_) { - case STATE_READ: - state_ = STATE_READ_COMPLETE; - data_transferred_ = result; - AsyncSocketAdapter::OnReadEvent(this); - break; - case STATE_WRITE: - state_ = STATE_WRITE_COMPLETE; - data_transferred_ = result; - AsyncSocketAdapter::OnWriteEvent(this); - break; - case STATE_NONE: - case STATE_READ_COMPLETE: - case STATE_WRITE_COMPLETE: - case STATE_SSL_WAIT: - default: - NOTREACHED(); - break; - } -} - -void SSLSocketAdapter::OnReadEvent(talk_base::AsyncSocket* socket) { - if (!transport_socket_->OnReadEvent(socket)) - AsyncSocketAdapter::OnReadEvent(socket); -} - -void SSLSocketAdapter::OnWriteEvent(talk_base::AsyncSocket* socket) { - if (!transport_socket_->OnWriteEvent(socket)) - AsyncSocketAdapter::OnWriteEvent(socket); -} - -void SSLSocketAdapter::OnConnectEvent(talk_base::AsyncSocket* socket) { - if (state_ != STATE_SSL_WAIT) { - AsyncSocketAdapter::OnConnectEvent(socket); - } else { - state_ = STATE_NONE; - int result = BeginSSL(); - if (0 != result) { - // TODO(zork): Handle this case gracefully. - LOG(WARNING) << "BeginSSL() failed with " << result; - } - } -} - -TransportSocket::TransportSocket(talk_base::AsyncSocket* socket, - SSLSocketAdapter *ssl_adapter) - : connect_callback_(NULL), - read_callback_(NULL), - write_callback_(NULL), - read_buffer_len_(0), - write_buffer_len_(0), - socket_(socket) { - socket_->SignalConnectEvent.connect(this, &TransportSocket::OnConnectEvent); -} - -int TransportSocket::Connect(net::CompletionCallback* callback) { - connect_callback_ = callback; - return socket_->Connect(addr_); -} - -void TransportSocket::Disconnect() { - socket_->Close(); -} - -bool TransportSocket::IsConnected() const { - return (socket_->GetState() == talk_base::Socket::CS_CONNECTED); -} - -bool TransportSocket::IsConnectedAndIdle() const { - // Not implemented. - NOTREACHED(); - return false; -} - -int TransportSocket::GetPeerAddress(net::AddressList* address) const { - talk_base::SocketAddress socket_address = socket_->GetRemoteAddress(); - - // libjingle supports only IPv4 addresses. - sockaddr_in ipv4addr; - socket_address.ToSockAddr(&ipv4addr); - - struct addrinfo ai; - memset(&ai, 0, sizeof(ai)); - ai.ai_family = ipv4addr.sin_family; - ai.ai_socktype = SOCK_STREAM; - ai.ai_protocol = IPPROTO_TCP; - ai.ai_addr = reinterpret_cast<struct sockaddr*>(&ipv4addr); - ai.ai_addrlen = sizeof(ipv4addr); - - address->Copy(&ai, false); - return net::OK; -} - -int TransportSocket::Read(net::IOBuffer* buf, int buf_len, - net::CompletionCallback* callback) { - DCHECK(buf); - DCHECK(!read_callback_); - DCHECK(!read_buffer_.get()); - int result = socket_->Recv(buf->data(), buf_len); - if (result < 0) { - result = MapPosixError(socket_->GetError()); - if (result == net::ERR_IO_PENDING) { - read_callback_ = callback; - read_buffer_ = buf; - read_buffer_len_ = buf_len; - } - } - return result; -} - -int TransportSocket::Write(net::IOBuffer* buf, int buf_len, - net::CompletionCallback* callback) { - DCHECK(buf); - DCHECK(!write_callback_); - DCHECK(!write_buffer_.get()); - int result = socket_->Send(buf->data(), buf_len); - if (result < 0) { - result = MapPosixError(socket_->GetError()); - if (result == net::ERR_IO_PENDING) { - write_callback_ = callback; - write_buffer_ = buf; - write_buffer_len_ = buf_len; - } - } - return result; -} - -bool TransportSocket::SetReceiveBufferSize(int32 size) { - // Not implemented. - return false; -} - -bool TransportSocket::SetSendBufferSize(int32 size) { - // Not implemented. - return false; -} - -void TransportSocket::OnConnectEvent(talk_base::AsyncSocket * socket) { - if (connect_callback_) { - net::CompletionCallback *callback = connect_callback_; - connect_callback_ = NULL; - callback->RunWithParams(Tuple1<int>(MapPosixError(socket_->GetError()))); - } else { - LOG(WARNING) << "OnConnectEvent called with no callback."; - } -} - -bool TransportSocket::OnReadEvent(talk_base::AsyncSocket* socket) { - if (read_callback_) { - DCHECK(read_buffer_.get()); - net::CompletionCallback* callback = read_callback_; - scoped_refptr<net::IOBuffer> buffer = read_buffer_; - int buffer_len = read_buffer_len_; - - read_callback_ = NULL; - read_buffer_ = NULL; - read_buffer_len_ = 0; - - int result = socket_->Recv(buffer->data(), buffer_len); - if (result < 0) { - result = MapPosixError(socket_->GetError()); - if (result == net::ERR_IO_PENDING) { - read_callback_ = callback; - read_buffer_ = buffer; - read_buffer_len_ = buffer_len; - return true; - } - } - callback->RunWithParams(Tuple1<int>(result)); - return true; - } else { - LOG(WARNING) << "OnReadEvent called with no callback."; - return false; - } -} - -bool TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { - if (write_callback_) { - DCHECK(write_buffer_.get()); - net::CompletionCallback* callback = write_callback_; - scoped_refptr<net::IOBuffer> buffer = write_buffer_; - int buffer_len = write_buffer_len_; - - write_callback_ = NULL; - write_buffer_ = NULL; - write_buffer_len_ = 0; - - int result = socket_->Send(buffer->data(), buffer_len); - if (result < 0) { - result = MapPosixError(socket_->GetError()); - if (result == net::ERR_IO_PENDING) { - write_callback_ = callback; - write_buffer_ = buffer; - write_buffer_len_ = buffer_len; - return true; - } - } - callback->RunWithParams(Tuple1<int>(result)); - return true; - } else { - LOG(WARNING) << "OnWriteEvent called with no callback."; - return false; - } -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/ssl_socket_adapter.h b/chrome/common/net/notifier/communicator/ssl_socket_adapter.h deleted file mode 100644 index bbb0961..0000000 --- a/chrome/common/net/notifier/communicator/ssl_socket_adapter.h +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_SSL_SOCKET_ADAPTER_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_SSL_SOCKET_ADAPTER_H_ - -#include "base/scoped_ptr.h" -#include "net/base/completion_callback.h" -#include "net/base/io_buffer.h" -#include "net/base/net_errors.h" -#include "net/base/net_log.h" -#include "net/socket/client_socket.h" -#include "net/socket/ssl_client_socket.h" -#include "talk/base/asyncsocket.h" -#include "talk/base/ssladapter.h" - -namespace notifier { - -class SSLSocketAdapter; - -// This class provides a wrapper to libjingle's talk_base::AsyncSocket that -// implements Chromium's net::ClientSocket interface. It's used by -// SSLSocketAdapter to enable Chromium's SSL implementation to work over -// libjingle's socket class. -class TransportSocket : public net::ClientSocket, public sigslot::has_slots<> { - public: - TransportSocket(talk_base::AsyncSocket* socket, - SSLSocketAdapter *ssl_adapter); - - void set_addr(const talk_base::SocketAddress& addr) { - addr_ = addr; - } - - // net::ClientSocket implementation - - virtual int Connect(net::CompletionCallback* callback); - virtual void Disconnect(); - virtual bool IsConnected() const; - virtual bool IsConnectedAndIdle() const; - virtual int GetPeerAddress(net::AddressList* address) const; - virtual const net::BoundNetLog& NetLog() const { return net_log_; } - - // net::Socket implementation - - virtual int Read(net::IOBuffer* buf, int buf_len, - net::CompletionCallback* callback); - virtual int Write(net::IOBuffer* buf, int buf_len, - net::CompletionCallback* callback); - virtual bool SetReceiveBufferSize(int32 size); - virtual bool SetSendBufferSize(int32 size); - - private: - friend class SSLSocketAdapter; - - void OnConnectEvent(talk_base::AsyncSocket * socket); - bool OnReadEvent(talk_base::AsyncSocket * socket); - bool OnWriteEvent(talk_base::AsyncSocket * socket); - - net::CompletionCallback* connect_callback_; - net::CompletionCallback* read_callback_; - net::CompletionCallback* write_callback_; - - scoped_refptr<net::IOBuffer> read_buffer_; - int read_buffer_len_; - scoped_refptr<net::IOBuffer> write_buffer_; - int write_buffer_len_; - - net::BoundNetLog net_log_; - - talk_base::AsyncSocket *socket_; - talk_base::SocketAddress addr_; - - DISALLOW_COPY_AND_ASSIGN(TransportSocket); -}; - -// This provides a talk_base::AsyncSocketAdapter interface around Chromium's -// net::SSLClientSocket class. This allows notifier to use Chromium's SSL -// implementation instead of OpenSSL. -class SSLSocketAdapter : public talk_base::SSLAdapter { - public: - explicit SSLSocketAdapter(talk_base::AsyncSocket* socket); - - // StartSSL returns 0 if successful, or non-zero on failure. - // If StartSSL is called while the socket is closed or connecting, the SSL - // negotiation will begin as soon as the socket connects. - // - // restartable is not implemented, and must be set to false. - virtual int StartSSL(const char* hostname, bool restartable); - - // Create the default SSL adapter for this platform. - static SSLSocketAdapter* Create(AsyncSocket* socket); - - virtual int Send(const void* pv, size_t cb); - virtual int Recv(void* pv, size_t cb); - - private: - friend class TransportSocket; - - enum State { - STATE_NONE, - STATE_READ, - STATE_READ_COMPLETE, - STATE_WRITE, - STATE_WRITE_COMPLETE, - STATE_SSL_WAIT - }; - - void OnConnected(int result); - void OnIO(int result); - - void OnReadEvent(talk_base::AsyncSocket * socket); - void OnWriteEvent(talk_base::AsyncSocket * socket); - void OnConnectEvent(talk_base::AsyncSocket * socket); - - int BeginSSL(); - - bool ignore_bad_cert_; - std::string hostname_; - TransportSocket* transport_socket_; - scoped_ptr<net::SSLClientSocket> ssl_socket_; - net::CompletionCallbackImpl<SSLSocketAdapter> connected_callback_; - net::CompletionCallbackImpl<SSLSocketAdapter> io_callback_; - bool ssl_connected_; - State state_; - scoped_refptr<net::IOBuffer> transport_buf_; - int data_transferred_; - - DISALLOW_COPY_AND_ASSIGN(SSLSocketAdapter); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_SSL_SOCKET_ADAPTER_H_ diff --git a/chrome/common/net/notifier/communicator/xmpp_connection_generator.cc b/chrome/common/net/notifier/communicator/xmpp_connection_generator.cc deleted file mode 100644 index b9b1272..0000000 --- a/chrome/common/net/notifier/communicator/xmpp_connection_generator.cc +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// XmppConnectionGenerator does the following algorithm: -// proxy = ResolveProxyInformation(connection_options) -// for server in server_list -// get dns_addresses for server -// connection_list = (dns_addresses X connection methods X proxy).shuffle() -// for connection in connection_list -// yield connection - -#include "chrome/common/net/notifier/communicator/xmpp_connection_generator.h" - -#if defined(OS_WIN) -#include <winsock2.h> -#elif defined(OS_POSIX) -#include <arpa/inet.h> -#endif - -#include <vector> - -#include "base/callback.h" -#include "base/compiler_specific.h" -#include "base/logging.h" -#include "chrome/common/net/notifier/base/signal_thread_task.h" -#include "chrome/common/net/notifier/communicator/connection_options.h" -#include "chrome/common/net/notifier/communicator/connection_settings.h" -#include "chrome/common/net/notifier/communicator/product_info.h" -#include "net/base/net_errors.h" -#include "net/base/sys_addrinfo.h" -#include "talk/base/httpcommon-inl.h" -#include "talk/base/task.h" -#include "talk/base/thread.h" -#include "talk/xmpp/prexmppauth.h" -#include "talk/xmpp/xmppclientsettings.h" -#include "talk/xmpp/xmppengine.h" - -namespace notifier { - -XmppConnectionGenerator::XmppConnectionGenerator( - talk_base::Task* parent, - const scoped_refptr<net::HostResolver>& host_resolver, - const ConnectionOptions* options, - bool proxy_only, - const ServerInformation* server_list, - int server_count) - : host_resolver_(host_resolver), - resolve_callback_( - ALLOW_THIS_IN_INITIALIZER_LIST( - NewCallback(this, - &XmppConnectionGenerator::OnServerDNSResolved))), - settings_list_(new ConnectionSettingsList()), - settings_index_(0), - server_list_(new ServerInformation[server_count]), - server_count_(server_count), - server_index_(-1), - proxy_only_(proxy_only), - successfully_resolved_dns_(false), - first_dns_error_(0), - options_(options), - parent_(parent) { - DCHECK(host_resolver); - DCHECK(parent); - DCHECK(options); - DCHECK_GT(server_count_, 0); - for (int i = 0; i < server_count_; ++i) { - server_list_[i] = server_list[i]; - } -} - -XmppConnectionGenerator::~XmppConnectionGenerator() { - LOG(INFO) << "XmppConnectionGenerator::~XmppConnectionGenerator"; -} - -const talk_base::ProxyInfo& XmppConnectionGenerator::proxy() const { - DCHECK(settings_list_.get()); - if (settings_index_ >= settings_list_->GetCount()) { - return settings_list_->proxy(); - } - - ConnectionSettings* settings = settings_list_->GetSettings(settings_index_); - return settings->proxy(); -} - -// Starts resolving proxy information. -void XmppConnectionGenerator::StartGenerating() { - LOG(INFO) << "XmppConnectionGenerator::StartGenerating"; - - // TODO(akalin): Detect proxy settings once we use Chrome sockets. - - // Start iterating through the connections (which are generated on demand). - UseNextConnection(); -} - -void XmppConnectionGenerator::UseNextConnection() { - DCHECK(settings_list_.get()); - // Loop until we can use a connection or we run out of connections - // to try. - while (true) { - // Iterate to the next possible connection. - settings_index_++; - if (settings_index_ < settings_list_->GetCount()) { - // We have more connection settings in the settings_list_ to - // try, kick off the next one. - UseCurrentConnection(); - return; - } - - // Iterate to the next possible server. - server_index_++; - if (server_index_ >= server_count_) { - // All out of possibilities. - HandleExhaustedConnections(); - return; - } - - // Resolve the server. - const net::HostPortPair& server = - server_list_[server_index_].server; - net::HostResolver::RequestInfo request_info( - server.host, server.port); - int status = - host_resolver_.Resolve( - request_info, &address_list_, resolve_callback_.get(), - bound_net_log_); - if (status == net::ERR_IO_PENDING) { - // resolve_callback_ will call us when it's called. - return; - } - HandleServerDNSResolved(status); - } -} - -void XmppConnectionGenerator::OnServerDNSResolved(int status) { - DCHECK_NE(status, net::ERR_IO_PENDING); - HandleServerDNSResolved(status); - // Reenter loop. - UseNextConnection(); -} - -void XmppConnectionGenerator::HandleServerDNSResolved(int status) { - DCHECK_NE(status, net::ERR_IO_PENDING); - LOG(INFO) << "XmppConnectionGenerator::HandleServerDNSResolved"; - // Print logging info. - LOG(INFO) << " server: " - << server_list_[server_index_].server.ToString() - << ", error: " << status; - if (status != net::OK) { - if (first_dns_error_ == 0) { - first_dns_error_ = status; - } - return; - } - - // Slurp the addresses into a vector. - std::vector<uint32> ip_list; - for (const addrinfo* addr = address_list_.head(); - addr != NULL; addr = addr->ai_next) { - const sockaddr_in& sockaddr = - *reinterpret_cast<const sockaddr_in*>(addr->ai_addr); - uint32 ip = ntohl(sockaddr.sin_addr.s_addr); - ip_list.push_back(ip); - } - successfully_resolved_dns_ = !ip_list.empty(); - - for (int i = 0; i < static_cast<int>(ip_list.size()); ++i) { - LOG(INFO) - << " ip " << i << " : " - << talk_base::SocketAddress::IPToString(ip_list[i]); - } - - // Build the ip list. - DCHECK(settings_list_.get()); - settings_index_ = -1; - settings_list_->ClearPermutations(); - settings_list_->AddPermutations( - server_list_[server_index_].server.host, - ip_list, - server_list_[server_index_].server.port, - server_list_[server_index_].special_port_magic, - proxy_only_); -} - -static const char* const PROTO_NAMES[cricket::PROTO_LAST + 1] = { - "udp", "tcp", "ssltcp" -}; - -static const char* ProtocolToString(cricket::ProtocolType proto) { - return PROTO_NAMES[proto]; -} - -void XmppConnectionGenerator::UseCurrentConnection() { - LOG(INFO) << "XmppConnectionGenerator::UseCurrentConnection"; - - ConnectionSettings* settings = settings_list_->GetSettings(settings_index_); - LOG(INFO) << "*** Attempting " - << ProtocolToString(settings->protocol()) << " connection to " - << settings->server().IPAsString() << ":" - << settings->server().port() - << " (via " << ProxyToString(settings->proxy().type) - << " proxy @ " << settings->proxy().address.IPAsString() << ":" - << settings->proxy().address.port() << ")"; - - SignalNewSettings(*settings); -} - -void XmppConnectionGenerator::HandleExhaustedConnections() { - LOG(INFO) << "(" << buzz::XmppEngine::ERROR_SOCKET - << ", " << first_dns_error_ << ")"; - SignalExhaustedSettings(successfully_resolved_dns_, first_dns_error_); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/xmpp_connection_generator.h b/chrome/common/net/notifier/communicator/xmpp_connection_generator.h deleted file mode 100644 index 1f9dfaa..0000000 --- a/chrome/common/net/notifier/communicator/xmpp_connection_generator.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_XMPP_CONNECTION_GENERATOR_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_XMPP_CONNECTION_GENERATOR_H_ - -#include <vector> - -#include "base/ref_counted.h" -#include "net/base/address_list.h" -#include "net/base/completion_callback.h" -#include "net/base/host_port_pair.h" -#include "net/base/host_resolver.h" -#include "net/base/net_log.h" -#include "talk/base/scoped_ptr.h" -#include "talk/base/sigslot.h" - -namespace talk_base { -struct ProxyInfo; -class SignalThread; -class Task; -} - -namespace notifier { - -class ConnectionOptions; -class ConnectionSettings; -class ConnectionSettingsList; - -struct ServerInformation { - net::HostPortPair server; - bool special_port_magic; -}; - -// Resolves dns names and iterates through the various ip address and transport -// combinations. -class XmppConnectionGenerator : public sigslot::has_slots<> { - public: - // parent is the parent for any tasks needed during this operation. - // proxy_only indicates if true connections are only attempted using the - // proxy. - // server_list is the list of connections to attempt in priority order. - // server_count is the number of items in the server list. - XmppConnectionGenerator( - talk_base::Task* parent, - const scoped_refptr<net::HostResolver>& host_resolver, - const ConnectionOptions* options, - bool proxy_only, - const ServerInformation* server_list, - int server_count); - ~XmppConnectionGenerator(); - - // Only call this once. Create a new XmppConnectionGenerator and delete the - // current one if the process needs to start again. - void StartGenerating(); - - void UseNextConnection(); - void UseCurrentConnection(); - - const talk_base::ProxyInfo& proxy() const; - - sigslot::signal1<const ConnectionSettings&> SignalNewSettings; - - // SignalExhaustedSettings(bool successfully_resolved_dns, - // int first_dns_error); - sigslot::signal2<bool, int> SignalExhaustedSettings; - - private: - void OnServerDNSResolved(int status); - void HandleServerDNSResolved(int status); - void HandleExhaustedConnections(); - - net::SingleRequestHostResolver host_resolver_; - scoped_ptr<net::CompletionCallback> resolve_callback_; - net::AddressList address_list_; - net::BoundNetLog bound_net_log_; - talk_base::scoped_ptr<ConnectionSettingsList> settings_list_; - int settings_index_; // The setting that is currently being used. - talk_base::scoped_array<ServerInformation> server_list_; - int server_count_; - int server_index_; // The server that is current being used. - bool proxy_only_; - bool successfully_resolved_dns_; - int first_dns_error_; - const ConnectionOptions* options_; - - talk_base::Task* parent_; - DISALLOW_COPY_AND_ASSIGN(XmppConnectionGenerator); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_XMPP_CONNECTION_GENERATOR_H_ diff --git a/chrome/common/net/notifier/communicator/xmpp_socket_adapter.cc b/chrome/common/net/notifier/communicator/xmpp_socket_adapter.cc deleted file mode 100644 index 7fe2b17..0000000 --- a/chrome/common/net/notifier/communicator/xmpp_socket_adapter.cc +++ /dev/null @@ -1,429 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/communicator/xmpp_socket_adapter.h" - -#include <iomanip> -#include <string> - -#include "base/logging.h" -#include "chrome/common/net/notifier/base/ssl_adapter.h" -#include "chrome/common/net/notifier/communicator/product_info.h" -#include "talk/base/byteorder.h" -#include "talk/base/common.h" -#include "talk/base/firewallsocketserver.h" -#include "talk/base/logging.h" -#include "talk/base/socketadapters.h" -#include "talk/base/ssladapter.h" -#include "talk/base/thread.h" -#include "talk/xmpp/xmppengine.h" - -namespace notifier { - -XmppSocketAdapter::XmppSocketAdapter(const buzz::XmppClientSettings& xcs, - bool allow_unverified_certs) - : state_(STATE_CLOSED), - error_(ERROR_NONE), - wsa_error_(0), - socket_(NULL), - protocol_(xcs.protocol()), - firewall_(false), - write_buffer_(NULL), - write_buffer_length_(0), - write_buffer_capacity_(0), - allow_unverified_certs_(allow_unverified_certs) { - proxy_.type = xcs.proxy(); - proxy_.address.SetIP(xcs.proxy_host()); - proxy_.address.SetPort(xcs.proxy_port()); - proxy_.username = xcs.proxy_user(); - proxy_.password = xcs.proxy_pass(); -} - -XmppSocketAdapter::~XmppSocketAdapter() { - FreeState(); - - // Clean up any previous socket - cannot delete socket on close because close - // happens during the child socket's stack callback. - if (socket_) { - delete socket_; - socket_ = NULL; - } -} - -bool XmppSocketAdapter::FreeState() { - int code = 0; - - // Clean up the socket. - if (socket_ && !(state_ == STATE_CLOSED || state_ == STATE_CLOSING)) { - code = socket_->Close(); - } - - delete[] write_buffer_; - write_buffer_ = NULL; - write_buffer_length_ = 0; - write_buffer_capacity_ = 0; - - if (code) { - SetWSAError(code); - return false; - } - return true; -} - -bool XmppSocketAdapter::Connect(const talk_base::SocketAddress& addr) { - if (state_ != STATE_CLOSED) { - SetError(ERROR_WRONGSTATE); - return false; - } - - LOG(INFO) << "XmppSocketAdapter::Connect(" << addr.ToString() << ")"; - - // Clean up any previous socket - cannot delete socket on close because close - // happens during the child socket's stack callback. - if (socket_) { - delete socket_; - socket_ = NULL; - } - - talk_base::AsyncSocket* socket = - talk_base::Thread::Current()->socketserver()->CreateAsyncSocket( - SOCK_STREAM); - if (!socket) { - SetWSAError(WSA_NOT_ENOUGH_MEMORY); - return false; - } - - if (firewall_) { - // TODO(sync): Change this to make WSAAsyncSockets support current thread - // socket server. - talk_base::FirewallSocketServer* fw = - static_cast<talk_base::FirewallSocketServer*>( - talk_base::Thread::Current()->socketserver()); - socket = fw->WrapSocket(socket, SOCK_STREAM); - } - - if (proxy_.type) { - talk_base::AsyncSocket* proxy_socket = 0; - if (proxy_.type == talk_base::PROXY_SOCKS5) { - proxy_socket = new talk_base::AsyncSocksProxySocket( - socket, proxy_.address, proxy_.username, proxy_.password); - } else { - // Note: we are trying unknown proxies as HTTPS currently. - proxy_socket = new talk_base::AsyncHttpsProxySocket(socket, - GetUserAgentString(), proxy_.address, proxy_.username, - proxy_.password); - } - if (!proxy_socket) { - SetWSAError(WSA_NOT_ENOUGH_MEMORY); - delete socket; - return false; - } - socket = proxy_socket; // For our purposes the proxy is now the socket. - } - - if (protocol_ == cricket::PROTO_SSLTCP) { - talk_base::AsyncSocket *fake_ssl_socket = - new talk_base::AsyncSSLSocket(socket); - if (!fake_ssl_socket) { - SetWSAError(WSA_NOT_ENOUGH_MEMORY); - delete socket; - return false; - } - socket = fake_ssl_socket; // For our purposes the SSL socket is the socket. - } - -#if defined(FEATURE_ENABLE_SSL) - talk_base::SSLAdapter* ssl_adapter = notifier::CreateSSLAdapter(socket); - socket = ssl_adapter; // For our purposes the SSL adapter is the socket. -#endif - - socket->SignalReadEvent.connect(this, &XmppSocketAdapter::OnReadEvent); - socket->SignalWriteEvent.connect(this, &XmppSocketAdapter::OnWriteEvent); - socket->SignalConnectEvent.connect(this, &XmppSocketAdapter::OnConnectEvent); - socket->SignalCloseEvent.connect(this, &XmppSocketAdapter::OnCloseEvent); - - // The linux implementation of socket::Connect returns an error when the - // connect didn't complete yet. This can be distinguished from a failure - // because socket::IsBlocking is true. Perhaps, the linux implementation - // should be made to behave like the windows version which doesn't do this, - // but it seems to be a pattern with these methods that they return an error - // if the operation didn't complete in a sync fashion and one has to check - // IsBlocking to tell if was a "real" error. - if (socket->Connect(addr) == SOCKET_ERROR && !socket->IsBlocking()) { - SetWSAError(socket->GetError()); - delete socket; - return false; - } - - socket_ = socket; - state_ = STATE_CONNECTING; - return true; -} - -bool XmppSocketAdapter::Read(char* data, size_t len, size_t* len_read) { - if (len_read) - *len_read = 0; - - if (state_ <= STATE_CLOSING) { - SetError(ERROR_WRONGSTATE); - return false; - } - - DCHECK(socket_); - - if (IsOpen()) { - int result = socket_->Recv(data, len); - if (result < 0) { - if (!socket_->IsBlocking()) { - SetWSAError(socket_->GetError()); - return false; - } - - result = 0; - } - - if (len_read) - *len_read = result; - } - - return true; -} - -bool XmppSocketAdapter::Write(const char* data, size_t len) { - if (state_ <= STATE_CLOSING) { - // There may be data in a buffer that gets lost. Too bad! - SetError(ERROR_WRONGSTATE); - return false; - } - - DCHECK(socket_); - - size_t sent = 0; - - // Try an immediate write when there is no buffer and we aren't in SSL mode - // or opening the connection. - if (write_buffer_length_ == 0 && IsOpen()) { - int result = socket_->Send(data, len); - if (result < 0) { - if (!socket_->IsBlocking()) { - SetWSAError(socket_->GetError()); - return false; - } - result = 0; - } - - sent = static_cast<size_t>(result); - } - - // Buffer what we didn't send. - if (sent < len) { - QueueWriteData(data + sent, len - sent); - } - - // Service the socket right away to push the written data out in SSL mode. - return HandleWritable(); -} - -bool XmppSocketAdapter::Close() { - if (state_ == STATE_CLOSING) { - return false; // Avoid recursion, but not unexpected. - } - if (state_ == STATE_CLOSED) { - // In theory should not be trying to re-InternalClose. - SetError(ERROR_WRONGSTATE); - return false; - } - - // TODO(sync): deal with flushing close (flush, don't do reads, clean ssl). - - // If we've gotten to the point where we really do have a socket underneath - // then close it. It should call us back to tell us it is closed, and - // NotifyClose will be called. We indicate "closing" state so that we - // do not recusively try to keep closing the socket. - if (socket_) { - state_ = STATE_CLOSING; - socket_->Close(); - } - - // If we didn't get the callback, then we better make sure we signal - // closed. - if (state_ != STATE_CLOSED) { - // The socket was closed manually, not directly due to error. - if (error_ != ERROR_NONE) { - LOG(INFO) << "XmppSocketAdapter::Close - previous Error: " << error_ - << " WSAError: " << wsa_error_; - error_ = ERROR_NONE; - wsa_error_ = 0; - } - NotifyClose(); - } - return true; -} - -void XmppSocketAdapter::NotifyClose() { - if (state_ == STATE_CLOSED) { - SetError(ERROR_WRONGSTATE); - } else { - LOG(INFO) << "XmppSocketAdapter::NotifyClose - Error: " << error_ - << " WSAError: " << wsa_error_; - state_ = STATE_CLOSED; - SignalClosed(); - FreeState(); - } -} - -void XmppSocketAdapter::OnConnectEvent(talk_base::AsyncSocket *socket) { - if (state_ == STATE_CONNECTING) { - state_ = STATE_OPEN; - LOG(INFO) << "XmppSocketAdapter::OnConnectEvent - STATE_OPEN"; - SignalConnected(); -#if defined(FEATURE_ENABLE_SSL) - } else if (state_ == STATE_TLS_CONNECTING) { - state_ = STATE_TLS_OPEN; - LOG(INFO) << "XmppSocketAdapter::OnConnectEvent - STATE_TLS_OPEN"; - SignalSSLConnected(); - if (write_buffer_length_ > 0) { - HandleWritable(); - } -#endif // defined(FEATURE_ENABLE_SSL) - } else { - LOG(DFATAL) << "unexpected XmppSocketAdapter::OnConnectEvent state: " - << state_; - } -} - -void XmppSocketAdapter::OnReadEvent(talk_base::AsyncSocket *socket) { - HandleReadable(); -} - -void XmppSocketAdapter::OnWriteEvent(talk_base::AsyncSocket *socket) { - HandleWritable(); -} - -void XmppSocketAdapter::OnCloseEvent(talk_base::AsyncSocket *socket, - int error) { - LOG(INFO) << "XmppSocketAdapter::OnCloseEvent(" << error << ")"; - SetWSAError(error); - if (error == SOCKET_EACCES) { - SignalAuthenticationError(); // Proxy needs authentication. - } - NotifyClose(); -} - -#if defined(FEATURE_ENABLE_SSL) -bool XmppSocketAdapter::StartTls(const std::string& verify_host_name) { - if (state_ != STATE_OPEN) { - SetError(ERROR_WRONGSTATE); - return false; - } - - state_ = STATE_TLS_CONNECTING; - - DCHECK_EQ(write_buffer_length_, 0U); - - talk_base::SSLAdapter* ssl_adapter = - static_cast<talk_base::SSLAdapter*>(socket_); - - if (allow_unverified_certs_) { - ssl_adapter->set_ignore_bad_cert(true); - } - - if (ssl_adapter->StartSSL(verify_host_name.c_str(), false) != 0) { - state_ = STATE_OPEN; - SetError(ERROR_SSL); - return false; - } - - return true; -} -#endif // defined(FEATURE_ENABLE_SSL) - -void XmppSocketAdapter::QueueWriteData(const char* data, size_t len) { - // Expand buffer if needed. - if (write_buffer_length_ + len > write_buffer_capacity_) { - size_t new_capacity = 1024; - while (new_capacity < write_buffer_length_ + len) { - new_capacity = new_capacity * 2; - } - char* new_buffer = new char[new_capacity]; - DCHECK_LE(write_buffer_length_, 64000U); - memcpy(new_buffer, write_buffer_, write_buffer_length_); - delete[] write_buffer_; - write_buffer_ = new_buffer; - write_buffer_capacity_ = new_capacity; - } - - // Copy data into the end of buffer. - memcpy(write_buffer_ + write_buffer_length_, data, len); - write_buffer_length_ += len; -} - -void XmppSocketAdapter::FlushWriteQueue(Error* error, int* wsa_error) { - DCHECK(error); - DCHECK(wsa_error); - - size_t flushed = 0; - while (flushed < write_buffer_length_) { - int sent = socket_->Send(write_buffer_ + flushed, - static_cast<int>(write_buffer_length_ - flushed)); - if (sent < 0) { - if (!socket_->IsBlocking()) { - *error = ERROR_WINSOCK; - *wsa_error = socket_->GetError(); - } - break; - } - flushed += static_cast<size_t>(sent); - } - - // Remove flushed memory. - write_buffer_length_ -= flushed; - memmove(write_buffer_, write_buffer_ + flushed, write_buffer_length_); - - // When everything is flushed, deallocate the buffer if it's gotten big. - if (write_buffer_length_ == 0) { - if (write_buffer_capacity_ > 8192) { - delete[] write_buffer_; - write_buffer_ = NULL; - write_buffer_capacity_ = 0; - } - } -} - -void XmppSocketAdapter::SetError(Error error) { - if (error_ == ERROR_NONE) { - error_ = error; - } -} - -void XmppSocketAdapter::SetWSAError(int error) { - if (error_ == ERROR_NONE && error != 0) { - error_ = ERROR_WINSOCK; - wsa_error_ = error; - } -} - -bool XmppSocketAdapter::HandleReadable() { - if (!IsOpen()) - return false; - - SignalRead(); - return true; -} - -bool XmppSocketAdapter::HandleWritable() { - if (!IsOpen()) - return false; - - Error error = ERROR_NONE; - int wsa_error = 0; - FlushWriteQueue(&error, &wsa_error); - if (error != ERROR_NONE) { - Close(); - return false; - } - return true; -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/communicator/xmpp_socket_adapter.h b/chrome/common/net/notifier/communicator/xmpp_socket_adapter.h deleted file mode 100644 index e818173..0000000 --- a/chrome/common/net/notifier/communicator/xmpp_socket_adapter.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_XMPP_SOCKET_ADAPTER_H_ -#define CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_XMPP_SOCKET_ADAPTER_H_ - -#include <string> - -#include "talk/base/asyncsocket.h" -#include "talk/xmpp/asyncsocket.h" -#include "talk/xmpp/xmppclientsettings.h" -#include "talk/xmpp/xmppengine.h" - -#ifndef _WIN32 -// Additional errors used by us from Win32 headers. -#define SEC_E_CERT_EXPIRED static_cast<int>(0x80090328L) -#define WSA_NOT_ENOUGH_MEMORY ENOMEM -#endif - -namespace notifier { - -class XmppSocketAdapter : public buzz::AsyncSocket, - public sigslot::has_slots<> { - public: - XmppSocketAdapter(const buzz::XmppClientSettings& xcs, - bool allow_unverified_certs); - virtual ~XmppSocketAdapter(); - - virtual State state() { return state_; } - virtual Error error() { return error_; } - virtual int GetError() { return wsa_error_; } - - void set_firewall(bool firewall) { firewall_ = firewall; } - - virtual bool Connect(const talk_base::SocketAddress& addr); - virtual bool Read(char* data, size_t len, size_t* len_read); - virtual bool Write(const char* data, size_t len); - virtual bool Close(); - -#if defined(FEATURE_ENABLE_SSL) - bool StartTls(const std::string& domainname); - bool IsOpen() const { return state_ == STATE_OPEN - || state_ == STATE_TLS_OPEN; } -#else - bool IsOpen() const { return state_ == STATE_OPEN; } -#endif - - sigslot::signal0<> SignalAuthenticationError; - - private: - // Return false if the socket is closed. - bool HandleReadable(); - bool HandleWritable(); - - State state_; - Error error_; - int wsa_error_; - - talk_base::AsyncSocket* socket_; - cricket::ProtocolType protocol_; - talk_base::ProxyInfo proxy_; - bool firewall_; - char* write_buffer_; - size_t write_buffer_length_; - size_t write_buffer_capacity_; - bool allow_unverified_certs_; - - bool FreeState(); - void NotifyClose(); - - void OnReadEvent(talk_base::AsyncSocket* socket); - void OnWriteEvent(talk_base::AsyncSocket* socket); - void OnConnectEvent(talk_base::AsyncSocket* socket); - void OnCloseEvent(talk_base::AsyncSocket* socket, int error); - - void QueueWriteData(const char* data, size_t len); - void FlushWriteQueue(Error* error, int* wsa_error); - - void SetError(Error error); - void SetWSAError(int error); - DISALLOW_COPY_AND_ASSIGN(XmppSocketAdapter); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_COMMUNICATOR_XMPP_SOCKET_ADAPTER_H_ diff --git a/chrome/common/net/notifier/listener/listen_task.cc b/chrome/common/net/notifier/listener/listen_task.cc deleted file mode 100644 index 715eeb9..0000000 --- a/chrome/common/net/notifier/listener/listen_task.cc +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/listen_task.h" - -#include "base/logging.h" -#include "chrome/common/net/notifier/listener/notification_constants.h" -#include "chrome/common/net/notifier/listener/xml_element_util.h" -#include "talk/base/task.h" -#include "talk/xmllite/qname.h" -#include "talk/xmllite/xmlelement.h" -#include "talk/xmpp/xmppclient.h" -#include "talk/xmpp/constants.h" -#include "talk/xmpp/xmppengine.h" - -namespace notifier { - -ListenTask::ListenTask(Task* parent) - : buzz::XmppTask(parent, buzz::XmppEngine::HL_TYPE) { -} - -ListenTask::~ListenTask() { -} - -int ListenTask::ProcessStart() { - LOG(INFO) << "P2P: Listener task started."; - return STATE_RESPONSE; -} - -int ListenTask::ProcessResponse() { - LOG(INFO) << "P2P: Listener response received."; - const buzz::XmlElement* stanza = NextStanza(); - if (stanza == NULL) { - return STATE_BLOCKED; - } - // Acknowledge receipt of the notification to the buzz server. - scoped_ptr<buzz::XmlElement> response_stanza(MakeIqResult(stanza)); - SendStanza(response_stanza.get()); - - // TODO(akalin): Write unittests to cover this. - // Extract the service URL and service-specific data from the stanza. - // The response stanza has the following format. - // <iq from="{bare_jid}" to="{full_jid}" id="#" type="set"> - // <not:getAll xmlns:not="google:notifier"> - // <Timestamp long="#" xmlns=""/> - // <Result xmlns=""> - // <Id> - // <ServiceUrl data="{service_url}"/> - // <ServiceId data="{service_id}"/> - // </Id> - // <Timestamp long="#"/> - // <Content> - // <Priority int="#"/> - // <ServiceSpecificData data="{service_specific_data}"/> - // <RequireSubscription bool="true"/> - // </Content> - // <State> - // <Type int="#"/> - // <Read bool="{true/false}"/> - // </State> - // <ClientActive bool="{true/false}"/> - // </Result> - // </not:getAll> - // </iq> " - // Note that there can be multiple "Result" elements, so we need to loop - // through all of them. - bool update_signaled = false; - const buzz::XmlElement* get_all_element = - stanza->FirstNamed(buzz::QName("google:notifier", "getAll")); - if (get_all_element) { - const buzz::XmlElement* result_element = - get_all_element->FirstNamed( - buzz::QName(buzz::STR_EMPTY, "Result")); - while (result_element) { - IncomingNotificationData notification_data; - const buzz::XmlElement* id_element = - result_element->FirstNamed(buzz::QName(buzz::STR_EMPTY, "Id")); - if (id_element) { - const buzz::XmlElement* service_url_element = - id_element->FirstNamed( - buzz::QName(buzz::STR_EMPTY, "ServiceUrl")); - if (service_url_element) { - notification_data.service_url = service_url_element->Attr( - buzz::QName(buzz::STR_EMPTY, "data")); - } - } - const buzz::XmlElement* content_element = - result_element->FirstNamed( - buzz::QName(buzz::STR_EMPTY, "Content")); - if (content_element) { - const buzz::XmlElement* service_data_element = - content_element->FirstNamed( - buzz::QName(buzz::STR_EMPTY, "ServiceSpecificData")); - if (service_data_element) { - notification_data.service_specific_data = service_data_element->Attr( - buzz::QName(buzz::STR_EMPTY, "data")); - } - } - // Inform listeners that a notification has been received. - SignalUpdateAvailable(notification_data); - update_signaled = true; - // Now go to the next Result element - result_element = result_element->NextNamed( - buzz::QName(buzz::STR_EMPTY, "Result")); - } - } - if (!update_signaled) { - LOG(WARNING) << - "No getAll element or Result element found in response stanza"; - // Signal an empty update to preserve old behavior - SignalUpdateAvailable(IncomingNotificationData()); - } - return STATE_RESPONSE; -} - -bool ListenTask::HandleStanza(const buzz::XmlElement* stanza) { - LOG(INFO) << "P2P: Stanza received: " << XmlElementToString(*stanza); - // TODO(akalin): Do more verification on stanza depending on - // the sync notification method - if (IsValidNotification(stanza)) { - QueueStanza(stanza); - return true; - } - return false; -} - -bool ListenTask::IsValidNotification(const buzz::XmlElement* stanza) { - static const buzz::QName kQnNotifierGetAll( - kNotifierNamespace, "getAll"); - // An update notificaiton has the following form. - // <cli:iq from="{bare_jid}" to="{full_jid}" - // id="#" type="set" xmlns:cli="jabber:client"> - // <not:getAll xmlns:not="google:notifier"> - // <Timestamp long="#" xmlns=""/> - // </not:getAll> - // </cli:iq> - return - (MatchRequestIq(stanza, buzz::STR_SET, kQnNotifierGetAll) && - (stanza->Attr(buzz::QN_TO) == GetClient()->jid().Str()) && - (stanza->Attr(buzz::QN_FROM) == GetClient()->jid().BareJid().Str())); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/listen_task.h b/chrome/common/net/notifier/listener/listen_task.h deleted file mode 100644 index c4f2a6fa..0000000 --- a/chrome/common/net/notifier/listener/listen_task.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// This class listens for notifications from the talk service, and signals when -// they arrive. It checks all incoming stanza's to see if they look like -// notifications, and filters out those which are not valid. -// -// The task is deleted automatically by the buzz::XmppClient. This occurs in the -// destructor of TaskRunner, which is a superclass of buzz::XmppClient. - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_LISTEN_TASK_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_LISTEN_TASK_H_ - -#include "chrome/common/net/notifier/listener/notification_defines.h" -#include "talk/xmpp/xmpptask.h" - -namespace buzz { -class XmlElement; -class Jid; -} - -namespace notifier { - -class ListenTask : public buzz::XmppTask { - public: - explicit ListenTask(Task* parent); - virtual ~ListenTask(); - - // Overriden from buzz::XmppTask. - virtual int ProcessStart(); - virtual int ProcessResponse(); - virtual bool HandleStanza(const buzz::XmlElement* stanza); - - // Signal callback upon receipt of a notification. - // SignalUpdateAvailable(const IncomingNotificationData& data); - sigslot::signal1<const IncomingNotificationData&> SignalUpdateAvailable; - - private: - // Decide whether a notification should start a sync. We only validate that - // this notification came from our own Jid(). - bool IsValidNotification(const buzz::XmlElement* stanza); - - DISALLOW_COPY_AND_ASSIGN(ListenTask); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_LISTEN_TASK_H_ diff --git a/chrome/common/net/notifier/listener/mediator_thread.h b/chrome/common/net/notifier/listener/mediator_thread.h deleted file mode 100644 index f90a199..0000000 --- a/chrome/common/net/notifier/listener/mediator_thread.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// These methods should post messages to a queue which a different thread will -// later come back and read from. - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_MEDIATOR_THREAD_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_MEDIATOR_THREAD_H_ - -#include <string> -#include <vector> - -#include "chrome/common/net/notifier/listener/notification_defines.h" - -namespace buzz { -class XmppClientSettings; -} // namespace buzz - -namespace notifier { - -class MediatorThread { - public: - virtual ~MediatorThread() {} - - class Delegate { - public: - virtual ~Delegate() {} - - virtual void OnConnectionStateChange(bool logged_in) = 0; - - virtual void OnSubscriptionStateChange(bool subscribed) = 0; - - virtual void OnIncomingNotification( - const IncomingNotificationData& notification_data) = 0; - - virtual void OnOutgoingNotification() = 0; - }; - - // |delegate| can be NULL if we're shutting down. - // TODO(akalin): Handle messages during shutdown gracefully so that - // we don't have to deal with NULL delegates. - virtual void SetDelegate(Delegate* delegate) = 0; - virtual void Login(const buzz::XmppClientSettings& settings) = 0; - virtual void Logout() = 0; - virtual void Start() = 0; - virtual void SubscribeForUpdates( - const std::vector<std::string>& subscribed_services_list) = 0; - virtual void ListenForUpdates() = 0; - virtual void SendNotification(const OutgoingNotificationData& data) = 0; -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_MEDIATOR_THREAD_H_ diff --git a/chrome/common/net/notifier/listener/mediator_thread_impl.cc b/chrome/common/net/notifier/listener/mediator_thread_impl.cc deleted file mode 100644 index 13de806..0000000 --- a/chrome/common/net/notifier/listener/mediator_thread_impl.cc +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/mediator_thread_impl.h" - -#include "base/logging.h" -#include "base/message_loop.h" -#include "base/task.h" -#include "chrome/common/net/notifier/base/task_pump.h" -#include "chrome/common/net/notifier/communicator/connection_options.h" -#include "chrome/common/net/notifier/communicator/const_communicator.h" -#include "chrome/common/net/notifier/communicator/xmpp_connection_generator.h" -#include "chrome/common/net/notifier/listener/listen_task.h" -#include "chrome/common/net/notifier/listener/send_update_task.h" -#include "chrome/common/net/notifier/listener/subscribe_task.h" -#include "net/base/host_port_pair.h" -#include "net/base/host_resolver.h" -#include "talk/base/physicalsocketserver.h" -#include "talk/base/thread.h" -#include "talk/xmpp/xmppclient.h" -#include "talk/xmpp/xmppclientsettings.h" - -// We manage the lifetime of notifier::MediatorThreadImpl ourselves. -DISABLE_RUNNABLE_METHOD_REFCOUNT(notifier::MediatorThreadImpl); - -namespace notifier { - -MediatorThreadImpl::MediatorThreadImpl() - : delegate_(NULL), - parent_message_loop_(MessageLoop::current()), - worker_thread_("MediatorThread worker thread") { - DCHECK(parent_message_loop_); -} - -MediatorThreadImpl::~MediatorThreadImpl() { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); -} - -void MediatorThreadImpl::SetDelegate(Delegate* delegate) { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - delegate_ = delegate; -} - -void MediatorThreadImpl::Start() { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - // We create the worker thread as an IO thread in preparation for - // making this use Chrome sockets. - const base::Thread::Options options(MessageLoop::TYPE_IO, 0); - // TODO(akalin): Make this function return a bool and remove this - // CHECK(). - CHECK(worker_thread_.StartWithOptions(options)); - worker_message_loop()->PostTask( - FROM_HERE, - NewRunnableMethod(this, &MediatorThreadImpl::StartLibjingleThread)); -} - -void MediatorThreadImpl::StartLibjingleThread() { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - socket_server_.reset(new talk_base::PhysicalSocketServer()); - libjingle_thread_.reset(new talk_base::Thread()); - talk_base::ThreadManager::SetCurrent(libjingle_thread_.get()); - worker_message_loop()->PostTask( - FROM_HERE, - NewRunnableMethod(this, &MediatorThreadImpl::PumpLibjingleLoop)); -} - -void MediatorThreadImpl::StopLibjingleThread() { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - talk_base::ThreadManager::SetCurrent(NULL); - libjingle_thread_.reset(); - socket_server_.reset(); -} - -void MediatorThreadImpl::PumpLibjingleLoop() { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - // Pump the libjingle message loop 100ms at a time. - if (!libjingle_thread_.get()) { - // StopLibjingleThread() was called. - return; - } - libjingle_thread_->ProcessMessages(100); - worker_message_loop()->PostTask( - FROM_HERE, - NewRunnableMethod(this, &MediatorThreadImpl::PumpLibjingleLoop)); -} - -void MediatorThreadImpl::Login(const buzz::XmppClientSettings& settings) { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - worker_message_loop()->PostTask( - FROM_HERE, - NewRunnableMethod(this, &MediatorThreadImpl::DoLogin, settings)); -} - -void MediatorThreadImpl::Logout() { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - worker_message_loop()->PostTask( - FROM_HERE, - NewRunnableMethod(this, &MediatorThreadImpl::DoDisconnect)); - worker_message_loop()->PostTask( - FROM_HERE, - NewRunnableMethod(this, &MediatorThreadImpl::StopLibjingleThread)); - // TODO(akalin): Decomp this into a separate stop method. - worker_thread_.Stop(); - // Process any messages the worker thread may be posted on our - // thread. - bool old_state = parent_message_loop_->NestableTasksAllowed(); - parent_message_loop_->SetNestableTasksAllowed(true); - parent_message_loop_->RunAllPending(); - parent_message_loop_->SetNestableTasksAllowed(old_state); - // worker_thread_ should have cleaned all this up. - CHECK(!login_.get()); - CHECK(!pump_.get()); -} - -void MediatorThreadImpl::ListenForUpdates() { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - worker_message_loop()->PostTask( - FROM_HERE, - NewRunnableMethod(this, &MediatorThreadImpl::DoListenForUpdates)); -} - -void MediatorThreadImpl::SubscribeForUpdates( - const std::vector<std::string>& subscribed_services_list) { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - worker_message_loop()->PostTask( - FROM_HERE, - NewRunnableMethod(this, &MediatorThreadImpl::DoSubscribeForUpdates, - subscribed_services_list)); -} - -void MediatorThreadImpl::SendNotification( - const OutgoingNotificationData& data) { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - worker_message_loop()->PostTask( - FROM_HERE, - NewRunnableMethod(this, &MediatorThreadImpl::DoSendNotification, - data)); -} - -MessageLoop* MediatorThreadImpl::worker_message_loop() { - MessageLoop* current_message_loop = MessageLoop::current(); - DCHECK(current_message_loop); - MessageLoop* worker_message_loop = worker_thread_.message_loop(); - DCHECK(worker_message_loop); - DCHECK(current_message_loop == parent_message_loop_ || - current_message_loop == worker_message_loop); - return worker_message_loop; -} - -buzz::XmppClient* MediatorThreadImpl::xmpp_client() { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - DCHECK(login_.get()); - buzz::XmppClient* xmpp_client = login_->xmpp_client(); - DCHECK(xmpp_client); - return xmpp_client; -} - -void MediatorThreadImpl::DoLogin( - const buzz::XmppClientSettings& settings) { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - LOG(INFO) << "P2P: Thread logging into talk network."; - - // TODO(akalin): Use an existing HostResolver from somewhere (maybe - // the IOThread one). - host_resolver_ = net::CreateSystemHostResolver(); - - // Start a new pump for the login. - login_.reset(); - pump_.reset(new notifier::TaskPump()); - - notifier::ServerInformation server_list[2]; - int server_list_count = 2; - - // The default servers know how to serve over port 443 (that's the magic). - server_list[0].server = net::HostPortPair("talk.google.com", - notifier::kDefaultXmppPort); - server_list[0].special_port_magic = true; - server_list[1].server = net::HostPortPair("talkx.l.google.com", - notifier::kDefaultXmppPort); - server_list[1].special_port_magic = true; - - // Autodetect proxy is on by default. - notifier::ConnectionOptions options; - - // Language is not used in the stanza so we default to |en|. - std::string lang = "en"; - login_.reset(new notifier::Login(pump_.get(), - settings, - options, - lang, - host_resolver_.get(), - server_list, - server_list_count, - // talk_base::FirewallManager* is NULL. - NULL, - // Both the proxy and a non-proxy route - // will be attempted. - false, - // |previous_login_successful| is true - // because we have already done a - // successful gaia login at this point - // through another mechanism. - true)); - - login_->SignalClientStateChange.connect( - this, &MediatorThreadImpl::OnClientStateChangeMessage); - login_->SignalLoginFailure.connect( - this, &MediatorThreadImpl::OnLoginFailureMessage); - login_->StartConnection(); -} - -void MediatorThreadImpl::DoDisconnect() { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - LOG(INFO) << "P2P: Thread logging out of talk network."; - login_.reset(); - // Delete the old pump while on the thread to ensure that everything is - // cleaned-up in a predicatable manner. - pump_.reset(); - - host_resolver_ = NULL; -} - -void MediatorThreadImpl::DoSubscribeForUpdates( - const std::vector<std::string>& subscribed_services_list) { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - SubscribeTask* subscription = - new SubscribeTask(xmpp_client(), subscribed_services_list); - subscription->SignalStatusUpdate.connect( - this, - &MediatorThreadImpl::OnSubscriptionStateChange); - subscription->Start(); -} - -void MediatorThreadImpl::DoListenForUpdates() { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - ListenTask* listener = new ListenTask(xmpp_client()); - listener->SignalUpdateAvailable.connect( - this, - &MediatorThreadImpl::OnIncomingNotification); - listener->Start(); -} - -void MediatorThreadImpl::DoSendNotification( - const OutgoingNotificationData& data) { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - SendUpdateTask* task = new SendUpdateTask(xmpp_client(), data); - task->SignalStatusUpdate.connect( - this, - &MediatorThreadImpl::OnOutgoingNotification); - task->Start(); -} - -void MediatorThreadImpl::OnIncomingNotification( - const IncomingNotificationData& notification_data) { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - parent_message_loop_->PostTask( - FROM_HERE, - NewRunnableMethod( - this, - &MediatorThreadImpl::OnIncomingNotificationOnParentThread, - notification_data)); -} - -void MediatorThreadImpl::OnIncomingNotificationOnParentThread( - const IncomingNotificationData& notification_data) { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - if (delegate_) { - delegate_->OnIncomingNotification(notification_data); - } -} - -void MediatorThreadImpl::OnOutgoingNotification(bool success) { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - parent_message_loop_->PostTask( - FROM_HERE, - NewRunnableMethod( - this, - &MediatorThreadImpl::OnOutgoingNotificationOnParentThread, - success)); -} - -void MediatorThreadImpl::OnOutgoingNotificationOnParentThread( - bool success) { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - if (delegate_ && success) { - delegate_->OnOutgoingNotification(); - } -} - -void MediatorThreadImpl::OnLoginFailureMessage( - const notifier::LoginFailure& failure) { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - parent_message_loop_->PostTask( - FROM_HERE, - NewRunnableMethod( - this, - &MediatorThreadImpl::OnLoginFailureMessageOnParentThread, - failure)); -} - -void MediatorThreadImpl::OnLoginFailureMessageOnParentThread( - const notifier::LoginFailure& failure) { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - if (delegate_) { - delegate_->OnConnectionStateChange(false); - } -} - -void MediatorThreadImpl::OnClientStateChangeMessage( - LoginConnectionState state) { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - parent_message_loop_->PostTask( - FROM_HERE, - NewRunnableMethod( - this, - &MediatorThreadImpl::OnClientStateChangeMessageOnParentThread, - state)); -} - -void MediatorThreadImpl::OnClientStateChangeMessageOnParentThread( - LoginConnectionState state) { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - switch (state) { - case STATE_CLOSED: - if (delegate_) { - delegate_->OnConnectionStateChange(false); - } - break; - case STATE_RETRYING: - case STATE_OPENING: - LOG(INFO) << "P2P: Thread trying to connect."; - // Maybe first time logon, maybe intermediate network disruption. Assume - // the server went down, and lost our subscription for updates. - if (delegate_) { - delegate_->OnSubscriptionStateChange(false); - } - break; - case STATE_OPENED: - if (delegate_) { - delegate_->OnConnectionStateChange(true); - } - break; - default: - LOG(WARNING) << "P2P: Unknown client state change."; - break; - } -} - -void MediatorThreadImpl::OnSubscriptionStateChange(bool success) { - DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - parent_message_loop_->PostTask( - FROM_HERE, - NewRunnableMethod( - this, - &MediatorThreadImpl::OnSubscriptionStateChangeOnParentThread, - success)); -} - -void MediatorThreadImpl::OnSubscriptionStateChangeOnParentThread( - bool success) { - DCHECK_EQ(MessageLoop::current(), parent_message_loop_); - if (delegate_) { - delegate_->OnSubscriptionStateChange(success); - } -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/mediator_thread_impl.h b/chrome/common/net/notifier/listener/mediator_thread_impl.h deleted file mode 100644 index df83ebd..0000000 --- a/chrome/common/net/notifier/listener/mediator_thread_impl.h +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// This object runs on a thread and knows how to interpret messages sent by the -// talk mediator. The mediator posts messages to a queue which the thread polls -// (in a super class). -// -// Example usage: -// -// MediatorThread m = new MediatorThreadImpl(pass in stuff); -// m.start(); // Start the thread -// // Once the thread is started, you can do server stuff. -// m.Login(loginInformation); -// // Events happen, the mediator finds out through its pump more messages -// // are dispatched to the thread eventually we want to log out. -// m.Logout(); -// delete m; // Also stops the thread. - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_MEDIATOR_THREAD_IMPL_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_MEDIATOR_THREAD_IMPL_H_ - -#include <string> -#include <vector> - -#include "base/logging.h" -#include "base/ref_counted.h" -#include "base/scoped_ptr.h" -#include "base/thread.h" -#include "chrome/common/net/notifier/communicator/login.h" -#include "chrome/common/net/notifier/communicator/login_connection_state.h" -#include "chrome/common/net/notifier/communicator/login_failure.h" -#include "chrome/common/net/notifier/listener/mediator_thread.h" -#include "talk/base/sigslot.h" -#include "talk/xmpp/xmppclientsettings.h" - -class MessageLoop; - -namespace buzz { -class XmppClient; -} // namespace buzz - -namespace net { -class HostResolver; -} // namespace net - -namespace notifier { -class TaskPump; -} // namespace notifier - -namespace talk_base { -class SocketServer; -class Thread; -} // namespace talk_base - -namespace notifier { - -class MediatorThreadImpl - : public MediatorThread, - public sigslot::has_slots<> { - public: - MediatorThreadImpl(); - virtual ~MediatorThreadImpl(); - - virtual void SetDelegate(Delegate* delegate); - - // Start the thread. - virtual void Start(); - - // These are called from outside threads, by the talk mediator object. - // They add messages to a queue which we poll in this thread. - virtual void Login(const buzz::XmppClientSettings& settings); - virtual void Logout(); - virtual void ListenForUpdates(); - virtual void SubscribeForUpdates( - const std::vector<std::string>& subscribed_services_list); - virtual void SendNotification(const OutgoingNotificationData& data); - - protected: - // Should only be called after Start(). - MessageLoop* worker_message_loop(); - - // Should only be called after OnConnectionStateChange() is called - // on the delegate with true. - buzz::XmppClient* xmpp_client(); - - Delegate* delegate_; - MessageLoop* parent_message_loop_; - - private: - void StartLibjingleThread(); - void PumpLibjingleLoop(); - void StopLibjingleThread(); - - // Called from within the thread on internal events. - void DoLogin(const buzz::XmppClientSettings& settings); - void DoDisconnect(); - void DoSubscribeForUpdates( - const std::vector<std::string>& subscribed_services_list); - void DoListenForUpdates(); - void DoSendNotification( - const OutgoingNotificationData& data); - - // These handle messages indicating an event happened in the outside - // world. These are all called from the worker thread. - void OnIncomingNotification( - const IncomingNotificationData& notification_data); - void OnOutgoingNotification(bool success); - void OnLoginFailureMessage(const notifier::LoginFailure& failure); - void OnClientStateChangeMessage(LoginConnectionState state); - void OnSubscriptionStateChange(bool success); - - // Equivalents of the above functions called from the parent thread. - void OnIncomingNotificationOnParentThread( - const IncomingNotificationData& notification_data); - void OnOutgoingNotificationOnParentThread(bool success); - void OnLoginFailureMessageOnParentThread( - const notifier::LoginFailure& failure); - void OnClientStateChangeMessageOnParentThread( - LoginConnectionState state); - void OnSubscriptionStateChangeOnParentThread( - bool success); - - base::Thread worker_thread_; - scoped_refptr<net::HostResolver> host_resolver_; - - // All buzz::XmppClients are owned by their parent. The root parent is the - // SingleLoginTask created by the notifier::Login object. This in turn is - // owned by the TaskPump. They are destroyed either when processing is - // complete or the pump shuts down. - scoped_ptr<notifier::TaskPump> pump_; - scoped_ptr<notifier::Login> login_; - - scoped_ptr<talk_base::SocketServer> socket_server_; - scoped_ptr<talk_base::Thread> libjingle_thread_; - - DISALLOW_COPY_AND_ASSIGN(MediatorThreadImpl); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_MEDIATOR_THREAD_IMPL_H_ diff --git a/chrome/common/net/notifier/listener/mediator_thread_mock.h b/chrome/common/net/notifier/listener/mediator_thread_mock.h deleted file mode 100644 index 62d739e..0000000 --- a/chrome/common/net/notifier/listener/mediator_thread_mock.h +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This is mock for delicious testing. -// It's very primitive, and it would have been better to use gmock, except -// that gmock is only for linux. - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_MEDIATOR_THREAD_MOCK_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_MEDIATOR_THREAD_MOCK_H_ - -#include <string> -#include <vector> - -#include "chrome/common/net/notifier/listener/mediator_thread.h" -#include "talk/xmpp/xmppclientsettings.h" - -namespace notifier { - -class MockMediatorThread : public MediatorThread { - public: - MockMediatorThread() : delegate_(NULL) { - Reset(); - } - - virtual ~MockMediatorThread() {} - - void Reset() { - login_calls = 0; - logout_calls = 0; - start_calls = 0; - subscribe_calls = 0; - listen_calls = 0; - send_calls = 0; - } - - virtual void SetDelegate(Delegate* delegate) { - delegate_ = delegate; - } - - // Overridden from MediatorThread - virtual void Login(const buzz::XmppClientSettings& settings) { - login_calls++; - if (delegate_) { - delegate_->OnConnectionStateChange(true); - } - } - - virtual void Logout() { - logout_calls++; - if (delegate_) { - delegate_->OnConnectionStateChange(false); - } - } - - virtual void Start() { - start_calls++; - } - - virtual void SubscribeForUpdates( - const std::vector<std::string>& subscribed_services_list) { - subscribe_calls++; - if (delegate_) { - delegate_->OnSubscriptionStateChange(true); - } - } - - virtual void ListenForUpdates() { - listen_calls++; - } - - virtual void SendNotification(const OutgoingNotificationData &) { - send_calls++; - if (delegate_) { - delegate_->OnOutgoingNotification(); - } - } - - void ReceiveNotification(const IncomingNotificationData& data) { - if (delegate_) { - delegate_->OnIncomingNotification(data); - } - } - - Delegate* delegate_; - // Intneral State - int login_calls; - int logout_calls; - int start_calls; - int subscribe_calls; - int listen_calls; - int send_calls; -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_MEDIATOR_THREAD_MOCK_H_ diff --git a/chrome/common/net/notifier/listener/notification_constants.cc b/chrome/common/net/notifier/listener/notification_constants.cc deleted file mode 100644 index cbfbe3f..0000000 --- a/chrome/common/net/notifier/listener/notification_constants.cc +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/notification_constants.h" - -namespace notifier { - -const char kNotifierNamespace[] = "google:notifier"; - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/notification_constants.h b/chrome/common/net/notifier/listener/notification_constants.h deleted file mode 100644 index 566dc90..0000000 --- a/chrome/common/net/notifier/listener/notification_constants.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_NOTIFICATION_CONSTANTS_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_NOTIFICATION_CONSTANTS_H_ - -namespace notifier { - -extern const char kNotifierNamespace[]; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_NOTIFICATION_CONSTANTS_H_ diff --git a/chrome/common/net/notifier/listener/notification_defines.h b/chrome/common/net/notifier/listener/notification_defines.h deleted file mode 100644 index a2c0b42..0000000 --- a/chrome/common/net/notifier/listener/notification_defines.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_NOTIFICATION_DEFINES_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_NOTIFICATION_DEFINES_H_ - -#include <string> - -struct IncomingNotificationData { - std::string service_url; - std::string service_specific_data; -}; - -struct OutgoingNotificationData { - OutgoingNotificationData() : send_content(false), priority(0), - require_subscription(false), - write_to_cache_only(false) { - } - // Id values - std::string service_url; - std::string service_id; - // This bool signifies whether the content fields should be - // sent with the outgoing data. - bool send_content; - // Content values. - std::string service_specific_data; - int priority; - bool require_subscription; - bool write_to_cache_only; -}; - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_NOTIFICATION_DEFINES_H_ - diff --git a/chrome/common/net/notifier/listener/send_update_task.cc b/chrome/common/net/notifier/listener/send_update_task.cc deleted file mode 100644 index eeeb0d1..0000000 --- a/chrome/common/net/notifier/listener/send_update_task.cc +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/send_update_task.h" - -#include <string> - -#include "base/logging.h" -#include "base/scoped_ptr.h" -#include "chrome/common/net/notifier/listener/notification_constants.h" -#include "chrome/common/net/notifier/listener/xml_element_util.h" -#include "talk/xmllite/qname.h" -#include "talk/xmpp/xmppclient.h" -#include "talk/xmpp/constants.h" - -namespace notifier { - -SendUpdateTask::SendUpdateTask(TaskParent* parent, - const OutgoingNotificationData& data) - : XmppTask(parent, buzz::XmppEngine::HL_SINGLE), // Watch for one reply. - notification_data_(data) { -} - -SendUpdateTask::~SendUpdateTask() { -} - -bool SendUpdateTask::HandleStanza(const buzz::XmlElement* stanza) { - if (!MatchResponseIq(stanza, GetClient()->jid().BareJid(), task_id())) - return false; - QueueStanza(stanza); - return true; -} - -int SendUpdateTask::ProcessStart() { - LOG(INFO) << "P2P: Notification task started."; - scoped_ptr<buzz::XmlElement> stanza( - MakeUpdateMessage(notification_data_, - GetClient()->jid().BareJid(), task_id())); - LOG(INFO) << "P2P: Notification stanza: " - << XmlElementToString(*stanza.get()); - - if (SendStanza(stanza.get()) != buzz::XMPP_RETURN_OK) { - // TODO(brg) : Retry on error. - // TODO(akalin): Or maybe immediately return STATE_ERROR and let - // retries happen a higher level. In any case, STATE_ERROR should - // eventually be returned. - SignalStatusUpdate(false); - return STATE_DONE; - } - return STATE_RESPONSE; -} - -int SendUpdateTask::ProcessResponse() { - LOG(INFO) << "P2P: Notification response received."; - const buzz::XmlElement* stanza = NextStanza(); - if (stanza == NULL) { - return STATE_BLOCKED; - } - LOG(INFO) << "P2P: Notification response: " << XmlElementToString(*stanza); - if (stanza->HasAttr(buzz::QN_TYPE) && - stanza->Attr(buzz::QN_TYPE) == buzz::STR_RESULT) { - // Notify listeners of success. - SignalStatusUpdate(true); - return STATE_DONE; - } - - // An error response was received. - // TODO(brg) : Error handling. - SignalStatusUpdate(false); - // TODO(akalin): This should be STATE_ERROR. - return STATE_DONE; -} - -buzz::XmlElement* SendUpdateTask::MakeUpdateMessage( - const OutgoingNotificationData& notification_data, - const buzz::Jid& to_jid_bare, const std::string& task_id) { - DCHECK(to_jid_bare.IsBare()); - static const buzz::QName kQnNotifierSet(kNotifierNamespace, "set"); - static const buzz::QName kQnId(buzz::STR_EMPTY, "Id"); - static const buzz::QName kQnContent(buzz::STR_EMPTY, "Content"); - - // Create our update stanza. The message is constructed as: - // <iq type='get' from='{fullJid}' to='{bareJid}' id='{#}'> - // <gn:set xmlns:gn="google:notifier" xmlns=""> - // <Id> - // <ServiceUrl data="{Service_Url}" /> - // <ServiceId data="{Service_Id}" /> - // </Id> - // If content needs to be sent, then the below element is added - // <Content> - // <Priority int="{Priority}" /> - // <RequireSubscription bool="{true/false}" /> - // <!-- If is_transitional is set, this is omitted. --> - // <ServiceSpecificData data="{ServiceData}" /> - // <WriteToCacheOnly bool="{true/false}" /> - // </Content> - // </set> - // </iq> - buzz::XmlElement* iq = MakeIq(buzz::STR_GET, to_jid_bare, task_id); - buzz::XmlElement* set = new buzz::XmlElement(kQnNotifierSet, true); - buzz::XmlElement* id = new buzz::XmlElement(kQnId, true); - iq->AddElement(set); - set->AddElement(id); - - id->AddElement(MakeStringXmlElement("ServiceUrl", - notification_data.service_url.c_str())); - id->AddElement(MakeStringXmlElement("ServiceId", - notification_data.service_id.c_str())); - - if (notification_data.send_content) { - buzz::XmlElement* content = new buzz::XmlElement(kQnContent, true); - set->AddElement(content); - content->AddElement(MakeIntXmlElement("Priority", - notification_data.priority)); - content->AddElement( - MakeBoolXmlElement("RequireSubscription", - notification_data.require_subscription)); - if (!notification_data.service_specific_data.empty()) { - content->AddElement( - MakeStringXmlElement("ServiceSpecificData", - notification_data.service_specific_data.c_str())); - } - content->AddElement( - MakeBoolXmlElement("WriteToCacheOnly", - notification_data.write_to_cache_only)); - } - return iq; -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/send_update_task.h b/chrome/common/net/notifier/listener/send_update_task.h deleted file mode 100644 index 2d78dfd..0000000 --- a/chrome/common/net/notifier/listener/send_update_task.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Methods for sending the update stanza to notify peers via xmpp. - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_SEND_UPDATE_TASK_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_SEND_UPDATE_TASK_H_ - -#include <string> - -#include "chrome/common/net/notifier/listener/notification_defines.h" -#include "talk/xmllite/xmlelement.h" -#include "talk/xmpp/xmpptask.h" -#include "testing/gtest/include/gtest/gtest_prod.h" - -namespace notifier { - -class SendUpdateTask : public buzz::XmppTask { - public: - SendUpdateTask(TaskParent* parent, const OutgoingNotificationData& data); - virtual ~SendUpdateTask(); - - // Overridden from buzz::XmppTask. - virtual int ProcessStart(); - virtual int ProcessResponse(); - virtual bool HandleStanza(const buzz::XmlElement* stanza); - - // Signal callback upon subscription success. - sigslot::signal1<bool> SignalStatusUpdate; - - private: - // Allocates and constructs an buzz::XmlElement containing the update stanza. - static buzz::XmlElement* MakeUpdateMessage( - const OutgoingNotificationData& notification_data, - const buzz::Jid& to_jid_bare, const std::string& task_id); - - OutgoingNotificationData notification_data_; - - FRIEND_TEST(SendUpdateTaskTest, MakeUpdateMessage); - - DISALLOW_COPY_AND_ASSIGN(SendUpdateTask); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_SEND_UPDATE_TASK_H_ diff --git a/chrome/common/net/notifier/listener/send_update_task_unittest.cc b/chrome/common/net/notifier/listener/send_update_task_unittest.cc deleted file mode 100644 index 85c1ba8..0000000 --- a/chrome/common/net/notifier/listener/send_update_task_unittest.cc +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/send_update_task.h" - -#include "base/logging.h" -#include "base/scoped_ptr.h" -#include "base/string_util.h" -#include "chrome/common/net/notifier/listener/xml_element_util.h" -#include "talk/xmpp/jid.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace buzz { -class XmlElement; -} - -namespace notifier { - -class SendUpdateTaskTest : public testing::Test { - public: - SendUpdateTaskTest() : to_jid_bare_("to@jid.com"), task_id_("taskid") { - EXPECT_EQ(to_jid_bare_.Str(), to_jid_bare_.BareJid().Str()); - } - - protected: - const buzz::Jid to_jid_bare_; - const std::string task_id_; - - private: - DISALLOW_COPY_AND_ASSIGN(SendUpdateTaskTest); -}; - -TEST_F(SendUpdateTaskTest, MakeUpdateMessage) { - OutgoingNotificationData data; - data.service_id = "test_service_id"; - data.service_url = "test_service_url"; - data.send_content = false; - data.priority = 200; - data.write_to_cache_only = true; - data.require_subscription = false; - - scoped_ptr<buzz::XmlElement> message_without_content( - SendUpdateTask::MakeUpdateMessage(data, to_jid_bare_, task_id_)); - - std::string expected_xml_string = - StringPrintf( - "<cli:iq type=\"get\" to=\"%s\" id=\"%s\" " - "xmlns:cli=\"jabber:client\">" - "<set xmlns=\"google:notifier\">" - "<Id xmlns=\"\">" - "<ServiceUrl xmlns=\"\" data=\"test_service_url\"/>" - "<ServiceId xmlns=\"\" data=\"test_service_id\"/>" - "</Id>" - "</set>" - "</cli:iq>", - to_jid_bare_.Str().c_str(), task_id_.c_str()); - EXPECT_EQ(expected_xml_string, XmlElementToString(*message_without_content)); - - data.send_content = true; - - expected_xml_string = - StringPrintf( - "<cli:iq type=\"get\" to=\"%s\" id=\"%s\" " - "xmlns:cli=\"jabber:client\">" - "<set xmlns=\"google:notifier\">" - "<Id xmlns=\"\">" - "<ServiceUrl xmlns=\"\" " - "data=\"test_service_url\"/>" - "<ServiceId xmlns=\"\" data=\"test_service_id\"/>" - "</Id>" - "<Content xmlns=\"\">" - "<Priority xmlns=\"\" int=\"200\"/>" - "<RequireSubscription xmlns=\"\" bool=\"false\"/>" - "<WriteToCacheOnly xmlns=\"\" bool=\"true\"/>" - "</Content>" - "</set>" - "</cli:iq>", - to_jid_bare_.Str().c_str(), task_id_.c_str()); - - scoped_ptr<buzz::XmlElement> message_with_content( - SendUpdateTask::MakeUpdateMessage(data, to_jid_bare_, task_id_)); - - EXPECT_EQ(expected_xml_string, XmlElementToString(*message_with_content)); - - data.service_specific_data = "test_service_specific_data"; - data.require_subscription = true; - - expected_xml_string = - StringPrintf( - "<cli:iq type=\"get\" to=\"%s\" id=\"%s\" " - "xmlns:cli=\"jabber:client\">" - "<set xmlns=\"google:notifier\">" - "<Id xmlns=\"\">" - "<ServiceUrl xmlns=\"\" " - "data=\"test_service_url\"/>" - "<ServiceId xmlns=\"\" data=\"test_service_id\"/>" - "</Id>" - "<Content xmlns=\"\">" - "<Priority xmlns=\"\" int=\"200\"/>" - "<RequireSubscription xmlns=\"\" bool=\"true\"/>" - "<ServiceSpecificData xmlns=\"\" " - "data=\"test_service_specific_data\"/>" - "<WriteToCacheOnly xmlns=\"\" bool=\"true\"/>" - "</Content>" - "</set>" - "</cli:iq>", - to_jid_bare_.Str().c_str(), task_id_.c_str()); - - scoped_ptr<buzz::XmlElement> message_with_data( - SendUpdateTask::MakeUpdateMessage(data, to_jid_bare_, task_id_)); - - EXPECT_EQ(expected_xml_string, XmlElementToString(*message_with_data)); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/subscribe_task.cc b/chrome/common/net/notifier/listener/subscribe_task.cc deleted file mode 100644 index ce12e54..0000000 --- a/chrome/common/net/notifier/listener/subscribe_task.cc +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/subscribe_task.h" - -#include <string> - -#include "base/logging.h" -#include "chrome/common/net/notifier/listener/notification_constants.h" -#include "chrome/common/net/notifier/listener/xml_element_util.h" -#include "talk/base/task.h" -#include "talk/xmllite/qname.h" -#include "talk/xmllite/xmlelement.h" -#include "talk/xmpp/xmppclient.h" -#include "talk/xmpp/constants.h" -#include "talk/xmpp/xmppengine.h" - -namespace notifier { - -SubscribeTask::SubscribeTask( - TaskParent* parent, - const std::vector<std::string>& subscribed_services_list) - : XmppTask(parent, buzz::XmppEngine::HL_SINGLE), - subscribed_services_list_(subscribed_services_list) { -} - -SubscribeTask::~SubscribeTask() { -} - -bool SubscribeTask::HandleStanza(const buzz::XmlElement* stanza) { - if (!MatchResponseIq(stanza, GetClient()->jid().BareJid(), task_id())) - return false; - QueueStanza(stanza); - return true; -} - -int SubscribeTask::ProcessStart() { - LOG(INFO) << "P2P: Subscription task started."; - scoped_ptr<buzz::XmlElement> iq_stanza( - MakeSubscriptionMessage(subscribed_services_list_, - GetClient()->jid().BareJid(), task_id())); - LOG(INFO) << "P2P: Subscription stanza: " - << XmlElementToString(*iq_stanza.get()); - - if (SendStanza(iq_stanza.get()) != buzz::XMPP_RETURN_OK) { - SignalStatusUpdate(false); - // TODO(akalin): This should be STATE_ERROR. - return STATE_DONE; - } - return STATE_RESPONSE; -} - -int SubscribeTask::ProcessResponse() { - LOG(INFO) << "P2P: Subscription response received."; - const buzz::XmlElement* stanza = NextStanza(); - if (stanza == NULL) { - return STATE_BLOCKED; - } - LOG(INFO) << "P2P: Subscription response: " << XmlElementToString(*stanza); - // We've receieved a response to our subscription request. - if (stanza->HasAttr(buzz::QN_TYPE) && - stanza->Attr(buzz::QN_TYPE) == buzz::STR_RESULT) { - SignalStatusUpdate(true); - return STATE_DONE; - } - // An error response was received. - // TODO(brg) : Error handling. - SignalStatusUpdate(false); - // TODO(akalin): This should be STATE_ERROR. - return STATE_DONE; -} - -buzz::XmlElement* SubscribeTask::MakeSubscriptionMessage( - const std::vector<std::string>& subscribed_services_list, - const buzz::Jid& to_jid_bare, const std::string& task_id) { - DCHECK(to_jid_bare.IsBare()); - static const buzz::QName kQnNotifierGetAll( - kNotifierNamespace, "getAll"); - - // Create the subscription stanza using the notifications protocol. - // <iq type='get' from='{fullJid}' to='{bareJid}' id='{#}'> - // <gn:getAll xmlns:gn="google:notifier" xmlns=""> - // <ClientActive bool="true" /> - // <!-- present only if subscribed_services_list is not empty --> - // <SubscribedServiceUrl data="google:notifier"> - // <SubscribedServiceUrl data="http://www.google.com/chrome/sync"> - // <FilterNonSubscribed bool="true" /> - // </gn:getAll> - // </iq> - - buzz::XmlElement* iq = MakeIq(buzz::STR_GET, to_jid_bare, task_id); - buzz::XmlElement* get_all = new buzz::XmlElement(kQnNotifierGetAll, true); - iq->AddElement(get_all); - - get_all->AddElement(MakeBoolXmlElement("ClientActive", true)); - for (std::vector<std::string>::const_iterator iter = - subscribed_services_list.begin(); - iter != subscribed_services_list.end(); ++iter) { - get_all->AddElement( - MakeStringXmlElement("SubscribedServiceUrl", iter->c_str())); - } - if (!subscribed_services_list.empty()) { - get_all->AddElement(MakeBoolXmlElement("FilterNonSubscribed", true)); - } - return iq; -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/subscribe_task.h b/chrome/common/net/notifier/listener/subscribe_task.h deleted file mode 100644 index 6d236ef..0000000 --- a/chrome/common/net/notifier/listener/subscribe_task.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// This class handles subscribing to talk notifications. It does the getAll iq -// stanza which establishes the endpoint and directs future notifications to be -// pushed. - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_SUBSCRIBE_TASK_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_SUBSCRIBE_TASK_H_ - -#include <string> -#include <vector> - -#include "talk/xmllite/xmlelement.h" -#include "talk/xmpp/xmpptask.h" -#include "testing/gtest/include/gtest/gtest_prod.h" - -namespace notifier { -// TODO(akalin): Remove NOTIFICATION_LEGACY and remove/refactor relevant code -// in this class and any other class that uses notification_method. -class SubscribeTask : public buzz::XmppTask { - public: - SubscribeTask(TaskParent* parent, - const std::vector<std::string>& subscribed_services_list); - virtual ~SubscribeTask(); - - // Overridden from XmppTask. - virtual int ProcessStart(); - virtual int ProcessResponse(); - virtual bool HandleStanza(const buzz::XmlElement* stanza); - - // Signal callback upon subscription success. - sigslot::signal1<bool> SignalStatusUpdate; - - private: - // Assembles an Xmpp stanza which can be sent to subscribe to notifications. - static buzz::XmlElement* MakeSubscriptionMessage( - const std::vector<std::string>& subscribed_services_list, - const buzz::Jid& to_jid_bare, const std::string& task_id); - - std::vector<std::string> subscribed_services_list_; - - FRIEND_TEST(SubscribeTaskTest, MakeSubscriptionMessage); - - DISALLOW_COPY_AND_ASSIGN(SubscribeTask); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_SUBSCRIBE_TASK_H_ diff --git a/chrome/common/net/notifier/listener/subscribe_task_unittest.cc b/chrome/common/net/notifier/listener/subscribe_task_unittest.cc deleted file mode 100644 index fb455b2..0000000 --- a/chrome/common/net/notifier/listener/subscribe_task_unittest.cc +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/subscribe_task.h" - -#include "base/logging.h" -#include "base/scoped_ptr.h" -#include "base/string_util.h" -#include "chrome/common/net/notifier/listener/xml_element_util.h" -#include "talk/xmpp/jid.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace buzz { -class XmlElement; -} - -namespace notifier { - -class SubscribeTaskTest : public testing::Test { - public: - SubscribeTaskTest() : to_jid_bare_("to@jid.com"), task_id_("taskid") { - EXPECT_EQ(to_jid_bare_.Str(), to_jid_bare_.BareJid().Str()); - } - - protected: - const buzz::Jid to_jid_bare_; - const std::string task_id_; - - private: - DISALLOW_COPY_AND_ASSIGN(SubscribeTaskTest); -}; - -TEST_F(SubscribeTaskTest, MakeSubscriptionMessage) { - std::vector<std::string> subscribed_services_list; - - scoped_ptr<buzz::XmlElement> message_without_services( - SubscribeTask::MakeSubscriptionMessage(subscribed_services_list, - to_jid_bare_, task_id_)); - std::string expected_xml_string = - StringPrintf( - "<cli:iq type=\"get\" to=\"%s\" id=\"%s\" " - "xmlns:cli=\"jabber:client\">" - "<getAll xmlns=\"google:notifier\">" - "<ClientActive xmlns=\"\" bool=\"true\"/>" - "</getAll>" - "</cli:iq>", - to_jid_bare_.Str().c_str(), task_id_.c_str()); - EXPECT_EQ(expected_xml_string, XmlElementToString(*message_without_services)); - - subscribed_services_list.push_back("test_service_url1"); - subscribed_services_list.push_back("test_service_url2"); - scoped_ptr<buzz::XmlElement> message_with_services( - SubscribeTask::MakeSubscriptionMessage(subscribed_services_list, - to_jid_bare_, task_id_)); - expected_xml_string = - StringPrintf( - "<cli:iq type=\"get\" to=\"%s\" id=\"%s\" " - "xmlns:cli=\"jabber:client\">" - "<getAll xmlns=\"google:notifier\">" - "<ClientActive xmlns=\"\" bool=\"true\"/>" - "<SubscribedServiceUrl " - "xmlns=\"\" data=\"test_service_url1\"/>" - "<SubscribedServiceUrl " - "xmlns=\"\" data=\"test_service_url2\"/>" - "<FilterNonSubscribed xmlns=\"\" bool=\"true\"/>" - "</getAll>" - "</cli:iq>", - to_jid_bare_.Str().c_str(), task_id_.c_str()); - - EXPECT_EQ(expected_xml_string, XmlElementToString(*message_with_services)); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/talk_mediator.h b/chrome/common/net/notifier/listener/talk_mediator.h deleted file mode 100644 index c842b1b..0000000 --- a/chrome/common/net/notifier/listener/talk_mediator.h +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Interface to the code which handles talk logic. Used to initialize SSL -// before the underlying talk login occurs. -// -// Example usage: -// -// TalkMediator mediator(); -// mediator.SetAuthToken("email", "token", "service_id"); -// mediator.Login(); -// ... -// mediator.Logout(); - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_TALK_MEDIATOR_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_TALK_MEDIATOR_H_ - -#include <string> - -#include "chrome/common/net/notifier/listener/notification_defines.h" - -namespace notifier { - -class TalkMediator { - public: - TalkMediator() {} - virtual ~TalkMediator() {} - - class Delegate { - public: - virtual ~Delegate() {} - - virtual void OnNotificationStateChange( - bool notifications_enabled) = 0; - - virtual void OnIncomingNotification( - const IncomingNotificationData& notification_data) = 0; - - virtual void OnOutgoingNotification() = 0; - }; - - // |delegate| may be NULL. - virtual void SetDelegate(Delegate* delegate) = 0; - - // The following methods are for authorizaiton of the xmpp client. - virtual bool SetAuthToken(const std::string& email, - const std::string& token, - const std::string& token_service) = 0; - virtual bool Login() = 0; - virtual bool Logout() = 0; - - // Method for the owner of this object to notify peers that an update has - // occurred. - virtual bool SendNotification(const OutgoingNotificationData& data) = 0; - - // Add a URL to subscribe to for notifications. - virtual void AddSubscribedServiceUrl(const std::string& service_url) = 0; -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_TALK_MEDIATOR_H_ diff --git a/chrome/common/net/notifier/listener/talk_mediator_impl.cc b/chrome/common/net/notifier/listener/talk_mediator_impl.cc deleted file mode 100644 index 6d5acf5..0000000 --- a/chrome/common/net/notifier/listener/talk_mediator_impl.cc +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/talk_mediator_impl.h" - -#include "base/logging.h" -#include "base/singleton.h" -#include "chrome/common/net/notifier/listener/mediator_thread_impl.h" -#include "talk/base/cryptstring.h" -#include "talk/base/ssladapter.h" -#include "talk/xmpp/xmppclientsettings.h" -#include "talk/xmpp/xmppengine.h" - -namespace notifier { - -// Before any authorization event from TalkMediatorImpl, we need to initialize -// the SSL library. -class SslInitializationSingleton { - public: - virtual ~SslInitializationSingleton() { - talk_base::CleanupSSL(); - }; - - void RegisterClient() {} - - static SslInitializationSingleton* GetInstance() { - return Singleton<SslInitializationSingleton>::get(); - } - - private: - friend struct DefaultSingletonTraits<SslInitializationSingleton>; - - SslInitializationSingleton() { - talk_base::InitializeSSL(); - }; - - DISALLOW_COPY_AND_ASSIGN(SslInitializationSingleton); -}; - -TalkMediatorImpl::TalkMediatorImpl( - MediatorThread* mediator_thread, - bool initialize_ssl, - bool connect_immediately, - bool invalidate_xmpp_auth_token) - : delegate_(NULL), - mediator_thread_(mediator_thread), - invalidate_xmpp_auth_token_(invalidate_xmpp_auth_token) { - DCHECK(non_thread_safe_.CalledOnValidThread()); - if (initialize_ssl) { - SslInitializationSingleton::GetInstance()->RegisterClient(); - } - if (connect_immediately) { - mediator_thread_->SetDelegate(this); - state_.connected = 1; - } - mediator_thread_->Start(); - state_.started = 1; -} - -TalkMediatorImpl::~TalkMediatorImpl() { - DCHECK(non_thread_safe_.CalledOnValidThread()); - if (state_.started) { - Logout(); - } -} - -bool TalkMediatorImpl::Login() { - DCHECK(non_thread_safe_.CalledOnValidThread()); - // Connect to the mediator thread and start processing messages. - if (!state_.connected) { - mediator_thread_->SetDelegate(this); - state_.connected = 1; - } - if (state_.initialized && !state_.logging_in && !state_.logged_in) { - state_.logging_in = true; - mediator_thread_->Login(xmpp_settings_); - return true; - } - return false; -} - -bool TalkMediatorImpl::Logout() { - DCHECK(non_thread_safe_.CalledOnValidThread()); - if (state_.connected) { - state_.connected = 0; - } - if (state_.started) { - state_.started = 0; - state_.logging_in = 0; - state_.logged_in = 0; - state_.subscribed = 0; - // We do not want to be called back during logout since we may be - // closing. - mediator_thread_->SetDelegate(NULL); - mediator_thread_->Logout(); - return true; - } - return false; -} - -bool TalkMediatorImpl::SendNotification(const OutgoingNotificationData& data) { - DCHECK(non_thread_safe_.CalledOnValidThread()); - if (state_.logged_in && state_.subscribed) { - mediator_thread_->SendNotification(data); - return true; - } - return false; -} - -void TalkMediatorImpl::SetDelegate(TalkMediator::Delegate* delegate) { - DCHECK(non_thread_safe_.CalledOnValidThread()); - delegate_ = delegate; -} - -bool TalkMediatorImpl::SetAuthToken(const std::string& email, - const std::string& token, - const std::string& token_service) { - DCHECK(non_thread_safe_.CalledOnValidThread()); - - // Verify that we can create a JID from the email provided. - buzz::Jid jid = buzz::Jid(email); - if (jid.node().empty() || !jid.IsValid()) { - return false; - } - - // Construct the XmppSettings object for login to buzz. - xmpp_settings_.set_user(jid.node()); - xmpp_settings_.set_resource("chrome-sync"); - xmpp_settings_.set_host(jid.domain()); - xmpp_settings_.set_use_tls(true); - xmpp_settings_.set_auth_cookie(invalidate_xmpp_auth_token_ ? - token + "bogus" : token); - xmpp_settings_.set_token_service(token_service); - - state_.initialized = 1; - return true; -} - -void TalkMediatorImpl::AddSubscribedServiceUrl( - const std::string& service_url) { - DCHECK(non_thread_safe_.CalledOnValidThread()); - subscribed_services_list_.push_back(service_url); - if (state_.logged_in) { - LOG(INFO) << "Resubscribing for updates, a new service got added"; - mediator_thread_->SubscribeForUpdates(subscribed_services_list_); - } -} - - -void TalkMediatorImpl::OnConnectionStateChange(bool logged_in) { - DCHECK(non_thread_safe_.CalledOnValidThread()); - state_.logging_in = 0; - state_.logged_in = logged_in; - if (logged_in) { - LOG(INFO) << "P2P: Logged in."; - // ListenForUpdates enables the ListenTask. This is done before - // SubscribeForUpdates. - mediator_thread_->ListenForUpdates(); - // Now subscribe for updates to all the services we are interested in - mediator_thread_->SubscribeForUpdates(subscribed_services_list_); - } else { - LOG(INFO) << "P2P: Logged off."; - OnSubscriptionStateChange(false); - } -} - -void TalkMediatorImpl::OnSubscriptionStateChange(bool subscribed) { - DCHECK(non_thread_safe_.CalledOnValidThread()); - state_.subscribed = subscribed; - LOG(INFO) << "P2P: " << (subscribed ? "subscribed" : "unsubscribed"); - if (delegate_) { - delegate_->OnNotificationStateChange(subscribed); - } -} - -void TalkMediatorImpl::OnIncomingNotification( - const IncomingNotificationData& notification_data) { - DCHECK(non_thread_safe_.CalledOnValidThread()); - LOG(INFO) << "P2P: Updates are available on the server."; - if (delegate_) { - delegate_->OnIncomingNotification(notification_data); - } -} - -void TalkMediatorImpl::OnOutgoingNotification() { - DCHECK(non_thread_safe_.CalledOnValidThread()); - LOG(INFO) << - "P2P: Peers were notified that updates are available on the server."; - if (delegate_) { - delegate_->OnOutgoingNotification(); - } -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/talk_mediator_impl.h b/chrome/common/net/notifier/listener/talk_mediator_impl.h deleted file mode 100644 index e14840f..0000000 --- a/chrome/common/net/notifier/listener/talk_mediator_impl.h +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// This class is the interface between talk code and the client code proper -// It will manage all aspects of the connection and call back into the client -// when it needs attention (for instance if updates are available for syncing). - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_TALK_MEDIATOR_IMPL_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_TALK_MEDIATOR_IMPL_H_ - -#include <string> -#include <vector> - -#include "base/non_thread_safe.h" -#include "base/scoped_ptr.h" -#include "chrome/common/net/notifier/listener/mediator_thread.h" -#include "chrome/common/net/notifier/listener/talk_mediator.h" -#include "talk/base/sigslot.h" -#include "talk/xmpp/xmppclientsettings.h" -#include "testing/gtest/include/gtest/gtest_prod.h" // For FRIEND_TEST - -namespace notifier { - -class TalkMediatorImpl - : public TalkMediator, public MediatorThread::Delegate { - public: - // Takes ownership of |mediator_thread|. - TalkMediatorImpl( - MediatorThread* mediator_thread, - bool initialize_ssl, - bool connect_immediately, - bool invalidate_xmpp_auth_token); - virtual ~TalkMediatorImpl(); - - // TalkMediator implementation. - - virtual void SetDelegate(TalkMediator::Delegate* delegate); - - virtual bool SetAuthToken(const std::string& email, - const std::string& token, - const std::string& token_service); - virtual bool Login(); - virtual bool Logout(); - - virtual bool SendNotification(const OutgoingNotificationData& data); - - virtual void AddSubscribedServiceUrl(const std::string& service_url); - - // MediatorThread::Delegate implementation. - - virtual void OnConnectionStateChange(bool logged_in); - - virtual void OnSubscriptionStateChange(bool subscribed); - - virtual void OnIncomingNotification( - const IncomingNotificationData& notification_data); - - virtual void OnOutgoingNotification(); - - private: - struct TalkMediatorState { - TalkMediatorState() - : started(0), connected(0), initialized(0), logging_in(0), - logged_in(0), subscribed(0) { - } - - unsigned int started : 1; // Background thread has started. - unsigned int connected : 1; // Connected to the mediator thread signal. - unsigned int initialized : 1; // Initialized with login information. - unsigned int logging_in : 1; // Logging in to the mediator's - // authenticator. - unsigned int logged_in : 1; // Logged in the mediator's authenticator. - unsigned int subscribed : 1; // Subscribed to the xmpp receiving channel. - }; - - NonThreadSafe non_thread_safe_; - - // Delegate, which we don't own. May be NULL. - TalkMediator::Delegate* delegate_; - - // Internal state. - TalkMediatorState state_; - - // Cached and verfied from the SetAuthToken method. - buzz::XmppClientSettings xmpp_settings_; - - // The worker thread through which talk events are posted and received. - scoped_ptr<MediatorThread> mediator_thread_; - - const bool invalidate_xmpp_auth_token_; - - std::vector<std::string> subscribed_services_list_; - - FRIEND_TEST(TalkMediatorImplTest, SetAuthTokenWithBadInput); - FRIEND_TEST(TalkMediatorImplTest, SetAuthTokenWithGoodInput); - FRIEND_TEST(TalkMediatorImplTest, SendNotification); - FRIEND_TEST(TalkMediatorImplTest, MediatorThreadCallbacks); - DISALLOW_COPY_AND_ASSIGN(TalkMediatorImpl); -}; - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_TALK_MEDIATOR_IMPL_H_ diff --git a/chrome/common/net/notifier/listener/talk_mediator_unittest.cc b/chrome/common/net/notifier/listener/talk_mediator_unittest.cc deleted file mode 100644 index b90c577..0000000 --- a/chrome/common/net/notifier/listener/talk_mediator_unittest.cc +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <string> - -#include "base/basictypes.h" -#include "base/logging.h" -#include "base/message_loop.h" -#include "chrome/common/net/notifier/listener/mediator_thread_mock.h" -#include "chrome/common/net/notifier/listener/mediator_thread_impl.h" -#include "chrome/common/net/notifier/listener/talk_mediator_impl.h" -#include "talk/xmpp/xmppengine.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace notifier { - -using ::testing::_; - -class MockTalkMediatorDelegate : public TalkMediator::Delegate { - public: - MockTalkMediatorDelegate() {} - virtual ~MockTalkMediatorDelegate() {} - - MOCK_METHOD1(OnNotificationStateChange, - void(bool notification_changed)); - MOCK_METHOD1(OnIncomingNotification, - void(const IncomingNotificationData& data)); - MOCK_METHOD0(OnOutgoingNotification, void()); - - private: - DISALLOW_COPY_AND_ASSIGN(MockTalkMediatorDelegate); -}; - -class TalkMediatorImplTest : public testing::Test { - protected: - TalkMediatorImplTest() {} - virtual ~TalkMediatorImplTest() {} - - TalkMediatorImpl* NewTalkMediator() { - const bool kInitializeSsl = true; - const bool kConnectImmediately = false; - const bool kInvalidateXmppAuthToken = false; - return new TalkMediatorImpl(new MediatorThreadImpl(), kInitializeSsl, - kConnectImmediately, kInvalidateXmppAuthToken); - } - - TalkMediatorImpl* NewMockedTalkMediator( - MockMediatorThread* mock_mediator_thread) { - const bool kInitializeSsl = false; - const bool kConnectImmediately = true; - const bool kInvalidateXmppAuthToken = false; - return new TalkMediatorImpl(mock_mediator_thread, - kInitializeSsl, kConnectImmediately, - kInvalidateXmppAuthToken); - } - - int last_message_; - - private: - // TalkMediatorImpl expects a message loop. - MessageLoop message_loop_; - - DISALLOW_COPY_AND_ASSIGN(TalkMediatorImplTest); -}; - -TEST_F(TalkMediatorImplTest, ConstructionOfTheClass) { - // Constructing a single talk mediator enables SSL through the singleton. - scoped_ptr<TalkMediatorImpl> talk1(NewTalkMediator()); -} - -TEST_F(TalkMediatorImplTest, SetAuthTokenWithBadInput) { - scoped_ptr<TalkMediatorImpl> talk1( - NewMockedTalkMediator(new MockMediatorThread())); - EXPECT_FALSE(talk1->SetAuthToken("@missinguser.com", "", "fake_service")); - EXPECT_FALSE(talk1->state_.initialized); - - scoped_ptr<TalkMediatorImpl> talk2( - NewMockedTalkMediator(new MockMediatorThread())); - EXPECT_FALSE(talk2->SetAuthToken("", "1234567890", "fake_service")); - EXPECT_FALSE(talk2->state_.initialized); - - scoped_ptr<TalkMediatorImpl> talk3( - NewMockedTalkMediator(new MockMediatorThread())); - EXPECT_FALSE(talk3->SetAuthToken("missingdomain", "abcde", "fake_service")); - EXPECT_FALSE(talk3->state_.initialized); -} - -TEST_F(TalkMediatorImplTest, SetAuthTokenWithGoodInput) { - scoped_ptr<TalkMediatorImpl> talk1( - NewMockedTalkMediator(new MockMediatorThread())); - EXPECT_TRUE(talk1->SetAuthToken("chromium@gmail.com", "token", - "fake_service")); - EXPECT_TRUE(talk1->state_.initialized); - - scoped_ptr<TalkMediatorImpl> talk2( - NewMockedTalkMediator(new MockMediatorThread())); - EXPECT_TRUE(talk2->SetAuthToken("chromium@mail.google.com", "token", - "fake_service")); - EXPECT_TRUE(talk2->state_.initialized); - - scoped_ptr<TalkMediatorImpl> talk3( - NewMockedTalkMediator(new MockMediatorThread())); - EXPECT_TRUE(talk3->SetAuthToken("chromium@chromium.org", "token", - "fake_service")); - EXPECT_TRUE(talk3->state_.initialized); -} - -TEST_F(TalkMediatorImplTest, LoginWiring) { - // The TalkMediatorImpl owns the mock. - MockMediatorThread* mock = new MockMediatorThread(); - scoped_ptr<TalkMediatorImpl> talk1(NewMockedTalkMediator(mock)); - - // Login checks states for initialization. - EXPECT_FALSE(talk1->Login()); - EXPECT_EQ(0, mock->login_calls); - - EXPECT_TRUE(talk1->SetAuthToken("chromium@gmail.com", "token", - "fake_service")); - EXPECT_TRUE(talk1->Login()); - EXPECT_EQ(1, mock->login_calls); - - // Successive calls to login will fail. One needs to create a new talk - // mediator object. - EXPECT_FALSE(talk1->Login()); - EXPECT_EQ(1, mock->login_calls); - - EXPECT_TRUE(talk1->Logout()); - EXPECT_EQ(1, mock->logout_calls); - - // Successive logout calls do nothing. - EXPECT_FALSE(talk1->Logout()); - EXPECT_EQ(1, mock->logout_calls); -} - -TEST_F(TalkMediatorImplTest, SendNotification) { - // The TalkMediatorImpl owns the mock. - MockMediatorThread* mock = new MockMediatorThread(); - scoped_ptr<TalkMediatorImpl> talk1(NewMockedTalkMediator(mock)); - - // Failure due to not being logged in. - OutgoingNotificationData data; - EXPECT_FALSE(talk1->SendNotification(data)); - EXPECT_EQ(0, mock->send_calls); - - EXPECT_TRUE(talk1->SetAuthToken("chromium@gmail.com", "token", - "fake_service")); - EXPECT_TRUE(talk1->Login()); - talk1->OnConnectionStateChange(true); - EXPECT_EQ(1, mock->login_calls); - - // Should be subscribed now. - EXPECT_TRUE(talk1->state_.subscribed); - EXPECT_TRUE(talk1->SendNotification(data)); - EXPECT_EQ(1, mock->send_calls); - EXPECT_TRUE(talk1->SendNotification(data)); - EXPECT_EQ(2, mock->send_calls); - - EXPECT_TRUE(talk1->Logout()); - EXPECT_EQ(1, mock->logout_calls); - - // Failure due to being logged out. - EXPECT_FALSE(talk1->SendNotification(data)); - EXPECT_EQ(2, mock->send_calls); -} - -TEST_F(TalkMediatorImplTest, MediatorThreadCallbacks) { - // The TalkMediatorImpl owns the mock. - MockMediatorThread* mock = new MockMediatorThread(); - scoped_ptr<TalkMediatorImpl> talk1(NewMockedTalkMediator(mock)); - - MockTalkMediatorDelegate mock_delegate; - EXPECT_CALL(mock_delegate, OnNotificationStateChange(true)); - EXPECT_CALL(mock_delegate, OnIncomingNotification(_)); - EXPECT_CALL(mock_delegate, OnOutgoingNotification()); - - talk1->SetDelegate(&mock_delegate); - - EXPECT_TRUE(talk1->SetAuthToken("chromium@gmail.com", "token", - "fake_service")); - EXPECT_TRUE(talk1->Login()); - EXPECT_EQ(1, mock->login_calls); - - // The message triggers calls to listen and subscribe. - EXPECT_EQ(1, mock->listen_calls); - EXPECT_EQ(1, mock->subscribe_calls); - EXPECT_TRUE(talk1->state_.subscribed); - - // After subscription success is receieved, the talk mediator will allow - // sending of notifications. - OutgoingNotificationData outgoing_data; - EXPECT_TRUE(talk1->SendNotification(outgoing_data)); - EXPECT_EQ(1, mock->send_calls); - - IncomingNotificationData incoming_data; - incoming_data.service_url = "service_url"; - incoming_data.service_specific_data = "service_data"; - mock->ReceiveNotification(incoming_data); - - // Shouldn't trigger a call to the delegate since we disconnect - // it before we logout. - talk1.reset(); - EXPECT_EQ(1, mock->logout_calls); -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/xml_element_util.cc b/chrome/common/net/notifier/listener/xml_element_util.cc deleted file mode 100644 index 2e08b2f..0000000 --- a/chrome/common/net/notifier/listener/xml_element_util.cc +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/xml_element_util.h" - -#include <sstream> -#include <string> - -#include "base/string_util.h" -#include "talk/xmllite/qname.h" -#include "talk/xmllite/xmlconstants.h" -#include "talk/xmllite/xmlelement.h" -#include "talk/xmllite/xmlprinter.h" - -namespace notifier { - -std::string XmlElementToString(const buzz::XmlElement& xml_element) { - std::ostringstream xml_stream; - buzz::XmlPrinter::PrintXml(&xml_stream, &xml_element); - return xml_stream.str(); -} - -buzz::XmlElement* MakeBoolXmlElement(const char* name, bool value) { - const buzz::QName elementQName(buzz::STR_EMPTY, name); - const buzz::QName boolAttrQName(buzz::STR_EMPTY, "bool"); - buzz::XmlElement* bool_xml_element = - new buzz::XmlElement(elementQName, true); - bool_xml_element->AddAttr(boolAttrQName, value ? "true" : "false"); - return bool_xml_element; -} - -buzz::XmlElement* MakeIntXmlElement(const char* name, int value) { - const buzz::QName elementQName(buzz::STR_EMPTY, name); - const buzz::QName intAttrQName(buzz::STR_EMPTY, "int"); - buzz::XmlElement* int_xml_element = - new buzz::XmlElement(elementQName, true); - int_xml_element->AddAttr(intAttrQName, IntToString(value)); - return int_xml_element; -} - -buzz::XmlElement* MakeStringXmlElement(const char* name, const char* value) { - const buzz::QName elementQName(buzz::STR_EMPTY, name); - const buzz::QName dataAttrQName(buzz::STR_EMPTY, "data"); - buzz::XmlElement* data_xml_element = - new buzz::XmlElement(elementQName, true); - data_xml_element->AddAttr(dataAttrQName, value); - return data_xml_element; -} - -} // namespace notifier diff --git a/chrome/common/net/notifier/listener/xml_element_util.h b/chrome/common/net/notifier/listener/xml_element_util.h deleted file mode 100644 index a63077a..0000000 --- a/chrome/common/net/notifier/listener/xml_element_util.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_COMMON_NET_NOTIFIER_LISTENER_XML_ELEMENT_UTIL_H_ -#define CHROME_COMMON_NET_NOTIFIER_LISTENER_XML_ELEMENT_UTIL_H_ - -#include <string> - -namespace buzz { -class XmlElement; -} - -namespace notifier { - -std::string XmlElementToString(const buzz::XmlElement& xml_element); - -// The functions below are helpful for building notifications-related -// XML stanzas. - -buzz::XmlElement* MakeBoolXmlElement(const char* name, bool value); - -buzz::XmlElement* MakeIntXmlElement(const char* name, int value); - -buzz::XmlElement* MakeStringXmlElement(const char* name, const char* value); - -} // namespace notifier - -#endif // CHROME_COMMON_NET_NOTIFIER_LISTENER_XML_ELEMENT_UTIL_H_ diff --git a/chrome/common/net/notifier/listener/xml_element_util_unittest.cc b/chrome/common/net/notifier/listener/xml_element_util_unittest.cc deleted file mode 100644 index 6b5ffc3..0000000 --- a/chrome/common/net/notifier/listener/xml_element_util_unittest.cc +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/notifier/listener/xml_element_util.h" - -#include <sstream> -#include <string> - -#include "base/logging.h" -#include "base/scoped_ptr.h" -#include "talk/xmllite/qname.h" -#include "talk/xmllite/xmlelement.h" -#include "talk/xmllite/xmlprinter.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace buzz { -class XmlElement; -} - -namespace notifier { -namespace { - -class XmlElementUtilTest : public testing::Test {}; - -TEST_F(XmlElementUtilTest, XmlElementToString) { - const buzz::QName kQName("namespace", "element"); - const buzz::XmlElement kXmlElement(kQName, true); - std::ostringstream expected_xml_stream; - buzz::XmlPrinter::PrintXml(&expected_xml_stream, &kXmlElement); - EXPECT_EQ(expected_xml_stream.str(), XmlElementToString(kXmlElement)); -} - -TEST_F(XmlElementUtilTest, MakeBoolXmlElement) { - scoped_ptr<buzz::XmlElement> foo_false( - MakeBoolXmlElement("foo", false)); - EXPECT_EQ("<foo xmlns=\"\" bool=\"false\"/>", XmlElementToString(*foo_false)); - - scoped_ptr<buzz::XmlElement> bar_true( - MakeBoolXmlElement("bar", true)); - EXPECT_EQ("<bar xmlns=\"\" bool=\"true\"/>", XmlElementToString(*bar_true)); -} - -TEST_F(XmlElementUtilTest, MakeIntXmlElement) { - scoped_ptr<buzz::XmlElement> int_xml_element( - MakeIntXmlElement("foo", 35)); - EXPECT_EQ("<foo xmlns=\"\" int=\"35\"/>", - XmlElementToString(*int_xml_element)); -} - -TEST_F(XmlElementUtilTest, MakeStringXmlElement) { - scoped_ptr<buzz::XmlElement> string_xml_element( - MakeStringXmlElement("foo", "bar")); - EXPECT_EQ("<foo xmlns=\"\" data=\"bar\"/>", - XmlElementToString(*string_xml_element)); -} - -} // namespace -} // namespace notifier diff --git a/chrome/service/cloud_print/DEPS b/chrome/service/cloud_print/DEPS new file mode 100644 index 0000000..52393c8 --- /dev/null +++ b/chrome/service/cloud_print/DEPS @@ -0,0 +1,4 @@ +include_rules = [ + # sync notifier depends on the common jingle notifier classes. + "+jingle/notifier", +] diff --git a/chrome/service/cloud_print/cloud_print_proxy_backend.cc b/chrome/service/cloud_print/cloud_print_proxy_backend.cc index 6cc5098..9b8751f 100644 --- a/chrome/service/cloud_print/cloud_print_proxy_backend.cc +++ b/chrome/service/cloud_print/cloud_print_proxy_backend.cc @@ -12,10 +12,10 @@ #include "chrome/service/cloud_print/cloud_print_consts.h" #include "chrome/service/cloud_print/cloud_print_helpers.h" #include "chrome/service/cloud_print/printer_job_handler.h" -#include "chrome/common/net/notifier/listener/mediator_thread_impl.h" -#include "chrome/common/net/notifier/listener/talk_mediator_impl.h" #include "chrome/service/gaia/service_gaia_authenticator.h" #include "chrome/service/service_process.h" +#include "jingle/notifier/listener/mediator_thread_impl.h" +#include "jingle/notifier/listener/talk_mediator_impl.h" #include "googleurl/src/gurl.h" #include "net/url_request/url_request_status.h" @@ -659,4 +659,3 @@ void CloudPrintProxyBackend::Core::OnPrinterJobHandlerShutdown( LOG(INFO) << "CP_PROXY: Printer job handle shutdown, id " << printer_id; job_handler_map_.erase(printer_id); } - |