/*****************************************************************************\
* MODULE:       dllmain.cpp
*
* PURPOSE:      Implementation of COM interface for BidiSpooler
*
* Copyright (C) 2000 Microsoft Corporation
*
* History:
*
*     03/07/00  Weihai Chen (weihaic) Created
*
\*****************************************************************************/

#include "precomp.h"
#include "priv.h"

extern "C" {

#ifdef DEBUG

MODULE_DEBUG_INIT( DBG_ERROR | DBG_WARNING | DBG_TRACE | DBG_INFO , DBG_ERROR );

#else

MODULE_DEBUG_INIT( DBG_ERROR , DBG_ERROR );

#endif

}


///////////////////////////////////////////////////////////
//
// Global variables
//
static HMODULE g_hModule = NULL ;   // DLL module handle

const TCHAR g_szFriendlyName[] = _T ("Bidi Spooler APIs") ;
const TCHAR g_szRequestVerIndProgID[] = _T ("bidispl.bidirequest") ;
const TCHAR g_szRequestProgID[] = _T ("bidispl.bidirequest.1") ;

const TCHAR g_szContainerVerIndProgID[] = _T ("bidispl.bidirequestcontainer") ;
const TCHAR g_szContainerProgID[] = _T ("bidispl.bidirequestcontainer.1") ;

const TCHAR g_szSplVerIndProgID[] = _T ("bidispl.bidispl") ;
const TCHAR g_szSplProgID[] = _T ("bidispl.bidispl.1") ;

///////////////////////////////////////////////////////////
//
// Exported functions
//

//
// Can DLL unload now?
//
STDAPI DllCanUnloadNow()
{
	if ((g_cComponents == 0) && (g_cServerLocks == 0))
	{
		return S_OK ;
	}
	else
	{
		return S_FALSE ;
	}
}

//
// Get class factory
//
STDAPI DllGetClassObject(REFCLSID clsid,
                         REFIID iid,
                         PVOID * ppv)
{

    DBGMSG(DBG_TRACE,("Enter DllGetClassObject\n"));

	// Can we create this component?
	if (clsid != CLSID_BidiRequest &&
        clsid != CLSID_BidiRequestContainer &&
        clsid != CLSID_BidiSpl) {

		return CLASS_E_CLASSNOTAVAILABLE ;
	}

	// Create class factory.
	TFactory* pFactory = new TFactory (clsid) ;  // Reference count set to 1
                                                 // in constructor
	if (pFactory == NULL)
	{
		return E_OUTOFMEMORY ;
	}

	// Get requested interface.
	HRESULT hr = pFactory->QueryInterface(iid, ppv) ;
	pFactory->Release() ;

	return hr ;

}

//
// Server registration
//
STDAPI DllRegisterServer()
{
    BOOL bRet;
    TComRegistry ComReg;

	bRet = ComReg.RegisterServer(g_hModule,
                                 CLSID_BidiRequest,
                                 g_szFriendlyName,
                                 g_szRequestProgID,
                                 g_szRequestProgID) &&

           ComReg.RegisterServer (g_hModule,
                                  CLSID_BidiRequestContainer,
                                  g_szFriendlyName,
                                  g_szContainerVerIndProgID,
                                  g_szContainerProgID) &&

           ComReg.RegisterServer(g_hModule,
                                 CLSID_BidiSpl,
                                 g_szFriendlyName,
                                 g_szSplVerIndProgID,
                                 g_szSplProgID);
    return bRet;
}


//
// Server unregistration
//
STDAPI DllUnregisterServer()
{
    TComRegistry ComReg;
	
    return ComReg.UnregisterServer(CLSID_BidiRequest,
	                        g_szRequestVerIndProgID,
	                        g_szRequestProgID) &&

           ComReg.UnregisterServer(CLSID_BidiRequestContainer,
	                        g_szContainerVerIndProgID,
	                        g_szContainerProgID) &&

           ComReg.UnregisterServer(CLSID_BidiSpl,
	                        g_szSplVerIndProgID,
	                        g_szSplProgID);


}

///////////////////////////////////////////////////////////
//
// DLL module information
//
BOOL APIENTRY DllMain(HANDLE hModule,
                      DWORD dwReason,
                      void* lpReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		g_hModule = hModule ;

        //if( !bSplLibInit( NULL )){
        //
        //    DBGMSG( DBG_WARN,
        //            ( "DllEntryPoint: Failed to init SplLib %d\n", GetLastError()));
        //}

	}
	return TRUE ;
}