cordova-file-handler.ts 3.33 KB
import { Util } from './../util';
import { EventEmitter } from 'events';
import { FileHandler } from '../api/file-handler';
import { File } from '../api/file';

export class CordovaFileHandler extends EventEmitter implements FileHandler  {

    triggerFileTransfer(source:string, target:string) {
        let fileTransfer = new window['FileTransfer']();

        fileTransfer.onprogress = (progress:ProgressEvent) => {
            this.emit('progress', progress.loaded / progress.total);
        };

        fileTransfer.download(
            source ,
            target ,
            (entry:any) => {
                this.emit('complete', entry);
            } ,
            (error:any) => {
                this.emit('error', error);
            },
            true
        );
    }

    download(source:string, target:string) {
        if (!window['FileTransfer']) {
            this.emit('error','Cordova FileTransfer object undefined');
        }

        window['resolveLocalFileSystemURL'](target, (entry:any) => {
            entry.getMetadata((metadata) => {
                if (metadata.size > 0) {
                    this.emit('complete', entry);
                } else {
                    // file empty trigger transfer
                    this.triggerFileTransfer(source,target);
                }
            }, () => {
                // cannot read metadata trigger transfer
                this.triggerFileTransfer(source,target);
            });
        }, () => {
            // file not found, so download it
            this.triggerFileTransfer(source,target);
        });

        return this;        
    }

    cleanup(files:Array<File>, basePath:string) : Promise<void> {
        let filesForCleanup = [];

        return new Promise<void>((resolve, reject) => {

            if (window['resolveLocalFileSystemURL']) {
                window['resolveLocalFileSystemURL'](basePath, (entry) => {
                    let reader = entry.createReader();
                    reader.readEntries((entries) => {

                        for (let e of entries) {
                            if (e && e.isFile) {
                                if (Util.getFileIndex(files, e.name) < 0) {
                                    filesForCleanup.push(e);
                                }
                            }
                        }
                    
                        let index = 0;
                        let error = false;

                        let cleanupError = (error) => {
                            this.emit('cleanup-error', error);
                            reject();
                            error = true;
                        };

                        let cleanupNext = () => {
                            if (index < filesForCleanup.length && !error) {
                                filesForCleanup[index].remove(cleanupNext, cleanupError);
                                index += 1;
                            } else if (!error) {                            
                                this.emit('cleanup-complete', filesForCleanup);
                                resolve();
                            }
                        };
                        
                        cleanupNext();

                    }, (error) => { this.emit('cleanup-error', error); reject(); });
                });
            }

        });
    }

}