frogsoftware пре 10 месеци
родитељ
комит
b5a396a169

+ 18 - 0
prs.desktop/Utils/LogikalUtils/Classes/LogikalElevation.cs

@@ -0,0 +1,18 @@
+using System;
+using InABox.Core;
+using InABox.Logikal;
+
+namespace PRSDesktop;
+
+public class LogikalElevation : BaseObject, ILogikalElevation
+{
+    public Guid ID { get; set; }
+    public string Name { get; set; }
+        
+    public string Phase { get; set; }
+
+    public byte[] Thumbnail { get; set; }
+    public byte[] Drawing { get; set; }
+        
+    public ILogikalPart[] Parts { get; set; }
+}

+ 9 - 0
prs.desktop/Utils/LogikalUtils/Classes/LogikalPart.cs

@@ -0,0 +1,9 @@
+using InABox.Core;
+using InABox.Logikal;
+
+namespace PRSDesktop;
+
+public class LogikalPart : BaseObject, ILogikalPart
+{
+        
+}

+ 18 - 0
prs.desktop/Utils/LogikalUtils/Classes/LogikalProject.cs

@@ -0,0 +1,18 @@
+using System;
+using InABox.Core;
+using InABox.Logikal;
+
+namespace PRSDesktop;
+
+public class LogikalProject : BaseObject, ILogikalProject
+{
+    public Guid ID { get; set; }
+        
+    public string Name { get; set; }
+        
+    public string PersonInCharge { get; set; }
+        
+    public string Path { get; set; }
+
+    public ILogikalElevation[] Elevations { get; set; }
+}

+ 53 - 27
prs.desktop/Utils/LogikalUtils/LogikalClient.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Concurrent;
+using System.Collections.Generic;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
@@ -16,7 +17,7 @@ using Process = System.Diagnostics.Process;
 
 namespace PRSDesktop;
 
-public class LogikalClient : IDisposable, ILogikalApp
+public class LogikalClient : IDisposable
 {
 
     private readonly PipeClient<LogikalMessage> _client;
@@ -25,23 +26,22 @@ public class LogikalClient : IDisposable, ILogikalApp
     private ConcurrentDictionary<Guid, LogikalMessage> Responses = new();
 
     private const int DefaultRequestTimeout = 5 * 60 * 1000; // 5 minutes
-
     
+    private LogikalSettings _settings;
     
     public LogikalClient()
     {
         
-    //      private LogikalSettings _settings;
-    //     _settings = Client
-    //         .Query(
-    //             new Filter<LogikalSettings>().All(),
-    //             Columns.All<LogikalSettings>(),
-    //             null,
-    //             CoreRange.Database(1)
-    //         )
-    //         .ToObjects<LogikalSettings>()
-    //         .FirstOrDefault()
-    //     ?? new LogikalSettings();
+        _settings = Client
+            .Query(
+                new Filter<LogikalSettings>().All(),
+                Columns.All<LogikalSettings>(),
+                null,
+                CoreRange.Database(1)
+            )
+            .ToObjects<LogikalSettings>()
+            .FirstOrDefault()
+        ?? new LogikalSettings();
         
         var _basedirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) ?? "";
         var _logikalapp = System.IO.Path.Combine(_basedirectory, "PRSLogikal", "PRSLogikal.exe");
@@ -146,32 +146,58 @@ public class LogikalClient : IDisposable, ILogikalApp
         Dispose();
     }
 
-    public LogikalStatus Connect(string path)
+    public LogikalStatus Connect()
     {
-        var request = new LogikalConnectRequest() { Path = path };
-        var result = Send(request);
-        return result.Status;
+        var _request = new LogikalConnectRequest()
+        {
+            Path = _settings.Path
+        };
+        var _result = Send(_request);
+        return _result.Status;
 
     }
 
     public LogikalStatus Disconnect()
     {
-        var request = new LogikalDisconnectRequest();
-        var result = Send(request);
-        return result.Status;
+        var _request = new LogikalDisconnectRequest();
+        var _result = Send(_request);
+        return _result.Status;
     }
 
