Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2047)

Unified Diff: chrome/browser/extensions/api/api_resource_controller.cc

Issue 10392181: Implement serial API for Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: TerminalDevice -> FromCurrentPos Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/api_resource_controller.cc
diff --git a/chrome/browser/extensions/api/api_resource_controller.cc b/chrome/browser/extensions/api/api_resource_controller.cc
index 28d7e7443ed8694973af3429f96c0a2e3a9dac6d..ed7677b610b362886cb18ce33a2bd3eb93bc542e 100644
--- a/chrome/browser/extensions/api/api_resource_controller.cc
+++ b/chrome/browser/extensions/api/api_resource_controller.cc
@@ -6,26 +6,60 @@
#include "chrome/browser/extensions/api/serial/serial_connection.h"
#include "chrome/browser/extensions/api/socket/socket.h"
#include "chrome/browser/extensions/api/usb/usb_device_resource.h"
+#include "content/public/browser/browser_thread.h"
-namespace extensions {
+using content::BrowserThread;
-APIResourceController::APIResourceController() : next_api_resource_id_(1) {}
+namespace extensions {
-APIResourceController::~APIResourceController() {}
+APIResourceController::APIResourceController()
+ : next_api_resource_id_(1),
+ socket_resource_map_(new APIResourceMap),
+ serial_connection_resource_map_(new APIResourceMap),
+ usb_device_resource_map_(new APIResourceMap) {}
+
+APIResourceController::~APIResourceController() {
+ // If this check failed, then a unit test was using an APIResource but
+ // didn't provide the IO/FILE thread message loops needed for those resources
+ // to do their job (including destroying themselves at shutdown).
+ DCHECK(BrowserThread::IsMessageLoopValid(BrowserThread::IO));
+ DCHECK(BrowserThread::IsMessageLoopValid(BrowserThread::FILE));
+
+ BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE,
+ socket_resource_map_);
+ BrowserThread::DeleteSoon(BrowserThread::FILE, FROM_HERE,
+ serial_connection_resource_map_);
+ BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE,
+ usb_device_resource_map_);
+}
-APIResource* APIResourceController::GetAPIResource(int api_resource_id) const {
- // TODO(miket): verify that the extension asking for the APIResource is the
- // same one that created it.
- APIResourceMap::const_iterator i = api_resource_map_.find(api_resource_id);
- if (i != api_resource_map_.end())
- return i->second.get();
- return NULL;
+APIResourceController::APIResourceMap*
+APIResourceController::GetResourceMapForType(
+ APIResource::APIResourceType api_resource_type) const {
+ switch (api_resource_type) {
+ case APIResource::SocketResource:
+ return socket_resource_map_;
+ case APIResource::SerialConnectionResource:
+ return serial_connection_resource_map_;
+ case APIResource::UsbDeviceResource:
+ return usb_device_resource_map_;
+ default:
+ NOTREACHED();
+ return NULL;
+ }
}
APIResource* APIResourceController::GetAPIResource(
APIResource::APIResourceType api_resource_type,
int api_resource_id) const {
- APIResource* resource = GetAPIResource(api_resource_id);
+ // TODO(miket): verify that the extension asking for the APIResource is the
+ // same one that created it.
+ APIResourceMap* map = GetResourceMapForType(api_resource_type);
+ APIResourceMap::const_iterator i = map->find(api_resource_id);
+ if (i == map->end())
+ return NULL;
+
+ APIResource* resource = i->second.get();
// This DCHECK is going to catch some legitimate application-developer
// errors, where someone asks for resource of Type A with the wrong ID that
@@ -43,45 +77,64 @@ APIResource* APIResourceController::GetAPIResource(
}
int APIResourceController::AddAPIResource(APIResource* api_resource) {
+ APIResourceMap* map = GetResourceMapForType(
+ api_resource->api_resource_type());
int id = GenerateAPIResourceId();
if (id > 0) {
linked_ptr<APIResource> resource_ptr(api_resource);
- api_resource_map_[id] = resource_ptr;
+ (*map)[id] = resource_ptr;
return id;
}
return 0;
}
-bool APIResourceController::RemoveAPIResource(int api_resource_id) {
- APIResource* api_resource = GetAPIResource(api_resource_id);
+bool APIResourceController::RemoveAPIResource(
+ APIResource::APIResourceType api_resource_type, int api_resource_id) {
+ APIResource* api_resource = GetAPIResource(api_resource_type,
+ api_resource_id);
if (!api_resource)
return false;
- api_resource_map_.erase(api_resource_id);
+ APIResourceMap* map = GetResourceMapForType(
+ api_resource->api_resource_type());
+ map->erase(api_resource_id);
return true;
}
+bool APIResourceController::RemoveSocket(int api_resource_id) {
+ return RemoveAPIResource(APIResource::SocketResource, api_resource_id);
+}
+
+bool APIResourceController::RemoveSerialConnection(int api_resource_id) {
+ return RemoveAPIResource(APIResource::SerialConnectionResource,
+ api_resource_id);
+}
+
+bool APIResourceController::RemoveUsbDeviceResource(int api_resource_id) {
+ return RemoveAPIResource(APIResource::UsbDeviceResource, api_resource_id);
+}
+
// TODO(miket): consider partitioning the ID space by extension ID
// to make it harder for extensions to peek into each others' resources.
int APIResourceController::GenerateAPIResourceId() {
- while (next_api_resource_id_ > 0 &&
- api_resource_map_.count(next_api_resource_id_) > 0)
- ++next_api_resource_id_;
return next_api_resource_id_++;
}
Socket* APIResourceController::GetSocket(int api_resource_id) const {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
return static_cast<Socket*>(GetAPIResource(APIResource::SocketResource,
api_resource_id));
}
SerialConnection* APIResourceController::GetSerialConnection(
int api_resource_id) const {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
return static_cast<SerialConnection*>(
GetAPIResource(APIResource::SerialConnectionResource, api_resource_id));
}
UsbDeviceResource* APIResourceController::GetUsbDeviceResource(
int api_resource_id) const {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
return static_cast<UsbDeviceResource*>(GetAPIResource(
APIResource::UsbDeviceResource, api_resource_id));
}

Powered by Google App Engine
This is Rietveld 408576698