summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfhunleth <fhunleth@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2002-01-12 21:42:33 +0000
committerfhunleth <fhunleth@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2002-01-12 21:42:33 +0000
commit4ba56b30188a3b5ba00ccbc4fb0448c1f1f49e5c (patch)
treede195fe9b594869014efd099fb09fd92dc9d48bf
parent155fe26172c7d4a1773ad8f81489e6810f7c22f2 (diff)
downloadATCD-4ba56b30188a3b5ba00ccbc4fb0448c1f1f49e5c.tar.gz
More miop
-rw-r--r--TAO/TAOACE.dsw15
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup.dsp609
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup.idl239
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.cpp186
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h104
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.cpp69
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.cpp82
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h63
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.cpp58
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h63
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.cpp188
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.h124
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.cpp391
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.h162
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.i23
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp426
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h189
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.i3
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp255
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.h96
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.cpp139
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.h125
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.i48
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.cpp93
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.h64
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.cpp803
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.h225
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.i19
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp539
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h137
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.i2
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/portablegroup_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/mgm.idl74
-rw-r--r--TAO/orbsvcs/orbsvcs/miop.idl81
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/Makefile1335
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/Makefile.bor7
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/McastHello.cpp37
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/McastHello.dsw40
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/McastHello.h53
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/README31
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/Test.idl20
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/client.bor35
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/client.conf2
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/client.cpp86
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/client.dsp200
-rwxr-xr-xTAO/orbsvcs/tests/Miop/McastHello/run_test.pl54
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/server.bor39
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/server.conf3
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/server.cpp136
-rw-r--r--TAO/orbsvcs/tests/Miop/McastHello/server.dsp216
51 files changed, 8101 insertions, 0 deletions
diff --git a/TAO/TAOACE.dsw b/TAO/TAOACE.dsw
index e0ccf33ae7e..695c7957532 100644
--- a/TAO/TAOACE.dsw
+++ b/TAO/TAOACE.dsw
@@ -621,6 +621,21 @@ Package=<4>
###############################################################################
+Project: "PortableGroup"=.\orbsvcs\orbsvcs\PortableGroup.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name PortableServer
+ End Project Dependency
+}}}
+
+###############################################################################
+
Project: "PortableServer"=.\tao\PortableServer\TAO_PortableServer.dsp - Package Owner=<4>
Package=<5>
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup.dsp b/TAO/orbsvcs/orbsvcs/PortableGroup.dsp
new file mode 100644
index 00000000000..99f11018a55
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup.dsp
@@ -0,0 +1,609 @@
+# Microsoft Developer Studio Project File - Name="PortableGroup" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=PortableGroup - Win32 MFC Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "PortableGroup.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "PortableGroup.mak" CFG="PortableGroup - Win32 MFC Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "PortableGroup - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "PortableGroup - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "PortableGroup - Win32 MFC Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "PortableGroup - Win32 MFC Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "DLL\Release\PortableGroup"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PortableGroup_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "../" /I "../../" /I "../../../" /D "NDEBUG" /D "TAO_PORTABLEGROUP_BUILD_DLL" /D "WIN32" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 ace.lib TAO.lib /nologo /dll /machine:I386 /out:"..\..\..\bin\TAO_PortableGroup.dll" /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "DLL\Debug\PortableGroup"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PortableGroup_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I ".." /I "../.." /I "../../.." /D "_DEBUG" /D "TAO_PORTABLEGROUP_BUILD_DLL" /D "WIN32" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 TAOd.lib aced.lib TAO_CosNamingd.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\bin\TAO_PortableGroupd.dll" /pdbtype:sept /libpath:"..\..\tao" /libpath:"..\..\..\ace" /libpath:"..\..\orbsvcs\orbsvcs"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "PortableGroup___Win32_MFC_Debug"
+# PROP BASE Intermediate_Dir "PortableGroup___Win32_MFC_Debug"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "DLL\Debug\PortableGroupMFC"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../" /I "../../" /I "../../../" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "TAO_PORTABLEGROUP_BUILD_DLL" /FD /c
+# SUBTRACT BASE CPP /YX
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../" /I "../../" /I "../../../" /D "_DEBUG" /D ACE_HAS_MFC=1 /D "TAO_PORTABLEGROUP_BUILD_DLL" /D "WIN32" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 TAOd.lib aced.lib TAO_Svc_Utilsd.lib TAO_RTEventd.lib TAO_RTSchedd.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\bin\TAO_PortableGroupd.dll" /pdbtype:sept /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+# ADD LINK32 TAOmfcd.lib acemfcd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\bin\TAO_PortableGroupmfcd.dll" /pdbtype:sept /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "PortableGroup___Win32_MFC_Release"
+# PROP BASE Intermediate_Dir "PortableGroup___Win32_MFC_Release"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "DLL\Release\PortableGroupMFC"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "../" /I "../../" /I "../../../" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "TAO_PORTABLEGROUP_BUILD_DLL" /FD /c
+# SUBTRACT BASE CPP /YX
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "../" /I "../../" /I "../../../" /D "NDEBUG" /D ACE_HAS_MFC=1 /D "TAO_PORTABLEGROUP_BUILD_DLL" /D "WIN32" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 ace.lib TAO.lib TAO_Svc_Utils.lib TAO_RTEvent.lib TAO_RTSched.lib /nologo /dll /machine:I386 /out:"..\..\..\bin\TAO_PortableGroup.dll" /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+# ADD LINK32 TAOmfc.lib acemfc.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\..\bin\TAO_PortableGroupmfc.dll" /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+
+!ENDIF
+
+# Begin Target
+
+# Name "PortableGroup - Win32 Release"
+# Name "PortableGroup - Win32 Debug"
+# Name "PortableGroup - Win32 MFC Debug"
+# Name "PortableGroup - Win32 MFC Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\miopC.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\POA_Hooks.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\Portable_Group_Map.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\PortableGroup_Acceptor_Registry.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\PortableGroup_Loader.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\PortableGroup_ORBInitializer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\PortableGroup_Request_Dispatcher.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroupC.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Acceptor.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Connection_Handler.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Connector.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Endpoint.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Factory.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Profile.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Transport.cpp
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# ADD CPP /I "../../tao"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\miopC.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\POA_Hooks.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\Portable_Group_Map.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\PortableGroup_Acceptor_Registry.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\portablegroup_export.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\PortableGroup_Loader.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\PortableGroup_ORBInitializer.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\PortableGroup_Request_Dispatcher.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroupC.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Acceptor.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Connection_Handler.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Connector.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Endpoint.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Factory.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Profile.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Transport.h
+# End Source File
+# End Group
+# Begin Group "Inline Files"
+
+# PROP Default_Filter ".i"
+# Begin Source File
+
+SOURCE=.\miopC.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroupC.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Acceptor.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Connection_Handler.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Endpoint.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Profile.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup\UIPMC_Transport.i
+# End Source File
+# End Group
+# Begin Group "IDL Files"
+
+# PROP Default_Filter ".idl"
+# Begin Source File
+
+SOURCE=.\miop.idl
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# PROP Ignore_Default_Tool 1
+USERDEP__MIOP_="..\..\..\bin\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler on $(InputName)
+InputPath=.\miop.idl
+InputName=miop
+
+BuildCmds= \
+ ..\..\..\bin\tao_idl -Ge 1 -I../../ -I../../tao -Wb,pre_include=ace/pre.h -Wb,post_include=ace/post.h -Wb,export_macro=TAO_PortableGroup_Export -Wb,export_include=PortableGroup/portablegroup_export.h $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\PortableGroup.idl
+
+!IF "$(CFG)" == "PortableGroup - Win32 Release"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 Debug"
+
+# PROP Ignore_Default_Tool 1
+USERDEP__PORTA="..\..\..\bin\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler on $(InputName)
+InputPath=.\PortableGroup.idl
+InputName=PortableGroup
+
+BuildCmds= \
+ ..\..\..\bin\tao_idl -Ge 1 -I../../ -I../../tao -Wb,pre_include=ace/pre.h -Wb,post_include=ace/post.h -Wb,export_macro=TAO_PortableGroup_Export -Wb,export_include=PortableGroup/portablegroup_export.h $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Debug"
+
+!ELSEIF "$(CFG)" == "PortableGroup - Win32 MFC Release"
+
+!ENDIF
+
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup.idl b/TAO/orbsvcs/orbsvcs/PortableGroup.idl
new file mode 100644
index 00000000000..89e9b7ce328
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup.idl
@@ -0,0 +1,239 @@
+//
+// $Id$
+//
+// ================================================================
+//
+// = LIBRARY
+// TAO_PortableGroup
+//
+// = FILENAME
+// PortableGroup.pidl
+//
+// = DESCRIPTION
+//
+// This file was used to generate the code in PortableGroupC.{h,i,cpp}
+//
+// The command used to generate code from this file is:
+//
+// tao_idl.exe \
+// -Ge 1 \
+// -Wb,export_macro=TAO_PortableGroup_Export \
+// -Wb,export_include="tao/corbafwd.h" \
+// -Wb,pre_include="ace/pre.h" \
+// -Wb,post_include="ace/post.h" \
+// -I../../orbsvcs/orbsvcs \
+// PortableGroup.pidl
+//
+// After the file is generated a patch from the diffs directory must
+// be applied. The patch:
+//
+// - Disables parts of the code under certain configurations.
+//
+// - Eliminates cycles in the include dependencies.
+//
+// - Adds non-idl components of PortableGroup to the namespace.
+// This includes (a) Servant (b) ServantBase (c) RefCountServantBase
+// (d) Cookie (e) ObjectId_to_string (f) string_to_ObjectId (g)
+// ObjectId_to_wstring (h) wstring_to_ObjectId (i) ServantBase_var
+// (j) DynamicImplementation (k) LocalServantBase
+//
+// Apply patches using the following commands:
+//
+// patch < diffs\PortableGroupC.h.diff
+// patch < diffs\PortableGroupC.i.diff
+// patch < diffs\PortableGroupC.cpp.diff
+//
+// Note: The diffs were generated with these commands:
+//
+// diff -wub PortableGroupC.h PortableGroupC.h.mod > diffs\PortableGroupC.h.diff
+// diff -wub PortableGroupC.i PortableGroupC.i.mod > diffs\PortableGroupC.i.diff
+// diff -wub PortableGroupC.cpp PortableGroupC.cpp.mod > diffs\PortableGroupC.cpp.diff
+//
+// ================================================================
+
+#ifndef _PortableGroup_IDL_
+#define _PortableGroup_IDL_
+
+//#include <PortableServer.pidl>
+#include <CosNaming.idl>
+#include <tao/IOP.pidl>
+#include <tao/GIOP.pidl>
+#include <orb.idl>
+
+#pragma prefix "omg.org"
+
+module PortableGroup {
+
+ // Specification for Interoperable Object Group References
+ typedef string GroupDomainId;
+ typedef unsigned long long ObjectGroupId;
+ typedef unsigned long ObjectGroupRefVersion;
+
+ typedef GIOP::Version Version;
+
+ struct TagGroupTaggedComponent { // tag = TAG_GROUP;
+ Version component_version;
+ GroupDomainId group_domain_id;
+ ObjectGroupId object_group_id;
+ ObjectGroupRefVersion object_group_ref_version;
+ };
+ typedef sequence <octet> GroupIIOPProfile; // tag = TAG_GROUP_IIOP
+
+ // Specification of Common Types and Exceptions
+ // for GroupManagement
+ local interface GenericFactory;
+
+ typedef CORBA::RepositoryId TypeId;
+ typedef Object ObjectGroup;
+ typedef CosNaming::Name Name;
+ typedef any Value;
+
+ struct Property {
+ Name nam;
+ Value val;
+ };
+
+ typedef sequence<Property> Properties;
+ typedef Name Location;
+ typedef sequence<Location> Locations;
+ typedef Properties Criteria;
+
+ struct FactoryInfo {
+ GenericFactory the_factory;
+ Location the_location;
+ Criteria the_criteria;
+ };
+
+ typedef sequence<FactoryInfo> FactoryInfos;
+ typedef long MembershipStyleValue;
+
+ const MembershipStyleValue MEMB_APP_CTRL = 0;
+ const MembershipStyleValue MEMB_INF_CTRL = 1;
+
+ typedef unsigned short InitialNumberReplicasValue;
+ typedef unsigned short MinimumNumberReplicasValue;
+
+ exception InterfaceNotFound {};
+ exception ObjectGroupNotFound {};
+ exception MemberNotFound {};
+ exception ObjectNotFound {};
+ exception MemberAlreadyPresent {};
+ exception BadReplicationStyle {};
+ exception ObjectNotCreated {};
+ exception ObjectNotAdded {};
+ exception UnsupportedProperty {
+ Name nam;
+ };
+
+ exception InvalidProperty {
+ Name nam;
+ Value val;
+ };
+
+ exception NoFactory {
+ Location the_location;
+ TypeId type_id;
+ };
+
+ exception InvalidCriteria {
+ Criteria invalid_criteria;
+ };
+
+ exception CannotMeetCriteria {
+ Criteria unmet_criteria;
+ };
+
+ // Specification of PropertyManager Interface
+ local interface PropertyManager {
+
+ void set_default_properties (in Properties props)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ Properties get_default_properties();
+
+ void remove_default_properties (in Properties props)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ void set_type_properties (in TypeId type_id, in Properties overrides)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ Properties get_type_properties(in TypeId type_id);
+
+ void remove_type_properties (in TypeId type_id, in Properties props)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ void set_properties_dynamically
+ (in ObjectGroup object_group, in Properties overrides)
+ raises
+ (ObjectGroupNotFound,
+ InvalidProperty,
+ UnsupportedProperty);
+
+ Properties get_properties (in ObjectGroup object_group)
+ raises(ObjectGroupNotFound);
+ }; // endPropertyManager
+
+
+ // Specification of ObjectGroupManager Interface
+ local interface ObjectGroupManager {
+ ObjectGroup create_member (in ObjectGroup object_group,
+ in Location the_location,
+ in TypeId type_id,
+ in Criteria the_criteria)
+ raises (ObjectGroupNotFound,
+ MemberAlreadyPresent,
+ NoFactory,
+ ObjectNotCreated,
+ InvalidCriteria,
+ CannotMeetCriteria);
+
+ ObjectGroup add_member (in ObjectGroup object_group,
+ in Location the_location,
+ in Object member)
+ raises (ObjectGroupNotFound,
+// CORBA::INV_OBJREF,
+ MemberAlreadyPresent,
+ ObjectNotAdded);
+
+ ObjectGroup remove_member (in ObjectGroup object_group,
+ in Location the_location)
+ raises (ObjectGroupNotFound, MemberNotFound);
+
+ Locations locations_of_members (in ObjectGroup object_group)
+ raises(ObjectGroupNotFound);
+
+ ObjectGroupId get_object_group_id (in ObjectGroup object_group)
+ raises(ObjectGroupNotFound);
+
+ ObjectGroup get_object_group_ref (in ObjectGroup object_group)
+ raises(ObjectGroupNotFound);
+
+ Object get_member_ref (in ObjectGroup object_group,
+ in Location loc)
+ raises(ObjectGroupNotFound, MemberNotFound);
+
+ }; // end ObjectGroupManager
+
+
+ // Specification of GenericFactory Interface
+ local interface GenericFactory {
+ typedef any FactoryCreationId;
+
+ Object create_object (in TypeId type_id,
+ in Criteria the_criteria,
+ out FactoryCreationId factory_creation_id)
+ raises
+ (NoFactory,
+ ObjectNotCreated,
+ InvalidCriteria,
+ InvalidProperty,
+ CannotMeetCriteria);
+
+ void delete_object (in FactoryCreationId factory_creation_id)
+ raises (ObjectNotFound);
+
+ }; // end GenericFactory
+
+}; // end PortableGroup
+
+#endif // for #ifndef _PortableGroup_IDL_
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.cpp
new file mode 100644
index 00000000000..6d8ceba2c3b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.cpp
@@ -0,0 +1,186 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "PortableGroup_Acceptor_Registry.h"
+#include "tao/orb_core.h"
+#include "tao/Profile.h"
+#include "tao/GIOP_Message_State.h"
+#include "tao/debug.h"
+#include "tao/Endpoint.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Leader_Follower.h"
+
+ACE_RCSID(tao, PortableGroup, "$Id$")
+
+TAO_PortableGroup_Acceptor_Registry::TAO_PortableGroup_Acceptor_Registry (void)
+{
+}
+
+TAO_PortableGroup_Acceptor_Registry::~TAO_PortableGroup_Acceptor_Registry (void)
+{
+ // Free the memory for the endpoints.
+ Entry *entry;
+ Acceptor_Registry_Iterator iter (this->registry_);
+
+ while (iter.next (entry))
+ {
+ delete entry->endpoint;
+ delete entry->acceptor;
+ iter.advance ();
+ }
+}
+
+
+void
+TAO_PortableGroup_Acceptor_Registry::open (const TAO_Profile* profile,
+ TAO_ORB_Core &orb_core
+ TAO_ENV_ARG_DECL)
+{
+ Entry *entry;
+
+ if (this->find (profile, entry) == 1)
+ {
+ // Found it. Increment the reference count.
+ ++entry->cnt;
+ }
+ else
+ {
+ // Not found. Open a new acceptor.
+
+ // Now get the list of available protocol factories.
+ TAO_ProtocolFactorySetItor end =
+ orb_core.protocol_factories ()->end ();
+
+ int found = 0;
+ // If usable protocol (factory) is found then this will be
+ // set equal to 1.
+
+ for (TAO_ProtocolFactorySetItor factory =
+ orb_core.protocol_factories ()->begin ();
+ factory != end;
+ ++factory)
+ {
+ if ((*factory)->factory ()->tag () == profile->tag ())
+ {
+ this->open_i (profile,
+ orb_core,
+ factory
+ TAO_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ found = 1; // A usable protocol was found.
+ }
+ else
+ continue;
+ }
+ }
+}
+
+#define MAX_ADDR_LENGTH (32)
+
+void
+TAO_PortableGroup_Acceptor_Registry::open_i (const TAO_Profile* profile,
+ TAO_ORB_Core &orb_core,
+ TAO_ProtocolFactorySetItor &factory
+ TAO_ENV_ARG_DECL)
+{
+ TAO_Acceptor *acceptor = (*factory)->factory ()->make_acceptor ();
+
+ if (acceptor != 0)
+ {
+ // Extract the desired endpoint/protocol version if one
+ // exists.
+ const TAO_GIOP_Message_Version &version = profile->version ();
+ char buffer [MAX_ADDR_LENGTH];
+
+ // Removed the constness of profile. We're not changing
+ // anything, but need to call a nonconst function.
+ TAO_Profile* nc_profile = ACE_const_cast (TAO_Profile *, profile);
+ nc_profile->endpoint ()->addr_to_string (buffer, MAX_ADDR_LENGTH);
+
+ if (acceptor->open (&orb_core,
+ orb_core.lane_resources ().leader_follower ().reactor(),
+ version.major,
+ version.minor,
+ buffer,
+ 0) == -1)
+ {
+ delete acceptor;
+
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("unable to open acceptor ")
+ ACE_TEXT ("for <%s>%p\n"),
+ buffer,
+ ""));
+
+ ACE_THROW (CORBA::BAD_PARAM (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ // Add acceptor to list.
+ Entry tmp_entry;
+ tmp_entry.acceptor = acceptor;
+ tmp_entry.endpoint = nc_profile->endpoint ()->duplicate ();
+ tmp_entry.cnt = 1;
+
+ if (this->registry_.enqueue_tail (tmp_entry) == -1)
+ {
+ delete acceptor;
+
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("unable to add acceptor to registry")
+ ACE_TEXT ("for <%s>%p\n"),
+ buffer,
+ ""));
+
+ ACE_THROW (CORBA::BAD_PARAM (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("unable to create acceptor ")
+ ));
+
+ ACE_THROW (CORBA::BAD_PARAM (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+}
+
+int
+TAO_PortableGroup_Acceptor_Registry::find (const TAO_Profile* profile,
+ Entry *&entry)
+{
+ Acceptor_Registry_Iterator iter (this->registry_);
+
+ while (iter.next (entry))
+ {
+ // Since the endpoint routine is nonconst, need to
+ // cast away the constness even though we're not
+ // changing anything.
+ TAO_Profile *nc_profile = ACE_const_cast (TAO_Profile *,profile);
+ if (entry->endpoint->is_equivalent (nc_profile->endpoint ()))
+ return 1;
+
+ iter.advance ();
+ }
+
+ return 0;
+}
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h
new file mode 100644
index 00000000000..498138e9f92
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h
@@ -0,0 +1,104 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup_Acceptor_Registry.h
+ *
+ * $Id$
+ *
+ * Registry for dynamically created acceptors.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_PORTABLEGROUP_ACCEPTOR_REGISTRY_H
+#define TAO_PORTABLEGROUP_ACCEPTOR_REGISTRY_H
+#include "ace/pre.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "portablegroup_export.h"
+
+#include "tao/corbafwd.h"
+#include "tao/Pluggable.h"
+#include "ace/Unbounded_Queue.h"
+#include "tao/Resource_Factory.h"
+
+/**
+ * @class TAO_PortableGroup_Acceptor_Registry
+ *
+ * @brief .
+ *
+ * There is one TAO_PortableGroup_Acceptor_Registry per ORB_Core.
+ */
+class TAO_PortableGroup_Export TAO_PortableGroup_Acceptor_Registry
+{
+public:
+
+ struct Entry
+ {
+ // = TITLE
+ // Value field of the portable group acceptor registry.
+ //
+ // = DESCRIPTION
+
+ /// Pointer to the acceptor for this GroupId.
+ TAO_Acceptor *acceptor;
+
+ /// Cached endpoint that the acceptor is listening on.
+ TAO_Endpoint *endpoint;
+
+ /// Count of times that this GroupId has been opened.
+ int cnt;
+ };
+
+
+ // = Initialization and termination methods.
+ /// Default constructor.
+ TAO_PortableGroup_Acceptor_Registry (void);
+
+ /// Default destructor.
+ ~TAO_PortableGroup_Acceptor_Registry (void);
+
+ /// Open an acceptor based on a tagged profile.
+ void open (const TAO_Profile* profile,
+ TAO_ORB_Core &orb_core
+ TAO_ENV_ARG_DECL);
+
+ /// Close all open acceptors.
+ int close_all (void);
+
+ typedef ACE_Unbounded_Queue<Entry> Acceptor_Registry;
+ typedef ACE_Unbounded_Queue_Iterator<Entry> Acceptor_Registry_Iterator;
+
+protected:
+
+ /// Helper function to open a group acceptor.
+ void open_i (const TAO_Profile* profile,
+ TAO_ORB_Core &orb_core,
+ TAO_ProtocolFactorySetItor &factory
+ TAO_ENV_ARG_DECL);
+
+ /// Find an acceptor by using a profile.
+ int find (const TAO_Profile* profile,
+ Entry *&entry);
+
+private:
+ // The acceptor registry should not be copied.
+ ACE_UNIMPLEMENTED_FUNC (TAO_PortableGroup_Acceptor_Registry (const TAO_PortableGroup_Acceptor_Registry&))
+ ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_PortableGroup_Acceptor_Registry&))
+
+private:
+ /// List of acceptors that are currently open.
+ Acceptor_Registry registry_;
+};
+
+//#if defined(__ACE_INLINE__)
+//#include "tao/PortableGroup_Acceptor_Registry.i"
+//#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* TAO_PORTABLEGROUP_ACCEPTOR_REGISTRY_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.cpp
new file mode 100644
index 00000000000..6041932dfbd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.cpp
@@ -0,0 +1,69 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "PortableGroup_Loader.h"
+#include "PortableGroup_ORBInitializer.h"
+#include "tao/ORB_Core.h"
+
+ACE_RCSID(PortableGroup, PortableGroup_Loader, "$Id$")
+
+TAO_PortableGroup_Loader::TAO_PortableGroup_Loader (void)
+{
+}
+
+int
+TAO_PortableGroup_Loader::init (int argc,
+ char* argv[])
+{
+ ACE_TRACE ("TAO_PortableGroup_Loader::init");
+
+ // Register the ORB initializer.
+ ACE_TRY_NEW_ENV
+ {
+ PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
+ PortableInterceptor::ORBInitializer::_nil ();
+ PortableInterceptor::ORBInitializer_var orb_initializer;
+
+ /// Register the RTCORBA ORBInitializer.
+ ACE_NEW_THROW_EX (temp_orb_initializer,
+ TAO_PortableGroup_ORBInitializer (),
+ CORBA::NO_MEMORY (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_TRY_CHECK;
+ orb_initializer = temp_orb_initializer;
+
+ PortableInterceptor::register_orb_initializer (orb_initializer.in ()
+ TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Unexpected exception caught while initializing the PortableGroup:");
+ return 1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+int
+TAO_PortableGroup_Loader::Initializer (void)
+{
+ ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_PortableGroup_Loader);
+
+ return 0;
+}
+
+ACE_STATIC_SVC_DEFINE (TAO_PortableGroup_Loader,
+ ACE_TEXT ("PortableGroup_Loader"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_PortableGroup_Loader),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_PortableGroup, TAO_PortableGroup_Loader)
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.h
new file mode 100644
index 00000000000..be9b6fd713c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.h
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup_Loader.h
+ *
+ * $Id$
+ *
+ * Loads and initializes the PortableGroup extensions to TAO.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_PORTABLEGROUP_LOADER_H
+#define TAO_PORTABLEGROUP_LOADER_H
+#include "ace/pre.h"
+
+#include "portablegroup_export.h"
+#include "ace/Service_Config.h"
+#include "corbafwd.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+/**
+ * @class TAO_PortableGroup_Adapter
+ *
+ * @brief TAO_PortableGroup_Adapter.
+ *
+ * This class acts as a facade for the PortableGroup library to the
+ * ORB.
+ */
+class TAO_PortableGroup_Export TAO_PortableGroup_Loader : public ACE_Service_Object
+{
+ friend class TAO_POA_Hooks;
+
+public:
+ /// Constructor.
+ TAO_PortableGroup_Loader (void);
+
+ /// Initialize the PortableGroup loader hooks.
+ virtual int init (int argc,
+ char* []);
+
+ /// Used to force the initialization of the ORB code.
+ static int Initializer (void);
+};
+
+ACE_STATIC_SVC_DECLARE (TAO_PortableGroup_Loader)
+ACE_FACTORY_DECLARE (TAO_PortableGroup, TAO_PortableGroup_Loader)
+
+#if defined(ACE_HAS_BROKEN_STATIC_CONSTRUCTORS)
+
+typedef int (*TAO_Module_Initializer) (void);
+
+static TAO_Module_Initializer
+TAO_Requires_PortableGroup_Initializer = &TAO_PortableGroup_Loader::Initializer;
+
+#else
+
+static int
+TAO_Requires_PortableGroup_Initializer = TAO_PortableGroup_Loader::Initializer ();
+
+#endif /* ACE_HAS_BROKEN_STATIC_CONSTRUCTORS */
+
+//#define TAO_PORTABLEGROUP_SAFE_INCLUDE
+//#include "IORC.h"
+//#undef TAO_IORMANIP_SAFE_INCLUDE
+
+#include "ace/post.h"
+#endif /* TAO_PORTABLEGROUP_LOADER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.cpp
new file mode 100644
index 00000000000..4de6c51ec57
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.cpp
@@ -0,0 +1,82 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "PortableGroup_ORBInitializer.h"
+
+ACE_RCSID (TAO, PortableGroup_ORBInitializer, "$Id$")
+
+#include "ace/Service_Repository.h"
+#include "ace/Svc_Conf.h"
+
+#include "tao/Exception.h"
+#include "tao/ORB_Core.h"
+#include "tao/ORBInitInfo.h"
+
+#include "PortableGroup_Request_Dispatcher.h"
+#include "POA_Hooks.h"
+
+TAO_PortableGroup_ORBInitializer::TAO_PortableGroup_ORBInitializer ()
+{
+}
+
+void
+TAO_PortableGroup_ORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ TAO_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // @@ This is busted. TAO_ORBInitInfo should do proper reference
+ // counting.
+ // Narrow to a TAO_ORBInitInfo object to get access to the
+ // orb_core() TAO extension.
+ TAO_ORBInitInfo_var tao_info = TAO_ORBInitInfo::_narrow (info
+ TAO_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (tao_info.in ()))
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) Security_ORBInitializer::pre_init:\n"
+ "(%P|%t) Unable to narrow "
+ "\"PortableInterceptor::ORBInitInfo_ptr\" to\n"
+ "(%P|%t) \"TAO_ORBInitInfo *.\"\n"));
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ // Set a new request dispatcher in the ORB.
+ PortableGroup_Request_Dispatcher *rd;
+ ACE_NEW_THROW_EX (rd,
+ PortableGroup_Request_Dispatcher (),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ tao_info->orb_core ()->request_dispatcher (rd);
+
+ // Create and save the hooks for the POA.
+ TAO_POA_PortableGroup_Hooks *poa_hooks;
+ ACE_NEW_THROW_EX (poa_hooks,
+ TAO_POA_Hooks (*rd),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+ tao_info->orb_core ()->portable_group_poa_hooks (poa_hooks);
+}
+
+void
+TAO_PortableGroup_ORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr
+ TAO_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h
new file mode 100644
index 00000000000..6eaf1bf2bb3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup_ORBInitializer.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PORTABLEGROUP_ORB_INITIALIZER_H
+#define TAO_PORTABLEGROUP_ORB_INITIALIZER_H
+
+#include "ace/pre.h"
+
+#include "tao/corbafwd.h"
+#include "portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableInterceptorC.h"
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#if (_MSC_VER >= 1200)
+#pragma warning(push)
+#endif /* _MSC_VER >= 1200 */
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+/// RTCORBA ORB initializer.
+class TAO_PortableGroup_Export TAO_PortableGroup_ORBInitializer :
+ public virtual PortableInterceptor::ORBInitializer,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ TAO_PortableGroup_ORBInitializer ();
+
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ TAO_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ TAO_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+};
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include "ace/post.h"
+
+#endif /* TAO_PORTABLEGROUP_ORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.cpp
new file mode 100644
index 00000000000..2375f8e7414
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.cpp
@@ -0,0 +1,58 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "PortableGroup_Request_Dispatcher.h"
+#include "PortableGroup_Loader.h"
+#include "UIPMC_Profile.h"
+#include "tao/TAO_Server_Request.h"
+#include "tao/ORB_Core.h"
+
+ACE_RCSID(PortableGroup, PortableGroup_Request_Dispatcher, "$Id$")
+
+PortableGroup_Request_Dispatcher::~PortableGroup_Request_Dispatcher (void)
+{
+}
+
+void
+PortableGroup_Request_Dispatcher::dispatch (TAO_ORB_Core *orb_core,
+ TAO_ServerRequest &request,
+ CORBA::Object_out forward_to
+ TAO_ENV_ARG_PARAMETER)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Check if the request contains a tagged profile
+ if (request.profile ().discriminator () == GIOP::ProfileAddr)
+ {
+ // Get the IOP::Tagged profile.
+ const IOP::TaggedProfile &tagged_profile =
+ request.profile ().tagged_profile ();
+ PortableGroup::TagGroupTaggedComponent group;
+
+ // Extract a Group ID from the profile if it exists.
+ int result = TAO_UIPMC_Profile::extract_group_component (tagged_profile,
+ group);
+ if (result == 0)
+ {
+ // Got a group. Dispatch based on the group ID
+ this->group_map_.dispatch (&group,
+ orb_core,
+ request,
+ forward_to
+ TAO_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ return;
+ }
+
+ // Else, fall through and dispatch based on object key like normal.
+ }
+
+ // Dispatch based on object key.
+ orb_core->adapter_registry ()->dispatch (request.object_key (),
+ request,
+ forward_to
+ TAO_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h
new file mode 100644
index 00000000000..6bcc6a1a8c3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h
@@ -0,0 +1,63 @@
+//-*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup_Request_Dispatcher.h
+ *
+ * $Id$
+ *
+ * A class that strategizes the request dispatching procedure.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PORTABLEGROUP_REQUEST_DISPATCHER_H
+#define TAO_PORTABLEGROUP_REQUEST_DISPATCHER_H
+#include "ace/pre.h"
+
+#include "tao/Request_Dispatcher.h"
+#include "portablegroup_export.h"
+
+#include "Portable_Group_Map.h"
+#include "PortableGroup_Acceptor_Registry.h"
+
+// Forward declarations.
+class TAO_PortableGroup_Loader;
+
+/**
+ * @class PortableGroup_Request_Dispatcher
+ *
+ * @brief A class that strategizes the request dispatching procedure.
+ *
+ */
+class TAO_PortableGroup_Export PortableGroup_Request_Dispatcher :
+ public TAO_Request_Dispatcher
+{
+ friend class TAO_POA_Hooks;
+
+public:
+ /// Destructor.
+ virtual ~PortableGroup_Request_Dispatcher (void);
+
+ /**
+ * Dispatch a request.
+ */
+ virtual void dispatch (TAO_ORB_Core *orb_core,
+ TAO_ServerRequest &request,
+ CORBA::Object_out forward_to
+ TAO_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ /// Hash map containing the GroupId->ObjectKey mappings.
+ TAO_Portable_Group_Map group_map_;
+
+ /// Registry for all of the group (multicast) acceptors.
+ TAO_PortableGroup_Acceptor_Registry acceptor_registry_;
+};
+
+#include "ace/post.h"
+#endif /* TAO_PORTABLEGROUP_REQUEST_DISPATCHER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.cpp
new file mode 100644
index 00000000000..77129237512
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.cpp
@@ -0,0 +1,188 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "Portable_Group_Map.h"
+#include "tao/ORB_Core.h"
+#include "tao/TAO_Server_Request.h"
+
+//#if !defined (__ACE_INLINE__)
+//# include "Portable_Group_Map.i"
+//#endif /* __ACE_INLINE__ */
+
+
+/// Constructor.
+TAO_Portable_Group_Map::TAO_Portable_Group_Map ()
+{
+}
+
+/// Destructor.
+TAO_Portable_Group_Map::~TAO_Portable_Group_Map (void)
+{
+ for (Iterator i = this->map_.begin ();
+ i != this->map_.end ();
+ ++i)
+ {
+ // Deallocate the id.
+ delete (*i).ext_id_;
+
+ // Delete the chain of Map_Entries.
+ Map_Entry *entry = (*i).int_id_;
+ while (entry)
+ {
+ Map_Entry *next = entry->next;
+ delete entry;
+ entry = next;
+ }
+
+ }
+
+ this->map_.close ();
+}
+
+
+void
+TAO_Portable_Group_Map::add_groupid_objectkey_pair (PortableGroup::TagGroupTaggedComponent *group_id,
+ const TAO_ObjectKey &key
+ TAO_ENV_ARG_DECL)
+{
+ Map_Entry *new_entry;
+
+ // We take ownership of the group_id memory. Be sure we don't
+ // forget about it.
+ PortableGroup::TagGroupTaggedComponent_var safe_group = group_id;
+
+ ACE_NEW_THROW_EX (new_entry,
+ Map_Entry (),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK (0);
+
+ // Fill out the entry.
+ new_entry->key = key;
+
+ // First, check if the GroupId is already in the map.
+ Map_Entry *entry;
+ if (this->map_.find (group_id,
+ entry) == 0)
+ {
+ // Add the object key to the list of object keys serviced by this GroupId.
+ new_entry->next = entry->next;
+ entry->next = new_entry;
+ }
+ else
+ {
+ new_entry->next = 0;
+
+ // Add the
+ int result =
+ this->map_.bind (group_id,
+ new_entry);
+
+ if (result != 0)
+ {
+ delete new_entry;
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ // Transfer ownership of group_id to the map.
+ (void) safe_group._retn ();
+ }
+}
+
+void
+TAO_Portable_Group_Map::remove_groupid_objectkey_pair (const PortableGroup::TagGroupTaggedComponent* group_id,
+ const TAO_ObjectKey &key
+ TAO_ENV_ARG_DECL)
+{
+
+}
+
+
+void
+TAO_Portable_Group_Map::dispatch (PortableGroup::TagGroupTaggedComponent* group_id,
+ TAO_ORB_Core *orb_core,
+ TAO_ServerRequest &request,
+ CORBA::Object_out forward_to
+ TAO_ENV_ARG_DECL)
+{
+ // Look up the GroupId.
+ Map_Entry *entry;
+ if (this->map_.find (group_id,
+ entry) == 0)
+ {
+
+ // Save the read pointer in the message block since
+ // every time we dispatch the request, we need to
+ // reset it so that the request demarshals correctly.
+ TAO_InputCDR &tao_in = request.incoming ();
+ ACE_Message_Block *msgblk =
+ ACE_const_cast (ACE_Message_Block *, tao_in.start ());
+ char *read_ptr = msgblk->rd_ptr ();
+
+ // Iterate through the list of ObjectKeys.
+ while (entry)
+ {
+ orb_core->adapter_registry ()->dispatch (entry->key,
+ request,
+ forward_to
+ TAO_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Reset the read pointer in the message block.
+ msgblk->rd_ptr (read_ptr);
+ entry = entry->next;
+ }
+ }
+}
+
+u_long
+TAO_GroupId_Hash::operator () (const PortableGroup::TagGroupTaggedComponent *id) const
+{
+ u_long hash = ACE::hash_pjw ((const char *) id->group_domain_id,
+ ACE_OS::strlen ((const char *) id->group_domain_id));
+
+ // Truncate the object_group_id in half for the has.
+ hash += (u_long) id->object_group_id;
+
+ hash += id->object_group_ref_version;
+
+ return hash;
+}
+
+int
+TAO_GroupId_Equal_To::operator () (const PortableGroup::TagGroupTaggedComponent *lhs,
+ const PortableGroup::TagGroupTaggedComponent *rhs) const
+{
+ return (ACE_OS::strcmp (lhs->group_domain_id, rhs->group_domain_id) == 0) &&
+ (lhs->object_group_id == rhs->object_group_id) &&
+ (lhs->object_group_ref_version == rhs->object_group_ref_version);
+}
+
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+
+template class ACE_Hash_Map_Entry<PortableGroup::TagGroupTaggedComponent *, Map_Entry *>;
+template class ACE_Hash_Map_Manager<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Reverse_Iterator<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Manager_Ex<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, TAO_GroupId_Hash, TAO_GroupId_Equal_To, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator_Base_Ex<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, TAO_GroupId_Hash, TAO_GroupId_Equal_To, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator_Ex<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, TAO_GroupId_Hash, TAO_GroupId_Equal_To, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Reverse_Iterator_Ex<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, TAO_GroupId_Hash, TAO_GroupId_Equal_To, ACE_Null_Mutex>;
+
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+
+#pragma instantiate ACE_Hash_Map_Entry<PortableGroup::TagGroupTaggedComponent *, Map_Entry *>
+#pragma instantiate ACE_Hash_Map_Manager<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Iterator<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Reverse_Iterator<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Manager_Ex<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, TAO_GroupId_Hash, TAO_GroupId_Equal_To, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, TAO_GroupId_Hash, TAO_GroupId_Equal_To, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Iterator_Ex<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, TAO_GroupId_Hash, TAO_GroupId_Equal_To, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<PortableGroup::TagGroupTaggedComponent *, Map_Entry *, TAO_GroupId_Hash, TAO_GroupId_Equal_To, ACE_Null_Mutex>
+
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.h b/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.h
new file mode 100644
index 00000000000..8102ad7b436
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.h
@@ -0,0 +1,124 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Portable_Group_Map.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_PORTABLE_GROUP_MAP_H
+#define TAO_PORTABLE_GROUP_MAP_H
+#include "ace/pre.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Hash_Map_Manager_T.h"
+#include "orbsvcs/PortableGroupC.h"
+#include "tao/Object_KeyC.h"
+
+class TAO_PortableGroup_Export TAO_GroupId_Hash
+{
+ // = TITLE
+ // Hashing class for Group Ids.
+ //
+ // = DESCRIPTION
+ // Define the hash() method for Group Ids.
+public:
+
+ u_long operator () (const PortableGroup::TagGroupTaggedComponent *id) const;
+ // Returns hash value.
+};
+
+class TAO_PortableGroup_Export TAO_GroupId_Equal_To
+{
+ // = TITLE
+ // Hashing class for Group Ids.
+ //
+ // = DESCRIPTION
+ // Define the Equal_To () method for Object Ids.
+public:
+
+ int operator () (const PortableGroup::TagGroupTaggedComponent *lhs,
+ const PortableGroup::TagGroupTaggedComponent *rhs) const;
+ // Returns 1 if equal.
+};
+
+class TAO_PortableGroup_Export TAO_Portable_Group_Map
+{
+ // = TITLE
+ // Map of GroupIds to ObjectKeys.
+ //
+ // = DESCRIPTION
+public:
+
+ struct Map_Entry
+ {
+ // = TITLE
+ // Value field of the portable group map.
+ //
+ // = DESCRIPTION
+
+ /// The key.
+ TAO_ObjectKey key;
+
+ /// next ObjectKey in the group.
+ struct Map_Entry *next;
+ };
+
+ /// Constructor.
+ TAO_Portable_Group_Map ();
+
+ /// Destructor.
+ ~TAO_Portable_Group_Map (void);
+
+ /// Add a GroupId->ObjectKey mapping to the map.
+ /// This function takes ownership of the memory pointed to be group_id
+ void add_groupid_objectkey_pair (PortableGroup::TagGroupTaggedComponent *group_id,
+ const TAO_ObjectKey &key
+ TAO_ENV_ARG_DECL);
+
+
+ /// Remove a GroupId->ObjectKey mapping from the map.
+ void remove_groupid_objectkey_pair (const PortableGroup::TagGroupTaggedComponent* group_id,
+ const TAO_ObjectKey &key
+ TAO_ENV_ARG_DECL);
+
+ /// Dispatch a request to all of the ObjectIds that belong to
+ /// the specified group.
+ void dispatch (PortableGroup::TagGroupTaggedComponent* group_id,
+ TAO_ORB_Core *orb_core,
+ TAO_ServerRequest &request,
+ CORBA::Object_out forward_to
+ TAO_ENV_ARG_DECL);
+
+ /// Id hash map.
+ typedef ACE_Hash_Map_Manager_Ex<
+ PortableGroup::TagGroupTaggedComponent *,
+ Map_Entry *,
+ TAO_GroupId_Hash,
+ TAO_GroupId_Equal_To,
+ ACE_Null_Mutex> GroupId_Table;
+ typedef GroupId_Table::iterator Iterator;
+
+protected:
+ /// @@ Frank: This class will need a mutex to protect
+ /// this eventually...
+
+ /// Id map.
+ GroupId_Table map_;
+};
+
+
+
+//#if defined (__ACE_INLINE__)
+//# include "Portable_Group_Map.i"
+//#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* TAO_PORTABLE_GROUP_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.cpp
new file mode 100644
index 00000000000..0ce3d04e53f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.cpp
@@ -0,0 +1,391 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "UIPMC_Acceptor.h"
+
+#include "UIPMC_Profile.h"
+#include "tao/MProfile.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "tao/Protocols_Hooks.h"
+
+#include "ace/Auto_Ptr.h"
+
+#if !defined(__ACE_INLINE__)
+#include "UIPMC_Acceptor.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(tao, UIPMC_Acceptor, "$Id$")
+
+
+TAO_UIPMC_Acceptor::TAO_UIPMC_Acceptor (CORBA::Boolean /*flag*/)
+ : TAO_Acceptor (TAO_TAG_UIPMC_PROFILE),
+ addrs_ (0),
+ hosts_ (0),
+ endpoint_count_ (0),
+ version_ (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR),
+ orb_core_ (0),
+ connection_handler_ (0)
+{
+}
+
+TAO_UIPMC_Acceptor::~TAO_UIPMC_Acceptor (void)
+{
+ // Make sure we are closed before we start destroying the
+ // strategies.
+ this->close ();
+
+ delete [] this->addrs_;
+
+ for (size_t i = 0; i < this->endpoint_count_; ++i)
+ CORBA::string_free (this->hosts_[i]);
+
+ delete [] this->hosts_;
+}
+
+int
+TAO_UIPMC_Acceptor::create_profile (const TAO_ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority)
+{
+ // The standard mechanism for adding profiles to object references
+ // for each pluggable protocol doesn't apply to UIPMC profiles, so
+ // this function just returns success without doing anything. The
+ // appropiate mechanism for getting UIPMC profiles is to call the
+ // multicast group manager to get a Group reference. Invocations
+ // sent to this group reference will be dispatched to the servants
+ // that belong to that group.
+ return 0;
+}
+
+int
+TAO_UIPMC_Acceptor::is_collocated (const TAO_Endpoint *endpoint)
+{
+#if 0
+ const TAO_UIPMC_Endpoint *endp =
+ ACE_dynamic_cast (const TAO_UIPMC_Endpoint *, endpoint);
+
+ // Make sure the dynamically cast pointer is valid.
+ if (endp == 0)
+ return 0;
+
+ for (size_t i = 0; i < this->endpoint_count_; ++i)
+ {
+ // compare the port and sin_addr (numeric host address)
+ if (endp->object_addr () == this->addrs_[i])
+ return 1; // Collocated
+ }
+#endif
+
+ // @@ Frank: Comment this out for now since its not clear how
+ // to best handle collation. For example, one servant could
+ // be collocated, but we still need to send the request out on
+ // the network to see if there are any other servants in the
+ // group.
+ return 0; // Not collocated
+}
+
+int
+TAO_UIPMC_Acceptor::close (void)
+{
+ // @@ Frank: Commented out since it seems like the reactor always is the one to
+ // remove the connection handler.
+// if (this->connection_handler_)
+// {
+// // Remove the connection handler from the reactor in the case
+// // of a valid handle, or close it yourself, if the handle is invalid.
+// // Either way it will cause the connection handler to be destructed.
+// if (this->connection_handler_->get_handle () != ACE_INVALID_HANDLE)
+// {
+// this->orb_core_->reactor ()->remove_handler (this->connection_handler_,
+// ACE_Event_Handler::READ_MASK);
+// }
+// else
+// {
+// this->connection_handler_->handle_close ();
+// }
+// this->connection_handler_ = 0;
+// }
+ return 0;
+}
+
+int
+TAO_UIPMC_Acceptor::open (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int major,
+ int minor,
+ const char *address,
+ const char *options)
+{
+ this->orb_core_ = orb_core;
+
+ if (this->init_uipmc_properties () != 0)
+ return -1;
+
+ if (this->hosts_ != 0)
+ {
+ // The hostname cache has already been set!
+ // This is bad mojo, i.e. an internal TAO error.
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Acceptor::open - "),
+ ACE_TEXT ("hostname already set\n\n")),
+ -1);
+ }
+
+ if (address == 0)
+ return -1;
+
+ if (major >=0 && minor >= 0)
+ this->version_.set_version (ACE_static_cast (CORBA::Octet,
+ major),
+ ACE_static_cast (CORBA::Octet,
+ minor));
+ // Parse options
+ if (this->parse_options (options) == -1)
+ return -1;
+
+ ACE_INET_Addr addr;
+
+ const char *port_separator_loc = ACE_OS::strchr (address, ':');
+ const char *specified_hostname = 0;
+ char tmp_host[MAXHOSTNAMELEN + 1];
+
+ // Both host and port have to be specified.
+ if (addr.set (address) != 0)
+ return -1;
+
+ // Extract out just the host part of the address.
+ size_t len = port_separator_loc - address;
+ ACE_OS::memcpy (tmp_host, address, len);
+ tmp_host[len] = '\0';
+
+ specified_hostname = tmp_host;
+
+ this->endpoint_count_ = 1; // Only one hostname to store
+
+ ACE_NEW_RETURN (this->addrs_,
+ ACE_INET_Addr[this->endpoint_count_],
+ -1);
+
+ ACE_NEW_RETURN (this->hosts_,
+ char *[this->endpoint_count_],
+ -1);
+
+ this->hosts_[0] = 0;
+
+ if (this->hostname (orb_core,
+ addr,
+ this->hosts_[0],
+ specified_hostname) != 0)
+ return -1;
+
+ // Copy the addr. The port is (re)set in
+ // TAO_UIPMC_Acceptor::open_i().
+ if (this->addrs_[0].set (addr) != 0)
+ return -1;
+
+ return this->open_i (addr,
+ reactor);
+}
+
+int
+TAO_UIPMC_Acceptor::open_default (TAO_ORB_Core *,
+ ACE_Reactor *,
+ int,
+ int,
+ const char *)
+{
+ // There is no such thing as a default multicast listen
+ // port. The mechanism for choosing these ports is done
+ // when creating the group ids. (I.e. not here).
+ return -1;
+}
+
+int
+TAO_UIPMC_Acceptor::open_i (const ACE_INET_Addr& addr,
+ ACE_Reactor *reactor)
+{
+ ACE_NEW_RETURN (this->connection_handler_,
+ TAO_UIPMC_Connection_Handler (this->orb_core_,
+ 0 /* TAO_UIPMC_Properties */),
+ -1);
+
+ this->connection_handler_->local_addr (addr);
+ this->connection_handler_->open_server ();
+
+
+ // Register only with a valid handle
+ if (this->connection_handler_->get_handle () != ACE_INVALID_HANDLE)
+ {
+ reactor->register_handler (this->connection_handler_,
+ ACE_Event_Handler::READ_MASK);
+ }
+
+ // Set the port for each addr. If there is more than one network
+ // interface then the endpoint created on each interface will be on
+ // the same port. This is how a wildcard socket bind() is supposed
+ // to work.
+ u_short port = addr.get_port_number ();
+ for (size_t j = 0; j < this->endpoint_count_; ++j)
+ this->addrs_[j].set_port_number (port, 1);
+
+ if (TAO_debug_level > 5)
+ {
+ for (size_t i = 0; i < this->endpoint_count_; ++i)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\nTAO (%P|%t) UIPMC_Acceptor::open_i - ")
+ ACE_TEXT ("listening on: <%s:%u>\n"),
+ this->hosts_[i],
+ this->addrs_[i].get_port_number ()));
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Acceptor::hostname (TAO_ORB_Core *orb_core,
+ ACE_INET_Addr &addr,
+ char *&host,
+ const char *specified_hostname)
+{
+ // Only have dotted decimal addresses for multicast.
+ return this->dotted_decimal_address (addr, host);
+}
+
+int
+TAO_UIPMC_Acceptor::dotted_decimal_address (ACE_INET_Addr &addr,
+ char *&host)
+{
+ const char *tmp = addr.get_host_addr ();
+ if (tmp == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Acceptor::dotted_decimal_address ")
+ ACE_TEXT ("- %p\n\n"),
+ ACE_TEXT ("cannot determine hostname")));
+ return -1;
+ }
+
+ host = CORBA::string_dup (tmp);
+ return 0;
+}
+
+CORBA::ULong
+TAO_UIPMC_Acceptor::endpoint_count (void)
+{
+ return this->endpoint_count_;
+}
+
+int
+TAO_UIPMC_Acceptor::object_key (IOP::TaggedProfile &profile,
+ TAO_ObjectKey &object_key)
+{
+ // No object key to extract. Just return success.
+ return 1;
+}
+
+
+int
+TAO_UIPMC_Acceptor::parse_options (const char *str)
+{
+ if (str == 0)
+ return 0; // No options to parse. Not a problem.
+
+ // Use an option format similar to the one used for CGI scripts in
+ // HTTP URLs.
+ // e.g.: option1=foo&option2=bar
+
+ ACE_CString options (str);
+
+ size_t len = options.length ();
+
+ const char option_delimiter = '&';
+
+ // Count the number of options.
+
+ CORBA::ULong option_count = 1;
+ // Number of endpoints in the string (initialized to 1).
+
+ // Only check for endpoints after the protocol specification and
+ // before the object key.
+ for (size_t i = 0; i < len; ++i)
+ if (options[i] == option_delimiter)
+ option_count++;
+
+ // The idea behind the following loop is to split the options into
+ // (option, name) pairs.
+ // For example,
+ // `option1=foo&option2=bar'
+ // will be parsed into:
+ // `option1=foo'
+ // `option2=bar'
+
+ int begin = 0;
+ int end = -1;
+
+ for (CORBA::ULong j = 0; j < option_count; ++j)
+ {
+ begin += end + 1;
+
+ if (j < option_count - 1)
+ end = options.find (option_delimiter, begin);
+ else
+ end = len - begin; // Handle last endpoint differently
+
+ if (end == begin)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Zero length UIPMC option.\n")),
+ -1);
+ else if (end != ACE_CString::npos)
+ {
+ ACE_CString opt = options.substring (begin, end);
+
+ int slot = opt.find ("=");
+
+ if (slot == ACE_static_cast (int, len - 1)
+ || slot == ACE_CString::npos)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) UIPMC option <%s> is ")
+ ACE_TEXT ("missing a value.\n"),
+ opt.c_str ()),
+ -1);
+
+ ACE_CString name = opt.substring (0, slot);
+ ACE_CString value = opt.substring (slot + 1);
+
+ if (name.length () == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Zero length UIPMC ")
+ ACE_TEXT ("option name.\n")),
+ -1);
+
+ if (name == "priority")
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Invalid UIPMC endpoint format: ")
+ ACE_TEXT ("endpoint priorities no longer supported. \n"),
+ value.c_str ()),
+ -1);
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Invalid UIPMC option: <%s>\n"),
+ name.c_str ()),
+ -1);
+ }
+ }
+ return 0;
+}
+
+int
+TAO_UIPMC_Acceptor::init_uipmc_properties (void)
+{
+ // @@ Michael: We use UDP, so we do not set TCP settings.
+ return 0;
+}
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.h
new file mode 100644
index 00000000000..5a6453ac7fc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.h
@@ -0,0 +1,162 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Acceptor.h
+ *
+ * $Id$
+ *
+ * MIOP specific acceptor processing
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_ACCEPTOR_H
+#define TAO_UIPMC_ACCEPTOR_H
+#include "ace/pre.h"
+
+#include "tao/Pluggable.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "UIPMC_Connection_Handler.h"
+#include "tao/Acceptor_Impl.h"
+
+#include "ace/Acceptor.h"
+#include "ace/SOCK_Acceptor.h"
+#include "tao/GIOP_Message_State.h"
+#include "portablegroup_export.h"
+
+// TAO UIPMC_Acceptor concrete call defination
+
+/**
+ * @class TAO_UIPMC_Acceptor
+ *
+ * @brief TAO_UIPMC_Acceptor
+ *
+ * The UIPMC-specific bridge class for the concrete acceptor.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Acceptor : public TAO_Acceptor
+{
+public:
+ /// Constructor.
+ TAO_UIPMC_Acceptor (CORBA::Boolean flag = 0);
+
+ /// Destructor.
+ ~TAO_UIPMC_Acceptor (void);
+
+ /// @@ Helper method for the implementation repository, should go
+ /// away
+ const ACE_INET_Addr& address (void) const;
+
+ /// Returns the array of endpoints in this acceptor
+ const ACE_INET_Addr *endpoints (void);
+
+ /**
+ * The TAO_Acceptor methods, check the documentation in
+ * Pluggable.h for details.
+ */
+ virtual int open (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int version_major,
+ int version_minor,
+ const char *address,
+ const char *options = 0);
+ virtual int open_default (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int version_major,
+ int version_minor,
+ const char *options = 0);
+ virtual int close (void);
+ virtual int create_profile (const TAO_ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority);
+ virtual int is_collocated (const TAO_Endpoint *endpoint);
+ virtual CORBA::ULong endpoint_count (void);
+
+ virtual int object_key (IOP::TaggedProfile &profile,
+ TAO_ObjectKey &key);
+
+ /**
+ * Set the host name for the given addr.
+ * A hostname may be forced by using specified_hostname. This
+ * is useful if the given address corresponds to more than one
+ * hostname and the desired one cannot be determined in any
+ * other way.
+ */
+ int hostname (TAO_ORB_Core *orb_core,
+ ACE_INET_Addr &addr,
+ char *&host,
+ const char *specified_hostname = 0);
+
+ /**
+ * Set the host name for the given address using the dotted decimal
+ * format.
+ */
+ int dotted_decimal_address (ACE_INET_Addr &addr,
+ char *&host);
+
+protected:
+
+ /**
+ * Implement the common part of the open*() methods. This method is
+ * virtual to allow a derived class implementation to be invoked
+ * instead.
+ */
+ virtual int open_i (const ACE_INET_Addr &addr,
+ ACE_Reactor *reactor);
+
+ /// Parse protocol specific options.
+ virtual int parse_options (const char *options);
+
+ /// Obtain uipmc properties that must be used by this acceptor, i.e.,
+ /// initialize <uipmc_properties_>.
+ int init_uipmc_properties (void);
+
+protected:
+
+ /// Array of ACE_INET_Addr instances, each one corresponding to a
+ /// given network interface.
+ ACE_INET_Addr *addrs_;
+
+ /**
+ * Cache the information about the endpoints serviced by this
+ * acceptor.
+ * There may in fact be multiple hostnames for this endpoint. For
+ * example, if the IP address is INADDR_ANY (0.0.0.0) then there
+ * will be possibly a different hostname for each interface.
+ */
+ char **hosts_;
+
+ /// The number of host names cached in the hosts_ array (equivalent
+ /// to the number of endpoints opened by this Acceptor).
+ size_t endpoint_count_;
+
+ /**
+ * The GIOP version for this endpoint
+ * @@ Theoretically this shouldn't be here!! We need to look at a
+ * way to move this out
+ */
+ TAO_GIOP_Message_Version version_;
+
+ /// ORB Core.
+ TAO_ORB_Core *orb_core_;
+
+ /// UIPMC configuration properties to be used for all
+ /// connections opened by this acceptor.
+ TAO_UIPMC_Properties uipmc_properties_;
+
+private:
+
+ TAO_UIPMC_Connection_Handler *connection_handler_;
+};
+
+#if defined(__ACE_INLINE__)
+#include "UIPMC_Acceptor.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* TAO_UIPMC_ACCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.i b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.i
new file mode 100644
index 00000000000..3bda9ea1fca
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.i
@@ -0,0 +1,23 @@
+// -*- C++ -*-
+// $Id$
+
+ACE_INLINE const ACE_INET_Addr&
+TAO_UIPMC_Acceptor::address (void) const
+{
+ ACE_ASSERT (this->addrs_ != 0);
+
+ // @@ This is busted.
+ // The Implementation Repository will have to start supporting
+ // IORs with multiple profiles. For now, we just return the
+ // first addr.
+ // -Ossama
+ return this->addrs_[0];
+}
+
+ACE_INLINE const ACE_INET_Addr *
+TAO_UIPMC_Acceptor::endpoints (void)
+{
+ ACE_ASSERT (this->addrs_ != 0);
+
+ return this->addrs_;
+}
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp
new file mode 100644
index 00000000000..8ba7b579c27
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp
@@ -0,0 +1,426 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+
+#include "UIPMC_Connection_Handler.h"
+
+#include "tao/Timeprobe.h"
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/ORB.h"
+#include "tao/CDR.h"
+#include "tao/Messaging_Policy_i.h"
+#include "tao/Server_Strategy_Factory.h"
+#include "tao/Transport_Cache_Manager.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/Resume_Handle.h"
+
+#include "UIPMC_Transport.h"
+#include "UIPMC_Endpoint.h"
+
+#if !defined (__ACE_INLINE__)
+# include "UIPMC_Connection_Handler.i"
+#endif /* ! __ACE_INLINE__ */
+
+ACE_RCSID(tao, UIPMC_Connect, "$Id$")
+
+TAO_UIPMC_Connection_Handler::TAO_UIPMC_Connection_Handler (ACE_Thread_Manager *t)
+ : TAO_UIPMC_SVC_HANDLER (t, 0 , 0),
+ TAO_Connection_Handler (0),
+ uipmc_properties_ (0),
+ using_mcast_ (0)
+{
+ // This constructor should *never* get called, it is just here to
+ // make the compiler happy: the default implementation of the
+ // Creation_Strategy requires a constructor with that signature, we
+ // don't use that implementation, but some (most?) compilers
+ // instantiate it anyway.
+ ACE_ASSERT (this->orb_core () != 0);
+}
+
+
+TAO_UIPMC_Connection_Handler::TAO_UIPMC_Connection_Handler (TAO_ORB_Core *orb_core,
+ void *arg)
+ : TAO_UIPMC_SVC_HANDLER (orb_core->thr_mgr (), 0, 0),
+ TAO_Connection_Handler (orb_core),
+ uipmc_properties_ (ACE_static_cast
+ (TAO_UIPMC_Properties *, arg)),
+ using_mcast_ (0)
+{
+ TAO_UIPMC_Transport* specific_transport = 0;
+ ACE_NEW(specific_transport,
+ TAO_UIPMC_Transport(this, orb_core, 0));
+
+ // store this pointer (indirectly increment ref count)
+ this->transport(specific_transport);
+ TAO_Transport::release (specific_transport);
+}
+
+
+TAO_UIPMC_Connection_Handler::~TAO_UIPMC_Connection_Handler (void)
+{
+ if (this->using_mcast_)
+ {
+ this->mcast_socket_.unsubscribe ();
+ this->mcast_socket_.close ();
+ }
+ else
+ this->udp_socket_.close ();
+}
+
+ACE_HANDLE
+TAO_UIPMC_Connection_Handler::get_handle (void) const
+{
+ if (this->using_mcast_)
+ return this->mcast_socket_.get_handle ();
+ else
+ return this->udp_socket_.get_handle ();
+}
+
+const ACE_INET_Addr &
+TAO_UIPMC_Connection_Handler::addr (void)
+{
+ return this->addr_;
+}
+
+
+void
+TAO_UIPMC_Connection_Handler::addr (const ACE_INET_Addr &addr)
+{
+ this->addr_ = addr;
+}
+
+
+const ACE_INET_Addr &
+TAO_UIPMC_Connection_Handler::local_addr (void)
+{
+ return local_addr_;
+}
+
+
+void
+TAO_UIPMC_Connection_Handler::local_addr (const ACE_INET_Addr &addr)
+{
+ local_addr_ = addr;
+}
+
+
+const ACE_SOCK_Dgram &
+TAO_UIPMC_Connection_Handler::dgram (void)
+{
+ return this->udp_socket_;
+}
+
+const ACE_SOCK_Dgram_Mcast &
+TAO_UIPMC_Connection_Handler::mcast_dgram (void)
+{
+ return this->mcast_socket_;
+}
+
+
+int
+TAO_UIPMC_Connection_Handler::open (void*)
+{
+ this->udp_socket_.open (this->local_addr_);
+
+ if(TAO_debug_level > 5)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("\nTAO (%P|%t) TAO_UIPMC_Connection_Handler::open -")
+ ACE_TEXT("listening on: <%s:%u>\n"),
+ this->local_addr_.get_host_name (),
+ this->local_addr_.get_port_number ()));
+ }
+
+ // Set the id in the transport now that we're active.
+ this->transport ()->id ((int) this->udp_socket_.get_handle ());
+ this->using_mcast_ = 0;
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Connection_Handler::open_server (void)
+{
+ this->mcast_socket_.subscribe (this->local_addr_);
+ if( TAO_debug_level > 5)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("\nTAO (%P|%t) TAO_UIPMC_Connection_Handler::open_server -")
+ ACE_TEXT("subcribed to multicast group at %s:%d\n"),
+ this->local_addr_.get_host_name (),
+ this->local_addr_.get_port_number ()
+ ));
+ }
+
+ this->transport ()->id ((int) this->mcast_socket_.get_handle ());
+ this->using_mcast_ = 1;
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Connection_Handler::activate (long flags,
+ int n_threads,
+ int force_active,
+ long priority,
+ int grp_id,
+ ACE_Task_Base *task,
+ ACE_hthread_t thread_handles[],
+ void *stack[],
+ size_t stack_size[],
+ ACE_thread_t thread_names[])
+{
+ if (TAO_debug_level)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC_Connection_Handler::activate %d ")
+ ACE_TEXT ("threads, flags = %d\n"),
+ n_threads,
+ flags,
+ THR_BOUND));
+ // @@ Michael: I believe we do not need active service handlers right now.
+ // @@ Frank: Not disabled yet...
+
+ // Set the id in the transport now that we're active.
+ this->transport ()->id ((int) this->get_handle ());
+
+ return TAO_UIPMC_SVC_HANDLER::activate (flags,
+ n_threads,
+ force_active,
+ priority,
+ grp_id,
+ task,
+ thread_handles,
+ stack,
+ stack_size,
+ thread_names);
+}
+
+int
+TAO_UIPMC_Connection_Handler::svc (void)
+{
+ // @@ Michael: I believe we do not need active service handlers right now.
+
+ // This method is called when an instance is "activated", i.e.,
+ // turned into an active object. Presumably, activation spawns a
+ // thread with this method as the "worker function".
+
+ // Clear the non-blocking mode here
+ ACE_Flag_Manip::clr_flags (this->get_handle (),
+ ACE_NONBLOCK);
+
+ // Call the implementation here
+ return this->svc_i ();
+}
+
+
+int
+TAO_UIPMC_Connection_Handler::handle_close (ACE_HANDLE handle,
+ ACE_Reactor_Mask rm)
+{
+ // @@ Alex: we need to figure out if the transport decides to close
+ // us or something else. If it is something else (for example
+ // the cached connector trying to make room for other
+ // connections) then we should let the transport know, so it can
+ // in turn take appropiate action (such as sending exceptions to
+ // all waiting reply handlers).
+ if (TAO_debug_level)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Connection_Handler::handle_close ")
+ ACE_TEXT ("(%d, %d)\n"),
+ handle,
+ rm));
+
+ long upcalls =
+ this->decr_pending_upcalls ();
+
+ ACE_ASSERT (upcalls >= 0);
+
+ // Try to clean up things if the upcall count has reached 0
+ if (upcalls == 0)
+ this->handle_close_i ();
+
+ return 0;
+}
+
+void
+TAO_UIPMC_Connection_Handler::handle_close_i (void)
+{
+ if (TAO_debug_level)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Connection_Handler::handle_close_i ")
+ ACE_TEXT ("(%d)\n"),
+ this->transport ()->id ()));
+
+ // @@ Why are we doing checks for is_registered flags here if the
+ // handlers are not registered with the reactor? - Bala
+ if (this->transport ()->wait_strategy ()->is_registered ())
+ {
+ // @@ Frank: Added reactor check. not sure if this is right?
+ if (this->reactor ())
+ {
+ // Make sure there are no timers.
+ this->reactor ()->cancel_timer (this);
+ }
+
+ // Set the flag to indicate that it is no longer registered with
+ // the reactor, so that it isn't included in the set that is
+ // passed to the reactor on ORB destruction.
+ this->transport ()->wait_strategy()->is_registered (0);
+ }
+
+ // Close the handle..
+ if (this->get_handle () != ACE_INVALID_HANDLE)
+ {
+ // Remove the entry as it is invalid
+ this->transport ()->purge_entry ();
+
+ // Signal the transport that we will no longer have
+ // a reference to it. This will eventually call
+ // TAO_Transport::release ().
+ this->transport (0);
+ }
+
+ // Follow usual Reactor-style lifecycle semantics and commit
+ // suicide.
+ this->destroy ();
+}
+
+int
+TAO_UIPMC_Connection_Handler::resume_handler (void)
+{
+ return TAO_RESUMES_CONNECTION_HANDLER;
+}
+
+int
+TAO_UIPMC_Connection_Handler::add_transport_to_cache (void)
+{
+ ACE_INET_Addr addr;
+
+ // This function is called by the acceptor to add this
+ // transport to the transport cache. This is really
+ // important for proper shutdown. The address used
+ // is irrelevent, since UIPMC is connectionless.
+
+ // Construct a UIPMC_Endpoint object.
+ TAO_UIPMC_Endpoint endpoint (addr);
+
+ // Construct a property object
+ TAO_Base_Transport_Property prop (&endpoint);
+
+ // Add the handler to Cache
+ return this->orb_core ()->lane_resources ()
+ .transport_cache ().cache_transport (&prop,
+ this->transport ());
+}
+
+
+int
+TAO_UIPMC_Connection_Handler::handle_input (ACE_HANDLE h)
+{
+ // Increase the reference count on the upcall that have passed us.
+ this->incr_pending_upcalls ();
+
+ TAO_Resume_Handle resume_handle (this->orb_core (),
+ this->get_handle ());
+
+ int retval = this->transport ()->handle_input_i (resume_handle);
+
+ // Now the message has been read
+ if (retval == -1 && TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - %p\n"),
+ ACE_TEXT ("UIPMC_Connection_Handler::handle_input \n")));
+
+ }
+
+ // The upcall is done. Bump down the reference count
+ long upcalls = this->decr_pending_upcalls ();
+
+ ACE_ASSERT (upcalls >= 0);
+
+ // Try to clean up things if the upcall count has reached 0
+ if (upcalls == 0)
+ {
+ this->handle_close_i ();
+
+ // As we have already performed the handle closing we dont want
+ // to return a -1. Doing so would make the reactor call
+ // handle_close () which could be harmful.
+ retval = 0;
+ }
+
+ if (retval == -1)
+ {
+ // @@ Bala: I am not sure why I am doing this here. But let it
+ // be there for uniformity sake..
+ // This is really a odd case. We could have a race condition if
+ // we dont do this. Looks like this what happens
+ // - imagine we have more than 1 server threads
+ // - The server has got more than one connection from the
+ // clients
+ // - The clients make requests and they start dissappearing.
+ // - The connections start getting closed
+ // - at that point one of the server threads is woken up to
+ // and handle_input () is called.
+ // - the handle_input sees no data and so is about return a -1.
+ // - if the handle is resumed, it looks like the oen more thread
+ // gets access to the handle and the handle_input is called by
+ // another thread.
+ // - at that point of time if the thread returning -1 to the
+ // reactor starts closing down the handler, bad things start
+ // happening.
+ // Looks subtle though. After adding this I dont see anything
+ // bad happenin and so let us stick with it...
+ resume_handle.set_flag (TAO_Resume_Handle::TAO_HANDLE_LEAVE_SUSPENDED);
+ }
+ // @@ Michael:
+ // We always return 0, as we do not have any send errors.
+ return 0;
+}
+
+
+int
+TAO_UIPMC_Connection_Handler::handle_cleanup (void)
+{
+ // Deregister this handler with the ACE_Reactor.
+ if (this->reactor ())
+ {
+ ACE_Reactor_Mask mask =
+ ACE_Event_Handler::ALL_EVENTS_MASK | ACE_Event_Handler::DONT_CALL;
+
+ // Make sure there are no timers.
+ this->reactor ()->cancel_timer (this);
+
+ // Remove self from reactor.
+ this->reactor ()->remove_handler (this, mask);
+ }
+
+ return 0;
+}
+
+
+// ****************************************************************
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+
+// Instantiated in IIOP_Connection_Handler.cpp
+//template class ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>;
+
+template class ACE_Concurrency_Strategy<TAO_UIPMC_Connection_Handler>;
+template class ACE_Creation_Strategy<TAO_UIPMC_Connection_Handler>;
+
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+
+// Instantiated in IIOP_Connection_Handler.cpp
+//#pragma instantiate ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>
+
+#pragma instantiate ACE_Concurrency_Strategy<TAO_UIPMC_Connection_Handler>
+#pragma instantiate ACE_Creation_Strategy<TAO_UIPMC_Connection_Handler>
+
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h
new file mode 100644
index 00000000000..5fd33aba315
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h
@@ -0,0 +1,189 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Connection_Handler.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_CONNECTION_HANDLER_H
+#define TAO_UIPMC_CONNECTION_HANDLER_H
+#include "ace/pre.h"
+
+#include "ace/Reactor.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Acceptor.h"
+
+#include "tao/corbafwd.h"
+#include "tao/Wait_Strategy.h"
+#include "tao/Connection_Handler.h"
+#include "UIPMC_Transport.h"
+#include "portablegroup_export.h"
+
+#include "ace/SOCK_Dgram_Mcast.h"
+#include "ace/SOCK_Dgram.h"
+
+
+// Forward Decls
+class TAO_Pluggable_Messaging;
+
+// ****************************************************************
+
+/**
+ * @class TAO_UIPMC_Properties
+ *
+ * @brief UIPMC properties specification for a set of
+ * connections.
+ *
+ */
+
+class TAO_PortableGroup_Export TAO_UIPMC_Properties
+{
+
+public:
+ int ttl;
+};
+
+
+
+// ****************************************************************
+
+/**
+ * @class TAO_UIPMC_Connection_Handler
+ *
+ * @brief Handles requests on a single connection.
+ *
+ * The Connection handler which is common for the Acceptor and
+ * the Connector
+ */
+
+
+class TAO_PortableGroup_Export TAO_UIPMC_Connection_Handler :
+ public TAO_UIPMC_SVC_HANDLER,
+ public TAO_Connection_Handler
+{
+
+public:
+
+ TAO_UIPMC_Connection_Handler (ACE_Thread_Manager* t = 0);
+
+ /// Constructor. <arg> parameter is used by the Acceptor to pass the
+ /// protocol configuration properties for this connection.
+ TAO_UIPMC_Connection_Handler (TAO_ORB_Core *orb_core,
+ void *arg);
+
+
+ /// Destructor.
+ ~TAO_UIPMC_Connection_Handler (void);
+
+ /// Called by the <Strategy_Acceptor> when the handler is completely
+ /// connected. Argument is unused.
+ virtual int open (void *);
+
+ // @@ Frank: Similar to open, but called on server
+ virtual int open_server (void);
+
+ /// = Active object activation method.
+ virtual int activate (long flags = THR_NEW_LWP,
+ int n_threads = 1,
+ int force_active = 0,
+ long priority = ACE_DEFAULT_THREAD_PRIORITY,
+ int grp_id = -1,
+ ACE_Task_Base *task = 0,
+ ACE_hthread_t thread_handles[] = 0,
+ void *stack[] = 0,
+ size_t stack_size[] = 0,
+ ACE_thread_t thread_names[] = 0);
+
+ /// Only used when the handler is turned into an active object by
+ /// calling <activate>. This serves as the event loop in such cases.
+ virtual int svc (void);
+
+ /// Perform appropriate closing.
+ virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE,
+ ACE_Reactor_Mask = ACE_Event_Handler::NULL_MASK);
+
+ /// Event handler overload..
+ virtual int resume_handler (void);
+
+ /// Add ourselves to Cache.
+ int add_transport_to_cache (void);
+
+ // UIPMC Additions - Begin
+ ACE_HANDLE get_handle (void) const;
+
+ const ACE_INET_Addr &addr (void);
+
+ void addr (const ACE_INET_Addr &addr);
+
+ const ACE_INET_Addr &local_addr (void);
+
+ void local_addr (const ACE_INET_Addr &addr);
+
+ const ACE_INET_Addr &server_addr (void);
+
+ void server_addr (const ACE_INET_Addr &addr);
+
+ const ACE_SOCK_Dgram &dgram (void);
+
+ const ACE_SOCK_Dgram_Mcast &mcast_dgram (void);
+ // UIPMC Additions - End
+
+protected:
+
+ /// = Event Handler overloads
+
+ /// Reads a message from the <peer()>, dispatching and servicing it
+ /// appropriately.
+ /// handle_input() just delegates on handle_input_i() which timeouts
+ /// after <max_wait_time>, this is used in thread-per-connection to
+ /// ensure that server threads eventually exit.
+
+ virtual int handle_input (ACE_HANDLE = ACE_INVALID_HANDLE);
+ virtual int handle_cleanup ();
+
+ // UIPMC Additions - Begin
+
+ /// Client side UDP socket (send only).
+ ACE_SOCK_Dgram udp_socket_;
+
+ /// Server side Mcast UDP socket (receive only).
+ ACE_SOCK_Dgram_Mcast mcast_socket_;
+
+ /// Flag that specifies whether multicast is in use or not.
+ CORBA::Boolean using_mcast_;
+
+ // This is always the remote address
+ ACE_INET_Addr addr_;
+
+ // This is always the local address for the connector
+ ACE_INET_Addr local_addr_;
+
+ // UIPMC Additions - End
+
+private:
+
+ /// Perform appropriate closing
+ void handle_close_i (void);
+
+private:
+
+ /// UIPMC configuration for this connection.
+ TAO_UIPMC_Properties *uipmc_properties_;
+};
+
+
+#if defined (__ACE_INLINE__)
+#include "UIPMC_Connection_Handler.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* TAO_UIPMC_CONNECTION_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.i b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.i
new file mode 100644
index 00000000000..7f2b3228624
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.i
@@ -0,0 +1,3 @@
+// -*- C++ -*-
+// $Id$
+
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp
new file mode 100644
index 00000000000..bf30120bc5b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp
@@ -0,0 +1,255 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "UIPMC_Connector.h"
+
+#include "ace/Connector.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/Environment.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/Protocols_Hooks.h"
+#include "tao/Invocation.h"
+
+#include "UIPMC_Profile.h"
+
+ACE_RCSID(tao, UIPMC_Connector, "$Id$")
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+
+
+template class ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler>;
+template class ACE_Map_Manager<int, ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler> *, TAO_SYNCH_RW_MUTEX>;
+template class ACE_Map_Iterator_Base<int, ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler> *, TAO_SYNCH_RW_MUTEX>;
+template class ACE_Map_Entry<int,ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler>*>;
+
+template class ACE_Map_Entry<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *>;
+
+template class ACE_Map_Iterator<int,ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler>*,TAO_SYNCH_RW_MUTEX>;
+template class ACE_Map_Reverse_Iterator<int,ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler>*,TAO_SYNCH_RW_MUTEX>;
+template class ACE_Hash_Map_Iterator_Base_Ex < ACE_INET_Addr, TAO_UIPMC_Connection_Handler *, ACE_Hash < ACE_INET_Addr >, ACE_Equal_To < ACE_INET_Addr >, ACE_Null_Mutex >;
+template class ACE_Hash_Map_Iterator_Ex<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *, ACE_Hash<ACE_INET_Addr>, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *, ACE_Hash<ACE_INET_Addr>, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex>;
+
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+
+#pragma instantiate ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler>
+#pragma instantiate ACE_Map_Manager<int, ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler> *, TAO_SYNCH_RW_MUTEX>
+#pragma instantiate ACE_Map_Iterator_Base<int, ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler> *, TAO_SYNCH_RW_MUTEX>
+#pragma instantiate ACE_Map_Entry<int,ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler>*>
+
+#pragma instantiate ACE_Map_Entry<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *>;
+
+#pragma instantiate ACE_Map_Iterator<int,ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler>*,TAO_SYNCH_RW_MUTEX>
+#pragma instantiate ACE_Map_Reverse_Iterator<int,ACE_Svc_Tuple<TAO_UIPMC_Connection_Handler>*,TAO_SYNCH_RW_MUTEX>
+
+#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex < ACE_INET_Addr,TAO_UIPMC_Connection_Handler *, ACE_Hash < ACE_INET_Addr >, ACE_Equal_To < ACE_INET_Addr >, ACE_Null_Mutex >
+#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *, ACE_Hash<ACE_INET_Addr>, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *, ACE_Hash<ACE_INET_Addr>, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex>
+
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
+
+TAO_UIPMC_Connector::TAO_UIPMC_Connector (CORBA::Boolean flag)
+ : TAO_Connector (TAO_TAG_UIPMC_PROFILE)
+{
+}
+
+TAO_UIPMC_Connector::~TAO_UIPMC_Connector (void)
+{
+}
+
+int
+TAO_UIPMC_Connector::open (TAO_ORB_Core *orb_core)
+{
+ this->orb_core (orb_core);
+
+ // @@ Michael: We do not use traditional connection management.
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Connector::close (void)
+{
+ SvcHandlerIterator iter (svc_handler_table_);
+
+ while (!iter.done ())
+ {
+ // Delete the connection handler
+ delete (*iter).int_id_;
+ iter++;
+ }
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Connector::connect (TAO_GIOP_Invocation *invocation,
+ TAO_Transport_Descriptor_Interface *desc
+ TAO_ENV_ARG_DECL_NOT_USED)
+{
+ TAO_Transport *&transport = invocation->transport ();
+ // ACE_Time_Value *max_wait_time = invocation->max_wait_time ();
+ TAO_Endpoint *endpoint = desc->endpoint ();
+
+ if (endpoint->tag () != TAO_TAG_UIPMC_PROFILE)
+ return -1;
+
+ TAO_UIPMC_Endpoint *uipmc_endpoint =
+ ACE_dynamic_cast (TAO_UIPMC_Endpoint *,
+ endpoint );
+ if (uipmc_endpoint == 0)
+ return -1;
+
+ const ACE_INET_Addr &remote_address =
+ uipmc_endpoint->object_addr ();
+
+ // Verify that the remote ACE_INET_Addr was initialized properly.
+ // Failure can occur if hostname lookup failed when initializing the
+ // remote ACE_INET_Addr.
+ if (remote_address.get_type () != AF_INET)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC connection failed.\n")
+ ACE_TEXT ("TAO (%P|%t) This is most likely ")
+ ACE_TEXT ("due to a hostname lookup ")
+ ACE_TEXT ("failure.\n")));
+ }
+
+ return -1;
+ }
+
+ TAO_UIPMC_Connection_Handler *svc_handler = 0;
+
+ if (this->svc_handler_table_.find (remote_address, svc_handler) == -1)
+ {
+ TAO_UIPMC_Connection_Handler *svc_handler_i = 0;
+ ACE_NEW_RETURN (svc_handler_i,
+ TAO_UIPMC_Connection_Handler (this->orb_core (),
+ 0 /* TAO_UIPMC_Properties */),
+ -1);
+
+ svc_handler_i->local_addr (ACE_sap_any_cast (ACE_INET_Addr &));
+ svc_handler_i->addr (remote_address);
+
+ svc_handler_i->open (0);
+
+ svc_handler_table_.bind (remote_address,
+ svc_handler_i);
+ svc_handler = svc_handler_i;
+
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) UIPMC_Connector::connect - ")
+ ACE_TEXT ("new connection on HANDLE %d\n"),
+ svc_handler->get_handle ()));
+ }
+
+ // @@ Michael: We do not use traditional connection management.
+
+ transport = TAO_Transport::_duplicate (svc_handler->transport ());
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Connector::preconnect (const char *)
+{
+ // @@ Michael: We do not support preconnects.
+ return 0;
+}
+
+TAO_Profile *
+TAO_UIPMC_Connector::create_profile (TAO_InputCDR& cdr)
+{
+ TAO_Profile *pfile;
+ ACE_NEW_RETURN (pfile,
+ TAO_UIPMC_Profile (this->orb_core ()),
+ 0);
+
+ int r = pfile->decode (cdr);
+ if (r == -1)
+ {
+ pfile->_decr_refcnt ();
+ pfile = 0;
+ }
+
+ return pfile;
+}
+
+TAO_Profile *
+TAO_UIPMC_Connector::make_profile (TAO_ENV_SINGLE_ARG_DECL)
+{
+ // The endpoint should be of the form:
+ // N.n@host:port/object_key
+ // or:
+ // host:port/object_key
+
+ TAO_Profile *profile = 0;
+ ACE_NEW_THROW_EX (profile,
+ TAO_UIPMC_Profile (this->orb_core ()),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return profile;
+}
+
+int
+TAO_UIPMC_Connector::check_prefix (const char *endpoint)
+{
+ // Check for a valid string
+ if (!endpoint || !*endpoint)
+ return -1; // Failure
+
+ const char *protocol[] = { "miop" };
+
+ size_t slot = ACE_OS::strchr (endpoint, ':') - endpoint;
+ size_t len0 = ACE_OS::strlen (protocol[0]);
+
+ // Check for the proper prefix in the IOR. If the proper prefix
+ // isn't in the IOR then it is not an IOR we can use.
+ if (slot == len0
+ && ACE_OS::strncasecmp (endpoint, protocol[0], len0) == 0)
+ return 0;
+
+ return -1;
+ // Failure: not a MIOP IOR
+ // DO NOT throw an exception here.
+}
+
+char
+TAO_UIPMC_Connector::object_key_delimiter (void) const
+{
+ return TAO_UIPMC_Profile::object_key_delimiter_;
+}
+
+int
+TAO_UIPMC_Connector::init_uipmc_properties (void)
+{
+ // @@ Michael: We have no TCP, so we have no TCP properties.
+ return 0;
+}
+
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+
+template class ACE_Hash <ACE_INET_Addr>;
+template class ACE_Equal_To <ACE_INET_Addr>;
+template class ACE_Hash_Map_Manager_Ex<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *, ACE_Hash <ACE_INET_Addr>, ACE_Equal_To <ACE_INET_Addr>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Entry<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+
+#pragma instantiate ACE_Hash <ACE_INET_Addr>;
+#pragma instantiate ACE_Equal_To <ACE_INET_Addr>
+#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *, ACE_Hash <ACE_INET_Addr>, ACE_Equal_To <ACE_INET_Addr>, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Entry<ACE_INET_Addr, TAO_UIPMC_Connection_Handler *>;
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
+
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.h
new file mode 100644
index 00000000000..d010698dc8c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.h
@@ -0,0 +1,96 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Connector.h
+ *
+ * $Id$
+ *
+ * MIOP specific connector processing.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_CONNECTOR_H
+#define TAO_UIPMC_CONNECTOR_H
+#include "ace/pre.h"
+
+#include "tao/corbafwd.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Pluggable.h"
+#include "UIPMC_Connection_Handler.h"
+#include "portablegroup_export.h"
+
+// ****************************************************************
+
+/**
+ * @class TAO_UIPMC_Connector
+ *
+ * @brief UIPMC-specific Connector bridge for pluggable protocols.
+ *
+ * Concrete instance of the TAO_Connector class. Responsible
+ * for establishing a connection with a server and is called from the
+ * Connector_Registory.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Connector : public TAO_Connector
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_UIPMC_Connector (CORBA::Boolean flag = 0);
+
+ /// Destructor.
+ ~TAO_UIPMC_Connector (void);
+
+ // = The TAO_Connector methods, please check the documentation on
+ // Pluggable.h
+ int open (TAO_ORB_Core *orb_core);
+ int close (void);
+ int connect (TAO_GIOP_Invocation *invocation,
+ TAO_Transport_Descriptor_Interface *desc
+ TAO_ENV_ARG_DECL);
+ int preconnect (const char *preconnections);
+ TAO_Profile *create_profile (TAO_InputCDR& cdr);
+
+ virtual int check_prefix (const char *endpoint);
+
+ virtual char object_key_delimiter (void) const;
+
+protected:
+ /// = More TAO_Connector methods, please check the documentation on
+ /// Pluggable.h
+ virtual TAO_Profile * make_profile (TAO_ENV_SINGLE_ARG_DECL);
+
+ /// Obtain UIPMC properties that must be used by this connector, i.e.,
+ /// initialize <uipmc_properties_>.
+ int init_uipmc_properties (void);
+
+protected:
+
+ /// UIPMC configuration properties to be used for all
+ /// connections established by this connector.
+ TAO_UIPMC_Properties uipmc_properties_;
+
+private:
+ // @@ Michael: UDP Addition
+ ACE_Hash_Map_Manager_Ex < ACE_INET_Addr,
+ TAO_UIPMC_Connection_Handler *,
+ ACE_Hash < ACE_INET_Addr >,
+ ACE_Equal_To < ACE_INET_Addr >,
+ ACE_Null_Mutex > svc_handler_table_;
+
+ typedef ACE_Hash_Map_Iterator_Ex < ACE_INET_Addr,
+ TAO_UIPMC_Connection_Handler *,
+ ACE_Hash < ACE_INET_Addr >,
+ ACE_Equal_To < ACE_INET_Addr >,
+ ACE_Null_Mutex > SvcHandlerIterator;
+
+};
+
+#include "ace/post.h"
+#endif /* TAO_UIPMC_CONNECTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.cpp
new file mode 100644
index 00000000000..3689c4bbea4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.cpp
@@ -0,0 +1,139 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "UIPMC_Endpoint.h"
+//#include "tao/UIPMC_Connection_Handler.h"
+#include "tao/debug.h"
+
+ACE_RCSID(tao, UIPMC_Endpoint, "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+# include "UIPMC_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_UIPMC_Endpoint::TAO_UIPMC_Endpoint (void)
+ : TAO_Endpoint (TAO_TAG_UIPMC_PROFILE),
+ object_addr_ (),
+ /* hint_ (0), */
+ next_ (0)
+{
+}
+
+
+TAO_UIPMC_Endpoint::TAO_UIPMC_Endpoint (const ACE_INET_Addr &addr)
+ : TAO_Endpoint (TAO_TAG_UIPMC_PROFILE),
+ object_addr_ (addr),
+ /* hint_ (0), */
+ next_ (0)
+{
+ this->object_addr (addr);
+}
+
+TAO_UIPMC_Endpoint::TAO_UIPMC_Endpoint (const CORBA::Octet class_d_address[4],
+ CORBA::UShort port)
+ : TAO_Endpoint (TAO_TAG_UIPMC_PROFILE),
+ port_ (port),
+ /* hint_ (0), */
+ next_ (0)
+{
+ for (int i = 0; i<4; i++)
+ this->class_d_address_[i] = class_d_address[i];
+
+ this->update_object_addr ();
+}
+
+
+TAO_UIPMC_Endpoint::~TAO_UIPMC_Endpoint (void)
+{
+
+}
+
+void
+TAO_UIPMC_Endpoint::object_addr (const ACE_INET_Addr &addr)
+{
+ this->port_ = addr.get_port_number();
+ this->uint_ip_addr (addr.get_ip_address ());
+
+ this->object_addr_.set (addr);
+}
+
+const char *
+TAO_UIPMC_Endpoint::get_host_addr (void) const
+{
+ return this->object_addr_.get_host_addr ();
+}
+
+
+int
+TAO_UIPMC_Endpoint::addr_to_string (char *buffer, size_t length)
+{
+ size_t actual_len =
+ 15 // chars in dotted decimal addr
+ + sizeof (':') // delimiter
+ + 5 // max port
+ + sizeof ('\0');
+
+ if (length < actual_len)
+ return -1;
+
+ ACE_OS::sprintf (buffer, "%d.%d.%d.%d:%d",
+ this->class_d_address_[0],
+ this->class_d_address_[1],
+ this->class_d_address_[2],
+ this->class_d_address_[3],
+ this->port_);
+
+ return 0;
+}
+
+void
+TAO_UIPMC_Endpoint::reset_hint (void)
+{
+ // Commented out for the time being....
+ /* if (this->hint_)
+ this->hint_->cleanup_hint ((void **) &this->hint_); */
+}
+
+TAO_Endpoint *
+TAO_UIPMC_Endpoint::next (void)
+{
+ return this->next_;
+}
+
+TAO_Endpoint *
+TAO_UIPMC_Endpoint::duplicate (void)
+{
+ TAO_UIPMC_Endpoint *endpoint = 0;
+
+ ACE_NEW_RETURN (endpoint,
+ TAO_UIPMC_Endpoint (this->object_addr_),
+ 0);
+
+ return endpoint;
+}
+
+CORBA::Boolean
+TAO_UIPMC_Endpoint::is_equivalent (const TAO_Endpoint *other_endpoint)
+{
+ TAO_Endpoint *endpt = ACE_const_cast (TAO_Endpoint *,
+ other_endpoint);
+
+ TAO_UIPMC_Endpoint *endpoint = ACE_dynamic_cast (TAO_UIPMC_Endpoint *,
+ endpt);
+ if (endpoint == 0)
+ return 0;
+
+ return
+ this->port_ == endpoint->port_
+ && ACE_OS::memcmp (this->class_d_address_, endpoint->class_d_address_, 4) == 0;
+}
+
+CORBA::ULong
+TAO_UIPMC_Endpoint::hash (void)
+{
+ return
+ this->uint_ip_addr ()
+ + this->port_;
+}
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.h
new file mode 100644
index 00000000000..e33206162b3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.h
@@ -0,0 +1,125 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Endpoint.h
+ *
+ * $Id$
+ *
+ * UIPMC implementation of PP Framework Endpoint interface.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_ENDPOINT_H
+#define TAO_UIPMC_ENDPOINT_H
+#include "ace/pre.h"
+
+#include "tao/corbafwd.h"
+
+#include "tao/Endpoint.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/INET_Addr.h"
+#include "portablegroup_export.h"
+
+/**
+ * @class TAO_UIPMC_Endpoint
+ *
+ * @brief TAO_UIPMC_Endpoint
+ *
+ * UIPMC-specific implementation of PP Framework Endpoint interface.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Endpoint : public TAO_Endpoint
+{
+public:
+ // = Initialization and termination methods.
+
+ /// Default constructor.
+ TAO_UIPMC_Endpoint (void);
+
+ /// Constructor.
+ TAO_UIPMC_Endpoint (const ACE_INET_Addr &addr);
+
+ /// Constructor. @@ Frank - deprecate this.
+ TAO_UIPMC_Endpoint (const CORBA::Octet class_d_address[4],
+ CORBA::UShort port);
+
+ /// Destructor.
+ ~TAO_UIPMC_Endpoint (void);
+
+ // = Implementation of abstract TAO_Endpoint methods. See
+ // Endpoint.h for their documentation.
+
+ virtual TAO_Endpoint *next (void);
+ virtual int addr_to_string (char *buffer, size_t length);
+ virtual void reset_hint (void);
+
+ /// Makes a copy of <this>
+ virtual TAO_Endpoint *duplicate (void);
+
+ /// Return true if this endpoint is equivalent to <other_endpoint>. Two
+ /// endpoints are equivalent iff their port and host are the same.
+ CORBA::Boolean is_equivalent (const TAO_Endpoint *other_endpoint);
+
+ /// Return a hash value for this object.
+ CORBA::ULong hash (void);
+
+ // Allocates memory and returns a copy of <this>
+
+ // = UIPMC_Endpoint-specific methods.
+
+ /// Return a reference to the <object_addr>.
+ const ACE_INET_Addr &object_addr (void) const;
+
+ /// Set the IP multicast address and port.
+ void object_addr (const ACE_INET_Addr &addr);
+
+ /// Return a pointer to the stringified host address (not including the
+ /// port). This class retains ownership of the address memory.
+ const char *get_host_addr (void) const;
+
+ /// Return the port number.
+ CORBA::UShort port (void) const;
+
+ /// Set the port number.
+ CORBA::UShort port (CORBA::UShort p); //@@ Frank - deprecate this.
+
+ //TAO_UIPMC_Connection_Handler *&hint (void);
+ // Access to our <hint_>.
+
+
+private:
+
+ /// Helper methods for getting and setting the IP address.
+ ACE_UINT32 uint_ip_addr (void) const;
+ void uint_ip_addr (ACE_UINT32 ip_addr);
+
+ /// Helper method to update the cached object address.
+ void update_object_addr (void);
+
+ /// IP Multicast address. @@ Frank - deprecate this.
+ CORBA::Octet class_d_address_[4];
+
+ /// UDP port number. @@ Frank - deprecate this.
+ CORBA::UShort port_;
+
+ /// Cached instance of <ACE_INET_Addr> for use in making
+ /// invocations, etc.
+ ACE_INET_Addr object_addr_;
+
+ /// UIPMC Endpoints can be stringed into a list. Return the next
+ /// endpoint in the list, if any.
+ TAO_UIPMC_Endpoint *next_;
+};
+
+#if defined (__ACE_INLINE__)
+# include "tao/UIPMC_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* TAO_UIPMC_PROFILE_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.i b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.i
new file mode 100644
index 00000000000..c89f5618806
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.i
@@ -0,0 +1,48 @@
+// -*- C++ -*-
+// $Id$
+
+ACE_INLINE const ACE_INET_Addr &
+TAO_UIPMC_Endpoint::object_addr (void) const
+{
+ return this->object_addr_;
+}
+
+
+ACE_INLINE CORBA::UShort
+TAO_UIPMC_Endpoint::port (void) const
+{
+ return this->port_;
+}
+
+ACE_INLINE CORBA::UShort
+TAO_UIPMC_Endpoint::port (CORBA::UShort p)
+{
+ return this->port_ = p;
+}
+
+
+ACE_INLINE ACE_UINT32
+TAO_UIPMC_Endpoint::uint_ip_addr (void) const
+{
+ return (((ACE_UINT32)this->class_d_address_[0] << 24) |
+ ((ACE_UINT32)this->class_d_address_[1] << 16) |
+ ((ACE_UINT32)this->class_d_address_[2] << 8) |
+ ((ACE_UINT32)this->class_d_address_[3]));
+}
+
+ACE_INLINE void
+TAO_UIPMC_Endpoint::uint_ip_addr (ACE_UINT32 ip_addr)
+{
+ this->class_d_address_[0] = (CORBA::Char)(ip_addr >> 24);
+ this->class_d_address_[1] = (CORBA::Char)((ip_addr >> 16) & 0xff);
+ this->class_d_address_[2] = (CORBA::Char)((ip_addr >> 8) & 0xff);
+ this->class_d_address_[3] = (CORBA::Char)(ip_addr & 0xff);
+}
+
+ACE_INLINE void
+TAO_UIPMC_Endpoint::update_object_addr (void)
+{
+ this->object_addr_.set (this->port_,
+ this->uint_ip_addr ());
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.cpp
new file mode 100644
index 00000000000..ccc38a36125
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.cpp
@@ -0,0 +1,93 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "UIPMC_Factory.h"
+#include "UIPMC_Acceptor.h"
+#include "UIPMC_Connector.h"
+
+ACE_RCSID(TAO_PORTABLESERVER, UIPMC_Factory, "$Id$")
+
+static const char prefix_[] = "uipmc";
+
+TAO_UIPMC_Protocol_Factory::TAO_UIPMC_Protocol_Factory (void)
+ : TAO_Protocol_Factory (TAO_TAG_UIPMC_PROFILE),
+ major_ (TAO_DEF_GIOP_MAJOR),
+ minor_ (TAO_DEF_GIOP_MINOR)
+{
+}
+
+TAO_UIPMC_Protocol_Factory::~TAO_UIPMC_Protocol_Factory (void)
+{
+}
+
+int
+TAO_UIPMC_Protocol_Factory::match_prefix (const ACE_CString &prefix)
+{
+ // Check for the proper prefix for this protocol.
+ return (ACE_OS::strcasecmp (prefix.c_str (), ::prefix_) == 0);
+}
+
+const char *
+TAO_UIPMC_Protocol_Factory::prefix (void) const
+{
+ return ::prefix_;
+}
+
+char
+TAO_UIPMC_Protocol_Factory::options_delimiter (void) const
+{
+ return '/';
+}
+
+TAO_Acceptor *
+TAO_UIPMC_Protocol_Factory::make_acceptor (void)
+{
+ TAO_Acceptor *acceptor = 0;
+
+ ACE_NEW_RETURN (acceptor,
+ TAO_UIPMC_Acceptor,
+ 0);
+
+ return acceptor;
+}
+
+int
+TAO_UIPMC_Protocol_Factory::init (int /* argc */,
+ char* /* argv */ [])
+{
+ return 0;
+}
+
+TAO_Connector *
+TAO_UIPMC_Protocol_Factory::make_connector (void)
+{
+ TAO_Connector *connector = 0;
+
+ ACE_NEW_RETURN (connector,
+ TAO_UIPMC_Connector,
+ 0);
+ return connector;
+}
+
+int
+TAO_UIPMC_Protocol_Factory::requires_explicit_endpoint (void) const
+{
+ // A multicast endpoint can't be picked automatically in the
+ // pluggable protocol framework. It must be determined from
+ // the UIPMC profile that has the group reference. This information
+ // is either specified by the user or generated by the
+ // multicast group manager or other UIPMC profile generation
+ // interface.
+ return 1;
+}
+
+ACE_STATIC_SVC_DEFINE (TAO_UIPMC_Protocol_Factory,
+ ACE_TEXT ("UIPMC_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_UIPMC_Protocol_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_PortableGroup, TAO_UIPMC_Protocol_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.h
new file mode 100644
index 00000000000..924e45e2913
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.h
@@ -0,0 +1,64 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Factory.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_FACTORY_H
+#define TAO_UIPMC_FACTORY_H
+#include "ace/pre.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Protocol_Factory.h"
+#include "ace/Service_Config.h"
+#include "portablegroup_export.h"
+
+class TAO_Acceptor;
+class TAO_Connector;
+
+class TAO_PortableGroup_Export TAO_UIPMC_Protocol_Factory : public TAO_Protocol_Factory
+{
+public:
+ TAO_UIPMC_Protocol_Factory (void);
+ virtual ~TAO_UIPMC_Protocol_Factory (void);
+
+ // = Service Configurator hooks.
+ /// Dynamic linking hook
+ virtual int init (int argc, char* argv[]);
+
+ /// Verify prefix is a match
+ virtual int match_prefix (const ACE_CString &prefix);
+
+ /// Returns the prefix used by the protocol.
+ virtual const char *prefix (void) const;
+
+ /// Return the character used to mark where an endpoint ends and
+ /// where its options begin.
+ virtual char options_delimiter (void) const;
+
+ // = Check Protocol_Factory.h for a description of these methods.
+ virtual TAO_Acceptor *make_acceptor (void);
+ virtual TAO_Connector *make_connector (void);
+ virtual int requires_explicit_endpoint (void) const;
+
+private:
+ /// Changing the version number can be used to provide backwards
+ /// compatibility with old clients.
+ int major_;
+ int minor_;
+};
+
+ACE_STATIC_SVC_DECLARE (TAO_UIPMC_Protocol_Factory)
+ACE_FACTORY_DECLARE (TAO_PortableGroup, TAO_UIPMC_Protocol_Factory)
+
+#include "ace/post.h"
+#endif /* TAO_UIPMC_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.cpp
new file mode 100644
index 00000000000..3100703a199
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.cpp
@@ -0,0 +1,803 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "UIPMC_Profile.h"
+#include "tao/CDR.h"
+#include "tao/Environment.h"
+#include "tao/ORB.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "tao/target_specification.h"
+
+#include "orbsvcs/miopC.h"
+#include "orbsvcs/PortableGroupC.h"
+
+ACE_RCSID(tao, UIPMC_Profile, "$Id$")
+
+#if !defined (__ACE_INLINE__)
+# include "UIPMC_Profile.i"
+#endif /* __ACE_INLINE__ */
+
+static const char prefix_[] = "uipmc";
+
+// UIPMC doesn't support object keys, so send profiles by default in the GIOP 1.2 target
+// specification.
+static const CORBA::Short default_addressing_mode_ = TAO_Target_Specification::Profile_Addr;
+
+const char TAO_UIPMC_Profile::object_key_delimiter_ = '/';
+
+char
+TAO_UIPMC_Profile::object_key_delimiter (void) const
+{
+ return TAO_UIPMC_Profile::object_key_delimiter_;
+}
+
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (TAO_ORB_Core *orb_core)
+ : TAO_Profile (TAO_TAG_UIPMC_PROFILE,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (),
+ count_ (1),
+ tagged_profile_ ()
+{
+ addressing_mode_ = default_addressing_mode_;
+}
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (const ACE_INET_Addr &addr,
+ TAO_ORB_Core *orb_core)
+ : TAO_Profile (TAO_TAG_UIPMC_PROFILE,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (addr),
+ count_ (1),
+ tagged_profile_ ()
+{
+ addressing_mode_ = default_addressing_mode_;
+}
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (const CORBA::Octet class_d_address[4],
+ CORBA::UShort port,
+ TAO_ORB_Core *orb_core)
+ : TAO_Profile (TAO_TAG_UIPMC_PROFILE,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (class_d_address, port),
+ count_ (1),
+ tagged_profile_ ()
+{
+ addressing_mode_ = default_addressing_mode_;
+}
+
+/*
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (const char *string,
+ TAO_ORB_Core *orb_core
+ TAO_ENV_ARG_DECL)
+ : TAO_Profile (TAO_TAG_UIPMC_PROFILE,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (),
+ count_ (1),
+ tagged_profile_ ()
+{
+ this->add_group_component ();
+ this->parse_string (string TAO_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ addressing_mode_ = default_addressing_mode_;
+}
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (TAO_ORB_Core *orb_core)
+ : TAO_Profile (TAO_TAG_UIPMC_PROFILE,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (),
+ count_ (1),
+ tagged_profile_ ()
+{
+ addressing_mode_ = default_addressing_mode_;
+}
+*/
+
+TAO_UIPMC_Profile::~TAO_UIPMC_Profile (void)
+{
+}
+
+// return codes:
+// -1 -> error
+// 0 -> can't understand this version
+// 1 -> success.
+
+int
+TAO_UIPMC_Profile::decode (TAO_InputCDR& cdr)
+{
+ CORBA::ULong encap_len = cdr.length ();
+
+ // Read and verify major, minor versions, ignoring UIPMC profiles
+ // whose versions we don't understand.
+ CORBA::Octet major = 0, minor = 0;
+
+ if (!(cdr.read_octet (major)
+ && major == TAO_DEF_MIOP_MAJOR
+ && cdr.read_octet (minor)))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC_Profile::decode - v%d.%d\n"),
+ major,
+ minor));
+ return -1;
+ }
+
+ this->version_.major = major;
+
+ if (minor <= TAO_DEF_MIOP_MINOR)
+ this->version_.minor = minor;
+
+ // Decode the endpoint.
+ ACE_CString address;
+ CORBA::UShort port;
+
+ if (!(cdr.read_string (address)
+ && cdr.read_ushort (port)))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC_Profile::decode - Couldn't unmarshal address and port!\n")));
+ return -1;
+ }
+
+ if (this->tagged_components_.decode (cdr) == 0)
+ return -1;
+
+ if (cdr.length () != 0 && TAO_debug_level)
+ // If there is extra data in the profile we are supposed to
+ // ignore it, but print a warning just in case...
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("%d bytes out of %d left after UIPMC profile data\n"),
+ cdr.length (),
+ encap_len));
+
+ if (cdr.good_bit ())
+ {
+ // If everything was successful, update the endpoint's address
+ // and port with the new data.
+
+ ACE_INET_Addr addr (port, address.c_str ());
+
+ this->endpoint_.object_addr (addr);
+
+ return 1;
+ }
+
+ return -1;
+}
+
+
+void
+TAO_UIPMC_Profile::parse_string (const char *string
+ TAO_ENV_ARG_DECL)
+{
+ // Remove the "N.n@" version prefix, if it exists, and verify the
+ // version is one that we accept.
+
+ // Check for MIOP version
+ if (isdigit (string [0]) &&
+ string[1] == '.' &&
+ isdigit (string [2]) &&
+ string[3] == '@')
+ {
+ if (string[0] != '1' ||
+ string[2] != '0')
+ {
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ string += 4;
+ // Skip over the "N.n@"
+ }
+
+ // UIPMC profiles always use GIOP 1.2
+ this->version_.set_version (1, 2);
+
+ //
+ // Parse the group_id.
+ //
+
+ // Parse the group component version.
+ if (isdigit (string [0]) &&
+ string[1] == '.' &&
+ isdigit (string [2]) &&
+ string[3] == '-')
+ {
+ CORBA::Char major;
+ CORBA::Char minor;
+
+ major = (char) (string [0] - '0');
+ minor = (char) (string [2] - '0');
+
+ // Verify that a supported version of MIOP is specified.
+ if (major != TAO_DEF_MIOP_MAJOR ||
+ minor > TAO_DEF_MIOP_MINOR)
+ {
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ // Skip over "N.n-"
+ string += 4;
+ }
+ else
+ {
+ // The group component version is mandatory.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ // Parse the group_domain_id.
+ // The Domain ID is terminated with a '-'.
+
+ // Wrap the string in a ACE_CString
+ ACE_CString ace_str (string, 0, 0);
+
+ // Look for the group domain delimitor.
+ int pos = ace_str.find ('-');
+
+ if (pos == ACE_CString::npos)
+ {
+ // The group_domain_id is mandatory, so throw an
+ // exception if it isn't found.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ // Save the group_domain_id.
+ ACE_CString group_domain_id = ace_str.substring (0, pos);
+
+ // Parse the group_id.
+ // The group_id is terminated with a '-' or a '/'.
+
+ // Skip past the last '-'.
+ pos++;
+ int end_pos = ace_str.find ('-',pos);
+
+ CORBA::Boolean parse_group_ref_version_flag = 0;
+
+ if (end_pos != ACE_CString::npos)
+ {
+ // String was terminated by a '-', so there's a group
+ // reference version to be parsed.
+ parse_group_ref_version_flag = 1;
+ }
+ else
+ {
+ // Look for a slash as the separator.
+ end_pos = ace_str.find ('/', pos);
+
+ if (end_pos == ACE_CString::npos)
+ {
+ // The Group ID is mandatory, so throw an exception.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+ }
+
+ // Get the domain_id.
+ ACE_CString str_domain_id = ace_str.substring (pos, end_pos - pos);
+
+ // Convert the domain_id into numerical form.
+ // @@ group_id is actually 64 bits, but strtoul only can parse 32 bits.
+ // @@ Need a 64 bit strtoul...
+ PortableGroup::ObjectGroupId group_id =
+ ACE_OS::strtoul (str_domain_id.c_str (), 0, 10);
+
+ PortableGroup::ObjectGroupRefVersion ref_version = 0;
+ if (parse_group_ref_version_flag)
+ {
+ // Try to find the group version. It is terminated by a '/'.
+ pos = end_pos + 1;
+ end_pos = ace_str.find ('/', pos);
+ if (end_pos == ACE_CString::npos)
+ {
+ // The group version was expected but not found,
+ // so throw an exception.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ ACE_CString str_group_ref_ver = ace_str.substring (pos, end_pos - pos);
+
+ ref_version =
+ ACE_OS::strtoul (str_group_ref_ver.c_str (), 0, 10);
+ }
+
+ // Parse the group multicast address.
+ // The multicast address is terminated by a ':'.
+ pos = end_pos + 1;
+ end_pos = ace_str.find (':', pos);
+
+ if (end_pos == ACE_CString::npos)
+ {
+ // The multicast address is mandatory, so throw an exception,
+ // since it wasn't found.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ ACE_CString mcast_addr = ace_str.substring (pos, end_pos - pos);
+
+ // Parse the multicast port number.
+
+ // First check that there's something left in the string.
+ pos = end_pos + 1;
+ if (ace_str[pos] == '\0')
+ {
+ // The multicast port is mandatory, so throw an exception,
+ // since it wasn't found.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ CORBA::UShort mcast_port =
+ ACE_static_cast (CORBA::UShort,
+ ACE_OS::strtoul (ace_str.c_str () + pos, 0, 10));
+
+ //
+ // Finally, set all of the fields of the profile.
+ //
+
+ ACE_INET_Addr addr (mcast_port, mcast_addr.c_str ());
+ this->endpoint_.object_addr (addr);
+
+ this->set_group_info (group_domain_id.c_str (),
+ group_id,
+ ref_version);
+
+}
+
+CORBA::Boolean
+TAO_UIPMC_Profile::is_equivalent (const TAO_Profile *other_profile)
+{
+
+ if (other_profile->tag () != TAO_TAG_UIPMC_PROFILE)
+ return 0;
+
+ const TAO_UIPMC_Profile *op =
+ ACE_dynamic_cast (const TAO_UIPMC_Profile *, other_profile);
+
+ if (!(this->version_ == op->version_
+ && this->endpoint_.is_equivalent (&op->endpoint_)))
+ return 0;
+
+ return 1;
+}
+
+CORBA::ULong
+TAO_UIPMC_Profile::hash (CORBA::ULong max
+ TAO_ENV_ARG_DECL_NOT_USED)
+{
+ // Get the hashvalue for all endpoints.
+ CORBA::ULong hashval = this->endpoint_.hash ();
+
+ hashval += this->version_.minor;
+ hashval += this->tag ();
+
+ return hashval % max;
+}
+
+TAO_Endpoint*
+TAO_UIPMC_Profile::endpoint (void)
+{
+ return &this->endpoint_;
+}
+
+int
+TAO_UIPMC_Profile::encode_endpoints (void)
+{
+ return 1;
+}
+
+size_t
+TAO_UIPMC_Profile::endpoint_count (void)
+{
+ return 1;
+}
+
+char *
+TAO_UIPMC_Profile::to_string (TAO_ENV_ARG_DECL_NOT_USED)
+{
+ // @@ Frank: Update to pull out GroupID information...
+
+ u_int buflen = (ACE_OS::strlen (::prefix_) +
+ 3 /* "loc" */ +
+ 1 /* colon separator */ +
+ 2 /* double-slash separator */ +
+ 1 /* major version */ +
+ 1 /* decimal point */ +
+ 1 /* minor version */ +
+ 1 /* `@' character */ +
+ 15 /* dotted decimal IPv4 address */ +
+ 1 /* colon separator */ +
+ 5 /* port number */);
+
+ char * buf = CORBA::string_alloc (buflen);
+
+ static const char digits [] = "0123456789";
+
+ ACE_OS::sprintf (buf,
+ "%sloc://%c.%c@%s:%d%c%s",
+ ::prefix_,
+ digits [this->version_.major],
+ digits [this->version_.minor],
+ this->endpoint_.get_host_addr (),
+ this->endpoint_.port ());
+ return buf;
+}
+
+const char *
+TAO_UIPMC_Profile::prefix (void)
+{
+ return ::prefix_;
+}
+
+int
+TAO_UIPMC_Profile::encode (TAO_OutputCDR &stream) const
+{
+ // UNSIGNED LONG, protocol tag
+ stream.write_ulong (this->tag ());
+
+ // Create the encapsulation....
+ TAO_OutputCDR encap;
+
+
+ // Create the profile body
+ this->create_profile_body (encap);
+
+ // write the encapsulation as an octet sequence...
+
+ stream << CORBA::ULong (encap.total_length ());
+ stream.write_octet_array_mb (encap.begin ());
+
+ return 1;
+}
+
+
+IOP::TaggedProfile &
+TAO_UIPMC_Profile::create_tagged_profile (void)
+{
+ // Check whether we have already created the TaggedProfile
+ if (this->tagged_profile_.profile_data.length () == 0)
+ {
+ // As we have not created we will now create the TaggedProfile
+ this->tagged_profile_.tag = TAO_TAG_UIPMC_PROFILE;
+
+ // Create the encapsulation....
+ TAO_OutputCDR encap;
+
+ // Create the profile body
+ this->create_profile_body (encap);
+
+ CORBA::ULong length =
+ ACE_static_cast(CORBA::ULong,encap.total_length ());
+
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ // Place the message block in to the Sequence of Octets that we
+ // have
+ this->tagged_profile_.profile_data.replace (length,
+ encap.begin ());
+#else
+ this->tagged_profile_.profile_data.length (length);
+ CORBA::Octet *buffer =
+ this->tagged_profile_.profile_data.get_buffer ();
+ for (const ACE_Message_Block *i = encap.begin ();
+ i != encap.end ();
+ i = i->next ())
+ {
+ ACE_OS::memcpy (buffer, i->rd_ptr (), i->length ());
+ buffer += i->length ();
+ }
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+ }
+
+ return this->tagged_profile_;
+}
+
+void
+TAO_UIPMC_Profile::create_profile_body (TAO_OutputCDR &encap) const
+{
+ encap.write_octet (TAO_ENCAP_BYTE_ORDER);
+
+ // The GIOP version
+ // Note: Only GIOP 1.2 and above are supported currently for MIOP.
+ encap.write_octet (this->version_.major);
+ encap.write_octet (this->version_.minor);
+
+ // Address.
+ encap.write_string (this->endpoint_.get_host_addr ());
+
+ // Port number.
+ encap.write_ushort (this->endpoint_.port ());
+
+ // UIPMC is only supported by versions of GIOP that have tagged components,
+ // so unconditionally encode the components.
+ this->tagged_components ().encode (encap);
+}
+
+/*
+int
+TAO_UIPMC_Profile::decode_endpoints (void)
+{
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = TAO_TAG_ENDPOINTS;
+
+ if (this->tagged_components_.get_component (tagged_component))
+ {
+ const CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ TAO_InputCDR in_cdr (ACE_reinterpret_cast (const char*, buf),
+ tagged_component.component_data.length ());
+
+ // Extract the Byte Order.
+ CORBA::Boolean byte_order;
+ if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+ in_cdr.reset_byte_order (ACE_static_cast(int, byte_order));
+
+ // Extract endpoints sequence.
+ TAO_UIPMCEndpointSequence endpoints;
+
+ if ((in_cdr >> endpoints) == 0)
+ return -1;
+
+ // Get the priority of the first endpoint (head of the list.
+ // It's other data is extracted as part of the standard profile
+ // decoding.
+ this->endpoint_.priority (endpoints[0].priority);
+
+ // Use information extracted from the tagged component to
+ // populate the profile. Skip the first endpoint, since it is
+ // always extracted through standard profile body. Also, begin
+ // from the end of the sequence to preserve endpoint order,
+ // since <add_endpoint> method reverses the order of endpoints
+ // in the list.
+ for (CORBA::ULong i = endpoints.length () - 1;
+ i > 0;
+ --i)
+ {
+ TAO_UIPMC_Endpoint *endpoint = 0;
+ ACE_NEW_RETURN (endpoint,
+ TAO_UIPMC_Endpoint (endpoints[i].host,
+ endpoints[i].port,
+ endpoints[i].priority),
+ -1);
+
+ this->add_endpoint (endpoint);
+ }
+ }
+
+ return 0;
+}
+*/
+
+void
+TAO_UIPMC_Profile::set_group_info (const char *domain_id,
+ PortableGroup::ObjectGroupId group_id,
+ PortableGroup::ObjectGroupRefVersion ref_version)
+{
+ // First, record the group information.
+ this->group_domain_id_.set (domain_id);
+ this->group_id_ = group_id;
+ this->ref_version_ = ref_version;
+
+ // Update the cached version of the group component.
+ this->update_cached_group_component ();
+}
+
+void
+TAO_UIPMC_Profile::update_cached_group_component (void)
+{
+ PortableGroup::TagGroupTaggedComponent group;
+
+ // Encode the data structure.
+ group.component_version.major = TAO_DEF_MIOP_MAJOR;
+ group.component_version.minor = TAO_DEF_MIOP_MINOR;
+
+ group.group_domain_id = CORBA::string_dup (this->group_domain_id_.c_str ());
+ group.object_group_id = this->group_id_;
+ group.object_group_ref_version = this->ref_version_;
+
+ TAO_OutputCDR out_cdr;
+ if ((out_cdr << group) == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error marshaling group component!"));
+ return;
+ }
+
+ CORBA::ULong length = out_cdr.total_length ();
+
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = TAO_TAG_GROUP;
+ tagged_component.component_data.length (length);
+ CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ for (const ACE_Message_Block *iterator = out_cdr.begin ();
+ iterator != 0;
+ iterator = iterator->cont ())
+ {
+ CORBA::ULong i_length = iterator->length ();
+ ACE_OS::memcpy (buf, iterator->rd_ptr (), i_length);
+
+ buf += i_length;
+ }
+
+ // Add component with encoded endpoint data to this profile's
+ // TaggedComponents.
+ this->tagged_components_.set_component (tagged_component);
+}
+
+void
+TAO_UIPMC_Profile::request_target_specifier (
+ TAO_Target_Specification &target_spec,
+ TAO_Target_Specification::TAO_Target_Address required_type
+ TAO_ENV_ARG_DECL)
+{
+ // Fill out the target specifier based on the required type.
+ switch (required_type)
+ {
+ case TAO_Target_Specification::Profile_Addr:
+
+ // Only using a profile as the target specifier is supported
+ // at this time. Object keys are strictly not supported since
+ // UIPMC profiles do not have object keys.
+ target_spec.target_specifier (
+ this->create_tagged_profile ());
+ break;
+
+ case TAO_Target_Specification::Key_Addr:
+ case TAO_Target_Specification::Reference_Addr:
+ default:
+ // Unsupported or unknown required type. Throw an exception.
+ ACE_THROW (CORBA::MARSHAL ());
+ }
+}
+
+int
+TAO_UIPMC_Profile::supports_multicast (void) const
+{
+ // Yes! We support multicast!
+ return 1;
+}
+
+void
+TAO_UIPMC_Profile::addressing_mode (CORBA::Short addr
+ TAO_ENV_ARG_DECL)
+{
+ // ** See race condition note about addressing mode in Profile.h **
+ switch (addr)
+ {
+ case TAO_Target_Specification::Profile_Addr:
+ case TAO_Target_Specification::Reference_Addr:
+ this->addressing_mode_ = addr;
+ break;
+
+ case TAO_Target_Specification::Key_Addr:
+ // There is no object key, so it is not supported.
+
+ default:
+ ACE_THROW (CORBA::BAD_PARAM (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+}
+
+int
+TAO_UIPMC_Profile::extract_group_component (const IOP::TaggedProfile &profile,
+ PortableGroup::TagGroupTaggedComponent &group)
+{
+ // Create the decoding stream from the encapsulation in the buffer,
+//#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+// TAO_InputCDR cdr (profile.profile_data.mb ());
+//#else
+ TAO_InputCDR cdr (ACE_reinterpret_cast(char*,profile.profile_data.get_buffer ()),
+ profile.profile_data.length ());
+//#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+ CORBA::ULong encap_len = cdr.length ();
+
+ // Extract the Byte Order.
+ CORBA::Boolean byte_order;
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+ cdr.reset_byte_order (ACE_static_cast(int, byte_order));
+
+ // Read and verify major, minor versions, ignoring UIPMC profiles
+ // whose versions we don't understand.
+ CORBA::Octet major, minor;
+
+ // Read the version. We just read it here. We don't*do any*
+ // processing.
+ if (!(cdr.read_octet (major)
+ && cdr.read_octet (minor)))
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC_Profile::extract_group_component - v%d.%d\n"),
+ major,
+ minor));
+ }
+ return -1;
+ }
+
+ // Decode the endpoint.
+ ACE_CString address;
+ CORBA::UShort port;
+
+ if (!(cdr.read_string (address)
+ && cdr.read_ushort (port)))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC_Profile::extract_group_component - Couldn't unmarshal address and port!\n")));
+ return -1;
+ }
+
+ TAO_Tagged_Components tagged_components;
+ if (tagged_components.decode (cdr) == 0)
+ return -1;
+
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = TAO_TAG_GROUP;
+
+ // Try to find it.
+ if (tagged_components.get_component (tagged_component) == 0)
+ return -1;
+
+ // Found it.
+ const CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ TAO_InputCDR in_cdr (ACE_reinterpret_cast (const char*, buf),
+ tagged_component.component_data.length ());
+
+ // Extract the Byte Order.
+ if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+ in_cdr.reset_byte_order (ACE_static_cast(int, byte_order));
+
+ if ((in_cdr >> group) == 0)
+ return -1;
+
+ return 0;
+}
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.h
new file mode 100644
index 00000000000..fbf99590252
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.h
@@ -0,0 +1,225 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Profile.h
+ *
+ * $Id$
+ *
+ * UIPMC profile specific processing
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_PROFILE_H
+#define TAO_UIPMC_PROFILE_H
+#include "ace/pre.h"
+
+#include "tao/Profile.h"
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Object_KeyC.h"
+#include "tao/target_specification.h"
+
+#include "orbsvcs/PortableGroupC.h"
+#include "UIPMC_Endpoint.h"
+#include "portablegroup_export.h"
+
+#include "ace/Synch.h"
+
+
+// TAO UIPMC_Profile concrete Profile definitions
+/**
+ * @class TAO_UIPMC_Profile
+ *
+ * @brief This class defines the protocol specific attributes required
+ * for locating ORBs over a TCP/IP network.
+ *
+ * This class defines the UIPMC profile as specified in the CORBA
+ * specification.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Profile : public TAO_Profile
+{
+public:
+ /// The object key delimiter that UIPMC uses or expects.
+ static const char object_key_delimiter_;
+ virtual char object_key_delimiter (void) const;
+
+ /// Return the char string prefix.
+ static const char *prefix (void);
+
+ /// Profile constructor, default. Used when the profile contents
+ /// are not yet known or when it is being decoded from an IOR.
+ TAO_UIPMC_Profile (TAO_ORB_Core *orb_core);
+
+ /// Profile constructor, same as above except the object_key has
+ /// already been marshaled.
+ TAO_UIPMC_Profile (const ACE_INET_Addr &addr,
+ TAO_ORB_Core *orb_core);
+
+ /// Profile constructor.
+ TAO_UIPMC_Profile (const CORBA::Octet class_d_address[4],
+ CORBA::UShort port,
+ TAO_ORB_Core *orb_core);
+
+ /// Create object using a string ior.
+ TAO_UIPMC_Profile (const char *string,
+ TAO_ORB_Core *orb_core
+ TAO_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Destructor is to be called only through <_decr_refcnt>.
+ ~TAO_UIPMC_Profile (void);
+
+ /// Initialize this object using the given input string.
+ /// Url-style string contain only one endpoint.
+ virtual void parse_string (const char *string
+ TAO_ENV_ARG_DECL);
+
+ /**
+ * Return a string representation for this profile.
+ * client must deallocate memory.
+ * This is used to create url-style reference. Only one
+ * endpoint is included into the string.
+ */
+ virtual char * to_string (TAO_ENV_SINGLE_ARG_DECL);
+
+ /// Initialize this object using the given CDR octet string.
+ virtual int decode (TAO_InputCDR& cdr);
+
+ /// Encode this profile in a stream, i.e. marshal it.
+ virtual int encode (TAO_OutputCDR &stream) const;
+
+ /**
+ * Encodes this profile's endpoints into a tagged component.
+ * This is done only if RTCORBA is enabled, since currently this is
+ * the only case when we have more than one endpoint per profile.
+ * Returns 0 on success and -1 on failure.
+ *
+ * Endpoints are transmitted using TAO-proprietory tagged component.
+ * Component tag is TAO_TAG_ENDPOINTS and component data is an
+ * encapsulation of a sequence of structs, each representing a
+ * single endpoint. Data format is specified in iiop_endpoins.pidl.
+ *
+ * Multiple TAG_ALTERNATE_UIPMC_ADDRESS components can be used
+ * instead of a single proprietory component to transmit multiple
+ * endpoints. This is somewhat slower and less convenient. Also,
+ * TAG_ALTERNATE_UIPMC_ADDRESS does not provide for transmission of
+ * endpoint priorities.
+ *
+ */
+ virtual int encode_endpoints (void);
+
+ /// @@ deprecated. return a reference to the Object Key.
+ virtual const TAO_ObjectKey &object_key (void) const;
+
+ /// Return a pointer to the Object Key. The caller owns the memory
+ /// allocated for the returned key.
+ virtual TAO_ObjectKey *_key (void) const;
+
+ /// Return pointer to the head of this profile's endpoints list.
+ virtual TAO_Endpoint *endpoint (void);
+
+ /// Return how many endpoints this profile contains.
+ virtual size_t endpoint_count (void);
+
+ /**
+ * Return true if this profile is equivalent to other_profile. Two
+ * profiles are equivalent iff their tag, object_key, version and
+ * all endpoints are the same.
+ */
+ virtual CORBA::Boolean is_equivalent (const TAO_Profile *other_profile);
+
+ /// Return a hash value for this object.
+ virtual CORBA::ULong hash (CORBA::ULong max
+ TAO_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Please refer to Profile.h for the documentation of this
+ /// function.
+ virtual IOP::TaggedProfile &create_tagged_profile (void);
+
+
+ /// Set the request target specifier to point to a tagged profile
+ /// containing the GroupId associated with this profile.
+ virtual void request_target_specifier (
+ TAO_Target_Specification &target_spec,
+ TAO_Target_Specification::TAO_Target_Address required_type
+ TAO_ENV_ARG_DECL);
+
+ /// Returns true since this profile can specify multicast endpoints.
+ virtual int supports_multicast (void) const;
+
+ static int extract_group_component (const IOP::TaggedProfile &profile,
+ PortableGroup::TagGroupTaggedComponent &group);
+
+ /// Add the mandatory group component to this profile.
+ void set_group_info (const char *domain_id,
+ PortableGroup::ObjectGroupId group_id,
+ PortableGroup::ObjectGroupRefVersion ref_version);
+
+ /// Set and validate the addressing mode if the remote ORB returns an
+ /// exception.
+ virtual void addressing_mode (CORBA::Short addr_mode
+ TAO_ENV_ARG_DECL);
+
+private:
+
+ /// Creates an encapsulation of the ProfileBody struct in the <cdr>
+ void create_profile_body (TAO_OutputCDR &cdr) const;
+
+ /// Update the group component in the cached list of tagged
+ /// components. This needs to be called whenever the group_domain_id,
+ /// group_id, or ref_version changes.
+ void update_cached_group_component (void);
+
+protected:
+
+ /**
+ * Head of this profile's list of endpoints. This endpoint is not
+ * dynamically allocated because a profile always contains at least
+ * one endpoint.
+ *
+ * Currently, a profile contains more than one endpoint, i.e.,
+ * list contains more than just the head, only when RTCORBA is enabled.
+ * However, in the near future, this will be used in nonRT
+ * mode as well, e.g., to support TAG_ALTERNATE_IIOP_ADDRESS
+ * feature.
+ * Addressing info of the default endpoint, i.e., head of the list,
+ * is transmitted using standard UIPMC ProfileBody components. See
+ * <encode_endpoints> method documentation above for how the rest of
+ * the endpoint list is transmitted.
+ */
+ TAO_UIPMC_Endpoint endpoint_;
+
+ /// Number of endpoints in the list headed by <endpoint_>.
+ size_t count_;
+
+private:
+
+ /// object_key associated with this profile. This is wasted data for
+ /// UIPMC since there is no object key here, but is needed to satisfy
+ /// some of the API calls.
+ TAO_ObjectKey object_key_;
+
+ /// Cached version of our tagged profile.
+ IOP::TaggedProfile tagged_profile_;
+
+ /// Group Domain ID.
+ ACE_CString group_domain_id_;
+
+ /// Our group ID within the group domain.
+ PortableGroup::ObjectGroupId group_id_;
+
+ /// The group reference's version.
+ PortableGroup::ObjectGroupRefVersion ref_version_;
+
+};
+
+#if defined (__ACE_INLINE__)
+# include "tao/UIPMC_Profile.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* TAO_UIPMC_PROFILE_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.i b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.i
new file mode 100644
index 00000000000..ee4090d1509
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.i
@@ -0,0 +1,19 @@
+// -*- C++ -*-
+// $Id$
+
+ACE_INLINE const TAO_ObjectKey &
+TAO_UIPMC_Profile::object_key (void) const
+{
+ return this->object_key_;
+}
+
+ACE_INLINE TAO_ObjectKey *
+TAO_UIPMC_Profile::_key (void) const
+{
+ // No object key for a UIPMC profile.
+ return 0;
+}
+
+
+
+
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp
new file mode 100644
index 00000000000..00b78709022
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp
@@ -0,0 +1,539 @@
+// This may look like C, but it's really -*- C++ -*-
+// $Id$
+
+#include "UIPMC_Transport.h"
+
+#include "UIPMC_Connection_Handler.h"
+#include "UIPMC_Acceptor.h"
+#include "UIPMC_Profile.h"
+#include "tao/Acceptor_Registry.h"
+#include "tao/operation_details.h"
+#include "tao/Timeprobe.h"
+#include "tao/CDR.h"
+#include "tao/Transport_Mux_Strategy.h"
+#include "tao/Wait_Strategy.h"
+#include "tao/Sync_Strategies.h"
+#include "tao/Stub.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "tao/Resume_Handle.h"
+#include "tao/GIOP_Message_Base.h"
+#include "tao/GIOP_Message_Lite.h"
+
+#if !defined (__ACE_INLINE__)
+# include "UIPMC_Transport.i"
+#endif /* ! __ACE_INLINE__ */
+
+ACE_RCSID (tao, UIPMC_Transport, "$Id$")
+
+TAO_UIPMC_Transport::TAO_UIPMC_Transport (TAO_UIPMC_Connection_Handler *handler,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean /*flag*/)
+ : TAO_Transport (TAO_TAG_UIPMC_PROFILE,
+ orb_core)
+ , connection_handler_ (handler)
+ , messaging_object_ (0)
+{
+ // Use the normal GIOP object
+ ACE_NEW (this->messaging_object_,
+ TAO_GIOP_Message_Base (orb_core,
+ ACE_MAX_DGRAM_SIZE));
+}
+
+TAO_UIPMC_Transport::~TAO_UIPMC_Transport (void)
+{
+ delete this->messaging_object_;
+ this->messaging_object_ = 0;
+}
+
+ACE_Event_Handler *
+TAO_UIPMC_Transport::event_handler_i (void)
+{
+ return this->connection_handler_;
+}
+
+TAO_Pluggable_Messaging *
+TAO_UIPMC_Transport::messaging_object (void)
+{
+ return this->messaging_object_;
+}
+
+struct MIOP_Packet
+{
+ iovec iov[IOV_MAX];
+ int iovcnt;
+ int length;
+};
+
+class ACE_Message_Block_Data_Iterator
+{
+public:
+ /// Constructor
+ ACE_Message_Block_Data_Iterator (iovec *iov, int iovcnt);
+
+ /// Get the next data block that has a size less than or equal
+ /// to max_length. Return the length of the block returned.
+ size_t next_block (size_t max_length,
+ const char *&block,
+ size_t &block_len);
+
+private:
+ enum State
+ {
+ INTER_BLOCK,
+ INTRA_BLOCK
+ };
+
+ iovec *iov_;
+ int iovcnt_;
+
+ // Point internal to a message block, if we have to split one up.
+ const char *iov_ptr_;
+ int iov_index_;
+
+ // Length used in a split message block.
+ size_t iov_len_left_;
+
+ // Current message iterator state.
+ State state_;
+
+};
+
+ACE_Message_Block_Data_Iterator::ACE_Message_Block_Data_Iterator (iovec *iov, int iovcnt) :
+ iov_ (iov),
+ iovcnt_ (iovcnt),
+ iov_ptr_ (0),
+ iov_len_left_ (0),
+ iov_index_ (0),
+ state_ (INTER_BLOCK)
+{
+}
+
+size_t
+ACE_Message_Block_Data_Iterator::next_block (size_t max_length,
+ const char *&block,
+ size_t &block_len)
+{
+ if (this->state_ == INTER_BLOCK)
+ {
+ // Check that there are some iovec buffers left.
+ if (this->iov_index_ >= this->iovcnt_)
+ return 0;
+
+
+ size_t current_iov_len =
+ this->iov_[this->iov_index_].iov_len;
+
+ if (current_iov_len <= max_length)
+ {
+ // Return the full data portion.
+ block_len = current_iov_len;
+ block = this->iov_[this->iov_index_].iov_base;
+
+ // Go to the next block.
+ this->iov_index_++;
+
+ return current_iov_len;
+ }
+ else
+ {
+ // Let the caller use the first part of this
+ // message block.
+ block_len = max_length;
+ block = this->iov_[this->iov_index_].iov_base;
+
+ // Break up the block.
+ this->iov_len_left_ = current_iov_len - max_length;
+ this->iov_ptr_ = block + max_length;
+ this->state_ = INTRA_BLOCK;
+
+ return max_length;
+ }
+ }
+ else
+ {
+ // Currently scanning a split block.
+ if (this->iov_len_left_ <= max_length)
+ {
+ // Return everything that's left in the block.
+ block_len = this->iov_len_left_;
+ block = this->iov_ptr_;
+
+ // Go to the next block.
+ this->iov_index_++;
+
+ // Update the state.
+ this->state_ = INTER_BLOCK;
+
+ return this->iov_len_left_;
+ }
+ else
+ {
+ // Split a little more off the block.
+ block_len = this->iov_len_left_;
+ block = this->iov_ptr_;
+
+ this->iov_len_left_ -= max_length;
+ this->iov_ptr_ += max_length;
+ return max_length;
+ }
+ }
+}
+
+// Limit the number of fragments that we can divide a message
+// into.
+#define MIOP_MAX_FRAGMENTS (4)
+#define MIOP_MAX_HEADER_SIZE (272) // See MIOP Spec. Must be a multiple of 8.
+#define MIOP_HEADER_SIZE (24) // We only use 24 byte headers.
+#define MIOP_MAX_DGRAM_SIZE (ACE_MAX_DGRAM_SIZE)
+
+static const CORBA::Octet miop_magic[4] = { 0x4d, 0x49, 0x4f, 0x50 }; // 'M', 'I', 'O', 'P'
+
+ssize_t
+TAO_UIPMC_Transport::send_i (iovec *iov, int iovcnt,
+ size_t &bytes_transferred,
+ const ACE_Time_Value *)
+{
+ const ACE_INET_Addr &addr = this->connection_handler_->addr ();
+ size_t temp = 0;
+ bytes_transferred = 0;
+
+ MIOP_Packet fragments[MIOP_MAX_FRAGMENTS];
+ MIOP_Packet *current_fragment;
+ int num_fragments = 1;
+
+ ACE_Message_Block_Data_Iterator mb_iter (iov, iovcnt);
+
+ // Initialize the first fragment
+ current_fragment = &fragments[0];
+ current_fragment->iovcnt = 1; // The MIOP Header
+ current_fragment->length = MIOP_HEADER_SIZE;
+
+ // Go through all of the message blocks.
+ while (mb_iter.next_block (MIOP_MAX_DGRAM_SIZE - current_fragment->length,
+ current_fragment->iov[current_fragment->iovcnt].iov_base,
+ current_fragment->iov[current_fragment->iovcnt].iov_len))
+ {
+ // Increment the length and iovcnt.
+ current_fragment->length += current_fragment->iov[current_fragment->iovcnt].iov_len;
+ current_fragment->iovcnt++;
+
+ // Check if we've filled up this fragment or if we've run out of
+ // iov entries.
+ if (current_fragment->length == MIOP_MAX_DGRAM_SIZE ||
+ current_fragment->iovcnt == IOV_MAX)
+ {
+ // Make a new fragment.
+ num_fragments++;
+
+ // Check if too many fragments
+ if (num_fragments > MIOP_MAX_FRAGMENTS)
+ {
+ // This is an error as we do not send more.
+ // Silently drop the message but log an error.
+
+ // Pluggable_Messaging::transport_message only
+ // cares if it gets -1 or 0 so we can return a
+ // partial length and it will think all has gone
+ // well.
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Transport::send_i ")
+ ACE_TEXT ("Message needs too many fragments (max is %d)\n"),
+ MIOP_MAX_FRAGMENTS));
+ }
+
+ return 1; // Pretend it is o.k.
+ }
+
+ // Otherwise, initialize another fragment.
+ current_fragment++;
+ current_fragment->iovcnt = 1; // The MIOP Header
+ current_fragment->length = MIOP_HEADER_SIZE;
+ }
+ }
+
+ // Build a generic MIOP Header.
+
+ // Allocate space on the stack for the header (add 8 to account for
+ // the possibility of adjusting for alignment).
+ char header_buffer[MIOP_HEADER_SIZE + 8];
+ TAO_OutputCDR miop_hdr (header_buffer, MIOP_HEADER_SIZE + 8);
+
+ miop_hdr.write_octet_array (miop_magic, 4); // Magic
+ miop_hdr.write_octet (0x10); // Version
+ CORBA::Octet *flags_field = ACE_reinterpret_cast (CORBA::Octet *,
+ miop_hdr.current ()->wr_ptr ());
+ miop_hdr.write_octet (TAO_ENCAP_BYTE_ORDER); // Flags
+
+ // Packet Length (optional). Set to 0, since we don't
+ // need it, and it seems like it could only create confusion.
+ miop_hdr.write_short (0);
+
+ // Packet number
+ CORBA::ULong *packet_number = ACE_reinterpret_cast (CORBA::ULong *,
+ miop_hdr.current ()->wr_ptr ());
+ miop_hdr.write_ulong (0);
+
+ // Number of packets field
+ miop_hdr.write_ulong (num_fragments);
+
+ // UniqueId - fix this
+ CORBA::Octet unique_id[4] = { 1, 2, 3, 4};
+ miop_hdr.write_ulong (4);
+ miop_hdr.write_octet_array (unique_id, 4);
+
+ // Send the buffers.
+ current_fragment = &fragments[0];
+ while (num_fragments > 0 &&
+ current_fragment->iovcnt > 1)
+ {
+ ssize_t rc;
+
+ // If this is the last fragment, set the stop message flag.
+ if (num_fragments == 1)
+ *flags_field |= 0x02;
+
+ // Setup the MIOP header in the iov list.
+ current_fragment->iov[0].iov_base = miop_hdr.current ()->rd_ptr ();
+ current_fragment->iov[0].iov_len = MIOP_HEADER_SIZE;
+
+ // Send the fragment. - Need to check for errors!!
+ rc = this->connection_handler_->dgram ().send (current_fragment->iov,
+ current_fragment->iovcnt,
+ addr);
+
+ if (rc <= 0)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Transport::send")
+ ACE_TEXT (" %p\n\n"),
+ ACE_TEXT ("Error returned from transport:")));
+ }
+ return 1; // Fake a good return.
+ }
+
+ // Increment the number of bytes transferred, but don't
+ // count the MIOP header that we added.
+ bytes_transferred += rc - MIOP_HEADER_SIZE;
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_UIPMC_Transport::send_i: sent %d bytes to %s:%d\n",
+ rc,
+ addr.get_host_addr (),
+ addr.get_port_number ()));
+ }
+
+ // Go to the next fragment.
+ *packet_number++;
+ ++current_fragment;
+ --num_fragments;
+ }
+
+ // Return total bytes transferred.
+ return bytes_transferred;
+}
+
+
+ssize_t
+TAO_UIPMC_Transport::recv_i (char *buf,
+ size_t len,
+ const ACE_Time_Value * /*max_wait_time*/)
+{
+ ACE_INET_Addr from_addr;
+
+ ssize_t n = this->connection_handler_->mcast_dgram ().recv (buf,
+ len,
+ from_addr);
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_UIPMC_Transport::recv_i: received %d bytes from %s:%d\n",
+ n,
+ from_addr.get_host_addr (),
+ from_addr.get_port_number ()));
+ }
+
+ // Make sure that we at least have a MIOP header.
+ if (n < MIOP_HEADER_SIZE)
+ return 0;
+
+ // Check for MIOP magic bytes.
+ if (buf[0] != miop_magic [0] ||
+ buf[1] != miop_magic [1] ||
+ buf[2] != miop_magic [2] ||
+ buf[3] != miop_magic [3])
+ return 0;
+
+ // Trim off the header for now.
+ n -= MIOP_HEADER_SIZE;
+ ACE_OS::memmove (buf, buf + MIOP_HEADER_SIZE, n);
+
+ return n;
+}
+
+int
+TAO_UIPMC_Transport::handle_input_i (TAO_Resume_Handle &rh,
+ ACE_Time_Value *max_wait_time,
+ int /*block*/)
+{
+ // If there are no messages then we can go ahead to read from the
+ // handle for further reading..
+
+ // The buffer on the stack which will be used to hold the input
+ // messages
+ char buf [ACE_MAX_DGRAM_SIZE];
+
+#if defined (ACE_HAS_PURIFY)
+ (void) ACE_OS::memset (buf,
+ '\0',
+ sizeof buf);
+#endif /* ACE_HAS_PURIFY */
+
+ // Create a data block
+ ACE_Data_Block db (sizeof (buf),
+ ACE_Message_Block::MB_DATA,
+ buf,
+ this->orb_core_->message_block_buffer_allocator (),
+ this->orb_core_->locking_strategy (),
+ ACE_Message_Block::DONT_DELETE,
+ this->orb_core_->message_block_dblock_allocator ());
+
+ // Create a message block
+ ACE_Message_Block message_block (&db,
+ ACE_Message_Block::DONT_DELETE,
+ this->orb_core_->message_block_msgblock_allocator ());
+
+
+ // Align the message block
+ ACE_CDR::mb_align (&message_block);
+
+
+ // Read the message into the message block that we have created on
+ // the stack.
+ ssize_t n = this->recv (message_block.rd_ptr (),
+ message_block.space (),
+ max_wait_time);
+
+ // If there is an error return to the reactor..
+ if (n <= 0)
+ {
+ if (n == -1)
+ this->tms_->connection_closed ();
+
+ return n;
+ }
+
+ // Set the write pointer in the stack buffer
+ message_block.wr_ptr (n);
+
+ // Parse the incoming message for validity. The check needs to be
+ // performed by the messaging objects.
+ if (this->parse_incoming_messages (message_block) == -1)
+ return -1;
+
+ // NOTE: We are not performing any queueing nor any checking for
+ // missing data. We are assuming that ALL the data would be got in a
+ // single read.
+
+ // Make a node of the message block..
+ TAO_Queued_Data qd (&message_block);
+
+ // Extract the data for the node..
+ this->messaging_object ()->get_message_data (&qd);
+
+ // Process the message
+ return this->process_parsed_messages (&qd, rh);
+}
+
+int
+TAO_UIPMC_Transport::register_handler_i (void)
+{
+ // We never register register the handler with the reactor
+ // as we never need to be informed about any incoming data,
+ // assuming we only use one-ways.
+ // If we would register and ICMP Messages would arrive, e.g
+ // due to a not reachable server, we would get informed - as this
+ // disturbs the general MIOP assumptions of not being
+ // interested in any network failures, we ignore ICMP messages.
+ return 0;
+}
+
+int
+TAO_UIPMC_Transport::send_request (TAO_Stub *stub,
+ TAO_ORB_Core *orb_core,
+ TAO_OutputCDR &stream,
+ int is_synchronous,
+ ACE_Time_Value *max_wait_time)
+{
+ if (this->ws_->sending_request (orb_core,
+ is_synchronous) == -1)
+ return -1;
+
+ if (this->send_message (stream,
+ stub,
+ is_synchronous,
+ max_wait_time) == -1)
+
+ return -1;
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Transport::send_message (TAO_OutputCDR &stream,
+ TAO_Stub *stub,
+ int is_synchronous,
+ ACE_Time_Value *max_wait_time)
+{
+ // Format the message in the stream first
+ if (this->messaging_object_->format_message (stream) != 0)
+ return -1;
+
+ // Strictly speaking, should not need to loop here because the
+ // socket never gets set to a nonblocking mode ... some Linux
+ // versions seem to need it though. Leaving it costs little.
+
+ // This guarantees to send all data (bytes) or return an error.
+ ssize_t n = this->send_message_i (stub,
+ is_synchronous,
+ stream.begin (),
+ max_wait_time);
+
+ if (n == -1)
+ {
+ if (TAO_debug_level)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO: (%P|%t|%N|%l) closing transport %d after fault %p\n"),
+ this->id (),
+ ACE_TEXT ("send_message ()\n")));
+
+ return -1;
+ }
+
+ return 1;
+}
+
+
+
+int
+TAO_UIPMC_Transport::messaging_init (CORBA::Octet major,
+ CORBA::Octet minor)
+{
+ this->messaging_object_->init (major,
+ minor);
+ return 1;
+}
+
+void
+TAO_UIPMC_Transport::transition_handler_state_i (void)
+{
+ this->connection_handler_ = 0;
+}
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h
new file mode 100644
index 00000000000..97140c36caa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h
@@ -0,0 +1,137 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Transport.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_TRANSPORT_H
+#define TAO_UIPMC_TRANSPORT_H
+#include "ace/pre.h"
+
+#include "tao/Transport.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+#include "ace/SOCK_Stream.h"
+#include "ace/Synch.h"
+#include "ace/Svc_Handler.h"
+#include "portablegroup_export.h"
+
+// Forward decls.
+class TAO_UIPMC_Connection_Handler;
+class TAO_ORB_Core;
+class TAO_Operation_Details;
+class TAO_Pluggable_Messaging;
+class TAO_Acceptor;
+
+// Service Handler for this transport
+typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>
+ TAO_UIPMC_SVC_HANDLER;
+
+/**
+ * @class TAO_UIPMC_Transport
+ *
+ * @brief Specialization of the base TAO_Transport class to handle the
+ * MIOP protocol.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Transport : public TAO_Transport
+{
+public:
+
+ /// Constructor.
+ TAO_UIPMC_Transport (TAO_UIPMC_Connection_Handler *handler,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag);
+
+ /// Default destructor.
+ ~TAO_UIPMC_Transport (void);
+
+ /// Look for the documentation in Transport.h.
+ virtual int handle_input_i (TAO_Resume_Handle &rh,
+ ACE_Time_Value *max_wait_time = 0,
+ int block = 0);
+protected:
+ /** @name Overridden Template Methods
+ *
+ * These are implementations of template methods declared by TAO_Transport.
+ */
+ //@{
+
+ virtual ACE_Event_Handler *event_handler_i (void);
+
+ virtual TAO_Pluggable_Messaging *messaging_object (void);
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual ssize_t send_i (iovec *iov, int iovcnt,
+ size_t &bytes_transferred,
+ const ACE_Time_Value *max_wait_time);
+
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv_i (char *buf,
+ size_t len,
+ const ACE_Time_Value *s = 0);
+
+ virtual int register_handler_i (void);
+
+ /// Method to do whatever it needs to do when the connection
+ /// handler is being closed and destroyed.
+ virtual void transition_handler_state_i (void);
+
+public:
+ /// @@TODO: These methods IMHO should have more meaningful
+ /// names. The names seem to indicate nothing.
+ virtual int send_request (TAO_Stub *stub,
+ TAO_ORB_Core *orb_core,
+ TAO_OutputCDR &stream,
+ int twoway,
+ ACE_Time_Value *max_wait_time);
+
+ virtual int send_message (TAO_OutputCDR &stream,
+ TAO_Stub *stub = 0,
+ int twoway = 1,
+ ACE_Time_Value *max_time_wait = 0);
+
+ /// Initialising the messaging object
+ virtual int messaging_init (CORBA::Octet major,
+ CORBA::Octet minor);
+
+ //@}
+
+private:
+ /// Process the message that we have read
+ int process_message (void);
+
+ // @@ Frank : Not needed
+ /*
+ /// Add the listen points in <acceptor> to the <listen_point_list>
+ /// if this connection is in the same interface as that of the
+ /// endpoints in the <acceptor>
+ int get_listen_point (DIOP::ListenPointList &listen_point_list,
+ TAO_Acceptor *acceptor);
+ */
+private:
+
+ /// The connection service handler used for accessing lower layer
+ /// communication protocols.
+ TAO_UIPMC_Connection_Handler *connection_handler_;
+
+ /// Our messaging object.
+ TAO_Pluggable_Messaging *messaging_object_;
+};
+
+#if defined (__ACE_INLINE__)
+#include "UIPMC_Transport.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* TAO_UIPMC_TRANSPORT_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.i b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.i
new file mode 100644
index 00000000000..81bf354f364
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.i
@@ -0,0 +1,2 @@
+// -*- C++ -*-
+//$Id$
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/portablegroup_export.h b/TAO/orbsvcs/orbsvcs/PortableGroup/portablegroup_export.h
new file mode 100644
index 00000000000..15494956536
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/portablegroup_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_PORTABLEGROUP_EXPORT_H
+#define TAO_PORTABLEGROUP_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_PORTABLEGROUP_HAS_DLL)
+# define TAO_PORTABLEGROUP_HAS_DLL 0
+# endif /* ! TAO_PORTABLEGROUP_HAS_DLL */
+#else
+# if !defined (TAO_PORTABLEGROUP_HAS_DLL)
+# define TAO_PORTABLEGROUP_HAS_DLL 1
+# endif /* ! TAO_PORTABLEGROUP_HAS_DLL */
+#endif
+
+#if defined (TAO_PORTABLEGROUP_HAS_DLL) && (TAO_PORTABLEGROUP_HAS_DLL == 1)
+# if defined (TAO_PORTABLEGROUP_BUILD_DLL)
+# define TAO_PortableGroup_Export ACE_Proper_Export_Flag
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_PORTABLEGROUP_BUILD_DLL */
+# define TAO_PortableGroup_Export ACE_Proper_Import_Flag
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_PORTABLEGROUP_BUILD_DLL */
+#else /* TAO_PORTABLEGROUP_HAS_DLL == 1 */
+# define TAO_PortableGroup_Export
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARATION(T)
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_PORTABLEGROUP_HAS_DLL == 1 */
+
+#endif /* TAO_PORTABLEGROUP_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/mgm.idl b/TAO/orbsvcs/orbsvcs/mgm.idl
new file mode 100644
index 00000000000..3f727965e46
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/mgm.idl
@@ -0,0 +1,74 @@
+//
+// $Id$
+//
+// ================================================================
+//
+// = LIBRARY
+// TAO_PortableGroup
+//
+// = FILENAME
+// mgm.pidl
+//
+// = DESCRIPTION
+//
+// This file was used to generate the code in mgmC.{h,i,cpp}
+//
+// The command used to generate code from this file is:
+//
+// tao_idl.exe \
+// -Ge 1 \
+// -Wb,export_macro=TAO_PortableGroup_Export \
+// -Wb,export_include="tao/corbafwd.h" \
+// -Wb,pre_include="ace/pre.h" \
+// -Wb,post_include="ace/post.h" \
+// -I../../orbsvcs/orbsvcs \
+// mgm.pidl
+//
+// After the file is generated a patch from the diffs directory must
+// be applied. The patch:
+//
+// - Disables parts of the code under certain configurations.
+//
+// - Eliminates cycles in the include dependencies.
+//
+// - Adds non-idl components of PortableGroup to the namespace.
+// This includes (a) Servant (b) ServantBase (c) RefCountServantBase
+// (d) Cookie (e) ObjectId_to_string (f) string_to_ObjectId (g)
+// ObjectId_to_wstring (h) wstring_to_ObjectId (i) ServantBase_var
+// (j) DynamicImplementation (k) LocalServantBase
+//
+// Apply patches using the following commands:
+//
+// patch < diffs\mgmC.h.diff
+// patch < diffs\mgmC.i.diff
+// patch < diffs\mgmC.cpp.diff
+//
+// Note: The diffs were generated with these commands:
+//
+// diff -wub mgmC.h mgmC.h.mod > diffs\mgmC.h.diff
+// diff -wub mgmC.i mgmC.i.mod > diffs\mgmC.i.diff
+// diff -wub mgmC.cpp mgmC.cpp.mod > diffs\mgmC.cpp.diff
+//
+// ================================================================
+
+
+#ifdef _MGM_idl
+#define _MGM_idl
+
+#include "PortableGroup.idl"
+
+module MGM {
+ // Property values
+ typedef long GroupCreationMode
+
+ const GroupCreationMode CREATE_ADDRESS_DEFERED = 0;
+ const GroupCreationMode CREATE_ADDRESS_GENERATED = 1;
+ const GroupCreationMode CREATE_ADDRESS_SUPPLIED = 2;
+
+ interface ObjectGroupFactory :
+ PortableGroup::GenericFactory,
+ PortableGroup::PropertyManager,
+ PortableGroup::ObjectGroupManager {}
+};
+
+#endif // _MGM_idl
diff --git a/TAO/orbsvcs/orbsvcs/miop.idl b/TAO/orbsvcs/orbsvcs/miop.idl
new file mode 100644
index 00000000000..8332a9f80c1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/miop.idl
@@ -0,0 +1,81 @@
+//
+// $Id$
+//
+// ================================================================
+//
+// = LIBRARY
+// TAO_PortableGroup
+//
+// = FILENAME
+// miop.pidl
+//
+// = DESCRIPTION
+//
+// This file was used to generate the code in miopC.{h,i,cpp}
+//
+// The command used to generate code from this file is:
+//
+// tao_idl.exe \
+// -o orig \
+// -Ge 1 \
+// -Wb,export_macro=TAO_PortableGroup_Export \
+// -Wb,export_include="tao/corbafwd.h" \
+// -Wb,pre_include="ace/pre.h" \
+// -Wb,post_include="ace/post.h" \
+// miop.pidl
+//
+// After the file is generated a patch from the diffs directory must
+// be applied. The patch:
+//
+//
+// Apply patches using the following commands:
+//
+// patch < diffs\miopC.h.diff
+// patch < diffs\miopC.i.diff
+// patch < diffs\miopC.cpp.diff
+//
+// Note: The diffs were generated with these commands:
+//
+// diff -wub orig/miopC.h miopC.h > diffs\miopC.h.diff
+// diff -wub orig/miopC.i miopC.i > diffs\miopC.i.diff
+// diff -wub orig/miopC.cpp miopC.cpp > diffs\miopC.cpp.diff
+//
+// ================================================================
+
+#ifndef MIOP_IDL
+#define MIOP_IDL
+
+#include <tao/IOP.pidl>
+#include <tao/GIOP.pidl>
+
+#pragma prefix "omg.org"
+
+module MIOP
+{
+ typedef sequence <octet, 252> UniqueId;
+
+ struct PacketHeader_1_0
+ {
+ char magic[4];
+ octet hdr_version;
+ octet flags;
+ unsigned short packet_length;
+ unsigned long packet_number;
+ unsigned long number_of_packets;
+ UniqueId Id;
+ };
+
+ typedef GIOP::Version Version;
+
+ typedef string Address;
+
+ struct UIPMC_ProfileBody
+ {
+ Version miop_version;
+ Address the_address;
+ short the_port;
+ sequence<IOP::TaggedComponent> components;
+ };
+};
+
+#endif
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/Makefile b/TAO/orbsvcs/tests/Miop/McastHello/Makefile
new file mode 100644
index 00000000000..3a4a7c294d3
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/Makefile
@@ -0,0 +1,1335 @@
+#----------------------------------------------------------------------------
+#
+# $Id$
+#
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# Local macros
+#----------------------------------------------------------------------------
+
+ifndef TAO_ROOT
+ TAO_ROOT = $(ACE_ROOT)/TAO
+endif # ! TAO_ROOT
+
+IDL_FILES = Test
+IDL_SRC = TestC.cpp TestS.cpp
+BIN = client server
+
+SRC = $(addsuffix .cpp, $(BIN) Hello) $(IDL_SRC)
+
+CLIENT_OBJS = client.o TestC.o
+SERVER_OBJS = server.o Hello.o $(IDL_SRC:.cpp=.o)
+
+TAO_IDLFLAGS += -Ge 1
+#----------------------------------------------------------------------------
+# Include macros and targets
+#----------------------------------------------------------------------------
+
+include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU
+include $(ACE_ROOT)/include/makeinclude/macros.GNU
+include $(TAO_ROOT)/rules.tao.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.common.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
+include $(TAO_ROOT)/taoconfig.mk
+
+#----------------------------------------------------------------------------
+# Local targets
+#----------------------------------------------------------------------------
+
+.PRECIOUS: $(foreach ext, $(IDL_EXT), Test$(ext))
+
+server: $(addprefix $(VDIR),$(SERVER_OBJS))
+ $(LINK.cc) $(LDFLAGS) -o $@ $^ $(TAO_SRVR_LIBS) $(POSTLINK)
+
+client: $(addprefix $(VDIR),$(CLIENT_OBJS))
+ $(LINK.cc) $(LDFLAGS) -o $@ $^ $(TAO_CLNT_LIBS) $(POSTLINK)
+
+realclean: clean
+ -$(RM) $(foreach ext, $(IDL_EXT), Test$(ext))
+
+# DO NOT DELETE THIS LINE -- g++dep uses it.
+# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
+
+
+.obj/client.o .obj/client.so .shobj/client.o .shobj/client.so: client.cpp TestC.h \
+ $(TAO_ROOT)/tao/corba.h \
+ $(ACE_ROOT)/ace/pre.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Errno.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Errno.inl \
+ $(TAO_ROOT)/tao/corbafwd.h \
+ $(ACE_ROOT)/ace/CDR_Base.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ $(ACE_ROOT)/ace/Flag_Manip.h \
+ $(ACE_ROOT)/ace/Flag_Manip.i \
+ $(ACE_ROOT)/ace/Handle_Ops.h \
+ $(ACE_ROOT)/ace/Handle_Ops.i \
+ $(ACE_ROOT)/ace/Lib_Find.h \
+ $(ACE_ROOT)/ace/Lib_Find.i \
+ $(ACE_ROOT)/ace/Init_ACE.h \
+ $(ACE_ROOT)/ace/Init_ACE.i \
+ $(ACE_ROOT)/ace/Sock_Connect.h \
+ $(ACE_ROOT)/ace/Sock_Connect.i \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Malloc_Allocator.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.i \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Unbounded_Set.h \
+ $(ACE_ROOT)/ace/Node.h \
+ $(ACE_ROOT)/ace/Node.cpp \
+ $(ACE_ROOT)/ace/Unbounded_Set.inl \
+ $(ACE_ROOT)/ace/Unbounded_Set.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/Message_Block_T.h \
+ $(ACE_ROOT)/ace/Message_Block_T.i \
+ $(ACE_ROOT)/ace/Message_Block_T.cpp \
+ $(ACE_ROOT)/ace/CDR_Base.inl \
+ $(TAO_ROOT)/tao/try_macros.h \
+ $(TAO_ROOT)/tao/orbconf.h \
+ $(ACE_ROOT)/ace/CORBA_macros.h \
+ $(TAO_ROOT)/tao/varbase.h \
+ $(TAO_ROOT)/tao/TAO_Export.h \
+ $(TAO_ROOT)/tao/corbafwd.i \
+ $(TAO_ROOT)/tao/Typecode.h \
+ $(TAO_ROOT)/tao/Exception.h \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/String_Base.h \
+ $(ACE_ROOT)/ace/String_Base_Const.h \
+ $(ACE_ROOT)/ace/String_Base.i \
+ $(ACE_ROOT)/ace/String_Base.cpp \
+ $(ACE_ROOT)/ace/Auto_Ptr.h \
+ $(ACE_ROOT)/ace/Auto_Ptr.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.cpp \
+ $(ACE_ROOT)/ace/SString.i \
+ $(TAO_ROOT)/tao/Exception.i \
+ $(TAO_ROOT)/tao/Typecode.i \
+ $(TAO_ROOT)/tao/Any.h \
+ $(TAO_ROOT)/tao/CDR.h \
+ $(ACE_ROOT)/ace/CDR_Stream.h \
+ $(ACE_ROOT)/ace/CDR_Stream.i \
+ $(TAO_ROOT)/tao/CDR.i \
+ $(TAO_ROOT)/tao/Environment.h \
+ $(TAO_ROOT)/tao/Environment.i \
+ $(TAO_ROOT)/tao/Object.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Broker.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Object.i \
+ $(TAO_ROOT)/tao/Any.i \
+ $(TAO_ROOT)/tao/NVList.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.inl \
+ $(ACE_ROOT)/ace/Unbounded_Queue.cpp \
+ $(TAO_ROOT)/tao/NVList.i \
+ $(TAO_ROOT)/tao/LocalObject.h \
+ $(TAO_ROOT)/tao/LocalObject.i \
+ $(TAO_ROOT)/tao/Principal.h \
+ $(TAO_ROOT)/tao/OctetSeqC.h \
+ $(TAO_ROOT)/tao/Sequence.h \
+ $(TAO_ROOT)/tao/Managed_Types.h \
+ $(TAO_ROOT)/tao/Managed_Types.i \
+ $(TAO_ROOT)/tao/Sequence.i \
+ $(TAO_ROOT)/tao/Sequence_T.h \
+ $(TAO_ROOT)/tao/Sequence_T.i \
+ $(TAO_ROOT)/tao/Sequence_T.cpp \
+ $(TAO_ROOT)/tao/OctetSeqC.i \
+ $(TAO_ROOT)/tao/Principal.i \
+ $(TAO_ROOT)/tao/ORB.h \
+ $(TAO_ROOT)/tao/Services.h \
+ $(TAO_ROOT)/tao/Services.i \
+ $(TAO_ROOT)/tao/CORBA_String.h \
+ $(TAO_ROOT)/tao/CORBA_String.inl \
+ $(TAO_ROOT)/tao/PolicyC.h \
+ $(TAO_ROOT)/tao/Encodable.h \
+ $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/CurrentC.h \
+ $(TAO_ROOT)/tao/CurrentC.i \
+ $(TAO_ROOT)/tao/PolicyC.i \
+ $(TAO_ROOT)/tao/ORB.i \
+ $(TAO_ROOT)/tao/BoundsC.h \
+ $(TAO_ROOT)/tao/BoundsC.i \
+ $(TAO_ROOT)/tao/ValueBase.h \
+ $(TAO_ROOT)/tao/ValueBase.i \
+ $(TAO_ROOT)/tao/ValueFactory.h \
+ $(TAO_ROOT)/tao/ValueFactory.i \
+ $(TAO_ROOT)/tao/DomainC.h \
+ $(TAO_ROOT)/tao/DomainC.i \
+ $(TAO_ROOT)/tao/WrongTransactionC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.i \
+ $(TAO_ROOT)/tao/ObjectIDList.h \
+ $(TAO_ROOT)/tao/ObjectIDList.i \
+ $(TAO_ROOT)/tao/StringSeqC.h \
+ $(TAO_ROOT)/tao/StringSeqC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.h \
+ $(TAO_ROOT)/tao/DynamicC.h \
+ $(TAO_ROOT)/tao/DynamicC.i \
+ $(TAO_ROOT)/tao/MessagingC.h \
+ $(TAO_ROOT)/tao/TimeBaseC.h \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.h \
+ $(TAO_ROOT)/tao/SmartProxies/smartproxies_export.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.inl \
+ $(TAO_ROOT)/tao/TAO_Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.inl \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.inl \
+ $(TAO_ROOT)/tao/TimeBaseC.i \
+ $(TAO_ROOT)/tao/IOPC.h \
+ $(TAO_ROOT)/tao/IOPC.i \
+ $(TAO_ROOT)/tao/PollableC.h \
+ $(TAO_ROOT)/tao/PollableC.i \
+ $(TAO_ROOT)/tao/MessagingC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.i \
+ TestC.i \
+ $(ACE_ROOT)/ace/Get_Opt.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Array_Base.h \
+ $(ACE_ROOT)/ace/Array_Base.inl \
+ $(ACE_ROOT)/ace/Array_Base.cpp \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Get_Opt.i
+
+.obj/server.o .obj/server.so .shobj/server.o .shobj/server.so: server.cpp Hello.h \
+ $(ACE_ROOT)/ace/pre.h \
+ TestS.h TestC.h \
+ $(TAO_ROOT)/tao/corba.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Errno.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Errno.inl \
+ $(TAO_ROOT)/tao/corbafwd.h \
+ $(ACE_ROOT)/ace/CDR_Base.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ $(ACE_ROOT)/ace/Flag_Manip.h \
+ $(ACE_ROOT)/ace/Flag_Manip.i \
+ $(ACE_ROOT)/ace/Handle_Ops.h \
+ $(ACE_ROOT)/ace/Handle_Ops.i \
+ $(ACE_ROOT)/ace/Lib_Find.h \
+ $(ACE_ROOT)/ace/Lib_Find.i \
+ $(ACE_ROOT)/ace/Init_ACE.h \
+ $(ACE_ROOT)/ace/Init_ACE.i \
+ $(ACE_ROOT)/ace/Sock_Connect.h \
+ $(ACE_ROOT)/ace/Sock_Connect.i \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Malloc_Allocator.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.i \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Unbounded_Set.h \
+ $(ACE_ROOT)/ace/Node.h \
+ $(ACE_ROOT)/ace/Node.cpp \
+ $(ACE_ROOT)/ace/Unbounded_Set.inl \
+ $(ACE_ROOT)/ace/Unbounded_Set.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/Message_Block_T.h \
+ $(ACE_ROOT)/ace/Message_Block_T.i \
+ $(ACE_ROOT)/ace/Message_Block_T.cpp \
+ $(ACE_ROOT)/ace/CDR_Base.inl \
+ $(TAO_ROOT)/tao/try_macros.h \
+ $(TAO_ROOT)/tao/orbconf.h \
+ $(ACE_ROOT)/ace/CORBA_macros.h \
+ $(TAO_ROOT)/tao/varbase.h \
+ $(TAO_ROOT)/tao/TAO_Export.h \
+ $(TAO_ROOT)/tao/corbafwd.i \
+ $(TAO_ROOT)/tao/Typecode.h \
+ $(TAO_ROOT)/tao/Exception.h \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/String_Base.h \
+ $(ACE_ROOT)/ace/String_Base_Const.h \
+ $(ACE_ROOT)/ace/String_Base.i \
+ $(ACE_ROOT)/ace/String_Base.cpp \
+ $(ACE_ROOT)/ace/Auto_Ptr.h \
+ $(ACE_ROOT)/ace/Auto_Ptr.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.cpp \
+ $(ACE_ROOT)/ace/SString.i \
+ $(TAO_ROOT)/tao/Exception.i \
+ $(TAO_ROOT)/tao/Typecode.i \
+ $(TAO_ROOT)/tao/Any.h \
+ $(TAO_ROOT)/tao/CDR.h \
+ $(ACE_ROOT)/ace/CDR_Stream.h \
+ $(ACE_ROOT)/ace/CDR_Stream.i \
+ $(TAO_ROOT)/tao/CDR.i \
+ $(TAO_ROOT)/tao/Environment.h \
+ $(TAO_ROOT)/tao/Environment.i \
+ $(TAO_ROOT)/tao/Object.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Broker.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Object.i \
+ $(TAO_ROOT)/tao/Any.i \
+ $(TAO_ROOT)/tao/NVList.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.inl \
+ $(ACE_ROOT)/ace/Unbounded_Queue.cpp \
+ $(TAO_ROOT)/tao/NVList.i \
+ $(TAO_ROOT)/tao/LocalObject.h \
+ $(TAO_ROOT)/tao/LocalObject.i \
+ $(TAO_ROOT)/tao/Principal.h \
+ $(TAO_ROOT)/tao/OctetSeqC.h \
+ $(TAO_ROOT)/tao/Sequence.h \
+ $(TAO_ROOT)/tao/Managed_Types.h \
+ $(TAO_ROOT)/tao/Managed_Types.i \
+ $(TAO_ROOT)/tao/Sequence.i \
+ $(TAO_ROOT)/tao/Sequence_T.h \
+ $(TAO_ROOT)/tao/Sequence_T.i \
+ $(TAO_ROOT)/tao/Sequence_T.cpp \
+ $(TAO_ROOT)/tao/OctetSeqC.i \
+ $(TAO_ROOT)/tao/Principal.i \
+ $(TAO_ROOT)/tao/ORB.h \
+ $(TAO_ROOT)/tao/Services.h \
+ $(TAO_ROOT)/tao/Services.i \
+ $(TAO_ROOT)/tao/CORBA_String.h \
+ $(TAO_ROOT)/tao/CORBA_String.inl \
+ $(TAO_ROOT)/tao/PolicyC.h \
+ $(TAO_ROOT)/tao/Encodable.h \
+ $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/CurrentC.h \
+ $(TAO_ROOT)/tao/CurrentC.i \
+ $(TAO_ROOT)/tao/PolicyC.i \
+ $(TAO_ROOT)/tao/ORB.i \
+ $(TAO_ROOT)/tao/BoundsC.h \
+ $(TAO_ROOT)/tao/BoundsC.i \
+ $(TAO_ROOT)/tao/ValueBase.h \
+ $(TAO_ROOT)/tao/ValueBase.i \
+ $(TAO_ROOT)/tao/ValueFactory.h \
+ $(TAO_ROOT)/tao/ValueFactory.i \
+ $(TAO_ROOT)/tao/DomainC.h \
+ $(TAO_ROOT)/tao/DomainC.i \
+ $(TAO_ROOT)/tao/WrongTransactionC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.i \
+ $(TAO_ROOT)/tao/ObjectIDList.h \
+ $(TAO_ROOT)/tao/ObjectIDList.i \
+ $(TAO_ROOT)/tao/StringSeqC.h \
+ $(TAO_ROOT)/tao/StringSeqC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.h \
+ $(TAO_ROOT)/tao/DynamicC.h \
+ $(TAO_ROOT)/tao/DynamicC.i \
+ $(TAO_ROOT)/tao/MessagingC.h \
+ $(TAO_ROOT)/tao/TimeBaseC.h \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.h \
+ $(TAO_ROOT)/tao/SmartProxies/smartproxies_export.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.inl \
+ $(TAO_ROOT)/tao/TAO_Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.inl \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.inl \
+ $(TAO_ROOT)/tao/TimeBaseC.i \
+ $(TAO_ROOT)/tao/IOPC.h \
+ $(TAO_ROOT)/tao/IOPC.i \
+ $(TAO_ROOT)/tao/PollableC.h \
+ $(TAO_ROOT)/tao/PollableC.i \
+ $(TAO_ROOT)/tao/MessagingC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.i \
+ TestC.i \
+ $(TAO_ROOT)/tao/PortableServer/PortableServer.h \
+ $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.i \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \
+ $(TAO_ROOT)/tao/Abstract_Servant_Base.h \
+ $(ACE_ROOT)/ace/Atomic_Op.h \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Atomic_Op.cpp \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.i \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.i \
+ $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \
+ TestS_T.h TestS_T.i TestS_T.cpp TestS.i \
+ $(ACE_ROOT)/ace/Get_Opt.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Array_Base.h \
+ $(ACE_ROOT)/ace/Array_Base.inl \
+ $(ACE_ROOT)/ace/Array_Base.cpp \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Get_Opt.i
+
+.obj/Hello.o .obj/Hello.so .shobj/Hello.o .shobj/Hello.so: Hello.cpp Hello.h \
+ $(ACE_ROOT)/ace/pre.h \
+ TestS.h TestC.h \
+ $(TAO_ROOT)/tao/corba.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Errno.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Errno.inl \
+ $(TAO_ROOT)/tao/corbafwd.h \
+ $(ACE_ROOT)/ace/CDR_Base.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ $(ACE_ROOT)/ace/Flag_Manip.h \
+ $(ACE_ROOT)/ace/Flag_Manip.i \
+ $(ACE_ROOT)/ace/Handle_Ops.h \
+ $(ACE_ROOT)/ace/Handle_Ops.i \
+ $(ACE_ROOT)/ace/Lib_Find.h \
+ $(ACE_ROOT)/ace/Lib_Find.i \
+ $(ACE_ROOT)/ace/Init_ACE.h \
+ $(ACE_ROOT)/ace/Init_ACE.i \
+ $(ACE_ROOT)/ace/Sock_Connect.h \
+ $(ACE_ROOT)/ace/Sock_Connect.i \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Malloc_Allocator.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.i \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Unbounded_Set.h \
+ $(ACE_ROOT)/ace/Node.h \
+ $(ACE_ROOT)/ace/Node.cpp \
+ $(ACE_ROOT)/ace/Unbounded_Set.inl \
+ $(ACE_ROOT)/ace/Unbounded_Set.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/Message_Block_T.h \
+ $(ACE_ROOT)/ace/Message_Block_T.i \
+ $(ACE_ROOT)/ace/Message_Block_T.cpp \
+ $(ACE_ROOT)/ace/CDR_Base.inl \
+ $(TAO_ROOT)/tao/try_macros.h \
+ $(TAO_ROOT)/tao/orbconf.h \
+ $(ACE_ROOT)/ace/CORBA_macros.h \
+ $(TAO_ROOT)/tao/varbase.h \
+ $(TAO_ROOT)/tao/TAO_Export.h \
+ $(TAO_ROOT)/tao/corbafwd.i \
+ $(TAO_ROOT)/tao/Typecode.h \
+ $(TAO_ROOT)/tao/Exception.h \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/String_Base.h \
+ $(ACE_ROOT)/ace/String_Base_Const.h \
+ $(ACE_ROOT)/ace/String_Base.i \
+ $(ACE_ROOT)/ace/String_Base.cpp \
+ $(ACE_ROOT)/ace/Auto_Ptr.h \
+ $(ACE_ROOT)/ace/Auto_Ptr.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.cpp \
+ $(ACE_ROOT)/ace/SString.i \
+ $(TAO_ROOT)/tao/Exception.i \
+ $(TAO_ROOT)/tao/Typecode.i \
+ $(TAO_ROOT)/tao/Any.h \
+ $(TAO_ROOT)/tao/CDR.h \
+ $(ACE_ROOT)/ace/CDR_Stream.h \
+ $(ACE_ROOT)/ace/CDR_Stream.i \
+ $(TAO_ROOT)/tao/CDR.i \
+ $(TAO_ROOT)/tao/Environment.h \
+ $(TAO_ROOT)/tao/Environment.i \
+ $(TAO_ROOT)/tao/Object.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Broker.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Object.i \
+ $(TAO_ROOT)/tao/Any.i \
+ $(TAO_ROOT)/tao/NVList.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.inl \
+ $(ACE_ROOT)/ace/Unbounded_Queue.cpp \
+ $(TAO_ROOT)/tao/NVList.i \
+ $(TAO_ROOT)/tao/LocalObject.h \
+ $(TAO_ROOT)/tao/LocalObject.i \
+ $(TAO_ROOT)/tao/Principal.h \
+ $(TAO_ROOT)/tao/OctetSeqC.h \
+ $(TAO_ROOT)/tao/Sequence.h \
+ $(TAO_ROOT)/tao/Managed_Types.h \
+ $(TAO_ROOT)/tao/Managed_Types.i \
+ $(TAO_ROOT)/tao/Sequence.i \
+ $(TAO_ROOT)/tao/Sequence_T.h \
+ $(TAO_ROOT)/tao/Sequence_T.i \
+ $(TAO_ROOT)/tao/Sequence_T.cpp \
+ $(TAO_ROOT)/tao/OctetSeqC.i \
+ $(TAO_ROOT)/tao/Principal.i \
+ $(TAO_ROOT)/tao/ORB.h \
+ $(TAO_ROOT)/tao/Services.h \
+ $(TAO_ROOT)/tao/Services.i \
+ $(TAO_ROOT)/tao/CORBA_String.h \
+ $(TAO_ROOT)/tao/CORBA_String.inl \
+ $(TAO_ROOT)/tao/PolicyC.h \
+ $(TAO_ROOT)/tao/Encodable.h \
+ $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/CurrentC.h \
+ $(TAO_ROOT)/tao/CurrentC.i \
+ $(TAO_ROOT)/tao/PolicyC.i \
+ $(TAO_ROOT)/tao/ORB.i \
+ $(TAO_ROOT)/tao/BoundsC.h \
+ $(TAO_ROOT)/tao/BoundsC.i \
+ $(TAO_ROOT)/tao/ValueBase.h \
+ $(TAO_ROOT)/tao/ValueBase.i \
+ $(TAO_ROOT)/tao/ValueFactory.h \
+ $(TAO_ROOT)/tao/ValueFactory.i \
+ $(TAO_ROOT)/tao/DomainC.h \
+ $(TAO_ROOT)/tao/DomainC.i \
+ $(TAO_ROOT)/tao/WrongTransactionC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.i \
+ $(TAO_ROOT)/tao/ObjectIDList.h \
+ $(TAO_ROOT)/tao/ObjectIDList.i \
+ $(TAO_ROOT)/tao/StringSeqC.h \
+ $(TAO_ROOT)/tao/StringSeqC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.h \
+ $(TAO_ROOT)/tao/DynamicC.h \
+ $(TAO_ROOT)/tao/DynamicC.i \
+ $(TAO_ROOT)/tao/MessagingC.h \
+ $(TAO_ROOT)/tao/TimeBaseC.h \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.h \
+ $(TAO_ROOT)/tao/SmartProxies/smartproxies_export.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.inl \
+ $(TAO_ROOT)/tao/TAO_Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.inl \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.inl \
+ $(TAO_ROOT)/tao/TimeBaseC.i \
+ $(TAO_ROOT)/tao/IOPC.h \
+ $(TAO_ROOT)/tao/IOPC.i \
+ $(TAO_ROOT)/tao/PollableC.h \
+ $(TAO_ROOT)/tao/PollableC.i \
+ $(TAO_ROOT)/tao/MessagingC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.i \
+ TestC.i \
+ $(TAO_ROOT)/tao/PortableServer/PortableServer.h \
+ $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.i \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \
+ $(TAO_ROOT)/tao/Abstract_Servant_Base.h \
+ $(ACE_ROOT)/ace/Atomic_Op.h \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Atomic_Op.cpp \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.i \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.i \
+ $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \
+ TestS_T.h TestS_T.i TestS_T.cpp TestS.i
+
+.obj/TestC.o .obj/TestC.so .shobj/TestC.o .shobj/TestC.so: TestC.cpp TestC.h \
+ $(TAO_ROOT)/tao/corba.h \
+ $(ACE_ROOT)/ace/pre.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Errno.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Errno.inl \
+ $(TAO_ROOT)/tao/corbafwd.h \
+ $(ACE_ROOT)/ace/CDR_Base.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ $(ACE_ROOT)/ace/Flag_Manip.h \
+ $(ACE_ROOT)/ace/Flag_Manip.i \
+ $(ACE_ROOT)/ace/Handle_Ops.h \
+ $(ACE_ROOT)/ace/Handle_Ops.i \
+ $(ACE_ROOT)/ace/Lib_Find.h \
+ $(ACE_ROOT)/ace/Lib_Find.i \
+ $(ACE_ROOT)/ace/Init_ACE.h \
+ $(ACE_ROOT)/ace/Init_ACE.i \
+ $(ACE_ROOT)/ace/Sock_Connect.h \
+ $(ACE_ROOT)/ace/Sock_Connect.i \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Malloc_Allocator.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.i \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Unbounded_Set.h \
+ $(ACE_ROOT)/ace/Node.h \
+ $(ACE_ROOT)/ace/Node.cpp \
+ $(ACE_ROOT)/ace/Unbounded_Set.inl \
+ $(ACE_ROOT)/ace/Unbounded_Set.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/Message_Block_T.h \
+ $(ACE_ROOT)/ace/Message_Block_T.i \
+ $(ACE_ROOT)/ace/Message_Block_T.cpp \
+ $(ACE_ROOT)/ace/CDR_Base.inl \
+ $(TAO_ROOT)/tao/try_macros.h \
+ $(TAO_ROOT)/tao/orbconf.h \
+ $(ACE_ROOT)/ace/CORBA_macros.h \
+ $(TAO_ROOT)/tao/varbase.h \
+ $(TAO_ROOT)/tao/TAO_Export.h \
+ $(TAO_ROOT)/tao/corbafwd.i \
+ $(TAO_ROOT)/tao/Typecode.h \
+ $(TAO_ROOT)/tao/Exception.h \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/String_Base.h \
+ $(ACE_ROOT)/ace/String_Base_Const.h \
+ $(ACE_ROOT)/ace/String_Base.i \
+ $(ACE_ROOT)/ace/String_Base.cpp \
+ $(ACE_ROOT)/ace/Auto_Ptr.h \
+ $(ACE_ROOT)/ace/Auto_Ptr.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.cpp \
+ $(ACE_ROOT)/ace/SString.i \
+ $(TAO_ROOT)/tao/Exception.i \
+ $(TAO_ROOT)/tao/Typecode.i \
+ $(TAO_ROOT)/tao/Any.h \
+ $(TAO_ROOT)/tao/CDR.h \
+ $(ACE_ROOT)/ace/CDR_Stream.h \
+ $(ACE_ROOT)/ace/CDR_Stream.i \
+ $(TAO_ROOT)/tao/CDR.i \
+ $(TAO_ROOT)/tao/Environment.h \
+ $(TAO_ROOT)/tao/Environment.i \
+ $(TAO_ROOT)/tao/Object.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Broker.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Object.i \
+ $(TAO_ROOT)/tao/Any.i \
+ $(TAO_ROOT)/tao/NVList.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.inl \
+ $(ACE_ROOT)/ace/Unbounded_Queue.cpp \
+ $(TAO_ROOT)/tao/NVList.i \
+ $(TAO_ROOT)/tao/LocalObject.h \
+ $(TAO_ROOT)/tao/LocalObject.i \
+ $(TAO_ROOT)/tao/Principal.h \
+ $(TAO_ROOT)/tao/OctetSeqC.h \
+ $(TAO_ROOT)/tao/Sequence.h \
+ $(TAO_ROOT)/tao/Managed_Types.h \
+ $(TAO_ROOT)/tao/Managed_Types.i \
+ $(TAO_ROOT)/tao/Sequence.i \
+ $(TAO_ROOT)/tao/Sequence_T.h \
+ $(TAO_ROOT)/tao/Sequence_T.i \
+ $(TAO_ROOT)/tao/Sequence_T.cpp \
+ $(TAO_ROOT)/tao/OctetSeqC.i \
+ $(TAO_ROOT)/tao/Principal.i \
+ $(TAO_ROOT)/tao/ORB.h \
+ $(TAO_ROOT)/tao/Services.h \
+ $(TAO_ROOT)/tao/Services.i \
+ $(TAO_ROOT)/tao/CORBA_String.h \
+ $(TAO_ROOT)/tao/CORBA_String.inl \
+ $(TAO_ROOT)/tao/PolicyC.h \
+ $(TAO_ROOT)/tao/Encodable.h \
+ $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/CurrentC.h \
+ $(TAO_ROOT)/tao/CurrentC.i \
+ $(TAO_ROOT)/tao/PolicyC.i \
+ $(TAO_ROOT)/tao/ORB.i \
+ $(TAO_ROOT)/tao/BoundsC.h \
+ $(TAO_ROOT)/tao/BoundsC.i \
+ $(TAO_ROOT)/tao/ValueBase.h \
+ $(TAO_ROOT)/tao/ValueBase.i \
+ $(TAO_ROOT)/tao/ValueFactory.h \
+ $(TAO_ROOT)/tao/ValueFactory.i \
+ $(TAO_ROOT)/tao/DomainC.h \
+ $(TAO_ROOT)/tao/DomainC.i \
+ $(TAO_ROOT)/tao/WrongTransactionC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.i \
+ $(TAO_ROOT)/tao/ObjectIDList.h \
+ $(TAO_ROOT)/tao/ObjectIDList.i \
+ $(TAO_ROOT)/tao/StringSeqC.h \
+ $(TAO_ROOT)/tao/StringSeqC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.h \
+ $(TAO_ROOT)/tao/DynamicC.h \
+ $(TAO_ROOT)/tao/DynamicC.i \
+ $(TAO_ROOT)/tao/MessagingC.h \
+ $(TAO_ROOT)/tao/TimeBaseC.h \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.h \
+ $(TAO_ROOT)/tao/SmartProxies/smartproxies_export.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.inl \
+ $(TAO_ROOT)/tao/TAO_Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.inl \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.inl \
+ $(TAO_ROOT)/tao/TimeBaseC.i \
+ $(TAO_ROOT)/tao/IOPC.h \
+ $(TAO_ROOT)/tao/IOPC.i \
+ $(TAO_ROOT)/tao/PollableC.h \
+ $(TAO_ROOT)/tao/PollableC.i \
+ $(TAO_ROOT)/tao/MessagingC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.i \
+ TestC.i \
+ $(TAO_ROOT)/tao/Stub.h \
+ $(TAO_ROOT)/tao/Pluggable.h \
+ $(TAO_ROOT)/tao/Pluggable.i \
+ $(TAO_ROOT)/tao/MProfile.h \
+ $(TAO_ROOT)/tao/Profile.h \
+ $(TAO_ROOT)/tao/Tagged_Components.h \
+ $(TAO_ROOT)/tao/CONV_FRAMEC.h \
+ $(TAO_ROOT)/tao/CONV_FRAMEC.i \
+ $(TAO_ROOT)/tao/Tagged_Components.i \
+ $(TAO_ROOT)/tao/GIOP_Message_Version.h \
+ $(TAO_ROOT)/tao/GIOP_Message_Version.inl \
+ $(TAO_ROOT)/tao/Profile.i \
+ $(TAO_ROOT)/tao/MProfile.i \
+ $(TAO_ROOT)/tao/ORB_Core.h \
+ $(TAO_ROOT)/tao/Policy_Manager.h \
+ $(TAO_ROOT)/tao/Policy_Set.h \
+ $(TAO_ROOT)/tao/Policy_Set.i \
+ $(TAO_ROOT)/tao/debug.h \
+ $(TAO_ROOT)/tao/Policy_Manager.i \
+ $(TAO_ROOT)/tao/Resource_Factory.h \
+ $(ACE_ROOT)/ace/Service_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.i \
+ $(ACE_ROOT)/ace/Service_Object.i \
+ $(TAO_ROOT)/tao/Protocol_Factory.h \
+ $(TAO_ROOT)/tao/params.h \
+ $(TAO_ROOT)/tao/params.i \
+ $(TAO_ROOT)/tao/Adapter.h \
+ $(TAO_ROOT)/tao/Adapter.i \
+ $(TAO_ROOT)/tao/PolicyFactory_Registry.h \
+ $(ACE_ROOT)/ace/Map_Manager.h \
+ $(ACE_ROOT)/ace/Map_Manager.i \
+ $(ACE_ROOT)/ace/Map_Manager.cpp \
+ $(ACE_ROOT)/ace/Service_Config.h \
+ $(ACE_ROOT)/ace/Service_Config.i \
+ $(ACE_ROOT)/ace/Reactor.h \
+ $(ACE_ROOT)/ace/Handle_Set.h \
+ $(ACE_ROOT)/ace/Handle_Set.i \
+ $(ACE_ROOT)/ace/Timer_Queue.h \
+ $(ACE_ROOT)/ace/Timer_Queue_T.h \
+ $(ACE_ROOT)/ace/Test_and_Set.h \
+ $(ACE_ROOT)/ace/Test_and_Set.i \
+ $(ACE_ROOT)/ace/Test_and_Set.cpp \
+ $(ACE_ROOT)/ace/Timer_Queue_T.i \
+ $(ACE_ROOT)/ace/Timer_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Reactor.i \
+ $(ACE_ROOT)/ace/Reactor_Impl.h \
+ $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
+ $(TAO_ROOT)/tao/Parser_Registry.h \
+ $(TAO_ROOT)/tao/Parser_Registry.i \
+ $(TAO_ROOT)/tao/Service_Callbacks.h \
+ $(TAO_ROOT)/tao/Service_Callbacks.i \
+ $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \
+ $(TAO_ROOT)/tao/Fault_Tolerance_Service.i \
+ $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \
+ $(ACE_ROOT)/ace/Array_Base.h \
+ $(ACE_ROOT)/ace/Array_Base.inl \
+ $(ACE_ROOT)/ace/Array_Base.cpp \
+ $(TAO_ROOT)/tao/Cleanup_Func_Registry.inl \
+ $(TAO_ROOT)/tao/Object_Ref_Table.h \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \
+ $(ACE_ROOT)/ace/Functor.h \
+ $(ACE_ROOT)/ace/Functor.i \
+ $(ACE_ROOT)/ace/Functor_T.h \
+ $(ACE_ROOT)/ace/Functor_T.i \
+ $(ACE_ROOT)/ace/Functor_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \
+ $(TAO_ROOT)/tao/Interceptor_List.h \
+ $(TAO_ROOT)/tao/Interceptor_List.inl \
+ $(TAO_ROOT)/tao/PICurrent.h \
+ $(TAO_ROOT)/tao/PICurrent.inl \
+ $(TAO_ROOT)/tao/Protocols_Hooks.h \
+ $(ACE_ROOT)/ace/Hash_Map_Manager.h \
+ $(ACE_ROOT)/ace/Thread_Manager.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(ACE_ROOT)/ace/Thread_Manager.i \
+ $(TAO_ROOT)/tao/ORB_Core.i \
+ $(TAO_ROOT)/tao/Stub.i \
+ $(TAO_ROOT)/tao/Invocation.h \
+ $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \
+ $(TAO_ROOT)/tao/Reply_Dispatcher.h \
+ $(TAO_ROOT)/tao/Reply_Dispatcher.i \
+ $(TAO_ROOT)/tao/LF_Event.h \
+ $(TAO_ROOT)/tao/LF_Event.inl \
+ $(TAO_ROOT)/tao/TAOC.h \
+ $(TAO_ROOT)/tao/TAOC.i \
+ $(TAO_ROOT)/tao/operation_details.h \
+ $(TAO_ROOT)/tao/Service_Context.h \
+ $(TAO_ROOT)/tao/Service_Context.inl \
+ $(TAO_ROOT)/tao/target_specification.h \
+ $(TAO_ROOT)/tao/target_specification.i \
+ $(TAO_ROOT)/tao/operation_details.i \
+ $(TAO_ROOT)/tao/Invocation_Endpoint_Selectors.h \
+ $(TAO_ROOT)/tao/Invocation_Endpoint_Selectors.i \
+ $(TAO_ROOT)/tao/Invocation.i \
+ $(TAO_ROOT)/tao/PortableInterceptor.h \
+ $(TAO_ROOT)/tao/RequestInfo_Util.h \
+ $(TAO_ROOT)/tao/ClientRequestInfo.h \
+ $(TAO_ROOT)/tao/ClientRequestInfo.inl \
+ $(TAO_ROOT)/tao/ClientInterceptorAdapter.h \
+ $(TAO_ROOT)/tao/ClientInterceptorAdapter.inl
+
+.obj/TestS.o .obj/TestS.so .shobj/TestS.o .shobj/TestS.so: TestS.cpp TestS.h TestC.h \
+ $(TAO_ROOT)/tao/corba.h \
+ $(ACE_ROOT)/ace/pre.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Errno.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Errno.inl \
+ $(TAO_ROOT)/tao/corbafwd.h \
+ $(ACE_ROOT)/ace/CDR_Base.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ $(ACE_ROOT)/ace/Flag_Manip.h \
+ $(ACE_ROOT)/ace/Flag_Manip.i \
+ $(ACE_ROOT)/ace/Handle_Ops.h \
+ $(ACE_ROOT)/ace/Handle_Ops.i \
+ $(ACE_ROOT)/ace/Lib_Find.h \
+ $(ACE_ROOT)/ace/Lib_Find.i \
+ $(ACE_ROOT)/ace/Init_ACE.h \
+ $(ACE_ROOT)/ace/Init_ACE.i \
+ $(ACE_ROOT)/ace/Sock_Connect.h \
+ $(ACE_ROOT)/ace/Sock_Connect.i \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Malloc_Allocator.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.i \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Unbounded_Set.h \
+ $(ACE_ROOT)/ace/Node.h \
+ $(ACE_ROOT)/ace/Node.cpp \
+ $(ACE_ROOT)/ace/Unbounded_Set.inl \
+ $(ACE_ROOT)/ace/Unbounded_Set.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/Message_Block_T.h \
+ $(ACE_ROOT)/ace/Message_Block_T.i \
+ $(ACE_ROOT)/ace/Message_Block_T.cpp \
+ $(ACE_ROOT)/ace/CDR_Base.inl \
+ $(TAO_ROOT)/tao/try_macros.h \
+ $(TAO_ROOT)/tao/orbconf.h \
+ $(ACE_ROOT)/ace/CORBA_macros.h \
+ $(TAO_ROOT)/tao/varbase.h \
+ $(TAO_ROOT)/tao/TAO_Export.h \
+ $(TAO_ROOT)/tao/corbafwd.i \
+ $(TAO_ROOT)/tao/Typecode.h \
+ $(TAO_ROOT)/tao/Exception.h \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/String_Base.h \
+ $(ACE_ROOT)/ace/String_Base_Const.h \
+ $(ACE_ROOT)/ace/String_Base.i \
+ $(ACE_ROOT)/ace/String_Base.cpp \
+ $(ACE_ROOT)/ace/Auto_Ptr.h \
+ $(ACE_ROOT)/ace/Auto_Ptr.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.cpp \
+ $(ACE_ROOT)/ace/SString.i \
+ $(TAO_ROOT)/tao/Exception.i \
+ $(TAO_ROOT)/tao/Typecode.i \
+ $(TAO_ROOT)/tao/Any.h \
+ $(TAO_ROOT)/tao/CDR.h \
+ $(ACE_ROOT)/ace/CDR_Stream.h \
+ $(ACE_ROOT)/ace/CDR_Stream.i \
+ $(TAO_ROOT)/tao/CDR.i \
+ $(TAO_ROOT)/tao/Environment.h \
+ $(TAO_ROOT)/tao/Environment.i \
+ $(TAO_ROOT)/tao/Object.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Broker.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Object.i \
+ $(TAO_ROOT)/tao/Any.i \
+ $(TAO_ROOT)/tao/NVList.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.inl \
+ $(ACE_ROOT)/ace/Unbounded_Queue.cpp \
+ $(TAO_ROOT)/tao/NVList.i \
+ $(TAO_ROOT)/tao/LocalObject.h \
+ $(TAO_ROOT)/tao/LocalObject.i \
+ $(TAO_ROOT)/tao/Principal.h \
+ $(TAO_ROOT)/tao/OctetSeqC.h \
+ $(TAO_ROOT)/tao/Sequence.h \
+ $(TAO_ROOT)/tao/Managed_Types.h \
+ $(TAO_ROOT)/tao/Managed_Types.i \
+ $(TAO_ROOT)/tao/Sequence.i \
+ $(TAO_ROOT)/tao/Sequence_T.h \
+ $(TAO_ROOT)/tao/Sequence_T.i \
+ $(TAO_ROOT)/tao/Sequence_T.cpp \
+ $(TAO_ROOT)/tao/OctetSeqC.i \
+ $(TAO_ROOT)/tao/Principal.i \
+ $(TAO_ROOT)/tao/ORB.h \
+ $(TAO_ROOT)/tao/Services.h \
+ $(TAO_ROOT)/tao/Services.i \
+ $(TAO_ROOT)/tao/CORBA_String.h \
+ $(TAO_ROOT)/tao/CORBA_String.inl \
+ $(TAO_ROOT)/tao/PolicyC.h \
+ $(TAO_ROOT)/tao/Encodable.h \
+ $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/CurrentC.h \
+ $(TAO_ROOT)/tao/CurrentC.i \
+ $(TAO_ROOT)/tao/PolicyC.i \
+ $(TAO_ROOT)/tao/ORB.i \
+ $(TAO_ROOT)/tao/BoundsC.h \
+ $(TAO_ROOT)/tao/BoundsC.i \
+ $(TAO_ROOT)/tao/ValueBase.h \
+ $(TAO_ROOT)/tao/ValueBase.i \
+ $(TAO_ROOT)/tao/ValueFactory.h \
+ $(TAO_ROOT)/tao/ValueFactory.i \
+ $(TAO_ROOT)/tao/DomainC.h \
+ $(TAO_ROOT)/tao/DomainC.i \
+ $(TAO_ROOT)/tao/WrongTransactionC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.i \
+ $(TAO_ROOT)/tao/ObjectIDList.h \
+ $(TAO_ROOT)/tao/ObjectIDList.i \
+ $(TAO_ROOT)/tao/StringSeqC.h \
+ $(TAO_ROOT)/tao/StringSeqC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.h \
+ $(TAO_ROOT)/tao/DynamicC.h \
+ $(TAO_ROOT)/tao/DynamicC.i \
+ $(TAO_ROOT)/tao/MessagingC.h \
+ $(TAO_ROOT)/tao/TimeBaseC.h \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.h \
+ $(TAO_ROOT)/tao/SmartProxies/smartproxies_export.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.inl \
+ $(TAO_ROOT)/tao/TAO_Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.inl \
+ $(TAO_ROOT)/tao/SmartProxies/Smart_Proxies.inl \
+ $(TAO_ROOT)/tao/TimeBaseC.i \
+ $(TAO_ROOT)/tao/IOPC.h \
+ $(TAO_ROOT)/tao/IOPC.i \
+ $(TAO_ROOT)/tao/PollableC.h \
+ $(TAO_ROOT)/tao/PollableC.i \
+ $(TAO_ROOT)/tao/MessagingC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.i \
+ TestC.i \
+ $(TAO_ROOT)/tao/PortableServer/PortableServer.h \
+ $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.i \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \
+ $(TAO_ROOT)/tao/Abstract_Servant_Base.h \
+ $(ACE_ROOT)/ace/Atomic_Op.h \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Atomic_Op.cpp \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.i \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.i \
+ $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \
+ TestS_T.h TestS_T.i TestS_T.cpp TestS.i \
+ $(TAO_ROOT)/tao/PortableServer/Object_Adapter.h \
+ $(TAO_ROOT)/tao/PortableServer/Key_Adapters.h \
+ $(ACE_ROOT)/ace/Map.h \
+ $(ACE_ROOT)/ace/Map_T.h \
+ $(ACE_ROOT)/ace/Pair.h \
+ $(ACE_ROOT)/ace/Pair_T.h \
+ $(ACE_ROOT)/ace/Pair_T.i \
+ $(ACE_ROOT)/ace/Pair_T.cpp \
+ $(ACE_ROOT)/ace/Map_Manager.h \
+ $(ACE_ROOT)/ace/Map_Manager.i \
+ $(ACE_ROOT)/ace/Map_Manager.cpp \
+ $(ACE_ROOT)/ace/Service_Config.h \
+ $(ACE_ROOT)/ace/Service_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.i \
+ $(ACE_ROOT)/ace/Service_Object.i \
+ $(ACE_ROOT)/ace/Service_Config.i \
+ $(ACE_ROOT)/ace/Reactor.h \
+ $(ACE_ROOT)/ace/Handle_Set.h \
+ $(ACE_ROOT)/ace/Handle_Set.i \
+ $(ACE_ROOT)/ace/Timer_Queue.h \
+ $(ACE_ROOT)/ace/Timer_Queue_T.h \
+ $(ACE_ROOT)/ace/Test_and_Set.h \
+ $(ACE_ROOT)/ace/Test_and_Set.i \
+ $(ACE_ROOT)/ace/Test_and_Set.cpp \
+ $(ACE_ROOT)/ace/Timer_Queue_T.i \
+ $(ACE_ROOT)/ace/Timer_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Reactor.i \
+ $(ACE_ROOT)/ace/Reactor_Impl.h \
+ $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
+ $(ACE_ROOT)/ace/Hash_Map_Manager.h \
+ $(ACE_ROOT)/ace/Functor.h \
+ $(ACE_ROOT)/ace/Functor.i \
+ $(ACE_ROOT)/ace/Functor_T.h \
+ $(ACE_ROOT)/ace/Functor_T.i \
+ $(ACE_ROOT)/ace/Functor_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \
+ $(ACE_ROOT)/ace/Active_Map_Manager.h \
+ $(ACE_ROOT)/ace/Active_Map_Manager.i \
+ $(ACE_ROOT)/ace/Active_Map_Manager_T.h \
+ $(ACE_ROOT)/ace/Active_Map_Manager_T.i \
+ $(ACE_ROOT)/ace/Active_Map_Manager_T.cpp \
+ $(ACE_ROOT)/ace/Map_T.i \
+ $(ACE_ROOT)/ace/Map_T.cpp \
+ $(TAO_ROOT)/tao/PortableServer/Key_Adapters.i \
+ $(TAO_ROOT)/tao/PortableServer/poa_macros.h \
+ $(TAO_ROOT)/tao/PortableServer/Active_Object_Map.h \
+ $(TAO_ROOT)/tao/Server_Strategy_Factory.h \
+ $(TAO_ROOT)/tao/PortableServer/Active_Object_Map.i \
+ $(TAO_ROOT)/tao/Adapter.h \
+ $(TAO_ROOT)/tao/Adapter.i \
+ $(TAO_ROOT)/tao/PortableServer/Default_Policy_Validator.h \
+ $(TAO_ROOT)/tao/PortableServer/Policy_Validator.h \
+ $(TAO_ROOT)/tao/PortableServer/POA_Policy_Set.h \
+ $(TAO_ROOT)/tao/PortableServer/POA_Policies.h \
+ $(TAO_ROOT)/tao/PortableServer/POA_Policies.i \
+ $(TAO_ROOT)/tao/Policy_Set.h \
+ $(TAO_ROOT)/tao/Policy_Set.i \
+ $(TAO_ROOT)/tao/PortableServer/POA_Policy_Set.i \
+ $(TAO_ROOT)/tao/PortableServer/Object_Adapter.i \
+ $(TAO_ROOT)/tao/PortableServer/Operation_Table.h \
+ $(TAO_ROOT)/tao/TAO_Server_Request.h \
+ $(TAO_ROOT)/tao/Tagged_Profile.h \
+ $(TAO_ROOT)/tao/GIOPC.h \
+ $(TAO_ROOT)/tao/GIOPC.i \
+ $(TAO_ROOT)/tao/Tagged_Profile.i \
+ $(TAO_ROOT)/tao/Service_Context.h \
+ $(TAO_ROOT)/tao/Service_Context.inl \
+ $(TAO_ROOT)/tao/PICurrent.h \
+ $(ACE_ROOT)/ace/Array_Base.h \
+ $(ACE_ROOT)/ace/Array_Base.inl \
+ $(ACE_ROOT)/ace/Array_Base.cpp \
+ $(TAO_ROOT)/tao/PICurrent.inl \
+ $(TAO_ROOT)/tao/TAO_Server_Request.i \
+ $(TAO_ROOT)/tao/ORB_Core.h \
+ $(TAO_ROOT)/tao/Policy_Manager.h \
+ $(TAO_ROOT)/tao/debug.h \
+ $(TAO_ROOT)/tao/Policy_Manager.i \
+ $(TAO_ROOT)/tao/Resource_Factory.h \
+ $(TAO_ROOT)/tao/Pluggable.h \
+ $(TAO_ROOT)/tao/Pluggable.i \
+ $(TAO_ROOT)/tao/Protocol_Factory.h \
+ $(TAO_ROOT)/tao/params.h \
+ $(TAO_ROOT)/tao/params.i \
+ $(TAO_ROOT)/tao/PolicyFactory_Registry.h \
+ $(TAO_ROOT)/tao/Parser_Registry.h \
+ $(TAO_ROOT)/tao/Parser_Registry.i \
+ $(TAO_ROOT)/tao/Service_Callbacks.h \
+ $(TAO_ROOT)/tao/Service_Callbacks.i \
+ $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \
+ $(TAO_ROOT)/tao/Fault_Tolerance_Service.i \
+ $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \
+ $(TAO_ROOT)/tao/Cleanup_Func_Registry.inl \
+ $(TAO_ROOT)/tao/Object_Ref_Table.h \
+ $(TAO_ROOT)/tao/Interceptor_List.h \
+ $(TAO_ROOT)/tao/Interceptor_List.inl \
+ $(TAO_ROOT)/tao/Protocols_Hooks.h \
+ $(ACE_ROOT)/ace/Thread_Manager.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(ACE_ROOT)/ace/Thread_Manager.i \
+ $(TAO_ROOT)/tao/ORB_Core.i \
+ $(TAO_ROOT)/tao/Stub.h \
+ $(TAO_ROOT)/tao/MProfile.h \
+ $(TAO_ROOT)/tao/Profile.h \
+ $(TAO_ROOT)/tao/Tagged_Components.h \
+ $(TAO_ROOT)/tao/CONV_FRAMEC.h \
+ $(TAO_ROOT)/tao/CONV_FRAMEC.i \
+ $(TAO_ROOT)/tao/Tagged_Components.i \
+ $(TAO_ROOT)/tao/GIOP_Message_Version.h \
+ $(TAO_ROOT)/tao/GIOP_Message_Version.inl \
+ $(TAO_ROOT)/tao/Profile.i \
+ $(TAO_ROOT)/tao/MProfile.i \
+ $(TAO_ROOT)/tao/Stub.i \
+ $(TAO_ROOT)/tao/IFR_Client_Adapter.h \
+ $(TAO_ROOT)/tao/PortableInterceptor.h \
+ $(TAO_ROOT)/tao/RequestInfo_Util.h \
+ $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.h \
+ $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.inl \
+ $(TAO_ROOT)/tao/PortableServer/ServerInterceptorAdapter.h \
+ $(TAO_ROOT)/tao/PortableServer/ServerInterceptorAdapter.inl \
+ $(ACE_ROOT)/ace/Dynamic_Service.h \
+ $(ACE_ROOT)/ace/Dynamic_Service_Base.h \
+ $(ACE_ROOT)/ace/Dynamic_Service.i \
+ $(ACE_ROOT)/ace/Dynamic_Service.cpp
+
+# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/Makefile.bor b/TAO/orbsvcs/tests/Miop/McastHello/Makefile.bor
new file mode 100644
index 00000000000..19f31a4d882
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/Makefile.bor
@@ -0,0 +1,7 @@
+#
+# $Id$
+#
+
+MAKEFILES = server.bor client.bor
+
+!include <$(ACE_ROOT)\include\makeinclude\recurse.bor>
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/McastHello.cpp b/TAO/orbsvcs/tests/Miop/McastHello/McastHello.cpp
new file mode 100644
index 00000000000..5d8fd09eec8
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/McastHello.cpp
@@ -0,0 +1,37 @@
+//
+// $Id$
+//
+#include "McastHello.h"
+
+ACE_RCSID(McastHello, McastHello, "$Id$")
+
+McastHello::McastHello (CORBA::ORB_ptr orb,
+ int instance,
+ CORBA::Boolean &status)
+ : orb_ (CORBA::ORB::_duplicate (orb)),
+ instance_ (instance),
+ status_ (status)
+{
+ // Initialize to false (failure)
+ this->status_ = 0;
+}
+
+void
+McastHello::send_forty_two (CORBA::Long forty_two TAO_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (this->status_ == 0 &&
+ forty_two == 42)
+ {
+ this->status_ = 1;
+ }
+ else
+ this->status_ = 0;
+}
+
+void
+McastHello::shutdown (TAO_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->orb_->shutdown (0 TAO_ENV_ARG_PARAMETER);
+}
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/McastHello.dsw b/TAO/orbsvcs/tests/Miop/McastHello/McastHello.dsw
new file mode 100644
index 00000000000..38b2b26d13a
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/McastHello.dsw
@@ -0,0 +1,40 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "McastHello Client"=.\client.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "McastHello Server"=.\server.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/McastHello.h b/TAO/orbsvcs/tests/Miop/McastHello/McastHello.h
new file mode 100644
index 00000000000..cabb82d60a0
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/McastHello.h
@@ -0,0 +1,53 @@
+//
+// $Id$
+//
+
+#ifndef MCASTHELLO_H
+#define MCASTHELLO_H
+#include "ace/pre.h"
+
+#include "TestS.h"
+
+#if defined (_MSC_VER)
+# if (_MSC_VER >= 1200)
+# pragma warning(push)
+# endif /* _MSC_VER >= 1200 */
+# pragma warning (disable:4250)
+#endif /* _MSC_VER */
+
+/// Implement the Test::McastHello interface
+class McastHello
+ : public virtual POA_Test::McastHello
+ , public virtual PortableServer::RefCountServantBase
+{
+public:
+ /// Constructor
+ McastHello (CORBA::ORB_ptr orb,
+ int instance,
+ CORBA::Boolean &status);
+
+ // = The skeleton methods
+ virtual void send_forty_two (CORBA::Long forty_two TAO_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void shutdown (TAO_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ /// Use an ORB reference to convert strings to objects and shutdown
+ /// the application.
+ CORBA::ORB_var orb_;
+
+ /// The instance number. (Useful when debugging multiple servants)
+ int instance_;
+
+ /// Keep track of the status of what events that we've received.
+ CORBA::Boolean &status_;
+};
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include "ace/post.h"
+#endif /* MCASTHELLO_H */
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/README b/TAO/orbsvcs/tests/Miop/McastHello/README
new file mode 100644
index 00000000000..b9b1c26edfb
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/README
@@ -0,0 +1,31 @@
+/**
+
+@page Hello Test README File
+
+ The simplest possible test for TAO. This is a very simple
+test for TAO, it can be argued that it is in fact too simple to do
+anything useful, i.e. chances are that this test will always pass.
+
+ The goals of writing this test are:
+
+- Provide a very simple, very fast 'smoke test' for ORB developers.
+ If Hello does not pass then something is extremely broken and you
+ should go back to the drawing board.
+- Provide a code base to write more complex tests
+- Rule out basic infrastructure problems: if this test does not work
+ for a user then the infrastructure (network, DNS, host
+ configuration) are more likely to be at fault than the ORB.
+- External users are often asked to send us a 'simple test' for their
+ use case, we can now point them to this test to explain what do we
+ mean by "simple".
+
+ Please refrain from "improving", extending or expanding this
+test, if you need to change
+
+ To run the test use the run_test.pl script:
+
+$ ./run_test.pl
+
+ the script returns 0 if the test was successful.
+
+*/
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/Test.idl b/TAO/orbsvcs/tests/Miop/McastHello/Test.idl
new file mode 100644
index 00000000000..b1e4c4769cf
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/Test.idl
@@ -0,0 +1,20 @@
+//
+// $Id$
+//
+
+/// Put the interfaces in a module, to avoid global namespace pollution
+module Test
+{
+ /// A very simple interface
+ interface McastHello
+ {
+ /// A method to test out a small request
+ oneway void send_forty_two (in long forty_two);
+
+ /// A method to shutdown the ORB
+ /**
+ * This method is used to simplify the test shutdown process
+ */
+ oneway void shutdown ();
+ };
+};
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/client.bor b/TAO/orbsvcs/tests/Miop/McastHello/client.bor
new file mode 100644
index 00000000000..8cbcb24dee6
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/client.bor
@@ -0,0 +1,35 @@
+#
+# $Id$
+#
+
+NAME = client
+
+TAO_IDL = $(CORE_BINDIR)\tao_idl -g $(CORE_BINDIR)\gperf.exe -Ge 1
+
+OBJFILES = \
+ $(OBJDIR)\TestC.obj \
+ $(OBJDIR)\client.obj
+
+CFLAGS = \
+ $(ACE_CFLAGS) \
+ $(TAO_CFLAGS)
+
+LIBFILES = \
+ $(ACE_LIB) \
+ $(TAO_LIB)
+
+IDLFILES = \
+ $(IDLDIR)\Test.idl
+
+CPPDIR = .
+
+IDLDIR = .
+
+!include <$(ACE_ROOT)\include\makeinclude\build_exe.bor>
+
+#
+# IDL Build rules
+#
+
+$(IDLDIR)\TestS.cpp $(IDLDIR)\TestC.cpp: $(IDLDIR)\Test.idl
+ $(TAO_IDL) $**
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/client.conf b/TAO/orbsvcs/tests/Miop/McastHello/client.conf
new file mode 100644
index 00000000000..75accdd4d58
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/client.conf
@@ -0,0 +1,2 @@
+dynamic UIPMC_Factory Service_Object * TAO_PortableGroup:_make_TAO_UIPMC_Protocol_Factory() ""
+static Resource_Factory "-ORBProtocolFactory IIOP_Factory -ORBProtocolFactory UIPMC_Factory"
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/client.cpp b/TAO/orbsvcs/tests/Miop/McastHello/client.cpp
new file mode 100644
index 00000000000..b0be073128c
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/client.cpp
@@ -0,0 +1,86 @@
+// $Id$
+
+#include "TestC.h"
+#include "ace/Get_Opt.h"
+
+ACE_RCSID(Hello, client, "$Id$")
+
+const char *ior = "file://test.ior";
+
+int
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "k:");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'k':
+ ior = get_opts.opt_arg ();
+ break;
+
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s "
+ "-k <ior> "
+ "\n",
+ argv [0]),
+ -1);
+ }
+ // Indicates sucessful parsing of the command line
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, "" TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (parse_args (argc, argv) != 0)
+ return 1;
+
+ CORBA::Object_var tmp =
+ orb->string_to_object(ior TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+
+ /* Do an unchecked narrow since there's no way to do an is_a on
+ * a multicast reference (yet...).
+ */
+ Test::McastHello_var hello =
+ Test::McastHello::_unchecked_narrow (tmp.in () TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (hello.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "Nil Test::Hello reference <%s>\n",
+ ior),
+ 1);
+ }
+
+ hello->send_forty_two (42 TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ hello->shutdown (TAO_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ orb->destroy (TAO_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Exception caught:");
+ return 1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/client.dsp b/TAO/orbsvcs/tests/Miop/McastHello/client.dsp
new file mode 100644
index 00000000000..c109b51ca14
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/client.dsp
@@ -0,0 +1,200 @@
+# Microsoft Developer Studio Project File - Name="McastHello Client" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=McastHello Client - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "client.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "client.mak" CFG="McastHello Client - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "McastHello Client - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "McastHello Client - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "McastHello Client - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../../" /I "../../" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 tao.lib ace.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao"
+
+!ELSEIF "$(CFG)" == "McastHello Client - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../../" /I "../../" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 taod.lib aced.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\ace" /libpath:"..\..\tao"
+
+!ENDIF
+
+# Begin Target
+
+# Name "McastHello Client - Win32 Release"
+# Name "McastHello Client - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter ".cpp"
+# Begin Source File
+
+SOURCE=.\client.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestC.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter ""
+# End Group
+# Begin Group "IDL Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\Test.idl
+
+!IF "$(CFG)" == "McastHello Client - Win32 Release"
+
+# PROP Ignore_Default_Tool 1
+USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler
+InputPath=.\Test.idl
+InputName=Test
+
+BuildCmds= \
+ ..\..\..\bin\Release\tao_idl -Ge 1 $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "McastHello Client - Win32 Debug"
+
+USERDEP__TEST_="..\..\..\bin\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler
+InputPath=.\Test.idl
+InputName=Test
+
+BuildCmds= \
+ ..\..\..\bin\tao_idl -Ge 1 $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "Inline Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\TestC.i
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/run_test.pl b/TAO/orbsvcs/tests/Miop/McastHello/run_test.pl
new file mode 100755
index 00000000000..d8fb7b37a5d
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/run_test.pl
@@ -0,0 +1,54 @@
+eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
+ & eval 'exec perl -S $0 $argv:q'
+ if 0;
+
+# $Id$
+# -*- perl -*-
+
+use lib '../../../../../bin';
+use PerlACE::Run_Test;
+
+$iorfile = PerlACE::LocalFile ("server.ior");
+unlink $iorfile;
+$status = 0;
+
+$server_conf = PerlACE::LocalFile ("server.conf");
+$client_conf = PerlACE::LocalFile ("client.conf");
+
+$SV1 = new PerlACE::Process ("server", "-o $iorfile -ORBsvcconf $server_conf");
+$SV2 = new PerlACE::Process ("server", "-o $iorfile -ORBsvcconf $server_conf");
+$CL = new PerlACE::Process ("client", " -k file://$iorfile -ORBsvcconf $client_conf");
+
+$SV1->Spawn ();
+$SV2->Spawn ();
+
+if (PerlACE::waitforfile_timed ($iorfile, 5) == -1) {
+ print STDERR "ERROR: cannot find file <$iorfile>\n";
+ $SV->Kill (); $SV->TimedWait (1);
+ exit 1;
+}
+
+$client = $CL->SpawnWaitKill (300);
+
+if ($client != 0) {
+ print STDERR "ERROR: client returned $client\n";
+ $status = 1;
+}
+
+$server = $SV1->WaitKill (10);
+
+if ($server != 0) {
+ print STDERR "ERROR: server returned $server\n";
+ $status = 1;
+}
+
+$server = $SV2->WaitKill (10);
+
+if ($server != 0) {
+ print STDERR "ERROR: server returned $server\n";
+ $status = 1;
+}
+
+unlink $iorfile;
+
+exit $status;
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/server.bor b/TAO/orbsvcs/tests/Miop/McastHello/server.bor
new file mode 100644
index 00000000000..5204a88bd8e
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/server.bor
@@ -0,0 +1,39 @@
+#
+# $Id$
+#
+
+NAME = server
+
+TAO_IDL = $(CORE_BINDIR)\tao_idl -g $(CORE_BINDIR)\gperf.exe -Ge 1
+
+OBJFILES = \
+ $(OBJDIR)\TestC.obj \
+ $(OBJDIR)\TestS.obj \
+ $(OBJDIR)\McastHello.obj \
+ $(OBJDIR)\server.obj
+
+CFLAGS = \
+ $(ACE_CFLAGS) \
+ $(TAO_CFLAGS) \
+ $(TAO_PORTABLESERVER_CFLAGS)
+
+LIBFILES = \
+ $(ACE_LIB) \
+ $(TAO_LIB) \
+ $(TAO_PORTABLESERVER_LIB)
+
+IDLFILES = \
+ $(IDLDIR)\Test.idl
+
+CPPDIR = .
+
+IDLDIR = .
+
+!include <$(ACE_ROOT)\include\makeinclude\build_exe.bor>
+
+#
+# IDL Build rules
+#
+
+$(IDLDIR)\TestS.cpp $(IDLDIR)\TestC.cpp: $(IDLDIR)\Test.idl
+ $(TAO_IDL) $**
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/server.conf b/TAO/orbsvcs/tests/Miop/McastHello/server.conf
new file mode 100644
index 00000000000..b2dc0ba9a95
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/server.conf
@@ -0,0 +1,3 @@
+dynamic UIPMC_Factory Service_Object * TAO_PortableGroup:_make_TAO_UIPMC_Protocol_Factory() ""
+static Resource_Factory "-ORBProtocolFactory IIOP_Factory -ORBProtocolFactory UIPMC_Factory"
+static PortableGroup_Loader ""
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/server.cpp b/TAO/orbsvcs/tests/Miop/McastHello/server.cpp
new file mode 100644
index 00000000000..f93088d78e2
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/server.cpp
@@ -0,0 +1,136 @@
+// $Id$
+
+#include "McastHello.h"
+#include "ace/Get_Opt.h"
+#include "tao/orbsvcs/orbsvcs/PortableGroupC.h" // Include to pull in PortableGroup library.
+
+ACE_RCSID (McastHello,
+ server,
+ "$Id$")
+
+static const char *ior_output_file = "test.ior";
+static const char *group_ior = "corbaloc:miop:1.0@1.0-TestDomain-1/225.1.1.225:1234";
+
+int
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "o:");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'o':
+ ior_output_file = get_opts.opt_arg ();
+ break;
+
+ case 'g':
+ group_ior = get_opts.opt_arg ();
+ break;
+
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s "
+ "-o <iorfile>"
+ "-g <group ior corbaloc>"
+ "\n",
+ argv [0]),
+ -1);
+ }
+ // Indicates sucessful parsing of the command line
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, "" TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Object_var poa_object =
+ orb->resolve_initial_references("RootPOA" TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ PortableServer::POA_var root_poa =
+ PortableServer::POA::_narrow (poa_object.in () TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (root_poa.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Panic: nil RootPOA\n"),
+ 1);
+
+ PortableServer::POAManager_var poa_manager =
+ root_poa->the_POAManager (TAO_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (parse_args (argc, argv) != 0)
+ return 1;
+
+ // Get the group IOR.
+ CORBA::String_var ior = CORBA::string_dup (group_ior);
+ CORBA::Object_var group1 =
+ orb->string_to_object (ior TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Output the Group IOR to the <ior_output_file>
+ FILE *output_file= ACE_OS::fopen (ior_output_file, "w");
+ if (output_file == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot open output file for writing IOR: %s",
+ ior_output_file),
+ 1);
+ ACE_OS::fprintf (output_file, "%s", ior.in ());
+ ACE_OS::fclose (output_file);
+
+ PortableServer::ObjectId_var id =
+ root_poa->create_id_for_reference (group1
+ TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Create and activate an instance of our servant.
+ CORBA::Boolean servant0_status = 0;
+ McastHello server_impl (orb.in (), 0, servant0_status);
+
+ root_poa->activate_object_with_id (id,
+ &server_impl
+ TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+
+ poa_manager->activate (TAO_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ orb->run (TAO_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) server - event loop finished\n"));
+
+ root_poa->destroy (1, 1 TAO_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ orb->destroy (TAO_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Validate that our servants got the right requests.
+ if (servant0_status == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Multicast Servant did not receive expected requests!"),
+ 1);
+ else
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) server - Success!\n"));
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Exception caught:");
+ return 1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
diff --git a/TAO/orbsvcs/tests/Miop/McastHello/server.dsp b/TAO/orbsvcs/tests/Miop/McastHello/server.dsp
new file mode 100644
index 00000000000..4b5cf8885c2
--- /dev/null
+++ b/TAO/orbsvcs/tests/Miop/McastHello/server.dsp
@@ -0,0 +1,216 @@
+# Microsoft Developer Studio Project File - Name="McastHello Server" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=McastHello Server - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "server.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "server.mak" CFG="McastHello Server - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "McastHello Server - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "McastHello Server - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "McastHello Server - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../../" /I "../../" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ace.lib TAO.lib TAO_PortableServer.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer"
+
+!ELSEIF "$(CFG)" == "McastHello Server - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../../" /I "../../" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 aced.lib TAOd.lib TAO_PortableServerd.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer"
+
+!ENDIF
+
+# Begin Target
+
+# Name "McastHello Server - Win32 Release"
+# Name "McastHello Server - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter ".cpp"
+# Begin Source File
+
+SOURCE=.\McastHello.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\server.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestC.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestS.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter ".h"
+# Begin Source File
+
+SOURCE=.\McastHello.h
+# End Source File
+# End Group
+# Begin Group "IDL Files"
+
+# PROP Default_Filter ".idl"
+# Begin Source File
+
+SOURCE=.\Test.idl
+
+!IF "$(CFG)" == "McastHello Server - Win32 Release"
+
+# PROP Ignore_Default_Tool 1
+USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler
+InputPath=.\Test.idl
+InputName=Test
+
+BuildCmds= \
+ ..\..\..\bin\Release\tao_idl -Ge 1 $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "McastHello Server - Win32 Debug"
+
+USERDEP__TEST_="..\..\..\bin\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler
+InputPath=.\Test.idl
+InputName=Test
+
+BuildCmds= \
+ ..\..\..\bin\tao_idl -Ge 1 $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "Inline Files"
+
+# PROP Default_Filter ".i"
+# Begin Source File
+
+SOURCE=.\TestC.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestS.i
+# End Source File
+# End Group
+# End Target
+# End Project