Testen aufm App5

This commit is contained in:
rene
2022-12-14 12:08:20 +01:00
parent c0c6a96f84
commit 34b8e42e3c
23 changed files with 204 additions and 95 deletions

View File

@@ -540,7 +540,7 @@ namespace BeWo
String url = ServerAddress?.ToLower();
#if DEBUG
url = String.Format("http://localhost:3777/Host");
//url = String.Format("http://localhost:3777/Host");
//return new Uri("https://app4.bewoplaner.de/service");
//url = String.Format("app1.bewoplaner.de/service");
#endif
@@ -774,16 +774,32 @@ namespace BeWo
{
using (StreamReader sr = new StreamReader(pipeClient))
{
string temp = string.Empty;
string temp;
List<string> result = new List<string>();
var signal = new string[] { "C-137", "C-131"};
while (!temp.StartsWith("C-137"))
// Warte auf Start
do
{
temp = sr.ReadLine();
}
while (!temp.StartsWith(signal[0]));
temp = sr.ReadLine();
result.Add(sr.ReadLine());
result.Add(sr.ReadLine());
result.Add(sr.ReadLine());
result.Add(sr.ReadLine());
result.Add(sr.ReadLine());
result.Add(sr.ReadLine());
result.Add(sr.ReadLine());
Loader.Load(temp);
do
{
temp = sr.ReadLine();
}
while (!temp.StartsWith(signal[1]));
Loader.Load(result.ToArray());
//if (System.Windows.Forms.MessageBox.Show(temp, "(OK to copy)", System.Windows.Forms.MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
//{ Clipboard.SetText(temp); }

View File

@@ -28,6 +28,9 @@ namespace BeWo
BeWoApp.ShortVersion = version;
BeWoApp.Version = "Version " + version;
// var t = MessageBox.Show(BeWoApp.ServerAddress);
// var t1 = MessageBox.Show(BeWoApp.SiteOfOrigin.ToString());
BeWoApp.LoggedOnUser = ServiceFacade.DoUserServiceSync(s => s.LoadUserByNameAndPassword(BeWoApp.UserName, BeWoApp.UserPassword));
BeWoApp.Mandator = ServiceFacade.DoOperationsServiceSync(s => s.GetMandator());
@@ -37,7 +40,7 @@ namespace BeWo
public static void Load(Connection connection)
=> Load(connection.Username, connection.Password, connection.Servername, connection.Tenant, connection.CoreServerAddress, connection.Version);
public static void Load(string rawInput)
public static void Load(string[] rawInput)
=> Load(Connection.Parse(rawInput));
}
}

View File

@@ -25,7 +25,7 @@ namespace BeWo
if (Loader.Loaded)
ShowNewWay();
else
ShowOldWay(true);
ShowOldWay(false);
}
private void ShowNewWay()
@@ -47,8 +47,11 @@ namespace BeWo
{
if (skiplogin)
{
Loader.Load("tedemo?undemo?pwdemo?ip?sn1?cs?vr1.0.4.1");
ShowNewWay();
throw new NotImplementedException("47845978233134");
// Muss hier ggf string anpassen
//Loader.Load("tedemo?undemo?pwdemo?ip?sn1?cs?vr1.0.4.1");
//ShowNewWay();
}
else
{

View File

@@ -38,7 +38,6 @@ namespace BeWo.ServiceProxy
public static void UpdateServerAddresses(String siteOfOrigin)
{
String serverName = siteOfOrigin;
var test = serverName.Substring(serverName.Length - 1, 1);
if (serverName.Substring(serverName.Length - 1, 1) != "/")

View File

@@ -8,17 +8,17 @@
<basicHttpBinding>
<binding name="BeWoBasicEndpoint" closeTimeout="00:05:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true" messageEncoding="Text">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="None"/>
<security mode="Transport"/>
<!-- mode="Transport" für echten Server und "None" sonst-->
</binding>
<binding name="BeWoStreamingEndpoint" receiveTimeout="10:10:00" sendTimeout="10:01:00" maxBufferSize="65536" maxReceivedMessageSize="67108864" transferMode="StreamedRequest" useDefaultWebProxy="true" messageEncoding="Text">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="None"/>
<security mode="Transport"/>
<!-- mode="Transport" für echten Server -->
</binding>
<binding name="QueryServiceEndpoint" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true" messageEncoding="Text">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="None">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>

View File

@@ -13,7 +13,7 @@
<basicHttpBinding>
<binding name="BeWoBasicEndpoint" closeTimeout="00:05:00" openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:05:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true" messageEncoding="Text">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None" />
<security mode="Transport" />
<!-- mode="Transport" für echten Server und "None" sonst-->
</binding>
</basicHttpBinding>

View File

@@ -7,7 +7,7 @@
xmlns:local="clr-namespace:BeWoLauncher"
mc:Ignorable="d"
Title="BeWoLauncher" Height="1080" Width="1920" WindowStartupLocation="CenterScreen" WindowState="Maximized" BorderThickness="1" Closing="MainWindow_OnClosing"
Background="{StaticResource LoginBackground}">
Background="{StaticResource LoginBackground}" KeyDown="Window_KeyDown" KeyUp="Window_KeyUp">
<Grid x:Name="rootGrid2" Margin="0,0,0,0">
<Grid x:Name="rootGrid" SizeChanged="RootGrid_SizeChanged" Margin="0,0,0,0">
</Grid>

View File

@@ -136,5 +136,21 @@ namespace BeWoLauncher
rootGrid.Children.Clear();
rootGrid.Children.Add(main);
}
private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Delete)
{
ViewController.LaunchBehavior.UninstallMode = true;
}
}
private void Window_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Delete)
{
ViewController.LaunchBehavior.UninstallMode = false;
}
}
}
}

