/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 Copyright (c) 1989-1999 Microsoft Corporation

 Module Name:
    
    output.hxx

 Abstract:

    Prototypes for all output routines.

 Notes:

 History:

    Sep-18-1993     VibhasC     Created.

 ----------------------------------------------------------------------------*/
#ifndef __OUTPUT_HXX__
#define __OUTPUT_HXX__

#include "nodeskl.hxx"
#include "ccb.hxx"
#include "analysis.hxx"
#include "expr.hxx"
#include "makexpr.hxx"
#include "prttype.hxx"
#include "sdesc.hxx"
#include "misccls.hxx"

/*****************************************************************************
    local defines and includes.
 *****************************************************************************/

#define STANDARD_STUB_TAB   (4)

#define NC_SIZE_RTN_NAME        0
#define NC_MARSHALL_RTN_NAME    1
#define NC_UNMARSHALL_RTN_NAME  2
#define NC_MEMSIZE_RTN_NAME     3
#define NC_FREE_RTN_NAME        4

enum GUIDFORMAT
{
    GUIDFORMAT_RAW      = 0,        // Raw values (e.g. 0x0000,0x0000,...)
    GUIDFORMAT_STRUCT   = 1         // Struct init (e.g. {0x0000,0x0000,...}) 
};

/*****************************************************************************
    prototypes.
 *****************************************************************************/

inline
void                Out_IndentInc( CCB  *   pCCB )
                        {
                        pCCB->GetStream()->IndentInc();
                        }

inline
void                Out_IndentDec( CCB  *   pCCB )
                        {
                        pCCB->GetStream()->IndentDec();
                        }

void                Out_AddToBufferPointer(
                                            CCB         *   pCCB,
                                            expr_node   *   pResource,
                                            expr_node   *   pAmountExpr );

void                Out_MarshallSimple( CCB         * pCCB,
                                        RESOURCE    * pResource,
                                        node_skl    * pType,
                                        expr_node   * pSource,
                                        BOOL          fIncr,
                                        unsigned short Size
                                      );
 
void                Out_ClientProcedureProlog( CCB * pCCB, node_skl * pType );

void                Out_ServerProcedureProlog( CCB * pCCB,
                                               node_skl * pType,
                                               ITERATOR& LocalsList,
                                               ITERATOR& ParamsList,
                                               ITERATOR& TransientList 
                                             );

void                Out_ProcedureProlog( CCB        *   pCCB,
                                         PNAME          pProcName,
                                         node_skl   *   pType,
                                         ITERATOR&      LocalsList,
                                         ITERATOR&      ParamsList,
                                         ITERATOR&      TransientList
                                       );

void                Out_CallManager( CCB * pCCB,
                                     expr_proc_call * pExpr,
                                     expr_node       * pReturn,
                                     BOOL              fIsCallback );

inline
void                Out_ProcClosingBrace( CCB * pCCB )
                        {
                        pCCB->GetStream()->NewLine();
                        pCCB->GetStream()->Write( '}' );
                        pCCB->GetStream()->NewLine();
                        }

void                Out_StubDescriptor( CG_HANDLE * pImplicitHandle, 
                                        CCB *       pCCB );

void                Out_ClientLocalVariables( CCB * pCCB,
                                                  ITERATOR& LocalVarList );

void                Out_HandleInitialize(
                                             CCB * pCCB,
                                             ITERATOR& BindingParamList,
                                             expr_node * pAssignExpr,
                                             BOOL         fAuto,
                                             unsigned short OpBits
                                            );

void                Out_AutoHandleSendReceive( CCB  * pCCB,
                                               expr_node    *   pDest,
                                               expr_node    *   pProc
                                             );

void                Out_NormalSendReceive( CCB * pCCB, BOOL fAnyOuts );

void                Out_NormalFreeBuffer( CCB * pCCB );

void                Out_IncludeOfFile( CCB * pCCB, PFILENAME p, BOOL fAngleBracket );

void                Out_EP_Info( CCB * pCCB, ITERATOR * I );


void                Out_MKTYPLIB_Guid( CCB *pCCB, 
                                  GUID_STRS & GStrs,
                                  char * szPrefix,
                                  char * szName );

void                Out_Guid( CCB *pCCB, 
                                  GUID_STRS & GStrs,
                                  GUIDFORMAT  format = GUIDFORMAT_STRUCT );

