summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/api/gcd_private/gcd_private_api.cc')
-rw-r--r--chrome/browser/extensions/api/gcd_private/gcd_private_api.cc96
1 files changed, 89 insertions, 7 deletions
diff --git a/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc b/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
index b17b984..5d3dba1 100644
--- a/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
+++ b/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/local_discovery/cloud_device_list.h"
#include "chrome/browser/local_discovery/cloud_print_printer_list.h"
#include "chrome/browser/local_discovery/gcd_constants.h"
+#include "chrome/browser/local_discovery/privet_device_lister_impl.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
#include "chrome/browser/signin/signin_manager_factory.h"
@@ -18,14 +19,25 @@
namespace extensions {
-using extensions::api::gcd_private::GCDDevice;
+namespace gcd_private = api::gcd_private;
namespace {
+scoped_ptr<Event> MakeCloudDeviceStateChangedEvent(
+ bool available,
+ const gcd_private::GCDDevice& device) {
+ scoped_ptr<base::ListValue> params =
+ gcd_private::OnCloudDeviceStateChanged::Create(available, device);
+ scoped_ptr<Event> event(new Event(
+ gcd_private::OnCloudDeviceStateChanged::kEventName, params.Pass()));
+ return event.Pass();
+}
+
const int kNumRequestsNeeded = 2;
const char kIDPrefixCloudPrinter[] = "cloudprint:";
const char kIDPrefixGcd[] = "gcd:";
+const char kIDPrefixMdns[] = "mdns:";
GcdPrivateAPI::GCDApiFlowFactoryForTests* g_gcd_api_flow_factory = NULL;
@@ -54,7 +66,10 @@ scoped_ptr<local_discovery::GCDApiFlow> MakeGCDApiFlow(Profile* profile) {
} // namespace
GcdPrivateAPI::GcdPrivateAPI(content::BrowserContext* context)
- : browser_context_(context) {
+ : num_device_listeners_(0), browser_context_(context) {
+ DCHECK(browser_context_);
+ EventRouter::Get(context)->RegisterObserver(
+ this, gcd_private::OnCloudDeviceStateChanged::kEventName);
}
GcdPrivateAPI::~GcdPrivateAPI() {
@@ -66,6 +81,74 @@ GcdPrivateAPI::GetFactoryInstance() {
return g_factory.Pointer();
}
+void GcdPrivateAPI::OnListenerAdded(const EventListenerInfo& details) {
+ num_device_listeners_++;
+
+ if (num_device_listeners_ == 1) {
+ service_discovery_client_ =
+ local_discovery::ServiceDiscoverySharedClient::GetInstance();
+ privet_device_lister_.reset(new local_discovery::PrivetDeviceListerImpl(
+ service_discovery_client_.get(), this));
+ privet_device_lister_->Start();
+ }
+
+ for (GCDDeviceMap::iterator i = known_devices_.begin();
+ i != known_devices_.end();
+ i++) {
+ EventRouter::Get(browser_context_)->DispatchEventToExtension(
+ details.extension_id,
+ MakeCloudDeviceStateChangedEvent(true, *i->second));
+ }
+}
+
+void GcdPrivateAPI::OnListenerRemoved(const EventListenerInfo& details) {
+ num_device_listeners_--;
+
+ if (num_device_listeners_ == 0) {
+ privet_device_lister_.reset();
+ service_discovery_client_ = NULL;
+ }
+}
+
+void GcdPrivateAPI::DeviceChanged(
+ bool added,
+ const std::string& name,
+ const local_discovery::DeviceDescription& description) {
+ linked_ptr<gcd_private::GCDDevice> device(new gcd_private::GCDDevice);
+ device->setup_type = gcd_private::SETUP_TYPE_MDNS;
+ device->id_string = kIDPrefixMdns + name;
+ device->device_type = description.type;
+ device->device_name = description.name;
+ device->device_description = description.description;
+ if (!description.id.empty())
+ device->cloud_id.reset(new std::string(description.id));
+
+ known_devices_[device->id_string] = device;
+
+ EventRouter::Get(browser_context_)
+ ->BroadcastEvent(MakeCloudDeviceStateChangedEvent(true, *device));
+}
+
+void GcdPrivateAPI::DeviceRemoved(const std::string& name) {
+ GCDDeviceMap::iterator found = known_devices_.find(kIDPrefixMdns + name);
+ linked_ptr<gcd_private::GCDDevice> device = found->second;
+ known_devices_.erase(found);
+
+ EventRouter::Get(browser_context_)
+ ->BroadcastEvent(MakeCloudDeviceStateChangedEvent(false, *device));
+}
+
+void GcdPrivateAPI::DeviceCacheFlushed() {
+ for (GCDDeviceMap::iterator i = known_devices_.begin();
+ i != known_devices_.end();
+ i++) {
+ EventRouter::Get(browser_context_)
+ ->BroadcastEvent(MakeCloudDeviceStateChangedEvent(false, *i->second));
+ }
+
+ known_devices_.clear();
+}
+
// static
void GcdPrivateAPI::SetGCDApiFlowFactoryForTests(
GCDApiFlowFactoryForTests* factory) {
@@ -122,11 +205,11 @@ void GcdPrivateGetCloudDeviceListFunction::CheckListingDone() {
return;
}
- std::vector<linked_ptr<GCDDevice> > devices;
+ std::vector<linked_ptr<gcd_private::GCDDevice> > devices;
for (DeviceList::iterator i = devices_.begin(); i != devices_.end(); i++) {
- linked_ptr<GCDDevice> device(new GCDDevice);
- device->setup_type = extensions::api::gcd_private::SETUP_TYPE_CLOUD;
+ linked_ptr<gcd_private::GCDDevice> device(new gcd_private::GCDDevice);
+ device->setup_type = gcd_private::SETUP_TYPE_CLOUD;
if (i->type == local_discovery::kGCDTypePrinter) {
device->id_string = kIDPrefixCloudPrinter + i->id;
} else {
@@ -141,8 +224,7 @@ void GcdPrivateGetCloudDeviceListFunction::CheckListingDone() {
devices.push_back(device);
}
- results_ = extensions::api::gcd_private::GetCloudDeviceList::Results::Create(
- devices);
+ results_ = gcd_private::GetCloudDeviceList::Results::Create(devices);
SendResponse(true);
Release();