diff options
Diffstat (limited to 'testautomation/global/tools/includes/required/t_files.inc')
-rw-r--r-- | testautomation/global/tools/includes/required/t_files.inc | 929 |
1 files changed, 929 insertions, 0 deletions
diff --git a/testautomation/global/tools/includes/required/t_files.inc b/testautomation/global/tools/includes/required/t_files.inc new file mode 100644 index 000000000000..d734cd3f05a7 --- /dev/null +++ b/testautomation/global/tools/includes/required/t_files.inc @@ -0,0 +1,929 @@ +'encoding UTF-8 Do not remove or change this line! +'******************************************************************************* +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU Lesser General Public License version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* Owner : thorsten.bosbach@oracle.com +'* +'* short description : Global routines for loading, saving, printing, export +'* +'\****************************************************************************** + +function hGrafikEinfuegen( cFile as string ) as Boolean + + hGrafikEinfuegen() = hInsertGraphic( cFile, "Static" ) + +end function + +'******************************************************************************* + +function hGrafikVerknuepftEinfuegen( cFile as string ) as Boolean + + hGrafikVerknuepftEinfuegen() = hInsertGraphic( cFile, "Linked" ) + +end function + +'******************************************************************************* + +function hInsertGraphic( byval cFile as string, byval cMode as string ) as boolean + + ' Insert a graphic file to the current document either linked or static + ' cFile: Fully qualified path to the file to be inserted + ' cMode: Supply "Linked" to link, empty string or anything else is static + + ' In difference to the older functions (GrafikEinfuegen etc.) this function + ' does provide a working returnvalue and does not secretly hide warnings and + ' errors. It does not set the file type. + + ' Make hFileWait() complain about any messageboxes + const SHOW_WARNINGS = true + + ' Find out whether we link the file or not + dim bLinked as boolean : bLinked = false + if ( lcase( cMode ) = "linked" ) then bLinked = true + + hInsertGraphic() = false + cFile = convertpath( cFile ) + + if ( FileExists( cFile ) ) then + InsertGraphicsFromFile + + kontext "GrafikEinfuegenDlg" + if ( GrafikEinfuegenDlg.exists( 3 ) ) then + + Vorschau.unCheck() + if ( Verknuepfen.isEnabled() ) then + if ( bLinked ) then + Verknuepfen.check() + else + Verknuepfen.unCheck() + endif + endif + + DateiName.setText( cFile ) + Oeffnen.click() + + if ( hFileWait( SHOW_WARNINGS ) >= 0 ) then hInsertGraphic() = true + + else + warnlog( "hInsertGraphic(): Failed to open <Insert Graphics> dialog" ) + endif + else + warnlog( "hInsertGraphic(): File does not exist: " & cFile ) + endif + +end function + +'******************************************************************************* + +function hIsNamedDocLoaded( cFileName as string ) as boolean + + ' Retrieve the current filename from the document properties - which in + ' comparision to the old approach to retrieve the name from the file save + ' dialog - gives us the file including its extension. So we only need + ' to compare the last characters from a full path to be relatively + ' certain that we work with the correct file. There is some small margin of + ' error, though. + + const CFN = "global::tools::includes::required::hIsNamedDocumentLoaded(): " + const RC_FAILURE = -1 + + dim cDocumentName as string + dim iDocumentNameLength as integer + dim bTemplateDocument as boolean + + hIsNamedDocLoaded() = false + + ' If the requested document is a template, we cannot use its filename to + ' identify the document as it is named "Untitled 1" or "Untitled" in the + ' FileSave dialog and the document properties dialog. The string is locale + ' dependent. So we do a shortcut here, the calling tests fail at a later + ' point if this function does not work properly + + select case( right( cFileName, 4 ) ) + case ".vor", ".dot", ".sti", ".pot", ".std", ".xlt", ".stc", ".ots", "xltm", "xltx" + if ( GVERBOSE ) then printlog( CFN & "Template document filtered" ) + hIsNamedDocLoaded() = true + exit function + end select + + if ( hUseAsyncSlot( "FileProperties" ) <> RC_FAILURE ) then + + kontext + active.setpage(tabdokument) + + kontext "TabDokument" + if ( TabDokument.exists( 2 ) ) then + + cDocumentName = DokumentName.getText() + iDocumentNameLength = len( cDocumentName ) + + if ( GVERBOSE ) then + printlog( CFN & "Expected file: " & cFileName ) + printlog( CFN & "Current file.: " & cDocumentName ) + printlog( CFN & "Comparing last " & iDocumentNameLength & " characters" ) + endif + + if ( right( cFileName, iDocumentNameLength ) = cDocumentName ) then + if ( GVERBOSE ) then printlog( CFN & "This is the expected file" ) + hIsNamedDocLoaded() = true + else + if ( GVERBOSE ) then printlog( CFN & "This is *not* the expected file" ) + endif + + hCloseDialog( TabDokument, "cancel" ) + else + warnlog( CFN & "Unable to open dialog <Document Properties>" ) + endif + else + warnlog( CFN & "Unable to execute slot <FileProperties>" ) + endif + +end function + +'******************************************************************************* + +function hExportAsPDFmulti (iTypeOfCall as integer, bExecute as boolean, sFileName as string, bAutoExtension as boolean, bOverwriteFile as boolean, iRange as integer, iConpression as integer, optional sRange as string) as boolean + '/// Export a document to PDF with various options. + '///+ INPUT + '///+<ul><li>iTypeOfCall</li><ul><li>1: via the icon in the functionbar (no options selectable, since only file dialog comes up!)</li> + '///+<li>2: via File->Send->Document As PDF Attachment... (makes no sense either, because after the mail window comes up... (you can't handle by the testtool))</li> + '///+<li>3 via File->Export As PDF... (RECOMMENDED)</li></ul> + '///+<li>bExecute: Shall all dialogs left with OK? TRUE (RECOMMENDED) / FALSE</li> + '///+<li>sFileName: Filename to use</li> + '///+<li>bAutoExtension: Shall the file extension be chosen by StarOffice? TRUE / FALSE (RECOMMENDED)</li> + '///+<li>bOverwriteFile: If filename already exists should it be overwritten? TRUE (RECOMMENDED) / FALSE</li> + '///+<li>iRange:</li><ol><li>1: All (RECOMMENDED)</li> + '///+<li>2: Pages: The range is set in the optional parameter 'sRange' at the end</li> + '///+<li>3: Selection</li></ol> + '///+<li>iConpression:</li><ol><li>1: JpegCompression check and ReduceImageResolution check</li> + '///+<li>2: JpegCompression check and ReduceImageResolution uncheck</li> + '///+<li>3: LosslessCompression check and ReduceImageResolution uncheck</li></ol> + '///+<li>sRange: Optional parameter only used for iRange=2; takes the page range as text</li> + '///+<li>RETURN: Any Errors? TRUE / FALSE</li></ul> + dim sPDF as string + dim sTemp as string + dim iTemp as integer + dim sTFileName as string + dim iCount as integer + + sPDF = "PDF - Portable Document Format (.pdf)" + hExportAsPDFmulti = TRUE ' optimistic + iTemp = 0 + + select case (iTypeOfCall) + case 1 : '/// click the button 'Export Directly as PDF' on the Functionbar ///' + kontext "Standardbar" + try + ExportAsPDF.click + catch + Warnlog "Button 'Export directly as PDF' not accessible!" + hExportAsPDFmulti = FALSE + exit function + endcatch + case 2 : '/// File->Send->Document As PDF Attachment... ///' + try + FileSendDocumentAsPDF + catch + Warnlog "'Export as PDF' not accessible!" + hExportAsPDFmulti = FALSE + exit function + endcatch + case 3 : '/// File->Export As PDF... ///' + try + FileExportAsPDF ' works in draw/impress, too but is not 'legal' in the UI :-) + catch + Warnlog "Button 'Export as PDF' not accessible!" + hExportAsPDFmulti = FALSE + exit function + endcatch + end select + + ' only if the type is 1 OR 3 then the File Save dialog appear + ' just kept here for compatibility reasons - has to get removed around july 2007 + if (iTypeOfCall = 1 OR iTypeOfCall = 3) then + kontext "ExportierenDlg" + if ExportierenDlg.exists(5) then + try + Dateityp.Select sPDF + catch + Warnlog "Unable to select filter: '" + sPDF + "'" + ExportierenDlg.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + + sTemp = Dateityp.GetSelText + if (sTemp <> sPDF) then + Warnlog "filter for PDF export is missing :-( '" + sPDF + "'" + end if + '/// set Textbox 'File name' ///' + Dateiname.SetText sFileName + 'if the file has no pdf extension then add the extension + if (lCase(right(sFileName, 4))=".pdf") then + sTFileName = sFileName + else + sTFileName = sFileName + ".pdf" + endif + '/// click on the button 'Export...' ///' + if (bExecute) then + speichern.Click + kontext "AlienWarning" + if AlienWarning.exists(5) then + warnlog "#i41983# Alien Warning on export not allowed." + AlienWarning.OK + endif + if (iTypeOfCall = 1) then + ''Export Directly as PDF' + endif + iCount = 0 + ' wait until file exists for max 5 minutes + while ((dir(sTFileName)="") AND (iCount < 30)) + sleep 10 + inc iCount + wEnd + endif + else + 'ExportierenDlg.Cancel + end if + + ' if file exists, there is a message... + kontext "PDFOptions" + if NOT PDFOptions.exists then + Kontext + if messagebox.exists (5) then + if (bOverwriteFile) then + messagebox.Yes + else + messagebox.No + kontext "ExportierenDlg" + ExportierenDlg.Cancel + hExportAsPDFmulti = FALSE + end if + end if + end if + end if + + + ' only if the type is 2 OR 3 then the PDF option dialog appear + if (iTypeOfCall = 2 OR iTypeOfCall = 3) then + kontext "PDFOptions" + select case (iRange) + case 1 : '/// check radiobutton 'All' ///' + try + RangeAll.Check + catch + Warnlog "Radiobutton 'All' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + case 2 : '/// check radiobutton 'Pages' ///' + try + RangePages.Check + catch + Warnlog "Radiobutton 'Range' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + if isMissing(sRange) then + Warnlog "parameter 'sRange' in function 'hExportAsPDFmulti' is not optional if 'iRange' = 2" + hExportAsPDFmulti = FALSE + else + '/// set range textbox the given value ///' + RangePagesEdit.SetText sRange + end if + case 3 : '/// check radiobutton 'Selection' (not enabled in math!) ///' + try + if (RangeSelection.IsEnabled <> TRUE)then + Warnlog "RangeSelection is disabled :-(" + else + RangeSelection.Check + end if + catch + Warnlog "Radiobutton 'Selection' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + end select + + select case (iConpression) + case 1 : '/// JpegCompression check and ReduceImageResolution check///' + try + JpegCompression.Check + ReduceImageResolution.Check + catch + Warnlog "Radiobutton 'Reduce Image Resolution' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + case 2 : '/// JpegCompression check and ReduceImageResolution uncheck ///' + try + JpegCompression.Check + ReduceImageResolution.UnCheck + catch + Warnlog "Radiobutton 'Jpeg Compression' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + case 3 : '/// LosslessCompression check and ReduceImageResolution uncheck ///' + try + LosslessCompression.Check + ReduceImageResolution.UnCheck + catch + Warnlog "Radiobutton 'Lossless Compression' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + end select + if (bExecute) then + try + PDFOptions.OK + catch + qaErrorlog "ImprovementOfSave: PDF export loops?" + endcatch + else + PDFOptions.Cancel + end if + end if + ' only if the type is 1 OR 3 then the File Save dialog appear + kontext "ExportierenDLG" + if (iTypeOfCall = 1 OR iTypeOfCall = 3) then + if ExportierenDLG.exists(5) then + try + Dateityp.Select sPDF + catch + Warnlog "Unable to select filter: '" + sPDF + "'" + ExportierenDLG.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + + sTemp = Dateityp.GetSelText + if (sTemp <> sPDF) then + Warnlog "filter for PDF export is missing :-( '" + sPDF + "'" + end if + '/// set Textbox 'File name' ///' + Dateiname.SetText sFileName + 'if the file has no pdf extension then add the extension + if (lCase(right(sFileName, 4))=".pdf") then + sTFileName = sFileName + else + sTFileName = sFileName + ".pdf" + endif + '/// click on the button 'Export...' ///' + if (bExecute) then + Speichern.Click + kontext "AlienWarning" + if AlienWarning.exists(5) then + warnlog "#i41983# Alien Warning on export not allowed." + AlienWarning.OK + endif + if (iTypeOfCall = 1) then + ''Export Directly as PDF' + endif + iCount = 0 + ' wait until file exists for max 5 minutes + while ((dir(sTFileName)="") AND (iCount < 30)) + sleep 10 + inc iCount + wEnd + endif + else + try + ExportierenDLG.Cancel + catch + printlog "export not there" + endcatch + end if + + ' if file exists, there is a message... + kontext "PDFOptions" + if NOT PDFOptions.exists then + Kontext + if messagebox.exists (5) then + if (bOverwriteFile) then + messagebox.Yes + else + messagebox.No + kontext "ExportierenDLG" + ExportierenDLG.Cancel + hExportAsPDFmulti = FALSE + end if + end if + end if + end if + +end function +' +'------------------------------------------------------------------------------- +' +function hFileDelete( cFileOrig as string ) as boolean + hFileDelete() = hDeleteFile( cFileOrig ) +end function +' +'------------------------------------------------------------------------------- +' +function hDeleteFile( cFileOrig as string ) as boolean + + const CFN = "global::tools::includes::required::t_files.inc::hDeleteFile():" + dim cHome as string : cHome = convertpath( gOfficePath & "user" ) + dim cFile as string : cFile = convertpath( cFileOrig ) + + ' This function tries to delete a file and does some very basic error- + ' handling. Returns 'true' on success, only error while deleting returns + ' 'false', if the file does not exist, it is considered to be successfully + ' deleted. + ' I introduced this function due to a number of cases where deleting files + ' actually failed because of weird code or situations where the user lacks + ' accessrights to files are not handled at all. + + if ( instr( cFile , cHome ) = 0 ) then + qaerrorlog( CFN & "Trying to delete file outside (default)homedir -> forbidden" ) + qaerrorlog( CFN & "Home: " & cHome ) + qaerrorlog( CFN & "File: " & cFile ) + hDeleteFile() = false + exit function + endif + + cFile = convertpath( cFile ) + + if ( FileExists( cFile ) ) then + try + kill( cFile ) + + if ( FileExists( cFile ) ) then + warnlog( CFN & "File was not deleted: " & cFile ) + hDeleteFile() = false + else + if ( GVERBOSE ) then printlog( CFN & "File successfully deleted: " & cFile ) + hDeleteFile() = true + endif + catch + qaerrorlog( CFN & "Deleting file failed: " & cFile ) + hDeleteFile() = false + endcatch + else + printlog( CFN & "Nothing to do." ) + hDeleteFile() = true + endif + +end function +' +'------------------------------------------------------------------------------- +' +function hGetWorkFile( cFileName as string ) as string + hGetWorkFile() = hGetWorkPath() & cFileName +end function +' +'------------------------------------------------------------------------------- +' +function hGetWorkPath() as string + + ' Retrieve the user's work directory using the API (or fallback) + + dim sPath as string : sPath = "" + dim oOfficeConnect as object + dim oOfficeConfig as object + dim bPathIsFromAPI as boolean + + const CFN = "global::tools::includes::required::t_files.inc:hGetWorkPath(): " + + ' Create an UNO service and ask it for the location of Work + try + oOfficeConnect = hGetUnoService( true ) + oOfficeConfig = oOfficeConnect.createInstance( "com.sun.star.util.PathSettings" ) + sPath = convertFromURL( oOfficeConfig.Work ) + bPathIsFromAPI = true + catch + printlog( CFN & "Could not access service, connection broken?" ) + sPath = convertpath( gOfficePath & "user/work" ) + bPathIsFromAPI = false + endcatch + + if ( GVERBOSE ) then + + printlog( CFN & "Path is: " & sPath ) + + ' Check path existence + if ( FileExists( sPath ) ) then + printlog( CFN & "Path exists." ) + else + warnlog( CFN & "Path does not exist." ) + endif + + ' Inform about the location from where the path was taken + if ( bPathIsFromAPI ) then + printlog( CFN & "Path was taken from API" ) + else + warnlog( CFN & "Path was taken from (hardcoded) fallback" ) + endif + + endif + + hGetWorkPath() = sPath & getPathSeparator + +end function +' +'------------------------------------------------------------------------------- +' +function hFileGetLocalPath( sSourcePath as string ) as string + + ' Isolate filename from path, prepend local work directory and return new file path + hFileGetLocalPath() = hGetWorkFile( hSplitString( sSourcePath, getPathSeparator, 0 ) ) + +end function +' +'------------------------------------------------------------------------------- +' +function hFileListCopyLocal( lsSourceList() as string ) as boolean + + ' Copy a list of files from testautomation to the local work directory + + const CFN = "global::tools::includes::required::t_files.inc:hFileListCopyLocal(): " + dim iCurrentPath as integer + dim cTargetPath as string + dim cSourcePath as string + + hFileListCopyLocal() = true + + for iCurrentPath = 1 to listcount( lsSourceList() ) + + cSourcePath = lsSourceList( iCurrentPath ) + cTargetPath = hFileGetLocalPath( cSourcePath ) + + FileCopy( cSourcePath, cTargetPath ) + + ' If any one copy operation fails we + if ( not FileExists( cTargetPath ) ) then + hFileListCopyLocal() = false + warnlog( CFN & "File was not copied: " & cSourcePath ) + endif + + next iCurrentPath + +end function +' +'------------------------------------------------------------------------------- +' +function hFileOpenLocally( byVal sSourcePath as string ) as boolean + + ' Issue #i112208# - implement a function that copies a file from testautomation + ' into the local work directory and opens it from there to avoid that the + ' document gets opened in read-only mode. See details of the implementation + ' in the issue description. + + ' Parameters + ' 1) Path as string, URLs are untested. + ' 2) Separator, usually "getPathSeparator" + ' 3) Item number, 0 = last item which usually is the file name from a path. + ' Begin counting with 1, while the function internally accesses item 0 + ' from the array. + + const CFN = "global::tools::includes::required::t_files.inc:hFileOpenLocally(): " + + dim sTargetPath as string + + sSourcePath = convertpath( sSourcePath ) + + ' If the source file does not exist we quit + if ( not FileExists( sSourcePath ) ) then + warnlog( CFN & "Source path/file does not exist: " & sSourcePath ) + hFileOpenLocally() = false + exit function + endif + + ' Find out what the name of the target file is going to be + sTargetPath = hFileGetLocalPath( sSourcePath ) ' The path + file + + ' For debugging purposes set global variable gVerbose to TRUE + if ( gVerbose ) then + printlog( CFN & "Copying file" ) + printlog( CFN & "From: " & sSourcePath ) + printlog( CFN & "To..: " & sTargetPath ) + endif + + ' Copy the file from anywhere to the local user directory if it does not + ' exist. This behavior was discussed on IRC + if ( FileExists( sTargetPath ) ) then + printlog( CFN & "Re-using existing local copy of workfile" ) + 'warnlog( CFN & "Target file exists, it has not been deleted by prior test" ) + endif + + FileCopy( sSourcePath, sTargetPath ) + + ' Verify that the file has been created. return an empty string and warn + if ( not FileExists( sTargetPath ) ) then + warnlog( CFN & "File was not copied: " & sTargetFile ) + hFileOpenLocally() = false + gLastWorkFile = "" + exit function + endif + + ' This is a hook that allows to access the filename under which the file + ' has been saved. Due to restrictive coding guidelines we cannot return + ' the new filename. + gLastWorkFile = sTargetPath + + ' Finally open the file from the local work directory. It should open + ' ready for editing + hFileOpenLocally() = hFileOpen( gLastWorkFile ) + +end function +' +'------------------------------------------------------------------------------- +' +function hFileCloseAll() as integer + + dim iDocumentCount as integer : iDocumentCount = 0 + Do Until GetDocumentCount = 0 + Call hCloseDocument() + iDocumentCount = iDocumentCount + 1 + Loop + hFileCloseAll() = iDocumentCount + +end function +' +'------------------------------------------------------------------------------- +' +function hFileOpen( cFile as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + hFileOpen() = FALSE + const CFN = "global::tools::inc::t_files.inc::hFileOpen(): " + if ( GVERBOSE ) then printlog( CFN & "Load: " & sFile ) + FileOpen( "URL", sFile, "FrameName", "_default" ) + if ( hFileWait( FALSE ) >= 0 ) then hFileOpen() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileOpenSpecial( cFile as string, cFlag as string ) as boolean + + ' Open a file with some special options + ' cFlag = "ReadOnly" opens file read-onlx + ' cFlag = "AsTemplate" opens file as templat + ' cFlag = <Any other string> treats string as password + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileOpenSpecial(): " + hFileOpenSpecial() = FALSE + if ( GVERBOSE ) then printlog( "Load (Flag): " & sFile & " (" & cFlag & ")" ) + + select case( lcase( cFlag ) ) + case "readonly" + printlog( CFN & "Load file read-only: " & sFile ) + FileOpen( "URL", sFile, "FrameName", "_default", "ReadOnly", TRUE) + case "astemplate" + printlog( CFN & "Load file as template: " & sFile ) + FileOpen( "URL", sFile, "FrameName", "_default", "AsTemplate" , TRUE ) + case else + printlog( CFN & "Load file with password: " & sFile ) + FileOpen( "URL", sFile, "FrameName", "_default", "Password" , cFlag ) + end select + + if ( hFileWait( FALSE ) >= 0 ) then hFileOpenSpecial() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileOpenWithFilter( cFile as string, cFilter as string ) + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileOpenWithFilter(): " + hFileOpenWithFilter() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Load (Filter): " & sFile & " (" & cFilter & ")" ) + FileOpen( "URL", sFile, "FrameName", "_default", "FilterName", cFilter ) + if ( hFileWait( FALSE ) >= 0 ) then hFileOpenWithFilter() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSave() as boolean + + const CFN = "global::tools::inc::t_files.inc::hFileSave(): " + hFileSave() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save file." ) + FileSave( "SynchronMode", TRUE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSave() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAs( cFile as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAs(): " + hFileSaveAs() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save: " & sFile ) + FileSaveAs( "URL", sFile, "Overwrite", FALSE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAs() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAsKill( cFile as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAsKill(): " + hFileSaveAsKill() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save, replacing: " & sFile ) + FileSaveAs( "URL", sFile, "Overwrite", TRUE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsKill() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAsKillWithPassword( cFile as string, cPassword as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAsKillWithPassword(): " + hFileSaveAsKillWithPassword() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save with password, replacing: " & sFile & "::" & cPassword ) + FileSaveAs( "URL", sFile, "Overwrite", TRUE, "Password", cPassword ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsKillWithPassword() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAsWithFilter( cFile as string, cFilter as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAsWithFilter(): " + hFileSaveAsWithFilter() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save with filter: " & sFile & "::" & cFilter ) + FileSaveAs( "URL", sFile, "FilterName", cFilter, "Overwrite", FALSE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsWithFilter() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAsWithFilterKill( cFile as string, cFilter as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAsWithFilterKill(): " + hFileSaveAsWithFilterKill() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save with filter, replacing: " & sFile & "::" & cFilter ) + FileSaveAs( "URL", sFile, "FilterName", cFilter, "Overwrite", TRUE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsWithFilterKill() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileWait( optional bWarn as boolean ) as integer + + ' Wait max 10 seconds for the FileOpen/FileSave slot to finish + ' Returns the time it took the slot to finish + ' Negative returnvalues are given on timeout or any blocking dialog + + const CFN = "global::tools::inc::t_files.inc::hFileWait(): " + const MAX_WAIT = 10 + dim iWait as integer : iWait = 0 + dim bWarnlog as boolean + + if ( IsMissing( bWarn ) ) then + bWarnlog = TRUE + else + bWarnlog = bWarn + endif + + do while( WaitSlot() <> WSFinished ) + + iWait = iWait + 1 + + ' This is the timeout + if ( iWait = MAX_WAIT ) then + iWait = -1 + exit do + endif + + ' LOAD: Security warning prevents slot from finishing + kontext "SecurityWarning" + if ( SecurityWarning.exists() ) then + iWait = -2 + exit do + endif + + ' LOAD: Password dialog + kontext "PasswordFileOpen" + if ( PasswordFileOpen.exists() ) then + iWait = -3 + exit do + endif + + ' SAVE: Password dialog + kontext "PasswordDlg" + if ( PasswordDlg.exists() ) then + iWait = -4 + exit do + endif + + ' LOAD: Master Password Dialog + kontext "MasterPasswordEnter" + if ( MasterPasswordEnter.exists() ) then + iWait = -10 + warnlog( CFN & "Master Password dialog displayed. Tests are likely to fail" ) + exit do + endif + + ' LOAD: Filter selection dialog + Kontext "Filterauswahl" + if ( FilterAuswahl.exists() ) then + iWait = -5 + exit do + endif + + ' LOAD: ASCII Filter Options dialog + kontext "ASCIIFilterOptionen" + if AsciiFilterOptionen.Exists() then + iWait = -6 + exit do + end if + + ' LOAD/SAVE: Some other dialogs that may interrupt file I/O + kontext "Active" + if ( Active.exists() ) then + printlog( Active.getText() ) + + ' This is most likely a warning + if ( Active.getButtonCount() = 1 ) then + iWait = -7 + exit do + endif + + ' This is probably the update links dialog + if ( Active.getButtonCount() = 2 ) then + iWait = -8 + exit do + endif + + ' This is probably the styles not matching dialog + if ( Active.getButtonCount() = 3 ) then + iWait = -9 + exit do + endif + + endif + + loop + + if ( GVERBOSE ) then + select case iWait + case -1 : printlog( CFN & "Timeout reached, rc = " & iWait ) + case -2 : printlog( CFN & "Macro security warning displayed, rc = " & iWait ) + case -3 : printlog( CFN & "Password dialog (load) displayed, rc = " & iWait ) + case -4 : printlog( CFN & "Password dialog (save) displayed, rc = " & iWait ) + case -5 : printlog( CFN & "Filter Selection dialog displayed, rc = " & iWait ) + case -6 : printlog( CFN & "ASCII filter options dialog displayed, rc = " & iWait ) + case -7 : printlog( CFN & "A dialog box is in the way (1 button), rc = " & iWait ) + case -8 : printlog( CFN & "A dialog box is in the way (2 buttons), rc = " & iWait ) + case -9 : printlog( CFN & "A dialog box is in the way (3 buttons), rc = " & iWait ) + case -10 : printlog( CFN & "Master Password Dialog displayed, rc = " & iWait ) + case else : printlog( CFN & "File I/O completed in " & iWait & " seconds" ) + end select + endif + + if ( bWarnlog and ( iWait < 0 ) ) then + warnlog( CFN & "The messagebox was not expected at this point" ) + endif + + hFileWait() = iWait + +end function + |