void                Out_IFInfo(
                             CCB    *   pCCB,
                             char   *   pCIntInfoTypeName,
                             char   *   pCIntInfoVarName,
                             char   *   pCIntInfoSizeOfString,
                             GUID_STRS & UserGuidStrs,

                             unsigned short UserMajor,
                             unsigned short UserMinor,

//                             GUID_STRS & XferGuidStrs,

//                             unsigned short XferSynMajor,
//                             unsigned short XferSynMinor,

                             char   *   pCallbackDispatchTable,
                             int        ProtSeqEpCount,
                             char   *   ProtSeqEPTypeName,
                             char   *   ProtSeqEPVarName,
                             BOOL       fNoDefaultEpv,
                             BOOL       fSide,
                             BOOL       fHasPipes
                             );

void                Out_OneSyntaxInfo( CCB * pCCB,
                        BOOL IsForCallback,
                        SYNTAX_ENUM syntaxType );

void                Out_TransferSyntax(
                            CCB *pCCB,
                            GUID_STRS       &   XferGuidStr,
                            unsigned short      XferSynMajor,
                            unsigned short      XferSynMinor );


void                Out_DispatchTableStuff( CCB     *   pCCB,
                                            ITERATOR&   ProcList,
                                            short       CountOfProcs );

void                Out_ManagerEpv( CCB     * pCCB,
                                    PNAME   InterfaceName,
                                    ITERATOR& ProcList,
                                    short Count);

void                Out_ServerStubMessageInit( CCB * pCCB );

void                Out_FormatInfoExtern( CCB * pCCB );
void                Out_TypeFormatStringExtern( CCB * pCCB );
void                Out_ProcFormatStringExtern( CCB * pCCB );

void                Out_StubDescriptorExtern( CCB *    pCCB );

void                Out_ProxyInfoExtern( CCB * pCCB );

void                Out_InterpreterServerInfoExtern( CCB * pCCB );

void                Out_NdrInitStackTop( CCB * pCCB );

void                Out_NdrMarshallCall( CCB *      pCCB,
                                         char *     pRoutineName,
                                         char *     pParamName,
                                         long       FormatStringOffset,
                                         BOOL       fTakeAddress,
                                         BOOL       fDereference );

void                Out_NdrUnmarshallCall( CCB *        pCCB,
                                           char *       pRoutineName,
                                           char *       pParamName,
                                           long         FormatStringOffset,
                                           BOOL         fTakeAddress,
                                           BOOL         fMustAllocFlag );

void                Out_NdrBufferSizeCall( CCB *        pCCB,
                                           char *       pRoutineName,
                                           char *       pParamName,
                                           long         FormatStringOffset,
                                           BOOL         fTakeAddress,
                                           BOOL         fDereference,
                                           BOOL         fPtrToStubMsg );

void                Out_NdrFreeCall( CCB *      pCCB,
                                     char *     pRoutineName,
                                     char *     pParamName,
                                     long       FormatStringOffset,
                                     BOOL       fTakeAddress,
                                     BOOL       fDereference );

void                Out_NdrConvert( CCB *           pCCB, 
                                    long            FormatStringOffset,
                                    long            ParamTotal,
                                    unsigned short  ProcOptimFlags );

void                Out_NdrNsGetBuffer( CCB * pCCB );
void                Out_NdrGetBuffer( CCB * pCCB );
void                Out_NdrNsSendReceive( CCB * pCCB );
void                Out_NdrSendReceive( CCB * pCCB );
void                Out_NdrFreeBuffer( CCB * pCCB );

void                Out_FreeParamInline( CCB *  pCCB );

void                Out_CContextHandleMarshall( CCB *   pCCB,
                                                char *  pName,
                                                BOOL    IsPointer );

void                Out_SContextHandleMarshall( CCB *   pCCB,
                                                char *  pName,
                                                char *  pRundownRoutineName );

void                Out_SContextHandleNewMarshall( CCB *    pCCB,
                                                   char *   pName,
                                                   char *   pRundownRoutineName,
                                                   long    TypeOffset );

void                Out_CContextHandleUnmarshall( CCB *     pCCB,
                                                  char *    pName,
                                                  BOOL      IsPointer,
                                                  BOOL      IsReturn );

void                Out_SContextHandleUnmarshall( CCB *     pCCB,
                                                  char *    pName,
                                                  BOOL      IsOutOnly );

void                Out_SContextHandleNewUnmarshall( CCB *  pCCB,
                                                     char * pName,
                                                     BOOL   IsOutOnly,
                                                     long   TypeOffset );

void                Out_DispatchTableTypedef( CCB       *   pCCB,
                                              PNAME         pInterfaceName,
                                              ITERATOR      &ProcNodeList,
                                              int           flag );

