20 #include "awsendpoint.h" 
   21 #include "awsendpoint_p.h" 
   25 #include <QMutexLocker> 
   78     d->hostName = QString::fromUtf8(hostName);
 
  164                               const Transports transport)
 
  180     if ((endpointInfo.
transports & HTTPS) && (transport & HTTPS))
 
  181         url.setScheme(QLatin1String(
"https"));
 
  182     else if ((endpointInfo.
transports & HTTP) && (transport & HTTP))
 
  183         url.setScheme(QLatin1String(
"http"));
 
  284     const QHash<QString, AwsEndpointPrivate::ServiceInfo>::const_iterator
 
  307     return d->regionName;
 
  320     return d->serviceName;
 
  355     if (transport == AnyTransport) {
 
  362             regions.append(regionName);
 
  381     if (transport == AnyTransport) {
 
  385     QStringList serviceNames;
 
  387     for (AwsEndpointPrivate::RegionServices::const_iterator iter = services.constBegin(); iter != services.constEnd(); ++iter) {
 
  388         if (iter.value().transports & transport)
 
  389             serviceNames.append(iter.key());
 
  439     QMutexLocker locker(&
mutex);
 
  440     if (!
hosts.empty()) {
 
  445     QFile file(fileName);
 
  465     QMutexLocker locker(&
mutex);
 
  466     if (!
hosts.empty()) {
 
  471     if ((!device.isOpen()) && (!device.open(QIODevice::ReadOnly))) {
 
  472         qWarning() << 
"AwsEndpoint:" << device.errorString();
 
  477     QXmlStreamReader xml(&device);
 
  497     QMutexLocker locker(&
mutex);
 
  498     if (!
hosts.empty()) {
 
  503     while (xml.readNextStartElement()) {
 
  504         if (xml.name() == QLatin1String(
"Regions")) {
 
  506         } 
else if (xml.name() == QLatin1String(
"Services")) {
 
  508         } 
else if (xml.name() != QLatin1String(
"XML")) {
 
  509             qDebug() << Q_FUNC_INFO << 
"ignoring" << xml.name();
 
  512     if (xml.hasError()) {
 
  513         qWarning() << 
"AwsEndpoint:" << xml.errorString();
 
  515     Q_ASSERT(!xml.hasError());
 
  516     Q_ASSERT(!
hosts.isEmpty());
 
  556     while ((!xml.atEnd()) && (xml.readNextStartElement())) {
 
  557         if (xml.name() == QLatin1String(
"Name")) {
 
  558             regionName = xml.readElementText();
 
  559         } 
else if (xml.name() == QLatin1String(
"Endpoint")) {
 
  560             Q_ASSERT(!regionName.isEmpty());
 
  563             while ((!xml.atEnd()) && (xml.readNextStartElement())) {
 
  564                 if (xml.name() == QLatin1String(
"ServiceName")) {
 
  565                     serviceName = xml.readElementText();
 
  566                 } 
else if (xml.name() == QLatin1String(
"Http")) {
 
  567                     if (xml.readElementText() == QLatin1String(
"true")) {
 
  568                         endpoint.transports |= AwsEndpoint::HTTP;
 
  570                 } 
else if (xml.name() == QLatin1String(
"Https")) {
 
  571                     if (xml.readElementText() == QLatin1String(
"true")) {
 
  572                         endpoint.transports |= AwsEndpoint::HTTPS;
 
  574                 } 
else if (xml.name() == QLatin1String(
"Hostname")) {
 
  575                     endpoint.hostName = xml.readElementText();
 
  577                     qDebug() << Q_FUNC_INFO << 
"ignoring" << xml.name();
 
  578                     xml.skipCurrentElement();
 
  581             Q_ASSERT(!serviceName.isEmpty());
 
  583             if (serviceName == QLatin1String(
"email")) {
 
  584                 endpoint.transports |= AwsEndpoint::SMTP;
 
  587             Q_ASSERT((!
hosts.contains(endpoint.hostName)) || (
hosts.value(endpoint.hostName).serviceName == 
serviceName));
 
  588             hosts[endpoint.hostName].regionNames.append(regionName);
 
  593             qDebug() << Q_FUNC_INFO << 
"ignoring" << xml.name();
 
  594             xml.skipCurrentElement();
 
  616     while ((!xml.atEnd()) && (xml.readNextStartElement())) {
 
  617         if (xml.name() == QLatin1String(
"Region")) {
 
  620             qDebug() << Q_FUNC_INFO << 
"ignoring" << xml.name();
 
  621             xml.skipCurrentElement();
 
  657     while ((!xml.atEnd()) && (xml.readNextStartElement())) {
 
  658         if (xml.name() == QLatin1String(
"Name")) {
 
  659             serviceName = xml.readElementText();
 
  660         } 
else if (xml.name() == QLatin1String(
"FullName")) {
 
  661             Q_ASSERT(!serviceName.isEmpty());
 
  663         } 
else if (xml.name() == QLatin1String(
"RegionName")) {
 
  664             Q_ASSERT(!serviceName.isEmpty());
 
  665             const QString &
regionName = xml.readElementText();
 
  669             qDebug() << Q_FUNC_INFO << 
"ignoring" << xml.name();
 
  670             xml.skipCurrentElement();
 
  691     while ((!xml.atEnd()) && (xml.readNextStartElement())) {
 
  692         if (xml.name() == QLatin1String(
"Service")) {
 
  695             qDebug() << Q_FUNC_INFO << 
"ignoring" << xml.name();
 
  696             xml.skipCurrentElement();
 
AwsEndpoint(const QByteArray &hostName)
Constructs a new AwsEndpoint object. 
AwsEndpointPrivate(AwsEndpoint *const q)
Constructs a new AwsEndpointPrivate object. 
QString hostName() const 
Get the name of host represented by this endpoint. 
bool isValid() const 
Is this endpoint valid? 
static QMutex mutex
Mutex for protecting access to static members. 
static QStringList supportedServices(const QString ®ionName, const Transports transport=AnyTransport)
Get a list of services that support a given region. 
Transport
Network transport supported by one or more AWS endpoints. 
QString fullServiceName() const 
Get this endpoint's full service name. 
QHash< QString, RegionEndpointInfo > RegionServices
Hash of service names to RegionEndpointInfo. 
QString serviceName() const 
Get this endpoint's service name. 
static QHash< QString, RegionInfo > regions
Hash of region names to RegionInfo. 
QString regionName
This endpoint's region name. 
QStringList supportedRegions(const Transports transport=AnyTransport) const 
Get the full list of regions this endpoint supports. 
QString regionName() const 
Get this endpoint's primary region name. 
Provides AWS endpoint information. 
AwsEndpoint::Transports transports
Transports supported by this AWS endpoint. 
QString serviceName
This endpoint's service name. 
static void parseServices(QXmlStreamReader &xml)
Parse a Services element from Amazon's endpoint XML data. 
static void loadEndpointData(const QString &fileName=QLatin1String(":/aws/endpoints.xml"))
Load endpoint data. 
AwsEndpointPrivate *const d_ptr
Internal d-pointer. 
static bool isSupported(const QString ®ionName, const QString &serviceName, const Transports transport=AnyTransport)
Is a region / service / transport combination supported by Amazon? 
static void parseRegion(QXmlStreamReader &xml)
Parse a Region element from Amazon's endpoint XML data. 
Private implementation for AwsEndpoint. 
~AwsEndpoint()
AwsEndpoint destructor. 
static QUrl getEndpoint(const QString ®ionName, const QString &serviceName, const Transports transport=AnyTransport)
Get a QUrl for an AWS endpoint. 
static QHash< QString, ServiceInfo > services
Hash of service names to ServiceInfo. 
QString hostName
AWS endpoint's hostname. 
The per-region endpoint-specific information to load from the endpoints.xml file. ...
static void parseRegions(QXmlStreamReader &xml)
Parse a Regions element from Amazon's endpoint XML data. 
static QHash< QString, HostInfo > hosts
Hash of hostnames to HostInfo. 
static void parseService(QXmlStreamReader &xml)
Parse a Service element from Amazon's endpoint XML data.