blob: d56f8cc5e0c9c4a349c16ad2fe39e086b5a8e1cb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <decaf/net/URLConnection.h>
#include <decaf/io/IOException.h>
#include <decaf/lang/Integer.h>
#include <decaf/lang/exceptions/NullPointerException.h>
#include <decaf/lang/exceptions/NumberFormatException.h>
#include <decaf/lang/exceptions/UnsupportedOperationException.h>
#include <decaf/lang/exceptions/IllegalStateException.h>
using namespace decaf;
using namespace decaf::net;
using namespace decaf::lang;
using namespace decaf::lang::exceptions;
////////////////////////////////////////////////////////////////////////////////
bool URLConnection::defaultAllowUserInteraction;
bool URLConnection::defaultUseCaches = true;
////////////////////////////////////////////////////////////////////////////////
namespace decaf {
namespace net {
class URLConnectionImpl {
public:
std::string contentType;
// static bool defaultAllowUserInteraction;
// static bool defaultUseCaches = true;
// ContentHandler defaultHandler = new DefaultContentHandler();
long long lastModified;
int readTimeout;
int connectTimeout;
public:
URLConnectionImpl() : contentType(),
lastModified(-1),
readTimeout(0),
connectTimeout(0) {}
};
}}
////////////////////////////////////////////////////////////////////////////////
URLConnection::URLConnection(const URL& url) : impl(new URLConnectionImpl),
url(url),
ifModifiedSince(),
useCaches(),
connected(),
doOutput(),
doInput(true),
allowUserInteraction() {
}
////////////////////////////////////////////////////////////////////////////////
URLConnection::~URLConnection() {
try {
delete this->impl;
}
DECAF_CATCHALL_NOTHROW()
}
////////////////////////////////////////////////////////////////////////////////
int URLConnection::getConnectTimeout() const {
return impl->connectTimeout;
}
////////////////////////////////////////////////////////////////////////////////
int URLConnection::getReadTimeout() const {
return impl->readTimeout;
}
////////////////////////////////////////////////////////////////////////////////
long long URLConnection::getHeaderFieldDate(const std::string& field, long long defaultValue) const {
std::string date = getHeaderField(field);
if (date == "") {
return defaultValue;
}
throw UnsupportedOperationException(__FILE__, __LINE__, "Not yet implemented");
try {
// TODO
return -1; // Date::parse(date);
} catch (Exception& e) {
return defaultValue;
}
}
////////////////////////////////////////////////////////////////////////////////
int URLConnection::getHeaderFieldInt(const std::string& field, int defaultValue) const {
try {
return Integer::parseInt(getHeaderField(field));
} catch (NumberFormatException& e) {
return defaultValue;
}
}
////////////////////////////////////////////////////////////////////////////////
void URLConnection::setAllowUserInteraction(bool newValue) {
if (connected) {
throw IllegalStateException(__FILE__, __LINE__, "Connection already established");
}
allowUserInteraction = newValue;
}
////////////////////////////////////////////////////////////////////////////////
void URLConnection::setDefaultUseCaches(bool newValue) {
if (connected) {
throw IllegalStateException(__FILE__, __LINE__, "Connection already established");
}
defaultUseCaches = newValue;
}
////////////////////////////////////////////////////////////////////////////////
void URLConnection::setDoInput(bool newValue) {
if (connected) {
throw IllegalStateException(__FILE__, __LINE__, "Connection already established");
}
doInput = newValue;
}
////////////////////////////////////////////////////////////////////////////////
void URLConnection::setDoOutput(bool newValue) {
if (connected) {
throw IllegalStateException(__FILE__, __LINE__, "Connection already established");
}
doOutput = newValue;
}
////////////////////////////////////////////////////////////////////////////////
void URLConnection::setUseCaches(bool newValue) {
if (connected) {
throw IllegalStateException(__FILE__, __LINE__, "Connection already established");
}
useCaches = newValue;
}
////////////////////////////////////////////////////////////////////////////////
void URLConnection::setConnectTimeout(int timeout) {
if (0 > timeout) {
throw IllegalStateException(__FILE__, __LINE__, "Invalid negative timeout");
}
impl->connectTimeout = timeout;
}
////////////////////////////////////////////////////////////////////////////////
void URLConnection::setReadTimeout(int timeout) {
if (0 > timeout) {
throw IllegalStateException(__FILE__, __LINE__, "Invalid negative timeout");
}
impl->readTimeout = timeout;
}
////////////////////////////////////////////////////////////////////////////////
long long URLConnection::getLastModified() const {
if (impl->lastModified != -1) {
return impl->lastModified;
}
return impl->lastModified = getHeaderFieldDate("Last-Modified", 0);
}
////////////////////////////////////////////////////////////////////////////////
void URLConnection::setIfModifiedSince(long long newValue) {
if (connected) {
throw IllegalStateException(__FILE__, __LINE__, "Connection already established");
}
ifModifiedSince = newValue;
}