Skip to content

Commit

Permalink
Refactor|libshell: Added AbstractLink (based on Link)
Browse files Browse the repository at this point in the history
An AbstractLink provides the basic mechanism for managing a connection
to a server. Derived classes must implement a protocol for interpreting
incoming messages.
  • Loading branch information
skyjake committed Feb 19, 2013
1 parent 9201186 commit 6fd97a3
Show file tree
Hide file tree
Showing 6 changed files with 364 additions and 176 deletions.
1 change: 1 addition & 0 deletions doomsday/libshell/include/de/shell/AbstractLink
@@ -0,0 +1 @@
#include "abstractlink.h"
134 changes: 134 additions & 0 deletions doomsday/libshell/include/de/shell/abstractlink.h
@@ -0,0 +1,134 @@
/** @file abstractlink.h Network connection to a server.
*
* @authors Copyright © 2013 Jaakko Keränen <jaakko.keranen@iki.fi>
*
* @par License
* GPL: http://www.gnu.org/licenses/gpl.html
*
* <small>This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. This program is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details. You should have received a copy of the GNU
* General Public License along with this program; if not, see:
* http://www.gnu.org/licenses</small>
*/

#ifndef LIBSHELL_ABSTRACTLINK_H
#define LIBSHELL_ABSTRACTLINK_H

#include "libshell.h"
#include <de/Address>
#include <de/Socket>
#include <de/Time>
#include <de/Transmitter>
#include <QObject>

namespace de {
namespace shell {

/**
* Abstract network connection to a server.
*
* Derived implementations must provide a protocol for incoming messages.
*/
class LIBSHELL_PUBLIC AbstractLink : public QObject, public Transmitter
{
Q_OBJECT

public:
enum Status
{
Disconnected,
Connecting,
Connected
};

public:
AbstractLink();

virtual ~AbstractLink();

/**
* Opens a connection to a server over the network.
*
* @param domain Domain/IP address of the server.
* @param timeout Keep trying until this much time has passed.
*/
void connect(String const &domain, TimeDelta const &timeout = 0);

/**
* Opens a connection to a server over the network.
*
* @param address Address of the server.
*/
void connect(Address const &address);

/**
* Takes over an existing socket.
*
* @param openSocket Socket. AbstractLink takes ownership.
*/
void takeOver(Socket *openSocket);

/**
* Closes the connection.
*/
void disconnect();

/**
* Peer address of the link. The address may be a null address if the IP
* address hasn't been resolved yet.
*/
Address address() const;

/**
* Current status of the connection.
*/
Status status() const;

/**
* Returns the time when the link was successfully connected.
*/
Time connectedAt() const;

/**
* Returns the next received packet. The packet has been interpreted
* using the virtual interpret() method.
*
* @return Received packet. Ownership given to caller. Returns @c NULL if
* there are no more packets ready.
*/
Packet *nextPacket();

// Transmitter.
void send(IByteArray const &data);

protected:
virtual Packet *interpret(Message const &msg) = 0;

/**
* Called immediately after a connection has been formed.
*/
virtual void initiateCommunications() = 0;

protected slots:
void socketConnected();
void socketDisconnected();

signals:
void addressResolved();
void connected();
void disconnected();
void packetsReady();

private:
DENG2_PRIVATE(d)
};

} // namespace shell
} // namespace de

#endif // LIBSHELL_ABSTRACTLINK_H
50 changes: 5 additions & 45 deletions doomsday/libshell/include/de/shell/link.h
Expand Up @@ -24,6 +24,7 @@
#include <de/Socket>
#include <de/Time>
#include <de/Transmitter>
#include <de/shell/AbstractLink>
#include <de/shell/Protocol>
#include <QObject>

Expand All @@ -33,18 +34,10 @@ namespace shell {
/**
* Network connection to a server using the shell protocol.
*/
class LIBSHELL_PUBLIC Link : public QObject, public Transmitter
class LIBSHELL_PUBLIC Link : public AbstractLink
{
Q_OBJECT

public:
enum Status
{
Disconnected,
Connecting,
Connected
};

public:
/**
* Opens a connection to a server over the network.
Expand All @@ -70,47 +63,14 @@ class LIBSHELL_PUBLIC Link : public QObject, public Transmitter

virtual ~Link();

/**
* Peer address of the link. The address may be a null address if the IP
* address hasn't been resolved yet.
*/
Address address() const;

/**
* Current status of the connection.
*/
Status status() const;

/**
* Returns the time when the link was successfully connected.
*/
Time connectedAt() const;

/**
* Shell protocol for constructing and interpreting packets.
*/
Protocol &protocol();

/**
* Returns the next received packet.
*
* @return Received packet. Ownership given to caller. Returns @c NULL if
* there are no more packets ready.
*/
Packet *nextPacket();

// Transmitter.
void send(IByteArray const &data);

protected slots:
void socketConnected();
void socketDisconnected();

signals:
void addressResolved();
void connected();
void disconnected();
void packetsReady();
protected:
Packet *interpret(Message const &msg);
void initiateCommunications();

private:
DENG2_PRIVATE(d)
Expand Down
3 changes: 3 additions & 0 deletions doomsday/libshell/libshell.pro
Expand Up @@ -24,6 +24,7 @@ INCLUDEPATH += include

# Public headers.
HEADERS += \
include/de/shell/AbstractLink \
include/de/shell/Action \
include/de/shell/ChoiceWidget \
include/de/shell/CommandLineWidget \
Expand All @@ -44,6 +45,7 @@ HEADERS += \
include/de/shell/TextRootWidget \
include/de/shell/TextWidget \
\
include/de/shell/abstractlink.h \
include/de/shell/action.h \
include/de/shell/choicewidget.h \
include/de/shell/commandlinewidget.h \
Expand All @@ -67,6 +69,7 @@ HEADERS += \

# Sources and private headers.
SOURCES += \
src/abstractlink.cpp \
src/action.cpp \
src/choicewidget.cpp \
src/commandlinewidget.cpp \
Expand Down

0 comments on commit 6fd97a3

Please sign in to comment.