/*++

Copyright (c) 1996-1997 Microsoft Corporation

Module Name:

    or.hxx

Abstract:

    Precompiled include file for C++ modules.

Author:

    Satish Thatte    [SatishT]       Feb-10-96

Revision History:

--*/

#ifndef __OR_HXX
#define __OR_HXX

#include <or.h>

#if DBG
extern "C" ULONG DbgPrint( PCH Format, ... );
#endif

// Protcol defined timeouts

const unsigned short BasePingInterval    = 120;
const unsigned short BaseNumberOfPings   = 3;
const unsigned short SapFreqPerPing      = 2;
const unsigned short BaseTimeoutInterval = (BasePingInterval * BaseNumberOfPings);
const unsigned short InitialProtseqBufferLength = 118;
const unsigned short ScmHandleCacheLimit = 10; 
const unsigned short ResolverHandleCacheSize = 16; 


// Well known tower IDs

const unsigned short ID_LPC  = 0x10;  // ncalrpc, IsLocal() == TRUE
const unsigned short ID_WMSG = 0x01;  // mswmsg, IsLoclal() == TRUE
const unsigned short ID_TCP  = 0x07;  // mswmsg, IsInetProtseq() == TRUE
const unsigned short ID_UDP  = 0x08;  // mswmsg, IsInetProtseq() == TRUE
const unsigned short ID_NP   = 0x0F;  // ncacn_np, IsLocal() == FALSE
const unsigned short ID_DCOMHTTP = 0x1F;  // ncacn_http, IsLocal() == FALSE


// Timer ID

#define IDT_DCOM_RUNDOWN 1234

// Shared memory constants

const ULONG DCOMSharedHeapName = 1111;
#define DCOMSharedGlobalBlockName L"DCOMSharedGlobals12321"

// Number of entries in the static array of well-known endpoints

extern "C" USHORT PROTSEQ_IDS;

// Name of global mutex used to protect shred memory structures
#define GLOBAL_MUTEX_NAME TEXT("ObjectResolverGlobalMutex")

// Standard Null DUALSTRINGARRAY -- we have to define a special
// type here because the standard DUALSTRINGARRAY type allows only
// 1 WCHAR in the aStringArray -- note that the fourth \0 is
// put in by the compiler as the string ending

typedef struct tagDSA {
    unsigned short wNumEntries;
    unsigned short wSecurityOffset;
    unsigned short aStringArray[ 4 ];
    } DSA;

const DSA dsaNullBinding = {4,2,L"\0\0\0"};

#define DCOM_E_ABNORMALINIT   1234321


//
// Message used to signal RPCSS to reinit
//

#define WM_RPCSS_MSG        (WM_USER + 'r' + 'p' + 'c' + 's' + 's')


// Building blocks
#include <base.hxx>

#include <ipidtbl.hxx>  // OXIDEntry, RUNDOWN_TIMER_INTERVAL
#include <remoteu.hxx>  // gpMTARemoteUnknown, CRemoteUnknown

#include <memapi.hxx>   // CPrivAlloc

#include <smemor.hxx>  // shared memory OR client interface
#include <intor.hxx>   // internal version of OR client interface
#include <time.hxx>
#include <mutex.hxx>
#include <misc.hxx>
#include <callid.hxx>
#include <refobj.hxx>
#include <string.hxx>
#include <pgalloc.hxx>  // need this before globals.hxx
#include <globals.hxx>  // need this before linklist.hxx
#include <linklist.hxx>
#include <gentable.hxx>
#include <dsa.hxx>


//
// Class forward declarations
//

class CMid;
class COxid;
class COid;
class CProcess;
class CSharedGlobals;

//
// Global variables and constants
//

#define OXID_TABLE_SIZE 16
#define OID_TABLE_SIZE 100
#define MID_TABLE_SIZE 16
#define PROCESS_TABLE_SIZE 16
#define MAX_PROTSEQ_IDS 100

extern DWORD MyProcessId;
extern DWORD *gpdwLastCrashedProcessCheckTime;

