////////////////////////////////////////////////////////////////////////////////
//
// LibConverter.cpp -    Visual C++
//
////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <afxdllx.h>
#include "MyConverter.h"
#include "KompasConverter.h"
#include "LibConverter.h"


#include <atlBase.h>
#include <STATREG.H>


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//-------------------------------------------------------------------------------
//       DLL
// ---
AFX_EXTENSION_MODULE LibConverterDLL = { NULL, NULL };
HINSTANCE g_hInstance = NULL;
IApplicationPtr newKompasAPI( NULL );               

void        OnProcessDetach();                            //  
extern void ConverterDestroy();



//-------------------------------------------------------------------------------
//   
//    DLL
// ---
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
  g_hInstance = hInstance;

	if (dwReason == DLL_PROCESS_ATTACH)
	{
		TRACE0("LibConverter.AWX Initializing!\n");

		AfxInitExtensionModule(LibConverterDLL, hInstance);

		new CDynLinkLibrary(LibConverterDLL);
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		TRACE0("LibConverter.AWX Terminating!\n");
    OnProcessDetach();
		AfxTermExtensionModule(LibConverterDLL);
	}
	return 1;   // ok
}


//-------------------------------------------------------------------------------
//     API
// ---
void GetNewKompasAPI() 
{
	if ( !( IApplication * )newKompasAPI ) 
  {
		CString filename;
	
    if( ::GetModuleFileName(NULL, filename.GetBuffer(255), 255) ) 
    {
			filename.ReleaseBuffer( 255 );
			CString libname;

      libname = _LoadStr( IDR_API7 );    // kAPI7.dll
			filename.Replace( filename.Right(filename.GetLength() - (filename.ReverseFind('\\') + 1)), 
												libname );

			HINSTANCE hAppAuto = LoadLibrary( filename ); //  kAPI7.dll
		
      if(  hAppAuto ) 
      {
				//      KompasApplication  
        typedef LPDISPATCH ( WINAPI * FCreateKompasApplication )(); 
				 
        FCreateKompasApplication pCreateKompasApplication = 
					(FCreateKompasApplication)GetProcAddress( hAppAuto, "CreateKompasApplication" );	
				
        if ( pCreateKompasApplication )
					newKompasAPI = IDispatchPtr( pCreateKompasApplication(), false/*AddRef*/ ); //   Application
				FreeLibrary( hAppAuto );  
			}
		}
	}
}


//-------------------------------------------------------------------------------
//   
// ---
unsigned int WINAPI LIBRARYID()
{
  return IDR_LIBID;
}


//-------------------------------------------------------------------------------
//   
// ---
void WINAPI LIBRARYENTRY( unsigned int comm )
{
  //     
  // comm = 1 - "  "
  // comm = 2 - " "
  GetLibConverter().ExecuteCommand( comm );
}


//-------------------------------------------------------------------------------
//  
// ---
void OnProcessDetach()
{
  ConverterDestroy();
  newKompasAPI = NULL;
}


//------------------------------------------------------------------------------
//      
// ---
CString _LoadStr( int strID ) 
{
	TCHAR temp[_MAX_PATH];
	LoadString( LibConverterDLL.hModule, strID, temp, _MAX_PATH );
	return temp;
}


//------------------------------------------------------------------------------
//     c 
// ---
CString LoadStr( int strID ) 
{
	TCHAR temp[_MAX_PATH];
	ksConvertLangStrExT( LibConverterDLL.hModule, strID, temp, _MAX_PATH );
	return temp;
}


//------------------------------------------------------------------------------
//  
// ---
int LibMessage( LPCTSTR str, int flags ) 
{
  int res = 0;

  if ( str && str[0] ) {                  //  
    int enabse = ::IsEnableTaskAccess();  //  
    if ( enabse )                         //     
      ::EnableTaskAccess(0);              //  

    //                                      
    res = MessageBox( (HWND) GetHWindow(), str, LoadStr(LIBRARYID()), flags );

    if ( enabse )                         //      
      ::EnableTaskAccess(1);              //    
  }

  return res;
}


//------------------------------------------------------------------------------
//  
// ---
int LibMessage( int strId, int flags ) 
{
  return ::LibMessage( LoadStr(strId), flags );
}

//------------------------------------------------------------------------------
//        
// ---
CString FindExt( LPCTSTR filename )                    
{
  TCHAR temp[_MAX_PATH] = _T("");
  CString buf( filename );
  int lenght = buf.GetLength();
  int pos = buf.ReverseFind(_T('.'));
  if ( pos >= 0 )
  {
    _tcscpy (temp, buf.Right( lenght - pos - 1 ));
  }
  return temp;
}

//-------------------------------------------------------------------------------
//    
// ---
// #define CONVERTERS_PATH "Software\\ASCON\\KOMPAS-3D\\Converters\\LibConverter"
//     API     c   
//  regsvr32    Bin  ..        kApi2d5.dll
//            
// --- 
STDAPI RegisterServer( bool _register )
{
  HRESULT hr = NOERROR;  
  TCHAR szModulePath[MAX_PATH];

  // Obtain the path to this module's executable file for later use.
  GetModuleFileName( LibConverterDLL.hModule, szModulePath,
                     sizeof(szModulePath)/sizeof(TCHAR) );

  ATL::CRegObject regObj;
  //       .rgs  '%MODULE%'
  regObj.AddReplacement( _bstr_t(_T("Module")), _bstr_t(szModulePath) );
  
  hr = _register ? regObj.ResourceRegister(   _bstr_t(szModulePath), IDR_LibConverterRgs, _bstr_t(_T("REGISTRY")) ):
                   regObj.ResourceUnregister( _bstr_t(szModulePath), IDR_LibConverterRgs, _bstr_t(_T("REGISTRY")) );
                   
  return hr;
}


//-------------------------------------------------------------------------------
//    
// ---
STDAPI DllRegisterServer() 
{
  TRACE0("DllRegisterServer\n");
  return RegisterServer( TRUE );
}


//-------------------------------------------------------------------------------
//  AddIns
// ---
STDAPI DllUnregisterServer() 
{
  TRACE0("DllUnregisterServer\n");
  return RegisterServer( FALSE );
}      


//-------------------------------------------------------------------------------
//   .
// ---
LPKOMPASCONVERTER WINAPI GetIKompasConverter()
{
  TRACE0("GetIKompasConverter\n");
  return (LPKOMPASCONVERTER) (GetLibConverter().GetKompasConverter())->GetInterface( &IID_IKompasConverter );
}