-    public LogikalStatus Login(string username, string password)
+    public LogikalStatus Login()
     {
-        var request = new LogikalLoginRequest() { UserID = username, Password = password };
-        var result = Send(request);
-        return result.Status;
+        var _request = new LogikalLoginRequest() { UserID = _settings.UserID, Password = _settings.Password };
+        var _result = Send(_request);
+        return _result.Status;
     }
 
     public LogikalStatus Logout()
     {
-        var request = new LogikalLogoutRequest();
-        var result = Send(request);
-        return result.Status;
+        var _request = new LogikalLogoutRequest();
+        var _result = Send(_request);
+        return _result.Status;
+    }
+    
+    public IEnumerable<ILogikalProject>? ProjectList()
+    {
+        var _request = new LogikalProjectsRequest();
+        var _result = Send(_request) as LogikalProjectsResponse;
+        return _result?.Projects;
+    }
+        
+    public ILogikalProject? GetProject()
+    {
+        var _request = new LogikalProjectsRequest();
+        var _result = Send(_request) as LogikalProjectResponse;
+        return _result?.Project;
     }
+    
+    public ILogikalElevation? GetElevation()
+    {
+        var _request = new LogikalElevationRequest();
+        var _result = Send(_request) as LogikalElevationResponse;
+        return _result?.Elevation;
+    }
+    
+    
 }

+ 18 - 0
prs.logikal/Classes/LogikalElevation.cs

@@ -0,0 +1,18 @@
+using System;
+using InABox.Logikal;
+
+namespace PRSLogikal
+{
+    internal class LogikalElevation : ILogikalElevation
+    {
+        public Guid ID { get; set; }
+        public string Name { get; set; }
+        
+        public string Phase { get; set; }
+
+        public byte[] Thumbnail { get; set; }
+        public byte[] Drawing { get; set; }
+        
+        public ILogikalPart[] Parts { get; set; }
+    }
+}

+ 10 - 0
prs.logikal/Classes/LogikalPart.cs

@@ -0,0 +1,10 @@
+using InABox.Logikal;
+
+namespace PRSLogikal
+{
+    internal class LogikalPart : ILogikalPart
+    {
+        
+    }
+
+}

+ 20 - 0
prs.logikal/Classes/LogikalProject.cs

@@ -0,0 +1,20 @@
+using System;
+using InABox.Logikal;
+
+namespace PRSLogikal
+{
+    public class LogikalProject : ILogikalProject
+    {
+        public Guid ID { get; set; }
+        
+        public string Name { get; set; }
+        
+        public string PersonInCharge { get; set; }
+        
+        public string Path { get; set; }
+
+        public ILogikalElevation[] Elevations { get; set; }
+    }
+
+    
+}

+ 86 - 14
prs.logikal/LogikalListener.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Linq;
 using H.Formatters;
 using H.Pipes;
 using InABox.Logikal;
@@ -12,6 +13,9 @@ namespace PRSLogikal
         public LogikalServer Server { get; set; }
 
         public event LogikalLogEvent Log;
+
+        private void DoLog(string message) => Log?.Invoke(this, new LogikalLogArguments(message));
+        
         
         public event EventHandler Disconnecting; 
         
