From a7a7e305d8747077cbec29c3fc8fc2d880b687bb Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 00:48:42 +0600 Subject: [PATCH 01/39] Create CoreActivities class library --- .gitignore | 3 +++ CSharpLibraryTools/CSharpLibraryTools.sln | 8 +++++++- .../CoreActivities/CoreActivities.csproj | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 CSharpLibraryTools/CoreActivities/CoreActivities.csproj diff --git a/.gitignore b/.gitignore index 839232a..85608b9 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ /CSharpLibraryTools/.vs/CSharpLibraryTools/v16 /CSharpLibraryTools/CSharpLibraryTools/bin/Debug/netcoreapp3.1 /CSharpLibraryTools/CSharpLibraryTools/obj +/CSharpLibraryTools/.vs/CSharpLibraryTools/DesignTimeBuild +/CSharpLibraryTools/CoreActivities/bin/Debug/netcoreapp3.1 +/CSharpLibraryTools/CoreActivities/obj diff --git a/CSharpLibraryTools/CSharpLibraryTools.sln b/CSharpLibraryTools/CSharpLibraryTools.sln index c3b3d17..fa2e605 100644 --- a/CSharpLibraryTools/CSharpLibraryTools.sln +++ b/CSharpLibraryTools/CSharpLibraryTools.sln @@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.31129.286 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpLibraryTools", "CSharpLibraryTools\CSharpLibraryTools.csproj", "{5C724B73-6CF8-4A5E-8114-EBC3D5AA832D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSharpLibraryTools", "CSharpLibraryTools\CSharpLibraryTools.csproj", "{5C724B73-6CF8-4A5E-8114-EBC3D5AA832D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoreActivities", "CoreActivities\CoreActivities.csproj", "{E4431B92-3055-4E69-981F-DD1E4DA32179}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,6 +17,10 @@ Global {5C724B73-6CF8-4A5E-8114-EBC3D5AA832D}.Debug|Any CPU.Build.0 = Debug|Any CPU {5C724B73-6CF8-4A5E-8114-EBC3D5AA832D}.Release|Any CPU.ActiveCfg = Release|Any CPU {5C724B73-6CF8-4A5E-8114-EBC3D5AA832D}.Release|Any CPU.Build.0 = Release|Any CPU + {E4431B92-3055-4E69-981F-DD1E4DA32179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4431B92-3055-4E69-981F-DD1E4DA32179}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4431B92-3055-4E69-981F-DD1E4DA32179}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4431B92-3055-4E69-981F-DD1E4DA32179}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj new file mode 100644 index 0000000..3193aca --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -0,0 +1,11 @@ + + + + netcoreapp3.1 + + + + + + + From dd45df248f120349ecd2791e37e34429f6860dbb Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 02:34:32 +0600 Subject: [PATCH 02/39] Provide ActiveProgram adapter implementation --- .../ActiveProgram/ActiveProgramAdaptee.cs | 26 +++++++++++++++++++ .../ActiveProgram/ActiveProgramAdapter.cs | 24 +++++++++++++++++ .../ActiveProgram/IActiveProgram.cs | 7 +++++ 3 files changed, 57 insertions(+) create mode 100644 CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdaptee.cs create mode 100644 CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdapter.cs create mode 100644 CSharpLibraryTools/CoreActivities/ActiveProgram/IActiveProgram.cs diff --git a/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdaptee.cs b/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdaptee.cs new file mode 100644 index 0000000..cf25655 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdaptee.cs @@ -0,0 +1,26 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace CoreActivities.ActiveProgram +{ + public class ActiveProgramAdaptee + { + [DllImport("user32.dll")] + static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll")] + static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); + + public string GetActiveWindowTitle() + { + const int nChars = 256; + StringBuilder Buff = new StringBuilder(nChars); + IntPtr handle = GetForegroundWindow(); + if (GetWindowText(handle, Buff, nChars) > 0) + return Buff.ToString(); + + return null; + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdapter.cs b/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdapter.cs new file mode 100644 index 0000000..ef6b0df --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdapter.cs @@ -0,0 +1,24 @@ +using System; + +namespace CoreActivities.ActiveProgram +{ + public class ActiveProgramAdapter : IActiveProgram + { + private readonly ActiveProgramAdaptee _activeProgramAdaptee; + + public ActiveProgramAdapter(ActiveProgramAdaptee activeProgramAdaptee) + => _activeProgramAdaptee = activeProgramAdaptee; + + public string CaptureActiveProgramTitle() + { + var windowTitle = _activeProgramAdaptee.GetActiveWindowTitle(); + if (string.IsNullOrWhiteSpace(windowTitle)) + throw new Exception("No valid active program title has found"); + + if (windowTitle.Contains("\\")) + return windowTitle.Split("\\")[^1]; + else + return windowTitle; + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/ActiveProgram/IActiveProgram.cs b/CSharpLibraryTools/CoreActivities/ActiveProgram/IActiveProgram.cs new file mode 100644 index 0000000..918aece --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/ActiveProgram/IActiveProgram.cs @@ -0,0 +1,7 @@ +namespace CoreActivities.ActiveProgram +{ + public interface IActiveProgram + { + string CaptureActiveProgramTitle(); + } +} From 60d918ebcd40c2223309d2b6b382f389e24e4686 Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 02:35:12 +0600 Subject: [PATCH 03/39] Local commit --- CSharpLibraryTools/CoreActivities/CoreActivities.csproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index 3193aca..cb63190 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -4,8 +4,4 @@ netcoreapp3.1 - - - - From a6adb4440063be592de73ea12c4da05984fc63b9 Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 18:40:07 +0600 Subject: [PATCH 04/39] Provide package for ActiveProgram to resolve DI overhead --- .../CSharpLibraryTools/Application.cs | 23 +++++++++++++++++++ .../CSharpLibraryTools.csproj | 10 +++++++- .../CSharpLibraryTools/Program.cs | 19 +++++++++++++-- .../ActiveProgram/ActiveProgramPackage.cs | 17 ++++++++++++++ .../CoreActivities/CoreActivities.csproj | 4 ++++ 5 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 CSharpLibraryTools/CSharpLibraryTools/Application.cs create mode 100644 CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramPackage.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs new file mode 100644 index 0000000..a8a41ac --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -0,0 +1,23 @@ +using CoreActivities.ActiveProgram; +using System; +using System.Collections.Generic; +using System.Text; + +namespace CSharpLibraryTools +{ + public class Application + { + private readonly IActiveProgram _activeProgram; + + public Application(IActiveProgram activeProgram) + { + _activeProgram = activeProgram; + } + + public void Run() + { + var title = _activeProgram.CaptureActiveProgramTitle(); + Console.WriteLine($"Present active program title is {title}"); + } + } +} diff --git a/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj b/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj index c73e0d1..626d4de 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj +++ b/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj @@ -1,8 +1,16 @@ - + Exe netcoreapp3.1 + + + + + + + + diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index ddec8b3..9c34c96 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -1,12 +1,27 @@ -using System; +using Autofac; +using CoreActivities.ActiveProgram; +using System; namespace CSharpLibraryTools { class Program { + /// + /// Need to only inject the packages inside CompositionRoot + /// + private static IContainer CompositionRoot() + { + var builder = new ContainerBuilder(); + + builder.RegisterType(); + builder.RegisterModule(new ActiveProgramPackage()); + + return builder.Build(); + } + static void Main(string[] args) { - Console.WriteLine("Hello World!"); + CompositionRoot().Resolve().Run(); } } } diff --git a/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramPackage.cs b/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramPackage.cs new file mode 100644 index 0000000..bfddab7 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramPackage.cs @@ -0,0 +1,17 @@ +using Autofac; + +namespace CoreActivities.ActiveProgram +{ + public class ActiveProgramPackage : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + + base.Load(builder); + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index cb63190..7c93d4a 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -4,4 +4,8 @@ netcoreapp3.1 + + + + From f9e56561f81d07729dc659c1ad7e19f466a2e15c Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 19:31:50 +0600 Subject: [PATCH 05/39] Create BrowserActivity Lib --- .../CSharpLibraryTools/Application.cs | 19 +++- .../CSharpLibraryTools/Program.cs | 2 + .../BrowserActivity/BrowserActivityAdaptee.cs | 102 ++++++++++++++++++ .../BrowserActivity/BrowserActivityAdapter.cs | 26 +++++ .../BrowserActivityEnumAdaptee.cs | 17 +++ .../BrowserActivity/BrowserActivityPackage.cs | 19 ++++ .../BrowserActivity/BrowserType.cs | 18 ++++ .../BrowserActivity/IBrowserActivity.cs | 12 +++ .../CoreActivities/CoreActivities.csproj | 20 ++-- 9 files changed, 225 insertions(+), 10 deletions(-) create mode 100644 CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs create mode 100644 CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs create mode 100644 CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityEnumAdaptee.cs create mode 100644 CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityPackage.cs create mode 100644 CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserType.cs create mode 100644 CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs index a8a41ac..914d376 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Application.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -1,23 +1,36 @@ using CoreActivities.ActiveProgram; +using CoreActivities.BrowserActivity; using System; -using System.Collections.Generic; -using System.Text; namespace CSharpLibraryTools { public class Application { private readonly IActiveProgram _activeProgram; + private readonly IBrowserActivity _browserActivity; - public Application(IActiveProgram activeProgram) + public Application(IActiveProgram activeProgram, + IBrowserActivity browserActivity) { _activeProgram = activeProgram; + _browserActivity = browserActivity; } public void Run() { var title = _activeProgram.CaptureActiveProgramTitle(); Console.WriteLine($"Present active program title is {title}"); + + Console.WriteLine("-------------------------------------------"); + + var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Chrome); + foreach (var item in tabs) + Console.WriteLine(item); + + var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); + Console.WriteLine($"Active URL: {activeUrl}"); + + Console.WriteLine("-------------------------------------------"); } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index 9c34c96..67dd67c 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -1,5 +1,6 @@ using Autofac; using CoreActivities.ActiveProgram; +using CoreActivities.BrowserActivity; using System; namespace CSharpLibraryTools @@ -15,6 +16,7 @@ private static IContainer CompositionRoot() builder.RegisterType(); builder.RegisterModule(new ActiveProgramPackage()); + builder.RegisterModule(new BrowserActivityPackage()); return builder.Build(); } diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs new file mode 100644 index 0000000..1267210 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Windows.Automation; + +namespace CoreActivities.BrowserActivity +{ + public class BrowserActivityAdaptee + { + private readonly BrowserActivityEnumAdaptee _browserActivityEnumAdaptee; + + public BrowserActivityAdaptee(BrowserActivityEnumAdaptee browserActivityEnumAdaptee) + => _browserActivityEnumAdaptee = browserActivityEnumAdaptee; + + public string GetActiveTabUrl(BrowserType browserType) + { + try + { + // There are always multiple chrome processes, so we have to loop through all of them to find the + // process with a Window Handle and an automation element of name "Address and search bar" + + var browserName = _browserActivityEnumAdaptee.ToDescriptionString(browserType); + var browserProcess = Process.GetProcessesByName(browserName); + + if (browserProcess.Length > 0) + { + var url = string.Empty; + foreach (var chrome in browserProcess) + { + // The browser process must have a window + if (chrome.MainWindowHandle == IntPtr.Zero) + continue; + + // Find the automation element + var elm = AutomationElement.FromHandle(chrome.MainWindowHandle); + var elmUrlBar = elm.FindFirst(TreeScope.Descendants, + new PropertyCondition(AutomationElement.NameProperty, "Address and search bar")); + + // If it can be found, get the value from the URL bar + if (elmUrlBar != null) + { + var patterns = elmUrlBar.GetSupportedPatterns(); + if (patterns.Length > 0) + { + var val = (ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0]); + url = val.Current.Value; + } + } + } + + return url; + } + else + return string.Empty; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + } + + public IList GetOpenTabsInfos(BrowserType browserType) + { + try + { + var tabInfos = new List(); + + var browserName = _browserActivityEnumAdaptee.ToDescriptionString(browserType); + var processes = Process.GetProcessesByName(browserName); + + if (processes.Length <= 0) + throw new Exception($"No process found with this {browserName} name"); + else + { + foreach (var proc in processes) + { + if (proc.MainWindowHandle != IntPtr.Zero) + { + var root = AutomationElement.FromHandle(proc.MainWindowHandle); + var condition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem); + var tabs = root.FindAll(TreeScope.Descendants, condition); + var enumerator = tabs.GetEnumerator(); + + while (enumerator.MoveNext()) + { + var info = (AutomationElement)enumerator.Current; + tabInfos.Add(info.Current.Name); + } + } + } + } + + return tabInfos; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs new file mode 100644 index 0000000..b4a31fd --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace CoreActivities.BrowserActivity +{ + public class BrowserActivityAdapter : IBrowserActivity + { + private readonly BrowserActivityAdaptee _browserActivityAdaptee; + + public BrowserActivityAdapter(BrowserActivityAdaptee browserActivityAdaptee) + => _browserActivityAdaptee = browserActivityAdaptee; + + public string EnlistActiveTabUrl(BrowserType browserType) + { + var tabUrl = _browserActivityAdaptee.GetActiveTabUrl(browserType); + return tabUrl; + } + + public IList EnlistAllOpenTabs(BrowserType browserType) + { + var tabs = _browserActivityAdaptee.GetOpenTabsInfos(browserType); + return tabs; + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityEnumAdaptee.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityEnumAdaptee.cs new file mode 100644 index 0000000..1a10033 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityEnumAdaptee.cs @@ -0,0 +1,17 @@ +using System.ComponentModel; + +namespace CoreActivities.BrowserActivity +{ + public class BrowserActivityEnumAdaptee + { + public string ToDescriptionString(BrowserType val) + { + var attributes = (DescriptionAttribute[])val + .GetType() + .GetField(val.ToString()) + .GetCustomAttributes(typeof(DescriptionAttribute), false); + + return attributes.Length > 0 ? attributes[0].Description : string.Empty; + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityPackage.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityPackage.cs new file mode 100644 index 0000000..2090128 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityPackage.cs @@ -0,0 +1,19 @@ +using Autofac; + +namespace CoreActivities.BrowserActivity +{ + public class BrowserActivityPackage : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + + base.Load(builder); + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserType.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserType.cs new file mode 100644 index 0000000..8d3c2ea --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserType.cs @@ -0,0 +1,18 @@ +using System.ComponentModel; + +namespace CoreActivities.BrowserActivity +{ + public enum BrowserType + { + [Description("chrome")] + Chrome=1, + [Description("firefox")] + FireFox =2, + [Description("edge")] + Edge =3, + [Description("opera")] + Opera =4, + [Description("safari")] + Safari = 5 + } +} diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs new file mode 100644 index 0000000..8cf357d --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CoreActivities.BrowserActivity +{ + public interface IBrowserActivity + { + IList EnlistAllOpenTabs(BrowserType browserType); + string EnlistActiveTabUrl(BrowserType browserType); + } +} diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index 7c93d4a..114ebce 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -1,11 +1,17 @@ - + - - netcoreapp3.1 - + + Library + net5.0-windows + netcoreapp3.1 + - - - + + + + + + + From 86a4751735088867c23776699cc33f9852ecdd97 Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 20:14:46 +0600 Subject: [PATCH 06/39] Create DirectoryManager Lib --- .../CSharpLibraryTools/Application.cs | 10 +++- .../CSharpLibraryTools/Program.cs | 3 +- .../BrowserActivity/BrowserActivityAdaptee.cs | 1 - .../BrowserActivity/BrowserActivityAdapter.cs | 4 +- .../BrowserActivity/IBrowserActivity.cs | 4 +- .../DirectoryManagerAdaptee.cs | 12 +++++ .../DirectoryManagerAdapter.cs | 54 +++++++++++++++++++ .../DirectoryManagerPackage.cs | 17 ++++++ .../DirectoryManager/IDirectoryManager.cs | 9 ++++ 9 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdaptee.cs create mode 100644 CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdapter.cs create mode 100644 CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerPackage.cs create mode 100644 CSharpLibraryTools/CoreActivities/DirectoryManager/IDirectoryManager.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs index 914d376..8d10d73 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Application.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -1,5 +1,6 @@ using CoreActivities.ActiveProgram; using CoreActivities.BrowserActivity; +using CoreActivities.DirectoryManager; using System; namespace CSharpLibraryTools @@ -8,12 +9,15 @@ public class Application { private readonly IActiveProgram _activeProgram; private readonly IBrowserActivity _browserActivity; + private readonly IDirectoryManager _directoryManager; public Application(IActiveProgram activeProgram, - IBrowserActivity browserActivity) + IBrowserActivity browserActivity, + IDirectoryManager directoryManager) { _activeProgram = activeProgram; _browserActivity = browserActivity; + _directoryManager = directoryManager; } public void Run() @@ -31,6 +35,10 @@ public void Run() Console.WriteLine($"Active URL: {activeUrl}"); Console.WriteLine("-------------------------------------------"); + + Console.WriteLine(_directoryManager.GetProgramDataDirectoryPath("WebCam")); + _directoryManager.ChecknCreateDirectory("WebCam"); + Console.WriteLine(_directoryManager.CreateProgramDataFilePath("WebCam", "file.txt")); } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index 67dd67c..88eae61 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -1,7 +1,7 @@ using Autofac; using CoreActivities.ActiveProgram; using CoreActivities.BrowserActivity; -using System; +using CoreActivities.DirectoryManager; namespace CSharpLibraryTools { @@ -17,6 +17,7 @@ private static IContainer CompositionRoot() builder.RegisterType(); builder.RegisterModule(new ActiveProgramPackage()); builder.RegisterModule(new BrowserActivityPackage()); + builder.RegisterModule(new DirectoryManagerPackage()); return builder.Build(); } diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs index 1267210..4625cc5 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Text; using System.Windows.Automation; namespace CoreActivities.BrowserActivity diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs index b4a31fd..8b549f7 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using System.Collections.Generic; namespace CoreActivities.BrowserActivity { diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs index 8cf357d..e3e1cc6 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; namespace CoreActivities.BrowserActivity { diff --git a/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdaptee.cs b/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdaptee.cs new file mode 100644 index 0000000..7937e10 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdaptee.cs @@ -0,0 +1,12 @@ +using System; +using System.IO; + +namespace CoreActivities.DirectoryManager +{ + public class DirectoryManagerAdaptee + { + public string CommonApplicationPath => Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); + public bool Exists(string directory) => Directory.Exists(directory); + public void CreateDirectory(string directory) => Directory.CreateDirectory(directory); + } +} diff --git a/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdapter.cs b/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdapter.cs new file mode 100644 index 0000000..8152012 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdapter.cs @@ -0,0 +1,54 @@ +using System; + +namespace CoreActivities.DirectoryManager +{ + public class DirectoryManagerAdapter : IDirectoryManager + { + private readonly DirectoryManagerAdaptee _directoryManagerAdaptee; + + public DirectoryManagerAdapter(DirectoryManagerAdaptee directoryManagerAdaptee) + => _directoryManagerAdaptee = directoryManagerAdaptee; + + /// + /// Given a directory path of a folder it creates the folder under the directory if not exists + /// + public bool ChecknCreateDirectory(string directoryPath) + { + if (string.IsNullOrWhiteSpace(directoryPath)) + return false; + + if (!_directoryManagerAdaptee.Exists(directoryPath)) + { + _directoryManagerAdaptee.CreateDirectory(directoryPath); + return true; + } + else + return false; + } + + /// + /// Create a file path of given folder name which is under C:\ProgramData + /// + public string GetProgramDataDirectoryPath(string appFolder) + { + if (string.IsNullOrWhiteSpace(appFolder)) + throw new Exception("App folder string is empty."); + + return $"{_directoryManagerAdaptee.CommonApplicationPath}\\{appFolder}"; + } + + /// + /// Create a file path (If not exists) under given folderName in C:\ProgramData + /// + public string CreateProgramDataFilePath(string folderName, string fileName) + { + if (string.IsNullOrWhiteSpace(folderName) || string.IsNullOrWhiteSpace(fileName)) + throw new Exception("Given folder or File name is empty."); + + var directory = GetProgramDataDirectoryPath(folderName); + ChecknCreateDirectory(directory); + + return $"{directory}\\{fileName}"; + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerPackage.cs b/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerPackage.cs new file mode 100644 index 0000000..4345908 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerPackage.cs @@ -0,0 +1,17 @@ +using Autofac; + +namespace CoreActivities.DirectoryManager +{ + public class DirectoryManagerPackage: Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + + base.Load(builder); + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/DirectoryManager/IDirectoryManager.cs b/CSharpLibraryTools/CoreActivities/DirectoryManager/IDirectoryManager.cs new file mode 100644 index 0000000..905808c --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/DirectoryManager/IDirectoryManager.cs @@ -0,0 +1,9 @@ +namespace CoreActivities.DirectoryManager +{ + public interface IDirectoryManager + { + string GetProgramDataDirectoryPath(string appFolder); + bool ChecknCreateDirectory(string directoryPath); + string CreateProgramDataFilePath(string folderName, string fileName); + } +} From f9d4ffb7662871b41de17673f742118a188decea Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 20:29:52 +0600 Subject: [PATCH 07/39] Create EgmaCV Lib --- .../CSharpLibraryTools/Application.cs | 13 +++++++++-- .../CSharpLibraryTools/Program.cs | 7 ++++-- .../CoreActivities/CoreActivities.csproj | 2 ++ .../CoreActivities/EgmaCV/EgmaCvAdapter.cs | 22 +++++++++++++++++++ .../CoreActivities/EgmaCV/EgmaCvPackage.cs | 15 +++++++++++++ .../CoreActivities/EgmaCV/IEgmaCv.cs | 9 ++++++++ 6 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvAdapter.cs create mode 100644 CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvPackage.cs create mode 100644 CSharpLibraryTools/CoreActivities/EgmaCV/IEgmaCv.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs index 8d10d73..73791fb 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Application.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -1,7 +1,9 @@ using CoreActivities.ActiveProgram; using CoreActivities.BrowserActivity; using CoreActivities.DirectoryManager; +using CoreActivities.EgmaCV; using System; +using System.Threading.Tasks; namespace CSharpLibraryTools { @@ -10,17 +12,20 @@ public class Application private readonly IActiveProgram _activeProgram; private readonly IBrowserActivity _browserActivity; private readonly IDirectoryManager _directoryManager; + private readonly IEgmaCv _egmaCv; public Application(IActiveProgram activeProgram, IBrowserActivity browserActivity, - IDirectoryManager directoryManager) + IDirectoryManager directoryManager, + IEgmaCv egmaCv) { _activeProgram = activeProgram; _browserActivity = browserActivity; _directoryManager = directoryManager; + _egmaCv = egmaCv; } - public void Run() + public async Task Run() { var title = _activeProgram.CaptureActiveProgramTitle(); Console.WriteLine($"Present active program title is {title}"); @@ -39,6 +44,10 @@ public void Run() Console.WriteLine(_directoryManager.GetProgramDataDirectoryPath("WebCam")); _directoryManager.ChecknCreateDirectory("WebCam"); Console.WriteLine(_directoryManager.CreateProgramDataFilePath("WebCam", "file.txt")); + + Console.WriteLine("-------------------------------------------"); + var rand = new Random(); + await _egmaCv.CaptureImageAsync(0, _directoryManager.CreateProgramDataFilePath("WebCam", $"{rand.Next(10, 9999)}.jpg")); } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index 88eae61..d429b12 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -2,6 +2,8 @@ using CoreActivities.ActiveProgram; using CoreActivities.BrowserActivity; using CoreActivities.DirectoryManager; +using CoreActivities.EgmaCV; +using System.Threading.Tasks; namespace CSharpLibraryTools { @@ -18,13 +20,14 @@ private static IContainer CompositionRoot() builder.RegisterModule(new ActiveProgramPackage()); builder.RegisterModule(new BrowserActivityPackage()); builder.RegisterModule(new DirectoryManagerPackage()); + builder.RegisterModule(new EgmaCvPackage()); return builder.Build(); } - static void Main(string[] args) + static async Task Main(string[] args) { - CompositionRoot().Resolve().Run(); + await CompositionRoot().Resolve().Run(); } } } diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index 114ebce..c91b7f0 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -12,6 +12,8 @@ + + diff --git a/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvAdapter.cs b/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvAdapter.cs new file mode 100644 index 0000000..4b12f69 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvAdapter.cs @@ -0,0 +1,22 @@ +using Emgu.CV; +using System; +using System.Threading.Tasks; + +namespace CoreActivities.EgmaCV +{ + public class EgmaCvAdapter : IEgmaCv + { + public async Task CaptureImageAsync(int camIndex, string filePath) + { + await Task.Run(() => + { + if (string.IsNullOrWhiteSpace(filePath)) + throw new Exception("Provide a valid path of file"); + + using var capture = new VideoCapture(camIndex, VideoCapture.API.DShow); + var image = capture.QueryFrame(); //take a picture + image.Save(filePath); + }); + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvPackage.cs b/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvPackage.cs new file mode 100644 index 0000000..6bfbb7c --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvPackage.cs @@ -0,0 +1,15 @@ +using Autofac; + +namespace CoreActivities.EgmaCV +{ + public class EgmaCvPackage : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As() + .InstancePerLifetimeScope(); + + base.Load(builder); + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/EgmaCV/IEgmaCv.cs b/CSharpLibraryTools/CoreActivities/EgmaCV/IEgmaCv.cs new file mode 100644 index 0000000..aac89c1 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/EgmaCV/IEgmaCv.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace CoreActivities.EgmaCV +{ + public interface IEgmaCv + { + Task CaptureImageAsync(int camIndex, string filePath); + } +} From 7b2bec0dcd82f057560c5ae08ff63bcf72e66f46 Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 22:52:08 +0600 Subject: [PATCH 08/39] Create file and file info adapter --- .../CoreActivities/CoreActivities.csproj | 1 + .../CoreActivities/FileManager/FileAdapter.cs | 39 +++++++++++++++++++ .../FileManager/FileInfoAdapter.cs | 32 +++++++++++++++ .../CoreActivities/FileManager/IFile.cs | 21 ++++++++++ .../CoreActivities/FileManager/IFileInfo.cs | 15 +++++++ 5 files changed, 108 insertions(+) create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/FileInfoAdapter.cs create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/IFile.cs create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/IFileInfo.cs diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index c91b7f0..04fa8f0 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -14,6 +14,7 @@ + diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs new file mode 100644 index 0000000..54c9ecb --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.StaticFiles; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace CoreActivities.FileManager +{ + public class FileAdapter : IFile + { + public string FileName(string filePath) => Path.GetFileName(filePath); + + public void CreateFile(string filePath) => File.Create(filePath); + + public bool DoesExists(string filePath) => File.Exists(filePath); + + public string GetMimeType(string fileName) + { + var provider = new FileExtensionContentTypeProvider(); + if (!provider.TryGetContentType(fileName, out string contentType)) + contentType = "application/octet-stream"; + + return contentType; + } + + public async Task WriteAllLineAsync(List lines, string filePath) => await File.WriteAllLinesAsync(filePath, lines); + + public async Task WriteAllTextAsync(string text, string filePath) => await File.WriteAllTextAsync(filePath, text); + + public async Task AppendAllLineAsync(List lines, string filePath) => await File.AppendAllLinesAsync(filePath, lines); + + public async Task AppendAllTextAsync(string text, string filePath) => await File.AppendAllTextAsync(filePath, text); + + public async Task ReadAllLineAsync(string filePath) => await File.ReadAllLinesAsync(filePath); + + public async Task ReadAllTextAsync(string filePath) => await File.ReadAllTextAsync(filePath); + } +} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileInfoAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileInfoAdapter.cs new file mode 100644 index 0000000..44dbb05 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileInfoAdapter.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace CoreActivities.FileManager +{ + public class FileInfoAdapter : IFileInfo + { + private FileInfo ObjectCreationAndValidation(string filePath) + { + if (string.IsNullOrEmpty(filePath)) + throw new Exception("Provide valid file path"); + + var fileInfo = new FileInfo(filePath); + if (!fileInfo.Exists) + throw new Exception("File does not exists"); + + return fileInfo; + } + + public DateTime CreatedOn(string filePath) => ObjectCreationAndValidation(filePath).CreationTime; + + public long FileSize(string filePath) => ObjectCreationAndValidation(filePath).Length; + + public bool IsReadOnly(string filePath) => ObjectCreationAndValidation(filePath).IsReadOnly; + + public DateTime LastAccessOn(string filePath) => ObjectCreationAndValidation(filePath).LastAccessTime; + + public DateTime LastUpdateOn(string filePath) => ObjectCreationAndValidation(filePath).LastWriteTime; + } +} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/IFile.cs b/CSharpLibraryTools/CoreActivities/FileManager/IFile.cs new file mode 100644 index 0000000..b8b6e6b --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/IFile.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace CoreActivities.FileManager +{ + public interface IFile + { + string FileName(string filePath); + bool DoesExists(string filePath); + void CreateFile(string filePath); + string GetMimeType(string fileName); + Task WriteAllLineAsync(List lines, string filePath); + Task WriteAllTextAsync(string text, string filePath); + Task AppendAllLineAsync(List lines, string filePath); + Task AppendAllTextAsync(string text, string filePath); + Task ReadAllLineAsync(string filePath); + Task ReadAllTextAsync(string filePath); + } +} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/IFileInfo.cs b/CSharpLibraryTools/CoreActivities/FileManager/IFileInfo.cs new file mode 100644 index 0000000..068706e --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/IFileInfo.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CoreActivities.FileManager +{ + public interface IFileInfo + { + long FileSize(string filePath); + bool IsReadOnly(string filePath); + DateTime CreatedOn(string filePath); + DateTime LastAccessOn(string filePath); + DateTime LastUpdateOn(string filePath); + } +} From d1cb805b1a8ee7e03cce475bb3889195a1bcef63 Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 23:03:54 +0600 Subject: [PATCH 09/39] Create file manager adapters --- .../CSharpLibraryTools/Program.cs | 2 + .../CoreActivities/CoreActivities.csproj | 1 + .../FileManager/FileManagerAdapter.cs | 56 +++++++++++++++++++ .../FileManager/FileManagerPackage.cs | 24 ++++++++ .../FileManager/FileStreamAdapter.cs | 18 ++++++ .../FileManager/IFileManager.cs | 15 +++++ .../CoreActivities/FileManager/IFileStream.cs | 13 +++++ 7 files changed, 129 insertions(+) create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/FileManagerPackage.cs create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/IFileManager.cs create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/IFileStream.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index d429b12..93b4732 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -3,6 +3,7 @@ using CoreActivities.BrowserActivity; using CoreActivities.DirectoryManager; using CoreActivities.EgmaCV; +using CoreActivities.FileManager; using System.Threading.Tasks; namespace CSharpLibraryTools @@ -21,6 +22,7 @@ private static IContainer CompositionRoot() builder.RegisterModule(new BrowserActivityPackage()); builder.RegisterModule(new DirectoryManagerPackage()); builder.RegisterModule(new EgmaCvPackage()); + builder.RegisterModule(new FileManagerPackage()); return builder.Build(); } diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index 04fa8f0..fa4fed0 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -15,6 +15,7 @@ + diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs new file mode 100644 index 0000000..cb75882 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Text; + +namespace CoreActivities.FileManager +{ + public class FileManagerAdapter : IFileManager + { + private readonly IFile _file; + private readonly IFileStream _fileStream; + + public FileManagerAdapter(IFile file, IFileStream fileStream) + { + _file = file; + _fileStream = fileStream; + } + + public void CreateFile(string path) + { + if (string.IsNullOrWhiteSpace(path)) + throw new Exception("Provide valid file path"); + + if (!_file.DoesExists(path)) + _file.CreateFile(path); + } + + public byte[] ReadFileAsByte(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) + throw new Exception("Provide valid file path read the file stream."); + + if (!_file.DoesExists(filePath)) + throw new Exception("File does not exists"); + + return _fileStream.ReadFileAsByte(filePath); + } + + public void SaveByteStream(string filePath, byte[] file) + { + if (string.IsNullOrWhiteSpace(filePath) || file == null || file.Length == 0) + throw new Exception("Provide valid file path and byte array to save the file stream."); + + _fileStream.WriteFileBytes(filePath, file); + } + + public void SaveBitmapImage(string filePath, Bitmap bitmap) + { + if (string.IsNullOrWhiteSpace(filePath) || bitmap == null) + throw new Exception("Provide valid file path and bitmap to save the image."); + + bitmap.Save(filePath, ImageFormat.Jpeg); + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerPackage.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerPackage.cs new file mode 100644 index 0000000..1a62bbb --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerPackage.cs @@ -0,0 +1,24 @@ +using Autofac; +using System; +using System.Collections.Generic; +using System.Text; + +namespace CoreActivities.FileManager +{ + public class FileManagerPackage : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As() + .InstancePerLifetimeScope(); + builder.RegisterType().As() + .InstancePerLifetimeScope(); + builder.RegisterType().As() + .InstancePerLifetimeScope(); + builder.RegisterType().As() + .InstancePerLifetimeScope(); + + base.Load(builder); + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs new file mode 100644 index 0000000..e750c4f --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace CoreActivities.FileManager +{ + public class FileStreamAdapter : IFileStream + { + public void WriteFileBytes(string filePath, byte[] file) + { + using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); + fileStream.Write(file, 0, file.Length); + } + public byte[] ReadFileAsByte(string filePath) => File.ReadAllBytes(filePath); + public string ConvertByteToBase64String(byte[] file) => Convert.ToBase64String(file); + } +} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/IFileManager.cs b/CSharpLibraryTools/CoreActivities/FileManager/IFileManager.cs new file mode 100644 index 0000000..6068b18 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/IFileManager.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; + +namespace CoreActivities.FileManager +{ + public interface IFileManager + { + void CreateFile(string filePath); + byte[] ReadFileAsByte(string filePath); + void SaveByteStream(string filePath, byte[] file); + void SaveBitmapImage(string filePath, Bitmap bitmap); + } +} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/IFileStream.cs b/CSharpLibraryTools/CoreActivities/FileManager/IFileStream.cs new file mode 100644 index 0000000..b63f080 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/IFileStream.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CoreActivities.FileManager +{ + public interface IFileStream + { + void WriteFileBytes(string filePath, byte[] file); + byte[] ReadFileAsByte(string filePath); + string ConvertByteToBase64String(byte[] file); + } +} From 280e4107d5ee981a4cf66a45023dbfa378261e8a Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 23:16:54 +0600 Subject: [PATCH 10/39] Create Google Drive Api Manager --- .../CSharpLibraryTools/Program.cs | 7 +- .../CoreActivities/CoreActivities.csproj | 1 + .../GoogleDriveApi/GoogleDriveApiManager.cs | 122 ++++++++++++++++++ 3 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index 93b4732..b10ec68 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -4,15 +4,13 @@ using CoreActivities.DirectoryManager; using CoreActivities.EgmaCV; using CoreActivities.FileManager; +using CoreActivities.GoogleDriveApi; using System.Threading.Tasks; namespace CSharpLibraryTools { class Program { - /// - /// Need to only inject the packages inside CompositionRoot - /// private static IContainer CompositionRoot() { var builder = new ContainerBuilder(); @@ -24,6 +22,9 @@ private static IContainer CompositionRoot() builder.RegisterModule(new EgmaCvPackage()); builder.RegisterModule(new FileManagerPackage()); + builder.RegisterType().As() + .InstancePerLifetimeScope(); + return builder.Build(); } diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index fa4fed0..e84d5fe 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -14,6 +14,7 @@ + diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs new file mode 100644 index 0000000..70cfd6f --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs @@ -0,0 +1,122 @@ +using CoreActivities.FileManager; +using Google.Apis.Auth.OAuth2; +using Google.Apis.Drive.v3; +using Google.Apis.Drive.v3.Data; +using Google.Apis.Services; +using Google.Apis.Upload; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace CoreActivities.GoogleDriveApi +{ + public interface IIGoogleDriveApiManager + { + Task UploadFileAsync(string filePath, Action uploadProgress = null); + } + + public class GoogleDriveApiManagerAdapter : IIGoogleDriveApiManager + { + private readonly string _authfilePath; + private readonly string _directoryId; + private readonly IFile _file; + private readonly IFileInfo _fileInfo; + private long _fileSize; + + public GoogleDriveApiManagerAdapter(string authfilePath, + string directoryId, + IFile file, + IFileInfo fileInfo) + { + _authfilePath = authfilePath; + _directoryId = directoryId; + _file = file; + _fileInfo = fileInfo; + _fileSize = 0; + } + + public async Task UploadFileAsync(string filePath, Action uploadProgress = null) + { + //Gathering file size at the very begining + _fileSize = _fileInfo.FileSize(filePath); + + var credential = GoogleCredential.FromFile(_authfilePath) + .CreateScoped(DriveService.ScopeConstants.Drive); + + var service = new DriveService(new BaseClientService.Initializer() + { + HttpClientInitializer = credential + }); + + if (!string.IsNullOrWhiteSpace(filePath) && _file.DoesExists(filePath)) + { + // Upload file Metadata + var fileMetadata = new File() + { + Name = _file.FileName(filePath), + Parents = new List() { _directoryId } + }; + + // Create a new file on Google Drive + await using var fsSource = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); + + // Create a new file, with metadata and stream. + var request = service.Files.Create(fileMetadata, fsSource, _file.GetMimeType(filePath)); + request.Fields = "*"; + request.ChunkSize = 262144; + if (uploadProgress != null) + request.ProgressChanged += uploadProgress; + else + request.ProgressChanged += UploadProgress; + + var results = await request.UploadAsync(CancellationToken.None); + + if (results.Status == UploadStatus.Failed) + throw new Exception($"Error uploading file: {results.Exception.Message}"); + + return request.ResponseBody?.Id; + } + else + throw new Exception("Provide valid file path"); + } + + private void UploadProgress(IUploadProgress progress) + { + DrawTextProgressBar(progress.BytesSent, _fileSize); + } + + private void DrawTextProgressBar(long progress, long total) + { + //draw empty progress bar + Console.CursorLeft = 0; + Console.Write("["); //start + Console.CursorLeft = 32; + Console.Write("]"); //end + Console.CursorLeft = 1; + float onechunk = 30.0f / total; + + //draw filled part + int position = 1; + for (int i = 0; i < onechunk * progress; i++) + { + Console.BackgroundColor = ConsoleColor.Gray; + Console.CursorLeft = position++; + Console.Write(" "); + } + + //draw unfilled part + for (int i = position; i <= 31; i++) + { + Console.BackgroundColor = ConsoleColor.Green; + Console.CursorLeft = position++; + Console.Write(" "); + } + + //draw totals + Console.CursorLeft = 35; + Console.BackgroundColor = ConsoleColor.Black; + Console.Write(progress.ToString() + " of " + total.ToString() + " "); //blanks at the end remove any excess + } + } +} From 324e61807a197f889947779ae5bccb36c9fa8fcf Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 23:21:02 +0600 Subject: [PATCH 11/39] Create running programs adapter --- .../CSharpLibraryTools/Program.cs | 3 ++ .../RunningPrograms/RunningProgramAdapter.cs | 49 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramAdapter.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index b10ec68..71a80f8 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -5,6 +5,7 @@ using CoreActivities.EgmaCV; using CoreActivities.FileManager; using CoreActivities.GoogleDriveApi; +using CoreActivities.RunningPrograms; using System.Threading.Tasks; namespace CSharpLibraryTools @@ -24,6 +25,8 @@ private static IContainer CompositionRoot() builder.RegisterType().As() .InstancePerLifetimeScope(); + builder.RegisterType().As() + .InstancePerLifetimeScope(); return builder.Build(); } diff --git a/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramAdapter.cs b/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramAdapter.cs new file mode 100644 index 0000000..4d3d8a5 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramAdapter.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; + +namespace CoreActivities.RunningPrograms +{ + public interface IRunningPrograms + { + List GetRunningProgramsList(); + List GetRunningProcessList(); + } + + public class RunningProgramAdapter : IRunningPrograms + { + public List GetRunningProcessList() + { + var processes = Process.GetProcesses(); + var processNames = new List(); + + foreach (var process in processes) + { + if (!string.IsNullOrWhiteSpace(process.ProcessName)) + processNames.Add(process.ProcessName); + } + + processNames = processNames.GroupBy(x => x).Select(x => x.Key).ToList(); + + return processNames; + } + + public List GetRunningProgramsList() + { + var processes = Process.GetProcesses(); + var titles = new List(); + + foreach (var process in processes) + { + if (!string.IsNullOrWhiteSpace(process.MainWindowTitle)) + titles.Add(process.MainWindowTitle); + } + + titles = titles.GroupBy(x => x).Select(x => x.Key).ToList(); + + return titles; + } + } +} From 53b8654868e9f8721db2b7e3ebd6d41502118cfb Mon Sep 17 00:00:00 2001 From: abbirku Date: Sun, 22 Aug 2021 23:23:43 +0600 Subject: [PATCH 12/39] Create Screem Capture Adapter --- .../CSharpLibraryTools/Program.cs | 3 ++ .../ScreenCapture/ScreenCaptureAdapter.cs | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCaptureAdapter.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index 71a80f8..2a47138 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -6,6 +6,7 @@ using CoreActivities.FileManager; using CoreActivities.GoogleDriveApi; using CoreActivities.RunningPrograms; +using CoreActivities.ScreenCapture; using System.Threading.Tasks; namespace CSharpLibraryTools @@ -27,6 +28,8 @@ private static IContainer CompositionRoot() .InstancePerLifetimeScope(); builder.RegisterType().As() .InstancePerLifetimeScope(); + builder.RegisterType().As() + .InstancePerLifetimeScope(); return builder.Build(); } diff --git a/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCaptureAdapter.cs b/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCaptureAdapter.cs new file mode 100644 index 0000000..daa8053 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCaptureAdapter.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; + +namespace CoreActivities.ScreenCapture +{ + public interface IScreenCapture + { + Bitmap CaptureUserScreen(int width, int height); + } + + public class ScreenCaptureAdapter : IScreenCapture + { + public Bitmap CaptureUserScreen(int width, int height) + { + if (width == 0 || height == 0) + return null; + + using var bitmap = new Bitmap(width, height); + using var g = Graphics.FromImage(bitmap); + g.CopyFromScreen(0, 0, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy); + + var cloneImage = (Bitmap)bitmap.Clone(); + + return cloneImage; + } + } +} From f102313eea5d417ab57430009b786054ca59efdc Mon Sep 17 00:00:00 2001 From: abbirku Date: Sat, 28 Aug 2021 16:58:56 +0600 Subject: [PATCH 13/39] Provide package for google drive api manager --- CSharpLibraryTools/CSharpLibraryTools/Program.cs | 3 +-- .../GoogleDriveApi/GoogleDriveApiPackage.cs | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiPackage.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index 2a47138..0b21eb8 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -23,9 +23,8 @@ private static IContainer CompositionRoot() builder.RegisterModule(new DirectoryManagerPackage()); builder.RegisterModule(new EgmaCvPackage()); builder.RegisterModule(new FileManagerPackage()); + builder.RegisterModule(new GoogleDriveApiPackage()); - builder.RegisterType().As() - .InstancePerLifetimeScope(); builder.RegisterType().As() .InstancePerLifetimeScope(); builder.RegisterType().As() diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiPackage.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiPackage.cs new file mode 100644 index 0000000..83248ef --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiPackage.cs @@ -0,0 +1,15 @@ +using Autofac; + +namespace CoreActivities.GoogleDriveApi +{ + public class GoogleDriveApiPackage : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As() + .InstancePerLifetimeScope(); + + base.Load(builder); + } + } +} From 355bf18ed19d69c2caa55a3eb12d4e60f53bc4c1 Mon Sep 17 00:00:00 2001 From: abbirku Date: Sat, 28 Aug 2021 17:01:00 +0600 Subject: [PATCH 14/39] Provide package for running programs --- CSharpLibraryTools/CSharpLibraryTools/Program.cs | 3 +-- .../RunningPrograms/RunningProgramPackage.cs | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramPackage.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index 0b21eb8..fdb94df 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -24,9 +24,8 @@ private static IContainer CompositionRoot() builder.RegisterModule(new EgmaCvPackage()); builder.RegisterModule(new FileManagerPackage()); builder.RegisterModule(new GoogleDriveApiPackage()); + builder.RegisterModule(new RunningProgramPackage()); - builder.RegisterType().As() - .InstancePerLifetimeScope(); builder.RegisterType().As() .InstancePerLifetimeScope(); diff --git a/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramPackage.cs b/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramPackage.cs new file mode 100644 index 0000000..06e51ac --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramPackage.cs @@ -0,0 +1,15 @@ +using Autofac; + +namespace CoreActivities.RunningPrograms +{ + public class RunningProgramPackage : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As() + .InstancePerLifetimeScope(); + + base.Load(builder); + } + } +} From 223a7cb6631d54fc517951799619d02899ae4fd6 Mon Sep 17 00:00:00 2001 From: abbirku Date: Sat, 28 Aug 2021 17:02:51 +0600 Subject: [PATCH 15/39] Create screen capture package --- CSharpLibraryTools/CSharpLibraryTools/Program.cs | 4 +--- .../ScreenCapture/ScreenCaptureAdapter.cs | 5 +---- .../ScreenCapture/ScreenCapturePackage.cs | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCapturePackage.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index fdb94df..f87d79b 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -25,9 +25,7 @@ private static IContainer CompositionRoot() builder.RegisterModule(new FileManagerPackage()); builder.RegisterModule(new GoogleDriveApiPackage()); builder.RegisterModule(new RunningProgramPackage()); - - builder.RegisterType().As() - .InstancePerLifetimeScope(); + builder.RegisterModule(new ScreenCapturePackage()); return builder.Build(); } diff --git a/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCaptureAdapter.cs b/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCaptureAdapter.cs index daa8053..900adcb 100644 --- a/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCaptureAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCaptureAdapter.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; +using System.Drawing; namespace CoreActivities.ScreenCapture { diff --git a/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCapturePackage.cs b/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCapturePackage.cs new file mode 100644 index 0000000..c518f61 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/ScreenCapture/ScreenCapturePackage.cs @@ -0,0 +1,15 @@ +using Autofac; + +namespace CoreActivities.ScreenCapture +{ + public class ScreenCapturePackage : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As() + .InstancePerLifetimeScope(); + + base.Load(builder); + } + } +} From 3b8773365c3af16b8a40004b1e4bb461b96f9fef Mon Sep 17 00:00:00 2001 From: abbirku Date: Mon, 30 Aug 2021 22:22:39 +0600 Subject: [PATCH 16/39] Update adapters --- .../ActiveProgram/ActiveProgramAdapter.cs | 5 + .../ActiveProgram/IActiveProgram.cs | 7 - .../BrowserActivity/BrowserActivityAdapter.cs | 25 +- .../BrowserActivity/IBrowserActivity.cs | 10 - .../DirectoryManagerAdapter.cs | 7 + .../DirectoryManager/IDirectoryManager.cs | 9 - .../CoreActivities/EgmaCV/EgmaCvAdapter.cs | 5 + .../CoreActivities/EgmaCV/IEgmaCv.cs | 9 - .../CoreActivities/FileManager/FileAdapter.cs | 14 ++ .../FileManager/FileInfoAdapter.cs | 11 +- .../FileManager/FileManagerAdapter.cs | 8 + .../FileManager/FileStreamAdapter.cs | 9 + .../CoreActivities/FileManager/IFile.cs | 21 -- .../CoreActivities/FileManager/IFileInfo.cs | 15 -- .../FileManager/IFileManager.cs | 15 -- .../CoreActivities/FileManager/IFileStream.cs | 13 -- .../GoogleDriveApi/GoogleDriveApiManager.cs | 220 ++++++++++++++++-- .../GoogleDriveApi/Models/GoogleDriveFiles.cs | 11 + .../GoogleDriveApi/Models/UploadFileInfo.cs | 10 + .../Parms/FilesDeleteOptionalParms.cs | 8 + .../Parms/FilesListOptionalParms.cs | 28 +++ .../CoreActivities/GoogleDriveApi/source.txt | 14 ++ 22 files changed, 346 insertions(+), 128 deletions(-) delete mode 100644 CSharpLibraryTools/CoreActivities/ActiveProgram/IActiveProgram.cs delete mode 100644 CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs delete mode 100644 CSharpLibraryTools/CoreActivities/DirectoryManager/IDirectoryManager.cs delete mode 100644 CSharpLibraryTools/CoreActivities/EgmaCV/IEgmaCv.cs delete mode 100644 CSharpLibraryTools/CoreActivities/FileManager/IFile.cs delete mode 100644 CSharpLibraryTools/CoreActivities/FileManager/IFileInfo.cs delete mode 100644 CSharpLibraryTools/CoreActivities/FileManager/IFileManager.cs delete mode 100644 CSharpLibraryTools/CoreActivities/FileManager/IFileStream.cs create mode 100644 CSharpLibraryTools/CoreActivities/GoogleDriveApi/Models/GoogleDriveFiles.cs create mode 100644 CSharpLibraryTools/CoreActivities/GoogleDriveApi/Models/UploadFileInfo.cs create mode 100644 CSharpLibraryTools/CoreActivities/GoogleDriveApi/Parms/FilesDeleteOptionalParms.cs create mode 100644 CSharpLibraryTools/CoreActivities/GoogleDriveApi/Parms/FilesListOptionalParms.cs create mode 100644 CSharpLibraryTools/CoreActivities/GoogleDriveApi/source.txt diff --git a/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdapter.cs b/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdapter.cs index ef6b0df..d0a52ad 100644 --- a/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/ActiveProgram/ActiveProgramAdapter.cs @@ -2,6 +2,11 @@ namespace CoreActivities.ActiveProgram { + public interface IActiveProgram + { + string CaptureActiveProgramTitle(); + } + public class ActiveProgramAdapter : IActiveProgram { private readonly ActiveProgramAdaptee _activeProgramAdaptee; diff --git a/CSharpLibraryTools/CoreActivities/ActiveProgram/IActiveProgram.cs b/CSharpLibraryTools/CoreActivities/ActiveProgram/IActiveProgram.cs deleted file mode 100644 index 918aece..0000000 --- a/CSharpLibraryTools/CoreActivities/ActiveProgram/IActiveProgram.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace CoreActivities.ActiveProgram -{ - public interface IActiveProgram - { - string CaptureActiveProgramTitle(); - } -} diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs index 8b549f7..5c60cf8 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs @@ -1,23 +1,42 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace CoreActivities.BrowserActivity { + public interface IBrowserActivity + { + IList EnlistAllOpenTabs(BrowserType browserType); + string EnlistActiveTabUrl(BrowserType browserType); + } + public class BrowserActivityAdapter : IBrowserActivity { private readonly BrowserActivityAdaptee _browserActivityAdaptee; + private readonly BrowserActivityEnumAdaptee _browserActivityEnumAdaptee; - public BrowserActivityAdapter(BrowserActivityAdaptee browserActivityAdaptee) - => _browserActivityAdaptee = browserActivityAdaptee; + public BrowserActivityAdapter(BrowserActivityAdaptee browserActivityAdaptee, + BrowserActivityEnumAdaptee browserActivityEnumAdaptee) + { + _browserActivityAdaptee = browserActivityAdaptee; + _browserActivityEnumAdaptee = browserActivityEnumAdaptee; + } public string EnlistActiveTabUrl(BrowserType browserType) { var tabUrl = _browserActivityAdaptee.GetActiveTabUrl(browserType); + + if (string.IsNullOrWhiteSpace(tabUrl)) + throw new Exception($"No URL found in {_browserActivityEnumAdaptee.ToDescriptionString(browserType)} browser"); + return tabUrl; } public IList EnlistAllOpenTabs(BrowserType browserType) { var tabs = _browserActivityAdaptee.GetOpenTabsInfos(browserType); + if (tabs == null || tabs.Count == 0) + throw new Exception($"No tabs found in {_browserActivityEnumAdaptee.ToDescriptionString(browserType)} browser"); + return tabs; } } diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs deleted file mode 100644 index e3e1cc6..0000000 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/IBrowserActivity.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; - -namespace CoreActivities.BrowserActivity -{ - public interface IBrowserActivity - { - IList EnlistAllOpenTabs(BrowserType browserType); - string EnlistActiveTabUrl(BrowserType browserType); - } -} diff --git a/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdapter.cs b/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdapter.cs index 8152012..4d82408 100644 --- a/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/DirectoryManager/DirectoryManagerAdapter.cs @@ -2,6 +2,13 @@ namespace CoreActivities.DirectoryManager { + public interface IDirectoryManager + { + string GetProgramDataDirectoryPath(string appFolder); + bool ChecknCreateDirectory(string directoryPath); + string CreateProgramDataFilePath(string folderName, string fileName); + } + public class DirectoryManagerAdapter : IDirectoryManager { private readonly DirectoryManagerAdaptee _directoryManagerAdaptee; diff --git a/CSharpLibraryTools/CoreActivities/DirectoryManager/IDirectoryManager.cs b/CSharpLibraryTools/CoreActivities/DirectoryManager/IDirectoryManager.cs deleted file mode 100644 index 905808c..0000000 --- a/CSharpLibraryTools/CoreActivities/DirectoryManager/IDirectoryManager.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace CoreActivities.DirectoryManager -{ - public interface IDirectoryManager - { - string GetProgramDataDirectoryPath(string appFolder); - bool ChecknCreateDirectory(string directoryPath); - string CreateProgramDataFilePath(string folderName, string fileName); - } -} diff --git a/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvAdapter.cs b/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvAdapter.cs index 4b12f69..e10aa0e 100644 --- a/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/EgmaCV/EgmaCvAdapter.cs @@ -4,6 +4,11 @@ namespace CoreActivities.EgmaCV { + public interface IEgmaCv + { + Task CaptureImageAsync(int camIndex, string filePath); + } + public class EgmaCvAdapter : IEgmaCv { public async Task CaptureImageAsync(int camIndex, string filePath) diff --git a/CSharpLibraryTools/CoreActivities/EgmaCV/IEgmaCv.cs b/CSharpLibraryTools/CoreActivities/EgmaCV/IEgmaCv.cs deleted file mode 100644 index aac89c1..0000000 --- a/CSharpLibraryTools/CoreActivities/EgmaCV/IEgmaCv.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace CoreActivities.EgmaCV -{ - public interface IEgmaCv - { - Task CaptureImageAsync(int camIndex, string filePath); - } -} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs index 54c9ecb..3528e25 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs @@ -7,6 +7,20 @@ namespace CoreActivities.FileManager { + public interface IFile + { + string FileName(string filePath); + bool DoesExists(string filePath); + void CreateFile(string filePath); + string GetMimeType(string fileName); + Task WriteAllLineAsync(List lines, string filePath); + Task WriteAllTextAsync(string text, string filePath); + Task AppendAllLineAsync(List lines, string filePath); + Task AppendAllTextAsync(string text, string filePath); + Task ReadAllLineAsync(string filePath); + Task ReadAllTextAsync(string filePath); + } + public class FileAdapter : IFile { public string FileName(string filePath) => Path.GetFileName(filePath); diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileInfoAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileInfoAdapter.cs index 44dbb05..bd2bdca 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileInfoAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileInfoAdapter.cs @@ -1,10 +1,17 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Text; namespace CoreActivities.FileManager { + public interface IFileInfo + { + long FileSize(string filePath); + bool IsReadOnly(string filePath); + DateTime CreatedOn(string filePath); + DateTime LastAccessOn(string filePath); + DateTime LastUpdateOn(string filePath); + } + public class FileInfoAdapter : IFileInfo { private FileInfo ObjectCreationAndValidation(string filePath) diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs index cb75882..c871271 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs @@ -6,6 +6,14 @@ namespace CoreActivities.FileManager { + public interface IFileManager + { + void CreateFile(string filePath); + byte[] ReadFileAsByte(string filePath); + void SaveByteStream(string filePath, byte[] file); + void SaveBitmapImage(string filePath, Bitmap bitmap); + } + public class FileManagerAdapter : IFileManager { private readonly IFile _file; diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs index e750c4f..e379ab6 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs @@ -5,6 +5,13 @@ namespace CoreActivities.FileManager { + public interface IFileStream + { + void WriteFileBytes(string filePath, byte[] file); + byte[] ReadFileAsByte(string filePath); + string ConvertByteToBase64String(byte[] file); + } + public class FileStreamAdapter : IFileStream { public void WriteFileBytes(string filePath, byte[] file) @@ -12,7 +19,9 @@ public void WriteFileBytes(string filePath, byte[] file) using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); fileStream.Write(file, 0, file.Length); } + public byte[] ReadFileAsByte(string filePath) => File.ReadAllBytes(filePath); + public string ConvertByteToBase64String(byte[] file) => Convert.ToBase64String(file); } } diff --git a/CSharpLibraryTools/CoreActivities/FileManager/IFile.cs b/CSharpLibraryTools/CoreActivities/FileManager/IFile.cs deleted file mode 100644 index b8b6e6b..0000000 --- a/CSharpLibraryTools/CoreActivities/FileManager/IFile.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; - -namespace CoreActivities.FileManager -{ - public interface IFile - { - string FileName(string filePath); - bool DoesExists(string filePath); - void CreateFile(string filePath); - string GetMimeType(string fileName); - Task WriteAllLineAsync(List lines, string filePath); - Task WriteAllTextAsync(string text, string filePath); - Task AppendAllLineAsync(List lines, string filePath); - Task AppendAllTextAsync(string text, string filePath); - Task ReadAllLineAsync(string filePath); - Task ReadAllTextAsync(string filePath); - } -} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/IFileInfo.cs b/CSharpLibraryTools/CoreActivities/FileManager/IFileInfo.cs deleted file mode 100644 index 068706e..0000000 --- a/CSharpLibraryTools/CoreActivities/FileManager/IFileInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace CoreActivities.FileManager -{ - public interface IFileInfo - { - long FileSize(string filePath); - bool IsReadOnly(string filePath); - DateTime CreatedOn(string filePath); - DateTime LastAccessOn(string filePath); - DateTime LastUpdateOn(string filePath); - } -} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/IFileManager.cs b/CSharpLibraryTools/CoreActivities/FileManager/IFileManager.cs deleted file mode 100644 index 6068b18..0000000 --- a/CSharpLibraryTools/CoreActivities/FileManager/IFileManager.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; - -namespace CoreActivities.FileManager -{ - public interface IFileManager - { - void CreateFile(string filePath); - byte[] ReadFileAsByte(string filePath); - void SaveByteStream(string filePath, byte[] file); - void SaveBitmapImage(string filePath, Bitmap bitmap); - } -} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/IFileStream.cs b/CSharpLibraryTools/CoreActivities/FileManager/IFileStream.cs deleted file mode 100644 index b63f080..0000000 --- a/CSharpLibraryTools/CoreActivities/FileManager/IFileStream.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace CoreActivities.FileManager -{ - public interface IFileStream - { - void WriteFileBytes(string filePath, byte[] file); - byte[] ReadFileAsByte(string filePath); - string ConvertByteToBase64String(byte[] file); - } -} diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs index 70cfd6f..6efe8fc 100644 --- a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs @@ -1,5 +1,7 @@ -using CoreActivities.FileManager; +using CoreActivities.GoogleDriveApi.Models; +using CoreActivities.GoogleDriveApi.Parms; using Google.Apis.Auth.OAuth2; +using Google.Apis.Download; using Google.Apis.Drive.v3; using Google.Apis.Drive.v3.Data; using Google.Apis.Services; @@ -13,56 +15,122 @@ namespace CoreActivities.GoogleDriveApi { public interface IIGoogleDriveApiManager { - Task UploadFileAsync(string filePath, Action uploadProgress = null); + Task GetFilesAndFolders(string nextPageToken = null, FilesListOptionalParms optional = null); + Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null); + Task DeleteAsync(string fileId, FilesDeleteOptionalParms optional = null); + Task DownloadAsync(File file, string filePath, Action downloadProgress = null); } public class GoogleDriveApiManagerAdapter : IIGoogleDriveApiManager { private readonly string _authfilePath; private readonly string _directoryId; - private readonly IFile _file; - private readonly IFileInfo _fileInfo; - private long _fileSize; + private readonly DriveService _driveService; + private long _fileSize = 0; + private long _uploaded = 0; + private long _downloaded = 0; public GoogleDriveApiManagerAdapter(string authfilePath, - string directoryId, - IFile file, - IFileInfo fileInfo) + string directoryId) { _authfilePath = authfilePath; _directoryId = directoryId; - _file = file; - _fileInfo = fileInfo; - _fileSize = 0; - } - - public async Task UploadFileAsync(string filePath, Action uploadProgress = null) - { - //Gathering file size at the very begining - _fileSize = _fileInfo.FileSize(filePath); var credential = GoogleCredential.FromFile(_authfilePath) .CreateScoped(DriveService.ScopeConstants.Drive); - var service = new DriveService(new BaseClientService.Initializer() + _driveService = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential }); + } + + public async Task GetFilesAndFolders(string nextPageToken = null, FilesListOptionalParms optional = null) + { + + return await Task.Run(() => + { + try + { + var files = new List(); + + // Initial validation. + if (_driveService == null) + throw new ArgumentNullException("service"); + + //Providing default query parameter 'Q' to retrive only specific folder or files + var defaultQueryPatter = $"'{_directoryId}' in parents"; + + if (!string.IsNullOrWhiteSpace(_directoryId)) + { + if (optional == null) + optional = new FilesListOptionalParms + { + Q = defaultQueryPatter + }; + else if (optional != null && string.IsNullOrWhiteSpace(optional.Q)) + optional.Q = defaultQueryPatter; + } + + // Building the initial request. + var request = _driveService.Files.List(); + + // Applying optional parameters to the request. + request = (FilesResource.ListRequest)ApplyOptionalParams(request, optional); + + // Requesting data. + if (!string.IsNullOrWhiteSpace(nextPageToken)) + request.PageToken = nextPageToken; + + var fileFeed = request.Execute(); + + foreach (var item in fileFeed.Files) + files.Add(item); + + var data = new GoogleDriveFiles + { + NextPageToken = fileFeed.NextPageToken, + Files = files + }; + + return data; + } + catch (Exception ex) + { + throw new InvalidOperationException(ex.Message); + } + }); + + } - if (!string.IsNullOrWhiteSpace(filePath) && _file.DoesExists(filePath)) + public async Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null) + { + //Initialization + _uploaded = 0; + + // Initial validation. + if (_driveService == null) + throw new ArgumentNullException("service"); + + if (uploadFileInfo != null && !string.IsNullOrWhiteSpace(uploadFileInfo.FilePath) && + !string.IsNullOrWhiteSpace(uploadFileInfo.FileName) && + !string.IsNullOrWhiteSpace(uploadFileInfo.MimeType) && + uploadFileInfo.FileSize != 0) { + _fileSize = uploadFileInfo.FileSize; + // Upload file Metadata var fileMetadata = new File() { - Name = _file.FileName(filePath), + Name = uploadFileInfo.FileName, Parents = new List() { _directoryId } }; // Create a new file on Google Drive - await using var fsSource = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); + await using var fsSource = new System.IO.FileStream(uploadFileInfo.FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); // Create a new file, with metadata and stream. - var request = service.Files.Create(fileMetadata, fsSource, _file.GetMimeType(filePath)); + var request = _driveService.Files.Create(fileMetadata, fsSource, uploadFileInfo.MimeType); request.Fields = "*"; request.ChunkSize = 262144; if (uploadProgress != null) @@ -78,12 +146,97 @@ public async Task UploadFileAsync(string filePath, Action + { + try + { + // Initial validation. + if (_driveService == null) + throw new ArgumentNullException("service"); + + if (string.IsNullOrWhiteSpace(fileId)) + throw new ArgumentNullException("fileId"); + + // Building the initial request. + var request = _driveService.Files.Delete(fileId); + + // Applying optional parameters to the request. + request = (FilesResource.DeleteRequest)ApplyOptionalParams(request, optional); + + // Requesting data. + request.Execute(); + } + catch (Exception ex) + { + throw new Exception("Request Files.Delete failed.", ex); + } + }); + } + + public async Task DownloadAsync(File file, string filePath, Action downloadProgress = null) + { + if (file == null || string.IsNullOrWhiteSpace(filePath)) + throw new Exception("Provide valid file object and file path"); + + try + { + var request = _driveService.Files.Get(file.Id); + if (downloadProgress != null) + request.MediaDownloader.ProgressChanged += downloadProgress; + else + request.MediaDownloader.ProgressChanged += DownloadProgress; + + using var output = System.IO.File.Create(filePath); + await request.DownloadAsync(output); + } + catch (Exception e) + { + Console.WriteLine("An error occurred: " + e.Message); + } + } + + #region Private section + public void ClearCurrentConsoleLine() + { + if (Console.CursorTop > 0) + Console.SetCursorPosition(0, Console.CursorTop - 1); + + int currentLineCursor = Console.CursorTop; + Console.SetCursorPosition(0, Console.CursorTop); + Console.Write(new string(' ', Console.WindowWidth)); + Console.SetCursorPosition(0, currentLineCursor); } private void UploadProgress(IUploadProgress progress) { - DrawTextProgressBar(progress.BytesSent, _fileSize); + PrintUploadProgressByPercentage(progress.BytesSent, _fileSize); + } + + private void DownloadProgress(IDownloadProgress progress) + { + _downloaded = 0; + PrintDownloadProgress(progress.BytesDownloaded); + } + + private void PrintUploadProgressByPercentage(long progress, long total) + { + ClearCurrentConsoleLine(); + + _uploaded += progress; + Console.WriteLine($"Uploaded: {100 * _uploaded / total}%"); + } + + private void PrintDownloadProgress(long progress) + { + ClearCurrentConsoleLine(); + + _downloaded += progress; + Console.WriteLine($"Downloaded: {_downloaded / 1024}%"); } private void DrawTextProgressBar(long progress, long total) @@ -118,5 +271,24 @@ private void DrawTextProgressBar(long progress, long total) Console.BackgroundColor = ConsoleColor.Black; Console.Write(progress.ToString() + " of " + total.ToString() + " "); //blanks at the end remove any excess } + + private object ApplyOptionalParams(object request, object optional) + { + if (optional == null) + return request; + + System.Reflection.PropertyInfo[] optionalProperties = (optional.GetType()).GetProperties(); + + foreach (System.Reflection.PropertyInfo property in optionalProperties) + { + // Copy value from optional parms to the request. They should have the same names and datatypes. + System.Reflection.PropertyInfo piShared = (request.GetType()).GetProperty(property.Name); + if (property.GetValue(optional, null) != null) // TODO Test that we do not add values for items that are null + piShared.SetValue(request, property.GetValue(optional, null), null); + } + + return request; + } + #endregion } } diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Models/GoogleDriveFiles.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Models/GoogleDriveFiles.cs new file mode 100644 index 0000000..2a7d067 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Models/GoogleDriveFiles.cs @@ -0,0 +1,11 @@ +using Google.Apis.Drive.v3.Data; +using System.Collections.Generic; + +namespace CoreActivities.GoogleDriveApi.Models +{ + public class GoogleDriveFiles + { + public string NextPageToken { get; set; } + public IList Files { get; set; } + } +} diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Models/UploadFileInfo.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Models/UploadFileInfo.cs new file mode 100644 index 0000000..473c924 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Models/UploadFileInfo.cs @@ -0,0 +1,10 @@ +namespace CoreActivities.GoogleDriveApi.Models +{ + public class UploadFileInfo + { + public string FilePath { get; set; } + public string FileName { get; set; } + public long FileSize { get; set; } + public string MimeType { get; set; } + } +} diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Parms/FilesDeleteOptionalParms.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Parms/FilesDeleteOptionalParms.cs new file mode 100644 index 0000000..ea133d7 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Parms/FilesDeleteOptionalParms.cs @@ -0,0 +1,8 @@ +namespace CoreActivities.GoogleDriveApi.Parms +{ + public class FilesDeleteOptionalParms + { + /// Whether the requesting application supports Team Drives. + public bool? SupportsTeamDrives { get; set; } + } +} diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Parms/FilesListOptionalParms.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Parms/FilesListOptionalParms.cs new file mode 100644 index 0000000..61beff6 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/Parms/FilesListOptionalParms.cs @@ -0,0 +1,28 @@ +namespace CoreActivities.GoogleDriveApi.Parms +{ + public class FilesListOptionalParms + { + /// Comma-separated list of bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'teamDrive' and 'allTeamDrives'. 'allTeamDrives' must be combined with 'user'; all other values must be used in isolation. Prefer 'user' or 'teamDrive' to 'allTeamDrives' for efficiency. + public string Corpora { get; set; } + /// The source of files to list. Deprecated: use 'corpora' instead. + public string Corpus { get; set; } + /// Whether Team Drive items should be included in results. + public bool? IncludeTeamDriveItems { get; set; } + /// A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored. + public string OrderBy { get; set; } + /// The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached. + public int? PageSize { get; set; } + /// The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response. + public string PageToken { get; set; } + /// A query for filtering the file results. See the "Search for Files" guide for supported syntax. + public string Q { get; set; } + /// A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'. + public string Spaces { get; set; } + /// Whether the requesting application supports Team Drives. + public bool? SupportsTeamDrives { get; set; } + /// ID of Team Drive to search. + public string TeamDriveId { get; set; } + // Provide fields to retrive specified fields + public string Fields { get; set; } + } +} diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/source.txt b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/source.txt new file mode 100644 index 0000000..8924a49 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/source.txt @@ -0,0 +1,14 @@ +jskeet commented on Mar 7, 2020 +------------------------------- +https://github.com/googleapis/google-api-dotnet-client/issues/1525 + +Others: +======= +GitHub +------ +https://github.com/LindaLawton/Google-Dotnet-Samples/blob/master/Samples/Drive%20API/v3/FilesSample.cs +https://gist.github.com/LindaLawton/9e512d95ef874d0c4dbc8d0783dcc4bc + +Google Drive API with C# .net +----------------------------- +https://www.daimto.com/google-drive-api-c-download/ \ No newline at end of file From 455904d6d06937b4288da2b7bd011d99a982cd6c Mon Sep 17 00:00:00 2001 From: abbirku Date: Mon, 30 Aug 2021 22:46:49 +0600 Subject: [PATCH 17/39] Create active program implementation --- .../CSharpLibraryTools/ActiveProgramImp.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 CSharpLibraryTools/CSharpLibraryTools/ActiveProgramImp.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/ActiveProgramImp.cs b/CSharpLibraryTools/CSharpLibraryTools/ActiveProgramImp.cs new file mode 100644 index 0000000..0bb2038 --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/ActiveProgramImp.cs @@ -0,0 +1,20 @@ +using CoreActivities.ActiveProgram; +using System; + +namespace CSharpLibraryTools +{ + public class ActiveProgramImp + { + private readonly IActiveProgram _activeProgram; + + public ActiveProgramImp(IActiveProgram activeProgram) + => _activeProgram = activeProgram; + + public void Run() + { + Console.WriteLine($"Active Program: {_activeProgram.CaptureActiveProgramTitle()}"); + Console.WriteLine(); + Console.WriteLine(); + } + } +} From 78b90242b53a5905ad1ea4c65cae234c16b77914 Mon Sep 17 00:00:00 2001 From: abbirku Date: Mon, 30 Aug 2021 23:21:19 +0600 Subject: [PATCH 18/39] Create BrowserActivityImp --- .../{ => Implementations}/ActiveProgramImp.cs | 0 .../Implementations/BrowseActivityImp.cs | 25 +++++++++++++++++++ .../Implementations/DirectoryManagerImg.cs | 10 ++++++++ 3 files changed, 35 insertions(+) rename CSharpLibraryTools/CSharpLibraryTools/{ => Implementations}/ActiveProgramImp.cs (100%) create mode 100644 CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs create mode 100644 CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/ActiveProgramImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/ActiveProgramImp.cs similarity index 100% rename from CSharpLibraryTools/CSharpLibraryTools/ActiveProgramImp.cs rename to CSharpLibraryTools/CSharpLibraryTools/Implementations/ActiveProgramImp.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs new file mode 100644 index 0000000..8379bbd --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs @@ -0,0 +1,25 @@ +using CoreActivities.BrowserActivity; +using System; + +namespace CSharpLibraryTools +{ + public class BrowseActivityImp + { + private readonly IBrowserActivity _browserActivity; + + public BrowseActivityImp(IBrowserActivity browserActivity) + { + _browserActivity = browserActivity; + } + + public void Run() + { + var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); + Console.WriteLine($"Active URL: {activeUrl}"); + + var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Chrome); + foreach (var item in tabs) + Console.WriteLine(item); + } + } +} diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs new file mode 100644 index 0000000..4d2c216 --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CSharpLibraryTools.Implementations +{ + class DirectoryManagerImg + { + } +} From a9e32829d185f97c26a6494247eddf039cef95a6 Mon Sep 17 00:00:00 2001 From: abbirku Date: Mon, 30 Aug 2021 23:33:18 +0600 Subject: [PATCH 19/39] Create Dirrectory Manager Implementation --- .../Implementations/DirectoryManagerImg.cs | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs index 4d2c216..20cec0c 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs @@ -1,10 +1,37 @@ -using System; +using CoreActivities.DirectoryManager; +using System; using System.Collections.Generic; using System.Text; namespace CSharpLibraryTools.Implementations { - class DirectoryManagerImg + public class DirectoryManagerImg { + private readonly IDirectoryManager _directoryManager; + + public DirectoryManagerImg(IDirectoryManager directoryManager) + { + _directoryManager = directoryManager; + } + + public void Run() + { + //The following prints the windows program data directorty path + Console.WriteLine($"ProgramData Directory: {_directoryManager.GetProgramDataDirectoryPath("Foobar")}"); + + //The following creates a directory under a drive and returns bool as created or not + var isCreated = _directoryManager.ChecknCreateDirectory("Foobar"); + if(isCreated) + Console.WriteLine("Has created Foobar under C:\\ProgramData"); + else + Console.WriteLine("The directory already exists. No need to create it."); + + //The following prints the file path of program data directory + var filePath = _directoryManager.CreateProgramDataFilePath("Foobar", "file.txt"); + Console.WriteLine($"File path: {filePath}"); + + Console.WriteLine(); + Console.WriteLine(); + } } } From ecb32d4367e87c427a458fc91ddc38d29307b1f0 Mon Sep 17 00:00:00 2001 From: abbirku Date: Mon, 30 Aug 2021 23:51:45 +0600 Subject: [PATCH 20/39] Create EgmaCv Implementation --- .../Implementations/EgmaCvImp.cs | 30 +++++++++++++++++++ .../CoreActivities/EgmaCV/source.txt | 4 +++ .../CoreActivities/GoogleDriveApi/source.txt | 8 ++--- 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs create mode 100644 CSharpLibraryTools/CoreActivities/EgmaCV/source.txt diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs new file mode 100644 index 0000000..4908e99 --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs @@ -0,0 +1,30 @@ +using CoreActivities.DirectoryManager; +using CoreActivities.EgmaCV; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace CSharpLibraryTools.Implementations +{ + public class EgmaCvImp + { + private readonly IDirectoryManager _directoryManager; + private readonly IEgmaCv _egmaCv; + + public EgmaCvImp(IDirectoryManager directoryManager, + IEgmaCv egmaCv) + { + _directoryManager = directoryManager; + _egmaCv = egmaCv; + } + + public async Task Run() + { + //The following capture image from webcam and store it on a file + var fileName = $"{Guid.NewGuid()}.jpg"; + var filePath = _directoryManager.CreateProgramDataFilePath("CsLibDropBox", fileName); + await _egmaCv.CaptureImageAsync(0, filePath); + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/EgmaCV/source.txt b/CSharpLibraryTools/CoreActivities/EgmaCV/source.txt new file mode 100644 index 0000000..fbf5cd9 --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/EgmaCV/source.txt @@ -0,0 +1,4 @@ +Source +====== +https://blog.dotnetframework.org/2020/12/29/capture-a-webcam-image-using-net-core-and-opencv/ +https://blog.dotnetframework.org/2020/12/30/record-mp4-h264-video-from-a-webcam-in-c-net-core/ \ No newline at end of file diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/source.txt b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/source.txt index 8924a49..0e8ed6c 100644 --- a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/source.txt +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/source.txt @@ -1,14 +1,12 @@ jskeet commented on Mar 7, 2020 -------------------------------- +=============================== https://github.com/googleapis/google-api-dotnet-client/issues/1525 -Others: -======= GitHub ------- +====== https://github.com/LindaLawton/Google-Dotnet-Samples/blob/master/Samples/Drive%20API/v3/FilesSample.cs https://gist.github.com/LindaLawton/9e512d95ef874d0c4dbc8d0783dcc4bc Google Drive API with C# .net ------------------------------ +============================= https://www.daimto.com/google-drive-api-c-download/ \ No newline at end of file From 9be564a95a33e5728bb22ae32895847b097244a7 Mon Sep 17 00:00:00 2001 From: abbirku Date: Tue, 31 Aug 2021 00:07:29 +0600 Subject: [PATCH 21/39] Create File Manager Implementation --- .../Implementations/FileManagerImp.cs | 14 ++++++++++++++ .../FileManager/FileManagerAdapter.cs | 2 -- .../CoreActivities/FileManager/Notes.txt | 6 ++++++ 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs create mode 100644 CSharpLibraryTools/CoreActivities/FileManager/Notes.txt diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs new file mode 100644 index 0000000..361ee78 --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CSharpLibraryTools.Implementations +{ + public class FileManagerImp + { + public FileManagerImp() + { + + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs index c871271..58aed19 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs @@ -1,8 +1,6 @@ using System; -using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; -using System.Text; namespace CoreActivities.FileManager { diff --git a/CSharpLibraryTools/CoreActivities/FileManager/Notes.txt b/CSharpLibraryTools/CoreActivities/FileManager/Notes.txt new file mode 100644 index 0000000..a28b36b --- /dev/null +++ b/CSharpLibraryTools/CoreActivities/FileManager/Notes.txt @@ -0,0 +1,6 @@ +Notes: +====== +1. IFile and IFileManager both have CreateFile() method. But it is better to use IFileManager->CreateFile() as it has more control + for creating a file. +2. IFileStream and IFileManager both have ReadFileAsByte() method. But it is better to use IFileManager->ReadFileAsByte() as it has more control + for reading bytes from a file. From ed3738d882d39ee3773500c4ef80398b4f23247b Mon Sep 17 00:00:00 2001 From: abbirku Date: Tue, 31 Aug 2021 23:02:41 +0600 Subject: [PATCH 22/39] Provide implementation of FileManager, RunningProgram & ScreenCapture --- .../Implementations/FileManagerImp.cs | 90 ++++++++++++++++++- .../Implementations/RunningProgramImp.cs | 29 ++++++ .../Implementations/ScreenCaptureImp.cs | 41 +++++++++ .../CoreActivities/FileManager/FileAdapter.cs | 13 +++ .../FileManager/FileManagerAdapter.cs | 12 +-- .../FileManager/FileManagerPackage.cs | 5 -- .../FileManager/FileStreamAdapter.cs | 27 ------ 7 files changed, 175 insertions(+), 42 deletions(-) create mode 100644 CSharpLibraryTools/CSharpLibraryTools/Implementations/RunningProgramImp.cs create mode 100644 CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs delete mode 100644 CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs index 361ee78..08ca101 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs @@ -1,14 +1,100 @@ -using System; +using CoreActivities.DirectoryManager; +using CoreActivities.EgmaCV; +using CoreActivities.FileManager; +using System; using System.Collections.Generic; +using System.Drawing.Drawing2D; using System.Text; +using System.Threading.Tasks; namespace CSharpLibraryTools.Implementations { public class FileManagerImp { - public FileManagerImp() + private readonly IDirectoryManager _directoryManager; + private readonly IFile _file; + private readonly IFileInfo _fileInfo; + private readonly IFileManager _fileManager; + private readonly IEgmaCv _egmaCv; + + public FileManagerImp(IDirectoryManager directoryManager, + IFile file, + IFileInfo fileInfo, + IFileManager fileManager, + IEgmaCv egmaCv) + { + _directoryManager = directoryManager; + _file = file; + _fileInfo = fileInfo; + _fileManager = fileManager; + _egmaCv = egmaCv; + } + + public async Task Run() { + #region IFile implementation + var textList = new List + { + "This is me", + "I am the Dojo" + }; + + var singleText = "Hmm gots yoo"; + var folder = "CSharpLib"; + + //The following creates CSharpLib folder under C:\ProgramData and returns full path of specified file + var filePath = _directoryManager.CreateProgramDataFilePath(folder, "file.txt"); + var fileName = _file.FileName(filePath); + + Console.WriteLine($"FilePath: {filePath}, FileName: {fileName}"); + + //Checks the file does exists. If not then create + if (_file.DoesExists(filePath)) + _file.CreateFile(filePath); + + //Prints created file mime type + Console.WriteLine($"MimeType: {_file.GetMimeType(filePath)}"); + + //WriteAllTextAsync is same as WriteAllLineAsync but just write a string as text + //Note: Using WriteAllLineAsync and WriteAllTextAsync will override text of each other + await _file.WriteAllLineAsync(textList, filePath); + + //The following just add text on new line on a file + await _file.AppendAllLineAsync(textList, filePath); + await _file.AppendAllTextAsync(singleText, filePath); + + var allLines = await _file.ReadAllLineAsync(filePath); + var singleLine = await _file.ReadAllTextAsync(filePath); + + Console.WriteLine("ReadAllLineAsync"); + foreach (var item in allLines) + Console.WriteLine(item); + + Console.WriteLine("ReadAllTextAsync"); + Console.WriteLine(singleLine); + + Console.WriteLine("Printing base 64 string"); + var bytes = _file.ReadFileAsByte(filePath); + Console.WriteLine(_file.ConvertByteToBase64String(bytes)); + var streanFilePath = _directoryManager.CreateProgramDataFilePath(folder, "streanFile.txt"); + _file.WriteBytesStream(streanFilePath, bytes); + #endregion + + #region IFileInfo Implementation + Console.WriteLine($"Filesize: {_fileInfo.FileSize(filePath)}"); + Console.WriteLine($"IsReadonly: {_fileInfo.IsReadOnly(filePath)}"); + Console.WriteLine($"CreatedOn: {_fileInfo.CreatedOn(filePath)}"); + Console.WriteLine($"LastUpdateOn: {_fileInfo.LastUpdateOn(filePath)}"); + Console.WriteLine($"LastAccessOn: {_fileInfo.LastAccessOn(filePath)}"); + #endregion + #region IFileManager Implementation + var writtenTextFilePath = _directoryManager.CreateProgramDataFilePath(folder, "written_text.txt"); + _fileManager.CreateFile(writtenTextFilePath); + + var readBytes = _fileManager.ReadFileAsByte(filePath); + _fileManager.SaveByteStream(writtenTextFilePath, readBytes); + #endregion } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/RunningProgramImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/RunningProgramImp.cs new file mode 100644 index 0000000..504dbbc --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/RunningProgramImp.cs @@ -0,0 +1,29 @@ +using CoreActivities.RunningPrograms; +using System; + +namespace CSharpLibraryTools.Implementations +{ + public class RunningProgramImp + { + private readonly IRunningPrograms _runningPrograms; + + public RunningProgramImp(IRunningPrograms runningPrograms) + { + _runningPrograms = runningPrograms; + } + + public void Run() + { + var runningProcesses = _runningPrograms.GetRunningProcessList(); + var runningPrograms = _runningPrograms.GetRunningProgramsList(); + + Console.WriteLine("Running Processes"); + foreach (var item in runningProcesses) + Console.WriteLine(item); + + Console.WriteLine("Running Programs"); + foreach (var item in runningPrograms) + Console.WriteLine(item); + } + } +} diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs new file mode 100644 index 0000000..b3c8678 --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs @@ -0,0 +1,41 @@ +using CoreActivities.DirectoryManager; +using CoreActivities.FileManager; +using CoreActivities.ScreenCapture; +using System; +using System.Collections.Generic; +using System.Text; + +namespace CSharpLibraryTools.Implementations +{ + public class ScreenCaptureImp + { + private readonly IScreenCapture _screenCapture; + private readonly IDirectoryManager _directoryManager; + private readonly IFileManager _fileManager; + private readonly IFile _file; + + public ScreenCaptureImp(IScreenCapture screenCapture, + IDirectoryManager directoryManager, + IFileManager fileManager, + IFile file) + { + _screenCapture = screenCapture; + _directoryManager = directoryManager; + _fileManager = fileManager; + _file = file; + } + + public void Run() + { + var folder = "CSharpLib"; + + Console.WriteLine("Capturing and storing image"); + + var filePath = _directoryManager.CreateProgramDataFilePath(folder, $"{Guid.NewGuid()}.jpeg"); + _fileManager.CreateFile(filePath); + + var capturedScreen = _screenCapture.CaptureUserScreen(1920, 1080); + _fileManager.SaveBitmapImage(filePath, capturedScreen); + } + } +} diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs index 3528e25..f9e8eb0 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs @@ -13,6 +13,9 @@ public interface IFile bool DoesExists(string filePath); void CreateFile(string filePath); string GetMimeType(string fileName); + byte[] ReadFileAsByte(string filePath); // + string ConvertByteToBase64String(byte[] file); // + void WriteBytesStream(string filePath, byte[] file); // Task WriteAllLineAsync(List lines, string filePath); Task WriteAllTextAsync(string text, string filePath); Task AppendAllLineAsync(List lines, string filePath); @@ -38,6 +41,16 @@ public string GetMimeType(string fileName) return contentType; } + public byte[] ReadFileAsByte(string filePath) => File.ReadAllBytes(filePath); + + public string ConvertByteToBase64String(byte[] file) => Convert.ToBase64String(file); + + public void WriteBytesStream(string filePath, byte[] file) + { + using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); + fileStream.Write(file, 0, file.Length); + } + public async Task WriteAllLineAsync(List lines, string filePath) => await File.WriteAllLinesAsync(filePath, lines); public async Task WriteAllTextAsync(string text, string filePath) => await File.WriteAllTextAsync(filePath, text); diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs index 58aed19..14a41ec 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs @@ -15,13 +15,9 @@ public interface IFileManager public class FileManagerAdapter : IFileManager { private readonly IFile _file; - private readonly IFileStream _fileStream; - public FileManagerAdapter(IFile file, IFileStream fileStream) - { - _file = file; - _fileStream = fileStream; - } + public FileManagerAdapter(IFile file) + => _file = file; public void CreateFile(string path) { @@ -40,7 +36,7 @@ public byte[] ReadFileAsByte(string filePath) if (!_file.DoesExists(filePath)) throw new Exception("File does not exists"); - return _fileStream.ReadFileAsByte(filePath); + return _file.ReadFileAsByte(filePath); } public void SaveByteStream(string filePath, byte[] file) @@ -48,7 +44,7 @@ public void SaveByteStream(string filePath, byte[] file) if (string.IsNullOrWhiteSpace(filePath) || file == null || file.Length == 0) throw new Exception("Provide valid file path and byte array to save the file stream."); - _fileStream.WriteFileBytes(filePath, file); + _file.WriteBytesStream(filePath, file); } public void SaveBitmapImage(string filePath, Bitmap bitmap) diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerPackage.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerPackage.cs index 1a62bbb..3834d40 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerPackage.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerPackage.cs @@ -1,7 +1,4 @@ using Autofac; -using System; -using System.Collections.Generic; -using System.Text; namespace CoreActivities.FileManager { @@ -15,8 +12,6 @@ protected override void Load(ContainerBuilder builder) .InstancePerLifetimeScope(); builder.RegisterType().As() .InstancePerLifetimeScope(); - builder.RegisterType().As() - .InstancePerLifetimeScope(); base.Load(builder); } diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs deleted file mode 100644 index e379ab6..0000000 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileStreamAdapter.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace CoreActivities.FileManager -{ - public interface IFileStream - { - void WriteFileBytes(string filePath, byte[] file); - byte[] ReadFileAsByte(string filePath); - string ConvertByteToBase64String(byte[] file); - } - - public class FileStreamAdapter : IFileStream - { - public void WriteFileBytes(string filePath, byte[] file) - { - using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); - fileStream.Write(file, 0, file.Length); - } - - public byte[] ReadFileAsByte(string filePath) => File.ReadAllBytes(filePath); - - public string ConvertByteToBase64String(byte[] file) => Convert.ToBase64String(file); - } -} From ff195f506e7bb347cc9bb29823138e72cf9e36d0 Mon Sep 17 00:00:00 2001 From: abbirku Date: Tue, 31 Aug 2021 23:53:20 +0600 Subject: [PATCH 23/39] Provide appsettings.json, webcamsync.json and AppSettingsInfo.cs --- .../CSharpLibraryTools/AppSettingsInfo.cs | 31 +++++++++++++++++++ .../CSharpLibraryTools.csproj | 5 +++ .../CSharpLibraryTools/Program.cs | 5 ++- .../CSharpLibraryTools/appsettings.json | 5 +++ .../CSharpLibraryTools/webcamsync.json | 12 +++++++ .../GoogleDriveApi/GoogleDriveApiManager.cs | 4 +-- .../GoogleDriveApi/GoogleDriveApiPackage.cs | 16 ++++++++-- 7 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 CSharpLibraryTools/CSharpLibraryTools/AppSettingsInfo.cs create mode 100644 CSharpLibraryTools/CSharpLibraryTools/appsettings.json create mode 100644 CSharpLibraryTools/CSharpLibraryTools/webcamsync.json diff --git a/CSharpLibraryTools/CSharpLibraryTools/AppSettingsInfo.cs b/CSharpLibraryTools/CSharpLibraryTools/AppSettingsInfo.cs new file mode 100644 index 0000000..79f04f5 --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/AppSettingsInfo.cs @@ -0,0 +1,31 @@ +using Microsoft.Extensions.Configuration; +using System.IO; + +namespace CSharpLibraryTools +{ + /// + /// Note: While adding appsetting.json in console app, goto properties and select "Copy if newer" for "Copy to Output Directory" option. + /// Otherwise it will throw exception + /// + public static class AppSettingsInfo + { + public static string ConfigFileName { get; set; } = "appsettings.json"; + public static string CurrentDirectory = Directory.GetCurrentDirectory(); + + // Get a valued stored in the appsettings. + // Pass in a key like TestArea:TestKey to get Value + public static T GetCurrentValue(string Key) + { + var builder = new ConfigurationBuilder() + .SetBasePath(CurrentDirectory) + .AddJsonFile(ConfigFileName, optional: false, reloadOnChange: true) + .AddEnvironmentVariables(); + + IConfigurationRoot configuration = builder.Build(); + + return configuration.GetValue(Key); + } + + public static string CreateGoogleDriveAuthFile(string fileName) => $"{CurrentDirectory}\\{fileName}"; + } +} diff --git a/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj b/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj index 626d4de..e826867 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj +++ b/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj @@ -7,6 +7,11 @@ + + + + + diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index f87d79b..a94bad7 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -15,6 +15,9 @@ class Program { private static IContainer CompositionRoot() { + var authFilePath = AppSettingsInfo.CreateGoogleDriveAuthFile(AppSettingsInfo.GetCurrentValue("AuthFileName")); + var directoryId = AppSettingsInfo.GetCurrentValue("DirectoryId"); + var builder = new ContainerBuilder(); builder.RegisterType(); @@ -23,7 +26,7 @@ private static IContainer CompositionRoot() builder.RegisterModule(new DirectoryManagerPackage()); builder.RegisterModule(new EgmaCvPackage()); builder.RegisterModule(new FileManagerPackage()); - builder.RegisterModule(new GoogleDriveApiPackage()); + builder.RegisterModule(new GoogleDriveApiPackage(authFilePath, directoryId)); builder.RegisterModule(new RunningProgramPackage()); builder.RegisterModule(new ScreenCapturePackage()); diff --git a/CSharpLibraryTools/CSharpLibraryTools/appsettings.json b/CSharpLibraryTools/CSharpLibraryTools/appsettings.json new file mode 100644 index 0000000..f3aaee5 --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/appsettings.json @@ -0,0 +1,5 @@ +{ + "FolderName": "WebCamSync", + "AuthFileName": "webcamsync.json", + "DirectoryId": "1UCNJUVNESqok8ziZUpsQB7ggtNj5nf3O" +} \ No newline at end of file diff --git a/CSharpLibraryTools/CSharpLibraryTools/webcamsync.json b/CSharpLibraryTools/CSharpLibraryTools/webcamsync.json new file mode 100644 index 0000000..fc39bb9 --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/webcamsync.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "webcamsync", + "private_key_id": "a4fd4fb5c2719cedf20d7a98182616dd55dcb574", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC2D3MqeIoOEVo6\nJaoyEO+0BhaWdptYoWlT+wvGGO6U3sBJ1XNj0jB90+f9Kb6dGwBAueraV0+HZb6p\nOCzrUYa0rZm+AwbgAdXc+DwXfAFUspQUtRTf4zPfcDFSyHmMXr3XqL4sY/4CUmLC\nTdzm21uVClekSGjJcRRjfJQbjR6kZLzm6AVSsALjZxNXVtWlgbVnBrV/8Uo+Foji\nbM8OP3rRy751+Oy2ndSoBvplazxSqZDqr48tma2Fd7PJnuYOBBUz1cagAUOSCwlE\nMpMgAAIxYI9ynjf0KCbYofSzodOlTfMklWtMhHFwyI5UdGMONsbAROGBzL43G5Dx\ny6idUKDLAgMBAAECggEAHA5idYuQ3t0etfJC+acxgWEkzvglNXHebPI1nMgP0EJJ\niLdLqnjkPyfOSu3JcaWNEuxzvEUTPO7ZhHNjPLpaE3LjS+xkfVXbEsvwWsAh5l8E\nwfIr7tqxDkBYYYUCcjbRc7AN6oJYTRxMGtxr6+mnAd9PpUIBX/W8qh4zJtHHBJc8\nitfCYJEVqFbQxo8Vc9nLIlf5N9ITQisD+oLsqUBjbhAOac6YfubCmhr8LoEqrPnm\n5z5Q272y3sPvAlcgY/b7O1J3gBcCVFLvrGKu6YhUgaixML9Ui7b43RuchEwmuF50\n4CAyWuca3vFoBtSldCs2WapF3VveM5mjWtMqrXqUOQKBgQD1pz7SZjPMwLqh/C+1\nHIWhKDSgb38mvyTOxW6g9jf7RELcY4e81tPxes8so2IAsszAbrlavkA3EoirzqeH\nBqnmYIo+XX9LRDyRU9pQi7XUdBKyjyADbMH0TywrVxtU9/0n5R2PeS9Gj4jTX6b7\nVB7mW0HyF48KbCAaEbxo1moXSQKBgQC9uoOXA5C5jZDfyXHTpOykhYNMvvH9q7oS\nfNXY67uW9nmS2dpcKCZrX6upRSOAVrT1QptX1Oqm6jM1s2fyk21quihd4HmRtoYw\neauIXnHlzX8RFM58pGjH6NGxylCn2p7LqgDM9N5rOVnQXn+ODrZwbH+lRPYRY/KU\nwt78o7/TcwKBgQCz4qe/PLYb7tn8OobY8izsqVt4TI1o2znh7HOpjQPLjN4FMyE3\n6HzFbS/+uRnP9x62n5490+mEKp9IaIkG+Js7p2A0cRUBEdPke+n3Z4dcLy9t8B76\nQw74j22Bw0SxgPOx3jY6VPyIiB0i4/2MN7p050iwNg46DJmpXWmBv9lqeQKBgD0l\nG/2SP5UdQ6Brqox77WwEP1F/hDutmXUV2FFlf3piisHCBfaHVgJqvcb6qjtVNlKI\nmcnPq6QJfGGFJS3vR2cLAbFng6ZrPYnn3FlBntFhzd6yZu2SitZKeTIkMqQ199FJ\nQ6LKE9hYjlJx8gfVRAStYuHffLIUFPzOZNDk8RBzAoGAEbG9uLksc94qQxLbMOpi\nmbgCYCLLZ4z9npDLatQEMxBMy0JFG8vfoPyfD44fDCl2ubIzdZ8+P0twNxF2bEgg\nM5kg4uo7ZvHeCCEh0kPV78pGA6a1z5jqsVtv29CAx4Pa9C9ecAgCLH9POi9BIRWt\n2kUG0F6B7AesTnjXIVht8jE=\n-----END PRIVATE KEY-----\n", + "client_email": "webcamdatasnc@webcamsync.iam.gserviceaccount.com", + "client_id": "104904592306240427592", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/webcamdatasnc%40webcamsync.iam.gserviceaccount.com" +} diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs index 6efe8fc..39fb921 100644 --- a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs @@ -13,7 +13,7 @@ namespace CoreActivities.GoogleDriveApi { - public interface IIGoogleDriveApiManager + public interface IGoogleDriveApiManager { Task GetFilesAndFolders(string nextPageToken = null, FilesListOptionalParms optional = null); Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null); @@ -21,7 +21,7 @@ public interface IIGoogleDriveApiManager Task DownloadAsync(File file, string filePath, Action downloadProgress = null); } - public class GoogleDriveApiManagerAdapter : IIGoogleDriveApiManager + public class GoogleDriveApiManagerAdapter : IGoogleDriveApiManager { private readonly string _authfilePath; private readonly string _directoryId; diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiPackage.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiPackage.cs index 83248ef..937c5b8 100644 --- a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiPackage.cs +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiPackage.cs @@ -4,10 +4,22 @@ namespace CoreActivities.GoogleDriveApi { public class GoogleDriveApiPackage : Module { + private readonly string _authfilePath; + private readonly string _directoryId; + + public GoogleDriveApiPackage(string authfilePath, + string directoryId) + { + _authfilePath = authfilePath; + _directoryId = directoryId; + } + protected override void Load(ContainerBuilder builder) { - builder.RegisterType().As() - .InstancePerLifetimeScope(); + builder.RegisterType().As() + .WithParameter("authfilePath", _authfilePath) + .WithParameter("directoryId", _directoryId) + .InstancePerLifetimeScope(); base.Load(builder); } From 58fd6452079bc0fdbea64a2bebce9afd78b6d6a4 Mon Sep 17 00:00:00 2001 From: abbirku Date: Thu, 2 Sep 2021 10:20:20 +0600 Subject: [PATCH 24/39] Implement Activities --- .gitignore | 1 + .../CSharpLibraryTools/Application.cs | 102 +++++++++----- .../CSharpLibraryTools.csproj | 9 ++ .../Implementations/ActiveProgramImp.cs | 10 +- .../Implementations/BrowseActivityImp.cs | 16 ++- .../Implementations/DirectoryManagerImg.cs | 37 ------ .../Implementations/DirectoryManagerImp.cs | 38 ++++++ .../Implementations/EgmaCvImp.cs | 3 +- .../Implementations/FileManagerImp.cs | 16 ++- .../Implementations/GoogleDriveApiImp.cs | 124 ++++++++++++++++++ .../Implementations/RunningProgramImp.cs | 26 ++-- .../Implementations/ScreenCaptureImp.cs | 22 ++-- .../CSharpLibraryTools/Program.cs | 19 +++ .../CSharpLibraryTools/appsettings.json | 1 - .../CoreActivities/FileManager/FileAdapter.cs | 54 ++++++-- .../GoogleDriveApi/GoogleDriveApiManager.cs | 6 +- 16 files changed, 367 insertions(+), 117 deletions(-) delete mode 100644 CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs create mode 100644 CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImp.cs create mode 100644 CSharpLibraryTools/CSharpLibraryTools/Implementations/GoogleDriveApiImp.cs diff --git a/.gitignore b/.gitignore index 85608b9..69a99ab 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /CSharpLibraryTools/.vs/CSharpLibraryTools/DesignTimeBuild /CSharpLibraryTools/CoreActivities/bin/Debug/netcoreapp3.1 /CSharpLibraryTools/CoreActivities/obj +/CSharpLibraryTools/.vs/CSharpLibraryTools/config diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs index 73791fb..e29dab3 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Application.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -1,53 +1,89 @@ -using CoreActivities.ActiveProgram; -using CoreActivities.BrowserActivity; -using CoreActivities.DirectoryManager; -using CoreActivities.EgmaCV; -using System; +using System; +using System.Linq; using System.Threading.Tasks; namespace CSharpLibraryTools { public class Application { - private readonly IActiveProgram _activeProgram; - private readonly IBrowserActivity _browserActivity; - private readonly IDirectoryManager _directoryManager; - private readonly IEgmaCv _egmaCv; - - public Application(IActiveProgram activeProgram, - IBrowserActivity browserActivity, - IDirectoryManager directoryManager, - IEgmaCv egmaCv) + private readonly ActiveProgramImp _activeProgramImp; + private readonly BrowseActivityImp _browseActivityImp; + private readonly DirectoryManagerImp _directoryManagerImp; + private readonly EgmaCvImp _egmaCv; + private readonly FileManagerImp _fileManagerImp; + private readonly RunningProgramImp _runningProgramImp; + private readonly ScreenCaptureImp _screenCaptureImp; + private readonly GoogleDriveApiImp _googleDriveApiImp; + + public Application(ActiveProgramImp activeProgramImp, + BrowseActivityImp browseActivityImp, + DirectoryManagerImp directoryManagerImp, + EgmaCvImp egmaCv, + FileManagerImp fileManagerImp, + RunningProgramImp runningProgramImp, + ScreenCaptureImp screenCaptureImp, + GoogleDriveApiImp googleDriveApiImp) { - _activeProgram = activeProgram; - _browserActivity = browserActivity; - _directoryManager = directoryManager; + _activeProgramImp = activeProgramImp; + _browseActivityImp = browseActivityImp; + _directoryManagerImp = directoryManagerImp; _egmaCv = egmaCv; + _fileManagerImp = fileManagerImp; + _runningProgramImp = runningProgramImp; + _screenCaptureImp = screenCaptureImp; + _googleDriveApiImp = googleDriveApiImp; } public async Task Run() { - var title = _activeProgram.CaptureActiveProgramTitle(); - Console.WriteLine($"Present active program title is {title}"); + try + { + TitlePrinter("Active Program Information"); + await _activeProgramImp.Run(); + PrintSeperator(20); + + TitlePrinter("Browser Activity"); + await _browseActivityImp.Run(); + PrintSeperator(20); + + TitlePrinter("Directory Manager"); + await _directoryManagerImp.Run(); + PrintSeperator(20); + + TitlePrinter("Webcam"); + await _egmaCv.Run(); + PrintSeperator(20); - Console.WriteLine("-------------------------------------------"); + TitlePrinter("File Manger"); + await _fileManagerImp.Run(); + PrintSeperator(20); - var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Chrome); - foreach (var item in tabs) - Console.WriteLine(item); + TitlePrinter("Running Programs"); + await _runningProgramImp.Run(); + PrintSeperator(20); - var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); - Console.WriteLine($"Active URL: {activeUrl}"); + //TitlePrinter("Screen Capture"); + //await _screenCaptureImp.Run(); + //PrintSeperator(20); - Console.WriteLine("-------------------------------------------"); + TitlePrinter("Google Drive Api"); + await _googleDriveApiImp.Run(); + PrintSeperator(20); + } + catch (Exception ex) + { - Console.WriteLine(_directoryManager.GetProgramDataDirectoryPath("WebCam")); - _directoryManager.ChecknCreateDirectory("WebCam"); - Console.WriteLine(_directoryManager.CreateProgramDataFilePath("WebCam", "file.txt")); - - Console.WriteLine("-------------------------------------------"); - var rand = new Random(); - await _egmaCv.CaptureImageAsync(0, _directoryManager.CreateProgramDataFilePath("WebCam", $"{rand.Next(10, 9999)}.jpg")); + throw; + } + } + + public void TitlePrinter(string title) + => Console.WriteLine($"{title}\n{new string('-', title.Count())}"); + + public void PrintSeperator(int length) + { + var seperator = new string('=', length); + Console.WriteLine($"{seperator}\n{seperator}\n"); } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj b/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj index e826867..aa217a0 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj +++ b/CSharpLibraryTools/CSharpLibraryTools/CSharpLibraryTools.csproj @@ -18,4 +18,13 @@ + + + Always + + + Always + + + diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/ActiveProgramImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/ActiveProgramImp.cs index 0bb2038..1a9c1ec 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/ActiveProgramImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/ActiveProgramImp.cs @@ -1,5 +1,6 @@ using CoreActivities.ActiveProgram; using System; +using System.Threading.Tasks; namespace CSharpLibraryTools { @@ -10,11 +11,12 @@ public class ActiveProgramImp public ActiveProgramImp(IActiveProgram activeProgram) => _activeProgram = activeProgram; - public void Run() + public async Task Run() { - Console.WriteLine($"Active Program: {_activeProgram.CaptureActiveProgramTitle()}"); - Console.WriteLine(); - Console.WriteLine(); + await Task.Run(() => + { + Console.WriteLine($"Active Program: {_activeProgram.CaptureActiveProgramTitle()}"); + }); } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs index 8379bbd..3de39a9 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs @@ -1,5 +1,6 @@ using CoreActivities.BrowserActivity; using System; +using System.Threading.Tasks; namespace CSharpLibraryTools { @@ -12,14 +13,17 @@ public BrowseActivityImp(IBrowserActivity browserActivity) _browserActivity = browserActivity; } - public void Run() + public async Task Run() { - var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); - Console.WriteLine($"Active URL: {activeUrl}"); + await Task.Run(() => + { + var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); + Console.WriteLine($"Active URL: {activeUrl}\n"); - var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Chrome); - foreach (var item in tabs) - Console.WriteLine(item); + var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Chrome); + foreach (var item in tabs) + Console.WriteLine($"Tab: {item}"); + }); } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs deleted file mode 100644 index 20cec0c..0000000 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImg.cs +++ /dev/null @@ -1,37 +0,0 @@ -using CoreActivities.DirectoryManager; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CSharpLibraryTools.Implementations -{ - public class DirectoryManagerImg - { - private readonly IDirectoryManager _directoryManager; - - public DirectoryManagerImg(IDirectoryManager directoryManager) - { - _directoryManager = directoryManager; - } - - public void Run() - { - //The following prints the windows program data directorty path - Console.WriteLine($"ProgramData Directory: {_directoryManager.GetProgramDataDirectoryPath("Foobar")}"); - - //The following creates a directory under a drive and returns bool as created or not - var isCreated = _directoryManager.ChecknCreateDirectory("Foobar"); - if(isCreated) - Console.WriteLine("Has created Foobar under C:\\ProgramData"); - else - Console.WriteLine("The directory already exists. No need to create it."); - - //The following prints the file path of program data directory - var filePath = _directoryManager.CreateProgramDataFilePath("Foobar", "file.txt"); - Console.WriteLine($"File path: {filePath}"); - - Console.WriteLine(); - Console.WriteLine(); - } - } -} diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImp.cs new file mode 100644 index 0000000..5abfa99 --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImp.cs @@ -0,0 +1,38 @@ +using CoreActivities.DirectoryManager; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace CSharpLibraryTools +{ + public class DirectoryManagerImp + { + private readonly IDirectoryManager _directoryManager; + + public DirectoryManagerImp(IDirectoryManager directoryManager) + { + _directoryManager = directoryManager; + } + + public async Task Run() + { + await Task.Run(() => + { + //The following prints the windows program data directorty path + Console.WriteLine($"ProgramData Directory: {_directoryManager.GetProgramDataDirectoryPath("Foobar")}"); + + //The following creates a directory under a drive and returns bool as created or not + var isCreated = _directoryManager.ChecknCreateDirectory("Foobar"); + if (isCreated) + Console.WriteLine("Has created Foobar under C:\\ProgramData"); + else + Console.WriteLine("The directory already exists. No need to create it."); + + //The following prints the file path of program data directory + var filePath = _directoryManager.CreateProgramDataFilePath("Foobar", "file.txt"); + Console.WriteLine($"File path: {filePath}\n"); + }); + } + } +} diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs index 4908e99..21e62aa 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; -namespace CSharpLibraryTools.Implementations +namespace CSharpLibraryTools { public class EgmaCvImp { @@ -25,6 +25,7 @@ public async Task Run() var fileName = $"{Guid.NewGuid()}.jpg"; var filePath = _directoryManager.CreateProgramDataFilePath("CsLibDropBox", fileName); await _egmaCv.CaptureImageAsync(0, filePath); + Console.WriteLine($"Image Captured. FilePath: {filePath}"); } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs index 08ca101..e8ee1ac 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs @@ -7,7 +7,7 @@ using System.Text; using System.Threading.Tasks; -namespace CSharpLibraryTools.Implementations +namespace CSharpLibraryTools { public class FileManagerImp { @@ -46,14 +46,14 @@ public async Task Run() var filePath = _directoryManager.CreateProgramDataFilePath(folder, "file.txt"); var fileName = _file.FileName(filePath); - Console.WriteLine($"FilePath: {filePath}, FileName: {fileName}"); + Console.WriteLine($"FilePath: {filePath},\n FileName: {fileName}"); //Checks the file does exists. If not then create - if (_file.DoesExists(filePath)) + if (!_file.DoesExists(filePath)) _file.CreateFile(filePath); //Prints created file mime type - Console.WriteLine($"MimeType: {_file.GetMimeType(filePath)}"); + Console.WriteLine($"MimeType: {_file.GetMimeType(filePath)}\n"); //WriteAllTextAsync is same as WriteAllLineAsync but just write a string as text //Note: Using WriteAllLineAsync and WriteAllTextAsync will override text of each other @@ -67,21 +67,27 @@ public async Task Run() var singleLine = await _file.ReadAllTextAsync(filePath); Console.WriteLine("ReadAllLineAsync"); + Console.WriteLine("----------------"); foreach (var item in allLines) Console.WriteLine(item); + Console.WriteLine(); Console.WriteLine("ReadAllTextAsync"); + Console.WriteLine("----------------"); Console.WriteLine(singleLine); + Console.WriteLine(); Console.WriteLine("Printing base 64 string"); + Console.WriteLine("-----------------------"); var bytes = _file.ReadFileAsByte(filePath); Console.WriteLine(_file.ConvertByteToBase64String(bytes)); var streanFilePath = _directoryManager.CreateProgramDataFilePath(folder, "streanFile.txt"); _file.WriteBytesStream(streanFilePath, bytes); + Console.WriteLine(); #endregion #region IFileInfo Implementation - Console.WriteLine($"Filesize: {_fileInfo.FileSize(filePath)}"); + Console.WriteLine($"Filesize: {_fileInfo.FileSize(filePath)} Bytes"); Console.WriteLine($"IsReadonly: {_fileInfo.IsReadOnly(filePath)}"); Console.WriteLine($"CreatedOn: {_fileInfo.CreatedOn(filePath)}"); Console.WriteLine($"LastUpdateOn: {_fileInfo.LastUpdateOn(filePath)}"); diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/GoogleDriveApiImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/GoogleDriveApiImp.cs new file mode 100644 index 0000000..3f9511b --- /dev/null +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/GoogleDriveApiImp.cs @@ -0,0 +1,124 @@ +using CoreActivities.DirectoryManager; +using CoreActivities.FileManager; +using CoreActivities.GoogleDriveApi; +using CoreActivities.GoogleDriveApi.Models; +using CoreActivities.GoogleDriveApi.Parms; +using CoreActivities.RunningPrograms; +using Google.Apis.Drive.v3.Data; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace CSharpLibraryTools +{ + public class GoogleDriveApiImp + { + private readonly IRunningPrograms _runningPrograms; + private readonly IDirectoryManager _directoryManager; + private readonly IFile _file; + private readonly IFileInfo _fileInfo; + private readonly IFileManager _fileManager; + private readonly IGoogleDriveApiManager _googleDriveApiManager; + + public GoogleDriveApiImp(IRunningPrograms runningPrograms, + IDirectoryManager directoryManager, + IFile file, + IFileInfo fileInfo, + IFileManager fileManager, + IGoogleDriveApiManager googleDriveApiManager) + { + _runningPrograms = runningPrograms; + _directoryManager = directoryManager; + _file = file; + _fileInfo = fileInfo; + _fileManager = fileManager; + _googleDriveApiManager = googleDriveApiManager; + } + + public async Task Run() + { + try + { + //Creating upload file path + var folder = "CSharpLib"; + var filePath = _directoryManager.CreateProgramDataFilePath(folder, $"google-drive-api-{Guid.NewGuid()}.txt"); + _fileManager.CreateFile(filePath); + + //Creating download file path + var downloadDir = $"{folder}Downlaod"; + var downloadFilePath = _directoryManager.CreateProgramDataFilePath(downloadDir, $"google-drive-api-download-{Guid.NewGuid()}.txt"); + _fileManager.CreateFile(downloadFilePath); + + //Gathering running program informations and writing info to upload file + var runningPrograms = _runningPrograms.GetRunningProgramsList(); + await _file.WriteAllLineAsync(runningPrograms, filePath); + + //Uploading the written file + Console.WriteLine("Uploading..."); + var file = await _googleDriveApiManager.UploadFileAsync(new UploadFileInfo + { + FileName = _file.FileName(filePath), + FilePath = filePath, + FileSize = _fileInfo.FileSize(filePath), + MimeType = _file.GetMimeType(filePath) + }); + + //Print present file information + Console.WriteLine("Printing..."); + await PrintFilesInAGoogleDirectory(); + Console.WriteLine(); + + //Downloading the uploaded file in download directory + Console.WriteLine("Downloading..."); + await _googleDriveApiManager.DownloadAsync(file, downloadFilePath); + + //Deleting the uploaded file + Console.WriteLine("Deleting..."); + await _googleDriveApiManager.DeleteAsync(file.Id); + + //Print present file information + Console.WriteLine("Printing..."); + await PrintFilesInAGoogleDirectory(); + Console.WriteLine(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + + private async Task> PrintFilesInAGoogleDirectory() + { + var files = new List(); + + var optionals = new FilesListOptionalParms + { + PageSize = 5, //Provide positive integer for pagination + Fields = "nextPageToken, files(id, name, mimeType, kind, trashed)" //Follow this pattern to retrive only specified object fields + }; + + GoogleDriveFiles results = null; + var counter = 0; + + do + { + if (results == null) + results = await _googleDriveApiManager.GetFilesAndFolders(null, optionals); + else + results = await _googleDriveApiManager.GetFilesAndFolders(results.NextPageToken, optionals); + + files.AddRange(results.Files); + + foreach (var item in results.Files) + { + Console.WriteLine($"SL: {counter} Name: {item.Name}"); + counter++; + } + + } while (results != null && !string.IsNullOrEmpty(results.NextPageToken)); + + return files; + } + } +} diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/RunningProgramImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/RunningProgramImp.cs index 504dbbc..5c863b3 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/RunningProgramImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/RunningProgramImp.cs @@ -1,7 +1,8 @@ using CoreActivities.RunningPrograms; using System; +using System.Threading.Tasks; -namespace CSharpLibraryTools.Implementations +namespace CSharpLibraryTools { public class RunningProgramImp { @@ -12,18 +13,23 @@ public RunningProgramImp(IRunningPrograms runningPrograms) _runningPrograms = runningPrograms; } - public void Run() + public async Task Run() { - var runningProcesses = _runningPrograms.GetRunningProcessList(); - var runningPrograms = _runningPrograms.GetRunningProgramsList(); + await Task.Run(() => + { + var runningProcesses = _runningPrograms.GetRunningProcessList(); + var runningPrograms = _runningPrograms.GetRunningProgramsList(); - Console.WriteLine("Running Processes"); - foreach (var item in runningProcesses) - Console.WriteLine(item); + Console.WriteLine("Running Processes"); + foreach (var item in runningProcesses) + Console.WriteLine(item); + Console.WriteLine(); - Console.WriteLine("Running Programs"); - foreach (var item in runningPrograms) - Console.WriteLine(item); + Console.WriteLine("Running Programs"); + foreach (var item in runningPrograms) + Console.WriteLine(item); + Console.WriteLine(); + }); } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs index b3c8678..121a713 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs @@ -4,8 +4,9 @@ using System; using System.Collections.Generic; using System.Text; +using System.Threading.Tasks; -namespace CSharpLibraryTools.Implementations +namespace CSharpLibraryTools { public class ScreenCaptureImp { @@ -25,17 +26,22 @@ public ScreenCaptureImp(IScreenCapture screenCapture, _file = file; } - public void Run() + public async Task Run() { - var folder = "CSharpLib"; + await Task.Run(() => + { + var folder = "CSharpLib"; - Console.WriteLine("Capturing and storing image"); + Console.WriteLine("Capturing and storing image"); - var filePath = _directoryManager.CreateProgramDataFilePath(folder, $"{Guid.NewGuid()}.jpeg"); - _fileManager.CreateFile(filePath); + var filePath = _directoryManager.CreateProgramDataFilePath(folder, $"{Guid.NewGuid()}.jpg"); + _fileManager.CreateFile(filePath); - var capturedScreen = _screenCapture.CaptureUserScreen(1920, 1080); - _fileManager.SaveBitmapImage(filePath, capturedScreen); + var capturedScreen = _screenCapture.CaptureUserScreen(1920, 1080); + _fileManager.SaveBitmapImage(filePath, capturedScreen); + + Console.WriteLine($"Image Captured. FilePath: {filePath}"); + }); } } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Program.cs b/CSharpLibraryTools/CSharpLibraryTools/Program.cs index a94bad7..b394e2d 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Program.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Program.cs @@ -20,6 +20,7 @@ private static IContainer CompositionRoot() var builder = new ContainerBuilder(); + //Registering packages builder.RegisterType(); builder.RegisterModule(new ActiveProgramPackage()); builder.RegisterModule(new BrowserActivityPackage()); @@ -30,6 +31,24 @@ private static IContainer CompositionRoot() builder.RegisterModule(new RunningProgramPackage()); builder.RegisterModule(new ScreenCapturePackage()); + //Registering implementations + builder.RegisterType() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); + return builder.Build(); } diff --git a/CSharpLibraryTools/CSharpLibraryTools/appsettings.json b/CSharpLibraryTools/CSharpLibraryTools/appsettings.json index f3aaee5..c41b33e 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/appsettings.json +++ b/CSharpLibraryTools/CSharpLibraryTools/appsettings.json @@ -1,5 +1,4 @@ { - "FolderName": "WebCamSync", "AuthFileName": "webcamsync.json", "DirectoryId": "1UCNJUVNESqok8ziZUpsQB7ggtNj5nf3O" } \ No newline at end of file diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs index f9e8eb0..f3afe48 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs @@ -28,9 +28,17 @@ public class FileAdapter : IFile { public string FileName(string filePath) => Path.GetFileName(filePath); - public void CreateFile(string filePath) => File.Create(filePath); + public void CreateFile(string filePath) + { + using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); + File.Create(filePath); + } - public bool DoesExists(string filePath) => File.Exists(filePath); + public bool DoesExists(string filePath) + { + using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); + return File.Exists(filePath); + } public string GetMimeType(string fileName) { @@ -41,7 +49,11 @@ public string GetMimeType(string fileName) return contentType; } - public byte[] ReadFileAsByte(string filePath) => File.ReadAllBytes(filePath); + public byte[] ReadFileAsByte(string filePath) + { + using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); + return File.ReadAllBytes(filePath); + } public string ConvertByteToBase64String(byte[] file) => Convert.ToBase64String(file); @@ -51,16 +63,40 @@ public void WriteBytesStream(string filePath, byte[] file) fileStream.Write(file, 0, file.Length); } - public async Task WriteAllLineAsync(List lines, string filePath) => await File.WriteAllLinesAsync(filePath, lines); + public async Task WriteAllLineAsync(List lines, string filePath) + { + using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); + await File.WriteAllLinesAsync(filePath, lines); + } - public async Task WriteAllTextAsync(string text, string filePath) => await File.WriteAllTextAsync(filePath, text); + public async Task WriteAllTextAsync(string text, string filePath) + { + using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); + await File.WriteAllTextAsync(filePath, text); + } - public async Task AppendAllLineAsync(List lines, string filePath) => await File.AppendAllLinesAsync(filePath, lines); + public async Task AppendAllLineAsync(List lines, string filePath) + { + using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); + await File.AppendAllLinesAsync(filePath, lines); + } - public async Task AppendAllTextAsync(string text, string filePath) => await File.AppendAllTextAsync(filePath, text); + public async Task AppendAllTextAsync(string text, string filePath) + { + using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); + await File.AppendAllTextAsync(filePath, text); + } - public async Task ReadAllLineAsync(string filePath) => await File.ReadAllLinesAsync(filePath); + public async Task ReadAllLineAsync(string filePath) + { + using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); + return await File.ReadAllLinesAsync(filePath); + } - public async Task ReadAllTextAsync(string filePath) => await File.ReadAllTextAsync(filePath); + public async Task ReadAllTextAsync(string filePath) + { + using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); + return await File.ReadAllTextAsync(filePath); + } } } diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs index 39fb921..65e3ed5 100644 --- a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs @@ -16,7 +16,7 @@ namespace CoreActivities.GoogleDriveApi public interface IGoogleDriveApiManager { Task GetFilesAndFolders(string nextPageToken = null, FilesListOptionalParms optional = null); - Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null); + Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null); Task DeleteAsync(string fileId, FilesDeleteOptionalParms optional = null); Task DownloadAsync(File file, string filePath, Action downloadProgress = null); } @@ -103,7 +103,7 @@ public async Task GetFilesAndFolders(string nextPageToken = nu } - public async Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null) + public async Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null) { //Initialization _uploaded = 0; @@ -143,7 +143,7 @@ public async Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action< if (results.Status == UploadStatus.Failed) throw new Exception($"Error uploading file: {results.Exception.Message}"); - return request.ResponseBody?.Id; + return request.ResponseBody; } else throw new Exception("Provide valid upload file information"); From afdc37ec50f82cc8cf9f3bde2118359295fa7950 Mon Sep 17 00:00:00 2001 From: abbirku Date: Thu, 2 Sep 2021 23:25:14 +0600 Subject: [PATCH 25/39] Solve file adapter bug --- .../CSharpLibraryTools/Application.cs | 43 +++++++++---------- .../Implementations/FileManagerImp.cs | 13 +++--- .../CoreActivities/FileManager/FileAdapter.cs | 30 ++++++------- .../FileManager/FileManagerAdapter.cs | 13 +++--- 4 files changed, 49 insertions(+), 50 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs index e29dab3..41b753e 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Application.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -38,42 +38,41 @@ public async Task Run() { try { - TitlePrinter("Active Program Information"); - await _activeProgramImp.Run(); - PrintSeperator(20); + //TitlePrinter("Active Program Information"); + //await _activeProgramImp.Run(); + //PrintSeperator(20); - TitlePrinter("Browser Activity"); - await _browseActivityImp.Run(); - PrintSeperator(20); + //TitlePrinter("Browser Activity"); + //await _browseActivityImp.Run(); + //PrintSeperator(20); - TitlePrinter("Directory Manager"); - await _directoryManagerImp.Run(); - PrintSeperator(20); + //TitlePrinter("Directory Manager"); + //await _directoryManagerImp.Run(); + //PrintSeperator(20); - TitlePrinter("Webcam"); - await _egmaCv.Run(); - PrintSeperator(20); + //TitlePrinter("Webcam"); + //await _egmaCv.Run(); + //PrintSeperator(20); - TitlePrinter("File Manger"); - await _fileManagerImp.Run(); - PrintSeperator(20); + //TitlePrinter("File Manager"); + //await _fileManagerImp.Run(); + //PrintSeperator(20); - TitlePrinter("Running Programs"); - await _runningProgramImp.Run(); - PrintSeperator(20); + //TitlePrinter("Running Programs"); + //await _runningProgramImp.Run(); + //PrintSeperator(20); //TitlePrinter("Screen Capture"); //await _screenCaptureImp.Run(); //PrintSeperator(20); - TitlePrinter("Google Drive Api"); - await _googleDriveApiImp.Run(); - PrintSeperator(20); + //TitlePrinter("Google Drive Api"); + //await _googleDriveApiImp.Run(); + //PrintSeperator(20); } catch (Exception ex) { - throw; } } diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs index e8ee1ac..3a44378 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/FileManagerImp.cs @@ -3,8 +3,6 @@ using CoreActivities.FileManager; using System; using System.Collections.Generic; -using System.Drawing.Drawing2D; -using System.Text; using System.Threading.Tasks; namespace CSharpLibraryTools @@ -79,11 +77,14 @@ public async Task Run() Console.WriteLine("Printing base 64 string"); Console.WriteLine("-----------------------"); - var bytes = _file.ReadFileAsByte(filePath); + + var bytes = await _file.ReadFileAsByteAsync(filePath); Console.WriteLine(_file.ConvertByteToBase64String(bytes)); + var streanFilePath = _directoryManager.CreateProgramDataFilePath(folder, "streanFile.txt"); - _file.WriteBytesStream(streanFilePath, bytes); + await _file.WriteBytesStreamAsync(streanFilePath, bytes); Console.WriteLine(); + #endregion #region IFileInfo Implementation @@ -98,8 +99,8 @@ public async Task Run() var writtenTextFilePath = _directoryManager.CreateProgramDataFilePath(folder, "written_text.txt"); _fileManager.CreateFile(writtenTextFilePath); - var readBytes = _fileManager.ReadFileAsByte(filePath); - _fileManager.SaveByteStream(writtenTextFilePath, readBytes); + var readBytes = await _fileManager.ReadFileAsByteAsync(filePath); + await _fileManager.SaveByteStreamAsync(writtenTextFilePath, readBytes); #endregion } } diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs index f3afe48..6ec7c30 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs @@ -13,9 +13,9 @@ public interface IFile bool DoesExists(string filePath); void CreateFile(string filePath); string GetMimeType(string fileName); - byte[] ReadFileAsByte(string filePath); // - string ConvertByteToBase64String(byte[] file); // - void WriteBytesStream(string filePath, byte[] file); // + Task ReadFileAsByteAsync(string filePath); + string ConvertByteToBase64String(byte[] file); + Task WriteBytesStreamAsync(string filePath, byte[] file); Task WriteAllLineAsync(List lines, string filePath); Task WriteAllTextAsync(string text, string filePath); Task AppendAllLineAsync(List lines, string filePath); @@ -30,13 +30,11 @@ public class FileAdapter : IFile public void CreateFile(string filePath) { - using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); File.Create(filePath); } public bool DoesExists(string filePath) { - using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); return File.Exists(filePath); } @@ -49,53 +47,53 @@ public string GetMimeType(string fileName) return contentType; } - public byte[] ReadFileAsByte(string filePath) + public async Task ReadFileAsByteAsync(string filePath) { - using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); - return File.ReadAllBytes(filePath); + byte[] result; + using (var stream = File.Open(filePath, FileMode.Open)) + { + result = new byte[stream.Length]; + await stream.ReadAsync(result, 0, (int)stream.Length); + } + + return result; } public string ConvertByteToBase64String(byte[] file) => Convert.ToBase64String(file); - public void WriteBytesStream(string filePath, byte[] file) + public async Task WriteBytesStreamAsync(string filePath, byte[] file) { using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite); - fileStream.Write(file, 0, file.Length); + await fileStream.WriteAsync(file, 0, file.Length); } public async Task WriteAllLineAsync(List lines, string filePath) { - using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); await File.WriteAllLinesAsync(filePath, lines); } public async Task WriteAllTextAsync(string text, string filePath) { - using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); await File.WriteAllTextAsync(filePath, text); } public async Task AppendAllLineAsync(List lines, string filePath) { - using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); await File.AppendAllLinesAsync(filePath, lines); } public async Task AppendAllTextAsync(string text, string filePath) { - using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); await File.AppendAllTextAsync(filePath, text); } public async Task ReadAllLineAsync(string filePath) { - using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); return await File.ReadAllLinesAsync(filePath); } public async Task ReadAllTextAsync(string filePath) { - using var stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read); return await File.ReadAllTextAsync(filePath); } } diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs index 14a41ec..f245ff9 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs @@ -1,14 +1,15 @@ using System; using System.Drawing; using System.Drawing.Imaging; +using System.Threading.Tasks; namespace CoreActivities.FileManager { public interface IFileManager { void CreateFile(string filePath); - byte[] ReadFileAsByte(string filePath); - void SaveByteStream(string filePath, byte[] file); + Task ReadFileAsByteAsync(string filePath); + Task SaveByteStreamAsync(string filePath, byte[] file); void SaveBitmapImage(string filePath, Bitmap bitmap); } @@ -28,7 +29,7 @@ public void CreateFile(string path) _file.CreateFile(path); } - public byte[] ReadFileAsByte(string filePath) + public async Task ReadFileAsByteAsync(string filePath) { if (string.IsNullOrWhiteSpace(filePath)) throw new Exception("Provide valid file path read the file stream."); @@ -36,15 +37,15 @@ public byte[] ReadFileAsByte(string filePath) if (!_file.DoesExists(filePath)) throw new Exception("File does not exists"); - return _file.ReadFileAsByte(filePath); + return await _file.ReadFileAsByteAsync(filePath); } - public void SaveByteStream(string filePath, byte[] file) + public async Task SaveByteStreamAsync(string filePath, byte[] file) { if (string.IsNullOrWhiteSpace(filePath) || file == null || file.Length == 0) throw new Exception("Provide valid file path and byte array to save the file stream."); - _file.WriteBytesStream(filePath, file); + await _file.WriteBytesStreamAsync(filePath, file); } public void SaveBitmapImage(string filePath, Bitmap bitmap) From 399720739ed61c30cd50626dcb0acfd7e97211a4 Mon Sep 17 00:00:00 2001 From: abbirku Date: Fri, 3 Sep 2021 01:07:10 +0600 Subject: [PATCH 26/39] Close file stream after creating --- CSharpLibraryTools/CSharpLibraryTools/Application.cs | 6 +++--- CSharpLibraryTools/CoreActivities/CoreActivities.csproj | 1 - .../CoreActivities/FileManager/FileAdapter.cs | 3 ++- .../CoreActivities/FileManager/FileManagerAdapter.cs | 7 ++++++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs index 41b753e..f298dd1 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Application.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -62,9 +62,9 @@ public async Task Run() //await _runningProgramImp.Run(); //PrintSeperator(20); - //TitlePrinter("Screen Capture"); - //await _screenCaptureImp.Run(); - //PrintSeperator(20); + TitlePrinter("Screen Capture"); + await _screenCaptureImp.Run(); + PrintSeperator(20); //TitlePrinter("Google Drive Api"); //await _googleDriveApiImp.Run(); diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index e84d5fe..e7d910c 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -18,5 +18,4 @@ - diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs index 6ec7c30..47b439a 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs @@ -30,7 +30,8 @@ public class FileAdapter : IFile public void CreateFile(string filePath) { - File.Create(filePath); + var stream = File.Create(filePath); + stream.Close(); } public bool DoesExists(string filePath) diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs index f245ff9..94c607f 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileManagerAdapter.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; using System.Drawing.Imaging; +using System.IO; using System.Threading.Tasks; namespace CoreActivities.FileManager @@ -53,7 +54,11 @@ public void SaveBitmapImage(string filePath, Bitmap bitmap) if (string.IsNullOrWhiteSpace(filePath) || bitmap == null) throw new Exception("Provide valid file path and bitmap to save the image."); - bitmap.Save(filePath, ImageFormat.Jpeg); + using var memory = new MemoryStream(); + using var fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None); + bitmap.Save(memory, ImageFormat.Jpeg); + var bytes = memory.ToArray(); + fs.Write(bytes, 0, bytes.Length); } } } From 94e6c018d55ecd9780db2420827ee11fec1a257c Mon Sep 17 00:00:00 2001 From: abbirku Date: Fri, 3 Sep 2021 01:22:02 +0600 Subject: [PATCH 27/39] Fix small issues --- .../CSharpLibraryTools/Application.cs | 55 ++++++++----------- .../Implementations/EgmaCvImp.cs | 2 +- .../GoogleDriveApi/GoogleDriveApiManager.cs | 2 +- 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs index f298dd1..1650d15 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Application.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -36,44 +36,37 @@ public Application(ActiveProgramImp activeProgramImp, public async Task Run() { - try - { - //TitlePrinter("Active Program Information"); - //await _activeProgramImp.Run(); - //PrintSeperator(20); + TitlePrinter("Active Program Information"); + await _activeProgramImp.Run(); + PrintSeperator(20); - //TitlePrinter("Browser Activity"); - //await _browseActivityImp.Run(); - //PrintSeperator(20); + TitlePrinter("Browser Activity"); + await _browseActivityImp.Run(); + PrintSeperator(20); - //TitlePrinter("Directory Manager"); - //await _directoryManagerImp.Run(); - //PrintSeperator(20); + TitlePrinter("Directory Manager"); + await _directoryManagerImp.Run(); + PrintSeperator(20); - //TitlePrinter("Webcam"); - //await _egmaCv.Run(); - //PrintSeperator(20); + TitlePrinter("Webcam"); + await _egmaCv.Run(); + PrintSeperator(20); - //TitlePrinter("File Manager"); - //await _fileManagerImp.Run(); - //PrintSeperator(20); + TitlePrinter("File Manager"); + await _fileManagerImp.Run(); + PrintSeperator(20); - //TitlePrinter("Running Programs"); - //await _runningProgramImp.Run(); - //PrintSeperator(20); + TitlePrinter("Running Programs"); + await _runningProgramImp.Run(); + PrintSeperator(20); - TitlePrinter("Screen Capture"); - await _screenCaptureImp.Run(); - PrintSeperator(20); + TitlePrinter("Screen Capture"); + await _screenCaptureImp.Run(); + PrintSeperator(20); - //TitlePrinter("Google Drive Api"); - //await _googleDriveApiImp.Run(); - //PrintSeperator(20); - } - catch (Exception ex) - { - - } + TitlePrinter("Google Drive Api"); + await _googleDriveApiImp.Run(); + PrintSeperator(20); } public void TitlePrinter(string title) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs index 21e62aa..f8c7e2e 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/EgmaCvImp.cs @@ -23,7 +23,7 @@ public async Task Run() { //The following capture image from webcam and store it on a file var fileName = $"{Guid.NewGuid()}.jpg"; - var filePath = _directoryManager.CreateProgramDataFilePath("CsLibDropBox", fileName); + var filePath = _directoryManager.CreateProgramDataFilePath("CSharpLib", fileName); await _egmaCv.CaptureImageAsync(0, filePath); Console.WriteLine($"Image Captured. FilePath: {filePath}"); } diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs index 65e3ed5..26b694d 100644 --- a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs @@ -236,7 +236,7 @@ private void PrintDownloadProgress(long progress) ClearCurrentConsoleLine(); _downloaded += progress; - Console.WriteLine($"Downloaded: {_downloaded / 1024}%"); + Console.WriteLine($"Downloaded: {(decimal)_downloaded / 1024} Kilo Bytes"); } private void DrawTextProgressBar(long progress, long total) From 24d9a136880e13c607c840d27cdd8725b659347f Mon Sep 17 00:00:00 2001 From: abbirku Date: Mon, 20 Sep 2021 03:03:30 +0600 Subject: [PATCH 28/39] Provide documentation for ActiveProgram & BrowserActivity in Readme.md --- README.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 606ef95..d60fa03 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,55 @@ -# CSharpLibraryTools -Target of this repository is to collect and document different working classes for later use in different project +# *CSharpLibraryTools* + +## *Aim* + +Aim of this project is to separate daily code in a SOLID manner so that we could re-use the code again without reinventing the wheel. + +## *Library Architecture & Details* + +- Each library item is a package. Just need to register the package with Autofac and use the interfaces. There is no overhead of registering library dependencies. Package registration is enough. +- Each library try to follow Adapter Pattern so that user could do unit testing. +- Also there are implementations for each library item for easer understanding. +- And last we have used console app to simulate library results. + +## *Library List* + +- Active Program +- Browser Activity +- Directory Manager +- EgmaCV +- File Manager +- Google Drive Api +- Running Programs +- Screen Capture + +### **Active Program** +_**Dependencies**_ +- user32.dll + +_**Interface & Its members**_ +- IActiveProgram + +| Member | Details | +| ------ | ------ | +| CaptureActiveProgramTitle() | Returns string of current active foreground program on windows. Null otherwise. | + +_**Usage**_ +Follow _ActiveProgramImp_ + +### **Browser Activity** +_**Dependencies**_ +- System.Diagnostics.Process + +_**Interface & Its members**_ +- IBrowserActivity + +| Member | Details | +| ------ | ------ | +| EnlistAllOpenTabs(BrowserType browserType) | Returns list of open tabs title of a browser. | +| EnlistActiveTabUrl(BrowserType browserType) | Returns url string of present visting website in a browser. | + +_**Notes**_ +**BrowserType** is an Enum which contains **Chrome**, **FireFox**, **Edge**, **Opera**, **Safari** + +_**Usage**_ +Follow _BrowseActivityImp_ \ No newline at end of file From 99536a786cc9325c939006e8c3a2181f15b0bf84 Mon Sep 17 00:00:00 2001 From: abbirku Date: Wed, 22 Sep 2021 00:33:00 +0600 Subject: [PATCH 29/39] Update readme.md --- .../Implementations/DirectoryManagerImp.cs | 2 - .../Implementations/ScreenCaptureImp.cs | 7 +- .../CoreActivities/FileManager/FileAdapter.cs | 7 +- .../RunningPrograms/RunningProgramAdapter.cs | 4 +- README.md | 145 +++++++++++++++++- 5 files changed, 147 insertions(+), 18 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImp.cs index 5abfa99..6e09c46 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/DirectoryManagerImp.cs @@ -1,7 +1,5 @@ using CoreActivities.DirectoryManager; using System; -using System.Collections.Generic; -using System.Text; using System.Threading.Tasks; namespace CSharpLibraryTools diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs index 121a713..005618b 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/ScreenCaptureImp.cs @@ -2,8 +2,6 @@ using CoreActivities.FileManager; using CoreActivities.ScreenCapture; using System; -using System.Collections.Generic; -using System.Text; using System.Threading.Tasks; namespace CSharpLibraryTools @@ -13,17 +11,14 @@ public class ScreenCaptureImp private readonly IScreenCapture _screenCapture; private readonly IDirectoryManager _directoryManager; private readonly IFileManager _fileManager; - private readonly IFile _file; public ScreenCaptureImp(IScreenCapture screenCapture, IDirectoryManager directoryManager, - IFileManager fileManager, - IFile file) + IFileManager fileManager) { _screenCapture = screenCapture; _directoryManager = directoryManager; _fileManager = fileManager; - _file = file; } public async Task Run() diff --git a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs index 47b439a..1f64200 100644 --- a/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/FileManager/FileAdapter.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Text; using System.Threading.Tasks; namespace CoreActivities.FileManager @@ -12,7 +11,7 @@ public interface IFile string FileName(string filePath); bool DoesExists(string filePath); void CreateFile(string filePath); - string GetMimeType(string fileName); + string GetMimeType(string filePath); Task ReadFileAsByteAsync(string filePath); string ConvertByteToBase64String(byte[] file); Task WriteBytesStreamAsync(string filePath, byte[] file); @@ -39,10 +38,10 @@ public bool DoesExists(string filePath) return File.Exists(filePath); } - public string GetMimeType(string fileName) + public string GetMimeType(string filePath) { var provider = new FileExtensionContentTypeProvider(); - if (!provider.TryGetContentType(fileName, out string contentType)) + if (!provider.TryGetContentType(filePath, out string contentType)) contentType = "application/octet-stream"; return contentType; diff --git a/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramAdapter.cs b/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramAdapter.cs index 4d3d8a5..b83a6a4 100644 --- a/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/RunningPrograms/RunningProgramAdapter.cs @@ -1,8 +1,6 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Text; namespace CoreActivities.RunningPrograms { diff --git a/README.md b/README.md index d60fa03..9f6fcb8 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ _**Interface & Its members**_ | CaptureActiveProgramTitle() | Returns string of current active foreground program on windows. Null otherwise. | _**Usage**_ -Follow _ActiveProgramImp_ +- Follow _ActiveProgramImp_ ### **Browser Activity** _**Dependencies**_ @@ -49,7 +49,146 @@ _**Interface & Its members**_ | EnlistActiveTabUrl(BrowserType browserType) | Returns url string of present visting website in a browser. | _**Notes**_ -**BrowserType** is an Enum which contains **Chrome**, **FireFox**, **Edge**, **Opera**, **Safari** +- **BrowserType** is an Enum which contains **Chrome**, **FireFox**, **Edge**, **Opera**, **Safari** _**Usage**_ -Follow _BrowseActivityImp_ \ No newline at end of file +- Follow _DirectoryManagerImp_ + +### **Directory Manager** +_**Dependencies**_ +- System.Environment +- System.IO.Directory + +_**Interface & Its members**_ +- IDirectoryManager + +| Member | Details | +| ------ | ------ | +| GetProgramDataDirectoryPath(string appFolder) | Returns directory path of C:\ProgramData with given {appFolder}. | +| ChecknCreateDirectory(string directoryPath) | Creates a folder and returns bool. **Note:** {directoryPath} must contain a folder name. | +| CreateProgramDataFilePath(string folderName, string fileName) | Creates a folder under C:\ProgramData for {folderName} and return file path for given {fileName}. i.e. C:\ProgramData\\{folderName}\\{FileN} | + +_**Notes**_ +- **BrowserType** is an Enum which contains **Chrome**, **FireFox**, **Edge**, **Opera**, **Safari** + +_**Usage**_ +- Follow _BrowseActivityImp_ + +### **EgmaCV** +_**Dependencies**_ +- nuget package Egma.CV (4.5.3.4721) + +_**Interface & Its members**_ +- IEgmaCv + +| Member | Details | +| ------ | ------ | +| CaptureImageAsync(int camIndex, string filePath) | Capture a picture from webcam for given {camIndex} and valid .jpg file path. | + +_**Usage**_ +- Follow _EgmaCvImp_ + +### **File Manager** +_**Dependencies**_ +- System.IO +- System.Drawing + +_**Interface & Its members**_ +- IFile + +| Member | Details | +| ------ | ------ | +| FileName(string filePath) | Returns file name for a given filePath. | +| DoesExists(string filePath) | Check if a file exists or not for a given filePath. Returns bool | +| CreateFile(string filePath) | Creates a file for a given file path. | +| GetMimeType(string filePath) | Returns mime type for a given file path. | +| ReadFileAsByteAsync(string filePath) | For a given file path return bytes of a file. | +| ConvertByteToBase64String(byte[] file) | For given byte array return base 64 string. | +| WriteBytesStreamAsync(string filePath, byte[] file) | Write bytes in a file for a given {filePath}. | +| WriteAllLineAsync(List lines, string filePath) | Write list of string to a file. | +| WriteAllTextAsync(string text, string filePath) | Write string to a file. | +| AppendAllLineAsync(List lines, string filePath) | Append list of string to a file. | +| AppendAllTextAsync(string text, string filePath) | Append a string to a file. | +| ReadAllLineAsync(string filePath) | Read all line of text file and retuns string array. | +| ReadAllTextAsync(string filePath) | Read all text of text file and retuns string. | + +- IFileInfo + +| Member | Details | +| ------ | ------ | +| FileSize(string filePath) | Returns file size for a given filePath. | +| IsReadOnly(string filePath) | Check if a file is readonly or not. Returns bool | +| CreatedOn(string filePath) | Returns file created date time for a given filePath. | +| LastAccessOn(string filePath) | Returns file last access date time for a given filePath. | +| LastUpdateOn(string filePath) | Returns file last update date time for a given filePath. | + +- IFileManager + +| Member | Details | +| ------ | ------ | +| CreateFile(string filePath) | Creates a file for a given file path. | +| ReadFileAsByteAsync(string filePath) | Read file for a given filePath and return byte array | +| SaveByteStreamAsync(string filePath, byte[] file) | Save bytes to a file for a given filePath. | +| SaveBitmapImage(string filePath, Bitmap bitmap) | Save Bitmap to a file for a given filePath. | + +_**Notes**_ +- **IFileManager** and **IFile** both have **CreateFile** and **ReadFileAsByteAsync**. It is preferred to use **IFileManager** members. + +_**Usage**_ +- Follow _FileManagerImp_ + +### **Google Drive Api Manager** +_**Dependencies**_ +- Google.Apis.Drive.v3 (1.54.0.2397) + +_**Interface & Its members**_ +- IGoogleDriveApiManager + +| Member | Details | +| ------ | ------ | +| GetFilesAndFolders(string nextPageToken = null, FilesListOptionalParms optional = null) | Returns file and folder informations for an authenticated google drive folder. | +| UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null) | Upload a file in a google drive autneticated folder. Can check upload progress by providing IUploadProgress as delegate. | +| DeleteAsync(string fileId, FilesDeleteOptionalParms optional = null) | Delete a file from google drive by fileId. | +| DownloadAsync(File file, string filePath, Action downloadProgress = null) | Download a file by providing google drive file type. Can check download progress by providing IDownloadProgress delegate. | + +_**Models**_ +- FilesListOptionalParms +- FilesDeleteOptionalParms +- UploadFileInfo + +_**Notes**_ +- Need google drive .json authentication file. Like webcamsync.json. +- Follow appsettings.json + +_**Usage**_ +- Follow _GoogleDriveApiImp_ + +### **Running Programs** +_**Dependencies**_ +- System.Process + +_**Interface & Its members**_ +- IRunningPrograms + +| Member | Details | +| ------ | ------ | +| GetRunningProgramsList() | Returns all running process. | +| GetRunningProcessList() | Returns all running foreground program names. | + + +_**Usage**_ +- Follow _RunningProgramImp_ + +### **Screen Capture** +_**Dependencies**_ +- System.Drawing + +_**Interface & Its members**_ +- IScreenCapture + +| Member | Details | +| ------ | ------ | +| CaptureUserScreen(int width, int height) | Capture desktop screen for given width and height and return Bitmap | + +_**Usage**_ +- Follow _ScreenCaptureImp_ \ No newline at end of file From 2f77c768da6f82208e69e3c6ada1cd262b11678e Mon Sep 17 00:00:00 2001 From: abbirku Date: Wed, 22 Sep 2021 00:38:08 +0600 Subject: [PATCH 30/39] Provide Observation note --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f6fcb8..be05969 100644 --- a/README.md +++ b/README.md @@ -191,4 +191,8 @@ _**Interface & Its members**_ | CaptureUserScreen(int width, int height) | Capture desktop screen for given width and height and return Bitmap | _**Usage**_ -- Follow _ScreenCaptureImp_ \ No newline at end of file +- Follow _ScreenCaptureImp_ + +_**Observation Notes**_ +- Follow .csproj if fall into dependency issue. +- Follow Program.cs for Package registration. \ No newline at end of file From 04a8109523788ec2654d2bc77e2da57ce4783a76 Mon Sep 17 00:00:00 2001 From: abbirku Date: Thu, 23 Sep 2021 00:50:11 +0600 Subject: [PATCH 31/39] Provide GetAllFilesAndFolders options in GoogleDriveApiManager --- .../Implementations/GoogleDriveApiImp.cs | 37 +++---------------- .../GoogleDriveApi/GoogleDriveApiManager.cs | 30 +++++++++++++++ 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/GoogleDriveApiImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/GoogleDriveApiImp.cs index 3f9511b..264ad76 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/GoogleDriveApiImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/GoogleDriveApiImp.cs @@ -2,12 +2,8 @@ using CoreActivities.FileManager; using CoreActivities.GoogleDriveApi; using CoreActivities.GoogleDriveApi.Models; -using CoreActivities.GoogleDriveApi.Parms; using CoreActivities.RunningPrograms; -using Google.Apis.Drive.v3.Data; using System; -using System.Collections.Generic; -using System.Text; using System.Threading.Tasks; namespace CSharpLibraryTools @@ -88,37 +84,16 @@ public async Task Run() } } - private async Task> PrintFilesInAGoogleDirectory() + private async Task PrintFilesInAGoogleDirectory() { - var files = new List(); - - var optionals = new FilesListOptionalParms - { - PageSize = 5, //Provide positive integer for pagination - Fields = "nextPageToken, files(id, name, mimeType, kind, trashed)" //Follow this pattern to retrive only specified object fields - }; - - GoogleDriveFiles results = null; var counter = 0; + var files = await _googleDriveApiManager.GetAllFilesAndFolders(); - do + foreach (var item in files) { - if (results == null) - results = await _googleDriveApiManager.GetFilesAndFolders(null, optionals); - else - results = await _googleDriveApiManager.GetFilesAndFolders(results.NextPageToken, optionals); - - files.AddRange(results.Files); - - foreach (var item in results.Files) - { - Console.WriteLine($"SL: {counter} Name: {item.Name}"); - counter++; - } - - } while (results != null && !string.IsNullOrEmpty(results.NextPageToken)); - - return files; + Console.WriteLine($"SL: {counter} Name: {item.Name}"); + counter++; + } } } } diff --git a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs index 26b694d..464353b 100644 --- a/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs +++ b/CSharpLibraryTools/CoreActivities/GoogleDriveApi/GoogleDriveApiManager.cs @@ -16,6 +16,7 @@ namespace CoreActivities.GoogleDriveApi public interface IGoogleDriveApiManager { Task GetFilesAndFolders(string nextPageToken = null, FilesListOptionalParms optional = null); + Task> GetAllFilesAndFolders(FilesListOptionalParms optional = null); Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null); Task DeleteAsync(string fileId, FilesDeleteOptionalParms optional = null); Task DownloadAsync(File file, string filePath, Action downloadProgress = null); @@ -103,6 +104,35 @@ public async Task GetFilesAndFolders(string nextPageToken = nu } + public async Task> GetAllFilesAndFolders(FilesListOptionalParms optional = null) + { + GoogleDriveFiles results = null; + FilesListOptionalParms optionals = null; + var files = new List(); + + if(optional == null) + { + optionals = new FilesListOptionalParms + { + PageSize = 5, //Provide positive integer for pagination + Fields = "nextPageToken, files(id, name, mimeType, kind, trashed)" //Follow this pattern to retrive only specified object fields + }; + } + + do + { + if (results == null) + results = await GetFilesAndFolders(null, optionals); + else + results = await GetFilesAndFolders(results.NextPageToken, optionals); + + files.AddRange(results.Files); + + } while (results != null && !string.IsNullOrEmpty(results.NextPageToken)); + + return files; + } + public async Task UploadFileAsync(UploadFileInfo uploadFileInfo, Action uploadProgress = null) { //Initialization From 75c3771e7926af619513bd1360acf7a4f76b5db8 Mon Sep 17 00:00:00 2001 From: abbirku Date: Tue, 28 Sep 2021 18:30:23 +0600 Subject: [PATCH 32/39] Ignore Debug/Nuget --- .gitignore | 1 + CSharpLibraryTools/CoreActivities/CoreActivities.csproj | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index 69a99ab..d92ad33 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ /CSharpLibraryTools/CoreActivities/bin/Debug/netcoreapp3.1 /CSharpLibraryTools/CoreActivities/obj /CSharpLibraryTools/.vs/CSharpLibraryTools/config +/CSharpLibraryTools/CoreActivities/bin/Debug diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index e7d910c..edb8949 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -4,6 +4,14 @@ Library net5.0-windows netcoreapp3.1 + true + Md Shams Wadud + Reason Follower + ReasonFollower.CSharpLibraryTools.CoreActivities + Aim of this package is to separate daily code in a SOLID manner so that we could re-use the code again without reinventing the wheel. + MIT + https://github.com/abbirku/CSharpLibraryTools + Screen Capture, Running Programs, Google Drive, File Manager, Directory manager, Browser Activity, Active Program From 43992d43e6d32ca2abbcc2517b0560b211e1c694 Mon Sep 17 00:00:00 2001 From: abbirku Date: Tue, 28 Sep 2021 19:13:01 +0600 Subject: [PATCH 33/39] Provide IsBrowserOpen method and its implementation --- .../CSharpLibraryTools/Application.cs | 42 +++++++++---------- .../Implementations/BrowseActivityImp.cs | 35 +++++++++++++--- .../BrowserActivity/BrowserActivityAdaptee.cs | 8 ++++ .../BrowserActivity/BrowserActivityAdapter.cs | 9 ++++ 4 files changed, 67 insertions(+), 27 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs index 1650d15..1f53285 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Application.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -36,37 +36,37 @@ public Application(ActiveProgramImp activeProgramImp, public async Task Run() { - TitlePrinter("Active Program Information"); - await _activeProgramImp.Run(); - PrintSeperator(20); + //TitlePrinter("Active Program Information"); + //await _activeProgramImp.Run(); + //PrintSeperator(20); TitlePrinter("Browser Activity"); await _browseActivityImp.Run(); PrintSeperator(20); - TitlePrinter("Directory Manager"); - await _directoryManagerImp.Run(); - PrintSeperator(20); + //TitlePrinter("Directory Manager"); + //await _directoryManagerImp.Run(); + //PrintSeperator(20); - TitlePrinter("Webcam"); - await _egmaCv.Run(); - PrintSeperator(20); + //TitlePrinter("Webcam"); + //await _egmaCv.Run(); + //PrintSeperator(20); - TitlePrinter("File Manager"); - await _fileManagerImp.Run(); - PrintSeperator(20); + //TitlePrinter("File Manager"); + //await _fileManagerImp.Run(); + //PrintSeperator(20); - TitlePrinter("Running Programs"); - await _runningProgramImp.Run(); - PrintSeperator(20); + //TitlePrinter("Running Programs"); + //await _runningProgramImp.Run(); + //PrintSeperator(20); - TitlePrinter("Screen Capture"); - await _screenCaptureImp.Run(); - PrintSeperator(20); + //TitlePrinter("Screen Capture"); + //await _screenCaptureImp.Run(); + //PrintSeperator(20); - TitlePrinter("Google Drive Api"); - await _googleDriveApiImp.Run(); - PrintSeperator(20); + //TitlePrinter("Google Drive Api"); + //await _googleDriveApiImp.Run(); + //PrintSeperator(20); } public void TitlePrinter(string title) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs index 3de39a9..7aa0e3a 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs @@ -7,22 +7,45 @@ namespace CSharpLibraryTools public class BrowseActivityImp { private readonly IBrowserActivity _browserActivity; + private readonly BrowserActivityEnumAdaptee _browserActivityEnumAdaptee; - public BrowseActivityImp(IBrowserActivity browserActivity) + public BrowseActivityImp(IBrowserActivity browserActivity, + BrowserActivityEnumAdaptee browserActivityEnumAdaptee) { _browserActivity = browserActivity; + _browserActivityEnumAdaptee = browserActivityEnumAdaptee; } public async Task Run() { await Task.Run(() => { - var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); - Console.WriteLine($"Active URL: {activeUrl}\n"); + //Check browser open or not + Console.WriteLine($"The browser {_browserActivityEnumAdaptee.ToDescriptionString(BrowserType.Chrome)} " + + $"{(_browserActivity.IsBrowserOpen(BrowserType.Chrome)?"is open": "is not open")}"); - var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Chrome); - foreach (var item in tabs) - Console.WriteLine($"Tab: {item}"); + Console.WriteLine($"The browser {_browserActivityEnumAdaptee.ToDescriptionString(BrowserType.Edge)} " + + $"{(_browserActivity.IsBrowserOpen(BrowserType.Edge) ? "is open" : "is not open")}"); + + Console.WriteLine($"The browser {_browserActivityEnumAdaptee.ToDescriptionString(BrowserType.FireFox)} " + + $"{(_browserActivity.IsBrowserOpen(BrowserType.FireFox) ? "is open" : "is not open")}"); + + Console.WriteLine($"The browser {_browserActivityEnumAdaptee.ToDescriptionString(BrowserType.Opera)} " + + $"{(_browserActivity.IsBrowserOpen(BrowserType.Opera) ? "is open" : "is not open")}"); + + Console.WriteLine($"The browser {_browserActivityEnumAdaptee.ToDescriptionString(BrowserType.Safari)} " + + $"{(_browserActivity.IsBrowserOpen(BrowserType.Safari) ? "is open" : "is not open")}"); + + //Check open browser active url and tabs + if (_browserActivity.IsBrowserOpen(BrowserType.Chrome)) + { + var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); + Console.WriteLine($"Active URL: {activeUrl}\n"); + + var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Chrome); + foreach (var item in tabs) + Console.WriteLine($"Tab: {item}"); + } }); } } diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs index 4625cc5..f7c7afd 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Windows.Automation; namespace CoreActivities.BrowserActivity @@ -97,5 +98,12 @@ public IList GetOpenTabsInfos(BrowserType browserType) throw new Exception(ex.Message); } } + + public IList GetBrowserProcessByBrowserType(BrowserType browserType) + { + var browser = _browserActivityEnumAdaptee.ToDescriptionString(browserType).ToLower(); + var processes = Process.GetProcessesByName(browser); + return processes.Select(x => x.MainWindowTitle).GroupBy(x => x).Select(x => x.Key).ToList(); + } } } diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs index 5c60cf8..ff9e726 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using System.Linq; namespace CoreActivities.BrowserActivity { public interface IBrowserActivity { + bool IsBrowserOpen(BrowserType browserType); IList EnlistAllOpenTabs(BrowserType browserType); string EnlistActiveTabUrl(BrowserType browserType); } @@ -39,5 +41,12 @@ public IList EnlistAllOpenTabs(BrowserType browserType) return tabs; } + + public bool IsBrowserOpen(BrowserType browserType) + { + var title = _browserActivityEnumAdaptee.ToDescriptionString(browserType); + var browserTitles = _browserActivityAdaptee.GetBrowserProcessByBrowserType(browserType); + return browserTitles.Count > 0 && browserTitles.Any(x => x.ToLower().Contains(title.ToLower())); + } } } From b6c3dd4176d0aeeb2a198970378982b742a3f178 Mon Sep 17 00:00:00 2001 From: abbirku Date: Tue, 28 Sep 2021 19:16:00 +0600 Subject: [PATCH 34/39] Update Readme.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index be05969..b3182ab 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ _**Interface & Its members**_ | ------ | ------ | | EnlistAllOpenTabs(BrowserType browserType) | Returns list of open tabs title of a browser. | | EnlistActiveTabUrl(BrowserType browserType) | Returns url string of present visting website in a browser. | +| IsBrowserOpen(BrowserType browserType) | Returns bool. | _**Notes**_ - **BrowserType** is an Enum which contains **Chrome**, **FireFox**, **Edge**, **Opera**, **Safari** From eff5db7ee31ea806e7be828aaf4a7df3d41aa565 Mon Sep 17 00:00:00 2001 From: abbirku Date: Tue, 28 Sep 2021 21:08:48 +0600 Subject: [PATCH 35/39] Fix IBrowserActivity for edge --- .../Implementations/BrowseActivityImp.cs | 10 +++++ .../BrowserActivity/BrowserActivityAdaptee.cs | 38 ++++++++++++------- .../BrowserActivity/BrowserActivityAdapter.cs | 4 +- .../CoreActivities/CoreActivities.csproj | 5 ++- 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs index 7aa0e3a..b1fb89d 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs @@ -46,6 +46,16 @@ await Task.Run(() => foreach (var item in tabs) Console.WriteLine($"Tab: {item}"); } + + if (_browserActivity.IsBrowserOpen(BrowserType.Edge)) + { + var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Edge); + Console.WriteLine($"Active URL: {activeUrl}\n"); + + var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Edge); + foreach (var item in tabs) + Console.WriteLine($"Tab: {item}"); + } }); } } diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs index f7c7afd..d34c815 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs @@ -19,21 +19,19 @@ public string GetActiveTabUrl(BrowserType browserType) { // There are always multiple chrome processes, so we have to loop through all of them to find the // process with a Window Handle and an automation element of name "Address and search bar" + var browserProcess = GetBrowserProcessByBrowserType(browserType); - var browserName = _browserActivityEnumAdaptee.ToDescriptionString(browserType); - var browserProcess = Process.GetProcessesByName(browserName); - - if (browserProcess.Length > 0) + if (browserProcess.Count > 0) { var url = string.Empty; foreach (var chrome in browserProcess) { // The browser process must have a window - if (chrome.MainWindowHandle == IntPtr.Zero) + if (chrome.Process.MainWindowHandle == IntPtr.Zero) continue; // Find the automation element - var elm = AutomationElement.FromHandle(chrome.MainWindowHandle); + var elm = AutomationElement.FromHandle(chrome.Process.MainWindowHandle); var elmUrlBar = elm.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "Address and search bar")); @@ -67,17 +65,17 @@ public IList GetOpenTabsInfos(BrowserType browserType) var tabInfos = new List(); var browserName = _browserActivityEnumAdaptee.ToDescriptionString(browserType); - var processes = Process.GetProcessesByName(browserName); + var processes = GetBrowserProcessByBrowserType(browserType); - if (processes.Length <= 0) + if (processes.Count <= 0) throw new Exception($"No process found with this {browserName} name"); else { foreach (var proc in processes) { - if (proc.MainWindowHandle != IntPtr.Zero) + if (proc.Process.MainWindowHandle != IntPtr.Zero) { - var root = AutomationElement.FromHandle(proc.MainWindowHandle); + var root = AutomationElement.FromHandle(proc.Process.MainWindowHandle); var condition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem); var tabs = root.FindAll(TreeScope.Descendants, condition); var enumerator = tabs.GetEnumerator(); @@ -99,11 +97,25 @@ public IList GetOpenTabsInfos(BrowserType browserType) } } - public IList GetBrowserProcessByBrowserType(BrowserType browserType) + public IList GetBrowserProcessByBrowserType(BrowserType browserType) { var browser = _browserActivityEnumAdaptee.ToDescriptionString(browserType).ToLower(); - var processes = Process.GetProcessesByName(browser); - return processes.Select(x => x.MainWindowTitle).GroupBy(x => x).Select(x => x.Key).ToList(); + var processes = Process.GetProcesses(); + + return processes.Select(x => new ProcessAndTitle + { + MainWindowTitle = x.MainWindowTitle, + Process = x + }).Where(x => x.MainWindowTitle.ToLower().Contains(browser)) + .GroupBy(x => x.MainWindowTitle) + .Select(x => x.First()) + .ToList(); } } + + public class ProcessAndTitle + { + public string MainWindowTitle { get; set; } + public Process Process { get; set; } + } } diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs index ff9e726..dbb3709 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs @@ -44,9 +44,9 @@ public IList EnlistAllOpenTabs(BrowserType browserType) public bool IsBrowserOpen(BrowserType browserType) { - var title = _browserActivityEnumAdaptee.ToDescriptionString(browserType); + var title = _browserActivityEnumAdaptee.ToDescriptionString(browserType).ToLower(); var browserTitles = _browserActivityAdaptee.GetBrowserProcessByBrowserType(browserType); - return browserTitles.Count > 0 && browserTitles.Any(x => x.ToLower().Contains(title.ToLower())); + return browserTitles.Count > 0 && browserTitles.Any(x => x.MainWindowTitle.ToLower().Contains(title.ToLower())); } } } diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index edb8949..c198341 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -4,7 +4,7 @@ Library net5.0-windows netcoreapp3.1 - true + false Md Shams Wadud Reason Follower ReasonFollower.CSharpLibraryTools.CoreActivities @@ -12,6 +12,9 @@ MIT https://github.com/abbirku/CSharpLibraryTools Screen Capture, Running Programs, Google Drive, File Manager, Directory manager, Browser Activity, Active Program + false + 1.0.1 + Provide IsBrowserOpen(BrowserType type) In IBrowserActivity From 119d30d01c23a7f6d33561fcd5ca256366b41bd6 Mon Sep 17 00:00:00 2001 From: abbirku Date: Thu, 7 Oct 2021 22:42:22 +0600 Subject: [PATCH 36/39] Fix IBrowserActivity for edge --- CSharpLibraryTools/CoreActivities/CoreActivities.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index c198341..c511d9d 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -13,8 +13,8 @@ https://github.com/abbirku/CSharpLibraryTools Screen Capture, Running Programs, Google Drive, File Manager, Directory manager, Browser Activity, Active Program false - 1.0.1 - Provide IsBrowserOpen(BrowserType type) In IBrowserActivity + 1.1.1 + Fix IBrowserActivity for edge From 7b8edea20e8af5e104a23f0ca62a053f2efd754d Mon Sep 17 00:00:00 2001 From: abbirku Date: Thu, 7 Oct 2021 22:59:20 +0600 Subject: [PATCH 37/39] Integrate active tab title method --- .../Implementations/BrowseActivityImp.cs | 6 ++ .../BrowserActivity/BrowserActivityAdaptee.cs | 91 +++++++++++++------ .../BrowserActivity/BrowserActivityAdapter.cs | 11 +++ 3 files changed, 80 insertions(+), 28 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs index b1fb89d..c352265 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs @@ -42,6 +42,9 @@ await Task.Run(() => var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); Console.WriteLine($"Active URL: {activeUrl}\n"); + var activeTitle = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); + Console.WriteLine($"Active Tab Title: {activeTitle}\n"); + var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Chrome); foreach (var item in tabs) Console.WriteLine($"Tab: {item}"); @@ -52,6 +55,9 @@ await Task.Run(() => var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Edge); Console.WriteLine($"Active URL: {activeUrl}\n"); + var activeTitle = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); + Console.WriteLine($"Active Tab Title: {activeTitle}\n"); + var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Edge); foreach (var item in tabs) Console.WriteLine($"Tab: {item}"); diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs index d34c815..e32e7b7 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs @@ -13,44 +13,47 @@ public class BrowserActivityAdaptee public BrowserActivityAdaptee(BrowserActivityEnumAdaptee browserActivityEnumAdaptee) => _browserActivityEnumAdaptee = browserActivityEnumAdaptee; - public string GetActiveTabUrl(BrowserType browserType) + public string GetActiveTabTitle(BrowserType browserType) { try { - // There are always multiple chrome processes, so we have to loop through all of them to find the - // process with a Window Handle and an automation element of name "Address and search bar" - var browserProcess = GetBrowserProcessByBrowserType(browserType); + // Find the automation element + var elm = GetAutomationElement(browserType); + if (elm != null) + return elm.Current.Name; - if (browserProcess.Count > 0) - { - var url = string.Empty; - foreach (var chrome in browserProcess) - { - // The browser process must have a window - if (chrome.Process.MainWindowHandle == IntPtr.Zero) - continue; + return string.Empty; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + } - // Find the automation element - var elm = AutomationElement.FromHandle(chrome.Process.MainWindowHandle); - var elmUrlBar = elm.FindFirst(TreeScope.Descendants, - new PropertyCondition(AutomationElement.NameProperty, "Address and search bar")); + public string GetActiveTabUrl(BrowserType browserType) + { + try + { + // Find the automation element + var elm = GetAutomationElement(browserType); + if(elm != null) + { + var elmUrlBar = elm.FindFirst(TreeScope.Descendants, + new PropertyCondition(AutomationElement.NameProperty, "Address and search bar")); - // If it can be found, get the value from the URL bar - if (elmUrlBar != null) + // If it can be found, get the value from the URL bar + if (elmUrlBar != null) + { + var patterns = elmUrlBar.GetSupportedPatterns(); + if (patterns.Length > 0) { - var patterns = elmUrlBar.GetSupportedPatterns(); - if (patterns.Length > 0) - { - var val = (ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0]); - url = val.Current.Value; - } + var val = (ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0]); + return val.Current.Value; } } - - return url; } - else - return string.Empty; + + return string.Empty; } catch (Exception ex) { @@ -111,6 +114,38 @@ public IList GetBrowserProcessByBrowserType(BrowserType browser .Select(x => x.First()) .ToList(); } + + private AutomationElement GetAutomationElement(BrowserType browserType) + { + try + { + // There are always multiple chrome processes, so we have to loop through all of them to find the + // process with a Window Handle and an automation element of name "Address and search bar" + var browserProcess = GetBrowserProcessByBrowserType(browserType); + + if (browserProcess.Count > 0) + { + AutomationElement url = null; + foreach (var chrome in browserProcess) + { + // The browser process must have a window + if (chrome.Process.MainWindowHandle == IntPtr.Zero) + continue; + + // Find the automation element + return AutomationElement.FromHandle(chrome.Process.MainWindowHandle); + } + + return url; + } + else + return null; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + } } public class ProcessAndTitle diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs index dbb3709..b1c5851 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdapter.cs @@ -9,6 +9,7 @@ public interface IBrowserActivity bool IsBrowserOpen(BrowserType browserType); IList EnlistAllOpenTabs(BrowserType browserType); string EnlistActiveTabUrl(BrowserType browserType); + string EnlistActiveTabTitle(BrowserType browserType); } public class BrowserActivityAdapter : IBrowserActivity @@ -23,6 +24,16 @@ public BrowserActivityAdapter(BrowserActivityAdaptee browserActivityAdaptee, _browserActivityEnumAdaptee = browserActivityEnumAdaptee; } + public string EnlistActiveTabTitle(BrowserType browserType) + { + var tabTitle = _browserActivityAdaptee.GetActiveTabTitle(browserType); + + if (string.IsNullOrWhiteSpace(tabTitle)) + throw new Exception($"No active tab title found in {_browserActivityEnumAdaptee.ToDescriptionString(browserType)} browser"); + + return tabTitle; + } + public string EnlistActiveTabUrl(BrowserType browserType) { var tabUrl = _browserActivityAdaptee.GetActiveTabUrl(browserType); From 83409b87e2491c4f7099214c6c6180b41f9715d4 Mon Sep 17 00:00:00 2001 From: abbirku Date: Thu, 7 Oct 2021 23:25:42 +0600 Subject: [PATCH 38/39] Improve code --- .../CSharpLibraryTools/Application.cs | 42 +++++++++---------- .../Implementations/BrowseActivityImp.cs | 4 +- .../BrowserActivity/BrowserActivityAdaptee.cs | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Application.cs b/CSharpLibraryTools/CSharpLibraryTools/Application.cs index 1f53285..1650d15 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Application.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Application.cs @@ -36,37 +36,37 @@ public Application(ActiveProgramImp activeProgramImp, public async Task Run() { - //TitlePrinter("Active Program Information"); - //await _activeProgramImp.Run(); - //PrintSeperator(20); + TitlePrinter("Active Program Information"); + await _activeProgramImp.Run(); + PrintSeperator(20); TitlePrinter("Browser Activity"); await _browseActivityImp.Run(); PrintSeperator(20); - //TitlePrinter("Directory Manager"); - //await _directoryManagerImp.Run(); - //PrintSeperator(20); + TitlePrinter("Directory Manager"); + await _directoryManagerImp.Run(); + PrintSeperator(20); - //TitlePrinter("Webcam"); - //await _egmaCv.Run(); - //PrintSeperator(20); + TitlePrinter("Webcam"); + await _egmaCv.Run(); + PrintSeperator(20); - //TitlePrinter("File Manager"); - //await _fileManagerImp.Run(); - //PrintSeperator(20); + TitlePrinter("File Manager"); + await _fileManagerImp.Run(); + PrintSeperator(20); - //TitlePrinter("Running Programs"); - //await _runningProgramImp.Run(); - //PrintSeperator(20); + TitlePrinter("Running Programs"); + await _runningProgramImp.Run(); + PrintSeperator(20); - //TitlePrinter("Screen Capture"); - //await _screenCaptureImp.Run(); - //PrintSeperator(20); + TitlePrinter("Screen Capture"); + await _screenCaptureImp.Run(); + PrintSeperator(20); - //TitlePrinter("Google Drive Api"); - //await _googleDriveApiImp.Run(); - //PrintSeperator(20); + TitlePrinter("Google Drive Api"); + await _googleDriveApiImp.Run(); + PrintSeperator(20); } public void TitlePrinter(string title) diff --git a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs index c352265..9a21d3a 100644 --- a/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs +++ b/CSharpLibraryTools/CSharpLibraryTools/Implementations/BrowseActivityImp.cs @@ -42,7 +42,7 @@ await Task.Run(() => var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); Console.WriteLine($"Active URL: {activeUrl}\n"); - var activeTitle = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); + var activeTitle = _browserActivity.EnlistActiveTabTitle(BrowserType.Chrome); Console.WriteLine($"Active Tab Title: {activeTitle}\n"); var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Chrome); @@ -55,7 +55,7 @@ await Task.Run(() => var activeUrl = _browserActivity.EnlistActiveTabUrl(BrowserType.Edge); Console.WriteLine($"Active URL: {activeUrl}\n"); - var activeTitle = _browserActivity.EnlistActiveTabUrl(BrowserType.Chrome); + var activeTitle = _browserActivity.EnlistActiveTabTitle(BrowserType.Chrome); Console.WriteLine($"Active Tab Title: {activeTitle}\n"); var tabs = _browserActivity.EnlistAllOpenTabs(BrowserType.Edge); diff --git a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs index e32e7b7..82e38ab 100644 --- a/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs +++ b/CSharpLibraryTools/CoreActivities/BrowserActivity/BrowserActivityAdaptee.cs @@ -71,7 +71,7 @@ public IList GetOpenTabsInfos(BrowserType browserType) var processes = GetBrowserProcessByBrowserType(browserType); if (processes.Count <= 0) - throw new Exception($"No process found with this {browserName} name"); + return new List(); else { foreach (var proc in processes) From 31085111a3828a6d2207199dcd49542446be6d89 Mon Sep 17 00:00:00 2001 From: abbirku Date: Fri, 8 Oct 2021 00:38:19 +0600 Subject: [PATCH 39/39] Update readme --- CSharpLibraryTools/CoreActivities/CoreActivities.csproj | 4 ++-- README.md | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj index c511d9d..60932e1 100644 --- a/CSharpLibraryTools/CoreActivities/CoreActivities.csproj +++ b/CSharpLibraryTools/CoreActivities/CoreActivities.csproj @@ -13,8 +13,8 @@ https://github.com/abbirku/CSharpLibraryTools Screen Capture, Running Programs, Google Drive, File Manager, Directory manager, Browser Activity, Active Program false - 1.1.1 - Fix IBrowserActivity for edge + 1.2.1 + Add EnlistActiveTabTitle in IBrowserActivity diff --git a/README.md b/README.md index b3182ab..733e61b 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ _**Interface & Its members**_ | ------ | ------ | | EnlistAllOpenTabs(BrowserType browserType) | Returns list of open tabs title of a browser. | | EnlistActiveTabUrl(BrowserType browserType) | Returns url string of present visting website in a browser. | +| EnlistActiveTabTitle(BrowserType browserType) | Returns tab title of present visting website in a browser. | | IsBrowserOpen(BrowserType browserType) | Returns bool. | _**Notes**_