extern CSharedGlobals *gpGlobalBlock;   // global shared memory block
extern CSmAllocator gSharedAllocator;   // global shared memory allocator

extern DUALSTRINGARRAY *gpLocalDSA;     // phony bindings for this machine
extern MID gLocalMID;                   // MID of this machine
extern CMid *gpLocalMid;                // Mid object for this machine

extern PWSTR gpwstrProtseqs;

extern CGlobalMutex *gpMutex;           // global mutex to protect shared memory

extern LONG *gpIdSequence;              // shared sequence for generating IDs
extern DWORD *gpNextThreadID;           // shared apartment ID generator
extern BOOL DCOM_Started;

extern CProcess *gpProcess;             // self pointer
extern CProcess *gpPingProcess;         // pointer to surrogate for ping thread

extern USHORT *gpcRemoteProtseqs;       // count of remote protseqs
extern USHORT *gpfRemoteInitialized;    // flag which signifies initialization
                                        // of remote protocols
extern USHORT *gpfSecurityInitialized;    // flag which signifies initialization
                                        // of security packages
extern USHORT *gpRemoteProtseqIds;      // array of remote protseq ids
extern PWSTR gpwstrProtseqs;            // remote protseqs strings catenated

extern HWND ghRpcssWnd;           // Window for messages to RPCSS
extern USHORT *gpfClientHttp;           // flag which signifies client side http is allowed

//
// Global tables
//

//
// cannot use short forms for table types due to declaration order
//

extern TCSafeResolverHashTable<COxid>     * gpOxidTable;
extern TCSafeResolverHashTable<COid>      * gpOidTable;
extern TCSafeResolverHashTable<CMid>      * gpMidTable;
extern TCSafeResolverHashTable<CProcess>  * gpProcessTable;

// Headers which may use globals

#include <oxid.hxx>
#include <process.hxx>
#include <mid.hxx>
#include <set.hxx>

// Pinging related variables
//

extern CTime gLastPingTime;             // To see if the ping thread is blocked
extern CPingSetTable gSetTable;         // The table of ping sets in RPCSS

//
// The following constants are used to initialize page allocators
//

#define NUM_PAGE_ALLOCATORS 7

#define COid_ALLOCATOR_INDEX                    0
#define COxid_ALLOCATOR_INDEX                   1
#define CMid_ALLOCATOR_INDEX                    2
#define CProcess_ALLOCATOR_INDEX                3
#define CClassReg_ALLOCATOR_INDEX               4
#define Link_ALLOCATOR_INDEX                    5
#define CResolverHashTable_ALLOCATOR_INDEX      6


const USHORT AllocatorEntrySize[] = 
{
                         sizeof(COid),
                         sizeof(COxid),
                         sizeof(CMid),
                         sizeof(CProcess),
                         sizeof(CClassReg),
                         sizeof(CLinkList::Link),
                         sizeof(CResolverHashTable)
};

const USHORT AllocatorPageSize[] = 
{
                         100, // COid
                         25,  // COxid                       
                         12,  // CMid                        
                         25,  // CProcess                    
                         100, // CClassReg                   
                         500, // Link                        
                         10   // CRpcResolverHashTable
};

//
// Security data passed to processes on connect.
//

extern SharedSecVals *gpSecVals;

//
// Startup routine.
//

ORSTATUS StartDCOM(void);



// 
// DBG-only function for OR data integrity checking
// The function does nothing for retail builds
//


inline void
CheckORdata()
{
#if DBG
    ASSERT(gpLocalDSA); // Resolver bindings for this machine
    ASSERT(gpLocalMid); // Mid object for this machine
    ASSERT(gpGlobalBlock);
    ASSERT(gpMutex);
    ASSERT(gpOxidTable);
    gpOxidTable->IsValid();
    ASSERT(gpOidTable);
    gpOidTable->IsValid();
    ASSERT(gpMidTable);
    gpMidTable->IsValid();
    ASSERT(gpProcessTable);
    gpProcessTable->IsValid();
    ASSERT(*gpIdSequence >0 && *gpIdSequence < 1000000);
#endif
}
   


#pragma hdrstop

#endif // __OR_HXX