/*
 * Xailer source code:
 *
 * ShellApiDlg.prg
 * Dialogos comunes del Shell
 *
 * Copyright 2003, 2007 Jose Lalin
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"


//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include <windows.h>
#include <shlobj.h>
#include <xailer.h>


typedef BOOL (WINAPI * SHFINDFILE)( LPCITEMIDLIST, LPCITEMIDLIST );
#define SHFINDFILE_PROC       (char *) 90

XA_FUNC( SHFINDFILESDLG )  // SHFindFilesDlg() --> lSuccess
{
   BOOL bSuccess = FALSE;
   SHFINDFILE fnFindFiles = (SHFINDFILE) GetProcAddress( GetModuleHandle( "shell32.dll" ), SHFINDFILE_PROC );

   if( fnFindFiles )
      bSuccess = fnFindFiles( NULL, NULL );

   hb_retl( bSuccess );
}

//--------------------------------------------------------------------------

typedef BOOL (WINAPI * SHFINDCOMPUTER)( LPCITEMIDLIST, LPCITEMIDLIST );
#define SHFINDCOMPUTER_PROC   (char *) 91

XA_FUNC( SHFINDCOMPUTERDLG )  // SHFindComputerDlg() --> lSuccess
{
   BOOL bSuccess = FALSE;
   SHFINDCOMPUTER fnFindComputer = (SHFINDCOMPUTER) GetProcAddress( GetModuleHandle( "shell32.dll" ), SHFINDCOMPUTER_PROC );

   if( fnFindComputer )
      bSuccess = fnFindComputer( NULL, NULL );

   hb_retl( bSuccess );
}

//--------------------------------------------------------------------------

typedef void (WINAPI * SHEXITWNDDLG)( HWND );
#define SHEXITWNDDLG_PROC     (char *) 60

XA_FUNC( SHEXITWINDOWSDLG )   // SHExitWindowsDlg() --> FALSE
{
   if( ! XA_IsVistaOrHigher() )
   {
      SHEXITWNDDLG fnExitWnd = (SHEXITWNDDLG) GetProcAddress( GetModuleHandle( "shell32.dll" ), SHEXITWNDDLG_PROC );

      if( fnExitWnd )
         fnExitWnd( 0 );
   }

   hb_retl( FALSE );
}

//--------------------------------------------------------------------------

typedef int (WINAPI * SHRESTARTDLG)( HWND, LPCSTR, UINT );
#define SHRESTARTDLG_PROC     (char *) 59

XA_FUNC( SHRESTARTWINDOWSDLG ) // SHRestartWindowsDlg( <oForm>, <cPrompt>, <nFlags> ) --> lResult
{
   int iReturn = 0;
   SHRESTARTDLG fnRestartWnd = (SHRESTARTDLG) GetProcAddress( GetModuleHandle( "shell32.dll" ), SHRESTARTDLG_PROC );
   LPWSTR cMessage = AnsiToWide( hb_parc( 2 ) );

   if( fnRestartWnd )
      iReturn = fnRestartWnd( HB_ISOBJECT( 1 ) ? GetHandleOf( hb_param( 1, HB_IT_OBJECT ) ) : 0L,
                              (LPCSTR) cMessage, (UINT) hb_parnl( 3 ) );

   hb_xfree( cMessage );
   hb_retl( iReturn == IDYES );
}

//--------------------------------------------------------------------------

typedef DWORD (WINAPI * SHNETCONNDLG)( HWND, LPCSTR, UINT );
#define SHNETCONNDLG_PROC     (char *) 160

XA_FUNC( SHNETCONNECTIONDLG ) // SHNetConnectionDlg( <oForm>, <cResourceName>, <nResourceType> ) --> lResult
{
   DWORD dwResult = 0;
   SHNETCONNDLG fnNetConnDlg = (SHNETCONNDLG) GetProcAddress( GetModuleHandle( "shell32.dll" ), SHNETCONNDLG_PROC );
   LPWSTR cResource = AnsiToWide( hb_parc( 2 ) );

   if( fnNetConnDlg )
      dwResult = fnNetConnDlg( HB_ISOBJECT( 1 ) ? GetHandleOf( hb_param( 1, HB_IT_OBJECT ) ) : 0L,
                                 (LPCSTR) cResource,
                                 (UINT) hb_parnl( 3 ) );

   hb_xfree( cResource );
   hb_retl( dwResult );
}

//--------------------------------------------------------------------------

typedef BOOL (WINAPI * SHOBJECTPROP)( HWND, UINT, LPCSTR, LPCSTR );
#define SHOBJECTPROP_PROC     (char *) 178
#define OPF_PRINTERNAME    0x01
#define OPF_PATHNAME       0x02

XA_FUNC( SHOBJECTPROPERTIESDLG ) // SHObjectPropertiesDlg( <oForm>, <cName>, <cDefaultPage>, <lFile> ) --> lSuccess
{
   BOOL bSuccess = FALSE;
   SHOBJECTPROP fnObjProp = (SHOBJECTPROP) GetProcAddress( GetModuleHandle( "shell32.dll" ), SHOBJECTPROP_PROC );
   BOOL bIsFile = HB_ISLOG( 4 ) ? hb_parl( 4 ) : TRUE;

   if( fnObjProp )
      bSuccess = fnObjProp( HB_ISOBJECT( 1 ) ? GetHandleOf( hb_param( 1, HB_IT_OBJECT ) ) : 0L,
                              bIsFile ? OPF_PATHNAME : OPF_PRINTERNAME,
                              hb_parc( 2 ),
                              hb_parc( 3 ) );

   hb_retl( bSuccess );
}

//--------------------------------------------------------------------------

typedef DWORD (WINAPI * SHABOUTDLG)( HWND, LPSTR, LPSTR, HICON );
#define SHABOUTDLG_PROC       (char *) "ShellAboutA"

XA_FUNC( SHABOUTDLG ) // SHAboutDlg( <oForm>, <cApplication>, <cPrompt>, [<oIcon>] ) --> lSuccess
{
   DWORD dwResult = 0;
   SHABOUTDLG fnAboutDlg = (SHABOUTDLG) GetProcAddress( GetModuleHandle( "shell32.dll" ), SHABOUTDLG_PROC );

   if( fnAboutDlg )
      dwResult = fnAboutDlg( HB_ISOBJECT( 1 ) ? GetHandleOf( hb_param( 1, HB_IT_OBJECT ) ) : 0L,
                              (LPSTR) hb_parc( 2 ),
                              (LPSTR) hb_parc( 3 ),
                              (HICON) ( HB_ISOBJECT( 4 ) ? GetHandleOf( hb_param( 4, HB_IT_OBJECT ) ) : NULL ) );

   hb_retl( dwResult );
}

//--------------------------------------------------------------------------

XA_FUNC( SHINVOKEPRINTERCOMMAND ) // SHInvokePrinterCommand( <oForm>, <nAction>, <cPrinterName>, <cVerb>, <lModal> ) --> lSuccess
{
   BOOL bSuccess = SHInvokePrinterCommand(
      HB_ISOBJECT( 1 ) ? GetHandleOf( hb_param( 1, HB_IT_OBJECT ) ) : 0L,
      (UINT) hb_parni( 2 ),
      hb_parc( 3 ),
      hb_parc( 4 ),
      (BOOL) hb_parl( 5 ) );

   hb_retl( bSuccess );
}

//--------------------------------------------------------------------------

XA_FUNC( SHFILEPROPERTY )  // SHFileProperty( <oForm>, <cFilename> ) --> nError
{
   SHELLEXECUTEINFO sei;

   ZeroMemory( &sei, sizeof( sei ) );
   sei.cbSize = sizeof( sei );
   sei.hwnd   = NULL;
   sei.lpFile = hb_parc( 2 );
   sei.lpVerb = "properties";
   sei.fMask  = SEE_MASK_INVOKEIDLIST | SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;

   ShellExecuteEx( &sei );
   hb_retnl( GetLastError() );
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
