Untitled

 avatar
unknown
plain_text
10 months ago
3.0 kB
6
Indexable
// working
import 'dart:io';
import 'dart:isolate';
import 'package:archive/archive.dart';
import 'package:flutter/services.dart';
import 'package:flutter_isolate/flutter_isolate.dart';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;

class ZipFileService {
  static final ZipFileService _zipService = ZipFileService._internal();
  static ZipFileService get instance => _zipService;
  ZipFileService._internal();

  Future<void> initZIP() async {
    Directory documentsDirectory = await getApplicationSupportDirectory();
    String dbpath = p.join(
        documentsDirectory.path, 'gurbani_database.sqlite/database.sqlite');
    bool exists = await File(dbpath).exists();

    if (!exists) {
      print('kuch nahi hai bhag yaha se firse kar');
      List<int> zipData = await downloadZipFile();
      await decompressAndLoadDatabaseNew(zipData);
      await deleteZipFile();
    }
  }

  Future<List<int>> downloadZipFile() async {
    String zipUrl = '';
    http.Response response = await http.get(Uri.parse(zipUrl));

    if (response.statusCode == 200) {
      print('ZIP file downloaded successfully');
      //  print('Temporary directory: ${response.request?.url?.path}');
      return response.bodyBytes;
    } else {
      throw Exception('Failed to download ZIP file');
    }
  }

  Future<void> deleteZipFile() async {
    Directory documentsDirectory = await getApplicationSupportDirectory();
    String zipFilePath = p.join(documentsDirectory.path, 'database.zip');
    File zipFile = File(zipFilePath);
    if (await zipFile.exists()) {
      await zipFile.delete();
      print('ZIP file deleted successfully');
    }
  }

  @pragma('vm:entry-point')
  static Future<void> decompressAndLoadDatabaseNew(List<int> zipData) async {
    ReceivePort receivePort = ReceivePort();
    FlutterIsolate isolate = await FlutterIsolate.spawn(
      _decompressDatabaseNew,
      {"sendPort": receivePort.sendPort, "zipData": zipData},
    );

    await for (var msg in receivePort) {
      if (msg == 1) {
        isolate.kill();
        receivePort.close();
        break;
      }
    }
  }

  @pragma('vm:entry-point')
  static Future<void> _decompressDatabaseNew(Map<String, dynamic> args) async {
    final SendPort sendPort = args['sendPort'];
    final List<int> zipData = args['zipData'];

    Archive archive = ZipDecoder().decodeBytes(zipData);
    Directory documentsDirectory = await getApplicationSupportDirectory();
    String path = "${documentsDirectory.path}/gurbani_database.sqlite";
    for (ArchiveFile archiveFile in archive) {
      String fileName = archiveFile.name;
      List<int> data = archiveFile.content;
      File outFile = File("$path/$fileName");
      outFile = await outFile.create(recursive: true);
      await outFile.writeAsBytes(data, flush: true);
    }
    sendPort.send(1); // Finished decompression
  }
}
Editor is loading...
Leave a Comment