//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1994
//
//  File:       exports.cxx
//
//  Contents:   Code to export word breaker class factories
//
//  History:    01-July-1996     PatHal   Created
//
//--------------------------------------------------------------------------

#include "pch.cxx"
#pragma hdrstop

#include "classid.hxx"
#include "wbclassf.hxx"
#include "stemcf.hxx"

long gulcInstances = 0;

//+-------------------------------------------------------------------------
//
//  Function:   DllGetClassObject
//
//  Synopsis:   Ole DLL load class routine
//
//  Arguments:  [cid]    -- Class to load
//              [iid]    -- Interface to bind to on class object
//              [ppvObj] -- Interface pointer returned here
//
//--------------------------------------------------------------------------

extern "C" SCODE STDMETHODCALLTYPE
DllGetClassObject(
    REFCLSID   cid,
    REFIID     iid,
    void **    ppvObj )
{
    IUnknown *  pResult = 0;
    SCODE       sc      = S_OK;

    __try {

        switch ( cid.Data1 ) {

        // Japanese language wordbreaker
        //
        case 0xcd169790:
           if ( cid == CLSID_Japanese_Default_WBreaker ) {
             pResult = (IUnknown *) new CWordBreakerCF(
                MAKELCID( MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT),
                SORT_DEFAULT ));
             sc = pResult->QueryInterface( iid, ppvObj );

             pResult->Release(); // Release extra refcount from QueryInterface
           }
           else
              sc = E_NOINTERFACE;
           break;

        // Japanese language stemmer
        //
        case 0xcdbeae30:
           if ( cid == CLSID_Japanese_Default_Stemmer )
           {
             pResult = (IUnknown *) new CStemmerCF(
                MAKELCID( MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT),
                SORT_DEFAULT ));
             sc = pResult->QueryInterface( iid, ppvObj );

             pResult->Release(); // Release extra refcount from QueryInterface
           }
           else
              sc = E_NOINTERFACE;
           break;

        // Chinese Traditional language wordbreaker
        //
        case 0x954f1760:
           if ( cid == CLSID_Chinese_Traditional_WBreaker ) 
		   {
             pResult = (IUnknown *) new CWordBreakerCF(
                MAKELCID( MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL),
                SORT_DEFAULT ));
             sc = pResult->QueryInterface( iid, ppvObj );

             pResult->Release(); // Release extra refcount from QueryInterface
           }
           else
              sc = E_NOINTERFACE;
           break;

        // Chinese Traditional language stemmer
        //
        case 0x969927e0:
           if ( cid == CLSID_Chinese_Traditional_Stemmer )
           {
             pResult = (IUnknown *) new CStemmerCF(
                MAKELCID( MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL),
                SORT_DEFAULT ));
             sc = pResult->QueryInterface( iid, ppvObj );

             pResult->Release(); // Release extra refcount from QueryInterface
           }
           else
              sc = E_NOINTERFACE;
           break;

        // Chinese Traditional language wordbreaker
        //
        case 0x9717fc70:
           if ( cid == CLSID_Chinese_Simplified_WBreaker ) 
		   {
             pResult = (IUnknown *) new CWordBreakerCF(
                MAKELCID( MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
                SORT_DEFAULT ));
             sc = pResult->QueryInterface( iid, ppvObj );

             pResult->Release(); // Release extra refcount from QueryInterface
           }
           else
              sc = E_NOINTERFACE;
           break;

        // Chinese Traditional language stemmer
        //
        case 0x9768f960:
           if ( cid == CLSID_Chinese_Simplified_Stemmer )
           {
             pResult = (IUnknown *) new CStemmerCF(
                MAKELCID( MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
                SORT_DEFAULT ));
             sc = pResult->QueryInterface( iid, ppvObj );

             pResult->Release(); // Release extra refcount from QueryInterface
           }
           else
              sc = E_NOINTERFACE;
           break;

        default:
             sc = E_NOINTERFACE;
        }
    } __except(1) {

        if ( pResult )
            pResult->Release();

        sc = E_UNEXPECTED;
    }

    return (sc);
}

//+-------------------------------------------------------------------------
//
//  Method:     DllCanUnloadNow
//
//  Synopsis:   Notifies DLL to unload (cleanup global resources)
//
//  Returns:    S_OK if it is acceptable for caller to unload DLL.
//
//  History:    23-Feb-1994     KyleP   Created
//
//--------------------------------------------------------------------------

extern "C" SCODE STDMETHODCALLTYPE DllCanUnloadNow( void )
{
    if ( gulcInstances <= 0 )
        return( S_OK );
    else
        return( S_FALSE );
}