View File

@@ -1,19 +1,14 @@
using BeWoLauncher.Logic.Controller;
using BeWoLauncher.Logic.Utils;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
using static BeWoLauncher.Logic.Controller.ViewController;
namespace BeWoLauncher.Logic.Behavior
{
public class LaunchBehavior
{
public bool UninstallMode { get; set; }
public LaunchBehavior()
{
@@ -46,22 +41,25 @@ namespace BeWoLauncher.Logic.Behavior
}
else
{
Task.Run(() =>
{
DownloadController.Start();
DownloadController.Manager.StartDownloadInfo();
if (DownloadController.Manager.ResponseInfo.HasSomethingToDo)
if (UninstallMode)
ViewBehavior.ShowUninstallInfo();
else
Task.Run(() =>
{
ViewBehavior.ShowInfo();
}
else
{
ViewBehavior.ShowLoading();
}
DownloadController.Start();
DownloadController.Manager.StartDownloadInfo();
EndWaiting();
});
if (DownloadController.Manager.ResponseInfo.HasSomethingToDo)
{
ViewBehavior.ShowInfo();
}
else
{
ViewBehavior.ShowLoading();
}
EndWaiting();
});
}
}

View File

@@ -77,6 +77,14 @@ namespace BeWoLauncher.Logic.Behavior
}));
}
public void ShowUninstallInfo()
{
ViewController.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
ShowFrame(FrameType.UninstallInfo);
}));
}
public void ShowLoading()
{
ViewController.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>

View File

@@ -85,8 +85,14 @@ namespace BeWoLauncher.Logic.Controller
sw.WriteLine("C-137");
pipeServer.WaitForPipeDrain();
foreach (var info in ConnectionInformation.Connection.ToArray())
{
sw.WriteLine(info);
pipeServer.WaitForPipeDrain();
}
sw.WriteLine(ConnectionInformation.Connection.ToString());
sw.WriteLine("C-131");
pipeServer.WaitForPipeDrain();
}
}

View File

@@ -154,6 +154,7 @@ namespace BeWoLauncher.Logic.Utils.Download
}
private void GetDownloadResponseInfo()
{
var t = ConnectionInformation.Tenant;
ResponseInfo = LauncherServiceFacade.DoDownloadBeWoServiceSync(x => x.DownloadInfo(Request));
}
}

View File

