NetworkManager.cpp [plain text]
#include "config.h"
#include "NetworkManager.h"
#include "Chrome.h"
#include "CredentialStorage.h"
#include "Frame.h"
#include "FrameLoaderClientBlackBerry.h"
#include "NetworkJob.h"
#include "Page.h"
#include "ResourceHandleInternal.h"
#include "ResourceRequest.h"
#include <BlackBerryPlatformClient.h>
#include <BlackBerryPlatformLog.h>
#include <BuildInformation.h>
#include <network/FilterStream.h>
#include <network/NetworkRequest.h>
namespace WebCore {
NetworkManager* NetworkManager::instance()
{
static NetworkManager* sInstance;
if (!sInstance) {
sInstance = new NetworkManager;
ASSERT(sInstance);
}
return sInstance;
}
bool NetworkManager::startJob(int playerId, PassRefPtr<ResourceHandle> job, const Frame& frame, bool defersLoading)
{
ASSERT(job.get());
RefPtr<ResourceHandle> refJob(job);
return startJob(playerId, refJob, refJob->firstRequest(), frame, defersLoading);
}
bool NetworkManager::startJob(int playerId, PassRefPtr<ResourceHandle> job, const ResourceRequest& request, const Frame& frame, bool defersLoading)
{
Page* page = frame.page();
if (!page)
return false;
BlackBerry::Platform::NetworkStreamFactory* streamFactory = page->chrome()->platformPageClient()->networkStreamFactory();
return startJob(playerId, page->groupName(), job, request, streamFactory, frame, defersLoading ? 1 : 0);
}
bool NetworkManager::startJob(int playerId, const String& pageGroupName, PassRefPtr<ResourceHandle> job, const ResourceRequest& request, BlackBerry::Platform::NetworkStreamFactory* streamFactory, const Frame& frame, int deferLoadingCount, int redirectCount)
{
RefPtr<ResourceHandle> guardJob(job);
KURL url = request.url();
bool isInitial = (url == m_initialURL);
if (isInitial)
m_initialURL = KURL();
BlackBerry::Platform::NetworkRequest platformRequest;
request.initializePlatformRequest(platformRequest, frame.loader() && frame.loader()->client() && static_cast<FrameLoaderClientBlackBerry*>(frame.loader()->client())->cookiesEnabled(), isInitial, redirectCount);
AuthenticationChallenge& challenge = guardJob->getInternal()->m_currentWebChallenge;
if (!challenge.isNull()) {
Credential credential = challenge.proposedCredential();
ProtectionSpace protectionSpace = challenge.protectionSpace();
ProtectionSpaceServerType type = protectionSpace.serverType();
String username = credential.user();
String password = credential.password();
BlackBerry::Platform::NetworkRequest::AuthType authType = BlackBerry::Platform::NetworkRequest::AuthNone;
if (type == ProtectionSpaceServerHTTP) {
switch (protectionSpace.authenticationScheme()) {
case ProtectionSpaceAuthenticationSchemeHTTPBasic:
authType = BlackBerry::Platform::NetworkRequest::AuthHTTPBasic;
break;
case ProtectionSpaceAuthenticationSchemeHTTPDigest:
authType = BlackBerry::Platform::NetworkRequest::AuthHTTPDigest;
break;
case ProtectionSpaceAuthenticationSchemeNTLM:
authType = BlackBerry::Platform::NetworkRequest::AuthHTTPNTLM;
break;
default:
break;
}
} else if (type == ProtectionSpaceServerFTP)
authType = BlackBerry::Platform::NetworkRequest::AuthFTP;
else if (type == ProtectionSpaceProxyHTTP)
authType = BlackBerry::Platform::NetworkRequest::AuthProxy;
if (authType != BlackBerry::Platform::NetworkRequest::AuthNone)
platformRequest.setCredentials(username.utf8().data(), password.utf8().data(), authType);
} else if (url.protocolIsInHTTPFamily()) {
Credential credential = CredentialStorage::get(url);
if (!credential.isEmpty())
platformRequest.setCredentials(credential.user().utf8().data(), credential.password().utf8().data(), BlackBerry::Platform::NetworkRequest::AuthHTTPBasic);
}
if (!request.overrideContentType().isEmpty())
platformRequest.setOverrideContentType(request.overrideContentType().latin1().data());
NetworkJob* networkJob = new NetworkJob;
if (!networkJob)
return false;
if (!networkJob->initialize(playerId, pageGroupName, url, platformRequest, guardJob, streamFactory, frame, deferLoadingCount, redirectCount)) {
delete networkJob;
return false;
}
ASSERT(!findJobForHandle(guardJob));
m_jobs.append(networkJob);
if (url.protocolIs("data")) {
networkJob->loadDataURL();
return true;
}
if (url.protocolIs("about")) {
networkJob->loadAboutURL();
return true;
}
int result = networkJob->streamOpen();
if (result)
return false;
return true;
}
bool NetworkManager::stopJob(PassRefPtr<ResourceHandle> job)
{
if (NetworkJob* networkJob = findJobForHandle(job))
return !networkJob->cancelJob();
return false;
}
NetworkJob* NetworkManager::findJobForHandle(PassRefPtr<ResourceHandle> job)
{
for (unsigned i = 0; i < m_jobs.size(); ++i) {
NetworkJob* networkJob = m_jobs[i];
if (networkJob->handle() == job) {
return networkJob;
}
}
return 0;
}
void NetworkManager::deleteJob(NetworkJob* job)
{
ASSERT(!job->isRunning());
size_t position = m_jobs.find(job);
if (position != notFound)
m_jobs.remove(position);
delete job;
}
void NetworkManager::setDefersLoading(PassRefPtr<ResourceHandle> job, bool defersLoading)
{
if (NetworkJob* networkJob = findJobForHandle(job))
networkJob->updateDeferLoadingCount(defersLoading ? 1 : -1);
}
void NetworkManager::pauseLoad(PassRefPtr<ResourceHandle> job, bool pause)
{
if (NetworkJob* networkJob = findJobForHandle(job))
networkJob->streamPause(pause);
}
BlackBerry::Platform::FilterStream* NetworkManager::streamForHandle(PassRefPtr<ResourceHandle> job)
{
NetworkJob* networkJob = findJobForHandle(job);
return networkJob ? networkJob->wrappedStream() : 0;
}
}