Kenric Nugteren преди 1 година
родител
ревизия
19ff3aae08

+ 2 - 2
InABox.Core/CoreUtils.cs

@@ -2463,9 +2463,9 @@ namespace InABox.Core
             return string.Join("\n", messages);
         }
 
-        public static void LogException(string userid, Exception err)
+        public static void LogException(string userid, Exception err, string? extra = null)
         {
-            Logger.Send(LogType.Error, userid, CoreUtils.FormatException(err));
+            Logger.Send(LogType.Error, userid, (extra != null ? $"{extra}: " : "") + CoreUtils.FormatException(err));
         }
 
         #region OneToMany Relationships

+ 9 - 1
InABox.Core/Serialization.cs

@@ -364,6 +364,15 @@ namespace InABox.Core
             return new Guid(reader.ReadBytes(16));
         }
 
+        public static void Write(this BinaryWriter writer, DateTime dateTime)
+        {
+            writer.Write(dateTime.Ticks);
+        }
+        public static DateTime ReadDateTime(this BinaryReader reader)
+        {
+            return new DateTime(reader.ReadInt64());
+        }
+
         private static bool MatchType<T1>(Type t) => typeof(T1) == t;
         private static bool MatchType<T1,T2>(Type t) => (typeof(T1) == t) || (typeof(T2) == t);
         
@@ -434,7 +443,6 @@ namespace InABox.Core
             else if (MatchType<Guid, object>(type) && value is Guid guid)
                 writer.Write(guid);
             
-            
             else if (MatchType<byte, object>(type) && value is byte i8)
                 writer.Write(i8);
             

+ 37 - 38
InABox.Database/Stores/DocumentStore.cs

@@ -1,47 +1,46 @@
 using InABox.Core;
 
-namespace InABox.Database
+namespace InABox.Database;
+
+public class DocumentStore : Store<Document>
 {
-    public class DocumentStore : Store<Document>
+    protected override void AfterLoad(IEnumerable<Document> items)
     {
-        protected override void AfterLoad(IEnumerable<Document> items)
-        {
-            base.AfterLoad(items);
-            //if (!Provider.IsRelational())
-            //{
-            //    foreach (var item in items)
-            //    {
-            //        if ((item.Data == null) || (item.Data.Length == 0))
-            //            item.Data = Provider.LoadFile(item.ID);
-            //    }
-            //}
-        }
+        base.AfterLoad(items);
+        //if (!Provider.IsRelational())
+        //{
+        //    foreach (var item in items)
+        //    {
+        //        if ((item.Data == null) || (item.Data.Length == 0))
+        //            item.Data = Provider.LoadFile(item.ID);
+        //    }
+        //}
+    }
 
-        protected override void OnSave(Document entity, ref string auditnote)
-        {
-            //if (!Provider.IsRelational())
-            //{
-            //    byte[] data = entity.Data;
-            //    entity.Data = new byte[] { };
-            //    base.OnSave(entity);
-            //    entity.Data = data;
-            //    Provider.SaveFile(entity.ID, data);
-            //}
-            //else
-            base.OnSave(entity, ref auditnote);
-        }
+    protected override void OnSave(Document entity, ref string auditnote)
+    {
+        //if (!Provider.IsRelational())
+        //{
+        //    byte[] data = entity.Data;
+        //    entity.Data = new byte[] { };
+        //    base.OnSave(entity);
+        //    entity.Data = data;
+        //    Provider.SaveFile(entity.ID, data);
+        //}
+        //else
+        base.OnSave(entity, ref auditnote);
+    }
 
-        protected override void OnSave(IEnumerable<Document> entities, ref string auditnote)
-        {
-            foreach (var entity in entities)
-                OnSave(entity, ref auditnote);
-        }
+    protected override void OnSave(IEnumerable<Document> entities, ref string auditnote)
+    {
+        foreach (var entity in entities)
+            OnSave(entity, ref auditnote);
+    }
 
-        protected override void AfterDelete(Document entity)
-        {
-            base.AfterDelete(entity);
-            //if (!Provider.IsRelational())
-            //    Provider.DeleteFile(entity.ID);
-        }
+    protected override void AfterDelete(Document entity)
+    {
+        base.AfterDelete(entity);
+        //if (!Provider.IsRelational())
+        //    Provider.DeleteFile(entity.ID);
     }
 }

+ 0 - 1
InABox.RPC.Shared/Commands/Query/RpcQueryResult.cs

@@ -16,7 +16,6 @@ namespace InABox.Rpc
         public void DeserializeBinary(CoreBinaryReader reader)
         {
             Tables = reader.ReadBinaryValue<RpcQueryTable[]>();
-            
         }
         
         public string FullDescription() => $"{string.Join(", ", Tables.Select(x => $"{x.Key}=({x.Table.Rows.Count} Rows / {x.Table.Columns.Count} Columns)"))}";

+ 40 - 43
InABox.Server/RPC/Handlers/Query.cs

@@ -2,57 +2,54 @@ using InABox.API;
 using InABox.Core;
 using InABox.Database;
 
