Skip to content

Commit f69ff53

Browse files
committed
Адаптация под библиотеку DotNetZip.Original
1 parent 9e92e78 commit f69ff53

File tree

7 files changed

+93
-6
lines changed

7 files changed

+93
-6
lines changed

src/OneScript.StandardLibrary/OneScript.StandardLibrary.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
</PropertyGroup>
2525

2626
<ItemGroup>
27-
<PackageReference Include="DotNetZip" Version="1.13.3" />
27+
<PackageReference Include="DotNetZip.Original" Version="2025.2.15" />
2828
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
2929
</ItemGroup>
3030

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*----------------------------------------------------------
2+
This Source Code Form is subject to the terms of the
3+
Mozilla Public License, v.2.0. If a copy of the MPL
4+
was not distributed with this file, You can obtain one
5+
at http://mozilla.org/MPL/2.0/.
6+
----------------------------------------------------------*/
7+
8+
using System;
9+
using System.Reflection;
10+
using System.Text;
11+
using Ionic.Zip;
12+
13+
namespace OneScript.StandardLibrary.Zip
14+
{
15+
internal static class DotNetZipEncoding
16+
{
17+
private static volatile bool _encodingIsSet;
18+
private static readonly object _locker = new object();
19+
20+
static DotNetZipEncoding()
21+
{
22+
_encodingIsSet = false;
23+
}
24+
25+
public static void SetDefault(Encoding encoding)
26+
{
27+
if (_encodingIsSet)
28+
return;
29+
30+
lock (_locker)
31+
{
32+
if (_encodingIsSet)
33+
return;
34+
35+
SetDefaultEncoding(encoding);
36+
_encodingIsSet = true;
37+
}
38+
}
39+
40+
private static void SetDefaultEncoding(Encoding encoding)
41+
{
42+
const string fieldName = "_defaultEncoding";
43+
44+
var field = typeof(ZipFile).GetField(fieldName, BindingFlags.Static | BindingFlags.NonPublic);
45+
if (field == null)
46+
throw new InvalidOperationException("Field for default encoding not found");
47+
48+
field.SetValue(null, encoding);
49+
50+
if (!Equals(ZipFile.DefaultEncoding, encoding))
51+
{
52+
throw new InvalidOperationException(
53+
"Field is set, but property DefaultEncoding hasn't changed. Probably another property implementation in library");
54+
}
55+
}
56+
}
57+
}

src/OneScript.StandardLibrary/Zip/ZipReader.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private void CheckIfOpened()
5252
public void Open(IValue filenameOrStream, string password = null, FileNamesEncodingInZipFile encoding = FileNamesEncodingInZipFile.Auto)
5353
{
5454
// fuck non-russian encodings on non-ascii files
55-
ZipFile.DefaultEncoding = Encoding.GetEncoding(866);
55+
DotNetZipEncoding.SetDefault(Encoding.GetEncoding(866));
5656

5757
if (filenameOrStream.SystemType == BasicTypes.String)
5858
{
@@ -104,6 +104,13 @@ public void ExtractAll(string where, ZipRestoreFilePathsMode restorePaths = defa
104104
public void Extract(ZipFileEntryContext entry, string destination, ZipRestoreFilePathsMode restorePaths = default, string password = null)
105105
{
106106
CheckIfOpened();
107+
if (entry == null)
108+
{
109+
// Передали Неопределено
110+
// TODO сделать более строгий маршалинг с учетом всех тыщ особенностей для строк и прочего
111+
throw RuntimeException.InvalidNthArgumentType(1);
112+
}
113+
107114
var realEntry = entry.GetZipEntry();
108115
_zip.FlattenFoldersOnExtract = restorePaths == ZipRestoreFilePathsMode.DontRestore;
109116
realEntry.Password = password;

src/OneScript.StandardLibrary/Zip/ZipWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void Open(
5252
ZipEncryptionMethod? encryptionMethod = default,
5353
FileNamesEncodingInZipFile encoding = FileNamesEncodingInZipFile.Auto)
5454
{
55-
ZipFile.DefaultEncoding = Encoding.GetEncoding(866); // fuck non-russian encodings on non-ascii files
55+
DotNetZipEncoding.SetDefault(Encoding.GetEncoding(866)); // fuck non-russian encodings on non-ascii files
5656
_filename = filename;
5757
_zip = new ZipFile();
5858
_zip.AlternateEncoding = Encoding.UTF8;

tests/zip/fixtures/testUTF8.zip

196 Bytes
Binary file not shown.

tests/zip.os renamed to tests/zip/test-zip.os

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
ВсеТесты.Добавить("ТестДолжен_ПроверитьПарольРусскиеБуквыФайловАрхива");
3232
ВсеТесты.Добавить("ТестДолжен_ПроверитьШифрованиеЗипАрхива");
3333

34+
//Отключен до исправления библиотеки
35+
// https://github.com/EvilBeaver/OneScript/issues/870
36+
//ВсеТесты.Добавить("ТестДолжен_ПроверитьСимволыЮникодаВИменахФайлов");
37+
3438
Возврат ВсеТесты;
3539

3640
КонецФункции
@@ -101,8 +105,8 @@
101105

102106
Попытка
103107
юТест.ПроверитьРавенство("", Чтение.Элементы[0].Путь);
104-
юТест.ПроверитьРавенство("zip.os", Чтение.Элементы[0].Имя);
105-
юТест.ПроверитьРавенство("zip", Чтение.Элементы[0].ИмяБезРасширения);
108+
юТест.ПроверитьРавенство("test-zip.os", Чтение.Элементы[0].Имя);
109+
юТест.ПроверитьРавенство("test-zip", Чтение.Элементы[0].ИмяБезРасширения);
106110
Исключение
107111
Чтение.Закрыть();
108112
ВызватьИсключение;
@@ -353,7 +357,7 @@
353357

354358
ИмяРусскогоФайла = "ОбщиеФункции.os";
355359

356-
ПутьРусскогоФайла = ОбъединитьПути(ФайлСкрипта.Путь, "testlib", ИмяРусскогоФайла);
360+
ПутьРусскогоФайла = ОбъединитьПути(ФайлСкрипта.Путь, "../testlib", ИмяРусскогоФайла);
357361

358362
ИмяАрхива = СоздатьВременныйФайл("zip");
359363
Архив = Новый ЗаписьZipФайла(ИмяАрхива);
@@ -702,3 +706,22 @@
702706
Файл = Новый Файл(НеверныйПутьФайла);
703707
юТест.ПроверитьЛожь(Файл.Существует(), СообщениеОшибки + НеверныйПутьФайла);
704708
КонецПроцедуры
709+
710+
// https://github.com/EvilBeaver/OneScript/issues/870
711+
Процедура ТестДолжен_ПроверитьСимволыЮникодаВИменахФайлов() Экспорт
712+
ФайлАрхива = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "testUTF8.zip");
713+
714+
ВременныйКаталог = СоздатьВременныйФайл();
715+
СоздатьКаталог(ВременныйКаталог);
716+
717+
ФайлZip = Новый ЧтениеZipФайла(ФайлАрхива);
718+
Попытка
719+
ФайлZip.ИзвлечьВсе(ВременныйКаталог);
720+
Исключение
721+
ФайлZip.Закрыть();
722+
ВызватьИсключение;
723+
КонецПопытки;
724+
725+
ФайлZip.Закрыть();
726+
727+
КонецПроцедуры
File renamed without changes.

0 commit comments

Comments
 (0)