@@ -19,39 +23,45 @@ namespace PRSLogikal
         {
             _server = new PipeServer<LogikalMessage>("$logikal", formatter: new NewtonsoftJsonFormatter());
             
-            _server.ClientConnected += async (o, args) =>
+            _server.ClientConnected += (o, args) =>
             {
-                Log?.Invoke(this, new LogikalLogArguments($@"Client {args.Connection.PipeName} is now connected!"));
+                DoLog($@"Client {args.Connection.PipeName} is now connected!");
             };
             
             _server.ClientDisconnected += (o, args) =>
             {
-                Log?.Invoke(this, new LogikalLogArguments($@"Client {args.Connection.PipeName} disconnected"));
+                DoLog($@"Client {args.Connection.PipeName} disconnected");
             };
             
             _server.MessageReceived += (sender, args) =>
             {
-                Log?.Invoke(this, new LogikalLogArguments($@"Client {args.Connection.PipeName} says: {args.Message.Method}: {args.Message.Payload}"));
+                DoLog($@"Client {args.Connection.PipeName} says: {args.Message.Method}: {args.Message.Payload}");
                 var _request = LogikalRequest.FromMessage(args.Message);
                 
                 if (_request is LogikalConnectRequest _connectrequest)
                     Connect(_connectrequest);
-                if (_request is LogikalLoginRequest _loginrequest)
+                else if (_request is LogikalLoginRequest _loginrequest)
                     Login(_loginrequest);
-                if (_request is LogikalLogoutRequest _logoutrequest)
-                    Logout(_logoutrequest);
-                if (_request is LogikalDisconnectRequest _disconnectrequest)
-                    Disconnect(_disconnectrequest);
+                else if (_request is LogikalProjectsRequest _projectsrequest)
+                    ProjectList(_projectsrequest);
+                else if (_request is LogikalProjectRequest _projectrequest)
+                    ProjectDetails(_projectrequest);
+                else if (_request is LogikalElevationRequest _elevationrequest)
+                    ElevationDetails(_elevationrequest);
+                else if (_request is LogikalLogoutRequest)
+                    Logout();
+                else if (_request is LogikalDisconnectRequest)
+                    Disconnect();
                 
             };
             
             _server.ExceptionOccurred += (sender, args) =>
             {
-                Log?.Invoke(this, new LogikalLogArguments($@"Exception: {args.Exception.Message}"));
+                DoLog($@"Exception: {args.Exception.Message}");
             };
 
         }
-
+        
         public void Start() => _server.StartAsync();
 
         public void Stop() => _server.StopAsync();
@@ -65,7 +75,7 @@ namespace PRSLogikal
             _server.WriteAsync(_response.ToMessage());
         }
         
