'/*************************************************************************
'
'  Licensed to the Apache Software Foundation (ASF) under one
'  or more contributor license agreements.  See the NOTICE file
'  distributed with this work for additional information
'  regarding copyright ownership.  The ASF licenses this file
'  to you under the Apache License, Version 2.0 (the
'  "License"); you may not use this file except in compliance
'  with the License.  You may obtain a copy of the License at
'  
'    http://www.apache.org/licenses/LICENSE-2.0
'  
'  Unless required by applicable law or agreed to in writing,
'  software distributed under the License is distributed on an
'  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
'  KIND, either express or implied.  See the License for the
'  specific language governing permissions and limitations
'  under the License.
'
' ************************************************************************/
'### Build Support Module for running commands to export and import
'### modules from Word, Excel and PowerPoint Document Analysis driver documents


<job id="DocAnalysisBuildCmd" error="true" debug="true">
   <script language="VBScript" src="DocAnalysisRunMacro.vbs"/>
   <script language="VBScript">

Const CTITLE = "Document Analysis Command"

Const CWORD_DRIVER = "_OOoDocAnalysisWordDriver.doc"
Const CEXCEL_DRIVER = "_OOoDocAnalysisExcelDriver.xls"
Const CPP_DRIVER = "_OOoDocAnalysisPPTDriver.ppt"
Const CStub = "Stripped"

Const CUTIL_APPNAME_WORD = "Word"
Const CUTIL_APPNAME_EXCEL = "Excel"
Const CUTIL_APPNAME_POWERPOINT = "PowerPoint"

Const CDIAG_STD_DELAY = 2

Const CDEFAULT_SOURCE_DIR = ".\sources\"
Const CDEFAULT_TARGET_DIR = "."

Const CSOURCE_DIR_ARG = "X"
Const CTARGET_DIR_ARG = "T"
Const CUSAGE_ARG = "?"

Const CSTR_PAW = "\PAW\"

'######### Doc Analysis Build - Main Script Body ############# 
Dim mArgsNamed, mArgsUnnamed
Dim mSourceDir
Dim mTargetDir

On Error Resume Next

'### Process Arguments ###
Set mArgsNamed = WScript.Arguments.Named
Set mArgsUnnamed = WScript.Arguments.Unnamed

If mArgsNamed.Exists(CUSAGE_ARG) Then
	Usage
	FinalExit
End If

'# Source Dir
if mArgsNamed.Exists(CSOURCE_DIR_ARG) Then
	mSourceDir = mArgsNamed.Item(CSOURCE_DIR_ARG)
Else
	mSourceDir = CDEFAULT_SOURCE_DIR
End If

'# Target Dir
if mArgsNamed.Exists(CTARGET_DIR_ARG ) Then
	mTargetDir = mArgsNamed.Item(CTARGET_DIR_ARG )
Else
	mTargetDir = CDEFAULT_TARGET_DIR
End If

mSourceDir = daFso.GetAbsolutePathName(mSourceDir )
mTargetDir = daFso.GetAbsolutePathName(mTargetDir ) 

'# Check source and target dirs exist
If Not daFso.FolderExists(mSourceDir) Then
	DAErrMsg "Source directory does not exist: " & mSourceDir, CDA_ERR_STD_DELAY 
    FinalExit
End If
If Not daFso.FolderExists(mTargetDir) Then
	DAErrMsg "Target directory does not exist: " & mTargetDir, CDA_ERR_STD_DELAY 
    FinalExit
End If

Set mArgsNamed = Nothing
Set mArgsUnnamed = Nothing

'#### then continue with PAW
ImportAll mTargetDir & CSTR_PAW

'# Cleanup
FinalExit


'######### End - Main Script Body ############# 


'#### Doc Analysis Build - Support Functions ####

Sub Usage()
	DAdiagMsg "Build command line tool to create Document Analysis driver documents" & vbLf & vbLf &_
	"DocAnalysisBuildCmd [/X:<sourceDir>] [/T:<targetDir>]" & vbLf & vbLf &_
	"/X:<sourceDir> base <source> directory " & vbLf & _
	"            The <sourceDir> is the base dir under which all the " & vbLf & _
	"            _res.bas files are located to import from" & vbLf & vbLf & _
	"/T:<targetDir> target directory " & vbLf & _
	"            <targetDir> is where the new Driver docs" & vbLf & _
	"            will be created", 30
