// Copyright 2013 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_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
#define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
#include <map>
#include <string>
#include "base/prefs/pref_member.h"
#include "chrome/browser/local_discovery/privet_device_lister.h"
#include "chrome/browser/local_discovery/privet_http.h"
#include "chrome/browser/notifications/notification_delegate.h"
#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
class NotificationUIManager;
namespace content {
class BrowserContext;
} // namespace content
namespace local_discovery {
class ServiceDiscoverySharedClient;
class PrivetDeviceLister;
class PrivetHTTPAsynchronousFactory;
class PrivetHTTPResolution;
class PrivetTrafficDetector;
struct DeviceDescription;
// Contains logic related to notifications not tied actually displaying them.
class PrivetNotificationsListener : public PrivetInfoOperation::Delegate {
public:
class Delegate {
public:
virtual ~Delegate() {}
// Notify user of the existence of device |device_name|.
virtual void PrivetNotify(bool multiple, bool added) = 0;
// Remove the noitification for |device_name| if it still exists.
virtual void PrivetRemoveNotification() = 0;
};
PrivetNotificationsListener(
scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory,
Delegate* delegate);
virtual ~PrivetNotificationsListener();
// These two methods are akin to those of PrivetDeviceLister::Delegate. The
// user of PrivetNotificationListener should create a PrivetDeviceLister and
// forward device notifications to the PrivetNotificationLister.
void DeviceChanged(bool added,
const std::string& name,
const DeviceDescription& description);
void DeviceRemoved(const std::string& name);
virtual void DeviceCacheFlushed();
// PrivetInfoOperation::Delegate implementation.
virtual void OnPrivetInfoDone(
PrivetInfoOperation* operation,
int http_code,
const base::DictionaryValue* json_value) OVERRIDE;
private:
struct DeviceContext {
DeviceContext();
~DeviceContext();
bool notification_may_be_active;
bool registered;
scoped_ptr<PrivetInfoOperation> info_operation;
scoped_ptr<PrivetHTTPResolution> privet_http_resolution;
scoped_ptr<PrivetHTTPClient> privet_http;
};
typedef std::map<std::string, linked_ptr<DeviceContext> > DeviceContextMap;
void CreateInfoOperation(scoped_ptr<PrivetHTTPClient> http_client);
void NotifyDeviceRemoved();
Delegate* delegate_;
scoped_ptr<PrivetDeviceLister> device_lister_;
scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory_;
DeviceContextMap devices_seen_;
int devices_active_;
};
class PrivetNotificationService
: public BrowserContextKeyedService,
public PrivetDeviceLister::Delegate,
public PrivetNotificationsListener::Delegate,
public base::SupportsWeakPtr<PrivetNotificationService> {
public:
explicit PrivetNotificationService(content::BrowserContext* profile);
virtual ~PrivetNotificationService();
// PrivetDeviceLister::Delegate implementation:
virtual void DeviceChanged(bool added, const std::string& name,
const DeviceDescription& description) OVERRIDE;
virtual void DeviceRemoved(const std::string& name) OVERRIDE;
// PrivetNotificationListener::Delegate implementation:
virtual void PrivetNotify(bool has_multiple, bool added) OVERRIDE;
virtual void PrivetRemoveNotification() OVERRIDE;
virtual void DeviceCacheFlushed() OVERRIDE;
static bool IsEnabled();
static bool IsForced();
private:
void Start();
void OnNotificationsEnabledChanged();
void StartLister();
content::BrowserContext* profile_;
scoped_ptr<PrivetDeviceLister> device_lister_;
scoped_refptr<ServiceDiscoverySharedClient> service_discovery_client_;
scoped_refptr<PrivetTrafficDetector> traffic_detector_;
scoped_ptr<PrivetNotificationsListener> privet_notifications_listener_;
BooleanPrefMember enable_privet_notification_member_;
};
class PrivetNotificationDelegate : public NotificationDelegate {
public:
explicit PrivetNotificationDelegate(content::BrowserContext* profile);
// NotificationDelegate implementation.
virtual std::string id() const OVERRIDE;
virtual content::RenderViewHost* GetRenderViewHost() const OVERRIDE;
virtual void Display() OVERRIDE;
virtual void Error() OVERRIDE;
virtual void Close(bool by_user) OVERRIDE;
virtual void Click() OVERRIDE;
virtual void ButtonClick(int button_index) OVERRIDE;
private:
void OpenTab(const GURL& url);
void DisableNotifications();
virtual ~PrivetNotificationDelegate();
content::BrowserContext* profile_;
};
} // namespace local_discovery
#endif // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_