void                Out_GenHdlPrototypes(   CCB     * pCCB,
                                            ITERATOR& List 
                                        );

void                Out_CtxtHdlPrototypes(  CCB     * pCCB,
                                            ITERATOR& List 
                                        );


void                Out_PatchReference( CCB *   pCCB,
                                        expr_node * pDest,
                                        expr_node * pSource,
                                        BOOL         fIncr );

void                Out_If( CCB * pCCB, expr_node * pExpr );

void                Out_Else( CCB * pCCB );

void                Out_Endif( CCB * pCCB );

void                Out_UniquePtrMarshall( CCB * pCCB,
                                           expr_node * pDest,
                                           expr_node * pSrc );

void                Out_IfUniquePtrInBuffer( CCB * pCCB,
                                             expr_node * pSrc );

void                Out_Assign( CCB * pCCB,
                                expr_node * pDest,
                                expr_node * pSrc );

void                Out_Memcopy( CCB * pCCB,
                                 expr_node * pDest,
                                 expr_node * pSrc,
                                 expr_node * pLength );

void                Out_strlen( CCB * pCCB,
                                expr_node   *   pDest,
                                expr_node   *   pSource,
                                unsigned short  Size );

void                Out_For( CCB * pCCB,
                             expr_node * pIndexExpr,
                             expr_node  * pInitialExpr,
                             expr_node * pFinalExpr,
                             expr_node * pIncrExpr );

void                Out_EndFor( CCB * pCCB );
                            

void                                Out_UPDecision(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInBuffer,
                                            expr_node   *   pPtrInMemory );
void                                Out_TLUPDecision(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInBuffer,
                                            expr_node   *   pPtrInMemory );

void                                Out_IfAlloc(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount );

void                                Out_If_IfAlloc(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount );

void                                Out_If_IfAllocRef(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount );

void                                Out_Alloc(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount );

void                                Out_IfAllocSet(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount );

void                                Out_AllocSet(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount );

void                                Out_IfCopy(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount );

void                                Out_Copy(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount,
                                            expr_node   *   pAssign );

void                                Out_IfAllocCopy(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount );

void                                Out_AllocCopy(
                                            CCB         *   pCCB,
                                            expr_node   *   pPtrInMemory,
                                            expr_node   *   pBuffer,
                                            expr_node   *   pExprCount );

void                        Out_ConfStringHdr(
                                        CCB         *   pCCB,
                                        expr_node   *   pDest,
                                        expr_node   *   pExprSize,
                                        expr_node   *   pExprLength,
                                        BOOL            fMarsh );

void                        Out_Copy(
                                    CCB     *   pCCB,
                                    expr_node   *   pDest,
                                    expr_node   *   pSource,
                                    expr_node   *   pExprCount,
                                    expr_node   *   pAssign );

void                Out_CContextMarshall(
                                    CCB         *   pCCB,
                                    expr_node   *   pDest,
                                    expr_node   *   pSource );

void                Out_CContextUnMarshall(
                                     CCB        *   pCCB,
                                     expr_node  *   pDest,
                                     expr_node  *   pSource,
                                     expr_node  *   pHandle,
                                     expr_node  *   pDRep );
                                        
void                Out_SContextMarshall(
                                    CCB         *   pCCB,
                                    expr_node   *   pDest,
                                    expr_node   *   pSource,
                                    expr_node   *   pRDRtn );

void                Out_SContextUnMarshall(
                                    CCB         *   pCCB,
                                    expr_node   *   pDest,
                                    expr_node   *   pSource,
                                    expr_node   *   pDRep );

void                Out_RaiseException( CCB         *   pCCB,
                                        PNAME           pExceptionNameVarExpression );

void                Out_PlusEquals( CCB * pCCB,
                                    expr_node * pLHS,
                                    expr_node * pRHS );

void                Out_IfFree( CCB *   pCCB,
                              expr_node * pSrc );


void                Out_RpcTryFinally( CCB * pCCB );

void                Out_RpcFinally( CCB * pCCB );

void                Out_RpcEndFinally( CCB * pCCB );

void                Out_RpcTryExcept( CCB * pCCB );

void                Out_RpcExcept( CCB  * pCCB,
                                   char * pFilterString );

void                Out_RpcEndExcept( CCB * pCCB );

void                Out_CallNdrMapCommAndFaultStatus( CCB * pCCB,
                                                      expr_node * pAddOfStubMsg,
                                                      expr_node * StatRes,
                                                      expr_node * pCommExpr,
                                                      expr_node * pFaultExpr );
