use virtual methods instead of function pointers (#1726)

This commit is contained in:
Buke Po
2017-05-08 21:49:59 -07:00
committed by Jonathan Hui
parent c5ed4dd32d
commit 0d855d1aa9
10 changed files with 54 additions and 90 deletions
+3 -3
View File
@@ -78,8 +78,8 @@ ThreadError CoapBase::Stop(void)
void CoapBase::HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo) void CoapBase::HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo)
{ {
static_cast<CoapBase *>(aContext)->mReceiver(aContext, *static_cast<Message *>(aMessage), static_cast<CoapBase *>(aContext)->Receive(*static_cast<Message *>(aMessage),
*static_cast<const Ip6::MessageInfo *>(aMessageInfo)); *static_cast<const Ip6::MessageInfo *>(aMessageInfo));
} }
ThreadError CoapBase::SendEmptyMessage(Header::Type aType, const Header &aRequestHeader, ThreadError CoapBase::SendEmptyMessage(Header::Type aType, const Header &aRequestHeader,
@@ -96,7 +96,7 @@ ThreadError CoapBase::SendEmptyMessage(Header::Type aType, const Header &aReques
VerifyOrExit((message = NewMessage(responseHeader)) != NULL, error = kThreadError_NoBufs); VerifyOrExit((message = NewMessage(responseHeader)) != NULL, error = kThreadError_NoBufs);
SuccessOrExit(error = mSender(this, *message, aMessageInfo)); SuccessOrExit(error = Send(*message, aMessageInfo));
exit: exit:
+22 -26
View File
@@ -85,26 +85,6 @@ class CoapBase
{ {
public: public:
/**
* This function pointer is called when CoAP client/server wants to send a message.
*
* @param[in] aContext A pointer to arbitrary context information.
* @param[in] aMessage A reference to the message to send.
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
*
*/
typedef ThreadError(* SenderFunction)(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
/**
* This function pointer is called when CoAP client/server receives a message.
*
* @param[in] aContext A pointer to arbitrary context information.
* @param[in] aMessage A reference to the received message.
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
*
*/
typedef void (* ReceiverFunction)(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
/** /**
* This constructor initializes the object. * This constructor initializes the object.
* *
@@ -113,10 +93,8 @@ public:
* @param[in] aReceiver A pointer to a function for handling received messages. * @param[in] aReceiver A pointer to a function for handling received messages.
* *
*/ */
CoapBase(Ip6::Udp &aUdp, SenderFunction aSender, ReceiverFunction aReceiver): CoapBase(Ip6::Udp &aUdp) :
mSocket(aUdp), mSocket(aUdp) {};
mSender(aSender),
mReceiver(aReceiver) {};
/** /**
* This method creates a new message with a CoAP header. * This method creates a new message with a CoAP header.
@@ -171,9 +149,27 @@ protected:
ThreadError Start(const Ip6::SockAddr &aSockAddr); ThreadError Start(const Ip6::SockAddr &aSockAddr);
ThreadError Stop(void); ThreadError Stop(void);
/**
* This method send a message.
*
* @param[in] aContext A pointer to arbitrary context information.
* @param[in] aMessage A reference to the message to send.
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
*
*/
virtual ThreadError Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) = 0;
/**
* This method receives a message.
*
* @param[in] aContext A pointer to arbitrary context information.
* @param[in] aMessage A reference to the received message.
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
*
*/
virtual void Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) = 0;
Ip6::UdpSocket mSocket; Ip6::UdpSocket mSocket;
SenderFunction mSender;
ReceiverFunction mReceiver;
private: private:
/** /**
+5 -5
View File
@@ -50,8 +50,8 @@
namespace ot { namespace ot {
namespace Coap { namespace Coap {
Client::Client(Ip6::Netif &aNetif, SenderFunction aSender, ReceiverFunction aReceiver): Client::Client(Ip6::Netif &aNetif):
CoapBase(aNetif.GetIp6().mUdp, aSender, aReceiver), CoapBase(aNetif.GetIp6().mUdp),
mRetransmissionTimer(aNetif.GetIp6().mTimerScheduler, &Client::HandleRetransmissionTimer, this) mRetransmissionTimer(aNetif.GetIp6().mTimerScheduler, &Client::HandleRetransmissionTimer, this)
{ {
mMessageId = static_cast<uint16_t>(otPlatRandomGet()); mMessageId = static_cast<uint16_t>(otPlatRandomGet());
@@ -120,7 +120,7 @@ ThreadError Client::SendMessage(Message &aMessage, const Ip6::MessageInfo &aMess
error = kThreadError_NoBufs); error = kThreadError_NoBufs);
} }
SuccessOrExit(error = mSender(this, aMessage, aMessageInfo)); SuccessOrExit(error = Send(aMessage, aMessageInfo));
exit: exit:
@@ -223,7 +223,7 @@ ThreadError Client::SendCopy(const Message &aMessage, const Ip6::MessageInfo &aM
error = kThreadError_NoBufs); error = kThreadError_NoBufs);
// Send the copy. // Send the copy.
SuccessOrExit(error = mSender(this, *messageCopy, aMessageInfo)); SuccessOrExit(error = Send(*messageCopy, aMessageInfo));
exit: exit:
@@ -360,7 +360,7 @@ void Client::FinalizeCoapTransaction(Message &aRequest, const RequestMetadata &a
} }
} }
void Client::ProcessReceivedMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) void Client::Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{ {
Header responseHeader; Header responseHeader;
Header requestHeader; Header requestHeader;
+7 -10
View File
@@ -171,7 +171,7 @@ public:
* @param[in] aReceiver A pointer to a function for handling received messages. * @param[in] aReceiver A pointer to a function for handling received messages.
* *
*/ */
Client(Ip6::Netif &aNetif, SenderFunction aSender = &Client::Send, ReceiverFunction aReceiver = &Client::Receive); Client(Ip6::Netif &aNetif);
/** /**
* This method starts the CoAP client. * This method starts the CoAP client.
@@ -229,7 +229,12 @@ public:
const MessageQueue &GetRequestMessages(void) const { return mPendingRequests; } const MessageQueue &GetRequestMessages(void) const { return mPendingRequests; }
protected: protected:
void ProcessReceivedMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo); virtual void Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
ThreadError Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) {
return mSocket.SendTo(aMessage, aMessageInfo);
}
private: private:
Message *CopyAndEnqueueMessage(const Message &aMessage, uint16_t aCopyLength, Message *CopyAndEnqueueMessage(const Message &aMessage, uint16_t aCopyLength,
@@ -244,14 +249,6 @@ private:
static void HandleRetransmissionTimer(void *aContext); static void HandleRetransmissionTimer(void *aContext);
void HandleRetransmissionTimer(void); void HandleRetransmissionTimer(void);
static ThreadError Send(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo) {
return (static_cast<Client *>(aContext))->mSocket.SendTo(aMessage, aMessageInfo);
}
static void Receive(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo) {
(static_cast<Client *>(aContext))->ProcessReceivedMessage(aMessage, aMessageInfo);
}
MessageQueue mPendingRequests; MessageQueue mPendingRequests;
uint16_t mMessageId; uint16_t mMessageId;
Timer mRetransmissionTimer; Timer mRetransmissionTimer;
+4 -4
View File
@@ -45,8 +45,8 @@
namespace ot { namespace ot {
namespace Coap { namespace Coap {
Server::Server(Ip6::Netif &aNetif, uint16_t aPort, SenderFunction aSender, ReceiverFunction aReceiver): Server::Server(Ip6::Netif &aNetif, uint16_t aPort) :
CoapBase(aNetif.GetIp6().mUdp, aSender, aReceiver), CoapBase(aNetif.GetIp6().mUdp),
mResponsesQueue(aNetif) mResponsesQueue(aNetif)
{ {
mPort = aPort; mPort = aPort;
@@ -111,7 +111,7 @@ ThreadError Server::SendMessage(Message &aMessage, const Ip6::MessageInfo &aMess
{ {
mResponsesQueue.EnqueueResponse(aMessage, aMessageInfo); mResponsesQueue.EnqueueResponse(aMessage, aMessageInfo);
return mSender(this, aMessage, aMessageInfo); return Send(aMessage, aMessageInfo);
} }
ThreadError Server::SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) ThreadError Server::SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo)
@@ -138,7 +138,7 @@ exit:
return error; return error;
} }
void Server::ProcessReceivedMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) void Server::Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{ {
Header header; Header header;
char uriPath[Resource::kMaxReceivedUriPath] = ""; char uriPath[Resource::kMaxReceivedUriPath] = "";
+6 -11
View File
@@ -310,8 +310,7 @@ public:
* @param[in] aReceiver A pointer to a function for handling received messages. * @param[in] aReceiver A pointer to a function for handling received messages.
* *
*/ */
Server(Ip6::Netif &aNetif, uint16_t aPort, SenderFunction aSender = &Server::Send, Server(Ip6::Netif &aNetif, uint16_t aPort);
ReceiverFunction aReceiver = &Server::Receive);
/** /**
* This method starts the CoAP server. * This method starts the CoAP server.
@@ -396,17 +395,13 @@ public:
} }
protected: protected:
void ProcessReceivedMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo); virtual void Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
virtual ThreadError Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) {
return mSocket.SendTo(aMessage, aMessageInfo);
}
private: private:
static ThreadError Send(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo) {
return (static_cast<Server *>(aContext))->mSocket.SendTo(aMessage, aMessageInfo);
}
static void Receive(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo) {
(static_cast<Server *>(aContext))->ProcessReceivedMessage(aMessage, aMessageInfo);
}
uint16_t mPort; uint16_t mPort;
Resource *mResources; Resource *mResources;
+2 -12
View File
@@ -51,7 +51,7 @@ namespace ot {
namespace Coap { namespace Coap {
SecureClient::SecureClient(ThreadNetif &aNetif): SecureClient::SecureClient(ThreadNetif &aNetif):
Client(aNetif, &SecureClient::Send, &SecureClient::Receive), Client(aNetif),
mConnectedCallback(NULL), mConnectedCallback(NULL),
mContext(NULL), mContext(NULL),
mNetif(aNetif), mNetif(aNetif),
@@ -121,22 +121,12 @@ exit:
return error; return error;
} }
ThreadError SecureClient::Send(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{
return static_cast<SecureClient *>(aContext)->Send(aMessage, aMessageInfo);
}
ThreadError SecureClient::Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) ThreadError SecureClient::Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{ {
(void)aMessageInfo; (void)aMessageInfo;
return mNetif.GetDtls().Send(aMessage, aMessage.GetLength()); return mNetif.GetDtls().Send(aMessage, aMessage.GetLength());
} }
void SecureClient::Receive(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{
return static_cast<SecureClient *>(aContext)->Receive(aMessage, aMessageInfo);
}
void SecureClient::Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) void SecureClient::Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{ {
otLogFuncEntry(); otLogFuncEntry();
@@ -177,7 +167,7 @@ void SecureClient::HandleDtlsReceive(uint8_t *aBuf, uint16_t aLength)
VerifyOrExit((message = mNetif.GetIp6().mMessagePool.New(Message::kTypeIp6, 0)) != NULL); VerifyOrExit((message = mNetif.GetIp6().mMessagePool.New(Message::kTypeIp6, 0)) != NULL);
SuccessOrExit(message->Append(aBuf, aLength)); SuccessOrExit(message->Append(aBuf, aLength));
ProcessReceivedMessage(*message, mPeerAddress); Client::Receive(*message, mPeerAddress);
exit: exit:
-2
View File
@@ -135,10 +135,8 @@ public:
ThreadError SendMessage(Message &aMessage, otCoapResponseHandler aHandler = NULL, void *aContext = NULL); ThreadError SendMessage(Message &aMessage, otCoapResponseHandler aHandler = NULL, void *aContext = NULL);
private: private:
static ThreadError Send(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
ThreadError Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo); ThreadError Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
static void Receive(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
void Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo); void Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
static void HandleDtlsConnected(void *aContext, bool aConnected); static void HandleDtlsConnected(void *aContext, bool aConnected);
+2 -12
View File
@@ -51,7 +51,7 @@ namespace ot {
namespace Coap { namespace Coap {
SecureServer::SecureServer(ThreadNetif &aNetif, uint16_t aPort): SecureServer::SecureServer(ThreadNetif &aNetif, uint16_t aPort):
Server(aNetif, aPort, &SecureServer::Send, &SecureServer::Receive), Server(aNetif, aPort),
mTransmitCallback(NULL), mTransmitCallback(NULL),
mContext(NULL), mContext(NULL),
mNetif(aNetif), mNetif(aNetif),
@@ -102,22 +102,12 @@ bool SecureServer::IsConnectionActive(void)
return mNetif.GetDtls().IsStarted(); return mNetif.GetDtls().IsStarted();
}; };
ThreadError SecureServer::Send(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{
return static_cast<SecureServer *>(aContext)->Send(aMessage, aMessageInfo);
}
ThreadError SecureServer::Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) ThreadError SecureServer::Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{ {
(void)aMessageInfo; (void)aMessageInfo;
return mNetif.GetDtls().Send(aMessage, aMessage.GetLength()); return mNetif.GetDtls().Send(aMessage, aMessage.GetLength());
} }
void SecureServer::Receive(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{
return static_cast<SecureServer *>(aContext)->Receive(aMessage, aMessageInfo);
}
void SecureServer::Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) void SecureServer::Receive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{ {
otLogFuncEntry(); otLogFuncEntry();
@@ -185,7 +175,7 @@ void SecureServer::HandleDtlsReceive(uint8_t *aBuf, uint16_t aLength)
VerifyOrExit((message = mNetif.GetIp6().mMessagePool.New(Message::kTypeIp6, 0)) != NULL); VerifyOrExit((message = mNetif.GetIp6().mMessagePool.New(Message::kTypeIp6, 0)) != NULL);
SuccessOrExit(message->Append(aBuf, aLength)); SuccessOrExit(message->Append(aBuf, aLength));
ProcessReceivedMessage(*message, mPeerAddress); Server::Receive(*message, mPeerAddress);
exit: exit:
+3 -5
View File
@@ -114,12 +114,10 @@ public:
*/ */
ThreadError SetPsk(const uint8_t *aPsk, uint8_t aPskLength); ThreadError SetPsk(const uint8_t *aPsk, uint8_t aPskLength);
protected:
virtual ThreadError Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
private: private:
static ThreadError Send(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
ThreadError Send(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
static void Receive(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
static void HandleDtlsConnected(void *aContext, bool aConnected); static void HandleDtlsConnected(void *aContext, bool aConnected);
void HandleDtlsConnected(bool aConnected); void HandleDtlsConnected(bool aConnected);