@@ -129,7 +129,7 @@ namespace BeWoLauncher.Logic
{
var uninstall = new UninstallInfoFrame();
uninstall.Accept += ViewBehavior.UpdateStarting;
uninstall.Accept += ViewBehavior.UninstallStarting;
uninstall.Abort += ViewBehavior.BackToLogin;
return uninstall;

View File

@@ -18,7 +18,7 @@
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Grid.RenderTransform>
<Border CornerRadius="7,7,7,7" BorderThickness="2,2,2,2" Padding="5,5,5,5" BorderBrush="#FF606060" Background="{DynamicResource LoginBackgroundColor}" KeyDown="UIElement_OnKeyDown">
<Border CornerRadius="7,7,7,7" BorderThickness="2,2,2,2" Padding="5,5,5,5" BorderBrush="#FF606060" Background="{DynamicResource LoginBackgroundColor}" KeyDown="UIElement_OnKeyDown" >
<Grid Opacity="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />

View File

@@ -37,7 +37,12 @@ namespace BeWoLauncher.View
public event EventHandler LoginSuccessful;
public event PropertyChangedEventHandler PropertyChanged;
private static String PUB_KEY = "3082010A02820101009CD30CF05AE52E47B7725D3783B3686330EAD735261925E1BDBE35F170922FB7B84B4105ABA99E350858ECB12AC468870BA3E375E4E6F3A76271BA7981601FD7919A9FF3D0786771C8690E9591CFFEE699E9603C48CC7ECA4D7712249D471B5AEBB9EC1E37001C9CAC7BA705EACE4AEBBD41E53698B9CBFD6D3C9668DF232A42900C867467C87FA59AB8526114133F65E98287CBDBFA0E56F68689F3853F9786AFB0DC1AEF6B0D95167DC42BA065B299043675806BAC4AF31B9049782FA2964F2A20252904C674C0D031CD8F31389516BAA833B843F1B11FC3307FA27931133D2D36F8E3FCF2336AB93931C5AFC48D0D1D641633AAFA8429B6D40BC0D87DC3930203010001";
private static String PUB_KEY_X3 = "3082010A02820101009CD30CF05AE52E47B7725D3783B3686330EAD735261925E1BDBE35F170922FB7B84B4105ABA99E350858ECB12AC468870BA3E375E4E6F3A76271BA7981601FD7919A9FF3D0786771C8690E9591CFFEE699E9603C48CC7ECA4D7712249D471B5AEBB9EC1E37001C9CAC7BA705EACE4AEBBD41E53698B9CBFD6D3C9668DF232A42900C867467C87FA59AB8526114133F65E98287CBDBFA0E56F68689F3853F9786AFB0DC1AEF6B0D95167DC42BA065B299043675806BAC4AF31B9049782FA2964F2A20252904C674C0D031CD8F31389516BAA833B843F1B11FC3307FA27931133D2D36F8E3FCF2336AB93931C5AFC48D0D1D641633AAFA8429B6D40BC0D87DC3930203010001";
private static String PUB_KEY_R3 = "3082010A0282010100BB021528CCF6A094D30F12EC8D5592C3F882F199A67A4288A75D26AAB52BB9C54CB1AF8E6BF975C8A3D70F4794145535578C9EA8A23919F5823C42A94E6EF53BC32EDB8DC0B05CF35938E7EDCF69F05A0B1BBEC094242587FA3771B313E71CACE19BEFDBE43B45524596A9C153CE34C852EEB5AEED8FDE6070E2A554ABB66D0E97A540346B2BD3BC66EB66347CFA6B8B8F572999F830175DBA726FFB81C5ADD286583D17C7E709BBF12BF786DCC1DA715DD446E3CCAD25C188BC60677566B3F118F7A25CE653FF3A88B647A5FF1318EA9809773F9D53F9CF01E5F5A6701714AF63A4FF99B3939DDC53A706FE48851DA169AE2575BB13CC5203F5ED51A18BDB150203010001";
private static String PUB_KEY_E1 = "04245C2DA22AFD1C4BA65D97732731ACB2A06962EF65E8A6B0F0AC4B9FFF1C0B700FD3982F4DFC0F009B37F074055732972E05EF2A4325A3FB6E342713F64F7E69D302995EEB244792C1249BE6B1218FC12481FC68CC1F69BA58F51922F774C616";
private readonly Stack<Control> _ModalPopUpControls;
@@ -55,12 +60,13 @@ namespace BeWoLauncher.View
private string GETSERVER_URL = "https://support.bewoplaner.de/api/getserver.php?k={0}&t=1";
private string GETSTATUSMESSAGE_URL = "https://support.bewoplaner.de/api/getstate.php?k={0}&t=1&v={1}";
private string GETNETMESSAGE_URL = "https://support.bewoplaner.de/api/getxmlstate.php?k={0}&t=1";
public LoginView()
{
InitializeComponent();
_ModalPopUpControls = new Stack<Control>();
ViewController.LaunchBehavior.UninstallMode = false;
DoTooMuchInitStuffIDontHaveANameForThisMethod();
}
@@ -250,6 +256,7 @@ namespace BeWoLauncher.View
pwvViewOffen = true;
}
private void UIElement_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.P)
@@ -260,6 +267,7 @@ namespace BeWoLauncher.View
}
}
}
private void AnimationComplete(object sender, EventArgs e)
{
double tmp = HeightFrom;
@@ -418,7 +426,7 @@ namespace BeWoLauncher.View
if (ProfileList.Count > 0)
{
#if DEBUG
//selectedProfile = ReadSelectedProfile();
selectedProfile = ReadSelectedProfile();
#else
selectedProfile = ReadSelectedProfile();
#endif
@@ -493,12 +501,9 @@ namespace BeWoLauncher.View
return new ConnectionProfile(pData[0], pData[1], pData[2]);
}
}
}
}
}
}
}
}
@@ -547,21 +552,20 @@ namespace BeWoLauncher.View
{
try
{
if (null == certificate || chain == null)
if (certificate == null || chain == null)
return false;
;
bool chainContainsPk = false;
foreach (var element in chain.ChainElements)
{
String pk = element.Certificate.GetPublicKeyString();
if (pk == PUB_KEY)
if (pk == PUB_KEY_X3 || pk == PUB_KEY_R3 || pk == PUB_KEY_E1)
{
chainContainsPk = true;
}
}
//bool subjectAccepted = Regex.IsMatch(certificate.Subject, @"app[\d]*.bewoplaner.de");
bool subjectAccepted = certificate.Subject.Trim().ToLower().EndsWith(".bewoplaner.de") ||
certificate.Subject.Trim().ToLower().EndsWith(".ownchat.de");
return chainContainsPk && subjectAccepted;
@@ -1150,7 +1154,7 @@ namespace BeWoLauncher.View
var t = s.IsUserValid(tempUsername, lPassword, lPIN, "BeWoClient", true);
return t;
}
catch (Exception)
catch (Exception e)
{
return UserValidationResult.UnknownError;
}
@@ -1161,7 +1165,7 @@ namespace BeWoLauncher.View
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate { LoginResult(r, lUserName, lPassword, lPIN); });
}, true);
}
catch (Exception)
catch (Exception e)
{
result = UserValidationResult.UnknownError;
}

