/*******************************************************************************
 * Copyright (c) 2007, 2008 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Takashi ITOH - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.model.flash;

import java.text.MessageFormat;

import org.eclipse.actf.util.win32.COMUtil;
import org.eclipse.actf.visualization.flash.Messages;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.internal.ole.win32.GUID;
import org.eclipse.swt.internal.ole.win32.IDispatch;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Display;


public class FlashDetect {

    private static final GUID CLSID_FLASH = COMUtil.IIDFromString("{D27CDB6E-AE6D-11CF-96B8-444553540000}"); //$NON-NLS-1$

    private static String strVersion = null;

    static {
    	try {
            int pv = COMUtil.createDispatch(CLSID_FLASH);
            if( 0 != pv ) {
                IDispatch dispFlash = new IDispatch(pv);
                Variant varFlash = new Variant(dispFlash);
                try {
                	OleAutomation auto = varFlash.getAutomation();
                	int[] idGetVersion = auto.getIDsOfNames(new String[]{"GetVariable"}); //$NON-NLS-1$
                	if( null != idGetVersion ) {
                		Variant varVersion = auto.invoke(idGetVersion[0],new Variant[]{new Variant("$version")}); //$NON-NLS-1$
                		if( null != varVersion && OLE.VT_BSTR == varVersion.getType() ) {
                			String rawVersion = varVersion.getString();
                			int sep = rawVersion.indexOf(' ');
                			if( sep > 0 ) {
                				strVersion = rawVersion.substring(sep+1);
                			}
                		}
                	}
                }
                finally {
                	varFlash.dispose();
                }
            }
    	}
    	catch( Exception e ) {
    		e.printStackTrace();
    	}
    }
    
    public static void showDialog() {
        if( null == strVersion ) return;
        int sep = strVersion.indexOf(',');
        if( sep > 0 ) {
            try {
                if( Integer.parseInt(strVersion.substring(0,sep)) < 8 ) {
                    MessageDialog.openWarning(Display.getCurrent().getActiveShell(),
                            Messages.getString("msaa.warning"), //$NON-NLS-1$
                            MessageFormat.format(Messages.getString("flash.bad_flash_version"),new Object[]{strVersion})); //$NON-NLS-1$
                }
            }
            catch( Exception e ) {
            }
        }
        strVersion = null;
    }
    
}