-namespace InABox.Rpc
+namespace InABox.Rpc;
+
+public class RpcQueryHandler : RpcCommandHandler<IRpcServer, RpcQueryCommand, RpcQueryParameters, RpcQueryResult> 
 {
-    
-    public class RpcQueryHandler : RpcCommandHandler<IRpcServer, RpcQueryCommand, RpcQueryParameters, RpcQueryResult> 
+    protected override RpcQueryResult Execute(IRpcSession session, RpcQueryParameters parameters)
     {
-        protected override RpcQueryResult Execute(IRpcSession session, RpcQueryParameters parameters)
-        {
-            var user = CredentialsCache.ValidateAndRefresh(session.ID)
-                ?? throw new RpcException("User not found in Credentials Cache!", RpcError.UNAUTHENTICATED);
+        var user = CredentialsCache.ValidateAndRefresh(session.ID)
+            ?? throw new RpcException("User not found in Credentials Cache!", RpcError.UNAUTHENTICATED);
 
-            var response = new RpcQueryResult();
+        var response = new RpcQueryResult();
 
-            var tasks = new List<Task<RpcQueryTable>>();
-            foreach (var query in parameters.Queries)
+        var tasks = new List<Task<RpcQueryTable>>();
+        foreach (var query in parameters.Queries)
+        {
+            var task = Task.Run(() =>
             {
-                var task = Task.Run(() =>
+                var table = new RpcQueryTable() { Key = query.Key };
+                try
                 {
-                    var table = new RpcQueryTable() { Key = query.Key };
-                    try
-                    {
-                        var store = DbFactory.FindStore(query.Type, user.ID, user.UserID, session.Platform, session.Version ?? "");
-                        table.Table = store.Query(query.Filter, query.Columns, query.Sort);
-                    }
-                    catch (Exception e)
-                    {
-                        Logger.Send(
-                            LogType.Error, 
-                            user.UserID,
-                            string.Format(
-                                "[{0} {1}] Error: {2}\n{3}", 
-                                PlatformUtils.PlatformToString(session.Platform), 
-                                session.Version,
-                                e.Message,
-                                e.StackTrace
-                            )
-                        );                       
-                    }
-                    
+                    var store = DbFactory.FindStore(query.Type, user.ID, user.UserID, session.Platform, session.Version ?? "");
+                    table.Table = store.Query(query.Filter, query.Columns, query.Sort);
+                }
+                catch (Exception e)
+                {
+                    Logger.Send(
+                        LogType.Error, 
+                        user.UserID,
+                        string.Format(
+                            "[{0} {1}] Error: {2}\n{3}", 
+                            PlatformUtils.PlatformToString(session.Platform), 
+                            session.Version,
+                            e.Message,
+                            e.StackTrace
+                        )
+                    );                       
+                }
                 return table;
-                });
-                tasks.Add(task);
-            }
-            Task.WaitAll(tasks.ToArray());
-
-            response.Tables = tasks.Select(x => x.Result).ToArray();
-            
-            return response;
+            });
+            tasks.Add(task);
         }
+        Task.WaitAll(tasks.ToArray());
 
-        public RpcQueryHandler(IRpcServer sender) : base(sender)
-        {
-        }
+        response.Tables = tasks.Select(x => x.Result).ToArray();
+        
+        return response;
+    }
+
+    public RpcQueryHandler(IRpcServer sender) : base(sender)
+    {
     }
 }

+ 35 - 1
inabox.wpf/ImageUtils.cs

@@ -822,7 +822,41 @@ namespace InABox.WPF
             return stream.ToArray();
         }
 
-        public static List<byte[]> RenderPDFToImages(byte[] pdfData, ImageEncoding encoding = ImageEncoding.JPEG)
+        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
+        public static extern bool DeleteObject(IntPtr hObject);
+        public static List<ImageSource> RenderPDFToImageSources(byte[] pdfData, ImageEncoding encoding = ImageEncoding.JPEG)
+        {
+            using var profiler = new Profiler(true);
+            var rendered = new List<ImageSource>();
+
+            var loadeddoc = new PdfLoadedDocument(pdfData);
+            loadeddoc.FlattenAnnotations();
+            var images = loadeddoc.ExportAsImage(0, loadeddoc.Pages.Count - 1);
+
+            if (images != null)
+                foreach (var image in images)
+                {
+                    var hBitmap = image.GetHbitmap();
+                    try
+                    {
+                        var source = (ImageSource)Imaging.CreateBitmapSourceFromHBitmap(
+                            hBitmap,
+                            IntPtr.Zero,
+                            Int32Rect.Empty,
+                            BitmapSizeOptions.FromEmptyOptions());
+                        source.Freeze();
+                        rendered.Add(source);
+                    }
+                    finally
+                    {
+                        DeleteObject(hBitmap);
+                    }
+                }
+
+            return rendered;
+        }
+
+        public static List<byte[]> RenderPDFToImageBytes(byte[] pdfData, ImageEncoding encoding = ImageEncoding.JPEG)
         {
             var rendered = new List<byte[]>();