View File

@@ -94,7 +94,7 @@
</services>
</system.serviceModel>
<appSettings>
<add key="UpdateRootPath" value="d:\Projects\BeWoPlaner\BeWo\BeWo\bin\Debug" />
<add key="LogFolderPath" value="D:\Rene\ServerBeWoDataExample2\log" />
<add key="DownloadFolderPath" value="D:\Rene\ServerBeWoDataExample2" />
<add key="DownloadVersionFilePath" value="D:\Rene\ServerBeWoDataExample2\version\update.config" />
</appSettings>

View File

@@ -477,6 +477,7 @@
<Compile Include="ServiceImplementations\ValueListServiceImp.cs" />
<Compile Include="Configuration\AppSettings.cs" />
<Compile Include="ServiceUtils\Paths\ServerFilePaths.cs" />
<Compile Include="ServiceUtils\Update\DownloadLogger.cs" />
<Compile Include="ServiceUtils\Update\UpdateConfigReader.cs" />
<Compile Include="ServiceUtils\Update\DownloadPlanerResponseBuilder.cs" />
<Compile Include="UnitOfWork\HibernateSessionEndpointBehavior.cs" />

View File

@@ -29,27 +29,11 @@ namespace BeWo.Service.ServiceUtils.Paths
private static string _DownloadVersionFilePath;
private static string _DownloadFolderPath;
private static string _LogFolderPath;
public static string DownloadVersionFilePath
{
get {
if(_DownloadVersionFilePath is null)
_DownloadVersionFilePath = ConfigurationManager.AppSettings.Get("DownloadVersionFilePath");
return _DownloadVersionFilePath;
}
}
public static string DownloadFolderPath
{
get
{
if (_DownloadFolderPath is null)
_DownloadFolderPath = ConfigurationManager.AppSettings.Get("DownloadFolderPath");
return _DownloadFolderPath;
}
}
public static string DownloadVersionFilePath => GetAppSettings(_DownloadVersionFilePath, "DownloadVersionFilePath");
public static string DownloadFolderPath => GetAppSettings(_DownloadVersionFilePath, "DownloadVersionFilePath");
public static string LogFolderPath => GetAppSettings(_LogFolderPath, "LogFolderPath");
static ServerFilePaths()
{
@@ -65,6 +49,15 @@ namespace BeWo.Service.ServiceUtils.Paths
public static string GetVersionDefaultFolderPath(string version) => GetVersionTenantFolderPath(version, "default");
public static string GetVersionConfigFilePath() => DownloadVersionFilePath;
//ConfigurationManager.AppSettings.Get("UpdateRootPath");
public static string GetLogFolderPath(string tenant) => Path.Combine(LogFolderPath, tenant);
public static string GetAppSettings(string name, string setting)
{
if (name is null)
name = ConfigurationManager.AppSettings.Get(setting);
return name;
}
}
}