-        private void Disconnect(LogikalDisconnectRequest request)
+        private void Disconnect()
         {
             var _response = new LogikalDisconnectResponse()
             {
@@ -85,7 +95,7 @@ namespace PRSLogikal
             _server.WriteAsync(_response.ToMessage());
         }
         
-        private void Logout(LogikalLogoutRequest request)
+        private void Logout()
         {
             var _response = new LogikalLogoutResponse()
             {
@@ -93,7 +103,69 @@ namespace PRSLogikal
             };
             _server.WriteAsync(_response.ToMessage());
         }
-
+        
+        private void ProjectList(LogikalProjectsRequest request)
+        {
+            var _response = new LogikalProjectsResponse();
+            try
+            {
+                if (Server.IsLoggedIn())
+                {
+                    _response.Projects = Server.GetProjects().ToArray();
+                    _response.Status = LogikalStatus.Ok;
+                }
+                else
+                    _response.Status = LogikalStatus.Failed;
+            }
+            catch (Exception e)
+            {
+                DoLog($"ProjectList: e.Message");
+                _response.Status = LogikalStatus.Error;
+            }
+            _server.WriteAsync(_response.ToMessage());
+        }
+        
+        private void ProjectDetails(LogikalProjectRequest request)
+        {
+            var _response = new LogikalProjectResponse();
+            try
+            {
+                if (Server.IsLoggedIn())
+                {
+                    _response.Project = Server.GetProject(request.ID);
+                    _response.Status = LogikalStatus.Ok;
+                }
+                else
+                    _response.Status = LogikalStatus.Failed;
+            }
+            catch (Exception e)
+            {
+                DoLog($"ProjectList: e.Message");
+                _response.Status = LogikalStatus.Error;
+            }
+            _server.WriteAsync(_response.ToMessage());
+        }
+        
+        private void ElevationDetails(LogikalElevationRequest elevationdetailsrequest)
+        {
+            var _response = new LogikalElevationResponse();
+            try
+            {
+                if (Server.IsLoggedIn())
+                {
+                    _response.Elevation = Server.GetElevation(elevationdetailsrequest.ID);
+                    _response.Status = LogikalStatus.Ok;
+                }
+                else
+                    _response.Status = LogikalStatus.Failed;
+            }
+            catch (Exception e)
+            {
+                _response.Status = LogikalStatus.Error;
+            }
+            _server.WriteAsync(_response.ToMessage());
+        }
+        
         public void Dispose()
         {
             if (_server != null)

+ 136 - 1
prs.logikal/LogikalServer.cs

@@ -1,6 +1,9 @@
 using System;
 using System.Collections.Generic;
+using System.Data.SQLite;
 using System.Dynamic;
+using System.IO;
+using System.Linq;
 using System.Windows;
 using System.Windows.Threading;
 using InABox.Logikal;
@@ -23,7 +26,7 @@ namespace PRSLogikal
 
     public delegate void LogikalLogEvent(object sender, LogikalLogArguments args);
     
-    public class LogikalServer : IDisposable, ILogikalApp
+    public class LogikalServer : IDisposable
     {
         
         //private readonly List<String> _log = new List<String>();
@@ -122,6 +125,138 @@ namespace PRSLogikal
             _login = null;
             return LogikalStatus.Ok;
         }
+
+        public bool IsLoggedIn() => _login != null;
+
+        public IEnumerable<ILogikalProject> GetProjects()
+        {
+            List<ILogikalProject> _result = null;
+            if (_login != null)
+            {
+                IProjectCenterInfo _info = _login.CoreObject.ProjectCenterInfos.FirstOrDefault();
+                if (_info != null)
+                {
+                    _result = new List<ILogikalProject>();
+                    using (ICoreObjectResult<IProjectCenter> _center = _login.CoreObject.GetProjectCenter(_info))
+                    {
+                        IList<IBaseProjectInfo> _projects = _center.CoreObject.ChildrenInfos;
+                        foreach (var _project in _projects)
+                        {
+                            var _summary = new LogikalProject()
+                            {
+                                ID = _project.Guid,
+                                Name = _project.Name,
+                                PersonInCharge = _project.PersonInCharge,
+                                Path = _project.Path
+                            };
+                            _result.Add(_summary);
+                        }
+                    }
+                }
+                else
+                    DoLog($"Cannot Retrieve Project List: No ProjectCenterInfo available");
+            }
+            else
+                DoLog($"Cannot Retrieve Project List: Not Logged In");
+            return _result;
+        }
+        
+        public ILogikalProject GetProject(Guid projectid)
+        {
+            ILogikalProject _result = null;
+            if (_login != null)
+            {
+                var _project = _login.CoreObject.GetProjectByGuid(projectid);
+                if (_project != null)
+                {
+                    _result = new LogikalProject()
+                    {
+                        ID = _project.CoreObject.Id,
+                        Name = _project.CoreObject.Info.Name
+                    };
+                    List<LogikalElevation> _elevations = new List<LogikalElevation>();
+                    ICoreObjectListResult<IPhase> phases = _project.CoreObject.GetChildren();
+                    foreach (ICoreObjectResult<IPhase> phase in phases.CoreObjectResults)
+                    {
+                        ICoreObjectListResult<IElevation> elevations = phase.CoreObject.GetChildren();
+                        foreach (ICoreObjectResult<IElevation> elevation in elevations.CoreObjectResults)
+                        {
+                            var _summary = new LogikalElevation()
+                            {
+                                ID = elevation.CoreObject.Id,
+                                Name = elevation.CoreObject.Info.Name,
+                                Phase = phase.CoreObject.Info.Name
+                            };
+                            using (var ms = new MemoryStream())
+                            {
+                                IStreamResult thumbnail =
+                                    elevation.CoreObject.GetThumbnail(new Dictionary<string, object>() { });
+                                thumbnail.Stream.CopyTo(ms);
+                                _summary.Thumbnail = ms.GetBuffer();
+                            }
+                            _elevations.Add(_summary);
+                        }
+                    }
+                }
+                else
+                    DoLog($"Cannot Load Project {projectid}");
+            }
+            else
+            {
+                DoLog($"Cannot Load Project: Not Logged In");
+            }
+            return _result;
+        }
+        public ILogikalElevation GetElevation(Guid elevationid)
+        {
+            LogikalElevation _result = null;
+            if (_login != null)
+            {
+                var _project = _login.CoreObject.GetProjectFromElevation(elevationid);
+                if (_project != null)
+                {
+                    ICoreObjectListResult<IPhase> children = _project.CoreObject.GetChildren();
+                    foreach (ICoreObjectResult<IPhase> child in children.CoreObjectResults)
+                    {
+                        ICoreObjectResult<IElevation> elevation = child.CoreObject.GetChildren().CoreObjectResults.FirstOrDefault(x=>x.CoreObject.Id == elevationid);
+                        if (elevation != null)
+                        {
+                            _result = new LogikalElevation()
+                            {
+                                ID = elevation.CoreObject.Id,
+                                Name = elevation.CoreObject.Info.Name
+                            };
+                            using (var ms = new MemoryStream())
+                            {
+                                IDrawingResult thumbnail =
+                                    elevation.CoreObject.GetDrawing(new Dictionary<string, object>() { });
+                                thumbnail.Stream.CopyTo(ms);
+                                _result.Drawing = ms.GetBuffer();
+                            }
+
+                            IStreamResult parts = elevation.CoreObject.GetPartsList();
+                            var file = Path.Combine(Path.GetTempPath(), Path.GetTempFileName());
+                            using (var fs = new FileStream(file, FileMode.OpenOrCreate))
+                                parts.Stream.CopyTo(fs);
+                            var sb = new SQLiteConnectionStringBuilder();
+                            sb.DataSource = file;
+                            var _connection = new SQLiteConnection(sb.ToString());
+                            _connection.Open();
+                            // Parse the file here
+                            _connection.Close();
+                            File.Delete(file);
+                        }
+                    }
+                }
+                else
+                    DoLog($"Cannot Load Project from Elevation {elevationid}");
+            }
+            else
+                DoLog($"Cannot Retrieve Project List: Not Logged In");
+            
+            return _result;
+        }
+        
         
         public void Dispose()
         {

+ 13 - 4
prs.logikal/PRSLogikal.csproj

@@ -63,6 +63,9 @@
         <Reference Include="System"/>
         <Reference Include="System.Core"/>
         <Reference Include="System.Data"/>
+        <Reference Include="System.Data.SQLite, Version=1.0.118.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+          <HintPath>..\..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\lib\net46\System.Data.SQLite.dll</HintPath>
+        </Reference>
         <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
           <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
         </Reference>
@@ -90,6 +93,9 @@
             <DependentUpon>App.xaml</DependentUpon>
             <SubType>Code</SubType>
         </Compile>
+        <Compile Include="Classes\LogikalElevation.cs" />
+        <Compile Include="Classes\LogikalPart.cs" />
+        <Compile Include="Classes\LogikalProject.cs" />
         <Compile Include="LogikalListener.cs" />
         <Compile Include="LogikalServer.cs" />
         <Compile Include="MainWindow.xaml.cs">
@@ -120,10 +126,13 @@
         <Project>{24ef107f-3319-4788-892a-31c05669c8c4}</Project>
         <Name>InABox.Logikal</Name>
       </ProjectReference>
-      <ProjectReference Include="..\inabox\InABox.Logikal\InABox.Logikal.csproj">
-        <Project>{24ef107f-3319-4788-892a-31c05669c8c4}</Project>
-        <Name>InABox.Logikal</Name>
-      </ProjectReference>
     </ItemGroup>
     <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>
+    <Import Project="..\..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('..\..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" />
+    <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+      <PropertyGroup>
+        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}.</ErrorText>
+      </PropertyGroup>
+      <Error Condition="!Exists('..\..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets'))" />
+    </Target>
 </Project>

+ 2 - 0
prs.logikal/packages.config

@@ -6,6 +6,8 @@
   <package id="H.Pipes" version="2.0.59" targetFramework="net48" />
   <package id="Microsoft.Bcl.AsyncInterfaces" version="8.0.0" targetFramework="net48" />
   <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" />
+  <package id="Stub.System.Data.SQLite.Core.NetFramework" version="1.0.118.0" targetFramework="net472" />
+  <package id="System.Data.SQLite.Core" version="1.0.118.0" targetFramework="net472" />
   <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
   <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
 </packages>