End Sub

'######################
Sub FinalExit()
    DACleanUp
	wscript.quit
End Sub

'######################
Sub ImportAll( aTargetDir )

    '#### Create automation servers ####
    DAsetupWrdServer
    DAsetupExcelServer
    DAsetupPPServer
    
    If Not daFso.FolderExists( aTargetDir ) Then
        daFso.CreateFolder( aTargetDir )
    End If
    
    BackupDrivers aTargetDir
    
    DAOpenWrdDriver mSourceDir & "\" & CSTUB & CWORD_DRIVER 
    DAOpenExcelDriver mSourceDir & "\" & CSTUB & CEXCEL_DRIVER
    DAOpenPPDriver mSourceDir & "\" & CSTUB & CPP_DRIVER
    
    DASetTitle CTITLE & " - Import"
    
    ImportSelectedProjectFiles mSourceDir, CUTIL_APPNAME_WORD
    ImportSelectedProjectFiles mSourceDir, CUTIL_APPNAME_EXCEL
    ImportSelectedProjectFiles mSourceDir, CUTIL_APPNAME_POWERPOINT
        
    DAsaveWrdDriver aTargetDir & "\" & CWORD_DRIVER
    DAsaveExcelDriver aTargetDir & "\" & CEXCEL_DRIVER
    DAsavePPDriver aTargetDir & "\" & CPP_DRIVER
    
    DACloseApps
End Sub

'######################
Sub BackupDrivers(importdir)
    On Error Resume Next

	Dim wrdPath
	Dim xlsPath
	Dim ppPath
	
	wrdPath = daFso.GetAbsolutePathName(importdir & "\" & CWORD_DRIVER)
	xlsPath= daFso.GetAbsolutePathName(importdir & "\" & CEXCEL_DRIVER) 
	ppPath= daFso.GetAbsolutePathName(importdir & "\" & CPP_DRIVER) 

    If daFso.FileExists( wrdPath ) Then daFso.CopyFile wrdPath, wrdPath & ".bak"
	If daFso.FileExists( xlsPath ) Then daFso.CopyFile xlsPath, xlsPath & ".bak"
	If daFso.FileExists( ppPath ) Then daFso.CopyFile ppPath, ppPath & ".bak"
End Sub

'######################
Sub ImportSelectedProjectFiles(dir, app_name)
    On Error Resume Next
    
    Dim base
    Dim lcApp_name
    lcApp_name = LCase(app_name)
    
    'Driver Specific
    base = dir & "\" & lcApp_name & "\"
        
    DAImportFile base & "ApplicationSpecific.bas", "ApplicationSpecific", app_name
    DAImportFile base & "MigrationAnalyser.cls", "MigrationAnalyser", app_name

    DAImportFile base & "Preparation.bas", "Preparation", app_name

    'app resource
    DAImportFile base & lcApp_name & "_res.bas", lcApp_name & "_res", app_name
    
    'Common
    base = dir & "\"
    DAImportFile base & "AnalysisDriver.bas", "AnalysisDriver", app_name
    DAImportFile base & "CommonMigrationAnalyser.bas", "CommonMigrationAnalyser", app_name
    DAImportFile base & "CollectedFiles.cls", "CollectedFiles", app_name
    DAImportFile base & "DocumentAnalysis.cls", "DocumentAnalysis", app_name
    DAImportFile base & "FileTypeAssociation.cls", "FileTypeAssociation", app_name
    DAImportFile base & "IssueInfo.cls", "IssueInfo", app_name
    DAImportFile base & "PrepareInfo.cls", "PrepareInfo", app_name
    DAImportFile base & "StringDataManager.cls", "StringDataManager", app_name
    DAImportFile base & "LocalizeResults.bas", "LocalizeResults", app_name
 
    DAImportFile base & "CommonPreparation.bas", "CommonPreparation", app_name

    'common resource
    DAImportFile base & "common_res.bas", "common_res", app_name
    DAImportFile base & "results_res.bas", "results_res", app_name

End Sub

</script>
</job>