View File

@@ -0,0 +1,23 @@
using BeWo.Data;
using BeWo.Service.ServiceUtils.Paths;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceUtils.Update
{
public static class DownloadLogger
{
//public static string Tenant => MultitenancyOperationContextExt.Current.Tenant;
//public static string Folder => ServerFilePaths.GetLogFolderPath(Tenant);
//static DownloadLogger()
//{
// _Started = true;
//}
//public static string
}
}

View File

@@ -109,7 +109,7 @@ namespace BeWo.Service.ServiceUtils.Update
if (currentUpdatePackageInfo is object)
{
res.NewZipData = ZipArchiveBuilder.CreateZipInMemory(currentUpdatePackageInfo.Files,
res.NewZipData = ZipArchiveBuilder.CreateZipArray(currentUpdatePackageInfo.Files,
(file) => file.AbsolutePath, (file) => file.RelativePath);
res.NewZipInfo = currentUpdatePackageInfo.ToPlanerPackageInfoDC();
}

View File

@@ -15,7 +15,7 @@ namespace BS.SharedLauncher.Information
private static readonly string dotbewoinfo = ".bewoinfo";
private static readonly string latestFileName = "latest";
private static readonly string subdir = "BeWoPlaner";
private static readonly string testForPermission = "bewo.permission";
private static readonly string testForPermission = "bewo.permission.test";
public static string LockFileName => lockFileName;
public static string ZipFormatName => zipName;

View File

@@ -8,6 +8,8 @@ namespace BS.SharedLauncher.Information
{
public class Connection
{
private const char trennzeichen = '\t';
public string Tenant { get; set; }
public string Username { get; set; }
public string Password { get; set; }
@@ -23,43 +25,62 @@ namespace BS.SharedLauncher.Information
public string ChatServerAddress { get; set; }
public string Version { get; set; }
public static Connection Parse(string input)
public static Connection Parse(string[] data)
{
var connection = new Connection();
var data = input.Split('?').Select(x => x.Length > 2 ? x.Substring(2) : string.Empty).ToArray();
connection.Tenant = data[0];
connection.Username = data[1];
connection.Password = data[2];
connection.IpAddress = data[3];
connection.Servername = data[4];
connection.CoreServerAddress = data[4];
connection.ChatServerAddress = data[5];
connection.Version = data[6];
return connection;
}
public static bool TryParse(string input, out Connection connection)
public string[] ToArray()
{
connection = new Connection();
try
{
connection = Parse(input);
return true;
}
catch (Exception)
{
return false;
}
return new string[] { Tenant, Username, Password, IpAddress, "5", ChatServerAddress, Version };
}
//public static bool TryParse(string input, out Connection connection)
//{
// connection = new Connection();
// try
// {
// connection = Parse(input);
// return true;
// }
// catch (Exception)
// {
// return false;
// }
//}
//public static bool TryParse(string input, out Connection connection)
//{
// connection = new Connection();
// try
// {
// connection = Parse(input);
// return true;
// }
// catch (Exception)
// {
// return false;
// }
//}
public override string ToString()
{
return
$"te{Tenant}?un{Username}?pw{Password}?ip{IpAddress}?sn{Servername}?cs{ChatServerAddress}?vr{Version}";
return
$"te{Tenant}{trennzeichen}un{Username}{trennzeichen}pw{Password}{trennzeichen}ip{IpAddress}{trennzeichen}sn{Servername}{trennzeichen}cs{ChatServerAddress}{trennzeichen}vr{Version}";
}
}

View File

@@ -11,8 +11,25 @@ namespace BS.SharedLauncher.Logic
{
public static class ZipArchiveBuilder
{
public static byte[] CreateZipInMemory<T>(List<T> files, Func<T, string> path, Func<T, string> zipentryname)
public static MemoryStream CreateZipStream<T>(List<T> files, Func<T, string> path, Func<T, string> zipentryname)
//(PlanerPackageInfo root)
{
using (var memoryStream = new MemoryStream())
{
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (var file in files)
{
var archiveentry = archive.CreateEntryFromFile(path(file), zipentryname(file));
}
}
return memoryStream;
}
}
public static byte[] CreateZipArray<T>(List<T> files, Func<T, string> path, Func<T, string> zipentryname)
//(PlanerPackageInfo root)
{
byte[] res = null;