15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JINGLE_NOTIFIER_LISTENER_NON_BLOCKING_PUSH_CLIENT_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define JINGLE_NOTIFIER_LISTENER_NON_BLOCKING_PUSH_CLIENT_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_checker.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/push_client.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/push_client_observer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SingleThreadTaskRunner; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace notifier { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class implements a PushClient that doesn't block; it delegates 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to another blocking PushClient on a separate thread. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class must be used on a single thread. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NonBlockingPushClient : public PushClient { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The type for a function that creates a (blocking) PushClient. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Will be called on the delegate task runner. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<scoped_ptr<PushClient>()> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateBlockingPushClientCallback; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs the given callback on the given task runner, and delegates 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to that PushClient. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit NonBlockingPushClient( 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& delegate_task_runner, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CreateBlockingPushClientCallback& 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_blocking_push_client_callback); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NonBlockingPushClient(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PushClient implementation. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddObserver(PushClientObserver* observer) OVERRIDE; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveObserver(PushClientObserver* observer) OVERRIDE; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateSubscriptions( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SubscriptionList& subscriptions) OVERRIDE; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateCredentials( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& email, const std::string& token) OVERRIDE; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendNotification(const Notification& notification) OVERRIDE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendPing() OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Core; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnNotificationsEnabled(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnNotificationsDisabled(NotificationsDisabledReason reason); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnIncomingNotification(const Notification& notification); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPingResponse(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadChecker thread_checker_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner> delegate_task_runner_; 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<Core> core_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<PushClientObserver> observers_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WeakPtrFactory<NonBlockingPushClient> weak_ptr_factory_; 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NonBlockingPushClient); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace notifier 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // JINGLE_NOTIFIER_LISTENER_NON_BLOCKING_PUSH_CLIENT_H_ 76