bug 517977: require actor impls to override AllocPFoo/DeallocPFoo instead of PFooConstructor/PFooDestructor

This commit is contained in:
Chris Jones
2009-09-22 12:31:11 -05:00
parent 4220fb4b47
commit 4e37ff3dba
21 changed files with 199 additions and 185 deletions

View File

@@ -76,7 +76,7 @@ ContentProcessChild::Init(MessageLoop* aIOLoop, IPC::Channel* aChannel)
}
PIFrameEmbeddingChild*
ContentProcessChild::PIFrameEmbeddingConstructor(const MagicWindowHandle& hwnd)
ContentProcessChild::AllocPIFrameEmbedding(const MagicWindowHandle& hwnd)
{
PIFrameEmbeddingChild* iframe = new TabChild(hwnd);
if (iframe && mIFrames.AppendElement(iframe)) {
@@ -87,14 +87,14 @@ ContentProcessChild::PIFrameEmbeddingConstructor(const MagicWindowHandle& hwnd)
}
bool
ContentProcessChild::PIFrameEmbeddingDestructor(PIFrameEmbeddingChild* iframe)
ContentProcessChild::DeallocPIFrameEmbedding(PIFrameEmbeddingChild* iframe)
{
mIFrames.RemoveElement(iframe);
return true;
}
PTestShellChild*
ContentProcessChild::PTestShellConstructor()
ContentProcessChild::AllocPTestShell()
{
PTestShellChild* testshell = new TestShellChild();
if (testshell && mTestShells.AppendElement(testshell)) {
@@ -105,20 +105,20 @@ ContentProcessChild::PTestShellConstructor()
}
bool
ContentProcessChild::PTestShellDestructor(PTestShellChild* shell)
ContentProcessChild::DeallocPTestShell(PTestShellChild* shell)
{
mTestShells.RemoveElement(shell);
return true;
}
PNeckoChild*
ContentProcessChild::PNeckoConstructor()
ContentProcessChild::AllocPNecko()
{
return new NeckoChild();
}
bool
ContentProcessChild::PNeckoDestructor(PNeckoChild* necko)
ContentProcessChild::DeallocPNecko(PNeckoChild* necko)
{
delete necko;
return true;

View File

@@ -60,15 +60,15 @@ public:
return sSingleton;
}
virtual PIFrameEmbeddingChild* PIFrameEmbeddingConstructor(
virtual PIFrameEmbeddingChild* AllocPIFrameEmbedding(
const MagicWindowHandle& hwnd);
virtual bool PIFrameEmbeddingDestructor(PIFrameEmbeddingChild*);
virtual bool DeallocPIFrameEmbedding(PIFrameEmbeddingChild*);
virtual PTestShellChild* PTestShellConstructor();
virtual bool PTestShellDestructor(PTestShellChild*);
virtual PTestShellChild* AllocPTestShell();
virtual bool DeallocPTestShell(PTestShellChild*);
virtual PNeckoChild* PNeckoConstructor();
virtual bool PNeckoDestructor(PNeckoChild*);
virtual PNeckoChild* AllocPNecko();
virtual bool DeallocPNecko(PNeckoChild*);
void Quit();
virtual bool RecvQuit();

View File

@@ -143,40 +143,40 @@ ContentProcessParent::OnWaitableEventSignaled(base::WaitableEvent *event)
}
PIFrameEmbeddingParent*
ContentProcessParent::PIFrameEmbeddingConstructor(
ContentProcessParent::AllocPIFrameEmbedding(
const MagicWindowHandle& parentWidget)
{
return new TabParent();
}
bool
ContentProcessParent::PIFrameEmbeddingDestructor(PIFrameEmbeddingParent* frame)
ContentProcessParent::DeallocPIFrameEmbedding(PIFrameEmbeddingParent* frame)
{
delete frame;
return true;
}
PTestShellParent*
ContentProcessParent::PTestShellConstructor()
ContentProcessParent::AllocPTestShell()
{
return new TestShellParent();
}
bool
ContentProcessParent::PTestShellDestructor(PTestShellParent* shell)
ContentProcessParent::DeallocPTestShell(PTestShellParent* shell)
{
delete shell;
return true;
}
PNeckoParent*
ContentProcessParent::PNeckoConstructor()
ContentProcessParent::AllocPNecko()
{
return new NeckoParent();
}
bool
ContentProcessParent::PNeckoDestructor(PNeckoParent* necko)
ContentProcessParent::DeallocPNecko(PNeckoParent* necko)
{
delete necko;
return true;

View File

@@ -91,15 +91,15 @@ private:
ContentProcessParent();
virtual ~ContentProcessParent();
virtual PIFrameEmbeddingParent* PIFrameEmbeddingConstructor(
virtual PIFrameEmbeddingParent* AllocPIFrameEmbedding(
const MagicWindowHandle& parentWidget);
virtual bool PIFrameEmbeddingDestructor(PIFrameEmbeddingParent* frame);
virtual bool DeallocPIFrameEmbedding(PIFrameEmbeddingParent* frame);
virtual PTestShellParent* PTestShellConstructor();
virtual bool PTestShellDestructor(PTestShellParent* shell);
virtual PTestShellParent* AllocPTestShell();
virtual bool DeallocPTestShell(PTestShellParent* shell);
virtual PNeckoParent* PNeckoConstructor();
virtual bool PNeckoDestructor(PNeckoParent* necko);
virtual PNeckoParent* AllocPNecko();
virtual bool DeallocPNecko(PNeckoParent* necko);
mozilla::Monitor mMonitor;

View File

@@ -422,7 +422,7 @@ PluginInstanceChild::PluginWindowProc(HWND hWnd,
#endif // OS_WIN
PPluginScriptableObjectChild*
PluginInstanceChild::PPluginScriptableObjectConstructor()
PluginInstanceChild::AllocPPluginScriptableObject()
{
nsAutoPtr<PluginScriptableObjectChild>* object =
mScriptableObjects.AppendElement();
@@ -435,7 +435,7 @@ PluginInstanceChild::PPluginScriptableObjectConstructor()
}
bool
PluginInstanceChild::PPluginScriptableObjectDestructor(PPluginScriptableObjectChild* aObject)
PluginInstanceChild::DeallocPPluginScriptableObject(PPluginScriptableObjectChild* aObject)
{
PluginScriptableObjectChild* object =
reinterpret_cast<PluginScriptableObjectChild*>(aObject);
@@ -451,7 +451,7 @@ PluginInstanceChild::PPluginScriptableObjectDestructor(PPluginScriptableObjectCh
}
PBrowserStreamChild*
PluginInstanceChild::PBrowserStreamConstructor(const nsCString& url,
PluginInstanceChild::AllocPBrowserStream(const nsCString& url,
const uint32_t& length,
const uint32_t& lastmodified,
const PStreamNotifyChild* notifyData,
@@ -476,7 +476,7 @@ PluginInstanceChild::AnswerPBrowserStreamDestructor(PBrowserStreamChild* stream,
}
bool
PluginInstanceChild::PBrowserStreamDestructor(PBrowserStreamChild* stream,
PluginInstanceChild::DeallocPBrowserStream(PBrowserStreamChild* stream,
const NPError& reason,
const bool& artificial)
{
@@ -485,7 +485,7 @@ PluginInstanceChild::PBrowserStreamDestructor(PBrowserStreamChild* stream,
}
PPluginStreamChild*
PluginInstanceChild::PPluginStreamConstructor(const nsCString& mimeType,
PluginInstanceChild::AllocPPluginStream(const nsCString& mimeType,
const nsCString& target,
NPError* result)
{
@@ -505,7 +505,7 @@ PluginInstanceChild::AnswerPPluginStreamDestructor(PPluginStreamChild* stream,
}
bool
PluginInstanceChild::PPluginStreamDestructor(PPluginStreamChild* stream,
PluginInstanceChild::DeallocPPluginStream(PPluginStreamChild* stream,
const NPError& reason,
const bool& artificial)
{
@@ -514,7 +514,7 @@ PluginInstanceChild::PPluginStreamDestructor(PPluginStreamChild* stream,
}
PStreamNotifyChild*
PluginInstanceChild::PStreamNotifyConstructor(const nsCString& url,
PluginInstanceChild::AllocPStreamNotify(const nsCString& url,
const nsCString& target,
const bool& post,
const nsCString& buffer,
@@ -526,7 +526,7 @@ PluginInstanceChild::PStreamNotifyConstructor(const nsCString& url,
}
bool
PluginInstanceChild::PStreamNotifyDestructor(PStreamNotifyChild* notifyData,
PluginInstanceChild::DeallocPStreamNotify(PStreamNotifyChild* notifyData,
const NPReason& reason)
{
StreamNotifyChild* sn = static_cast<StreamNotifyChild*>(notifyData);

View File

@@ -78,13 +78,13 @@ protected:
AnswerNPP_HandleEvent(const NPEvent& event, int16_t* handled);
virtual PPluginScriptableObjectChild*
PPluginScriptableObjectConstructor();
AllocPPluginScriptableObject();
virtual bool
PPluginScriptableObjectDestructor(PPluginScriptableObjectChild* aObject);
DeallocPPluginScriptableObject(PPluginScriptableObjectChild* aObject);
virtual PBrowserStreamChild*
PBrowserStreamConstructor(const nsCString& url,
AllocPBrowserStream(const nsCString& url,
const uint32_t& length,
const uint32_t& lastmodified,
const PStreamNotifyChild* notifyData,
@@ -100,12 +100,12 @@ protected:
const bool& artificial);
virtual bool
PBrowserStreamDestructor(PBrowserStreamChild* stream,
DeallocPBrowserStream(PBrowserStreamChild* stream,
const NPError& reason,
const bool& artificial);
virtual PPluginStreamChild*
PPluginStreamConstructor(const nsCString& mimeType,
AllocPPluginStream(const nsCString& mimeType,
const nsCString& target,
NPError* result);
@@ -115,18 +115,18 @@ protected:
const bool& artificial);
virtual bool
PPluginStreamDestructor(PPluginStreamChild* stream,
DeallocPPluginStream(PPluginStreamChild* stream,
const NPReason& reason,
const bool& artificial);
virtual PStreamNotifyChild*
PStreamNotifyConstructor(const nsCString& url, const nsCString& target,
AllocPStreamNotify(const nsCString& url, const nsCString& target,
const bool& post, const nsCString& buffer,
const bool& file,
NPError* result);
virtual bool
PStreamNotifyDestructor(PStreamNotifyChild* notifyData,
DeallocPStreamNotify(PStreamNotifyChild* notifyData,
const NPReason& reason);
public:

View File

@@ -45,7 +45,7 @@ namespace mozilla {
namespace plugins {
PBrowserStreamParent*
PluginInstanceParent::PBrowserStreamConstructor(const nsCString& url,
PluginInstanceParent::AllocPBrowserStream(const nsCString& url,
const uint32_t& length,
const uint32_t& lastmodified,
const PStreamNotifyParent* notifyData,
@@ -71,7 +71,7 @@ PluginInstanceParent::AnswerPBrowserStreamDestructor(PBrowserStreamParent* strea
}
bool
PluginInstanceParent::PBrowserStreamDestructor(PBrowserStreamParent* stream,
PluginInstanceParent::DeallocPBrowserStream(PBrowserStreamParent* stream,
const NPError& reason,
const bool& artificial)
{
@@ -80,7 +80,7 @@ PluginInstanceParent::PBrowserStreamDestructor(PBrowserStreamParent* stream,
}
PPluginStreamParent*
PluginInstanceParent::PPluginStreamConstructor(const nsCString& mimeType,
PluginInstanceParent::AllocPPluginStream(const nsCString& mimeType,
const nsCString& target,
NPError* result)
{
@@ -88,7 +88,7 @@ PluginInstanceParent::PPluginStreamConstructor(const nsCString& mimeType,
}
bool
PluginInstanceParent::PPluginStreamDestructor(PPluginStreamParent* stream,
PluginInstanceParent::DeallocPPluginStream(PPluginStreamParent* stream,
const NPError& reason,
const bool& artificial)
{
@@ -176,7 +176,7 @@ PluginInstanceParent::AnswerNPN_PostURL(const nsCString& url,
}
PStreamNotifyParent*
PluginInstanceParent::PStreamNotifyConstructor(const nsCString& url,
PluginInstanceParent::AllocPStreamNotify(const nsCString& url,
const nsCString& target,
const bool& post,
const nsCString& buffer,
@@ -203,7 +203,7 @@ PluginInstanceParent::PStreamNotifyConstructor(const nsCString& url,
}
bool
PluginInstanceParent::PStreamNotifyDestructor(PStreamNotifyParent* notifyData,
PluginInstanceParent::DeallocPStreamNotify(PStreamNotifyParent* notifyData,
const NPReason& reason)
{
delete notifyData;
@@ -313,13 +313,13 @@ PluginInstanceParent::NPP_DestroyStream(NPStream* stream, NPReason reason)
}
PPluginScriptableObjectParent*
PluginInstanceParent::PPluginScriptableObjectConstructor()
PluginInstanceParent::AllocPPluginScriptableObject()
{
return new PluginScriptableObjectParent();
}
bool
PluginInstanceParent::PPluginScriptableObjectDestructor(PPluginScriptableObjectParent* aObject)
PluginInstanceParent::DeallocPPluginScriptableObject(PPluginScriptableObjectParent* aObject)
{
delete aObject;
return true;

View File

@@ -71,13 +71,13 @@ public:
}
virtual PPluginScriptableObjectParent*
PPluginScriptableObjectConstructor();
AllocPPluginScriptableObject();
virtual bool
PPluginScriptableObjectDestructor(PPluginScriptableObjectParent* aObject);
DeallocPPluginScriptableObject(PPluginScriptableObjectParent* aObject);
virtual PBrowserStreamParent*
PBrowserStreamConstructor(const nsCString& url,
AllocPBrowserStream(const nsCString& url,
const uint32_t& length,
const uint32_t& lastmodified,
const PStreamNotifyParent* notifyData,
@@ -93,17 +93,17 @@ public:
const bool& artificial);
virtual bool
PBrowserStreamDestructor(PBrowserStreamParent* stream,
DeallocPBrowserStream(PBrowserStreamParent* stream,
const NPError& reason,
const bool& artificial);
virtual PPluginStreamParent*
PPluginStreamConstructor(const nsCString& mimeType,
AllocPPluginStream(const nsCString& mimeType,
const nsCString& target,
NPError* result);
virtual bool
PPluginStreamDestructor(PPluginStreamParent* stream,
DeallocPPluginStream(PPluginStreamParent* stream,
const NPError& reason,
const bool& artificial);
@@ -132,13 +132,13 @@ public:
NPError* result);
virtual PStreamNotifyParent*
PStreamNotifyConstructor(const nsCString& url, const nsCString& target,
AllocPStreamNotify(const nsCString& url, const nsCString& target,
const bool& post, const nsCString& buffer,
const bool& file,
NPError* result);
virtual bool
PStreamNotifyDestructor(PStreamNotifyParent* notifyData,
DeallocPStreamNotify(PStreamNotifyParent* notifyData,
const NPReason& reason);
NPError NPP_SetWindow(NPWindow* aWindow);

View File

@@ -986,7 +986,7 @@ PluginModuleChild::AnswerNP_Initialize(NPError* _retval)
}
PPluginInstanceChild*
PluginModuleChild::PPluginInstanceConstructor(const nsCString& aMimeType,
PluginModuleChild::AllocPPluginInstance(const nsCString& aMimeType,
const uint16_t& aMode,
const nsTArray<nsCString>& aNames,
const nsTArray<nsCString>& aValues,
@@ -1054,7 +1054,7 @@ PluginModuleChild::AnswerPPluginInstanceConstructor(PPluginInstanceChild* aActor
}
bool
PluginModuleChild::PPluginInstanceDestructor(PPluginInstanceChild* actor,
PluginModuleChild::DeallocPPluginInstance(PPluginInstanceChild* actor,
NPError* rv)
{
_MOZ_LOG(__FUNCTION__);

View File

@@ -102,14 +102,14 @@ protected:
virtual bool AnswerNP_Initialize(NPError* rv);
virtual PPluginInstanceChild*
PPluginInstanceConstructor(const nsCString& aMimeType,
AllocPPluginInstance(const nsCString& aMimeType,
const uint16_t& aMode,
const nsTArray<nsCString>& aNames,
const nsTArray<nsCString>& aValues,
NPError* rv);
virtual bool
PPluginInstanceDestructor(PPluginInstanceChild* aActor,
DeallocPPluginInstance(PPluginInstanceChild* aActor,
NPError* rv);
virtual bool

View File

@@ -86,7 +86,7 @@ PluginModuleParent::~PluginModuleParent()
}
PPluginInstanceParent*
PluginModuleParent::PPluginInstanceConstructor(const nsCString& aMimeType,
PluginModuleParent::AllocPPluginInstance(const nsCString& aMimeType,
const uint16_t& aMode,
const nsTArray<nsCString>& aNames,
const nsTArray<nsCString>& aValues,
@@ -97,7 +97,7 @@ PluginModuleParent::PPluginInstanceConstructor(const nsCString& aMimeType,
}
bool
PluginModuleParent::PPluginInstanceDestructor(PPluginInstanceParent* aActor,
PluginModuleParent::DeallocPPluginInstance(PPluginInstanceParent* aActor,
NPError* _retval)
{
_MOZ_LOG(__FUNCTION__);

View File

@@ -84,14 +84,14 @@ private:
protected:
PPluginInstanceParent*
PPluginInstanceConstructor(const nsCString& aMimeType,
AllocPPluginInstance(const nsCString& aMimeType,
const uint16_t& aMode,
const nsTArray<nsCString>& aNames,
const nsTArray<nsCString>& aValues,
NPError* rv);
virtual bool
PPluginInstanceDestructor(PPluginInstanceParent* aActor,
DeallocPPluginInstance(PPluginInstanceParent* aActor,
NPError* _retval);
public:

View File

@@ -839,6 +839,13 @@ class GenerateProtocolHeader(Visitor):
md._cxx.replyid = 'Reply_%s'% (md.decl.progname)
md._cxx.nsreplyid = '%s::%s'% (self.pname, md._cxx.replyid)
# the names of the factory ctor/dtor the manager (if it exists)
# will implement
cdtype = md.decl.type.constructedType()
if cdtype is not None:
md._cxx.alloc = 'Alloc'+ cdtype.name()
md._cxx.dealloc = 'Dealloc'+ cdtype.name()
def visitTransitionStmt(self, ts):
ts.state.decl._cxxname = 'State_%s__ID'% (ts.state.decl.progname)
@@ -1224,6 +1231,14 @@ class GenerateProtocolActorHeader(Visitor):
self.myside),
ptr=1)
meth = deepcopy(md._cxx.method)
if md.decl.type.isCtor():
meth.name = md._cxx.alloc
elif md.decl.type.isDtor():
meth.name = md._cxx.dealloc
else:
assert 0
for param in meth.params:
if param.type.actor:
param.type.name = _actorName(param.type.name,
@@ -1558,7 +1573,6 @@ class GenerateProtocolActorHeader(Visitor):
block.addstmt(cxx.CppDirective('endif', '// ifdef DEBUG'))
block.addstmt(cxx.Whitespace.NL)
if self.sendsMessage(md):
pfx = None
if md.decl.type.isRpc():
@@ -1606,7 +1620,7 @@ class GenerateProtocolActorHeader(Visitor):
#
# here |impl| is the first ctor interface above
callctor = cxx.ExprCall(cxx.ExprVar(md._cxx.method.name),
callctor = cxx.ExprCall(cxx.ExprVar(md._cxx.alloc),
[ cxx.ExprVar(p.name) for
p in md._cxx.method.params ])
impl.addstmt(cxx.StmtReturn(
@@ -2005,7 +2019,7 @@ class GenerateProtocolActorHeader(Visitor):
cxx.ExprAssn(objid, cxx.ExprLiteral.ZERO)))
calldtor = cxx.ExprCall(
cxx.ExprVar(md._cxx.method.name),
cxx.ExprVar(md._cxx.dealloc),
([ objvar ]
+ [ cxx.ExprVar(p.name) for p in md._cxx.params ]
+ [ cxx.ExprVar(r.name) for r in md._cxx.returns ]))
@@ -2162,7 +2176,7 @@ class GenerateProtocolActorHeader(Visitor):
block.addstmt(cxx.StmtExpr(cxx.ExprAssn(
objvar,
cxx.ExprCall(
cxx.ExprVar(md._cxx.method.name),
cxx.ExprVar(md._cxx.alloc),
([ cxx.ExprVar(p.name) for
p in md._cxx.params ]
+ [ cxx.ExprAddrOf(cxx.ExprVar(r.name)) for
@@ -2226,7 +2240,7 @@ class GenerateProtocolActorHeader(Visitor):
cxx.ExprLiteral.ZERO)))
calldtor = cxx.ExprCall(
cxx.ExprVar(md._cxx.method.name),
cxx.ExprVar(md._cxx.dealloc),
([ objvar ]
+ [ cxx.ExprVar(p.name) for p in md._cxx.params ]
+ [ cxx.ExprAddrOf(cxx.ExprVar(r.name)) for

View File

@@ -57,13 +57,13 @@ TestShellChild::RecvExecuteCommand(const nsString& aCommand)
}
PTestShellCommandChild*
TestShellChild::PTestShellCommandConstructor(const nsString& aCommand)
TestShellChild::AllocPTestShellCommand(const nsString& aCommand)
{
return new PTestShellCommandChild();
}
bool
TestShellChild::PTestShellCommandDestructor(PTestShellCommandChild* aCommand,
TestShellChild::DeallocPTestShellCommand(PTestShellCommandChild* aCommand,
const nsString& aResponse)
{
delete aCommand;

View File

@@ -57,14 +57,14 @@ public:
RecvExecuteCommand(const nsString& aCommand);
PTestShellCommandChild*
PTestShellCommandConstructor(const nsString& aCommand);
AllocPTestShellCommand(const nsString& aCommand);
bool
RecvPTestShellCommandConstructor(PTestShellCommandChild* aActor,
const nsString& aCommand);
bool
PTestShellCommandDestructor(PTestShellCommandChild* aCommand,
DeallocPTestShellCommand(PTestShellCommandChild* aCommand,
const nsString& aResponse);
void SetXPCShell(XPCShellEnvironment* aXPCShell) {

View File

@@ -43,13 +43,13 @@ using mozilla::ipc::TestShellCommandParent;
using mozilla::ipc::PTestShellCommandParent;
PTestShellCommandParent*
TestShellParent::PTestShellCommandConstructor(const nsString& aCommand)
TestShellParent::AllocPTestShellCommand(const nsString& aCommand)
{
return new TestShellCommandParent();
}
bool
TestShellParent::PTestShellCommandDestructor(PTestShellCommandParent* aActor,
TestShellParent::DeallocPTestShellCommand(PTestShellCommandParent* aActor,
const nsString& aResponse)
{
delete aActor;

View File

@@ -68,10 +68,10 @@ class TestShellParent : public PTestShellParent
{
public:
PTestShellCommandParent*
PTestShellCommandConstructor(const nsString& aCommand);
AllocPTestShellCommand(const nsString& aCommand);
bool
PTestShellCommandDestructor(PTestShellCommandParent* aActor,
DeallocPTestShellCommand(PTestShellCommandParent* aActor,
const nsString& aResponse);
bool

View File

@@ -68,13 +68,13 @@ void NeckoChild::InitNeckoChild()
}
PHttpChannelChild*
NeckoChild::PHttpChannelConstructor()
NeckoChild::AllocPHttpChannel()
{
return new HttpChannelChild();
}
bool
NeckoChild::PHttpChannelDestructor(PHttpChannelChild* channel)
NeckoChild::DeallocPHttpChannel(PHttpChannelChild* channel)
{
delete channel;
return true;

View File

@@ -58,8 +58,8 @@ public:
static void InitNeckoChild();
virtual PHttpChannelChild* PHttpChannelConstructor();
virtual bool PHttpChannelDestructor(PHttpChannelChild*);
virtual PHttpChannelChild* AllocPHttpChannel();
virtual bool DeallocPHttpChannel(PHttpChannelChild*);
protected:
};

View File

@@ -54,13 +54,13 @@ NeckoParent::~NeckoParent()
}
PHttpChannelParent*
NeckoParent::PHttpChannelConstructor()
NeckoParent::AllocPHttpChannel()
{
return new HttpChannelParent();
}
bool
NeckoParent::PHttpChannelDestructor(PHttpChannelParent* channel)
NeckoParent::DeallocPHttpChannel(PHttpChannelParent* channel)
{
delete channel;
return true;

View File

@@ -56,8 +56,8 @@ public:
virtual ~NeckoParent();
protected:
virtual PHttpChannelParent* PHttpChannelConstructor();
virtual bool PHttpChannelDestructor(PHttpChannelParent*);
virtual PHttpChannelParent* AllocPHttpChannel();
virtual bool DeallocPHttpChannel(PHttpChannelParent*);
};
} // namespace net