LTP GCOV extension - code coverage report
Current view: directory - src/cpp/dev/idlc/back/lang_cpp - lang_cpp.cpp
Test: YAORB-0.2.info
Date: 2006-02-27 Instrumented lines: 1513
Code covered: 83.4 % Executed lines: 1262

       1                 : //==============================================================================
       2                 : // File <$/src/cpp/dev/idlc/back/lang_cpp/lang_cpp.cpp>
       3                 : // This file is part of YaOrb : Yet Another Object Request Broker,
       4                 : // Copyright (c) 2000-2003, 2006, Marc Alff.
       5                 : //
       6                 : // This program is free software; you can redistribute it and/or
       7                 : // modify it under the terms of the GNU General Public License
       8                 : // as published by the Free Software Foundation; either version 2
       9                 : // of the License, or (at your option) any later version.
      10                 : //
      11                 : // This program is distributed in the hope that it will be useful,
      12                 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 : // GNU General Public License for more details.
      15                 : //
      16                 : // You should have received a copy of the GNU General Public License
      17                 : // along with this program; if not, write to the Free Software
      18                 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
      19                 : //
      20                 : //==============================================================================
      21                 : 
      22                 : // Portability
      23                 : #include "yaorb/config.h"
      24                 : #include "src/cpp/prod/port/port_stdc.h"
      25                 : 
      26                 : #include <stdlib.h>
      27                 : #include <fstream>
      28                 : #include <ctype.h>
      29                 : 
      30                 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
      31                 : 
      32                 : #include "src/cpp/prod/tool/Assert.h"
      33                 : 
      34                 : #include "src/cpp/dev/idlc/sym_tab.h"
      35                 : #include "src/cpp/dev/idlc/all_symbols.h"
      36                 : #include "src/cpp/dev/idlc/interface.h"
      37                 : #include "src/cpp/dev/idlc/native.h"
      38                 : #include "src/cpp/dev/idlc/attribute.h"
      39                 : #include "src/cpp/dev/idlc/struct.h"
      40                 : #include "src/cpp/dev/idlc/exception.h"
      41                 : #include "src/cpp/dev/idlc/struct_member.h"
      42                 : #include "src/cpp/dev/idlc/enum.h"
      43                 : #include "src/cpp/dev/idlc/enum_item.h"
      44                 : #include "src/cpp/dev/idlc/operation.h"
      45                 : #include "src/cpp/dev/idlc/typedef.h"
      46                 : #include "src/cpp/dev/idlc/idl_type.h"
      47                 : #include "src/cpp/dev/idlc/value.h"
      48                 : #include "src/cpp/dev/idlc/char_value.h"
      49                 : #include "src/cpp/dev/idlc/wchar_value.h"
      50                 : #include "src/cpp/dev/idlc/int_value.h"
      51                 : #include "src/cpp/dev/idlc/string_value.h"
      52                 : #include "src/cpp/dev/idlc/wstring_value.h"
      53                 : #include "src/cpp/dev/idlc/yyutils.h"
      54                 : #include "src/cpp/dev/idlc/back/lang_cpp/lang_cpp.h"
      55                 : #include "src/cpp/dev/idlc/back/lang_cpp/info.h"
      56                 : 
      57                 : // since ostream and endl is used **so much** ...
      58                 : // This setting is private to this file though
      59                 : using namespace std ;
      60                 : 
      61              33 : const String LangCpp::_tab("   ") ;
      62                 : 
      63               0 : static void PrintNiceChar(char c, ostream& str)
      64                 : {
      65               0 :    switch(c)
      66                 :    {
      67                 :       case '\n' :
      68                 :       {
      69               0 :          str << "\\n" ;
      70               0 :          break ;
      71                 :       }
      72                 :       case '\t' :
      73                 :       {
      74               0 :          str << "\\t" ;
      75               0 :          break ;
      76                 :       }
      77                 :       case '\v' :
      78                 :       {
      79               0 :          str << "\\v" ;
      80               0 :          break ;
      81                 :       }
      82                 :       case '\b' :
      83                 :       {
      84               0 :          str << "\\b" ;
      85               0 :          break ;
      86                 :       }
      87                 :       case '\r' :
      88                 :       {
      89               0 :          str << "\\r" ;
      90               0 :          break ;
      91                 :       }
      92                 :       case '\f' :
      93                 :       {
      94               0 :          str << "\\f" ;
      95               0 :          break ;
      96                 :       }
      97                 :       case '\a' :
      98                 :       {
      99               0 :          str << "\\a" ;
     100               0 :          break ;
     101                 :       }
     102                 :       case '\\' :
     103                 :       {
     104               0 :          str << "\\\\" ;
     105               0 :          break ;
     106                 :       }
     107                 :       case '\'' :
     108                 :       {
     109               0 :          str << "\\\'" ;
     110               0 :          break ;
     111                 :       }
     112                 :       case '\"' :
     113                 :       {
     114               0 :          str << "\\\"" ;
     115               0 :          break ;
     116                 :       }
     117                 :       default :
     118                 :       {
     119               0 :          if (isprint(c))
     120                 :          {
     121               0 :             str << c ;
     122                 :          }
     123                 :          else
     124                 :          {
     125                 :             char buf[5] ;
     126               0 :             sprintf (buf, "\\x%02x", c) ;
     127               0 :             str << buf ;
     128                 :          }
     129                 :       }
     130                 :    }
     131                 : }
     132                 : 
     133              28 : LangCpp::LangCpp()
     134                 : :
     135                 :    _H(),
     136                 :    _Cpp(),
     137                 :    _StubH(),
     138                 :    _StubCpp(),
     139                 :    _SkelH(),
     140                 :    _SkelCpp(),
     141                 :    _generateModuleName(),
     142                 :    _generateModuleOption(false),
     143                 :    _outputFileName(),
     144              28 :    _outputDirName()
     145                 : {
     146               0 : }
     147                 : 
     148              28 : LangCpp::~LangCpp()
     149              28 : {}
     150                 : 
     151           11071 : CppInfo* LangCpp::GetCppInfo(Symbol *s)
     152                 : {
     153                 :    ASSERT(s != NULL) ;
     154           11071 :    CppInfo *result = (CppInfo*) s->GetHook() ;
     155           11071 :    if (result == NULL)
     156                 :    {
     157             685 :       result = new CppInfo(s) ;
     158             685 :       s->SetHook(result) ;
     159                 :    }
     160                 :    return result ;
     161                 : }
     162                 : 
     163            2023 : void LangCpp::SetCppInfo(Symbol *s, CppInfo *i)
     164                 : {
     165                 :    ASSERT(s != NULL) ;
     166                 :    ASSERT(i != NULL) ;
     167            2023 :    s->SetHook(i) ;
     168                 : }
     169                 : 
     170             232 : ostream& LangCpp::Tabulate(ostream& str, int level)
     171                 : {
     172             536 :    while (level > 0)
     173                 :    {
     174             304 :       str << _tab ;
     175                 :       level-- ;
     176                 :    }
     177                 : 
     178                 :    return str ;
     179                 : }
     180                 : 
     181              27 : void LangCpp::SetGenerateOption(const String& module)
     182                 : {
     183              27 :    _generateModuleOption = true ;
     184              27 :    _generateModuleName = module ;
     185                 : }
     186                 : 
     187              28 : void LangCpp::SetOutputFile(const String& filename)
     188                 : {
     189              28 :    _outputFileName = filename ;
     190                 : }
     191                 : 
     192              28 : void LangCpp::SetOutputDir(const String& dirname)
     193                 : {
     194              28 :    _outputDirName = dirname ;
     195                 : }
     196                 : 
     197              28 : void LangCpp::Headers(void)
     198                 : {
     199                 :    static const char* text[] =
     200                 :    {
     201                 : "",
     202                 : "// This file was automatically generated by YaOrb IDL->C++ compiler.",
     203                 : "// DO NOT EDIT !",
     204                 : "",
     205                 : NULL
     206                 :    } ;
     207                 : 
     208              28 :    _H.PrintText(text) ;
     209              28 :    _Cpp.PrintText(text) ;
     210              28 :    _StubH.PrintText(text) ;
     211              28 :    _StubCpp.PrintText(text) ;
     212              28 :    _SkelH.PrintText(text) ;
     213              28 :    _SkelCpp.PrintText(text) ;
     214                 : 
     215                 :    return ;
     216                 : }
     217                 : 
     218            2239 : String LangCpp::Prefix(const String& idlFullName)
     219                 : {
     220                 :    // extract A::B::C from A::B::C::Z
     221                 : 
     222            2239 :    String result ;
     223                 : 
     224            2239 :    char *tmp = strdup(idlFullName) ;
     225            2239 :    char *end = tmp + strlen(tmp) ;
     226                 : 
     227            4478 :    while ((tmp <= end) && (*end != ':')) end-- ; // Eat Z
     228                 : 
     229                 :    ASSERT(tmp +1 <= end) ;
     230                 :    end -- ; // eat "::"
     231                 : 
     232            2239 :    *end = '\0' ;
     233                 : 
     234            2239 :    result = tmp ;
     235            2239 :    free(tmp) ;
     236                 : 
     237               0 :    return result ;
     238                 : }
     239                 : 
     240              28 : void LangCpp::GenerateCode(SymbolTable *symTab)
     241                 : {
     242              28 :    CppInfo _info (_outputFileName) ;
     243                 : 
     244              28 :    String name_h = _info._cppName ;
     245              28 :    String name_cpp = _info._cppName ;
     246              28 :    name_h += ".h" ;
     247              28 :    name_cpp += ".cpp" ;
     248                 : 
     249              28 :    String stub_name_h = _info._cppStubName ;
     250              28 :    String stub_name_cpp = _info._cppStubName ;
     251              28 :    stub_name_h += ".h" ;
     252              28 :    stub_name_cpp += ".cpp" ;
     253                 : 
     254              28 :    String skel_name_h = _info._cppSkelName ;
     255              28 :    String skel_name_cpp = _info._cppSkelName ;
     256              28 :    skel_name_h += ".h" ;
     257              28 :    skel_name_cpp += ".cpp" ;
     258                 : 
     259              28 :    _H.open(_outputDirName, name_h) ;
     260              28 :    _Cpp.open(_outputDirName, name_cpp) ;
     261              28 :    _StubH.open(_outputDirName, stub_name_h) ;
     262              28 :    _StubCpp.open(_outputDirName, stub_name_cpp) ;
     263              28 :    _SkelH.open(_outputDirName, skel_name_h) ;
     264              28 :    _SkelCpp.open(_outputDirName, skel_name_cpp) ;
     265                 : 
     266              28 :    Headers() ;
     267                 : 
     268              28 :    _H.Tab() << "#ifndef __" << _outputFileName << "_H" << endl ;
     269              28 :    _H.Tab() << "#define __" << _outputFileName << "_H" << endl ;
     270              28 :    _H.Tab() << endl ;
     271                 : 
     272              28 :    _Cpp.Tab() << "#include <stdio.h>" << endl ;
     273              28 :    _Cpp.Tab() << "#include <yaorb/CORBA.h>" << endl ;
     274              28 :    _Cpp.Tab() << "#include <yaorb/YAORB.h>" << endl ;
     275              28 :    _Cpp.Tab() << "#include \"" << name_h << "\"" << endl << endl ;
     276                 : 
     277              28 :    _StubH.Tab() << "#ifndef __" << _outputFileName << "_STUB_H" << endl ;
     278              28 :    _StubH.Tab() << "#define __" << _outputFileName << "_STUB_H" << endl ;
     279              28 :    _StubH.Tab() << "#include \"" << name_h << "\"" << endl << endl ;
     280                 : 
     281              28 :    _StubCpp.Tab() << "#include <yaorb/CORBA.h>" << endl ;
     282              28 :    _StubCpp.Tab() << "#include <yaorb/YAORB.h>" << endl ;
     283              28 :    _StubCpp.Tab() << "#include \"" << stub_name_h << "\"" << endl << endl ;
     284                 : 
     285              28 :    _SkelH.Tab() << "#ifndef __" << _outputFileName << "_SKEL_H" << endl ;
     286              28 :    _SkelH.Tab() << "#define __" << _outputFileName << "_SKEL_H" << endl ;
     287              28 :    _SkelH.Tab() << "#include \"" << name_h << "\"" << endl << endl ;
     288                 : 
     289              28 :    _SkelCpp.Tab() << "#include <yaorb/CORBA.h>" << endl ;
     290              28 :    _SkelCpp.Tab() << "#include <yaorb/YAORB.h>" << endl ;
     291              28 :    _SkelCpp.Tab() << "#include \"" << skel_name_h << "\"" << endl << endl ;
     292                 : 
     293              28 :    GenerateContextForwardDecl(symTab, false) ;
     294              28 :    GenerateContextDecl(symTab, false) ;
     295              28 :    GenerateContextImpl(symTab, false) ;
     296                 : 
     297              28 :    _SkelH.Tab() << "#endif" << endl ;
     298                 : 
     299              28 :    _StubH.Tab() << "#endif" << endl ;
     300                 : 
     301              28 :    _H.Tab() << "#endif" << endl ;
     302                 : 
     303              28 :    _H.close() ;
     304              28 :    _Cpp.close() ;
     305              28 :    _StubH.close() ;
     306              28 :    _StubCpp.close() ;
     307              28 :    _SkelH.close() ;
     308              28 :    _SkelCpp.close() ;
     309                 : }
     310                 : 
     311                 : void LangCpp::GenerateContextDecl(
     312                 :    SymbolContainer *symTab,
     313             251 :    bool pseudo)
     314                 : {
     315             251 :    const SymbolList& symbols = symTab->GetLocalSymbols() ;
     316                 :    Symbol *symbol = NULL ;
     317                 :    SymbolListIt it(symbols) ;
     318             251 :    String name ;
     319             251 :    int len = strlen(_generateModuleName) ;
     320                 : 
     321            1831 :    while (it.GetNext())
     322                 :    {
     323                 :       symbol = it.GetItem() ;
     324                 : 
     325            1329 :       if (_generateModuleOption == true)
     326                 :       {
     327            1029 :          name = symbol->GetFullyQualifiedName() ;
     328                 : 
     329                 :          // If the symbol is in the module to generate ...
     330            1029 :          if (strncmp(name, _generateModuleName, len) == 0)
     331                 :          {
     332             987 :             GenerateOneSymbolDecl(symTab, symbol, pseudo) ;
     333                 :          }
     334                 :       }
     335                 :       else
     336                 :       {
     337             300 :          GenerateOneSymbolDecl(symTab, symbol, pseudo) ;
     338                 :       }
     339               0 :    }
     340                 : }
     341                 : 
     342             251 : void LangCpp::GenerateContextImpl(SymbolContainer *symTab, bool pseudo)
     343                 : {
     344             251 :    const SymbolList& symbols = symTab->GetLocalSymbols() ;
     345                 :    Symbol *symbol = NULL ;
     346                 :    SymbolListIt it(symbols) ;
     347             251 :    String name ;
     348             251 :    int len = strlen(_generateModuleName) ;
     349                 : 
     350            1831 :    while (it.GetNext())
     351                 :    {
     352                 :       symbol = it.GetItem() ;
     353                 : 
     354            1329 :       if (_generateModuleOption == true)
     355                 :       {
     356            1029 :          name = symbol->GetFullyQualifiedName() ;
     357                 : 
     358                 :          // If the symbol is in the module to generate ...
     359            1029 :          if (strncmp(name, _generateModuleName, len) == 0)
     360                 :          {
     361             987 :             GenerateOneSymbolImpl(symTab, symbol, pseudo) ;
     362                 :          }
     363                 :       }
     364                 :       else
     365                 :       {
     366             300 :          GenerateOneSymbolImpl(symTab, symbol, pseudo) ;
     367                 :       }
     368               0 :    }
     369                 : }
     370                 : 
     371                 : void LangCpp::GenerateContextForwardDecl(
     372                 :    SymbolContainer *symTab,
     373             251 :    bool pseudo)
     374                 : {
     375             251 :    const SymbolList& symbols = symTab->GetLocalSymbols() ;
     376                 :    Symbol *symbol = NULL ;
     377                 :    Interface *interface = NULL ;
     378                 :    SymbolListIt it(symbols) ;
     379                 : 
     380            1831 :    while (it.GetNext())
     381                 :    {
     382                 :       symbol = it.GetItem() ;
     383                 : 
     384            1329 :       if (symbol->GetClass() == interfaceSymbol)
     385                 :       {
     386                 :          interface = (Interface*) symbol ;
     387             196 :          GenerateInterfaceForwardDecl(symTab, interface, pseudo) ;
     388                 :       }
     389                 :    }
     390                 : }
     391                 : 
     392                 : void LangCpp::GenerateOneSymbolDecl(
     393                 :    SymbolContainer *symTab,
     394                 :    Symbol *symbol,
     395            1287 :    bool pseudo)
     396                 : {
     397            1287 :    switch(symbol->GetClass())
     398                 :    {
     399                 :       case moduleSymbol:
     400                 :       {
     401                 :          Module *m = (Module*) symbol ;
     402              27 :          GenerateModuleDecl(symTab, m) ;
     403                 :          break ;
     404                 :       }
     405                 :       case interfaceSymbol :
     406                 :       {
     407                 :          Interface *i = (Interface*) symbol ;
     408             196 :          GenerateInterfaceDecl(symTab, i) ;
     409                 :          break ;
     410                 :       }
     411                 :       case attributeSymbol :
     412                 :       {
     413                 :          Attribute *a = (Attribute*) symbol ;
     414              94 :          GenerateAttributeDecl(symTab, a, pseudo) ;
     415                 :          break ;
     416                 :       }
     417                 :       case operationSymbol :
     418                 :       {
     419                 :          Operation *o = (Operation*) symbol ;
     420             565 :          GenerateOperationDecl(symTab, o, pseudo) ;
     421                 :          break ;
     422                 :       }
     423                 :       case parameterSymbol :
     424                 :       {
     425               0 :          NON_DEV("GenerateOneSymbolDecl") ;
     426                 :          break ;
     427                 :       }
     428                 :       case typedefSymbol :
     429                 :       {
     430                 :          Typedef *t = (Typedef*) symbol ;
     431              69 :          GenerateTypedefDecl(symTab, t) ;
     432                 :          break ;
     433                 :       }
     434                 :       case structSymbol :
     435                 :       {
     436                 :          Struct *s = (Struct*) symbol ;
     437              42 :          GenerateStructDecl(symTab, s, pseudo) ;
     438                 :          break ;
     439                 :       }
     440                 :       case memberSymbol :
     441                 :       {
     442                 :          // Nothing ! GenerateStructDecl will take care of the member
     443                 :          break ;
     444                 :       }
     445                 :       case unionSymbol :
     446                 :       {
     447               0 :          NON_DEV("GenerateOneSymbolDecl") ;
     448                 :          break ;
     449                 :       }
     450                 :       case constantSymbol :
     451                 :       {
     452                 :          Constant *c = (Constant*) symbol ;
     453              13 :          GenerateConstantDecl(symTab, c) ;
     454                 :          break ;
     455                 :       }
     456                 :       case enumSymbol :
     457                 :       {
     458                 :          Enum *e = (Enum*) symbol ;
     459              31 :          GenerateEnumDecl(symTab, e, pseudo) ;
     460                 :          break ;
     461                 :       }
     462                 :       case enumItemSymbol :
     463                 :       {
     464                 :          // Nothing ! GenerateEnumDecl will take care of the enum
     465                 :          break ;
     466                 :       }
     467                 :       case exceptionSymbol :
     468                 :       {
     469                 :          Exception *e = (Exception*) symbol ;
     470              76 :          GenerateExceptionDecl(symTab, e) ;
     471                 :          break ;
     472                 :       }
     473                 :       case nativeSymbol :
     474                 :       {
     475                 :          SymNative *native = (SymNative*) symbol ;
     476               2 :          GenerateNativeDecl(native) ;
     477                 :          break ;
     478                 :       }
     479                 :    }
     480                 : }
     481                 : 
     482                 : void LangCpp::GenerateOneSymbolImpl(
     483                 :    SymbolContainer *symTab,
     484                 :    Symbol *symbol,
     485            1287 :    bool pseudo)
     486                 : {
     487            1287 :    switch(symbol->GetClass())
     488                 :    {
     489                 :       case moduleSymbol:
     490                 :       {
     491                 :          Module *m = (Module*) symbol ;
     492              27 :          GenerateModuleImpl(symTab, m) ;
     493                 :          break ;
     494                 :       }
     495                 :       case interfaceSymbol :
     496                 :       {
     497                 :          Interface *i = (Interface*) symbol ;
     498             196 :          GenerateInterfaceImpl(symTab, i) ;
     499                 :          break ;
     500                 :       }
     501                 :       case attributeSymbol :
     502                 :       {
     503              94 :          if ( ! pseudo)
     504                 :          {
     505                 :             Attribute *a = (Attribute*) symbol ;
     506              89 :             GenerateAttributeImpl(symTab, a) ;
     507                 :          }
     508                 :          break ;
     509                 :       }
     510                 :       case operationSymbol :
     511                 :       {
     512             565 :          if ( ! pseudo)
     513                 :          {
     514                 :             Operation *o = (Operation*) symbol ;
     515             492 :             GenerateOperationImpl(symTab, o) ;
     516                 :          }
     517                 :          break ;
     518                 :       }
     519                 :       case parameterSymbol :
     520                 :       {
     521               0 :          NON_DEV("GenerateParameterImpl") ;
     522                 :          break ;
     523                 :       }
     524                 :       case typedefSymbol :
     525                 :       {
     526                 :          // Nothing !
     527                 :          break ;
     528                 :       }
     529                 :       case structSymbol :
     530                 :       {
     531                 :          Struct *s = (Struct*) symbol ;
     532              42 :          GenerateStructImpl(symTab, s, pseudo) ;
     533                 :          break ;
     534                 :       }
     535                 :       case memberSymbol :
     536                 :       {
     537                 :          // Nothing ! GenerateStructImpl will take care of the member
     538                 :          break ;
     539                 :       }
     540                 :       case unionSymbol :
     541                 :       {
     542               0 :          NON_DEV("GenerateUnionImpl") ;
     543                 :          break ;
     544                 :       }
     545                 :       case constantSymbol :
     546                 :       {
     547              13 :          NON_DEV("GenerateConstantImpl") ;
     548                 :          break ;
     549                 : 
     550                 : //         Constant *c = (Constant*) symbol ;
     551                 : //         GenerateConstantImpl(symTab, c) ;
     552                 : //         break ;
     553                 :       }
     554                 :       case enumSymbol :
     555                 :       {
     556                 :          Enum *e = (Enum*) symbol ;
     557              31 :          GenerateEnumImpl(symTab, e, pseudo) ;
     558                 :          break ;
     559                 :       }
     560                 :       case enumItemSymbol :
     561                 :       {
     562                 :          // Nothing ! GenerateEnumDecl will take care of the enum
     563                 :          break ;
     564                 :       }
     565                 :       case exceptionSymbol :
     566                 :       {
     567                 :          Exception *e = (Exception*) symbol ;
     568              76 :          GenerateExceptionImpl(symTab, e) ;
     569                 :          break ;
     570                 :       }
     571                 :       case nativeSymbol :
     572                 :       {
     573                 :          // NOTHING !
     574                 :          break ;
     575                 :       }
     576                 :    }
     577                 : }
     578                 : 
     579                 : void LangCpp::GenerateModuleDecl(
     580                 :    SymbolContainer *symTab,
     581              27 :    Module *module)
     582                 : {
     583              27 :    CppInfo *info = new CppInfo(module) ;
     584              27 :    SetCppInfo(module, info) ;
     585                 : 
     586              27 :    const String& name = module->GetName() ;
     587                 : 
     588                 :    //=============================== H_STUB, Part 1 ============================
     589                 :    // namespace Module_Stub
     590                 :    // {
     591                 :    //    << CONTENT >>
     592                 : 
     593              27 :    _StubH.Tab() << "namespace " << info->_cppStubName << endl ;
     594              27 :    _StubH.Tab() << "{" << endl ;
     595              27 :    _StubH.IncTab() ;
     596                 : 
     597                 :    //=============================== H_SKEL, Part 1 ============================
     598                 :    // namespace POA_Module
     599                 :    // {
     600                 :    //    << CONTENT >>
     601                 : 
     602              27 :    _SkelH.Tab() << "namespace " << info->_cppSkelName << endl ;
     603              27 :    _SkelH.Tab() << "{" << endl ;
     604              27 :    _SkelH.IncTab() ;
     605                 : 
     606                 :    //=============================== H, Part 1 =================================
     607                 :    // namespace Module
     608                 :    // {
     609                 :    //    << CONTENT >>
     610                 : 
     611              27 :    _H.Tab() << "namespace " << info->_cppName << endl ;
     612              27 :    _H.BeginBloc() ;
     613                 : 
     614                 :    //=============================== CONTENT ===================================
     615                 : 
     616              27 :    Context *c = symTab->findLocalContext(name) ;
     617                 :    ASSERT(c != NULL) ;
     618              27 :    GenerateContextForwardDecl(c, false) ;
     619              27 :    GenerateContextDecl(c, false) ;
     620                 : 
     621                 :    //=============================== H, Part 2 =================================
     622                 :    //    << CONTENT >>
     623                 :    // }
     624                 : 
     625              27 :    _H.EndBloc() ;
     626                 : 
     627                 :    //=============================== H_SKEL, Part 2 ============================
     628                 :    //    << CONTENT >>
     629                 :    // }
     630                 : 
     631              27 :    _SkelH.DecTab() ;
     632              27 :    _SkelH.Tab() << "}" << endl << endl ;
     633                 : 
     634                 :    //=============================== H_STUB, Part 2 ============================
     635                 :    //    << CONTENT >>
     636                 :    // }
     637                 : 
     638              27 :    _StubH.DecTab() ;
     639              27 :    _StubH.Tab() << "}" << endl << endl ;
     640                 : }
     641                 : 
     642                 : void LangCpp::GenerateModuleImpl(
     643                 :    SymbolContainer *symTab,
     644              27 :    Module *module)
     645                 : {
     646              27 :    const String& name = module->GetName() ;
     647                 : 
     648              27 :    Context *c = symTab->findLocalContext(name) ;
     649                 :    ASSERT(c != NULL) ;
     650              27 :    GenerateContextImpl(c, false) ;
     651                 : }
     652                 : 
     653                 : void LangCpp::GenerateInterfaceForwardDecl(
     654                 :    SymbolContainer *symTab,
     655                 :    Interface *interface,
     656             196 :    bool pseudo)
     657                 : {
     658             196 :    CppInfo *info = new CppInfo(interface) ;
     659             196 :    SetCppInfo(interface, info) ;
     660                 : 
     661             196 :    String name_var = info->_cppName ;
     662             196 :    name_var += "_var" ;
     663             196 :    String name_ptr = info->_cppName ;
     664             196 :    name_ptr += "_ptr" ;
     665                 : 
     666                 :    //=============================== H ========================================
     667                 :    // class Foo ;
     668                 :    // typedef Foo* Foo_ptr ;
     669                 :    // typedef CORBAObjectVar<Foo> Foo_var ;
     670                 :    // 
     671                 : 
     672             196 :    _H.Tab() << "class " << info->_cppName << " ;" << endl ;
     673                 :    _H.Tab() << "typedef " << info->_cppName << "* "
     674             196 :       << name_ptr << " ;" << endl ;
     675                 : 
     676             196 :    if ( ! info->_isPseudo)
     677                 :    {
     678                 :       _H.Tab() << "typedef CORBAObjectVar<" << info->_cppName << "> "
     679             186 :          << name_var << " ;" << endl << endl ;
     680                 :    }
     681                 :    else
     682                 :    {
     683                 :       _H.Tab() << "typedef CORBAPseudoVar<" << info->_cppName << "> "
     684              10 :          << name_var << " ;" << endl << endl ;
     685               0 :    }
     686                 : 
     687                 : }
     688                 : 
     689                 : void LangCpp::GenerateInterfaceDecl(
     690                 :    SymbolContainer *symTab,
     691             196 :    Interface *interface)
     692                 : {
     693             196 :    CppInfo *info = GetCppInfo(interface) ;
     694                 : 
     695             196 :    const String& name = interface->GetName() ;
     696             196 :    String name_var = info->_cppName ;
     697             196 :    name_var += "_var" ;
     698             196 :    String name_ptr = info->_cppName ;
     699             196 :    name_ptr += "_ptr" ;
     700                 : 
     701             196 :    if (interface->IsDefined() == false)
     702                 :    {
     703               0 :       return ;
     704                 :    }
     705                 : 
     706             196 :    const InterfaceList& inherit = interface->GetInheritance() ;
     707                 :    Interface *super = NULL ;
     708                 :    CppInfo *sInfo = NULL ;
     709                 : 
     710                 :    //=============================== STUB H, part 1 ===========================
     711                 :    // class Foo_Stub :
     712                 :    //    public Module::Bar,
     713                 :    //    public YAORB::Stub
     714                 :    // {
     715                 :    //    public :
     716                 :    //       <<CONTENT>>
     717                 : 
     718             196 :    if ( ! info->_isPseudo)
     719                 :    {
     720             186 :       _StubH.Tab() << "class " << info->_cppStubName << endl ;
     721             186 :       _StubH.IncTab() ;
     722                 : 
     723             186 :       _StubH.Tab() << ": public " << info->_cppFullName ;
     724                 : 
     725             186 :       if (inherit.size() == 0)
     726                 :       {
     727              71 :          _StubH.Str() << "," << endl ;
     728              71 :          _StubH.Tab() << "public virtual YAORB::Stub" << endl ;
     729                 :       }
     730                 :       else
     731                 :       {
     732                 :          InterfaceListIt it(inherit) ;
     733             252 :          while (it.GetNext())
     734                 :          {
     735                 :             super = it.GetItem() ;
     736             137 :             sInfo = GetCppInfo(super) ;
     737                 : 
     738             137 :             _StubH.Str() << "," << endl ;
     739             137 :             _StubH.Tab() << sInfo->_cppStubFullName ;
     740                 :          }
     741             115 :          _StubH.Str() << endl ;
     742                 :       }
     743                 : 
     744             186 :       _StubH.DecTab() ;
     745                 : 
     746             186 :       _StubH.Tab() << "{" << endl ;
     747             186 :       _StubH.IncTab() ;
     748             186 :       _StubH.Tab() << "public :" << endl ;
     749             186 :       _StubH.IncTab() ;
     750                 :    }
     751                 : 
     752                 :    //=============================== SQUEL H, part 1 ==========================
     753                 :    // class POA_Foo :
     754                 :    //    public Module::Bar,
     755                 :    //    public virtual PortableServer::ServantBase
     756                 :    // {
     757                 :    //    public :
     758                 : 
     759             186 :    if ( ! info->_isPseudo)
     760                 :    {
     761                 :       // FIXME
     762             186 :       _SkelH.Tab() << "class " << info->_cppSkelName << " :" << endl ;
     763             186 :       _SkelH.IncTab() ;
     764             186 :       _SkelH.Tab() << "public " << info->_cppFullName << "," << endl ;
     765             186 :       _SkelH.Tab() << "public PortableServer::ServantBase" << endl ;
     766             186 :       _SkelH.DecTab() ;
     767                 : 
     768             186 :       _SkelH.Tab() << "{" << endl ;
     769             186 :       _SkelH.IncTab() ;
     770             186 :       _SkelH.Tab() << "public :" << endl ;
     771             186 :       _SkelH.IncTab() ;
     772                 :    }
     773                 : 
     774                 : 
     775                 :    //=============================== H, part 1 ================================
     776                 :    // class Foo : public <inheritance of Foo>
     777                 :    // {
     778                 :    //    public :
     779                 :    //       virtual ~Foo() ;
     780                 :    //       typedef Foo_ptr _ptr_type ;
     781                 :    //       typedef Foo_var _var_type ;
     782                 :    //
     783                 :    //       static Foo_ptr _duplicate(Foo_ptr obj) ;
     784                 :    //       static Foo_ptr _narrow(CORBA::Object_ptr obj) ;
     785                 :    //       static Foo_ptr _nil(void) ;
     786                 :    //       static Foo_ptr _bind(YAORB::CDR*) ;
     787                 :    //       virtual const YAORB::ClassInfo* _getInfo(void) const ;
     788                 :    //       virtual bool _isA(const YAORB::ClassInfo*, void*& that) const ;
     789                 :    //
     790                 : 
     791             196 :    _H.Tab() << "class " << info->_cppName ;
     792                 : 
     793             196 :    if (inherit.size() == 0)
     794                 :    {
     795              78 :       if ( ! info->_isPseudo)
     796                 :       {
     797              71 :          _H.Str() << " : public virtual CORBA::Object" << endl ;
     798                 :       }
     799                 :       else
     800                 :       {
     801               7 :          _H.Str() << endl ;
     802                 :       }
     803                 :    }
     804                 :    else
     805                 :    {
     806             118 :       _H.Str() << " : public " ;
     807                 : 
     808                 :       InterfaceListIt it(inherit) ;
     809                 :       bool comma = false ;
     810             258 :       while (it.GetNext())
     811                 :       {
     812                 :          super = it.GetItem() ;
     813             140 :          sInfo = GetCppInfo(super) ;
     814                 : 
     815             140 :          if (comma)
     816                 :          {
     817              22 :             _H.Str() << ", " ;
     818                 :          }
     819                 : 
     820             140 :          _H.Str() << sInfo->_cppFullName ;
     821                 :          comma = true ;
     822                 :       }
     823             118 :       _H.Str() << endl ;
     824                 :    }
     825                 : 
     826             196 :    _H.Tab() << "{" << endl ;
     827                 : 
     828             196 :    if ( info->_isPseudo)
     829                 :    {
     830              10 :       _H.IncTab() ;
     831                 :       _H.Tab() << "// GENERATED PART OF PSEUDO CLASS " << info->_cppFullName
     832              10 :          << endl ;
     833              10 :       _H.DecTab() ;
     834                 :    }
     835                 : 
     836             196 :    _H.IncTab() ;
     837             196 :    _H.Tab() << "public :" << endl ;
     838             196 :    _H.IncTab() ;
     839                 : 
     840             196 :    if ( ! info->_isPseudo)
     841                 :    {
     842             186 :       _H.Tab() << "virtual ~" << info->_cppName << "() ;" << endl ;
     843                 :    }
     844                 : 
     845             196 :    _H.Tab() << "typedef " << name_ptr << " _ptr_type ;" << endl ;
     846             196 :    _H.Tab() << "typedef " << name_var << " _var_type ;" << endl ;
     847             196 :    _H.Str() << endl ;
     848                 :    _H.Tab() << "static " << name_ptr
     849             196 :       << " _duplicate(" << name_ptr << " obj) ;" << endl ;
     850                 : 
     851             196 :    if ( ! info->_isPseudo)
     852                 :    {
     853                 :       _H.Tab() << "static " << name_ptr
     854             186 :          << " _narrow(CORBA::Object_ptr obj) ;" << endl ;
     855                 :    }
     856                 : 
     857                 :    _H.Tab() << "static " << name_ptr
     858             196 :       << " _nil(void) ;" << endl ;
     859                 : 
     860             196 :    if ( ! info->_isPseudo)
     861                 :    {
     862                 :       _H.Tab() << "static " << name_ptr
     863             186 :          << " _bind(YAORB::CDR*) ;" << endl ;
     864                 : 
     865                 :       _H.Tab() << "virtual const YAORB::ClassInfo* _getInfo(void) const ;"
     866             186 :          << endl ;
     867                 :       _H.Tab() << "virtual bool _isA"
     868             186 :          << "(const YAORB::ClassInfo*, void*& that) const ;" << endl ;
     869                 :    }
     870             196 :    _H.Str() << endl ;
     871                 : 
     872                 : 
     873                 :    //=============================== CONTENT ==================================
     874                 : 
     875             196 :    Context *c = symTab->findLocalContext(name) ;
     876                 :    ASSERT(c != NULL) ;
     877             196 :    GenerateContextForwardDecl(c, info->_isPseudo) ;
     878             196 :    GenerateContextDecl(c, info->_isPseudo) ;
     879             196 :    _H.Str() << endl ;
     880                 : 
     881                 :    //=============================== H, part 2 ================================
     882                 :    //
     883                 :    //    protected :
     884                 :    //       static const YAORB::ClassInfo _info ;
     885                 :    //
     886                 :    //       Foo() ;
     887                 :    //
     888                 :    //    private :
     889                 :    //       Foo(const Foo&) ;
     890                 :    //       Foo& operator = (const Foo&) ;
     891                 :    // } ;
     892                 : 
     893             196 :    _H.DecTab() ;
     894                 : 
     895             196 :    if ( ! info->_isPseudo)
     896                 :    {
     897             186 :       _H.Tab() << "protected :" << endl ;
     898                 : 
     899             186 :       _H.IncTab() ;
     900                 : 
     901             186 :       _H.Tab() << "static const YAORB::ClassInfo _info ;" << endl << endl ;
     902                 : 
     903             186 :       _H.Tab() << info->_cppName << "() ;" << endl << endl ;
     904             186 :       _H.DecTab() ;
     905                 :    }
     906                 : 
     907             196 :    _H.Tab() << "private :" << endl ;
     908             196 :    _H.IncTab() ;
     909                 : 
     910                 :    _H.Tab() << info->_cppName << "(const " << info->_cppName << "&) ;"
     911             196 :       << endl ;
     912                 :    _H.Tab() << info->_cppName << "& operator = (const "
     913             196 :                << info->_cppName << "&) ;" << endl ;
     914             196 :    _H.DecTab() ;
     915                 : 
     916             196 :    _H.DecTab() ;
     917                 : 
     918             196 :    if ( info->_isPseudo)
     919                 :    {
     920              10 :       _H.IncTab() ;
     921              10 :       _H.Str() << endl ;
     922                 :       _H.Tab() << "// MANUAL PART OF PSEUDO CLASS " << info->_cppFullName
     923              10 :          << endl ;
     924              10 :       _H.Str() << endl ;
     925              10 :       _H.DecTab() ;
     926                 :    }
     927                 : 
     928             196 :    _H.Tab() << "} ;" << endl << endl ;
     929                 : 
     930                 :    //=============================== SKEL H, part 2 ===========================
     931                 :    //    protected :
     932                 :    //       POA_Foo() ;
     933                 :    //
     934                 :    //    private :
     935                 :    //       static const YAORB::SkelInfo::LocalOp _localOps[] ;
     936                 :    //       static const YAORB::SkelInfo _skelInfo ;
     937                 :    //       static const YAORB::SkelInfo * _parentSkelInfo[] ;
     938                 :    //
     939                 :    //       POA_Foo(const POA_Foo&) ;
     940                 :    //       POA_Foo& operator=(const POA_Foo&) ;
     941                 :    // } ;
     942                 : 
     943             196 :    if ( ! info->_isPseudo)
     944                 :    {
     945             186 :       _SkelH.DecTab() ;
     946             186 :       _SkelH.Tab() << "protected :" << endl ;
     947             186 :       _SkelH.IncTab() ;
     948                 : 
     949             186 :       _SkelH.Tab() << info->_cppSkelName << "() ;" << endl ;
     950             186 :       _SkelH.Tab() << "~" << info->_cppSkelName << "() ;" << endl ;
     951                 : 
     952             186 :       _SkelH.DecTab() ;
     953             186 :       _SkelH.Tab() << "private :" << endl ;
     954             186 :       _SkelH.IncTab() ;
     955                 : 
     956                 :       _SkelH.Tab() << "static const YAORB::SkelInfo::LocalOp _localOps[] ;"
     957             186 :          << endl ;
     958             186 :       _SkelH.Tab() << "static const YAORB::SkelInfo _skelInfo ;" << endl ;
     959                 :       _SkelH.Tab() << "static const YAORB::SkelInfo * _parentSkelInfo[] ;"
     960             186 :          << endl ;
     961                 : 
     962                 :       _SkelH.Tab() << info->_cppSkelName
     963             186 :          << "(const " << info->_cppSkelName << "&) ;" << endl ;
     964                 :       _SkelH.Tab() << info->_cppSkelName
     965             186 :          << "& operator = (const " << info->_cppSkelName << "&) ;" << endl ;
     966             186 :       _SkelH.DecTab() ;
     967                 : 
     968             186 :       _SkelH.DecTab() ;
     969             186 :       _SkelH.Tab() << "} ;" << endl << endl ;
     970                 :    }
     971                 : 
     972                 :    //=============================== STUB H, part 2 ===========================
     973                 :    //    public :
     974                 :    //       virtual YAORB::StubInfo* getStubInfo(void) const ;
     975                 :    //       static YAORB::StubInfo _stubInfo ;
     976                 :    //       static CORBA::Object*
     977                 :    //          create(const YAORB::Ref&) ;
     978                 :    //
     979                 :    //       Foo_Stub(const YAORB::Ref&) ;
     980                 :    //
     981                 :    //    private :
     982                 :    //       Foo_Stub() ;
     983                 :    //       Foo_Stub(const Foo_Stub&) ;
     984                 :    //       Foo_Stub& operator=(const Foo_Stub&) ;
     985                 :    // } ;
     986                 : 
     987             186 :    if ( ! info->_isPseudo)
     988                 :    {
     989             186 :       _StubH.DecTab() ;
     990             186 :       _StubH.Tab() << "public :" << endl ;
     991             186 :       _StubH.IncTab() ;
     992                 :       _StubH.Tab() << "virtual YAORB::StubInfo* getStubInfo(void) const ;"
     993             186 :          << endl ;
     994             186 :       _StubH.Tab() << "static YAORB::StubInfo _stubInfo ;" << endl ;
     995                 : 
     996             186 :       _StubH.Tab() << "static CORBA::Object*" << endl ;
     997             186 :       _StubH.IncTab() ;
     998                 :       _StubH.Tab() << "create(const YAORB::Ref&) ;"
     999             186 :          << endl << endl ;
    1000             186 :       _StubH.DecTab() ;
    1001                 : 
    1002                 :       _StubH.Tab() << info->_cppStubName << "(const YAORB::Ref&) ;"
    1003             186 :         << endl << endl ;
    1004                 : 
    1005             186 :       _StubH.DecTab() ;
    1006             186 :       _StubH.Tab() << "private :" << endl ;
    1007             186 :       _StubH.IncTab() ;
    1008             186 :       _StubH.Tab() << info->_cppStubName << "() ;" << endl ;
    1009                 :       _StubH.Tab() << info->_cppStubName
    1010             186 :          << "(const " << info->_cppStubName << "&) ;" << endl ;
    1011                 :       _StubH.Tab() << info->_cppStubName
    1012             186 :          << "& operator = (const " << info->_cppStubName << "&) ;" << endl ;
    1013             186 :       _StubH.DecTab() ;
    1014                 : 
    1015             186 :       _StubH.DecTab() ;
    1016             186 :       _StubH.Tab() << "} ;" << endl << endl ;
    1017             196 :    }
    1018                 : 
    1019                 : }
    1020                 : 
    1021                 : void LangCpp::GenerateInterfaceImpl(
    1022                 :    SymbolContainer *symTab,
    1023             196 :    Interface *interface)
    1024                 : {
    1025             196 :    CppInfo *info = GetCppInfo(interface) ;
    1026                 : 
    1027             196 :    const String& name = interface->GetName() ;
    1028             196 :    String name_var = info->_cppFullName ;
    1029             196 :    name_var += "_var" ;
    1030             196 :    String name_ptr = info->_cppFullName ;
    1031             196 :    name_ptr += "_ptr" ;
    1032                 : 
    1033             196 :    if (interface->IsDefined() == false)
    1034                 :    {
    1035               0 :       return ;
    1036                 :    }
    1037                 : 
    1038             196 :    const InterfaceList& inherit = interface->GetInheritance() ;
    1039                 :    Interface *super = NULL ;
    1040                 :    CppInfo *sinfo = NULL ;
    1041                 : 
    1042                 :    //=============================== CPP ======================================
    1043                 :    // Foo::Bar::Bar()
    1044                 :    // {}
    1045                 :    //
    1046                 :    // Foo::Bar::~Bar()
    1047                 :    // {}
    1048                 :    //
    1049                 :    // Foo::Bar_ptr Foo::Bar::_duplicate(Foo::Bar_ptr obj)
    1050                 :    // {
    1051                 :    //    if (CORBA::is_nil(obj))
    1052                 :    //    {
    1053                 :    //       return _nil() ;
    1054                 :    //    }
    1055                 :    //    else
    1056                 :    //    {
    1057                 :    //       (void) CORBA::Object::_duplicate(obj) ;
    1058                 :    //       return obj ;
    1059                 :    //    }
    1060                 :    // }
    1061                 :    //
    1062                 :    // Foo::Bar_ptr Foo::Bar::_narrow(CORBA::Object_ptr obj)
    1063                 :    // {
    1064                 :    //    if (CORBA::is_nil(obj))
    1065                 :    //    {
    1066                 :    //       return _nil() ;
    1067                 :    //    }
    1068                 :    //    else
    1069                 :    //    {
    1070                 :    //       void * that = NULL ;
    1071                 :    //       if (obj->_isA(_info, that))
    1072                 :    //       {
    1073                 :    //          Foo::Bar_ptr ret ;
    1074                 :    //          ret = (Foo::Bar_ptr) that ;
    1075                 :    //          CORBA::Object::_duplicate(obj) ;
    1076                 :    //          return ret ;
    1077                 :    //       }
    1078                 :    //       else
    1079                 :    //       {
    1080                 :    //          return _nil() ;
    1081                 :    //       }
    1082                 :    //    }
    1083                 :    // }
    1084                 :    //
    1085                 :    // Foo::Bar_ptr Foo::Bar::_nil(void)
    1086                 :    // {
    1087                 :    //    return NULL ;
    1088                 :    // }
    1089                 :    //
    1090                 :    // Foo::Bar_ptr Foo::Bar::_bind(YAORB::CDR* cdrs)
    1091                 :    // {
    1092                 :    //    return _narrow(CORBA::Object::_bind(cdrs)) ;
    1093                 :    // }
    1094                 :    //
    1095                 :    // const YAORB::ClassInfo* Foo::Bar::_getInfo(void) const
    1096                 :    // {
    1097                 :    //    return & _info ;
    1098                 :    // }
    1099                 :    //
    1100                 :    // bool Foo::Bar::_isA(const YAORB::ClassInfo* info, void*& that) const
    1101                 :    // {
    1102                 :    //    if (_info->isEquiv(info))
    1103                 :    //    {  // TO DO : Document this black magic ! (virtual inheritance)
    1104                 :    //       that = (void*) (const void*) this ;
    1105                 :    //       return true ;
    1106                 :    //    }
    1107                 :    //    // call ::_isA on parent classes
    1108                 :    //    if (Mod::Base::_isA(info, that))
    1109                 :    //    {
    1110                 :    //       return true ;
    1111                 :    //    }
    1112                 :    //    return false ;
    1113                 :    // }
    1114                 :    //
    1115                 :    // const YAORB::ClassInfo Foo::Bar::_info("<<repository id>>") ;
    1116                 :    //
    1117                 :    // <<CONTENT>>
    1118                 : 
    1119             196 :    if (! info->_isPseudo)
    1120                 :    {
    1121                 :       _Cpp.Tab() << info->_cppFullName
    1122             186 :          << "::" << info->_cppName << "()" << endl ;
    1123                 : 
    1124             186 :       if (inherit.size() == 0)
    1125                 :       {
    1126              71 :          _Cpp.Tab() << " : CORBA::Object()" << endl ;
    1127                 :       }
    1128                 :       else
    1129                 :       {
    1130             115 :          NON_DEV("Base constructors") ;
    1131                 :       }
    1132                 : 
    1133             186 :       _Cpp.Tab() << "{}" << endl << endl ;
    1134                 : 
    1135                 :       _Cpp.Tab() << info->_cppFullName
    1136             186 :          << "::~" << info->_cppName << "()" << endl ;
    1137             186 :       _Cpp.Tab() << "{}" << endl << endl ;
    1138                 : 
    1139             186 :       _Cpp.Tab() << name_ptr << endl ;
    1140                 :       _Cpp.Tab() << info->_cppFullName 
    1141             186 :           << "::_duplicate(" << name_ptr << " obj)" << endl ;
    1142             186 :       _Cpp.Tab() << "{" << endl ;
    1143             186 :       _Cpp.IncTab() ;
    1144             186 :       _Cpp.Tab() << "if (CORBA::is_nil(obj))" << endl ;
    1145             186 :       _Cpp.Tab() << "{" << endl ;
    1146             186 :       _Cpp.IncTab() ;
    1147             186 :       _Cpp.Tab() << "return _nil() ;" << endl ;
    1148             186 :       _Cpp.DecTab() ;
    1149             186 :       _Cpp.Tab() << "}" << endl ;
    1150             186 :       _Cpp.Tab() << "else" << endl ;
    1151             186 :       _Cpp.Tab() << "{" << endl ;
    1152             186 :       _Cpp.IncTab() ;
    1153                 :       _Cpp.Tab() << "(void) CORBA::Object::_duplicate(obj) ;"
    1154             186 :          << endl ;
    1155             186 :       _Cpp.Tab() << "return obj ;" << endl ;
    1156             186 :       _Cpp.DecTab() ;
    1157             186 :       _Cpp.Tab() << "}" << endl ;
    1158             186 :       _Cpp.DecTab() ;
    1159             186 :       _Cpp.Tab() << "}" << endl << endl ;
    1160                 : 
    1161             186 :       _Cpp.Tab() << name_ptr << endl ;
    1162                 :       _Cpp.Tab() << info->_cppFullName 
    1163             186 :          << "::_narrow(CORBA::Object_ptr obj)" << endl ;
    1164             186 :       _Cpp.Tab() << "{" << endl ;
    1165             186 :       _Cpp.IncTab() ;
    1166             186 :       _Cpp.Tab() << "if (CORBA::is_nil(obj))" << endl ;
    1167             186 :       _Cpp.Tab() << "{" << endl ;
    1168             186 :       _Cpp.IncTab() ;
    1169             186 :       _Cpp.Tab() << "return _nil() ;" << endl ;
    1170             186 :       _Cpp.DecTab() ;
    1171             186 :       _Cpp.Tab() << "}" << endl ;
    1172             186 :       _Cpp.Tab() << "else" << endl ;
    1173             186 :       _Cpp.Tab() << "{" << endl ;
    1174             186 :       _Cpp.IncTab() ;
    1175             186 :       _Cpp.Tab() << "void *that = NULL ;" << endl ;
    1176             186 :       _Cpp.Tab() << "if (obj->_isA(& _info, that))" << endl ;
    1177             186 :       _Cpp.Tab() << "{" << endl ;
    1178             186 :       _Cpp.IncTab() ;
    1179             186 :       _Cpp.Tab() << name_ptr << " ret ;" << endl ;
    1180             186 :       _Cpp.Tab() << "ret = (" << name_ptr << ") that ;" << endl ;
    1181             186 :       _Cpp.Tab() << "CORBA::Object::_duplicate(obj) ;" << endl ;
    1182             186 :       _Cpp.Tab() << "return ret ;" << endl ;
    1183             186 :       _Cpp.DecTab() ;
    1184             186 :       _Cpp.Tab() << "}" << endl ;
    1185             186 :       _Cpp.Tab() << "else" << endl ;
    1186             186 :       _Cpp.Tab() << "{" << endl ;
    1187             186 :       _Cpp.IncTab() ;
    1188             186 :       _Cpp.Tab() << "return _nil() ;" << endl ;
    1189             186 :       _Cpp.DecTab() ;
    1190             186 :       _Cpp.Tab() << "}" << endl ;
    1191             186 :       _Cpp.DecTab() ;
    1192             186 :       _Cpp.Tab() << "}" << endl ;
    1193             186 :       _Cpp.DecTab() ;
    1194             186 :       _Cpp.Tab() << "}" << endl << endl ;
    1195                 :    }
    1196                 : 
    1197                 :    _Cpp.Tab() << name_ptr << " " << info->_cppFullName 
    1198             196 :       << "::_nil(void)" << endl ;
    1199             196 :    _Cpp.Tab() << "{" << endl ;
    1200             196 :    _Cpp.IncTab() ;
    1201             196 :    _Cpp.Tab() << "return NULL ;" << endl ;
    1202             196 :    _Cpp.DecTab() ;
    1203             196 :    _Cpp.Tab() << "}" << endl << endl ;
    1204                 : 
    1205             196 :    if ( ! info->_isPseudo)
    1206                 :    {
    1207                 :       _Cpp.Tab() << name_ptr << " " << info->_cppFullName 
    1208             186 :          << "::_bind(YAORB::CDR* cdrs)" << endl ;
    1209             186 :       _Cpp.Tab() << "{" << endl ;
    1210             186 :       _Cpp.IncTab() ;
    1211                 :       _Cpp.Tab() << "return _narrow(CORBA::Object::_bind(cdrs)) ;"
    1212             186 :          << endl ;
    1213             186 :       _Cpp.DecTab() ;
    1214             186 :       _Cpp.Tab() << "}" << endl << endl ;
    1215                 : 
    1216                 :       _Cpp.Tab() << "const YAORB::ClassInfo* "
    1217             186 :          << info->_cppFullName << "::_getInfo(void) const" << endl ;
    1218             186 :       _Cpp.Tab() << "{" << endl ;
    1219             186 :       _Cpp.IncTab() ;
    1220             186 :       _Cpp.Tab() << "return & _info ;" << endl ;
    1221             186 :       _Cpp.DecTab() ;
    1222             186 :       _Cpp.Tab() << "}" << endl << endl ;
    1223                 : 
    1224                 :       _Cpp.Tab() << "bool " << info->_cppFullName
    1225             186 :          << "::_isA(const YAORB::ClassInfo* info, void*& that) const" << endl ;
    1226             186 :       _Cpp.Tab() << "{" << endl ;
    1227             186 :       _Cpp.IncTab() ;
    1228             186 :       _Cpp.Tab() << "if (_info.isEquiv(info))" << endl ;
    1229             186 :       _Cpp.Tab() << "{" << endl ;
    1230             186 :       _Cpp.IncTab() ;
    1231             186 :       _Cpp.Tab() << "that = (void*) (const void*) this ;" << endl ;
    1232             186 :       _Cpp.Tab() << "return true ;" << endl ;
    1233             186 :       _Cpp.DecTab() ;
    1234             186 :       _Cpp.Tab() << "}" << endl ;
    1235                 : 
    1236                 :       InterfaceListIt it(inherit) ;
    1237             323 :       while (it.GetNext())
    1238                 :       {
    1239                 :          super = it.GetItem() ;
    1240             137 :          sinfo = GetCppInfo(super) ;
    1241                 : 
    1242                 :          _Cpp.Tab() << "if (" << sinfo->_cppFullName
    1243             137 :             << "::_isA(info, that))" << endl ;
    1244             137 :          _Cpp.Tab() << "{" << endl ;
    1245             137 :          _Cpp.IncTab() ;
    1246             137 :          _Cpp.Tab() << "return true ;" << endl ;
    1247             137 :          _Cpp.DecTab() ;
    1248             137 :          _Cpp.Tab() << "}" << endl ;
    1249                 :       }
    1250                 : 
    1251             186 :       _Cpp.Tab() << "return false ;" << endl ;
    1252             186 :       _Cpp.DecTab() ;
    1253             186 :       _Cpp.Tab() << "}" << endl << endl ;
    1254                 : 
    1255             186 :       const String& ir = interface->GetInterfaceRepositoryID() ;
    1256                 :       _Cpp.Tab() << "const YAORB::ClassInfo "
    1257             186 :          << info->_cppFullName << "::_info(\"" << ir << "\") ;" << endl ;
    1258                 :    }
    1259             196 :    _Cpp.Str() << endl ;
    1260                 : 
    1261                 :    //=============================== Content ==================================
    1262                 : 
    1263             196 :    Context *c = symTab->findLocalContext(name) ;
    1264                 :    ASSERT(c != NULL) ;
    1265                 : 
    1266             196 :    if ( ! info->_isPseudo)
    1267                 :    {
    1268             186 :       GenerateInterfaceTablesImpl(c, interface) ;
    1269                 :    }
    1270                 : 
    1271             196 :    GenerateContextImpl(c, info->_isPseudo) ;
    1272                 : 
    1273                 :    //=============================== STUB CPP =================================
    1274                 :    // YAORB::StubInfo* Bar_Stub::Foo_Stub::getStubInfo(void) const
    1275                 :    // {
    1276                 :    //    return & _stubInfo ;
    1277                 :    // }
    1278                 :    //
    1279                 :    // YAORB::StubInfo
    1280                 :    // Bar_Stub::Foo_Stub::_stubInfo(
    1281                 :    //    Bar_Stub::Foo_Stub::create,
    1282                 :    //    & Bar::Foo::_info) ;
    1283                 :    //
    1284                 :    // CORBA::Object*
    1285                 :    // Bar_Stub::Foo_Stub::create(const YAORB::Ref& ref)
    1286                 :    // {
    1287                 :    //    return new Stub_Bar(ref) ;
    1288                 :    // }
    1289                 :    //
    1290                 :    // Bar_Stub::Foo_Stub::Foo_Stub(const YAORB::Ref& ref)
    1291                 :    // : YAORB::Stub(ref)
    1292                 :    // {}
    1293                 : 
    1294             196 :    _StubCpp.Tab() << "YAORB::StubInfo*" << endl ;
    1295                 :    _StubCpp.Tab() << info->_cppStubFullName
    1296             196 :       << "::getStubInfo(void) const" << endl ;
    1297             196 :    _StubCpp.Tab() << "{" << endl ;
    1298             196 :    _StubCpp.IncTab() ;
    1299             196 :    _StubCpp.Tab() << "return & _stubInfo ;" << endl ;
    1300             196 :    _StubCpp.DecTab() ;
    1301             196 :    _StubCpp.Tab() << "}" << endl << endl ;
    1302                 : 
    1303             196 :    _StubCpp.Tab() << "YAORB::StubInfo" << endl ;
    1304                 :    _StubCpp.Tab() << info->_cppStubFullName
    1305             196 :       << "::_stubInfo(" << endl ;
    1306             196 :    _StubCpp.IncTab() ;
    1307             196 :    _StubCpp.Tab() << info->_cppStubFullName << "::create," << endl ;
    1308                 :    _StubCpp.Tab() << "& " << info->_cppFullName << "::_info) ;"
    1309             196 :       << endl << endl ;
    1310             196 :    _StubCpp.DecTab() ;
    1311                 : 
    1312             196 :    _StubCpp.Tab() << "CORBA::Object*" << endl ;
    1313                 :    _StubCpp.Tab() << info->_cppStubFullName
    1314             196 :       << "::create(const YAORB::Ref& ref)" << endl ;
    1315             196 :    _StubCpp.Tab() << "{" << endl ;
    1316             196 :    _StubCpp.IncTab() ;
    1317                 :    _StubCpp.Tab() << "return new " << info->_cppStubName
    1318             196 :       << "(ref) ;" << endl ;
    1319             196 :    _StubCpp.DecTab() ;
    1320             196 :    _StubCpp.Tab() << "}" << endl << endl ;
    1321                 : 
    1322                 :    _StubCpp.Tab() << info->_cppStubFullName
    1323             196 :       << "::" << info->_cppStubName << "(const YAORB::Ref& ref)" << endl ;
    1324             196 :    _StubCpp.Tab() << " : YAORB::Stub(ref)" << endl ;
    1325             196 :    _StubCpp.Tab() << "{}" << endl << endl ;
    1326                 : 
    1327                 :    //=============================== SKEL CPP =================================
    1328                 :    // POA_Bar::POA_Foo::POA_Foo()
    1329                 :    // : Foo::Bar, PortableServer::ServantBase()
    1330                 :    // {}
    1331                 :    //
    1332                 :    // POA_Bar::POA_Foo::~POA_Foo()
    1333                 :    // {}
    1334                 :    //
    1335                 : 
    1336             196 :    if ( ! info->_isPseudo)
    1337                 :    {
    1338                 :       _SkelCpp.Tab() << info->_cppSkelFullName
    1339             186 :          << "::" << info->_cppSkelName << "()" << endl ;
    1340             186 :       _SkelCpp.Tab() << ": " << info->_cppFullName << "()," << endl ;
    1341             186 :       _SkelCpp.Tab() << "PortableServer::ServantBase()" << endl ;
    1342             186 :       _SkelCpp.Tab() << "{}" << endl << endl ;
    1343                 : 
    1344                 :       _SkelCpp.Tab() << info->_cppSkelFullName
    1345             186 :          << "::~" << info->_cppSkelName << "()" << endl ;
    1346             186 :       _SkelCpp.Tab() << "{}" << endl << endl ;
    1347             196 :    }
    1348                 : }
    1349                 : 
    1350                 : void LangCpp::GenerateInterfaceTablesImpl(
    1351                 :    SymbolContainer *symTab,
    1352             186 :    Interface *interface)
    1353                 : {
    1354             186 :    CppInfo *info = GetCppInfo(interface) ;
    1355                 : 
    1356                 :    //=============================== SKEL CPP =================================
    1357                 :    //
    1358                 :    // In this example, Bar::Foo inherit from The::Thing.
    1359                 :    //
    1360                 :    // const YAORB::SkelInfo::LocalOp
    1361                 :    // POA_Bar::POA_Foo::_localOps[] =
    1362                 :    // {
    1363                 :    //   { "Operation1", & POA_Bar::POA_Foo::_op_Operation1},
    1364                 :    //   { "Operation2", & POA_Bar::POA_Foo::_op_Operation2},
    1365                 :    //   { NULL, NULL}
    1366                 :    // } ;
    1367                 :    //
    1368                 :    // const YAORB::SkelInfo*
    1369                 :    // POA_Bar::POA_Foo::_parentSkelInfo[] =
    1370                 :    // {
    1371                 :    //    & POA_The::POA_Thing::_stubInfo,
    1372                 :    //    NULL
    1373                 :    // } ;
    1374                 :    //
    1375                 :    // const YAORB::SkelInfo
    1376                 :    // POA_Bar::POA_Foo::_stubInfo() ;
    1377                 :    //    & Bar::Foo::_info,
    1378                 :    //    POA_Bar::POA_Foo::_localOps,
    1379                 :    //    POA_Bar::POA_Foo::_parentSkelInfo) ;
    1380                 : 
    1381             186 :    _SkelCpp.Tab() << "const YAORB::SkelInfo::LocalOp" << endl ;
    1382                 :    _SkelCpp.Tab() << info->_cppSkelFullName 
    1383             186 :       << "::_localOps[] = " << endl ;
    1384             186 :    _SkelCpp.Tab() << "{" << endl ;
    1385             186 :    _SkelCpp.IncTab() ;
    1386                 : 
    1387             186 :    GenerateLocalOpsImpl(symTab, interface) ;
    1388                 : 
    1389             186 :    _SkelCpp.DecTab() ;
    1390             186 :    _SkelCpp.Tab() << "} ;" << endl << endl ;
    1391                 : 
    1392             186 :    _SkelCpp.Tab() << "const YAORB::SkelInfo *" << endl ;
    1393                 :    _SkelCpp.Tab() << info->_cppSkelFullName 
    1394             186 :       << "::_parentSkelInfo[] = " << endl ;
    1395             186 :    _SkelCpp.Tab() << "{" << endl ;
    1396             186 :    _SkelCpp.IncTab() ;
    1397                 : 
    1398             186 :    NON_DEV("Inheritance for static operation tables") ;
    1399                 : 
    1400             186 :    _SkelCpp.Tab() << "NULL" << endl ;
    1401             186 :    _SkelCpp.DecTab() ;
    1402             186 :    _SkelCpp.Tab() << "} ;" << endl << endl ;
    1403                 : 
    1404                 : 
    1405             186 :    _SkelCpp.Tab() << "const YAORB::SkelInfo" << endl ;
    1406                 :    _SkelCpp.Tab() << info->_cppSkelFullName 
    1407             186 :       << "::_skelInfo(" << endl ;
    1408             186 :    _SkelCpp.IncTab() ;
    1409                 : 
    1410             186 :    _SkelCpp.Tab() << "& " << info->_cppFullName << "::_info," << endl ;
    1411                 : 
    1412                 :    _SkelCpp.Tab() << "& " << info->_cppSkelFullName
    1413             186 :       << "::_localOps[0]," << endl ;
    1414                 : 
    1415                 :    _SkelCpp.Tab() << "& " << info->_cppSkelFullName
    1416             186 :       << "::_parentSkelInfo[0]) ;" << endl << endl ;
    1417                 : 
    1418             186 :    _SkelCpp.DecTab() ;
    1419                 : }
    1420                 : 
    1421                 : void LangCpp::GenerateLocalOpsImpl(
    1422                 :    SymbolContainer *symTab,
    1423             186 :    Interface *interface)
    1424                 : {
    1425             186 :    const SymbolList& symbols = symTab->GetLocalSymbols() ;
    1426                 :    Symbol *symbol = NULL ;
    1427                 :    SymbolListIt it(symbols) ;
    1428                 : 
    1429             994 :    while (it.GetNext())
    1430                 :    {
    1431                 :       symbol = it.GetItem() ;
    1432                 : 
    1433             622 :       switch(symbol->GetClass())
    1434                 :       {
    1435                 :          case attributeSymbol :
    1436                 :          {
    1437              89 :             Attribute *a = (Attribute*) symbol ;
    1438              89 :             AttributeAttribute attrib = a->GetAttribute() ;
    1439              89 :             CppInfo *info = GetCppInfo(a) ;
    1440              89 :             const String& name = a->GetName() ;
    1441              89 :             String atName = Prefix(info->_cppSkelFullName) ;
    1442                 : 
    1443                 :             //-----------------------------------------------------------------
    1444                 :             // REFERENCE : OMG 99-07-19.pdf, section 15.4.2.1, page 15.34
    1445                 :             //-----------------------------------------------------------------
    1446                 : 
    1447                 :             _SkelCpp.Tab()
    1448                 :                << "{ \"_get_" << name << "\", "
    1449              89 :                << atName << "::_get_" << info->_cppName << "}," << endl ;
    1450                 : 
    1451              89 :             if (attrib == ATTRIBUTE_READWRITE)
    1452                 :             {
    1453                 :                _SkelCpp.Tab()
    1454                 :                   << "{ \"_set_" << name << "\", "
    1455              45 :                   << atName << "::_set_" << info->_cppName << "}," << endl ;
    1456                 :             }
    1457               0 :             break ;
    1458                 :          }
    1459                 :          case operationSymbol :
    1460                 :          {
    1461                 :             Operation *o = (Operation*) symbol ;
    1462             492 :             CppInfo *info = GetCppInfo(o) ;
    1463             492 :             const String& name = o->GetName() ;
    1464             492 :             String opName = Prefix(info->_cppSkelFullName) ;
    1465             492 :             opName += "::_op_" ;
    1466             492 :             opName += info->_cppName ;
    1467                 : 
    1468                 :             _SkelCpp.Tab() << "{ \"" << name << "\", & "
    1469             492 :                << opName << "}," << endl ;
    1470             492 :             break ;
    1471                 :          }
    1472                 :          default :
    1473                 :          {
    1474                 :             break ;
    1475                 :          }
    1476                 :       }
    1477                 :    }
    1478                 : 
    1479             186 :    _SkelCpp.Tab() << "{ NULL, NULL }" << endl ;
    1480                 : }
    1481                 : 
    1482                 : void LangCpp::GenerateAttributeDecl(
    1483                 :    SymbolContainer *symTab,
    1484                 :    Attribute *attribute,
    1485              94 :    bool pseudo)
    1486                 : {
    1487              94 :    CppInfo *info = new CppInfo(attribute) ;
    1488              94 :    SetCppInfo(attribute, info) ;
    1489                 : 
    1490              94 :    IDLType *type = attribute->GetType() ;
    1491              94 :    AttributeAttribute attrib = attribute->GetAttribute() ;
    1492                 : 
    1493                 :    bool dummy1, dummy2, dummy3 ;
    1494                 : 
    1495                 :    //=============================== H ========================================
    1496                 :    // Read Write attribute :
    1497                 :    // ----------------------
    1498                 :    // virtual void Attr(<in_type>) = 0 ;
    1499                 :    // virtual <return_type> Attr(void) = 0 ;
    1500                 :    // 
    1501                 :    // Read only attribute :
    1502                 :    // ---------------------
    1503                 :    // virtual <return_type> Attr(void) = 0 ;
    1504                 : 
    1505                 :    // Get
    1506                 :    // ===
    1507                 : 
    1508              94 :    if (! pseudo)
    1509                 :    {
    1510              89 :       _H.Tab() << "virtual " ;
    1511                 :    }
    1512                 :    else
    1513                 :    {
    1514               5 :       (void) _H.Tab() ;
    1515                 :    }
    1516                 : 
    1517                 :    PrintType(_H.Str(),
    1518                 :              type,
    1519                 :              PRINT_RETURN,
    1520                 :              info->_isConst,
    1521                 :              info->_isPointer,
    1522              94 :              info->_isVar) ;
    1523                 : 
    1524              94 :    _H.Str() << " " << info->_cppName << "(void)" ;
    1525                 : 
    1526              94 :    if (! pseudo)
    1527                 :    {
    1528              89 :       _H.Str() << " = 0 ;" << endl ;
    1529                 :    }
    1530                 :    else
    1531                 :    {
    1532               5 :       _H.Str() << " ;" << endl ;
    1533                 :    }
    1534                 : 
    1535                 :    // Set
    1536                 :    // ===
    1537                 : 
    1538              94 :    if (attrib == ATTRIBUTE_READWRITE)
    1539                 :    {
    1540              46 :       if ( ! pseudo)
    1541                 :       {
    1542              45 :          _H.Tab() << "virtual void " << info->_cppName << "(" ;
    1543                 :          PrintType(_H.Str(),
    1544                 :                    type,
    1545                 :                    PRINT_IN,
    1546                 :                    dummy1,
    1547                 :                    dummy2,
    1548              45 :                    dummy3) ;
    1549              45 :          _H.Str() << ") = 0 ;" << endl ;
    1550                 :       }
    1551                 :       else
    1552                 :       {
    1553               1 :          _H.Tab() << "void " << info->_cppName << "(" ;
    1554                 :          PrintType(_H.Str(),
    1555                 :                    type,
    1556                 :                    PRINT_IN,
    1557                 :                    dummy1,
    1558                 :                    dummy2,
    1559               1 :                    dummy3) ;
    1560               1 :          _H.Str() << ") ;" << endl ;
    1561                 :       }
    1562                 :    }
    1563                 : 
    1564              94 :    _H.Str() << endl ;
    1565                 : 
    1566                 :    //=============================== Stub H ===================================
    1567                 :    // Read Write attribute :
    1568                 :    // ----------------------
    1569                 :    // void Attr(<in_type>) ;
    1570                 :    // <return_type> Attr(void) ;
    1571                 :    // 
    1572                 :    // Read only attribute :
    1573                 :    // ---------------------
    1574                 :    // <return_type> Attr(void) ;
    1575                 : 
    1576                 :    // Get
    1577                 :    // ===
    1578                 : 
    1579              94 :    if ( ! pseudo)
    1580                 :    {
    1581              89 :       _StubH.Tab() ;
    1582                 :       PrintType(_StubH.Str(),
    1583                 :                 type,
    1584                 :                 PRINT_RETURN,
    1585                 :                 info->_isConst,
    1586                 :                 info->_isPointer,
    1587              89 :                 info->_isVar) ;
    1588                 : 
    1589              89 :       _StubH.Str() <<  " " << info->_cppName << "(void) ;" << endl ;
    1590                 :    }
    1591                 : 
    1592                 :    // Set
    1593                 :    // ===
    1594                 : 
    1595              94 :    if (   (attrib == ATTRIBUTE_READWRITE)
    1596                 :        && ( ! pseudo))
    1597                 :    {
    1598              45 :       _StubH.Tab() << "virtual void " << info->_cppName << "(" ;
    1599                 :       PrintType(_StubH.Str(),
    1600                 :                 type,
    1601                 :                 PRINT_IN,
    1602                 :                 dummy1,
    1603                 :                 dummy2,
    1604              45 :                 dummy3) ;
    1605              45 :       _StubH.Str() << ") = 0 ;" << endl ;
    1606                 :    }
    1607                 : 
    1608              48 :    if ( ! pseudo)
    1609                 :    {
    1610              89 :       _StubH.Str() << endl ;
    1611                 :    }
    1612                 : 
    1613                 :    //=============================== Skel H ===================================
    1614                 :    // Read Write attribute :
    1615                 :    // ----------------------
    1616                 :    // static void _get_Attr(
    1617                 :    //    PortableServer::ServantBase*,
    1618                 :    //    YAORB::Request&,
    1619                 :    //    YAORB::Reply&) ;
    1620                 :    // static void _set_Attr(
    1621                 :    //    PortableServer::ServantBase*,
    1622                 :    //    YAORB::Request&,
    1623                 :    //    YAORB::Reply&) ;
    1624                 :    // 
    1625                 :    // Read only attribute :
    1626                 :    // ---------------------
    1627                 :    // static void _get_Attr(
    1628                 :    //    PortableServer::ServantBase*,
    1629                 :    //    YAORB::Request&,
    1630                 :    //    YAORB::Reply&) ;
    1631                 : 
    1632                 :    // Get
    1633                 :    // ===
    1634                 : 
    1635                 :    if ( ! pseudo)
    1636                 :    {
    1637              89 :       _SkelH.Tab() << "static void _get_" << info->_cppName << "(" << endl ;
    1638              89 :       _SkelH.IncTab() ;
    1639              89 :       _SkelH.Tab() << "PortableServer::ServantBase*," << endl ;
    1640              89 :       _SkelH.Tab() << "YAORB::Request&," << endl ;
    1641              89 :       _SkelH.Tab() << "YAORB::Reply&) ;" << endl ;
    1642              89 :       _SkelH.DecTab() ;
    1643                 :    }
    1644                 : 
    1645                 :    // Set
    1646                 :    // ===
    1647                 : 
    1648              93 :    if (   (attrib == ATTRIBUTE_READWRITE)
    1649                 :        && ( ! pseudo))
    1650                 :    {
    1651              45 :       _SkelH.Tab() << "static void _set_" << info->_cppName << "(" << endl ;
    1652              45 :       _SkelH.IncTab() ;
    1653              45 :       _SkelH.Tab() << "PortableServer::ServantBase*," << endl ;
    1654              45 :       _SkelH.Tab() << "YAORB::Request&," << endl ;
    1655              45 :       _SkelH.Tab() << "YAORB::Reply&) ;" << endl ;
    1656              45 :       _SkelH.DecTab() ;
    1657                 :    }
    1658                 : 
    1659              48 :    if ( ! pseudo)
    1660                 :    {
    1661              89 :       _SkelH.Str() << endl ;
    1662                 :    }
    1663                 : }
    1664                 : 
    1665                 : void LangCpp::GenerateAttributeImpl(
    1666                 :    SymbolContainer *symTab,
    1667              89 :    Attribute *attribute)
    1668                 : {
    1669              89 :    GenerateAttributeStubImpl(attribute) ;
    1670              89 :    GenerateAttributeSkelImpl(attribute) ;
    1671                 : }
    1672                 : 
    1673                 : void LangCpp::GenerateAttributeStubImpl(
    1674              89 :    Attribute *attribute)
    1675                 : {
    1676              89 :    CppInfo *info = GetCppInfo(attribute) ;
    1677                 : 
    1678              89 :    IDLType *type = attribute->GetType() ;
    1679              89 :    AttributeAttribute attrib = attribute->GetAttribute() ;
    1680                 : 
    1681                 :    //=============================== Stub CPP =================================
    1682                 :    // Read Write attribute :
    1683                 :    // ----------------------
    1684                 :    // void Attr(<in_type>)
    1685                 :    // {
    1686                 :    // }
    1687                 :    //
    1688                 :    // <return_type> Attr(void)
    1689                 :    // {
    1690                 :    // }
    1691                 :    // 
    1692                 :    // Read only attribute :
    1693                 :    // ---------------------
    1694                 :    // <return_type> Attr(void)
    1695                 :    // {
    1696                 :    //    ...
    1697                 :    // }
    1698                 : 
    1699                 :    // Get
    1700                 :    // ===
    1701                 : 
    1702                 :    PrintType(_StubCpp.Str(),
    1703                 :              type,
    1704                 :              PRINT_RETURN,
    1705                 :              info->_isConst,
    1706                 :              info->_isPointer,
    1707              89 :              info->_isVar) ;
    1708                 : 
    1709              89 :    _StubCpp.Str() <<  " " << info->_cppName << "(void)" << endl ;
    1710              89 :    _StubCpp.Tab() << "{" << endl ;
    1711                 : 
    1712              89 :    NON_DEV("GenerateAttributeStubImpl") ;
    1713              89 :    _StubCpp.Str() << "NON_DEV(\"GenerateAttributeStubImpl\") ;" << endl ;
    1714                 : 
    1715              89 :    _StubCpp.Tab() << "}" << endl ;
    1716                 : 
    1717                 :    // Set
    1718                 :    // ===
    1719                 : 
    1720              89 :    if (attrib == ATTRIBUTE_READWRITE)
    1721                 :    {
    1722                 :       bool dummy1, dummy2, dummy3 ;
    1723                 : 
    1724              45 :       _StubCpp.Tab() << "void " << info->_cppName << "(" ;
    1725                 :       PrintType(_StubCpp.Str(),
    1726                 :                 type,
    1727                 :                 PRINT_RETURN,
    1728                 :                 dummy1,
    1729                 :                 dummy2,
    1730              45 :                 dummy3) ;
    1731              45 :       _StubCpp.Str() << " __attr)" << endl ;
    1732              45 :       _StubCpp.Tab() << "{" << endl ;
    1733                 : 
    1734              45 :       NON_DEV("GenerateAttributeStubImpl") ;
    1735              45 :       _StubCpp.Str() << "NON_DEV(\"GenerateAttributeStubImpl\") ;" << endl ;
    1736                 : 
    1737              45 :       _StubCpp.Tab() << "}" << endl ;
    1738                 :    }
    1739                 : }
    1740                 : 
    1741                 : void LangCpp::GenerateAttributeSkelImpl(
    1742              89 :    Attribute *attribute)
    1743                 : {
    1744              89 :    CppInfo *info = GetCppInfo(attribute) ;
    1745                 : 
    1746                 :    // IDLType *type = attribute->GetType() ;
    1747              89 :    AttributeAttribute attrib = attribute->GetAttribute() ;
    1748                 : 
    1749              89 :    String className = Prefix(info->_cppSkelFullName) ;
    1750                 : 
    1751                 :    _SkelCpp.Tab() << "void " << className
    1752              89 :       << "::_get_" << info->_cppName << "(" << endl ;
    1753              89 :    _SkelCpp.IncTab() ;
    1754              89 :    _SkelCpp.Tab() << "PortableServer::ServantBase* __this," << endl ;
    1755              89 :    _SkelCpp.Tab() << "YAORB::Request& __request," << endl ;
    1756              89 :    _SkelCpp.Tab() << "YAORB::Reply& __reply)" << endl ;
    1757              89 :    _SkelCpp.DecTab() ;
    1758              89 :    _SkelCpp.Tab() << "{" << endl ;
    1759                 : 
    1760              89 :    NON_DEV("GenerateAttributeSkelImpl") ;
    1761              89 :    _SkelCpp.Str() << "NON_DEV(\"GenerateAttributeSkelImpl\") ;" << endl ;
    1762                 : 
    1763              89 :    _SkelCpp.Tab() << "}" << endl << endl ;
    1764                 : 
    1765              89 :    if (attrib == ATTRIBUTE_READWRITE)
    1766                 :    {
    1767                 :       _SkelCpp.Tab() << "void " << className
    1768              45 :          << "::_get_" << info->_cppName << "(" << endl ;
    1769              45 :       _SkelCpp.IncTab() ;
    1770              45 :       _SkelCpp.Tab() << "PortableServer::ServantBase* __this," << endl ;
    1771              45 :       _SkelCpp.Tab() << "YAORB::Request& __request," << endl ;
    1772              45 :       _SkelCpp.Tab() << "YAORB::Reply& __reply)" << endl ;
    1773              45 :       _SkelCpp.DecTab() ;
    1774              45 :       _SkelCpp.Tab() << "{" << endl ;
    1775                 : 
    1776              45 :       NON_DEV("GenerateAttributeSkelImpl") ;
    1777              45 :       _SkelCpp.Str() << "NON_DEV(\"GenerateAttributeSkelImpl\") ;" << endl ;
    1778                 : 
    1779              45 :       _SkelCpp.Tab() << "}" << endl << endl ;
    1780               0 :    }
    1781                 : }
    1782                 : 
    1783                 : void LangCpp::GenerateOperationDecl(
    1784                 :    SymbolContainer *symTab,
    1785                 :    Operation *operation,
    1786             565 :    bool pseudo)
    1787                 : {
    1788             565 :    CppInfo *info = new CppInfo(operation) ;
    1789             565 :    SetCppInfo(operation, info) ;
    1790                 : 
    1791             565 :    IDLType* returnType = operation->GetReturnType() ;
    1792             565 :    const ParameterList& params = operation->GetParameterList() ;
    1793                 : 
    1794                 :    //=============================== STUB H ===================================
    1795                 :    // <return_type> Operation(
    1796                 :    //    <arg1_type> arg1,
    1797                 :    //    <arg2_type> arg2,
    1798                 :    //    ...,
    1799                 :    //    <argN_type> argn) ;
    1800                 :    //
    1801                 : 
    1802             565 :    if ( ! pseudo)
    1803                 :    {
    1804             492 :       _StubH.Tab() << "virtual " ;
    1805                 : 
    1806                 :       PrintType(
    1807                 :          _StubH.Str(),
    1808                 :          returnType,
    1809                 :          PRINT_RETURN,
    1810                 :          info->_isConst,
    1811                 :          info->_isPointer,
    1812             492 :          info->_isVar) ;
    1813                 : 
    1814             492 :       _StubH.Str() << " " << info->_cppName << "(" ;
    1815                 : 
    1816             492 :       _StubH.IncTab() ;
    1817             492 :       PrintParameterList(params, _StubH, false) ;
    1818             492 :       _StubH.DecTab() ;
    1819                 : 
    1820             492 :       _StubH.Str() << ") ;" << endl << endl ;
    1821                 :    }
    1822                 : 
    1823                 : 
    1824                 :    //=============================== H ========================================
    1825                 :    // virtual <return_type> Operation(
    1826                 :    //    <arg1_type> arg1,
    1827                 :    //    <arg2_type> arg2,
    1828                 :    //    ...,
    1829                 :    //    <argN_type> argn) = 0 ;
    1830                 :    //
    1831                 : 
    1832                 :    if ( ! pseudo)
    1833                 :    {
    1834             492 :       _H.Tab() << "virtual " ;
    1835                 :    }
    1836                 :    else
    1837                 :    {
    1838              73 :       (void) _H.Tab() ;
    1839                 :    }
    1840                 : 
    1841                 :    PrintType(
    1842                 :       _H.Str(),
    1843                 :       returnType,
    1844                 :       PRINT_RETURN,
    1845                 :       info->_isConst,
    1846                 :       info->_isPointer,
    1847             565 :       info->_isVar) ;
    1848                 : 
    1849             565 :    _H.Str() << " " << info->_cppName << "(" ;
    1850                 : 
    1851             565 :    _H.IncTab() ;
    1852             565 :    PrintParameterList(params, _H, true) ;
    1853             565 :    _H.DecTab() ;
    1854                 : 
    1855             565 :    if ( ! pseudo)
    1856                 :    {
    1857             492 :       _H.Str() << ") = 0 ;" << endl << endl ;
    1858                 :    }
    1859                 :    else
    1860                 :    {
    1861              73 :       _H.Str() << ") ;" << endl << endl ;
    1862                 :    }
    1863                 : 
    1864                 :    //=============================== SKEL H ===================================
    1865                 :    // static void _op_Operation(
    1866                 :    //    FIXME : PortableServer::Servant*,
    1867                 :    //    YAORB::Request&,
    1868                 :    //    YAORB::Reply&) ;
    1869                 :    //
    1870                 : 
    1871                 :    if ( ! pseudo)
    1872                 :    {
    1873             492 :       _SkelH.Tab() << "static void _op_" << info->_cppName << endl ;
    1874             492 :       _SkelH.IncTab() ;
    1875                 :       _SkelH.Tab() 
    1876                 :          << "(PortableServer::ServantBase*, YAORB::Request&, YAORB::Reply&) ;"
    1877             492 :          << endl << endl ;
    1878             492 :       _SkelH.DecTab() ;
    1879                 :    }
    1880                 : }
    1881                 : 
    1882                 : void LangCpp::GenerateOperationImpl(
    1883                 :    SymbolContainer *symTab,
    1884             492 :    Operation *operation)
    1885                 : {
    1886             492 :    GenerateOperationStubImpl(symTab, operation) ;
    1887             492 :    GenerateOperationSkelImpl(symTab, operation) ;
    1888                 : }
    1889                 : 
    1890                 : void LangCpp::GenerateOperationStubImpl(
    1891                 :    SymbolContainer *symTab,
    1892             492 :    Operation *operation)
    1893                 : {
    1894             492 :    CppInfo *info = GetCppInfo(operation) ;
    1895                 : 
    1896             492 :    IDLType* returnType = operation->GetReturnType() ;
    1897             492 :    const ParameterList& params = operation->GetParameterList() ;
    1898                 :    Parameter *param = NULL ;
    1899                 :    CppInfo *pInfo = NULL ;
    1900                 : 
    1901             515 :    static String CDRName ("__cdrs") ;
    1902             515 :    static String resultName ("__result") ;
    1903                 : 
    1904                 :    //=============================== STUB CPP =================================
    1905                 :    // <return_type>
    1906                 :    // Foo_Stub::Operation(
    1907                 :    //    <arg1_type> arg1,
    1908                 :    //    <arg2_type> arg2,
    1909                 :    //    ...,
    1910                 :    //    <argN_type> argn)
    1911                 :    // {
    1912                 :    //    // FIXME : Prepare a request in a CDR stream.
    1913                 :    //    const YAORB::Ref & __ref = this->GetRef() ;
    1914                 :    //    const char* __op = "Operation" ;
    1915                 :    //    YAORB::Request __request ;
    1916                 :    //    YAORB::Reply __reply ;
    1917                 :    //    YAORB::CDR *__cdrs = ??? ;
    1918                 :    //    // FIXME : Encode IN and INOUT parameters
    1919                 :    //    // FIXME : Send the request
    1920                 :    //    // FIXME : Wait for the reply
    1921                 :    //    // FIXME : Decode INOUT and RETURN parameters
    1922                 :    //    // FIXME : return
    1923                 :    //    // FIXME : Decode exceptions
    1924                 :    //    // FIXME : Throw exceptions
    1925                 :    // }
    1926                 : 
    1927             492 :    String prefix = Prefix(info->_cppStubFullName) ;
    1928                 : 
    1929                 :    bool retIsConst, retIsPointer, retIsVar ;
    1930                 : 
    1931                 :    PrintType(_StubCpp.Str(),
    1932                 :              returnType,
    1933                 :              PRINT_RETURN,
    1934                 :              retIsConst,
    1935                 :              retIsPointer,
    1936             492 :              retIsVar) ;
    1937                 : 
    1938             492 :    _StubCpp.Str() << endl ;
    1939             492 :    _StubCpp.Tab() << prefix << "::" << info->_cppName << "(" ;
    1940                 : 
    1941             492 :    _StubCpp.IncTab() ;
    1942             492 :    PrintParameterList(params, _StubCpp, false) ;
    1943             492 :    _StubCpp.DecTab() ;
    1944                 : 
    1945             492 :    _StubCpp.Str() << ")" << endl ;
    1946                 : 
    1947             492 :    _StubCpp.Tab() << "{" << endl ;
    1948             492 :    _StubCpp.IncTab() ;
    1949             492 :    _StubCpp.Tab() << "const YAORB::Ref & __ref = this->GetRef() ;" << endl ;
    1950                 :    _StubCpp.Tab() << "const char * __op = \""
    1951             492 :       << operation->GetName() << "\" ;" << endl ;
    1952             492 :    _StubCpp.Tab() << "YAORB::Request __request ;" << endl ;
    1953             492 :    _StubCpp.Tab() << "YAORB::Reply __reply ;" << endl ;
    1954             492 :    _StubCpp.Tab() << "YAORB::CDR *" << CDRName << " ;" << endl << endl ;
    1955                 : 
    1956             492 :    _StubCpp.Tab() << "// 1: Prepare request" << endl ;
    1957             492 :    _StubCpp.Tab() << CDRName << " = __request.init(__ref, __op) ;" << endl ;
    1958                 : 
    1959                 :    ParameterListIt itRequest(params) ;
    1960                 : 
    1961            1119 :    while (itRequest.GetNext())
    1962                 :    {
    1963                 :       param = itRequest.GetItem() ;
    1964             627 :       pInfo = GetCppInfo(param) ;
    1965                 : 
    1966             627 :       switch(param->GetAttribute())
    1967                 :       {
    1968                 :          case PARAMETER_IN :
    1969                 :          case PARAMETER_INOUT :
    1970                 :          {
    1971             555 :             IDLType *paramType = param->GetType() ;
    1972                 : 
    1973             555 :             _StubCpp.Tab() ;
    1974                 :             PrintCDR(pInfo->_cppName,
    1975                 :                      paramType,
    1976                 :                      CDRName,
    1977                 :                      pInfo->_isConst,
    1978                 :                      pInfo->_isPointer,
    1979             555 :                      _StubCpp.Str()) ;
    1980                 :             break ;
    1981                 :          }
    1982                 :          case PARAMETER_OUT :
    1983                 :          {
    1984                 :             // Not used in request.
    1985                 :             break ;
    1986                 :          }
    1987                 :       }
    1988                 :    }
    1989                 : 
    1990             492 :    _StubCpp.Tab() << "__request.complete() ;" << endl ;
    1991             492 :    _StubCpp.Str() << endl ;
    1992                 : 
    1993             492 :    _StubCpp.Tab() << "// 2: Send Request." << endl ;
    1994                 : 
    1995                 :    _StubCpp.Tab() << "YAORB::Stub::Send(__request, __reply) ;"
    1996             492 :       << endl << endl ;
    1997             492 :    _StubCpp.Tab() << CDRName << " = __reply.GetCDR() ;" << endl ;
    1998                 : 
    1999             492 :    _StubCpp.Tab() << "if (__reply.IsUserException())" << endl ;
    2000             492 :    _StubCpp.Tab() << "{" << endl ;
    2001             492 :    _StubCpp.IncTab() ;
    2002             492 :    _StubCpp.Tab() << "// 3: Decode Exception" << endl ;
    2003             492 :    _StubCpp.Tab() << "// 4: Throw Exception" << endl ;
    2004             492 :    _StubCpp.DecTab() ;
    2005             492 :    _StubCpp.Tab() << "}" << endl << endl ;
    2006             492 :    _StubCpp.Tab() << "// 5: Decode Normal reply" << endl ;
    2007                 : 
    2008             492 :    if (returnType->isA() != idl_void)
    2009                 :    {
    2010                 :       bool isConst, isPointer, isVar ;
    2011                 : 
    2012             327 :       _StubCpp.Tab() ;
    2013                 :       PrintType(_StubCpp.Str(),
    2014                 :                 returnType,
    2015                 :                 PRINT_RETURN,
    2016                 :                 isConst,
    2017                 :                 isPointer,
    2018             327 :                 isVar) ;
    2019             327 :       _StubCpp.Str() << " " << resultName << " ;" << endl ;
    2020                 : 
    2021             327 :       _StubCpp.Tab() ;
    2022                 :       PrintCDR(resultName,
    2023                 :                returnType,
    2024                 :                CDRName,
    2025                 :                isConst,
    2026                 :                isPointer,
    2027             327 :                _StubCpp.Str()) ;
    2028                 :    }
    2029                 : 
    2030                 :    ParameterListIt itReply(params) ;
    2031                 : 
    2032            1119 :    while (itReply.GetNext())
    2033                 :    {
    2034                 :       param = itReply.GetItem() ;
    2035             627 :       pInfo = GetCppInfo(param) ;
    2036                 : 
    2037             627 :       switch(param->GetAttribute())
    2038                 :       {
    2039                 :          case PARAMETER_OUT :
    2040                 :          case PARAMETER_INOUT :
    2041                 :          {
    2042              72 :             IDLType *paramType = param->GetType() ;
    2043                 : 
    2044              72 :             Tabulate(_StubCpp.Str(), 2) ;
    2045                 :             PrintCDR(pInfo->_cppName,
    2046                 :                      paramType,
    2047                 :                      CDRName,
    2048                 :                      pInfo->_isConst,
    2049                 :                      pInfo->_isPointer,
    2050              72 :                      _StubCpp.Str()) ;
    2051                 :             break ;
    2052                 :          }
    2053                 :          case PARAMETER_IN :
    2054                 :          {
    2055                 :             // Not used in reply.
    2056                 :             break ;
    2057                 :          }
    2058                 :       }
    2059                 :    }
    2060                 : 
    2061             492 :    if (returnType->isA() != idl_void)
    2062                 :    {
    2063             327 :       _StubCpp.Tab() << "return " << resultName << " ;" << endl ;
    2064                 :    }
    2065                 :    else
    2066                 :    {
    2067             165 :       _StubCpp.Tab() << "return ;" << endl ;
    2068                 :    }
    2069                 : 
    2070             492 :    _StubCpp.DecTab() ;
    2071             492 :    _StubCpp.Tab() << "}" << endl << endl ;
    2072                 : }
    2073                 : 
    2074                 : void LangCpp::GenerateOperationSkelImpl(
    2075                 :    SymbolContainer *symTab,
    2076             564 :    Operation *operation)
    2077                 : {
    2078             492 :    CppInfo *info = GetCppInfo(operation) ;
    2079                 : 
    2080             492 :    IDLType* returnType = operation->GetReturnType() ;
    2081             492 :    const ParameterList& params = operation->GetParameterList() ;
    2082                 :    Parameter *param = NULL ;
    2083                 :    CppInfo *pInfo = NULL ;
    2084                 :    printMode mode ;
    2085                 : 
    2086                 :    int nbParam = params.size() ;
    2087                 :    int index = 0 ;
    2088                 :    bool *paramIsConstVector = NULL ;
    2089                 :    bool *paramIsPointerVector = NULL ;
    2090                 :    bool *paramIsVarVector = NULL ;
    2091                 :    bool paramIsFixedType = false ;
    2092                 : 
    2093             492 :    if (nbParam > 0)
    2094                 :    {
    2095             362 :       paramIsConstVector = new bool[nbParam] ;
    2096             362 :       paramIsPointerVector = new bool[nbParam] ;
    2097             362 :       paramIsVarVector = new bool[nbParam] ;
    2098                 :    }
    2099                 : 
    2100             515 :    static String CDRName ("__cdrs") ;
    2101             515 :    static String resultName ("__result") ;
    2102                 : 
    2103                 :    //=============================== SKEL CPP =================================
    2104                 :    // void
    2105                 :    // POA_foo::_op_Operation(
    2106                 :    //    PortableServer::ServantBase*,
    2107                 :    //    YAORB::Request& __request,
    2108                 :    //    YAORB::Reply& __reply)
    2109                 :    // {
    2110                 :    //    __reply.completed = NO ;
    2111                 :    //
    2112                 :    //    // 1 : Decode input arguments
    2113                 :    //
    2114                 :    //    try
    2115                 :    //    {
    2116                 :    //       __reply.completed = MAYBE ;
    2117                 :    //       // 2: Call the method implementation
    2118                 :    //       __reply.completed = YES ;
    2119                 :    //    }
    2120                 :    //    catch (...)
    2121                 :    //    {
    2122                 :    //       // 3 : Encode a user exception reply
    2123                 :    //    }
    2124                 :    //
    2125                 :    //    // 4 : Encode a normal reply
    2126                 :    // }
    2127                 : 
    2128             492 :    String prefix = Prefix(info->_cppSkelFullName) ;
    2129                 : 
    2130             492 :    _SkelCpp.Tab() << "void" << endl ;
    2131                 :    _SkelCpp.Tab() << prefix << "::_op_" << info->_cppName
    2132             492 :       << "(" << endl ;
    2133             492 :    _SkelCpp.IncTab() ;
    2134             492 :    _SkelCpp.Tab() << "PortableServer::ServantBase* __this," << endl ;
    2135             492 :    _SkelCpp.Tab() << "YAORB::Request& __request," << endl ;
    2136             492 :    _SkelCpp.Tab() << "YAORB::Reply& __reply)" << endl ;
    2137             492 :    _SkelCpp.DecTab() ;
    2138             492 :    _SkelCpp.Tab() << "{" << endl ;
    2139             492 :    _SkelCpp.IncTab() ;
    2140                 : 
    2141             492 :    _SkelCpp.Tab() << "// 1: Decode request" << endl ;
    2142             492 :    _SkelCpp.Tab() << "YAORB::CDR *" << CDRName << " ;" << endl ;
    2143             492 :    _SkelCpp.Tab() << CDRName << " = __request.GetCDR() ;" << endl ;
    2144             492 :    _SkelCpp.Str() << endl ;
    2145                 : 
    2146                 :    //--------------------------------------------------------------------------
    2147                 :    // Emit code to declare locals for parameters.
    2148                 :    // Emit code to decode the in & inout parameters.
    2149                 :    //--------------------------------------------------------------------------
    2150                 : 
    2151                 :    ParameterListIt itRequest(params) ;
    2152                 : 
    2153                 :    index = 0 ;
    2154                 : 
    2155            1119 :    while (itRequest.GetNext())
    2156                 :    {
    2157                 :       param = itRequest.GetItem() ;
    2158             627 :       pInfo = GetCppInfo(param) ;
    2159             627 :       IDLType *paramType = param->GetType() ;
    2160                 : 
    2161             627 :       paramIsFixedType = IsTypeFixedLength(paramType) ;
    2162                 : 
    2163             627 :       if (paramIsFixedType)
    2164                 :       {
    2165                 :          mode = PRINT_NORMAL ;
    2166                 :       }
    2167                 :       else
    2168                 :       {
    2169                 :          mode = PRINT_VAR ;
    2170                 :       }
    2171                 : 
    2172             627 :       _SkelCpp.Tab() ;
    2173                 :       PrintType(_SkelCpp.Str(),
    2174                 :                 paramType,
    2175                 :                 mode,
    2176                 :                 paramIsConstVector[index],
    2177                 :                 paramIsPointerVector[index],
    2178             627 :                 paramIsVarVector[index]) ;
    2179                 : 
    2180             627 :       _SkelCpp.Str() << " " << pInfo->_cppName << " ;" << endl ;
    2181                 : 
    2182             627 :       switch(param->GetAttribute())
    2183                 :       {
    2184                 :          case PARAMETER_IN :
    2185                 :          case PARAMETER_INOUT :
    2186                 :          {
    2187             555 :             _SkelCpp.Tab() ;
    2188                 :             PrintCDR(pInfo->_cppName,
    2189                 :                      paramType,
    2190                 :                      CDRName,
    2191                 :                      paramIsConstVector[index],
    2192                 :                      paramIsPointerVector[index],
    2193             555 :                      _SkelCpp.Str()) ;
    2194                 :             break ;
    2195                 :          }
    2196                 :          case PARAMETER_OUT :
    2197                 :          {
    2198                 :             break ;
    2199                 :          }
    2200                 :       }
    2201                 : 
    2202                 :       index ++ ;
    2203                 :    }
    2204                 : 
    2205             492 :    _SkelCpp.Str() << endl ;
    2206                 : 
    2207                 :    //--------------------------------------------------------------------------
    2208                 :    // Emit code to declare a variable for the return value.
    2209                 :    //--------------------------------------------------------------------------
    2210                 : 
    2211             492 :    bool returnIsConst = false ;
    2212             492 :    bool returnIsPointer = false ;
    2213             492 :    bool returnIsVar = false ;
    2214                 : 
    2215             492 :    if (returnType->isA() != idl_void)
    2216                 :    {
    2217             327 :       if (info->_isVar)
    2218                 :       {
    2219                 :          mode = PRINT_VAR ;
    2220                 :       }
    2221                 :       else
    2222                 :       {
    2223                 :          mode = PRINT_NORMAL ;
    2224                 :       }
    2225                 : 
    2226             327 :       _SkelCpp.Tab() ;
    2227                 :       PrintType(_SkelCpp.Str(),
    2228                 :                 returnType,
    2229                 :                 mode,
    2230                 :                 returnIsConst,
    2231                 :                 returnIsPointer,
    2232             327 :                 returnIsVar) ;
    2233                 : 
    2234             327 :       _SkelCpp.Str() << " " << resultName << " ;" << endl ;
    2235                 :    }
    2236                 : 
    2237                 :    //--------------------------------------------------------------------------
    2238                 :    // Emit code to generate the call
    2239                 :    //--------------------------------------------------------------------------
    2240                 : 
    2241             492 :    String className = Prefix(info->_cppSkelFullName) ;
    2242             492 :    _SkelCpp.Tab() << className << " *__that ;" << endl ;
    2243                 :    _SkelCpp.Tab() << "__that = (" << className << "*) __this ;"
    2244             492 :       << endl ;
    2245                 : 
    2246             492 :    if (returnType->isA() != idl_void)
    2247                 :    {
    2248                 : 
    2249                 :       _SkelCpp.Tab() << resultName << " = __that->"
    2250             327 :          << info->_cppName << "(" ;
    2251                 :    }
    2252                 :    else
    2253                 :    {
    2254             165 :       _SkelCpp.Tab() << "__that->" << info->_cppName << "(" ;
    2255                 :    }
    2256                 : 
    2257             492 :    _SkelCpp.IncTab() ;
    2258             492 :    PrintCallParameterList(params, _SkelCpp) ;
    2259             492 :    _SkelCpp.DecTab() ;
    2260                 : 
    2261             492 :    _SkelCpp.Str() << ") ;" << endl << endl ;
    2262                 : 
    2263                 :    //--------------------------------------------------------------------------
    2264                 :    // Emit code to encode the return value.
    2265                 :    //--------------------------------------------------------------------------
    2266                 : 
    2267             492 :    if (returnType->isA() != idl_void)
    2268                 :    {
    2269             327 :       _SkelCpp.Tab() ;
    2270                 :       PrintCDR(resultName,
    2271                 :                returnType,
    2272                 :                CDRName,
    2273                 :                returnIsConst,
    2274                 :                returnIsPointer,
    2275             327 :                _SkelCpp.Str()) ;
    2276                 :    }
    2277                 : 
    2278                 :    //--------------------------------------------------------------------------
    2279                 :    // Emit code to encode the out & inout parameters.
    2280                 :    //--------------------------------------------------------------------------
    2281                 : 
    2282                 :    ParameterListIt itReply(params) ;
    2283                 : 
    2284                 :    index = 0 ;
    2285                 : 
    2286            1119 :    while (itReply.GetNext())
    2287                 :    {
    2288                 :       param = itReply.GetItem() ;
    2289             627 :       pInfo = GetCppInfo(param) ;
    2290                 : 
    2291             627 :       switch(param->GetAttribute())
    2292                 :       {
    2293                 :          case PARAMETER_OUT :
    2294                 :          case PARAMETER_INOUT :
    2295                 :          {
    2296              72 :             IDLType *paramType = param->GetType() ;
    2297                 : 
    2298              72 :             _SkelCpp.Tab() ;
    2299                 :             PrintCDR(pInfo->_cppName,
    2300                 :                      paramType,
    2301                 :                      CDRName,
    2302                 :                      paramIsConstVector[index],
    2303                 :                      paramIsPointerVector[index],
    2304             144 :                      _SkelCpp.Str()) ;
    2305                 :             break ;
    2306                 :          }
    2307                 :          case PARAMETER_IN :
    2308                 :          {
    2309                 :             // Not used in reply.
    2310                 :             break ;
    2311                 :          }
    2312                 :       }
    2313                 : 
    2314                 :       index ++ ;
    2315                 :    }
    2316                 : 
    2317             492 :    _SkelCpp.DecTab() ;
    2318             492 :    _SkelCpp.Tab() << "}" << endl << endl ;
    2319                 : 
    2320             492 :    if (nbParam >0)
    2321                 :    {
    2322             362 :       delete [] paramIsConstVector ;
    2323             362 :       delete [] paramIsPointerVector ;
    2324             362 :       delete [] paramIsVarVector ;
    2325               0 :    }
    2326                 : }
    2327                 : 
    2328                 : void LangCpp::PrintParameterList(
    2329                 :    const ParameterList& params,
    2330                 :    CodePrinter & str,
    2331            1549 :    bool buildInfo)
    2332                 : {
    2333                 :    Parameter *param = NULL ;
    2334                 : 
    2335            1549 :    if (params.size() == 0)
    2336                 :    {
    2337                 :       // No parameters at all.
    2338             409 :       str.Str() << "void" ;
    2339                 :    }
    2340                 :    else
    2341                 :    {
    2342                 :       ParameterListIt it(params) ;
    2343                 : 
    2344            1140 :       str.Str() << endl ;
    2345                 : 
    2346            1140 :       if (it.GetNext())
    2347                 :       {
    2348                 :          param = it.GetItem() ;
    2349            1140 :          PrintParameter(param, str, buildInfo) ;
    2350                 :       }
    2351                 : 
    2352            1979 :       while (it.GetNext())
    2353                 :       {
    2354             839 :          str.Str() << "," << endl ;
    2355                 : 
    2356                 :          param = it.GetItem() ;
    2357             839 :          PrintParameter(param, str, buildInfo) ;
    2358                 :       }
    2359                 :    }
    2360                 : }
    2361                 : 
    2362                 : void LangCpp::PrintParameter(
    2363                 :    Parameter *param,
    2364                 :    CodePrinter & str,
    2365            1979 :    bool buildInfo)
    2366                 : {
    2367                 :    CppInfo *info ;
    2368            1979 :    if (buildInfo)
    2369                 :    {
    2370             725 :       info = new CppInfo(param) ;
    2371             725 :       SetCppInfo(param, info) ;
    2372                 :    }
    2373                 :    else
    2374                 :    {
    2375            1254 :       info = GetCppInfo(param) ;
    2376                 :    }
    2377                 : 
    2378            1979 :    IDLType* type = param->GetType() ;
    2379                 :    printMode mode = PRINT_IN ; // Initialized to avoid warnings
    2380                 : 
    2381            1979 :    switch(param->GetAttribute())
    2382                 :    {
    2383                 :       case PARAMETER_IN :
    2384                 :       {
    2385                 :          mode = PRINT_IN ;
    2386                 :          break ;
    2387                 :       }
    2388                 :       case PARAMETER_OUT :
    2389                 :       {
    2390                 :          mode = PRINT_OUT ;
    2391                 :          break ;
    2392                 :       }
    2393                 :       case PARAMETER_INOUT :
    2394                 :       {
    2395                 :          mode = PRINT_INOUT ;
    2396                 :          break ;
    2397                 :       }
    2398                 :    }
    2399                 : 
    2400                 :    bool isConst ;
    2401                 :    bool isPointer ;
    2402                 :    bool isVar ;
    2403                 : 
    2404            1979 :    str.Tab() ;
    2405            1979 :    PrintType(str.Str(), type, mode, isConst, isPointer, isVar) ;
    2406            1979 :    str.Str() << " " << info->_cppName ;
    2407                 : 
    2408            1979 :    if (buildInfo)
    2409                 :    {
    2410             725 :       info->_isConst = isConst ;
    2411             725 :       info->_isPointer = isPointer ;
    2412             725 :       info->_isVar = isVar ;
    2413                 :    }
    2414                 : }
    2415                 : 
    2416                 : void LangCpp::PrintCallParameterList(
    2417                 :    const ParameterList& params,
    2418             492 :    CodePrinter & str)
    2419                 : {
    2420                 :    Parameter *param = NULL ;
    2421                 : 
    2422             492 :    if (params.size() == 0)
    2423                 :    {
    2424                 :       // No parameters at all.
    2425                 :    }
    2426                 :    else
    2427                 :    {
    2428                 :       ParameterListIt it(params) ;
    2429                 : 
    2430             362 :       str.Str() << endl ;
    2431                 : 
    2432             362 :       if (it.GetNext())
    2433                 :       {
    2434                 :          param = it.GetItem() ;
    2435             362 :          PrintCallParameter(param, str) ;
    2436                 :       }
    2437                 : 
    2438             627 :       while (it.GetNext())
    2439                 :       {
    2440             265 :          str.Str() << "," << endl ;
    2441                 : 
    2442                 :          param = it.GetItem() ;
    2443             265 :          PrintCallParameter(param, str) ;
    2444                 :       }
    2445                 :    }
    2446                 : }
    2447                 : 
    2448                 : void LangCpp::PrintCallParameter(
    2449                 :    Parameter *param,
    2450             627 :    CodePrinter & str)
    2451                 : {
    2452             627 :    CppInfo *info = GetCppInfo(param) ;
    2453                 : 
    2454             627 :    str.Tab() << info->_cppName ;
    2455                 : 
    2456             627 :    if (info->_isVar)
    2457                 :    {
    2458             356 :       switch(param->GetAttribute())
    2459                 :       {
    2460                 :          case PARAMETER_IN :
    2461                 :          {
    2462             307 :             str.Str() << ".in()" ;
    2463                 :             break ;
    2464                 :          }
    2465                 :          case PARAMETER_OUT :
    2466                 :          {
    2467              49 :             str.Str() << ".out()" ;
    2468                 :             break ;
    2469                 :          }
    2470                 :          case PARAMETER_INOUT :
    2471                 :          {
    2472               0 :             str.Str() << ".inout()" ;
    2473                 :             break ;
    2474                 :          }
    2475                 :       }
    2476                 :    }
    2477                 : }
    2478                 : 
    2479                 : void LangCpp::GenerateTypedefDecl(
    2480                 :    SymbolContainer *symTab,
    2481              69 :    Typedef *type_def)
    2482                 : {
    2483              69 :    CppInfo *info = new CppInfo(type_def) ;
    2484              69 :    SetCppInfo(type_def, info) ;
    2485                 : 
    2486              69 :    IDLType* type = type_def->GetType() ;
    2487                 : 
    2488              69 :    _H.Tab() << "typedef " ;
    2489                 :    PrintType(_H.Str(),
    2490                 :              type,
    2491                 :              PRINT_NORMAL,
    2492                 :              info->_isConst,
    2493                 :              info->_isPointer,
    2494              69 :              info->_isVar) ;
    2495                 : 
    2496              69 :    _H.Str() << " " << info->_cppName << " ;" << endl ;
    2497                 : 
    2498              69 :    if (type->isA() == idl_sequence)
    2499                 :    {
    2500                 :       _H.Tab() << "typedef CORBAVLengthStructVar<" << info->_cppName
    2501              45 :          << "> " << info->_cppName << "_var ;" << endl ;
    2502                 :    }
    2503                 : 
    2504              69 :    _H.Str() << endl ;
    2505                 : }
    2506                 : 
    2507                 : void LangCpp::GenerateExceptionDecl(
    2508                 :    SymbolContainer *symbTab,
    2509              76 :    Exception *exception)
    2510                 : {
    2511              76 :    CppInfo *info = new CppInfo(exception) ;
    2512              76 :    SetCppInfo(exception, info) ;
    2513                 : 
    2514                 :    //=============================== H, Part 1 =================================
    2515                 :    // class Foo : public CORBA::UserException
    2516                 :    // {
    2517                 :    //    public:
    2518                 :    //       Foo();
    2519                 :    //       Foo(const Foo &);
    2520                 :    //       FIXME : Foo(<<CONTENT>>) ;
    2521                 :    //       ~Foo();
    2522                 :    //       Foo &operator=(const Foo &);
    2523                 :    //
    2524                 :    //       FIXME : Any &exception();
    2525                 :    //       static Foo* _downcast(CORBA::UserException*);
    2526                 :    //       static const Foo* _downcast(const CORBA::UserException*);
    2527                 :    //       virtual void _raise(void) const ;
    2528                 :    //    private:
    2529                 :    //       FIXME : <<CONTENT>
    2530                 :    // };
    2531                 : 
    2532                 :    _H.Tab() << "class " << info->_cppName
    2533              76 :       << " : public CORBA::UserException" << endl ;
    2534              76 :    _H.Tab() << "{" << endl ;
    2535                 : 
    2536              76 :    _H.IncTab() ;
    2537              76 :    _H.Tab() << "public :" << endl ;
    2538              76 :    _H.IncTab() ;
    2539                 : 
    2540              76 :    _H.Tab() << info->_cppName << "() ;" << endl ;
    2541                 : 
    2542                 :    _H.Tab() << info->_cppName << "(const " << info->_cppName << "& ) ;"
    2543              76 :       << endl ;
    2544                 : 
    2545              76 :    _H.Tab() << "~" << info->_cppName << "() ;" << endl ;
    2546                 : 
    2547                 :    _H.Tab() << info->_cppName << "& operator =(const "
    2548              76 :       << info->_cppName << "& ) ;" << endl ;
    2549              76 :    _H.Str() << endl ;
    2550                 : 
    2551                 :    _H.Tab() << "static " << info->_cppName
    2552              76 :       << "* _downcast(CORBA::UserException*) ;" << endl ;
    2553                 : 
    2554                 :    _H.Tab() << "static const " << info->_cppName
    2555              76 :       << "* _downcast(const CORBA::UserException*) ;" << endl ;
    2556                 : 
    2557              76 :    _H.Tab() << "virtual void _raise(void) const ;" << endl ;
    2558                 : 
    2559              76 :    _H.DecTab() ;
    2560              76 :    _H.Tab() << "private :" << endl ;
    2561              76 :    _H.IncTab() ;
    2562                 : 
    2563              76 :    const MemberList& members = exception->GetMembers() ;
    2564                 :    MemberListIt it(members) ;
    2565                 :    Member *member = 0 ;
    2566              76 :    bool dummy = true ;
    2567                 : 
    2568             177 :    while (it.GetNext())
    2569                 :    {
    2570                 :       member = it.GetItem() ;
    2571              25 :       GenerateMemberDecl(member, dummy) ;
    2572                 :    }
    2573                 : 
    2574              76 :    info->_hasFixedLengthStorage = false ;
    2575                 : 
    2576                 :    //=============================== H, Part 2 =================================
    2577                 : 
    2578              76 :    _H.DecTab() ;
    2579              76 :    _H.DecTab() ;
    2580              76 :    _H.Tab() << "} ;" << endl << endl ;
    2581                 : 
    2582                 : }
    2583                 : 
    2584                 : void LangCpp::GenerateExceptionImpl(
    2585                 :    SymbolContainer *symbTab,
    2586              76 :    Exception *exception)
    2587                 : {
    2588              76 :    NON_DEV("GenerateExceptionImpl") ;
    2589                 : 
    2590              76 :    CppInfo *info = GetCppInfo(exception) ;
    2591                 : 
    2592                 :    //=============================== CPP ======================================
    2593                 :    // Foo::Foo()
    2594                 :    // {}
    2595                 :    //
    2596                 :    // Foo::Foo(const Foo& except)
    2597                 :    // {}
    2598                 :    // 
    2599                 :    // Foo::~Foo()
    2600                 :    // {}
    2601                 :    //
    2602                 :    // void Foo::_raise(void) const
    2603                 :    // {
    2604                 :    //    throw *this ;
    2605                 :    // }
    2606                 : 
    2607                 :    _Cpp.Tab() << info->_cppFullName
    2608              76 :       << "::" << info->_cppName << "()" << endl ;
    2609              76 :    _Cpp.Tab() << ": CORBA::UserException()" << endl ;
    2610              76 :    _Cpp.Tab() << "{}" << endl << endl ;
    2611                 : 
    2612                 :    _Cpp.Tab() << info->_cppFullName
    2613                 :       << "::" << info->_cppName << "(const "
    2614              76 :       << info->_cppFullName << "& except)" << endl ;
    2615              76 :    _Cpp.Tab() << ": CORBA::UserException(except)" << endl ;
    2616              76 :    _Cpp.Tab() << "{}" << endl << endl ;
    2617                 : 
    2618                 :    _Cpp.Tab() << info->_cppFullName
    2619              76 :       << "::~" << info->_cppName << "()" << endl ;
    2620              76 :    _Cpp.Tab() << "{}" << endl << endl ;
    2621                 : 
    2622                 :    _Cpp.Tab() << "void " << info->_cppFullName
    2623              76 :       << "::_raise(void) const" << endl ;
    2624              76 :    _Cpp.Tab() << "{" << endl ;
    2625              76 :    _Cpp.IncTab() ;
    2626              76 :    _Cpp.Tab() << "throw *this ;" << endl ;
    2627              76 :    _Cpp.DecTab() ;
    2628              76 :    _Cpp.Tab() << "}" << endl << endl ;
    2629                 : }
    2630                 : 
    2631                 : void LangCpp::GenerateStructDecl(
    2632                 :    SymbolContainer *symTab,
    2633                 :    Struct *structure,
    2634              42 :    bool pseudo)
    2635                 : {
    2636              42 :    CppInfo *info = new CppInfo(structure) ;
    2637              42 :    SetCppInfo(structure, info) ;
    2638                 : 
    2639                 :    //=============================== H, Part 1 =================================
    2640                 :    // struct Foo
    2641                 :    // {
    2642                 :    //    << CONTENT >>
    2643                 : 
    2644              42 :    _H.Tab() << "struct " << info->_cppName << endl ;
    2645              42 :    _H.Tab() << "{" << endl ;
    2646                 : 
    2647              42 :    _H.IncTab() ;
    2648                 : 
    2649                 :    //=============================== CONTENT ===================================
    2650                 : 
    2651              42 :    const MemberList& members = structure->GetMembers() ;
    2652                 :    MemberListIt it(members) ;
    2653                 :    Member *member = 0 ;
    2654              42 :    bool memberFixedLength = true ;
    2655                 :    bool structFixedLength = true ;
    2656                 : 
    2657             244 :    while (it.GetNext())
    2658                 :    {
    2659                 :       member = it.GetItem() ;
    2660             160 :       GenerateMemberDecl(member, memberFixedLength) ;
    2661             160 :       if (memberFixedLength == false)
    2662                 :       {
    2663                 :          structFixedLength = false ;
    2664                 :       }
    2665                 :    }
    2666                 : 
    2667                 :    //=============================== H, Part 2 =================================
    2668                 :    //    << CONTENT >>
    2669                 :    //
    2670                 :    //    void cdr(YAORB::CDR*) ;
    2671                 :    // } ;
    2672                 :    // typedef CORBAVar<Foo> Foo_var ;
    2673                 : 
    2674              42 :    _H.Str() << endl ;
    2675                 : 
    2676              42 :    if ( ! pseudo)
    2677                 :    {
    2678              42 :       _H.Tab() << "void cdr(YAORB::CDR*) ;" << endl ;
    2679                 :    }
    2680              42 :    _H.DecTab() ;
    2681                 : 
    2682              42 :    _H.Tab() << "} ;" << endl ;
    2683                 : 
    2684              42 :    if (structFixedLength)
    2685                 :    {
    2686                 :       _H.Tab() << "typedef CORBAFixedStructVar<" << info->_cppName << "> "
    2687               5 :          << info->_cppName << "_var ;" << endl ;
    2688                 :    }
    2689                 :    else
    2690                 :    {
    2691                 :       _H.Tab() << "typedef CORBAVLengthStructVar<" << info->_cppName << "> "
    2692              37 :          << info->_cppName << "_var ;" << endl ;
    2693                 :    }
    2694                 : 
    2695              42 :    _H.Str() << endl ;
    2696                 : 
    2697              42 :    info->_hasFixedLengthStorage = structFixedLength ;
    2698                 : }
    2699                 : 
    2700                 : void LangCpp::GenerateStructImpl(
    2701                 :    SymbolContainer *symTab,
    2702                 :    Struct *structure,
    2703              42 :    bool pseudo)
    2704                 : {
    2705              42 :    if (pseudo)
    2706                 :    {
    2707              42 :       return ;
    2708                 :    }
    2709                 : 
    2710              42 :    CppInfo *info = GetCppInfo(structure) ;
    2711              52 :    static String cdrName("__cdrs") ;
    2712                 : 
    2713                 :    //=============================== CPP ======================================
    2714                 :    // void Foo::cdr(YAORB::CDR* __cdrs)
    2715                 :    // {
    2716                 :    //    << CONTENT >>
    2717                 : 
    2718                 :    _Cpp.Tab() << "void " << info->_cppFullName
    2719              42 :       << "::cdr(YAORB::CDR* " << cdrName << ")" << endl ;
    2720              42 :    _Cpp.Tab() << "{" << endl ;
    2721                 : 
    2722                 :    //=============================== CONTENT ===================================
    2723                 : 
    2724              42 :    const MemberList& members = structure->GetMembers() ;
    2725                 :    MemberListIt it(members) ;
    2726                 :    Member *member = 0 ;
    2727                 : 
    2728             244 :    while (it.GetNext())
    2729                 :    {
    2730             160 :       (void) Tabulate(_Cpp.Str(), 1) ;
    2731                 :       member = it.GetItem() ;
    2732             160 :       GenerateMemberImpl(member, cdrName) ;
    2733                 :    }
    2734                 : 
    2735                 :    //=============================== CPP ======================================
    2736                 :    //    << CONTENT >>
    2737                 :    // }
    2738                 : 
    2739              42 :    _Cpp.Tab() << "}" << endl << endl ;
    2740                 : }
    2741                 : 
    2742                 : void LangCpp::GenerateMemberDecl(
    2743                 :    Member *member,
    2744             185 :    bool& memberFixedLength)
    2745                 : {
    2746             185 :    CppInfo *info = new CppInfo(member) ;
    2747             185 :    SetCppInfo(member, info) ;
    2748                 : 
    2749             185 :    IDLType *type = member->GetType() ;
    2750                 : 
    2751             185 :    _H.Tab() ;
    2752                 : 
    2753             185 :    memberFixedLength = IsTypeFixedLength(type) ;
    2754                 : 
    2755             185 :    if (memberFixedLength)
    2756                 :    {
    2757                 :       PrintType(_H.Str(),
    2758                 :                 type,
    2759                 :                 PRINT_NORMAL,
    2760                 :                 info->_isConst,
    2761                 :                 info->_isPointer,
    2762              52 :                 info->_isVar) ;
    2763                 :    }
    2764                 :    else
    2765                 :    {
    2766                 :       PrintType(_H.Str(),
    2767                 :                 type,
    2768                 :                 PRINT_VAR,
    2769                 :                 info->_isConst,
    2770                 :                 info->_isPointer,
    2771             133 :                 info->_isVar) ;
    2772                 :    }
    2773                 : 
    2774             185 :    _H.Str() << " " << info->_cppName << " ;" << endl ;
    2775                 : }
    2776                 : 
    2777                 : void LangCpp::GenerateMemberImpl(
    2778                 :    Member *member,
    2779             160 :    const String& cdrName)
    2780                 : {
    2781             160 :    CppInfo *info = GetCppInfo(member) ;
    2782             160 :    IDLType *type = member->GetType() ;
    2783                 : 
    2784                 :    const String& name = info->_cppName ;
    2785                 :    bool isConst = false ;
    2786                 :    bool isPointer = false ;
    2787                 : 
    2788                 :    PrintCDR(name,
    2789                 :             type,
    2790                 :             cdrName,
    2791                 :             isConst,
    2792                 :             isPointer,
    2793             160 :             _Cpp.Str()) ;
    2794                 : }
    2795                 : 
    2796                 : void LangCpp::GenerateUnionDecl(
    2797                 :    SymbolContainer *symTab,
    2798               0 :    Union *union_symbol)
    2799                 : {
    2800               0 :    NON_DEV("GenerateUnionDecl") ;
    2801                 : }
    2802                 : 
    2803                 : void LangCpp::GenerateConstantDecl(
    2804                 :    SymbolContainer *symTab,
    2805              13 :    Constant *constant)
    2806                 : {
    2807              13 :    CppInfo *info = new CppInfo(constant) ;
    2808              13 :    SetCppInfo(constant, info) ;
    2809                 : 
    2810              13 :    info->_isConst = true ;
    2811                 : 
    2812              13 :    IDLValue *value = constant->GetValue() ;
    2813              13 :    IDLType *type = value->GetValueType() ;
    2814                 : 
    2815              13 :    switch (type->isA())
    2816                 :    {
    2817                 :       case idl_string :
    2818                 :       {
    2819               0 :          _H.Tab() << "static const char* const" ;
    2820               0 :          break ;
    2821                 :       }
    2822                 :       case idl_wstring :
    2823                 :       {
    2824               0 :          _H.Tab() << "static const wchar_t* const" ;
    2825               0 :          break ;
    2826                 :       }
    2827                 :       default :
    2828                 :       {
    2829                 :          bool dummy ;
    2830              13 :          _H.Tab() << "static const " ;
    2831                 :          PrintType(_H.Str(),
    2832                 :                    type,
    2833                 :                    PRINT_NORMAL,
    2834                 :                    dummy,
    2835                 :                    info->_isPointer,
    2836              13 :                    info->_isVar) ;
    2837                 :          break ;
    2838                 :       }
    2839                 :    }
    2840                 : 
    2841              13 :    _H.Str() << " " << info->_cppName << " = " ;
    2842              13 :    PrintValue(_H.Str(), value) ;
    2843              13 :    _H.Str() << " ;" << endl ;
    2844                 : }
    2845                 : 
    2846                 : void LangCpp::GenerateEnumDecl(
    2847                 :    SymbolContainer *symTab,
    2848                 :    Enum *enum_symbol,
    2849              31 :    bool pseudo)
    2850                 : {
    2851                 : /*
    2852                 : ** What the function does with an example ...
    2853                 : **
    2854                 : ** INPUT
    2855                 : ** =====
    2856                 : ** IDL : enum Color { red, green, blue } ;
    2857                 : **
    2858                 : ** OUTPUT
    2859                 : ** ======
    2860                 : ** C++ .h :
    2861                 : **
    2862                 : ** enum Color
    2863                 : ** {
    2864                 : **    red = 0,
    2865                 : **    green = 1,
    2866                 : **    blue = 2
    2867                 : ** } ;
    2868                 : ** typedef Color& Color_out ;
    2869                 : ** void CDR_Color(YAORB::CDR*, Color*) ;
    2870                 : **
    2871                 : ** NOTE
    2872                 : ** ====
    2873                 : ** An IDL enum IS implemented using 32 bits (ULong).
    2874                 : ** A C++ enum might NOT be implemented using 32 bits.
    2875                 : **
    2876                 : */
    2877                 : 
    2878              31 :    CppInfo *info = new CppInfo(enum_symbol) ;
    2879              31 :    SetCppInfo(enum_symbol, info) ;
    2880                 : 
    2881              31 :    _H.Tab() << "enum " << info->_cppName << endl ;
    2882              31 :    _H.Tab() << "{" << endl ;
    2883                 : 
    2884              31 :    _H.IncTab() ;
    2885                 : 
    2886              31 :    const EnumItemList& ItemList = enum_symbol->GetItems() ;
    2887                 :    EnumItemListIt it(ItemList) ;
    2888                 :    int value = 0 ;
    2889                 :    EnumItem *item ;
    2890                 : 
    2891              31 :    if (it.GetNext())
    2892                 :    {
    2893                 :       item = it.GetItem() ;
    2894                 : 
    2895              31 :       _H.Tab() << item->GetName() << " = " << value ;
    2896                 :       value ++ ;
    2897                 :    }
    2898                 : 
    2899             172 :    while (it.GetNext())
    2900                 :    {
    2901             141 :       _H.Str() << "," << endl ;
    2902                 : 
    2903                 :       item = it.GetItem() ;
    2904                 : 
    2905             141 :       _H.Tab() << item->GetName() << " = " << value ;
    2906             141 :       value ++ ;
    2907                 :    }
    2908                 : 
    2909              31 :    _H.Str() << endl ;
    2910                 : 
    2911              31 :    _H.DecTab() ;
    2912                 : 
    2913              31 :    _H.Tab() << "} ;" << endl ;
    2914                 :    _H.Tab() << "typedef " << info->_cppName << "& "
    2915              31 :       << info->_cppName << "_out ; " << endl ;
    2916                 : 
    2917              31 :    if ( ! pseudo)
    2918                 :    {
    2919                 :       _H.Tab() << "void CDR_" << info->_cppName 
    2920              30 :          << "(YAORB::CDR*, " << info->_cppName << "*) ;" << endl ;
    2921                 :    }
    2922                 : 
    2923              31 :    _H.Str() << endl ;
    2924                 : }
    2925                 : 
    2926                 : void LangCpp::GenerateEnumImpl(
    2927                 :    SymbolContainer *symTab,
    2928                 :    Enum *enum_symbol,
    2929              31 :    bool pseudo)
    2930                 : {
    2931                 : /*
    2932                 : ** What the function does with an example ...
    2933                 : **
    2934                 : ** INPUT
    2935                 : ** =====
    2936                 : ** IDL : enum Color { red, green, blue } ;
    2937                 : **
    2938                 : ** OUTPUT
    2939                 : ** ======
    2940                 : ** C++ .cpp :
    2941                 : **
    2942                 : ** void <FIXME:fully_qualified_name>::CDR_Color(YAORB::CDR* cdrs, Color* e)
    2943                 : ** {
    2944                 : **    CORBA::ULong value ;
    2945                 : **    switch (cdrs->Op())
    2946                 : **    {
    2947                 : **       case YAORB::CDR_READ:
    2948                 : **       {
    2949                 : **          cdrs->cdr_ULong(& value) ;
    2950                 : **          *e = (Color) value ;
    2951                 : **          break ;
    2952                 : **       }
    2953                 : **       case YAORB::CDR_WRITE:
    2954                 : **       {
    2955                 : **          value = (CORBA::ULong) (*e) ;
    2956                 : **          cdrs->cdr_ULong(& value) ;
    2957                 : **          break ;
    2958                 : **       }
    2959                 : **    }
    2960                 : ** }
    2961                 : **
    2962                 : ** NOTE
    2963                 : ** ====
    2964                 : ** An IDL enum IS implemented using 32 bits (ULong).
    2965                 : ** A C++ enum might NOT be implemented using 32 bits.
    2966                 : **
    2967                 : */
    2968                 : 
    2969              31 :    if (pseudo)
    2970                 :    {
    2971              30 :       return ;
    2972                 :    }
    2973                 : 
    2974              30 :    CppInfo *info = GetCppInfo(enum_symbol) ;
    2975                 : 
    2976              30 :    String prefix = Prefix(info->_cppFullName) ;
    2977                 : 
    2978                 : 
    2979                 :    _Cpp.Tab() << "void " << prefix << "::CDR_" << info->_cppName
    2980              30 :       << "(YAORB::CDR *cdrs, " << info->_cppFullName << " *e)" << endl ;
    2981              30 :    _Cpp.Tab() << "{" << endl ;
    2982              30 :    _Cpp.IncTab() ;
    2983              30 :    _Cpp.Tab() << "CORBA::ULong value ;" << endl ;
    2984              30 :    _Cpp.Tab() << "switch (cdrs->Op())" << endl ;
    2985              30 :    _Cpp.Tab() << "{" << endl ;
    2986              30 :    _Cpp.IncTab() ;
    2987              30 :    _Cpp.Tab() << "case YAORB::CDR_READ:" << endl ;
    2988              30 :    _Cpp.Tab() << "{" << endl ;
    2989              30 :    _Cpp.IncTab() ;
    2990              30 :    _Cpp.Tab() << "cdrs->cdr_ULong(& value) ;" << endl ;
    2991              30 :    _Cpp.Tab() << "*e = (" << info->_cppFullName <<") value ;" << endl ;
    2992              30 :    _Cpp.Tab() << "break ;" << endl ;
    2993              30 :    _Cpp.DecTab() ;
    2994              30 :    _Cpp.Tab() << "}" << endl ;
    2995              30 :    _Cpp.Tab() << "case YAORB::CDR_WRITE:" << endl ;
    2996              30 :    _Cpp.Tab() << "{" << endl ;
    2997              30 :    _Cpp.IncTab() ;
    2998              30 :    _Cpp.Tab() << "value = (CORBA::ULong) (*e) ;" << endl ;
    2999              30 :    _Cpp.Tab() << "cdrs->cdr_ULong(& value) ;" << endl ;
    3000              30 :    _Cpp.Tab() << "break ;" << endl ;
    3001              30 :    _Cpp.DecTab() ;
    3002              30 :    _Cpp.Tab() << "}" << endl ;
    3003              30 :    _Cpp.DecTab() ;
    3004              30 :    _Cpp.Tab() << "}" << endl ;
    3005              30 :    _Cpp.DecTab() ;
    3006              60 :    _Cpp.Tab() << "}" << endl << endl ;
    3007                 : }
    3008                 : 
    3009                 : void LangCpp::PrintType(
    3010                 :    ostream& str,
    3011                 :    IDLType *type,
    3012                 :    printMode mode,
    3013                 :    bool& isConst,
    3014                 :    bool& isPointer,
    3015            6098 :    bool& isVar)
    3016                 : {
    3017            6098 :    switch (type->isA())
    3018                 :    {
    3019                 :       case idl_errorType :
    3020                 :       {
    3021                 :          str << endl ;
    3022               0 :          str << "#error IDL->C++ generation failed due to previous errors." ;
    3023                 :          str << endl ;
    3024                 :          break ;
    3025                 :       }
    3026                 :       case idl_intType :
    3027                 :       {
    3028                 :          IDLIntType *t = (IDLIntType*) type ;
    3029             612 :          PrintIntType(str, t, mode, isConst, isPointer, isVar) ;
    3030                 :          break ;
    3031                 :       }
    3032                 :       case idl_floatType :
    3033                 :       {
    3034                 :          IDLFloatType *t = (IDLFloatType*) type ;
    3035               0 :          PrintFloatType(str, t, mode, isConst, isPointer, isVar) ;
    3036                 :          break ;
    3037                 :       }
    3038                 :       case idl_charType :
    3039                 :       {
    3040               0 :          PrintCharType(str, mode, isConst, isPointer, isVar) ;
    3041                 :          break ;
    3042                 :       }
    3043                 :       case idl_wcharType :
    3044                 :       {
    3045               0 :          PrintWCharType(str, mode, isConst, isPointer, isVar) ;
    3046                 :          break ;
    3047                 :       }
    3048                 :       case idl_boolType :
    3049                 :       {
    3050             872 :          PrintBoolType(str, mode, isConst, isPointer, isVar) ;
    3051                 :          break ;
    3052                 :       }
    3053                 :       case idl_struct :
    3054                 :       {
    3055                 :          IDLStructType *t = (IDLStructType*) type ;
    3056             144 :          PrintStructType(str, t, mode, isConst, isPointer, isVar) ;
    3057                 :          break ;
    3058                 :       }
    3059                 :       case idl_enum :
    3060                 :       {
    3061                 :          IDLEnumType *t = (IDLEnumType*) type ;
    3062             179 :          PrintEnumType(str, t, mode, isConst, isPointer, isVar) ;
    3063                 :          break ;
    3064                 :       }
    3065                 :       case idl_typedef :
    3066                 :       {
    3067                 :          IDLTypedefType *t = (IDLTypedefType*) type ;
    3068            1012 :          PrintTypedefType(str, t, mode, isConst, isPointer, isVar) ;
    3069                 :          break ;
    3070                 :       }
    3071                 :       case idl_array :
    3072                 :       {
    3073               0 :          str << "FIXME idl_array" ;
    3074                 :          break ;
    3075                 :       }
    3076                 :       case idl_sequence :
    3077                 :       {
    3078                 :          IDLSequenceType *t = (IDLSequenceType*) type ;
    3079              48 :          PrintSequenceType(str, t, mode, isConst, isPointer, isVar) ;
    3080                 :          break ;
    3081                 :       }
    3082                 :       case idl_string :
    3083                 :       {
    3084             569 :          PrintStringType(str, mode, isConst, isPointer, isVar) ;
    3085                 :          break ;
    3086                 :       }
    3087                 :       case idl_wstring :
    3088                 :       {
    3089               0 :          PrintWStringType(str, mode, isConst, isPointer, isVar) ;
    3090                 :          break ;
    3091                 :       }
    3092                 :       case idl_any :
    3093                 :       {
    3094             518 :          PrintAnyType(str, mode, isConst, isPointer, isVar) ;
    3095                 :          break ;
    3096                 :       }
    3097                 :       case idl_object :
    3098                 :       {
    3099              97 :          PrintObjectType(str, mode, isConst, isPointer, isVar) ;
    3100                 :          break ;
    3101                 :       }
    3102                 :       case idl_octet :
    3103                 :       {
    3104               0 :          PrintOctetType(str, mode, isConst, isPointer, isVar) ;
    3105                 :          break ;
    3106                 :       }
    3107                 :       case idl_interface :
    3108                 :       {
    3109                 :          IDLInterfaceType *i = (IDLInterfaceType*) type ;
    3110            1527 :          PrintInterfaceType(str, i, mode, isConst, isPointer, isVar) ;
    3111                 :          break ;
    3112                 :       }
    3113                 :       case idl_void :
    3114                 :       {
    3115                 :          ASSERT(mode == PRINT_RETURN) ;
    3116             506 :          str << "void" ;
    3117                 :          break ;
    3118                 :       }
    3119                 :       case idl_native :
    3120                 :       {
    3121                 :          IDLNativeType *t = (IDLNativeType*) type ;
    3122              14 :          PrintNativeType(str, t, mode, isConst, isPointer, isVar) ;
    3123                 :          break ;
    3124                 :       }
    3125                 :    }
    3126                 : }
    3127                 : 
    3128                 : void LangCpp::PrintCDR(
    3129                 :    const String& dataName,
    3130                 :    IDLType *type,
    3131                 :    const String& cdrName,
    3132                 :    bool isConst,
    3133                 :    bool isPointer,
    3134            2509 :    ostream& str)
    3135                 : {
    3136            2509 :    switch (type->isA())
    3137                 :    {
    3138                 :       case idl_errorType :
    3139                 :       {
    3140                 :          str << endl ;
    3141               0 :          str << "#error IDL->C++ generation failed due to previous errors." ;
    3142                 :          str << endl ;
    3143                 :          break ;
    3144                 :       }
    3145                 :       case idl_intType :
    3146                 :       {
    3147                 :          IDLIntType *t = (IDLIntType*) type ;
    3148                 :          PrintCDRInt(
    3149                 :             dataName,
    3150                 :             t,
    3151                 :             cdrName,
    3152                 :             isConst,
    3153                 :             isPointer,
    3154             243 :             str) ;
    3155                 :          break ;
    3156                 :       }
    3157                 :       case idl_floatType :
    3158                 :       {
    3159               0 :          str << "FIXME idl_floatType" ;
    3160                 :          break ;
    3161                 :       }
    3162                 :       case idl_charType :
    3163                 :       {
    3164                 :          PrintCDRChar(
    3165                 :             dataName,
    3166                 :             cdrName,
    3167                 :             isConst,
    3168                 :             isPointer,
    3169               0 :             str) ;
    3170                 :          break ;
    3171                 :       }
    3172                 :       case idl_wcharType :
    3173                 :       {
    3174                 :          PrintCDRWChar(
    3175                 :             dataName,
    3176                 :             cdrName,
    3177                 :             isConst,
    3178                 :             isPointer,
    3179               0 :             str) ;
    3180                 :          break ;
    3181                 :       }
    3182                 :       case idl_boolType :
    3183                 :       {
    3184                 :          PrintCDRBool(
    3185                 :             dataName,
    3186                 :             cdrName,
    3187                 :             isConst,
    3188                 :             isPointer,
    3189             346 :             str) ;
    3190                 :          break ;
    3191                 :       }
    3192                 :       case idl_struct :
    3193                 :       {
    3194                 :          IDLStructType *t = (IDLStructType*) type ;
    3195                 :          PrintCDRStruct(
    3196                 :             dataName,
    3197                 :             t,
    3198                 :             cdrName,
    3199                 :             isConst,
    3200                 :             isPointer,
    3201              58 :             str) ;
    3202                 :          break ;
    3203                 :       }
    3204                 :       case idl_enum :
    3205                 :       {
    3206                 :          IDLEnumType *t = (IDLEnumType*) type ;
    3207                 :          PrintCDREnum(
    3208                 :             dataName,
    3209                 :             t,
    3210                 :             cdrName,
    3211                 :             isConst,
    3212                 :             isPointer,
    3213              63 :             str) ;
    3214                 :          break ;
    3215                 :       }
    3216                 :       case idl_typedef :
    3217                 :       {
    3218                 :          IDLTypedefType *t = (IDLTypedefType*) type ;
    3219                 :          PrintCDRTypedef(
    3220                 :             dataName,
    3221                 :             t,
    3222                 :             cdrName,
    3223                 :             isConst,
    3224                 :             isPointer,
    3225             441 :             str) ;
    3226                 :          break ;
    3227                 :       }
    3228                 :       case idl_array :
    3229                 :       {
    3230               0 :          str << "FIXME idl_array" ;
    3231                 :          break ;
    3232                 :       }
    3233                 :       case idl_sequence :
    3234                 :       {
    3235                 :          IDLSequenceType *t = (IDLSequenceType*) type ;
    3236                 :          PrintCDRSequence(
    3237                 :             dataName,
    3238                 :             t,
    3239                 :             cdrName,
    3240                 :             isConst,
    3241                 :             isPointer,
    3242             176 :             str) ;
    3243                 :          break ;
    3244                 :       }
    3245                 :       case idl_string :
    3246                 :       {
    3247                 :          PrintCDRString(
    3248                 :             dataName,
    3249                 :             cdrName,
    3250                 :             isConst,
    3251                 :             isPointer,
    3252             261 :             str) ;
    3253                 :          break ;
    3254                 :       }
    3255                 :       case idl_wstring :
    3256                 :       {
    3257                 :          PrintCDRWString(
    3258                 :             dataName,
    3259                 :             cdrName,
    3260                 :             isConst,
    3261                 :             isPointer,
    3262               0 :             str) ;
    3263                 :          break ;
    3264                 :       }
    3265                 :       case idl_any :
    3266                 :       {
    3267                 :          PrintCDRAny(
    3268                 :             dataName,
    3269                 :             cdrName,
    3270                 :             isConst,
    3271                 :             isPointer,
    3272             258 :             str) ;
    3273                 :          break ;
    3274                 :       }
    3275                 :       case idl_octet :
    3276                 :       {
    3277                 :          PrintCDROctet(
    3278                 :             dataName,
    3279                 :             cdrName,
    3280                 :             isConst,
    3281                 :             isPointer,
    3282               0 :             str) ;
    3283                 :          break ;
    3284                 :       }
    3285                 :       case idl_interface :
    3286                 :       {
    3287                 :          IDLInterfaceType *t = (IDLInterfaceType*) type ;
    3288                 :          PrintCDRInterface(
    3289                 :             dataName,
    3290                 :             t,
    3291                 :             cdrName,
    3292                 :             isConst,
    3293                 :             isPointer,
    3294             625 :             str) ;
    3295                 :          break ;
    3296                 :       }
    3297                 :       case idl_object :
    3298                 :       {
    3299                 :          PrintCDRObject(
    3300                 :             dataName,
    3301                 :             cdrName,
    3302                 :             isConst,
    3303                 :             isPointer,
    3304              38 :             str) ;
    3305                 :          break ;
    3306                 :       }
    3307                 :       case idl_void :
    3308                 :       {
    3309               0 :          str << "FIXME idl_void" ;
    3310                 :          break ;
    3311                 :       }
    3312                 :       case idl_native :
    3313                 :       {
    3314               0 :          str << "FIXME idl_native" ;
    3315                 :          break ;
    3316                 :       }
    3317                 :    }
    3318                 : }
    3319                 : 
    3320                 : void LangCpp::PrintCDRInt(
    3321                 :    const String& dataName,
    3322                 :    IDLIntType *type,
    3323                 :    const String& cdrName,
    3324                 :    bool isConst,
    3325                 :    bool isPointer,
    3326             243 :    ostream& str)
    3327                 : {
    3328             243 :    str << cdrName << "->" ;
    3329                 : 
    3330             243 :    switch(type->GetType())
    3331                 :    {
    3332                 :       case idl_signed_short :
    3333                 :       {
    3334              38 :          str << "cdr_Short" ;
    3335              38 :          break ;
    3336                 :       }
    3337                 :       case idl_signed_long :
    3338                 :       {
    3339              48 :          str << "cdr_Long" ;
    3340              48 :          break ;
    3341                 :       }
    3342                 :       case idl_signed_long_long :
    3343                 :       {
    3344               0 :          str << "cdr_LongLong" ;
    3345               0 :          break ;
    3346                 :       }
    3347                 :       case idl_unsigned_short :
    3348                 :       {
    3349               3 :          str << "cdr_UShort" ;
    3350               3 :          break ;
    3351                 :       }
    3352                 :       case idl_unsigned_long :
    3353                 :       {
    3354             143 :          str << "cdr_ULong" ;
    3355             143 :          break ;
    3356                 :       }
    3357                 :       case idl_unsigned_long_long :
    3358                 :       {
    3359              11 :          str << "cdr_ULongLong" ;
    3360                 :          break ;
    3361                 :       }
    3362                 :    }
    3363                 : 
    3364                 :    ASSERT(isConst == false) ;
    3365                 :    ASSERT(isPointer == false) ;
    3366             243 :    str << "(& " << dataName << ") ;" << endl ;
    3367                 : }
    3368                 : 
    3369                 : void LangCpp::PrintCDRBool(
    3370                 :    const String& dataName,
    3371                 :    const String& cdrName,
    3372                 :    bool isConst,
    3373                 :    bool isPointer,
    3374             346 :    ostream& str)
    3375                 : {
    3376             346 :    str << cdrName << "->cdr_Boolean(" ;
    3377                 : 
    3378             346 :    if (isConst)
    3379                 :    {
    3380               0 :       str << "(CORBA::Boolean*)" ;
    3381                 :    }
    3382                 : 
    3383             346 :    if ( ! isPointer)
    3384                 :    {
    3385             346 :       str << " & " ;
    3386                 :    }
    3387                 : 
    3388             346 :    str << dataName << ") ;" << endl ;
    3389                 : }
    3390                 : 
    3391                 : void LangCpp::PrintCDRChar(
    3392                 :    const String& dataName,
    3393                 :    const String& cdrName,
    3394                 :    bool isConst,
    3395                 :    bool isPointer,
    3396               0 :    ostream& str)
    3397                 : {
    3398               0 :    str << cdrName << "->cdr_Char(" ;
    3399                 : 
    3400               0 :    if (isConst)
    3401                 :    {
    3402               0 :       str << "(CORBA::Char*)" ;
    3403                 :    }
    3404                 : 
    3405               0 :    if ( ! isPointer)
    3406                 :    {
    3407               0 :       str << " & " ;
    3408                 :    }
    3409                 : 
    3410               0 :    str << dataName << ") ;" << endl ;
    3411                 : }
    3412                 : 
    3413                 : void LangCpp::PrintCDRWChar(
    3414                 :    const String& dataName,
    3415                 :    const String& cdrName,
    3416                 :    bool isConst,
    3417                 :    bool isPointer,
    3418               0 :    ostream& str)
    3419                 : {
    3420               0 :    str << cdrName << "->cdr_WChar(" ;
    3421                 : 
    3422               0 :    if (isConst)
    3423                 :    {
    3424               0 :       str << "(CORBA::WChar*)" ;
    3425                 :    }
    3426                 : 
    3427               0 :    if ( ! isPointer)
    3428                 :    {
    3429               0 :       str << " & " ;
    3430                 :    }
    3431                 : 
    3432               0 :    str << dataName << ") ;" << endl ;
    3433                 : }
    3434                 : 
    3435                 : void LangCpp::PrintCDRStruct(
    3436                 :    const String& dataName,
    3437                 :    IDLStructType *type,
    3438                 :    const String& cdrName,
    3439                 :    bool isConst,
    3440                 :    bool isPointer,
    3441              58 :    ostream& str)
    3442                 : {
    3443              58 :    Struct *s = type->GetSymbol() ;
    3444              58 :    CppInfo *info = GetCppInfo(s) ;
    3445                 : 
    3446              58 :    if (isConst == true)
    3447                 :    {
    3448              11 :       str << "((" << info->_cppFullName ;
    3449                 : 
    3450              11 :       if (isPointer == true)
    3451                 :       {
    3452               0 :          str << "*" ;
    3453                 :       }
    3454                 : 
    3455              11 :       str << ")" << dataName << ")" ;
    3456                 :    }
    3457                 :    else
    3458                 :    {
    3459              47 :       str << dataName ;
    3460                 :    }
    3461                 : 
    3462                 : 
    3463              58 :    if (isPointer == true)
    3464                 :    {
    3465               9 :       str << "->cdr(" << cdrName << ") ;" << endl ;
    3466                 :    }
    3467                 :    else
    3468                 :    {
    3469              49 :       str << ".cdr(" << cdrName << ") ;" << endl ;
    3470                 :    }
    3471                 : 
    3472                 :    return ;
    3473                 : }
    3474                 : 
    3475                 : void LangCpp::PrintCDREnum(
    3476                 :    const String& dataName,
    3477                 :    IDLEnumType *type,
    3478                 :    const String& cdrName,
    3479                 :    bool isConst,
    3480                 :    bool isPointer,
    3481              63 :    ostream& str)
    3482                 : {
    3483              63 :    Enum *e = type->GetSymbol() ;
    3484              63 :    CppInfo *info = GetCppInfo(e) ;
    3485              63 :    const String& prefix = Prefix(info->_cppFullName) ;
    3486                 : 
    3487              63 :    str << prefix << "::CDR_" << info->_cppName ;
    3488              63 :    str << "(" << cdrName << ", & " << dataName << ") ;" << endl ;
    3489                 : 
    3490              63 :    return ;
    3491                 : }
    3492                 : 
    3493                 : void LangCpp::PrintCDRTypedef(
    3494                 :    const String& dataName,
    3495                 :    IDLTypedefType *type,
    3496                 :    const String& cdrName,
    3497                 :    bool isConst,
    3498                 :    bool isPointer,
    3499             441 :    ostream& str)
    3500                 : {
    3501             441 :    Typedef *symbol = type->GetSymbol() ;
    3502             441 :    IDLType* t = symbol->GetType() ;
    3503                 : 
    3504             441 :    PrintCDR(dataName, t, cdrName, isConst, isPointer, str) ;
    3505                 : }
    3506                 : 
    3507                 : void LangCpp::PrintCDRSequence(
    3508                 :    const String& dataName,
    3509                 :    IDLSequenceType *type,
    3510                 :    const String& cdrName,
    3511                 :    bool isConst,
    3512                 :    bool isPointer,
    3513             176 :    ostream& str)
    3514                 : {
    3515                 :    char *call ;
    3516                 : 
    3517             176 :    if (isPointer)
    3518                 :    {
    3519                 :       call = "->" ;
    3520                 :    }
    3521                 :    else
    3522                 :    {
    3523                 :       call = "." ;
    3524                 :    }
    3525                 : 
    3526             176 :    str << dataName << call << "cdr(" << cdrName << ") ;" << endl ;
    3527                 : }
    3528                 : 
    3529                 : void LangCpp::PrintCDRString(
    3530                 :    const String& dataName,
    3531                 :    const String& cdrName,
    3532                 :    bool isConst,
    3533                 :    bool isPointer,
    3534             261 :    ostream& str)
    3535                 : {
    3536                 :    char *call ;
    3537                 : 
    3538             261 :    if (isPointer)
    3539                 :    {
    3540                 :       call = "->" ;
    3541                 :    }
    3542                 :    else
    3543                 :    {
    3544                 :       call = "." ;
    3545                 :    }
    3546                 : 
    3547             261 :    str << dataName << call << "cdr(" << cdrName << ") ;" << endl ;
    3548                 : }
    3549                 : 
    3550                 : void LangCpp::PrintCDRWString(
    3551                 :    const String& dataName,
    3552                 :    const String& cdrName,
    3553                 :    bool isConst,
    3554                 :    bool isPointer,
    3555               0 :    ostream& str)
    3556                 : {
    3557                 :    char *call ;
    3558                 : 
    3559               0 :    if (isPointer)
    3560                 :    {
    3561                 :       call = "->" ;
    3562                 :    }
    3563                 :    else
    3564                 :    {
    3565                 :       call = "." ;
    3566                 :    }
    3567                 : 
    3568               0 :    str << dataName << call << "cdr(" << cdrName << ") ;" << endl ;
    3569                 : }
    3570                 : 
    3571                 : void LangCpp::PrintCDRAny(
    3572                 :    const String& dataName,
    3573                 :    const String& cdrName,
    3574                 :    bool isConst,
    3575                 :    bool isPointer,
    3576             258 :    ostream& str)
    3577                 : {
    3578             258 :    str << "// FIXME CDR" << endl ;
    3579                 : }
    3580                 : 
    3581                 : void LangCpp::PrintCDROctet(
    3582                 :    const String& dataName,
    3583                 :    const String& cdrName,
    3584                 :    bool isConst,
    3585                 :    bool isPointer,
    3586               0 :    ostream& str)
    3587                 : {
    3588               0 :    str << cdrName << "->cdr_Octet(" ;
    3589                 : 
    3590               0 :    if (isConst)
    3591                 :    {
    3592               0 :       str << "(CORBA::Octet*) " ;
    3593                 :    }
    3594                 : 
    3595               0 :    if ( ! isPointer)
    3596                 :    {
    3597               0 :       str << "& " ;
    3598                 :    }
    3599                 : 
    3600               0 :    str << dataName << ") ;" << endl ;
    3601                 : }
    3602                 : 
    3603                 : void LangCpp::PrintCDRInterface(
    3604                 :    const String& dataName,
    3605                 :    IDLInterfaceType *type,
    3606                 :    const String& cdrName,
    3607                 :    bool isConst,
    3608                 :    bool isPointer,
    3609             625 :    ostream& str)
    3610                 : {
    3611             625 :    str << "NON_DEV(\"LangCpp::PrintCDRInterface\") ;" << endl ;
    3612                 : 
    3613             625 :    Interface *i = type->GetSymbol() ;
    3614             625 :    CppInfo *info = GetCppInfo(i) ;
    3615                 : 
    3616             625 :    str << dataName << " = " << info->_cppFullName << "::_nil() ;" << endl ;
    3617                 : 
    3618                 : #ifdef LATER
    3619                 : // Brain damaged : get rid of "encode"
    3620                 :    if (encode)
    3621                 :    {
    3622                 :       str << dataName << "->cdr(" << cdrName << ") ;"
    3623                 :         << endl ;
    3624                 :    }
    3625                 :    else
    3626                 :    {
    3627                 :       Interface *i = type->GetSymbol() ;
    3628                 :       CppInfo *info = GetCppInfo(i) ;
    3629                 : 
    3630                 :       str << dataName << " = " << info->_cppFullName ;
    3631                 :       str << "::_bind(" << cdrName << ") ;" << endl ;
    3632                 :    }
    3633                 : #endif
    3634                 : }
    3635                 : 
    3636                 : void LangCpp::PrintCDRObject(
    3637                 :    const String& dataName,
    3638                 :    const String& cdrName,
    3639                 :    bool isConst,
    3640                 :    bool isPointer,
    3641              38 :    ostream& str)
    3642                 : {
    3643              38 :    str << "NON_DEV(\"LangCpp::PrintCDRObject\") ;" << endl ;
    3644                 : 
    3645              38 :    if (isConst == false)
    3646                 :    {
    3647              24 :       str << dataName << " = CORBA::Object::_nil() ;" << endl ;
    3648                 :    }
    3649                 : 
    3650                 : #ifdef LATER
    3651                 : // Brain damaged :
    3652                 :    if (encode)
    3653                 :    {
    3654                 :       str << dataName << "->cdr(" << cdrName << ") ;" << endl ;
    3655                 :    }
    3656                 :    else
    3657                 :    {
    3658                 :       str << dataName << " = CORBA::Object::_bind(" << cdrName << ") ;" << endl ;
    3659                 :    }
    3660                 : #endif
    3661                 : }
    3662                 : 
    3663                 : void LangCpp::PrintNativeType(
    3664                 :    ostream& str,
    3665                 :    IDLNativeType *type,
    3666                 :    printMode mode,
    3667                 :    bool& isConst,
    3668                 :    bool& isPointer,
    3669              14 :    bool& isVar)
    3670                 : {
    3671              14 :    SymNative *symbol = type->GetSymbol() ;
    3672              14 :    const String& name = symbol->GetFullyQualifiedName() ;
    3673                 : 
    3674              14 :    if (name == "PortableServer::ServantLocator::Cookie")
    3675                 :    {
    3676               2 :       isConst = false ;
    3677               2 :       isPointer = true ;
    3678               2 :       isVar = false ;
    3679                 : 
    3680               2 :       switch(mode)
    3681                 :       {
    3682                 :          case PRINT_NORMAL :
    3683                 :          case PRINT_IN :
    3684                 :          case PRINT_RETURN :
    3685                 :          {
    3686               1 :             str << "void*" ;
    3687                 :             break ;
    3688                 :          }
    3689                 :          case PRINT_OUT :
    3690                 :          case PRINT_INOUT :
    3691                 :          {
    3692               1 :             str << "void*&" ;
    3693                 :             break ;
    3694                 :          }
    3695                 :          case PRINT_PTR :
    3696                 :          case PRINT_VAR :
    3697                 :          {
    3698                 :             str << endl ;
    3699               0 :             str << "#error Unsupported native Cookie usage." << endl ;
    3700                 :             break ;
    3701                 :          }
    3702                 :       }
    3703                 :       return ;
    3704                 :    }
    3705                 : 
    3706                 :    // Default Native mapping, also used for "PortableServer::Servant"
    3707                 : 
    3708              12 :    isVar = false ; // FIXME
    3709                 : 
    3710              12 :    switch(mode)
    3711                 :    {
    3712                 :       case PRINT_NORMAL :
    3713                 :       case PRINT_RETURN :
    3714                 :       {
    3715               5 :          isConst = false ;
    3716               5 :          isPointer = false ;
    3717               5 :          str << name;
    3718                 :          break ;
    3719                 :       }
    3720                 :       case PRINT_IN :
    3721                 :       {
    3722               7 :          isConst = true ;
    3723               7 :          isPointer = false ;
    3724               7 :          str << "const " << name << "&" ;
    3725                 :          break ;
    3726                 :       }
    3727                 :       case PRINT_OUT :
    3728                 :       {
    3729               0 :          isConst = false ;
    3730               0 :          isPointer = false ;
    3731               0 :          str << name << "&" ;
    3732                 :          break ;
    3733                 :       }
    3734                 :       case PRINT_INOUT :
    3735                 :       {
    3736               0 :          isConst = false ;
    3737               0 :          isPointer = true ;
    3738               0 :          str << name << "*&" ;
    3739                 :          break ;
    3740                 :       }
    3741                 :       case PRINT_PTR :
    3742                 :       {
    3743               0 :          isConst = false ;
    3744               0 :          isPointer = false ;
    3745               0 :          str << name << "_ptr" ;
    3746                 :          break ;
    3747                 :       }
    3748                 :       case PRINT_VAR :
    3749                 :       {
    3750               0 :          isConst = false ;
    3751               0 :          isPointer = false ;
    3752               0 :          str << name << "_var" ;
    3753                 :          break ;
    3754                 :       }
    3755                 :    }
    3756                 : }
    3757                 : 
    3758                 : void LangCpp::PrintIntType(
    3759                 :    ostream& str,
    3760                 :    IDLIntType *type,
    3761                 :    printMode mode,
    3762                 :    bool& isConst,
    3763                 :    bool& isPointer,
    3764             612 :    bool& isVar)
    3765                 : {
    3766             612 :    isConst = false ;
    3767             612 :    isPointer = false ;
    3768             612 :    isVar = false ;
    3769                 : 
    3770             612 :    switch(type->GetType())
    3771                 :    {
    3772                 :       case idl_signed_short :
    3773                 :       {
    3774             106 :          str << "CORBA::Short" ;
    3775             106 :          break ;
    3776                 :       }
    3777                 :       case idl_signed_long :
    3778                 :       {
    3779             107 :          str << "CORBA::Long" ;
    3780             107 :          break ;
    3781                 :       }
    3782                 :       case idl_signed_long_long :
    3783                 :       {
    3784               0 :          str << "CORBA::LongLong" ;
    3785               0 :          break ;
    3786                 :       }
    3787                 :       case idl_unsigned_short :
    3788                 :       {
    3789              19 :          str << "CORBA::UShort" ;
    3790              19 :          break ;
    3791                 :       }
    3792                 :       case idl_unsigned_long :
    3793                 :       {
    3794             353 :          str << "CORBA::ULong" ;
    3795             353 :          break ;
    3796                 :       }
    3797                 :       case idl_unsigned_long_long :
    3798                 :       {
    3799              27 :          str << "CORBA::ULongLong" ;
    3800                 :          break ;
    3801                 :       }
    3802                 :    }
    3803                 : 
    3804             612 :    switch (mode)
    3805                 :    {
    3806                 :       case PRINT_VAR:
    3807                 :       case PRINT_NORMAL:
    3808                 :       case PRINT_IN:
    3809                 :       case PRINT_RETURN:
    3810                 :       {
    3811                 :          // Nothing
    3812                 :          break ;
    3813                 :       }
    3814                 :       case PRINT_OUT:
    3815                 :       case PRINT_INOUT:
    3816                 :       {
    3817              15 :          str << "&" ;
    3818                 :          break ;
    3819                 :       }
    3820                 :       case PRINT_PTR:
    3821                 :       {
    3822                 :          ASSERT(false) ;
    3823                 :       }
    3824                 :    }
    3825                 : }
    3826                 : 
    3827                 : void LangCpp::PrintFloatType(
    3828                 :    ostream& str,
    3829                 :    IDLFloatType *type,
    3830                 :    printMode mode,
    3831                 :    bool& isConst,
    3832                 :    bool& isPointer,
    3833               0 :    bool& isVar)
    3834                 : {
    3835               0 :    isConst = false ;
    3836               0 :    isPointer = false ;
    3837               0 :    isVar = false ;
    3838                 : 
    3839               0 :    switch(type->GetType())
    3840                 :    {
    3841                 :       case idl_float :
    3842                 :       {
    3843               0 :          str << "CORBA::Float" ;
    3844               0 :          break ;
    3845                 :       }
    3846                 :       case idl_double :
    3847                 :       {
    3848               0 :          str << "CORBA::Double" ;
    3849               0 :          break ;
    3850                 :       }
    3851                 :       case idl_long_double :
    3852                 :       {
    3853               0 :          str << "CORBA::LongDouble" ;
    3854                 :          break ;
    3855                 :       }
    3856                 :    }
    3857                 : 
    3858               0 :    switch (mode)
    3859                 :    {
    3860                 :       case PRINT_VAR:
    3861                 :       case PRINT_NORMAL:
    3862                 :       case PRINT_IN:
    3863                 :       case PRINT_RETURN:
    3864                 :       {
    3865                 :          // Nothing
    3866                 :          break ;
    3867                 :       }
    3868                 :       case PRINT_OUT:
    3869                 :       case PRINT_INOUT:
    3870                 :       {
    3871               0 :          str << "&" ;
    3872                 :          break ;
    3873                 :       }
    3874                 :       case PRINT_PTR:
    3875                 :       {
    3876                 :          ASSERT(false) ;
    3877                 :       }
    3878                 :    }
    3879                 : }
    3880                 : 
    3881                 : void LangCpp::PrintStringType(
    3882                 :    ostream& str,
    3883                 :    printMode mode,
    3884                 :    bool& isConst,
    3885                 :    bool& isPointer,
    3886             569 :    bool& isVar)
    3887                 : {
    3888             569 :    isPointer = false ; // CDR prototype accept char*
    3889             569 :    isVar = true ; // use String_var for .in() .inout() .out() and ._retn()
    3890                 : 
    3891             569 :    switch (mode)
    3892                 :    {
    3893                 :       case PRINT_NORMAL :
    3894                 :       case PRINT_RETURN :
    3895                 :       {
    3896              70 :          isConst = false ;
    3897              70 :          str << "char*" ;
    3898                 :          break ;
    3899                 :       }
    3900                 :       case PRINT_IN :
    3901                 :       {
    3902             320 :          isConst = true ;
    3903             320 :          str << "const char*" ;
    3904                 :          break ;
    3905                 :       }
    3906                 :       case PRINT_OUT :
    3907                 :       case PRINT_INOUT :
    3908                 :       {
    3909               9 :          isConst = false ;
    3910               9 :          str << "char*&" ;
    3911                 :          break ;
    3912                 :       }
    3913                 :       case PRINT_VAR :
    3914                 :       {
    3915             170 :          isConst = false ;
    3916             170 :          str << "CORBA::String_var" ;
    3917                 :          break ;
    3918                 :       }
    3919                 :       case PRINT_PTR :
    3920                 :       {
    3921               0 :          isConst = false ;
    3922               0 :          str << "CORBA::String_ptr" ;
    3923                 :          break ;
    3924                 :       }
    3925                 :    }
    3926                 : }
    3927                 : 
    3928                 : void LangCpp::PrintWStringType(
    3929                 :    ostream& str,
    3930                 :    printMode mode,
    3931                 :    bool& isConst,
    3932                 :    bool& isPointer,
    3933               0 :    bool& isVar)
    3934                 : {
    3935               0 :    isPointer = false ; // CDR prototype accept WChar*
    3936               0 :    isVar = true ; // use WString_var for .in() .inout() .out() and ._retn()
    3937                 : 
    3938               0 :    switch (mode)
    3939                 :    {
    3940                 :       case PRINT_NORMAL :
    3941                 :       case PRINT_RETURN :
    3942                 :       {
    3943               0 :          isConst = false ;
    3944               0 :          str << "CORBA::WChar*" ;
    3945                 :          break ;
    3946                 :       }
    3947                 :       case PRINT_IN :
    3948                 :       {
    3949               0 :          isConst = true ;
    3950               0 :          str << "const CORBA::WChar*" ;
    3951                 :          break ;
    3952                 :       }
    3953                 :       case PRINT_OUT :
    3954                 :       case PRINT_INOUT :
    3955                 :       {
    3956               0 :          isConst = false ;
    3957               0 :          str << "CORBA::WChar*&" ;
    3958                 :          break ;
    3959                 :       }
    3960                 :       case PRINT_VAR :
    3961                 :       {
    3962               0 :          isConst = false ;
    3963               0 :          str << "CORBA::WString_var" ;
    3964                 :          break ;
    3965                 :       }
    3966                 :       case PRINT_PTR :
    3967                 :       {
    3968               0 :          isConst = false ;
    3969               0 :          str << "CORBA::WString_ptr" ;
    3970                 :          break ;
    3971                 :       }
    3972                 :    }
    3973                 : }
    3974                 : 
    3975                 : void LangCpp::PrintEnumType(
    3976                 :    ostream& str,
    3977                 :    IDLEnumType* type,
    3978                 :    printMode mode,
    3979                 :    bool& isConst,
    3980                 :    bool& isPointer,
    3981             179 :    bool& isVar)
    3982                 : {
    3983             179 :    Enum* e = type->GetSymbol() ;
    3984             179 :    CppInfo *info = GetCppInfo(e) ;
    3985                 : 
    3986             179 :    isConst = false ;
    3987             179 :    isPointer = false ;
    3988                 : 
    3989             179 :    str << info->_cppFullName ;
    3990                 : 
    3991             179 :    if (  (mode == PRINT_OUT)
    3992                 :       || (mode == PRINT_INOUT))
    3993                 :    {
    3994               0 :       str << "&" ;
    3995                 :    }
    3996                 : }
    3997                 : 
    3998                 : void LangCpp::PrintTypedefType(
    3999                 :    ostream& str,
    4000                 :    IDLTypedefType* type,
    4001                 :    printMode mode,
    4002                 :    bool& isConst,
    4003                 :    bool& isPointer,
    4004            1012 :    bool& isVar)
    4005                 : {
    4006            1012 :    Typedef *symbol = type->GetSymbol() ;
    4007            1012 :    CppInfo *info = GetCppInfo(symbol) ;
    4008                 : 
    4009            1012 :    IDLType* t = symbol->GetType() ;
    4010                 : 
    4011            1012 :    if (t->isA() == idl_sequence)
    4012                 :    {
    4013                 :       // For IDL sequence, the typedef name is the C++ type.
    4014             444 :       switch (mode)
    4015                 :       {
    4016                 :          case PRINT_NORMAL :
    4017                 :          {
    4018               6 :             isConst = false ;
    4019               6 :             isPointer = false ;
    4020               6 :             str << info->_cppFullName ;
    4021                 :             break ;
    4022                 :          }
    4023                 :          case PRINT_IN :
    4024                 :          {
    4025             190 :             isConst = true ;
    4026             190 :             isPointer = false ;
    4027             190 :             str << "const " << info->_cppFullName << "&" ;
    4028                 :             break ;
    4029                 :          }
    4030                 :          case PRINT_OUT :
    4031                 :          {
    4032              63 :             isConst = false ;
    4033              63 :             isPointer = true ;
    4034              63 :             str << info->_cppFullName << "*&" ;
    4035                 :             break ;
    4036                 :          }
    4037                 :          case PRINT_INOUT :
    4038                 :          {
    4039               0 :             isConst = false ;
    4040               0 :             isPointer = false ;
    4041               0 :             str << info->_cppFullName << "&" ;
    4042                 :             break ;
    4043                 :          }
    4044                 :          case PRINT_RETURN :
    4045                 :          {
    4046              81 :             isConst = false ;
    4047              81 :             isPointer = true ;
    4048              81 :             str << info->_cppFullName << "*" ;
    4049                 :             break ;
    4050                 :          }
    4051                 :          case PRINT_PTR :
    4052                 :          {
    4053               0 :             isConst = false ;
    4054               0 :             isPointer = false ;
    4055               0 :             str << info->_cppFullName << "_ptr" ;
    4056                 :             break ;
    4057                 :          }
    4058                 :          case PRINT_VAR :
    4059                 :          {
    4060             104 :             isConst = false ;
    4061             104 :             isPointer = false ;
    4062             104 :             str << info->_cppFullName << "_var" ;
    4063                 :             break ;
    4064                 :          }
    4065                 :       }
    4066                 :    }
    4067                 :    else
    4068                 :    {
    4069                 :       // For other IDL types, the C++ type resolves to the aliased type.
    4070             568 :       PrintType(str, t, mode, isConst, isPointer, isVar) ;
    4071                 :    }
    4072                 : }
    4073                 : 
    4074                 : void LangCpp::PrintSequenceType(
    4075                 :    ostream& str,
    4076                 :    IDLSequenceType* type,
    4077                 :    printMode mode,
    4078                 :    bool& isConst,
    4079                 :    bool& isPointer,
    4080              48 :    bool& isVar)
    4081                 : {
    4082                 :    bool dummy1, dummy2, dummy3 ;
    4083                 : 
    4084              48 :    IDLType *elem = type->GetType() ;
    4085              48 :    bool bounded = type->IsBounded() ;
    4086                 : 
    4087              48 :    isConst = false ;
    4088              48 :    isPointer = false ;
    4089                 : 
    4090                 :    const char* name = NULL ;
    4091                 :    const char* bname = NULL ;
    4092                 : 
    4093                 :    // Primitive types have dedicated sequences.
    4094                 : 
    4095              48 :    switch (elem->isA())
    4096                 :    {
    4097                 :       case idl_boolType:
    4098                 :       {
    4099                 :          name = "CORBABooleanSeq" ;
    4100                 :          bname = "CORBABooleanBSeq" ;
    4101               0 :          break ;
    4102                 :       }
    4103                 :       case idl_charType:
    4104                 :       {
    4105                 :          name = "CORBACharSeq" ;
    4106                 :          bname = "CORBACharBSeq" ;
    4107               0 :          break ;
    4108                 :       }
    4109                 :       case idl_wcharType:
    4110                 :       {
    4111                 :          name = "CORBAWCharSeq" ;
    4112                 :          bname = "CORBAWCharBSeq" ;
    4113               0 :          break ;
    4114                 :       }
    4115                 :       case idl_intType:
    4116                 :       {
    4117                 :          IDLIntType *elem2 = (IDLIntType*) elem ;
    4118                 : 
    4119               0 :          switch(elem2->GetType())
    4120                 :          {
    4121                 :             case idl_signed_short:
    4122                 :             {
    4123                 :                name = "CORBAShortSeq" ;
    4124                 :                bname = "CORBAShortBSeq" ;
    4125               0 :                break ;
    4126                 :             }
    4127                 :             case idl_signed_long:
    4128                 :             {
    4129                 :                name = "CORBALongSeq" ;
    4130                 :                bname = "CORBALongBSeq" ;
    4131               0 :                break ;
    4132                 :             }
    4133                 :             case idl_signed_long_long:
    4134                 :             {
    4135                 :                name = "CORBALongLongSeq" ;
    4136                 :                bname = "CORBALongLongBSeq" ;
    4137               0 :                break ;
    4138                 :             }
    4139                 :             case idl_unsigned_short:
    4140                 :             {
    4141                 :                name = "CORBAUShortSeq" ;
    4142                 :                bname = "CORBAUShortBSeq" ;
    4143               0 :                break ;
    4144                 :             }
    4145                 :             case idl_unsigned_long:
    4146                 :             {
    4147                 :                name = "CORBAULongSeq" ;
    4148                 :                bname = "CORBAULongBSeq" ;
    4149               0 :                break ;
    4150                 :             }
    4151                 :             case idl_unsigned_long_long:
    4152                 :             {
    4153                 :                name = "CORBAULongLongSeq" ;
    4154                 :                bname = "CORBAULongLongBSeq" ;
    4155                 :                break ;
    4156                 :             }
    4157                 :          }
    4158                 :          break ;
    4159                 :       }
    4160                 :       case idl_floatType:
    4161                 :       {
    4162                 :          IDLFloatType *elem2 = (IDLFloatType*) elem ;
    4163                 : 
    4164               0 :          switch(elem2->GetType())
    4165                 :          {
    4166                 :             case idl_float:
    4167                 :             {
    4168                 :                name = "CORBAFloatSeq" ;
    4169                 :                bname = "CORBAFloatBSeq" ;
    4170               0 :                break ;
    4171                 :             }
    4172                 :             case idl_double:
    4173                 :             {
    4174                 :                name = "CORBADoubleSeq" ;
    4175                 :                bname = "CORBADoubleBSeq" ;
    4176               0 :                break ;
    4177                 :             }
    4178                 :             case idl_long_double:
    4179                 :             {
    4180                 :                name = "CORBALongDoubleSeq" ;
    4181                 :                bname = "CORBALongDoubleBSeq" ;
    4182                 :                break ;
    4183                 :             }
    4184                 :          }
    4185                 :          break ;
    4186                 :       }
    4187                 :       case idl_octet:
    4188                 :       {
    4189                 :          name = "CORBAOctetSeq" ;
    4190                 :          bname = "CORBAOctetBSeq" ;
    4191                 :          break ;
    4192                 :       }
    4193                 :       default:
    4194                 :       {
    4195                 :          break ;
    4196                 :       }
    4197                 :    }
    4198                 : 
    4199              48 :    if (bounded)
    4200                 :    {
    4201               0 :       if (bname)
    4202                 :       {
    4203               0 :          NON_DEV("bounded sequences for raw types") ;
    4204                 :       }
    4205                 :       else
    4206                 :       {
    4207               0 :          str << "CORBABSequence<" ;
    4208               0 :          PrintType(str, elem, PRINT_VAR, dummy1, dummy2, dummy3) ;
    4209               0 :          str << ", " << type->GetMaxSize() << ">" ;
    4210                 :       }
    4211                 :    }
    4212                 :    else
    4213                 :    {
    4214              48 :       if (name != NULL)
    4215                 :       {
    4216               2 :          str << name ;
    4217                 :       }
    4218                 :       else
    4219                 :       {
    4220              46 :          str << "CORBASequence<" ;
    4221              46 :          PrintType(str, elem, PRINT_VAR, dummy1, dummy2, dummy3) ;
    4222              46 :          str << ">" ;
    4223                 :       }
    4224                 :    }
    4225                 : }
    4226                 : 
    4227                 : void LangCpp::PrintAnyType(
    4228                 :    ostream& str,
    4229                 :    printMode mode,
    4230                 :    bool& isConst,
    4231                 :    bool& isPointer,
    4232             518 :    bool& isVar)
    4233                 : {
    4234             518 :    isVar = true ;
    4235                 : 
    4236             518 :    switch(mode)
    4237                 :    {
    4238                 :       case PRINT_NORMAL:
    4239                 :       {
    4240             130 :          isConst = false ;
    4241             130 :          isPointer = false ;
    4242             130 :          str << "CORBA::Any" ;
    4243                 :          break ;
    4244                 :       }
    4245                 :       case PRINT_IN:
    4246                 :       {
    4247             296 :          isConst = true ;
    4248             296 :          isPointer = false ;
    4249             296 :          str << "const CORBA::Any&" ;
    4250                 :          break ;
    4251                 :       }
    4252                 :       case PRINT_OUT:
    4253                 :       {
    4254              66 :          isConst = false ;
    4255              66 :          isPointer = true ;
    4256              66 :          str << "CORBA::Any*&" ;
    4257                 :          break ;
    4258                 :       }
    4259                 :       case PRINT_INOUT:
    4260                 :       {
    4261               0 :          isConst = false ;
    4262               0 :          isPointer = false ;
    4263               0 :          str << "CORBA::Any&";
    4264                 :          break ;
    4265                 :       }
    4266                 :       case PRINT_RETURN:
    4267                 :       {
    4268              21 :          isConst = false ;
    4269              21 :          isPointer = true ;
    4270              21 :          str << "CORBA::Any*" ;
    4271                 :          break ;
    4272                 :       }
    4273                 :       case PRINT_VAR:
    4274                 :       {
    4275               5 :          isConst = false ;
    4276               5 :          isPointer = false ;
    4277               5 :          str << "CORBA::Any_var" ;
    4278                 :          break ;
    4279                 :       }
    4280                 :       case PRINT_PTR:
    4281                 :       {
    4282               0 :          isConst = false ;
    4283               0 :          isPointer = false ;
    4284               0 :          str << "CORBA::Any_ptr" ;
    4285                 :          break ;
    4286                 :       }
    4287                 :    }
    4288                 : }
    4289                 : 
    4290                 : void LangCpp::PrintObjectType(
    4291                 :    ostream& str,
    4292                 :    printMode mode,
    4293                 :    bool& isConst,
    4294                 :    bool& isPointer,
    4295              97 :    bool& isVar)
    4296                 : {
    4297                 :    // FIXME, certainly wrong
    4298                 : 
    4299              97 :    isVar = true ;
    4300                 : 
    4301              97 :    switch(mode)
    4302                 :    {
    4303                 :       case PRINT_NORMAL:
    4304                 :       {
    4305               2 :          isConst = false ;
    4306               2 :          isPointer = true ;
    4307               2 :          str << "CORBA::Object_ptr" ;
    4308                 :          break ;
    4309                 :       }
    4310                 :       case PRINT_IN:
    4311                 :       {
    4312              44 :          isConst = true ;
    4313              44 :          isPointer = false ;
    4314              44 :          str << "const CORBA::Object_ptr" ;
    4315                 :          break ;
    4316                 :       }
    4317                 :       case PRINT_OUT:
    4318                 :       {
    4319               0 :          isConst = false ;
    4320               0 :          isPointer = true ;
    4321               0 :          str << "CORBA::Object_ptr&" ;
    4322                 :          break ;
    4323                 :       }
    4324                 :       case PRINT_INOUT:
    4325                 :       {
    4326               0 :          isConst = false ;
    4327               0 :          isPointer = true ;
    4328               0 :          str << "CORBA::Object_ptr&";
    4329                 :          break ;
    4330                 :       }
    4331                 :       case PRINT_RETURN:
    4332                 :       {
    4333              30 :          isConst = false ;
    4334              30 :          isPointer = true ;
    4335              30 :          str << "CORBA::Object_ptr" ;
    4336                 :          break ;
    4337                 :       }
    4338                 :       case PRINT_VAR:
    4339                 :       {
    4340              21 :          isConst = false ;
    4341              21 :          isPointer = false ;
    4342              21 :          str << "CORBA::Object_var" ;
    4343                 :          break ;
    4344                 :       }
    4345                 :       case PRINT_PTR:
    4346                 :       {
    4347               0 :          isConst = false ;
    4348               0 :          isPointer = true ;
    4349               0 :          str << "CORBA::Object_ptr" ;
    4350                 :          break ;
    4351                 :       }
    4352                 :    }
    4353                 : }
    4354                 : 
    4355                 : void LangCpp::PrintOctetType(
    4356                 :    ostream& str,
    4357                 :    printMode mode,
    4358                 :    bool& isConst,
    4359                 :    bool& isPointer,
    4360               0 :    bool& isVar)
    4361                 : {
    4362               0 :    isConst = false ;
    4363               0 :    isPointer = false ;
    4364               0 :    isVar = false ;
    4365                 : 
    4366               0 :    str << "CORBA::Octet" ;
    4367                 : 
    4368               0 :    if (   (mode == PRINT_OUT)
    4369                 :        || (mode == PRINT_INOUT))
    4370                 :    {
    4371               0 :       str << "&" ;
    4372                 :    }
    4373                 : }
    4374                 : 
    4375                 : void LangCpp::PrintBoolType(
    4376                 :    ostream& str,
    4377                 :    printMode mode,
    4378                 :    bool& isConst,
    4379                 :    bool& isPointer,
    4380             872 :    bool& isVar)
    4381                 : {
    4382             872 :    isConst = false ;
    4383             872 :    isPointer = false ;
    4384             872 :    isVar = false ;
    4385                 : 
    4386             872 :    str << "CORBA::Boolean" ;
    4387                 : 
    4388             872 :    if (   (mode == PRINT_OUT)
    4389                 :        || (mode == PRINT_INOUT))
    4390                 :    {
    4391              15 :       str << "&" ;
    4392                 :    }
    4393                 : }
    4394                 : 
    4395                 : void LangCpp::PrintCharType(
    4396                 :    ostream& str,
    4397                 :    printMode mode,
    4398                 :    bool& isConst,
    4399                 :    bool& isPointer,
    4400               0 :    bool& isVar)
    4401                 : {
    4402               0 :    isConst = false ;
    4403               0 :    isPointer = false ;
    4404               0 :    isVar = false ;
    4405                 : 
    4406               0 :    str << "CORBA::Char" ;
    4407                 : 
    4408               0 :    if (   (mode == PRINT_OUT)
    4409                 :        || (mode == PRINT_INOUT))
    4410                 :    {
    4411               0 :       str << "&" ;
    4412                 :    }
    4413                 : }
    4414                 : 
    4415                 : void LangCpp::PrintWCharType(
    4416                 :    ostream& str,
    4417                 :    printMode mode,
    4418                 :    bool& isConst,
    4419                 :    bool& isPointer,
    4420               0 :    bool& isVar)
    4421                 : {
    4422               0 :    isConst = false ;
    4423               0 :    isPointer = false ;
    4424               0 :    isVar = false ;
    4425                 : 
    4426               0 :    str << "CORBA::WChar" ;
    4427                 : 
    4428               0 :    if (   (mode == PRINT_OUT)
    4429                 :        || (mode == PRINT_INOUT))
    4430                 :    {
    4431               0 :       str << "&" ;
    4432                 :    }
    4433                 : }
    4434                 : 
    4435                 : void LangCpp::PrintInterfaceType(
    4436                 :    ostream& str,
    4437                 :    IDLInterfaceType* type,
    4438                 :    printMode mode,
    4439                 :    bool& isConst,
    4440                 :    bool& isPointer,
    4441            1527 :    bool& isVar)
    4442                 : {
    4443            1527 :    Symbol *symbol = type->GetSymbol() ;
    4444            1527 :    CppInfo *info = GetCppInfo(symbol) ;
    4445                 : 
    4446            1527 :    isConst = false ;
    4447            1527 :    isPointer = false ;
    4448                 : 
    4449            1527 :    str << info->_cppFullName ;
    4450                 : 
    4451            1527 :    switch(mode)
    4452                 :    {
    4453                 :       case PRINT_NORMAL:
    4454                 :       case PRINT_IN:
    4455                 :       case PRINT_PTR:
    4456                 :       case PRINT_RETURN:
    4457                 :       {
    4458            1282 :          str << "_ptr" ;
    4459                 :          break ;
    4460                 :       }
    4461                 :       case PRINT_OUT:
    4462                 :       case PRINT_INOUT:
    4463                 :       {
    4464              24 :          str << "_ptr&" ;
    4465                 :          break ;
    4466                 :       }
    4467                 :       case PRINT_VAR:
    4468                 :       {
    4469             221 :          str << "_var" ;
    4470                 :          break ;
    4471                 :       }
    4472                 :    }
    4473                 : }
    4474                 : 
    4475                 : void LangCpp::PrintStructType(
    4476                 :    ostream& str,
    4477                 :    IDLStructType *type,
    4478                 :    printMode mode,
    4479                 :    bool& isConst,
    4480                 :    bool& isPointer,
    4481             144 :    bool& isVar)
    4482                 : {
    4483             144 :    Struct *symbol = type->GetSymbol() ;
    4484             144 :    CppInfo *info = GetCppInfo(symbol) ;
    4485                 : 
    4486                 :    // GenerateStructDecl should have set info
    4487                 :    ASSERT(info != NULL) ;
    4488                 : 
    4489             144 :    switch(mode)
    4490                 :    {
    4491                 :       case PRINT_NORMAL :
    4492                 :       {
    4493              15 :          isConst = false ;
    4494              15 :          isPointer = false ;
    4495              15 :          isVar = false ;
    4496              15 :          str << info->_cppFullName ;
    4497                 :          break ;
    4498                 :       }
    4499                 :       case PRINT_IN :
    4500                 :       {
    4501              33 :          isConst = true ;
    4502              33 :          isPointer = false ;
    4503              33 :          isVar = false ;
    4504              33 :          str << "const " << info->_cppFullName << "&" ;
    4505                 :          break ;
    4506                 :       }
    4507                 :       case PRINT_OUT :
    4508                 :       {
    4509              24 :          if (info->_hasFixedLengthStorage == true)
    4510                 :          {
    4511               6 :             isConst = false ;
    4512               6 :             isPointer = false ;
    4513               6 :             isVar = false ;
    4514               6 :             str << info->_cppFullName << "&" ;
    4515                 :          }
    4516                 :          else
    4517                 :          {
    4518              18 :             isConst = false ;
    4519              18 :             isPointer = true ;
    4520              18 :             isVar = false ;
    4521              18 :             str << info->_cppFullName << "*&" ;
    4522                 :          }
    4523                 :          break ;
    4524                 :       }
    4525                 :       case PRINT_INOUT :
    4526                 :       {
    4527               0 :          isConst = false ;
    4528               0 :          isPointer = false ;
    4529               0 :          isVar = false ;
    4530               0 :          str << info->_cppFullName << "&" ;
    4531                 :          break ;
    4532                 :       }
    4533                 :       case PRINT_RETURN :
    4534                 :       {
    4535              22 :          if (info->_hasFixedLengthStorage == true)
    4536                 :          {
    4537              10 :             isConst = false ;
    4538              10 :             isPointer = false ;
    4539              10 :             isVar = false ;
    4540              10 :             str << info->_cppFullName ;
    4541                 :          }
    4542                 :          else
    4543                 :          {
    4544              12 :             isConst = false ;
    4545              12 :             isPointer = true ;
    4546              12 :             isVar = false ;
    4547              12 :             str << info->_cppFullName << "*" ;
    4548                 :          }
    4549                 :          break ;
    4550                 :       }
    4551                 :       case PRINT_PTR :
    4552                 :       {
    4553               0 :          isConst = false ;
    4554               0 :          isPointer = false ;
    4555               0 :          isVar = false ;
    4556               0 :          str << info->_cppFullName << "_ptr" ;
    4557                 :          break ;
    4558                 :       }
    4559                 :       case PRINT_VAR :
    4560                 :       {
    4561              50 :          isConst = false ;
    4562              50 :          isPointer = false ;
    4563              50 :          isVar = true ;
    4564              50 :          str << info->_cppFullName << "_var" ;
    4565                 :          break ;
    4566                 :       }
    4567                 :    }
    4568                 : }
    4569                 : 
    4570                 : void LangCpp::PrintValue(
    4571                 :    ostream& str,
    4572              13 :    IDLValue *value)
    4573                 : {
    4574              13 :    switch(value->isA())
    4575                 :    {
    4576                 :       case idl_errorType:
    4577                 :       {
    4578               0 :          str << "FIXME idl_errorType" ;
    4579                 :          break ;
    4580                 :       }
    4581                 :       case idl_intType:
    4582                 :       {
    4583                 :          IDLIntValue *v = (IDLIntValue*) value ;
    4584              13 :          PrintIntValue(str, v) ;
    4585                 :          break ;
    4586                 :       }
    4587                 :       case idl_floatType:
    4588                 :       {
    4589               0 :          str << "FIXME idl_floatType" ;
    4590                 :          break ;
    4591                 :       }
    4592                 :       case idl_charType:
    4593                 :       {
    4594                 :          IDLCharValue *v = (IDLCharValue*) value ;
    4595               0 :          PrintCharValue(str, v) ;
    4596                 :          break ;
    4597                 :       }
    4598                 :       case idl_wcharType:
    4599                 :       {
    4600                 :          IDLWCharValue *v = (IDLWCharValue*) value ;
    4601               0 :          PrintWCharValue(str, v) ;
    4602                 :          break ;
    4603                 :       }
    4604                 :       case idl_boolType:
    4605                 :       {
    4606               0 :          str << "FIXME idl_boolType" ;
    4607                 :          break ;
    4608                 :       }
    4609                 :       case idl_struct:
    4610                 :       {
    4611               0 :          str << "FIXME idl_struct" ;
    4612                 :          break ;
    4613                 :       }
    4614                 :       case idl_enum:
    4615                 :       {
    4616               0 :          str << "FIXME idl_enum" ;
    4617                 :          break ;
    4618                 :       }
    4619                 :       case idl_typedef:
    4620                 :       {
    4621               0 :          str << "FIXME idl_typedef" ;
    4622                 :          break ;
    4623                 :       }
    4624                 :       case idl_array:
    4625                 :       {
    4626               0 :          str << "FIXME idl_array" ;
    4627                 :          break ;
    4628                 :       }
    4629                 :       case idl_sequence:
    4630                 :       {
    4631               0 :          str << "FIXME idl_sequence" ;
    4632                 :          break ;
    4633                 :       }
    4634                 :       case idl_string:
    4635                 :       {
    4636                 :          IDLStringValue *v = (IDLStringValue*) value ;
    4637               0 :          PrintStringValue(str, v) ;
    4638                 :          break ;
    4639                 :       }
    4640                 :       case idl_wstring:
    4641                 :       {
    4642                 :          IDLWStringValue *v = (IDLWStringValue*) value ;
    4643               0 :          PrintWStringValue(str, v) ;
    4644                 :          break ;
    4645                 :       }
    4646                 :       case idl_any:
    4647                 :       {
    4648               0 :          str << "FIXME idl_any" ;
    4649                 :          break ;
    4650                 :       }
    4651                 :       case idl_octet:
    4652                 :       {
    4653               0 :          str << "FIXME idl_octet" ;
    4654                 :          break ;
    4655                 :       }
    4656                 :       case idl_interface:
    4657                 :       {
    4658               0 :          str << "FIXME idl_interface" ;
    4659                 :          break ;
    4660                 :       }
    4661                 :       case idl_object:
    4662                 :       {
    4663               0 :          str << "FIXME idl_object" ;
    4664                 :          break ;
    4665                 :       }
    4666                 :       case idl_void:
    4667                 :       {
    4668               0 :          str << "FIXME idl_void" ;
    4669                 :          break ;
    4670                 :       }
    4671                 :       case idl_native:
    4672                 :       {
    4673               0 :          str << "FIXME idl_native" ;
    4674                 :          break ;
    4675                 :       }
    4676                 :    }
    4677                 : }
    4678                 : 
    4679                 : void LangCpp::PrintCharValue(
    4680                 :    ostream& str,
    4681               0 :    IDLCharValue *value)
    4682                 : {
    4683               0 :    char c = value->GetChar() ;
    4684                 : 
    4685               0 :    str << '\'' ;
    4686               0 :    PrintNiceChar(c, str) ;
    4687               0 :    str << '\'' ;
    4688                 : }
    4689                 : 
    4690                 : void LangCpp::PrintWCharValue(
    4691                 :    ostream& str,
    4692               0 :    IDLWCharValue *value)
    4693                 : {
    4694               0 :    wchar_t wc = value->GetWChar() ;
    4695                 :    char buf[10] ;
    4696               0 :    sprintf (buf, "L'\\x%x'", wc) ;
    4697               0 :    str << buf ;
    4698                 : }
    4699                 : 
    4700                 : void LangCpp::PrintStringValue(
    4701                 :    ostream& str,
    4702               0 :    IDLStringValue *value)
    4703                 : {
    4704               0 :    const String& str1 = value->GetString() ;
    4705               0 :    const char*   str2 = str1 ;
    4706                 : 
    4707               0 :    str << '\"' ;
    4708               0 :    while (*str2 != '\0')
    4709                 :    {
    4710               0 :       PrintNiceChar(*str2, str) ;
    4711                 :       str2 ++ ;
    4712                 :    }
    4713               0 :    str << '\"' ;
    4714                 : }
    4715                 : 
    4716                 : void LangCpp::PrintWStringValue(
    4717                 :    ostream& str,
    4718               0 :    IDLWStringValue *value)
    4719                 : {
    4720               0 :    str << "L\"" << value->GetWString() << "\"" ;
    4721                 : }
    4722                 : 
    4723                 : void LangCpp::PrintIntValue(
    4724                 :    ostream& str,
    4725              13 :    IDLIntValue *value)
    4726                 : {
    4727              13 :    switch(value->GetType())
    4728                 :    {
    4729                 :       case idl_signed_short:
    4730                 :       {
    4731               6 :          str << value->GetS16() ;
    4732                 :          break ;
    4733                 :       }
    4734                 :       case idl_signed_long:
    4735                 :       {
    4736               0 :          str << value->GetS32() << "L" ;
    4737                 :          break ;
    4738                 :       }
    4739                 :       case idl_signed_long_long:
    4740                 :       {
    4741               0 :          str << value->GetS64() << "L" ;
    4742                 :          break ;
    4743                 :       }
    4744                 :       case idl_unsigned_short:
    4745                 :       {
    4746               0 :          str << value->GetU16() ;
    4747                 :          break ;
    4748                 :       }
    4749                 :       case idl_unsigned_long:
    4750                 :       {
    4751              14 :          str << value->GetU32() << "L" ;
    4752                 :          break ;
    4753                 :       }
    4754                 :       case idl_unsigned_long_long:
    4755                 :       {
    4756               0 :          str << value->GetU64() << "L" ;
    4757                 :          break ;
    4758                 :       }
    4759                 :    }
    4760                 : }
    4761                 : 
    4762            1085 : bool LangCpp::IsTypeFixedLength(IDLType* type)
    4763                 : {
    4764            1085 :    switch(type->isA())
    4765                 :    {
    4766                 :       case idl_errorType :
    4767                 :       {  // not real C++ code, generation will abort
    4768                 :          return true ;
    4769                 :       }
    4770                 :       case idl_intType :
    4771                 :       {
    4772                 :          return true ;
    4773                 :       }
    4774                 :       case idl_floatType :
    4775                 :       {
    4776                 :          return true ;
    4777                 :       }
    4778                 :       case idl_charType :
    4779                 :       {
    4780                 :          return true ;
    4781                 :       }
    4782                 :       case idl_wcharType :
    4783                 :       {
    4784                 :          return true ;
    4785                 :       }
    4786                 :       case idl_boolType :
    4787                 :       {
    4788                 :          return true ;
    4789                 :       }
    4790                 :       case idl_struct :
    4791                 :       {
    4792                 :          IDLStructType *t = (IDLStructType*) type ;
    4793              31 :          Struct *symbol = t->GetSymbol() ;
    4794              31 :          CppInfo *info = GetCppInfo(symbol) ;
    4795              31 :          return info->_hasFixedLengthStorage ;
    4796                 :       }
    4797                 :       case idl_enum :
    4798                 :       {
    4799                 :          return true ;
    4800                 :       }
    4801                 :       case idl_typedef :
    4802                 :       {
    4803                 :          IDLTypedefType *t = (IDLTypedefType*) type ;
    4804             273 :          Typedef *symbol = t->GetSymbol() ;
    4805             273 :          IDLType *t2 = symbol->GetType() ;
    4806             273 :          return IsTypeFixedLength(t2) ;
    4807                 :       }
    4808                 :       case idl_array :
    4809                 :       {
    4810               0 :          NON_DEV("IsTypeFixedLength") ;
    4811               0 :          return true ;
    4812                 :       }
    4813                 :       case idl_sequence :
    4814                 :       {
    4815                 :          return false ;
    4816                 :       }
    4817                 :       case idl_string :
    4818                 :       {
    4819                 :          return false ;
    4820                 :       }
    4821                 :       case idl_wstring :
    4822                 :       {
    4823                 :          return false ;
    4824                 :       }
    4825                 :       case idl_any :
    4826                 :       {
    4827                 :          return true ;
    4828                 :       }
    4829                 :       case idl_octet :
    4830                 :       {
    4831                 :          return true ;
    4832                 :       }
    4833                 :       case idl_object :
    4834                 :       {
    4835                 :          return false ;
    4836                 :       }
    4837                 :       case idl_interface :
    4838                 :       {
    4839                 :          return false ;
    4840                 :       }
    4841                 :       case idl_void :
    4842                 :       {
    4843                 :          return true ;
    4844                 :       }
    4845                 :       case idl_native :
    4846                 :       {
    4847               0 :          NON_DEV("idl_native fixed length ?") ;
    4848                 :          return false ;
    4849                 :       }
    4850                 :    }
    4851                 : 
    4852                 :    return true ;
    4853                 : }
    4854                 : 
    4855               2 : void LangCpp::GenerateNativeDecl(SymNative *native)
    4856                 : {
    4857               2 :    const String& name = native->GetFullyQualifiedName() ;
    4858                 : 
    4859               2 :    if (name == "PortableServer::Servant")
    4860                 :    {
    4861                 :       // PortableServer::Servant
    4862                 :       // REFERENCE : OMG 99-07-15, section 1.36.1, page 1-128
    4863                 : 
    4864               1 : _H.Str() << endl ;
    4865               1 : _H.Str() << "// ============================== BEGIN of Servant generation" ;
    4866               1 : _H.Str() << endl ;
    4867               1 : _H.Str() << "// See OMG Document 99-07-15, section 1.36.1, page 1-128." << endl ;
    4868               1 : _H.Str() << endl ;
    4869               1 : _H.Tab() << "class ServantBase" << endl ;
    4870               1 : _H.Tab() << "{" << endl ;
    4871               1 : _H.Tab() << "   public :" << endl ;
    4872               1 : _H.Tab() << "      virtual ~ServantBase() ;" << endl ;
    4873               1 : _H.Str() << endl ;
    4874               1 : _H.Tab() << "      virtual POA_ptr _default_POA() ;" << endl ;
    4875               1 : _H.Str() << endl ;
    4876               1 : _H.Tab() << "      virtual CORBA::InterfaceDef_ptr" << endl ;
    4877               1 : _H.Tab() << "      _get_interface()" << endl ;
    4878               1 : _H.Tab() << "         throw(CORBA::SystemException) ;" << endl ;
    4879               1 : _H.Str() << endl ;
    4880               1 : _H.Tab() << "      virtual CORBA::Boolean" << endl ;
    4881               1 : _H.Tab() << "      _is_a(const char* logical_type_id)" << endl ;
    4882               1 : _H.Tab() << "         throw(CORBA::SystemException) ;" << endl ;
    4883               1 : _H.Str() << endl ;
    4884               1 : _H.Tab() << "      virtual CORBA::Boolean" << endl ;
    4885               1 : _H.Tab() << "      _non_existent()" << endl ;
    4886               1 : _H.Tab() << "         throw(CORBA::SystemException) ;" << endl ;
    4887               1 : _H.Str() << endl ;
    4888               1 : _H.Tab() << "      virtual void _add_ref() ;" << endl ;
    4889               1 : _H.Tab() << "      virtual void _remove_ref() ;" << endl ;
    4890               1 : _H.Str() << endl ;
    4891               1 : _H.Tab() << "   protected :" << endl ;
    4892               1 : _H.Tab() << "      ServantBase() ;" << endl ;
    4893               1 : _H.Tab() << "      ServantBase(const ServantBase&) ;" << endl ;
    4894               1 : _H.Tab() << "      ServantBase& operator=(const ServantBase&) ;" << endl ;
    4895               1 : _H.Tab() << "} ;" << endl ;
    4896               1 : _H.Tab() << "typedef ServantBase* Servant ;" << endl ;
    4897               1 : _H.Str() << "// ============================== END of Servant generation" ;
    4898               1 : _H.Str() << endl << endl ;
    4899                 : 
    4900                 :       return ;
    4901                 :    }
    4902                 : 
    4903               1 :    if (name == "PortableServer::ServantLocator::Cookie")
    4904                 :    {
    4905                 :       // PortableServer::ServantLocator::Cookie map to void* in C++
    4906                 :       // REFERENCE : OMG 99-07-15, section 10.4.1, page 1-146.
    4907               0 :       return ;
    4908                 :    }
    4909                 : 
    4910               0 :    String error = "Don't know how to generate native " ;
    4911               0 :    error += native->GetName() ;
    4912               0 :    error += "." ;
    4913                 : 
    4914               0 :    IDLCompileError(error) ;
    4915                 : 
    4916              33 : }
    4917              33 : 

Generated by: LTP GCOV extension version 1.4