Utilizar Transferencia de Archivos (IND$File)

Esta serie de ejemplos de macros demuestra cómo utilizar la API de transferencia de archivos para recuperar un lista de archivos, descargar un archivo y cargar un archivo a un host 3270.

NOTA:Debe haber iniciado sesión y tener una indicación de sistema abierta antes de ejecutar estas macros.

List archivos

Esta macro muestra cómo utilizar la API de transferencia de archivos para recuperar una lista de archivos de un host 3270 utilizando la transferencia IND$File. El objeto de transferencia IND$File se recupera de la transferencia de archivos de fábrica y se utiliza para obtener una matriz de objetos HostFile de TSO o de CMS.

var macro = createMacro(function*() {
	'use strict';
	
	try {
		var fileTransfer = fileTransferFactory.getInd$File();
		var hostFiles = yield fileTransfer.getHostFileListing();
		
		yield ui.message('Found ' + hostFiles.length + ' files');
		if (hostFiles.length > 0) {
			var firstFile = hostFiles[0];
			var msg1 = 'El nombre del catálogo es ' + firstFile.getParent() + '. ';
			var msg2 = 'The first file is ' + firstFile.getName();
			yield ui.message(msg1 + msg2);
		}
	} catch (error) {
		yield ui.message(error);
	}
});

// Run the macro
return macro();

Descargar archivo

Esta macro muestra cómo utilizar la API de transferencia de archivos para descargar un archivo de un host 3270 utilizando la transferencia IND$File. El objeto de transferencia IND$File se recupera de la transferencia de archivos de fábrica. En este ejemplo, el método de transferencia está ajustado a ASCII para mostrar el uso de la función setTransferOptions. La macro de ejemplo descarga el primer archivo devuelto de una llamada a getHostFileListing creando una URL de descarga con una llamada a la función getDownloadUrl. La macro se puede utilizar o bien en un entorno CMS, o bien en un entorno TSO, pero la elección se debe especificar en la primera línea o el código se debe modificar levemente para el sistema destinado.

var hostEnvironment = 'CMS'; // 'TSO'
// Construct file path, ie catalog/file.name or catalog/partition/file
function getPath (fileNode) {
	var prefix = fileNode.getParent() ? fileNode.getParent() + '/' : '';
	return prefix + fileNode.getName();
}

var macro = createMacro(function*() {
	'use strict';
	
	try {
		var fileTransfer = fileTransferFactory.getInd$File();
		
		// Las opciones de transferMethod son 'binario' y 'ascii'
		fileTransfer.setTransferOptions({transferMethod: 'ascii'});

		// Esta demostración recupera el primer archivo devuelto en la lista
		var hostFiles = yield fileTransfer.getHostFileListing();
		var firstHostFile = hostFiles[0];
		
		if (hostEnvironment === 'CMS') {
			yield wait.forText('Ready', new Position(1,1), 5000);
		}
		
		// Download
		// Si ya conoce la ruta al archivo que desea, pásela a getDownloadURL()
		var downloadUrl = fileTransfer.getDownloadURL(getPath(firstHostFile));
		
		// Esto cambia la ubicación del navegador. Puede obtener resultados diferentes en navegadores diferentes
		window.location = downloadUrl;
		
		// Si desea leer el contenido del archivo en una variable en lugar de descargarlo,
		// puede utilizar jQuery
		// var fileContents = yield $.get(downloadUrl);
		
	} catch (error) {
		yield ui.message(error);
	}
});

// Run the macro
return macro();

Cargar archivo

Esta macro muestra cómo utilizar la API de transferencia de archivos para cargar un archivo a un host 3270 utilizando la transferencia IND$File. Esta macro de ejemplo pide al usuario seleccionar un archivo del sistema de archivos local activando el diálogo de selección de archivos del navegador. Éste recupera el catálogo actual en TSO o identificador de unidad en CMS llamando getHostFileListing. Finalmente, se llama la función sendFile para suministrar al host el archivo local seleccionado. La macro se puede utilizar o bien en un entorno CMS, o bien en un entorno TSO, pero la elección se debe especificar en la primera línea. En este ejemplo, el método de transferencia está ajustado a ascii; si lo desea, puede cambiarlo a binario.

var hostEnvironment = 'CMS'; // 'TSO'
// Abre la función programada de diálogo de selección de archivos del navegador
function promptForFileToUpload () {
	return new Promise(function (resolve, reject) {
		// No se nos notifica si el usuario camcela el ciálogo selector de archivos, por tanto se rechaza después de 30 segundos
		var timerId = setTimeout(reject.bind(null, 'Tiempo de espera agotado esperando la selección del archivo'), 30000);
		var fileSelector = document.createElement('input');
		fileSelector.setAttribute('type', 'file');
		fileSelector.onchange = function (evt) {
			var file = evt.target.files[0];
			clearTimeout(timerId);
			resolve(file);
		};
		fileSelector.click();
	});
}

var macro = createMacro(function*() {
	'use strict';
	
	try {
		var fileTransfer = fileTransferFactory.getInd$File();
		
		// Las opciones de transferMethod son 'binario' y 'ascii'
		 fileTransfer.setTransferOptions({transferMethod: 'ascii'});
		 
		 var localFile = yield promptForFileToUpload();
		 
		 // Recuperar el catálogo actual y añadirle el nombre de archivo seleccionado
		 var hostFiles = yield fileTransfer.getHostFileListing();
		 var destination = hostFiles[0].getParent() + '/' + localFile.name;
		 
		 if (hostEnvironment === 'CMS') {
			yield wait.forText('Ready', new Position(1,1), 5000);
		}
		
		var result = yield fileTransfer.sendFile(localFile, destination);
		
	} catch (error) {
		yield ui.message(error);
	}
});

// Run the macro
return macro();