blob: 8ce60a8ab80f403e43d121b581ea3882d17f953f [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <precomp.h>
#include "hdimpl.hxx"
// NOT FULLY DEFINED SERVICES
#include <stdlib.h>
#include <stdio.h>
#include <ary/ceslot.hxx>
#include <ary/qualiname.hxx>
#include <ary/cpp/c_class.hxx>
#include <ary/cpp/c_de.hxx>
#include <ary/cpp/c_enum.hxx>
#include <ary/cpp/c_funct.hxx>
#include <ary/cpp/c_gate.hxx>
#include <ary/cpp/cp_ce.hxx>
#include <udm/html/htmlitem.hxx>
#include "cre_link.hxx"
#include "hd_docu.hxx"
#include "html_kit.hxx"
#include "opageenv.hxx"
#include "pagemake.hxx"
#include "strconst.hxx"
using namespace csi;
//******************** HtmlDisplay_Impl *********************//
HtmlDisplay_Impl::~HtmlDisplay_Impl()
{
}
HtmlDisplay_Impl::HtmlDisplay_Impl( OuputPage_Environment & io_rEnv )
: pEnv(&io_rEnv)
// aWriteHelper
{
}
//******************** Free Functions *********************//
namespace dshelp
{
void
DisplaySlot( ary::Display & o_rDisplay,
const ary::AryGroup & i_rGroup,
ary::SlotAccessId i_nSlot )
{
ary::Slot_AutoPtr pSlot( i_rGroup.Create_Slot(i_nSlot) );
pSlot->StoreAt( o_rDisplay );
}
const char *
PathUp( uintt i_nLevels )
{
static char sResult[300];
sResult[0] = NULCH;
for ( uintt lev = 0; lev < i_nLevels; ++lev )
{
strcat( sResult, "../"); // SAFE STRCAT (#100211# - checked)
}
return sResult;
}
const char *
PathPerLevelsUp( uintt i_nLevels,
const char * i_nPathBelowDestinationLevel )
{
static char sResult[500];
strcpy( sResult, PathUp(i_nLevels) ); // SAFE STRCPY (#100211# - checked)
// KORR_FUTURE: Make it still safer here:
strcat( sResult, i_nPathBelowDestinationLevel ); // SAFE STRCAT (#100211# - checked)
return sResult;
}
const char *
PathPerRoot( const OuputPage_Environment & i_rEnv,
const char * i_sPathFromRootDir )
{
return PathPerLevelsUp( i_rEnv.Depth(), i_sPathFromRootDir );
}
const char *
PathPerNamespace( const OuputPage_Environment & i_rEnv,
const char * i_sPathFromNamespaceDir )
{
const ary::cpp::Namespace * pNsp = i_rEnv.CurNamespace();
if ( pNsp == 0 )
return "";
uintt nCount = i_rEnv.Depth() - (pNsp->Depth() + 1) ;
csv_assert( nCount < 100 );
return PathPerLevelsUp( nCount, i_sPathFromNamespaceDir );
}
const char *
HtmlFileName( const char * i_sPrefix,
const char * i_sEntityName )
{
// KORR_FUTURE: Make it still safer here:
static char sResult[300];
strcpy( sResult, i_sPrefix ); // SAFE STRCPY (#100211# - checked)
strcat( sResult, i_sEntityName ); // SAFE STRCAT (#100211# - checked)
strcat( sResult, ".html" ); // SAFE STRCAT (#100211# - checked)
return sResult;
}
const char *
Path2Class( uintt i_nLevelsUp,
const char * i_sClassLocalName )
{
return PathPerLevelsUp( i_nLevelsUp, ClassFileName(i_sClassLocalName) );
}
const char *
Path2Child( const char * i_sFileName,
const char * i_sSubDir )
{
static char sResult[400];
if ( i_sSubDir != 0 )
{
// KORR_FUTURE: Make it still safer here:
strcpy( sResult, i_sSubDir ); // SAFE STRCPY (#100211# - checked)
strcat( sResult, "/" ); // SAFE STRCAT (#100211# - checked)
}
else
{
sResult[0] = NULCH;
}
strcat( sResult, i_sFileName ); // SAFE STRCAT (#100211# - checked)
return sResult;
}
const char *
Path2ChildNamespace( const char * i_sLocalName )
{
return Path2Child( C_sHFN_Namespace, i_sLocalName );
}
String
OperationLink( const ary::cpp::Gate & ,
const String & i_sOpName,
ary::cpp::Ce_id i_nOpId,
const char * i_sPrePath )
{
StreamLock
slResult(3000);
StreamStr &
sResult = slResult();
sResult
<< i_sPrePath
<< "#"
<< i_sOpName
<< "-"
<< i_nOpId.Value();
return sResult.c_str();
}
const char *
DataLink( const String & i_sLocalName,
const char * i_sPrePath )
{
StreamLock
slResult(3000);
StreamStr &
sResult = slResult();
sResult
<< i_sPrePath
<< "#"
<< i_sLocalName;
return sResult.c_str();
}
void
Get_LinkedTypeText( csi::xml::Element & o_rOut,
const OuputPage_Environment & i_rEnv,
ary::cpp::Type_id i_nId,
bool i_bWithAbsolutifier )
{
if (NOT i_nId.IsValid())
return;
const char * sPreName = "";
const char * sName = "";
const char * sPostName = "";
bool bTypeExists = Get_TypeText( sPreName,
sName,
sPostName,
i_nId,
i_rEnv.Gate() );
if ( NOT bTypeExists )
return;
if ( NOT i_bWithAbsolutifier AND strncmp(sPreName,"::",2) == 0 )
sPreName+=2;
const ary::cpp::CodeEntity *
pCe = i_rEnv.Gate().Search_RelatedCe(i_nId);
String sLink;
if ( pCe != 0 )
{
sLink = Link2Ce(i_rEnv,*pCe);
}
else
{
if ( strstr(sPreName,"com::sun::star") != 0 )
{
static StreamStr aLink(400);
aLink.seekp(0);
aLink << PathPerRoot(i_rEnv, "../../common/ref");
if ( *sPreName != ':' )
aLink << '/';
for ( const char * s = sPreName;
*s != 0;
++s )
{
if ( *s == ':' )
{
aLink << '/';
++s;
}
else
{
aLink << *s;
}
} // end for
aLink << sName
<< ".html";
sLink = aLink.c_str();
}
} // endif( pCe != 0 )
o_rOut
<< sPreName;
csi::xml::Element &
o_Goon = sLink.length() > 0
? o_rOut >> * new html::Link( sLink.c_str() )
: o_rOut;
o_Goon
<< sName;
o_rOut
<< sPostName;
}
void
Create_ChildListLabel( csi::xml::Element & o_rParentElement,
const char * i_sLabel )
{
if ( NOT csv::no_str(i_sLabel) )
{
o_rParentElement
>> *new html::Label(i_sLabel)
<< " ";
}
}
DYN csi::html::Table &
Create_ChildListTable( const char * i_sTitle )
{
html::Table *
dpTable = new html::Table;
*dpTable
<< new html::ClassAttr( "childlist")
<< new xml::AnAttribute( "border", "1" )
<< new xml::AnAttribute( "cellpadding", "5" )
<< new xml::AnAttribute( "cellspacing", "0" )
<< new html::WidthAttr( "100%" );
html::TableRow &
rRow = dpTable->AddRow();
rRow
<< new html::ClassAttr("subtitle")
>> *new html::TableCell
<< new xml::AnAttribute( "colspan","2" )
>> *new html::Headline(4)
<< i_sTitle;
return *dpTable;
}
const char *
Link2Ce( const OuputPage_Environment & i_rEnv,
const ary::cpp::CodeEntity & i_rCe )
{
const uintt nMaxSize
= 3000;
static char sLink[nMaxSize];
static LinkCreator aLinkCreator( &sLink[0], nMaxSize );
sLink[0] = NULCH;
aLinkCreator.SetEnv(i_rEnv);
i_rCe.Accept(aLinkCreator);
return sLink;
}
const char *
Link2CppDefinition( const OuputPage_Environment & i_rEnv,
const ary::cpp::DefineEntity & i_rDef )
{
const uintt nMaxSize
= 1000;
static char sLink[nMaxSize];
static LinkCreator aLinkCreator( &sLink[0], nMaxSize );
sLink[0] = NULCH;
aLinkCreator.SetEnv(i_rEnv);
i_rDef.Accept(aLinkCreator);
return sLink;
}
const ary::cpp::CodeEntity *
FindUnambiguousCe( const OuputPage_Environment & i_rEnv,
const ary::QualifiedName & i_rQuName,
const ary::cpp::Class * i_pJustDocumentedClass )
{
if ( i_rEnv.CurNamespace() == 0 )
return 0;
const ary::cpp::CodeEntity * ret = 0;
if ( NOT i_rQuName.IsQualified() )
{
if ( i_pJustDocumentedClass != 0 )
ret = i_rEnv.Gate().Ces().Search_CeLocal( i_rQuName.LocalName(),
i_rQuName.IsFunction(),
*i_rEnv.CurNamespace(),
i_pJustDocumentedClass );
if (ret != 0)
return ret;
ret = i_rEnv.Gate().Ces().Search_CeLocal( i_rQuName.LocalName(),
i_rQuName.IsFunction(),
*i_rEnv.CurNamespace(),
i_rEnv.CurClass() );
}
if (ret != 0)
return ret;
return i_rEnv.Gate().Ces().Search_CeAbsolute( *i_rEnv.CurNamespace(),
i_rQuName );
}
void
ShowDocu_On( csi::xml::Element & o_rOut,
Docu_Display & io_rDisplay,
const ary::cpp::CppEntity & i_rRE )
{
if (i_rRE.Docu().Data() != 0)
{
io_rDisplay.Assign_Out( o_rOut );
io_rDisplay.Process(i_rRE.Docu());
io_rDisplay.Unassign_Out();
}
}
void
WriteOut_TokenList( csi::xml::Element & o_rOut,
const StringVector & i_rTokens,
const char * i_sSeparator )
{
if ( i_rTokens.size() > 0 )
{
StringVector::const_iterator
it = i_rTokens.begin();
StringVector::const_iterator
itEnd = i_rTokens.end();
o_rOut << *it;
for ( ++it; it != itEnd; ++it )
{
o_rOut << i_sSeparator << *it;
}
};
}
void
EraseLeadingSpace( String & io_rStr )
{
if ( *io_rStr.c_str() < 33 AND io_rStr.length() > 0 )
{
const unsigned char * pNew;
for ( pNew = (const unsigned char * ) io_rStr.c_str();
*pNew < 33 AND *pNew != 0;
++pNew ) {}
String sNew( (const char*)pNew );
io_rStr = sNew;
}
}
void
WriteOut_LinkedFunctionText( csi::xml::Element & o_rTitleOut,
adcdisp::ParameterTable & o_rParameters,
const ary::cpp::Function & i_rFunction,
const OuputPage_Environment & i_rEnv,
bool * o_bIsConst,
bool * o_bIsVirtual )
{
// write pre-name:
const ary::cpp::FunctionFlags & rFlags = i_rFunction.Flags();
if ( rFlags.IsStaticLocal() OR rFlags.IsStaticMember() )
o_rTitleOut << "static ";
if ( rFlags.IsExplicit() )
o_rTitleOut << "explicit ";
if ( rFlags.IsMutable() )
o_rTitleOut << "mutable ";
if ( i_rFunction.Virtuality() != ary::cpp::VIRTUAL_none )
o_rTitleOut << "virtual ";
// o_rTitleOut << new html::LineBreak;
Get_LinkedTypeText( o_rTitleOut, i_rEnv, i_rFunction.ReturnType() );
// write name:
o_rTitleOut
<< " "
>> *new html::Strong
<< i_rFunction.LocalName();
o_rTitleOut
<< "(";
csi::xml::Element * pOutLast = &o_rTitleOut;
// write post-name:
FunctionParam_Iterator fit;
fit.Assign(i_rFunction);
if (fit)
{
o_rParameters.AddEntry();
Get_LinkedTypeText( o_rParameters.Type(), i_rEnv, fit.CurType() );
o_rParameters.Type() << " ";
o_rParameters.Name() << " " << fit.CurName();
for ( ++fit; fit; ++fit )
{
o_rParameters.Name() << ",";
o_rParameters.AddEntry();
Get_LinkedTypeText( o_rParameters.Type(), i_rEnv, fit.CurType() );
o_rParameters.Name() << fit.CurName();
}
pOutLast = &o_rParameters.Name();
o_rParameters.Name() << " ";
}
*pOutLast << ")";
if ( fit.IsFunctionConst() )
{
*pOutLast << " const";
if ( o_bIsConst != 0 )
*o_bIsConst = true;
}
if ( fit.IsFunctionVolatile() )
{
*pOutLast << " volatile";
if ( o_bIsVirtual != 0 )
*o_bIsVirtual = true;
}
// write Exceptions:
const std::vector< ary::cpp::Type_id > *
pThrow = i_rFunction.Exceptions();
if ( pThrow)
{
std::vector< ary::cpp::Type_id >::const_iterator
it = pThrow->begin();
std::vector< ary::cpp::Type_id >::const_iterator
it_end = pThrow->end();
if (it != it_end)
{
o_rParameters.AddEntry();
pOutLast = &o_rParameters.Name();
o_rParameters.Name() << " throw( ";
Get_LinkedTypeText(o_rParameters.Name(), i_rEnv, *it);
for ( ++it; it != it_end; ++it )
{
o_rParameters.Name() << ", ";
Get_LinkedTypeText(o_rParameters.Name(), i_rEnv, *it);
}
o_rParameters.Name() << " )";
}
else
{
*pOutLast << " throw()";
}
} // endif // pThrow
// abstractness:
if ( i_rFunction.Virtuality() == ary::cpp::VIRTUAL_abstract )
*pOutLast << " = 0";
// finish:
*pOutLast << ";";
}
} // namespace dshelp