diff --git a/Android.mk b/Android.mk
index 19bd1abfd..d90560614 100644
--- a/Android.mk
+++ b/Android.mk
@@ -282,6 +282,7 @@ LOCAL_SRC_FILES := \
src/cli/cli_coap.cpp \
src/cli/cli_console.cpp \
src/cli/cli_dataset.cpp \
+ src/cli/cli_server.cpp \
src/cli/cli_uart.cpp \
src/cli/cli_udp.cpp \
src/posix/main.c \
diff --git a/etc/visual-studio/libopenthread-cli-windows.vcxproj b/etc/visual-studio/libopenthread-cli-windows.vcxproj
index db367ff02..90023b00b 100644
--- a/etc/visual-studio/libopenthread-cli-windows.vcxproj
+++ b/etc/visual-studio/libopenthread-cli-windows.vcxproj
@@ -60,6 +60,7 @@
+
diff --git a/etc/visual-studio/libopenthread-cli-windows.vcxproj.filters b/etc/visual-studio/libopenthread-cli-windows.vcxproj.filters
index a5869353a..9bd264429 100644
--- a/etc/visual-studio/libopenthread-cli-windows.vcxproj.filters
+++ b/etc/visual-studio/libopenthread-cli-windows.vcxproj.filters
@@ -16,6 +16,9 @@
Source Files
+
+ Source Files
+
Source Files
diff --git a/etc/visual-studio/libopenthread-cli.vcxproj b/etc/visual-studio/libopenthread-cli.vcxproj
index 8120e9fc8..056570495 100644
--- a/etc/visual-studio/libopenthread-cli.vcxproj
+++ b/etc/visual-studio/libopenthread-cli.vcxproj
@@ -58,6 +58,7 @@
+
diff --git a/etc/visual-studio/libopenthread-cli.vcxproj.filters b/etc/visual-studio/libopenthread-cli.vcxproj.filters
index b9bb74f64..3e307f0a1 100644
--- a/etc/visual-studio/libopenthread-cli.vcxproj.filters
+++ b/etc/visual-studio/libopenthread-cli.vcxproj.filters
@@ -12,7 +12,10 @@
Source Files
-
+
+
+ Source Files
+
Source Files
diff --git a/src/cli/Makefile.am b/src/cli/Makefile.am
index 4f6303500..880775087 100644
--- a/src/cli/Makefile.am
+++ b/src/cli/Makefile.am
@@ -147,6 +147,7 @@ SOURCES_COMMON = \
cli_coap_secure.cpp \
cli_console.cpp \
cli_dataset.cpp \
+ cli_server.cpp \
cli_uart.cpp \
cli_udp.cpp \
$(NULL)
diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp
index ee5904a03..d9064a7f0 100644
--- a/src/cli/cli.cpp
+++ b/src/cli/cli.cpp
@@ -3916,7 +3916,7 @@ Interpreter &Interpreter::GetOwner(OwnerLocator &aOwnerLocator)
#else
OT_UNUSED_VARIABLE(aOwnerLocator);
- Interpreter &interpreter = Uart::sUartServer->GetInterpreter();
+ Interpreter &interpreter = Server::sServer->GetInterpreter();
#endif
return interpreter;
}
diff --git a/src/cli/cli.hpp b/src/cli/cli.hpp
index 8f8c1bf65..c4348b291 100644
--- a/src/cli/cli.hpp
+++ b/src/cli/cli.hpp
@@ -43,7 +43,6 @@
#include
#include "cli/cli_dataset.hpp"
-#include "cli/cli_server.hpp"
#include "cli/cli_udp.hpp"
#if OPENTHREAD_ENABLE_APPLICATION_COAP
@@ -82,6 +81,7 @@ namespace ot {
namespace Cli {
class Interpreter;
+class Server;
/**
* This structure represents a CLI command.
diff --git a/src/cli/cli_coap.cpp b/src/cli/cli_coap.cpp
index d25227d14..beaed94ef 100644
--- a/src/cli/cli_coap.cpp
+++ b/src/cli/cli_coap.cpp
@@ -38,6 +38,7 @@
#include
#include "cli/cli.hpp"
+#include "cli/cli_server.hpp"
#include "coap/coap_message.hpp"
namespace ot {
diff --git a/src/cli/cli_coap_secure.cpp b/src/cli/cli_coap_secure.cpp
index 277b8ee76..e3e8c440d 100644
--- a/src/cli/cli_coap_secure.cpp
+++ b/src/cli/cli_coap_secure.cpp
@@ -39,6 +39,7 @@
#include
#include "cli/cli.hpp"
+#include "cli/cli_server.hpp"
// header for place your x509 certificate and private key
#include "x509_cert_key.hpp"
diff --git a/src/cli/cli_console.cpp b/src/cli/cli_console.cpp
index bfe25545c..f1e10620d 100644
--- a/src/cli/cli_console.cpp
+++ b/src/cli/cli_console.cpp
@@ -45,28 +45,26 @@
namespace ot {
namespace Cli {
-static Console *sServer;
-
static otDEFINE_ALIGNED_VAR(sCliConsoleRaw, sizeof(Console), uint64_t);
extern "C" void otCliConsoleInit(otInstance *aInstance, otCliConsoleOutputCallback aCallback, void *aContext)
{
Instance *instance = static_cast(aInstance);
- sServer = new (&sCliConsoleRaw) Console(instance);
- sServer->SetOutputCallback(aCallback);
- sServer->SetContext(aContext);
+ Server::sServer = new (&sCliConsoleRaw) Console(instance);
+ static_cast(Server::sServer)->SetOutputCallback(aCallback);
+ static_cast(Server::sServer)->SetContext(aContext);
}
extern "C" void otCliConsoleInputLine(char *aBuf, uint16_t aBufLength)
{
- sServer->ReceiveTask(aBuf, aBufLength);
+ static_cast(Server::sServer)->ReceiveTask(aBuf, aBufLength);
}
Console::Console(Instance *aInstance)
- : mCallback(NULL)
+ : Server(aInstance)
+ , mCallback(NULL)
, mContext(NULL)
- , mInterpreter(aInstance)
{
}
diff --git a/src/cli/cli_console.hpp b/src/cli/cli_console.hpp
index c1cb15a5f..7f1078df1 100644
--- a/src/cli/cli_console.hpp
+++ b/src/cli/cli_console.hpp
@@ -107,8 +107,6 @@ private:
otCliConsoleOutputCallback mCallback;
void * mContext;
-
- Interpreter mInterpreter;
};
} // namespace Cli
diff --git a/src/cli/cli_dataset.cpp b/src/cli/cli_dataset.cpp
index 91699a50d..5cd9a266d 100644
--- a/src/cli/cli_dataset.cpp
+++ b/src/cli/cli_dataset.cpp
@@ -40,6 +40,7 @@
#include
#include "cli/cli.hpp"
+#include "cli/cli_server.hpp"
namespace ot {
namespace Cli {
diff --git a/src/cli/cli_dataset.hpp b/src/cli/cli_dataset.hpp
index fea828b6c..f1b8d0e01 100644
--- a/src/cli/cli_dataset.hpp
+++ b/src/cli/cli_dataset.hpp
@@ -40,8 +40,6 @@
#include
-#include "cli/cli_server.hpp"
-
namespace ot {
namespace Cli {
diff --git a/src/cli/cli_instance.cpp b/src/cli/cli_instance.cpp
index c3f19ecb0..d20a5863d 100644
--- a/src/cli/cli_instance.cpp
+++ b/src/cli/cli_instance.cpp
@@ -37,6 +37,7 @@
#include
#include "cli.hpp"
+#include "cli_server.hpp"
#include "common/debug.hpp"
#include "utils/wrap_string.h"
diff --git a/src/cli/cli_server.cpp b/src/cli/cli_server.cpp
new file mode 100644
index 000000000..4dfeb0d38
--- /dev/null
+++ b/src/cli/cli_server.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2019, The OpenThread Authors.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * This file provides the static fields for CLI server.
+ */
+
+#include "cli_server.hpp"
+
+namespace ot {
+namespace Cli {
+
+Server *Server::sServer;
+
+} // namespace Cli
+} // namespace ot
diff --git a/src/cli/cli_server.hpp b/src/cli/cli_server.hpp
index 3e9ff40d3..1f5f69c65 100644
--- a/src/cli/cli_server.hpp
+++ b/src/cli/cli_server.hpp
@@ -36,6 +36,8 @@
#include "openthread-core-config.h"
+#include "cli/cli.hpp"
+
namespace ot {
namespace Cli {
@@ -46,6 +48,12 @@ namespace Cli {
class Server
{
public:
+ Server(Instance *aInstance)
+ : mInterpreter(aInstance)
+ {
+ ;
+ }
+
/**
* This method delivers raw characters to the client.
*
@@ -80,6 +88,19 @@ public:
OT_UNUSED_VARIABLE(aFormat);
return -1;
}
+
+ /**
+ * This method returns a reference to the interpreter object.
+ *
+ * @returns A reference to the interpreter object.
+ *
+ */
+ Interpreter &GetInterpreter(void) { return mInterpreter; }
+
+ static Server *sServer;
+
+protected:
+ Interpreter mInterpreter;
};
} // namespace Cli
diff --git a/src/cli/cli_uart.cpp b/src/cli/cli_uart.cpp
index 824bfbcbf..c6496f2dd 100644
--- a/src/cli/cli_uart.cpp
+++ b/src/cli/cli_uart.cpp
@@ -87,47 +87,45 @@
namespace ot {
namespace Cli {
-Uart *Uart::sUartServer;
-
static otDEFINE_ALIGNED_VAR(sCliUartRaw, sizeof(Uart), uint64_t);
extern "C" void otCliUartInit(otInstance *aInstance)
{
Instance *instance = static_cast(aInstance);
- Uart::sUartServer = new (&sCliUartRaw) Uart(instance);
+ Server::sServer = new (&sCliUartRaw) Uart(instance);
}
extern "C" void otCliUartSetUserCommands(const otCliCommand *aUserCommands, uint8_t aLength)
{
- Uart::sUartServer->GetInterpreter().SetUserCommands(aUserCommands, aLength);
+ Server::sServer->GetInterpreter().SetUserCommands(aUserCommands, aLength);
}
extern "C" void otCliUartOutputBytes(const uint8_t *aBytes, uint8_t aLength)
{
- Uart::sUartServer->GetInterpreter().OutputBytes(aBytes, aLength);
+ Server::sServer->GetInterpreter().OutputBytes(aBytes, aLength);
}
extern "C" void otCliUartOutputFormat(const char *aFmt, ...)
{
va_list aAp;
va_start(aAp, aFmt);
- Uart::sUartServer->OutputFormatV(aFmt, aAp);
+ static_cast(Server::sServer)->OutputFormatV(aFmt, aAp);
va_end(aAp);
}
extern "C" void otCliUartOutput(const char *aString, uint16_t aLength)
{
- Uart::sUartServer->Output(aString, aLength);
+ Server::sServer->Output(aString, aLength);
}
extern "C" void otCliUartAppendResult(otError aError)
{
- Uart::sUartServer->GetInterpreter().AppendResult(aError);
+ Server::sServer->GetInterpreter().AppendResult(aError);
}
Uart::Uart(Instance *aInstance)
- : mInterpreter(aInstance)
+ : Server(aInstance)
{
mRxLength = 0;
mTxHead = 0;
@@ -139,7 +137,7 @@ Uart::Uart(Instance *aInstance)
extern "C" void otPlatUartReceived(const uint8_t *aBuf, uint16_t aBufLength)
{
- Uart::sUartServer->ReceiveTask(aBuf, aBufLength);
+ static_cast(Server::sServer)->ReceiveTask(aBuf, aBufLength);
}
void Uart::ReceiveTask(const uint8_t *aBuf, uint16_t aBufLength)
@@ -339,7 +337,7 @@ exit:
extern "C" void otPlatUartSendDone(void)
{
- Uart::sUartServer->SendDoneTask();
+ static_cast(Server::sServer)->SendDoneTask();
}
void Uart::SendDoneTask(void)
@@ -356,10 +354,10 @@ extern "C" void otCliPlatLogv(otLogLevel aLogLevel, otLogRegion aLogRegion, cons
OT_UNUSED_VARIABLE(aLogLevel);
OT_UNUSED_VARIABLE(aLogRegion);
- VerifyOrExit(Uart::sUartServer != NULL);
+ VerifyOrExit(Server::sServer != NULL);
- Uart::sUartServer->OutputFormatV(aFormat, aArgs);
- Uart::sUartServer->OutputFormat("\r\n");
+ static_cast(Server::sServer)->OutputFormatV(aFormat, aArgs);
+ Server::sServer->OutputFormat("\r\n");
exit:
return;
diff --git a/src/cli/cli_uart.hpp b/src/cli/cli_uart.hpp
index f3e5133ff..c1012efd0 100644
--- a/src/cli/cli_uart.hpp
+++ b/src/cli/cli_uart.hpp
@@ -92,19 +92,9 @@ public:
*/
int OutputFormatV(const char *aFmt, va_list aAp);
- /**
- * This method returns a reference to the interpreter object.
- *
- * @returns A reference to the interpreter object.
- *
- */
- Interpreter &GetInterpreter(void) { return mInterpreter; }
-
void ReceiveTask(const uint8_t *aBuf, uint16_t aBufLength);
void SendDoneTask(void);
- static Uart *sUartServer;
-
private:
enum
{
@@ -125,8 +115,6 @@ private:
uint16_t mSendLength;
- Interpreter mInterpreter;
-
friend class Interpreter;
};
diff --git a/src/cli/cli_udp.cpp b/src/cli/cli_udp.cpp
index b04319af8..fd37e2616 100644
--- a/src/cli/cli_udp.cpp
+++ b/src/cli/cli_udp.cpp
@@ -37,6 +37,7 @@
#include
#include "cli/cli.hpp"
+#include "cli/cli_server.hpp"
#include "common/encoding.hpp"
using ot::Encoding::BigEndian::HostSwap16;