// 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 view displays information on Winsock layered service providers and
* namespace providers.
*
* For each layered service provider, shows the name, dll, and type
* information. For each namespace provider, shows the name and
* whether or not it's active.
*
* @constructor
*/
function ServiceProvidersView(tabId,
mainBoxId,
serviceProvidersTbodyId,
namespaceProvidersTbodyId) {
DivView.call(this, mainBoxId);
var tab = document.getElementById(tabId);
setNodeDisplay(tab, true);
this.serviceProvidersTbody_ =
document.getElementById(serviceProvidersTbodyId);
this.namespaceProvidersTbody_ =
document.getElementById(namespaceProvidersTbodyId);
g_browser.addServiceProvidersObserver(this);
}
inherits(ServiceProvidersView, DivView);
ServiceProvidersView.prototype.onServiceProvidersChanged =
function(serviceProviders) {
this.updateServiceProviders_(serviceProviders['service_providers']);
this.updateNamespaceProviders_(serviceProviders['namespace_providers']);
};
/**
* Returns type of a layered service provider.
*/
ServiceProvidersView.getLayeredServiceProviderType =
function(serviceProvider) {
if (serviceProvider.chain_length == 0)
return 'Layer';
if (serviceProvider.chain_length == 1)
return 'Base';
return 'Chain';
};
ServiceProvidersView.namespaceProviderType_ = {
'12': 'NS_DNS',
'15': 'NS_NLA',
'16': 'NS_BTH',
'32': 'NS_NTDS',
'37': 'NS_EMAIL',
'38': 'NS_PNRPNAME',
'39': 'NS_PNRPCLOUD'
};
/**
* Returns the type of a namespace provider as a string.
*/
ServiceProvidersView.getNamespaceProviderType = function(namespaceProvider) {
return tryGetValueWithKey(ServiceProvidersView.namespaceProviderType_,
namespaceProvider.type);
};
ServiceProvidersView.socketType_ = {
'1': 'SOCK_STREAM',
'2': 'SOCK_DGRAM',
'3': 'SOCK_RAW',
'4': 'SOCK_RDM',
'5': 'SOCK_SEQPACKET'
};
/**
* Returns socket type of a layered service provider as a string.
*/
ServiceProvidersView.getSocketType = function(layeredServiceProvider) {
return tryGetValueWithKey(ServiceProvidersView.socketType_,
layeredServiceProvider.socket_type);
};
ServiceProvidersView.protocolType_ = {
'1': 'IPPROTO_ICMP',
'6': 'IPPROTO_TCP',
'17': 'IPPROTO_UDP',
'58': 'IPPROTO_ICMPV6'
};
/**
* Returns protocol type of a layered service provider as a string.
*/
ServiceProvidersView.getProtocolType = function(layeredServiceProvider) {
return tryGetValueWithKey(ServiceProvidersView.protocolType_,
layeredServiceProvider.socket_protocol);
};
/**
* Updates the table of layered service providers.
*/
ServiceProvidersView.prototype.updateServiceProviders_ =
function(serviceProviders) {
this.serviceProvidersTbody_.innerHTML = '';
// Add a table row for each service provider.
for (var i = 0; i < serviceProviders.length; ++i) {
var tr = addNode(this.serviceProvidersTbody_, 'tr');
var entry = serviceProviders[i];
addNodeWithText(tr, 'td', entry.name);
addNodeWithText(tr, 'td', entry.version);
addNodeWithText(tr, 'td',
ServiceProvidersView.getLayeredServiceProviderType(entry));
addNodeWithText(tr, 'td', ServiceProvidersView.getSocketType(entry));
addNodeWithText(tr, 'td', ServiceProvidersView.getProtocolType(entry));
addNodeWithText(tr, 'td', entry.path);
}
};
/**
* Updates the lable of namespace providers.
*/
ServiceProvidersView.prototype.updateNamespaceProviders_ =
function(namespaceProviders) {
this.namespaceProvidersTbody_.innerHTML = '';
// Add a table row for each namespace provider.
for (var i = 0; i < namespaceProviders.length; ++i) {
var tr = addNode(this.namespaceProvidersTbody_, 'tr');
var entry = namespaceProviders[i];
addNodeWithText(tr, 'td', entry.name);
addNodeWithText(tr, 'td', entry.version);
addNodeWithText(tr, 'td',
ServiceProvidersView.getNamespaceProviderType(entry));
addNodeWithText(tr, 'td', entry.active);
}
};