void                Out_CallToXmit( CCB * pCCB,
                                    PNAME PresentedName,
                                    expr_node * pPresented,
                                    expr_node * pTransmitted );

void                Out_CallFreeXmit( CCB * pCCB,
                                      PNAME PresentedName,
                                      expr_node * Xmitted );

void                Out_CallFromXmit( CCB * pCCB,
                                      PNAME PresentedName,
                                      expr_node * pPresented,
                                      expr_node * pXmitted );

void                Out_CallFreeInst( CCB * pCCB,
                                      PNAME PresentedName,
                                      expr_node * pPresented );

void                Out_TransmitAsPrototypes( CCB * pCCB,
                                              ITERATOR& ListOfPresentedTypes );

void                Out_RepAsPrototypes( CCB * pCCB,
                                         ITERATOR& ListOfPresentedTypes );

void                Out_UserMarshalPrototypes( CCB * pCCB,
                                               ITERATOR& ListOfPresentedTypes );

void                Out_CSSizingAndConversionPrototypes( CCB * pCCB,
                                               ITERATOR& ListOfCSTypes );

void                Out_Comment( CCB * pCCB, char * pComment );

void                Out_TLUPDecisionBufferOnly( CCB * pCCB,
                                                expr_node * pPtrInBuffer,
                                                expr_node   *   pPtrInMemory );

void                Out_StringMarshall( CCB        * pCCB, 
                                            expr_node * pMemory,
                                            expr_node * pCount,
                                            expr_node * pSize );

void                Out_StringUnMarshall( CCB      * pCCB, 
                                            expr_node * pMemory,
                                            expr_node * pSize );

void                Out_StructSizingCall( CCB * pCCB,
                                          expr_node * pSource,
                                          expr_node * pLengthVar );


void                Out_StructMarshallCall( CCB * pCCB,
                                      expr_node * pSrc,
                                      expr_node * pPtrInBuffer );

void                Out_FullPointerInit( CCB * pCCB );

void                Out_FullPointerFree( CCB * pCCB );

char *              MakeRtnName( char * pBuffer, char * pName, int Code );

void                Out_RpcSSEnableAllocate( CCB * pCCB );

void                Out_RpcSSDisableAllocate( CCB * pCCB );

void                Out_RpcSSSetClientToOsf( CCB * pCCB );

void                Out_MemsetToZero( CCB * pCCB,
                                     expr_node * pDest,
                                     expr_node * pSize );

void                Out_IID(CCB *pCCB);

void                Out_CLSID(CCB *pCCB);

void                Out_CallAsProxyPrototypes(CCB *pCCB, ITERATOR & ListOfCallAsRoutines);
 
void                Out_CallAsServerPrototypes(CCB *pCCB, ITERATOR & ListOfCallAsRoutines);
 
void                Out_CallMemberFunction( CCB         *   pCCB,
                                           expr_proc_call   *   pProcExpr,
                                           expr_node        *   pRet,
                                           BOOL                 fThunk );

void                Out_SetOperationBits( CCB * pCCB, unsigned int OpBits);

void                Out_TypeAlignSizePrototypes( CCB * pCCB, ITERATOR& List );

void                Out_TypeEncodePrototypes( CCB * pCCB, ITERATOR& List );

void                Out_TypeDecodePrototypes( CCB * pCCB, ITERATOR& List );

void                Out_TypeFreePrototypes( CCB * pCCB, ITERATOR& List );

void                OutputNdrAlignment( CCB * pCCB, unsigned short Align );

void                Out_NotifyPrototypes( CCB *     pCCB,
                                          ITERATOR& ListOfNotifyRoutines );

void                Out_MultiDimVars( CCB * pCCB, CG_PARAM * pParam );

void                Out_MultiDimVarsInit( CCB * pCCB, CG_PARAM * pParam );

void                Out_CheckUnMarshallPastBufferEnd( CCB * pCCB, ulong size = 0 );
void                Out_NotifyTable ( CCB* pCCB );
void                Out_NotifyTableExtern ( CCB* pCCB );

void                Out_TypePicklingInfo( CCB* pCCB);

void                Out_PartialIgnoreClientMarshall( CCB *pCCB, char *pParamName );

void                Out_PartialIgnoreServerUnmarshall( CCB *pCCB, char *pParamName );

void                Out_PartialIgnoreClientBufferSize( CCB *pCCB, char *pParamName );

void                Out_PartialIgnoreServerInitialize( CCB *pCCB, char *pParamName, long FormatStringOffset );


#endif // __OUTPUT_HXX__