Initial check-in
This commit is contained in:
63
.gitattributes
vendored
Normal file
63
.gitattributes
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
||||
377
.gitignore
vendored
377
.gitignore
vendored
@@ -1,26 +1,363 @@
|
||||
# ---> Windows
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
Thumbs.db:encryptable
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Oo]ut/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
132
CommonLib/CommonLib.csproj
Normal file
132
CommonLib/CommonLib.csproj
Normal file
@@ -0,0 +1,132 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>CommonLib</RootNamespace>
|
||||
<AssemblyName>CommonLib</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.DirectoryServices" />
|
||||
<Reference Include="System.DirectoryServices.AccountManagement" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Management" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xaml" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Library\Collections\MultiMap.cs" />
|
||||
<Compile Include="Library\Diagnostics\ProcessStarter.cs" />
|
||||
<Compile Include="Library\Diagnostics\StopWatchCustom.cs" />
|
||||
<Compile Include="Library\DirectoryServices\ActiveDirectory.cs" />
|
||||
<Compile Include="Library\IO\FileManip.cs" />
|
||||
<Compile Include="Library\IO\Hardware.cs" />
|
||||
<Compile Include="Library\IO\IniFileManip.cs" />
|
||||
<Compile Include="Library\IO\PathManip.cs" />
|
||||
<Compile Include="Library\IO\TreeUtils.cs" />
|
||||
<Compile Include="Library\Misc\ArrayManip.cs" />
|
||||
<Compile Include="Library\Misc\Conversion.cs" />
|
||||
<Compile Include="Library\Misc\DateTimeManip.cs" />
|
||||
<Compile Include="Library\Misc\ErrorHandling.cs" />
|
||||
<Compile Include="Library\Misc\StringManip.cs" />
|
||||
<Compile Include="Library\Windows\Misc\NetworkManagement.cs" />
|
||||
<Compile Include="Library\Windows\Misc\NetworkSharing.cs" />
|
||||
<Compile Include="Library\Windows\Misc\WindowsAdministration.cs" />
|
||||
<Compile Include="Library\Windows\Misc\WindowShortcut.cs" />
|
||||
<Compile Include="Library\Runtime\InteropServices\Win32Helpers.cs" />
|
||||
<Compile Include="Library\Windows\Forms\FormControlsFormatting.cs" />
|
||||
<Compile Include="Library\Windows\Forms\FormControlsManipThreadSafe.cs" />
|
||||
<Compile Include="Library\Windows\Forms\frmChildForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Library\Windows\Forms\frmChildForm.designer.cs">
|
||||
<DependentUpon>frmChildForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Library\Windows\Forms\MessageBoxCustom.cs" />
|
||||
<Compile Include="Library\Windows\Forms\MessageBoxExLib\MessageBoxEx.cs" />
|
||||
<Compile Include="Library\Windows\Forms\MessageBoxExLib\MessageBoxExButton.cs" />
|
||||
<Compile Include="Library\Windows\Forms\MessageBoxExLib\MessageBoxExButtons.cs" />
|
||||
<Compile Include="Library\Windows\Forms\MessageBoxExLib\MessageBoxExForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Library\Windows\Forms\MessageBoxExLib\MessageBoxExIcon.cs" />
|
||||
<Compile Include="Library\Windows\Forms\MessageBoxExLib\MessageBoxExManager.cs" />
|
||||
<Compile Include="Library\Windows\Forms\MessageBoxExLib\MessageBoxExResult.cs" />
|
||||
<Compile Include="Library\Windows\Forms\MessageBoxExLib\TimeoutResult.cs" />
|
||||
<Compile Include="Library\Windows\Misc\WindowsRegistry.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Library\Net\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Library\Windows\Forms\MessageBoxExLib\MessageBoxExForm.resx">
|
||||
<DependentUpon>MessageBoxExForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Library\Windows\Forms\MessageBoxExLib\Resources\StandardButtonsText.de.resx" />
|
||||
<EmbeddedResource Include="Library\Windows\Forms\MessageBoxExLib\Resources\StandardButtonsText.fr.resx" />
|
||||
<EmbeddedResource Include="Library\Windows\Forms\MessageBoxExLib\Resources\StandardButtonsText.resx" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
31
CommonLib/CommonLib.sln
Normal file
31
CommonLib/CommonLib.sln
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.34601.136
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonLib", "CommonLib.csproj", "{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}.Debug|x64.Build.0 = Debug|x64
|
||||
{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}.Release|x64.ActiveCfg = Release|x64
|
||||
{C88B26CE-093C-475E-B8FA-E70BA5A0D16E}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {BE528BB8-3FB5-4D7C-8534-C024B287B265}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
143
CommonLib/Library/Collections/MultiMap.cs
Normal file
143
CommonLib/Library/Collections/MultiMap.cs
Normal file
@@ -0,0 +1,143 @@
|
||||
///======================================================================================
|
||||
/// File: MultiMap.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Provides MultiMap functionality
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace CommonLib.Collections
|
||||
{
|
||||
///======================================================================================
|
||||
/// MultiMap
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// This class defines a MultiMap where one can add multiple values to a
|
||||
/// single key in a Dictionary. This code uses string keys
|
||||
///
|
||||
/// Usage example:
|
||||
/// bool b1 = true;
|
||||
/// bool b2 = false;
|
||||
/// bool b3 = false;
|
||||
///
|
||||
/// MultiMap<bool> m1 = new MultiMap<bool>();
|
||||
/// m1.Add("key1", b1);
|
||||
/// m1.Add("key1", b2);
|
||||
/// m1.Add("key2", b3);
|
||||
///
|
||||
/// foreach (string k in m1.Keys)
|
||||
/// {
|
||||
/// foreach (bool b in m1[k])
|
||||
/// {
|
||||
/// Console.WriteLine(k + "=" + b);
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
public class MultiMap<V>
|
||||
{
|
||||
// 1
|
||||
Dictionary<string, List<V>> _dictionary = new Dictionary<string, List<V>>();
|
||||
|
||||
public int keyCount = 0;
|
||||
|
||||
///==========================================================================
|
||||
/// MultiMap.Add
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Adds the specified value under the specified key. If key doesn't exist
|
||||
/// yet, add the key and increment the key count
|
||||
/// </summary>
|
||||
/// <param name="key">a string key</param>
|
||||
/// <param name="value">a string value associated with the key</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public void Add(string key, V value)
|
||||
{
|
||||
List<V> list;
|
||||
if (this._dictionary.TryGetValue(key, out list))
|
||||
{
|
||||
// 2A.
|
||||
list.Add(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 2B.
|
||||
list = new List<V>();
|
||||
list.Add(value);
|
||||
this._dictionary[key] = list;
|
||||
keyCount++;
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// MultiMap.GetKeyValueCount
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// For a specified key, return the number of entries associated with it
|
||||
/// </summary>
|
||||
/// <param name="key">a string key</param>
|
||||
/// <param name="value">a string value associated with the key</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public int GetKeyValueCount(string key)
|
||||
{
|
||||
List<V> list;
|
||||
if (this._dictionary.TryGetValue(key, out list))
|
||||
{
|
||||
return list.Count;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 3
|
||||
public IEnumerable<string> Keys
|
||||
{
|
||||
get
|
||||
{
|
||||
return this._dictionary.Keys;
|
||||
}
|
||||
}
|
||||
|
||||
// 4
|
||||
public List<V> this[string key]
|
||||
{
|
||||
get
|
||||
{
|
||||
List<V> list;
|
||||
if (this._dictionary.TryGetValue(key, out list))
|
||||
{
|
||||
return list;
|
||||
}
|
||||
else
|
||||
{
|
||||
return new List<V>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
107
CommonLib/Library/Diagnostics/ProcessStarter.cs
Normal file
107
CommonLib/Library/Diagnostics/ProcessStarter.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
///======================================================================================
|
||||
/// File: clsProcessStarter.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Provides a class to start a process, get output message if any and exit code
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace CommonLib.Diagnostics
|
||||
{
|
||||
///======================================================================================
|
||||
/// clsProcessStarter
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Provides a class to start a process, get output message if any and exit code
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
public class ProcessStarter
|
||||
{
|
||||
private ProcessStartInfo procInfo = null;
|
||||
|
||||
public int procExitCode
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public string outputMsg
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public string procArguments
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public string fileName
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public ProcessStarter()
|
||||
{
|
||||
procExitCode = -1;
|
||||
outputMsg = "";
|
||||
procArguments = "";
|
||||
fileName = "";
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// clsProcessStarter.Run
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Run another process, save output message if any and exit code
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public void Run()
|
||||
{
|
||||
int exitCode = this.procExitCode;
|
||||
|
||||
try
|
||||
{
|
||||
procInfo = new ProcessStartInfo(this.fileName);
|
||||
procInfo.RedirectStandardOutput = true;
|
||||
procInfo.UseShellExecute = false;
|
||||
procInfo.CreateNoWindow = true;
|
||||
procInfo.Arguments = this.procArguments;
|
||||
Process proc = Process.Start(procInfo);
|
||||
this.outputMsg = proc.StandardOutput.ReadToEnd();
|
||||
proc.WaitForExit();
|
||||
exitCode = proc.ExitCode;
|
||||
proc.Close();
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
this.procExitCode = exitCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
178
CommonLib/Library/Diagnostics/StopWatchCustom.cs
Normal file
178
CommonLib/Library/Diagnostics/StopWatchCustom.cs
Normal file
@@ -0,0 +1,178 @@
|
||||
///======================================================================================
|
||||
/// File: StopWatchCustom.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// This is a custom Stopwatch with extra functionality since there's already a StopWatch
|
||||
/// in Microsoft Libraries, but with limited functionality
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace CommonLib.Diagnostics
|
||||
{
|
||||
///======================================================================================
|
||||
/// StopWatchCustom
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// This class can return the elapsed time in multiple formats
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
public class StopWatchCustom
|
||||
{
|
||||
private DateTime startTime;
|
||||
private DateTime stopTime;
|
||||
private DateTime currentTime;
|
||||
private bool running = false;
|
||||
|
||||
///==========================================================================
|
||||
/// StopWatchCustom.Start
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Keeps track of the start time
|
||||
/// </summary>
|
||||
/// <param>None</param>
|
||||
/// <return>void</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public void Start()
|
||||
{
|
||||
this.startTime = DateTime.Now;
|
||||
this.running = true;
|
||||
}
|
||||
|
||||
|
||||
///==========================================================================
|
||||
/// StopWatchCustom.Stop
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Keeps track of the stop time
|
||||
/// </summary>
|
||||
/// <param>None</param>
|
||||
/// <return>void</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public void Stop()
|
||||
{
|
||||
this.stopTime = DateTime.Now;
|
||||
this.running = false;
|
||||
}
|
||||
|
||||
|
||||
///==========================================================================
|
||||
/// StopWatchCustom.GetElapsedTimeString
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Calculates elapsed time and format the time into days, hours, minutes
|
||||
/// and seconds
|
||||
/// </summary>
|
||||
/// <param>None</param>
|
||||
/// <return>a string indicating days, hours, minutes and seconds</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public string GetElapsedTimeString()
|
||||
{
|
||||
TimeSpan interval;
|
||||
|
||||
if (!running)
|
||||
return ""; //interval = DateTime.Now - startTime;
|
||||
else
|
||||
{
|
||||
this.currentTime = DateTime.Now;
|
||||
interval = currentTime - startTime;
|
||||
}
|
||||
|
||||
int days = interval.Days;
|
||||
double hours = interval.Hours;
|
||||
double mins = interval.Minutes;
|
||||
double secs = interval.Seconds;
|
||||
string x = "";
|
||||
if (days != 0)
|
||||
{
|
||||
x += days.ToString() + ":";
|
||||
}
|
||||
if (hours != 0)
|
||||
{
|
||||
x += hours.ToString("00") + ":";
|
||||
}
|
||||
x += mins.ToString("00") + ":";
|
||||
x += secs.ToString("00");
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// StopWatchCustom.GetElapsedMilliseconds
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Calculates elapsed time and return the time in milliseconds
|
||||
/// </summary>
|
||||
/// <param>None</param>
|
||||
/// <return>time in milliseconds</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public double GetElapsedMilliseconds()
|
||||
{
|
||||
TimeSpan interval;
|
||||
|
||||
if (running)
|
||||
interval = DateTime.Now - startTime;
|
||||
else
|
||||
interval = stopTime - startTime;
|
||||
|
||||
return interval.TotalMilliseconds;
|
||||
}
|
||||
|
||||
|
||||
///==========================================================================
|
||||
/// StopWatchCustom.GetElapsedTimeSecs
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Calculates elapsed time and return the time in seconds
|
||||
/// </summary>
|
||||
/// <param>None</param>
|
||||
/// <return>time in seconds</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public double GetElapsedTimeSecs()
|
||||
{
|
||||
TimeSpan interval;
|
||||
|
||||
if (running)
|
||||
interval = DateTime.Now - startTime;
|
||||
else
|
||||
interval = stopTime - startTime;
|
||||
|
||||
return interval.TotalSeconds;
|
||||
}
|
||||
}
|
||||
}
|
||||
98
CommonLib/Library/DirectoryServices/ActiveDirectory.cs
Normal file
98
CommonLib/Library/DirectoryServices/ActiveDirectory.cs
Normal file
@@ -0,0 +1,98 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.DirectoryServices;
|
||||
|
||||
namespace CommonLib.DirectoryServices
|
||||
{
|
||||
public static class ActiveDirectoryQuery
|
||||
{
|
||||
public static LDAPSearchResult LDAPanonymousConnect(string LDAPserver, string LDAPpath)
|
||||
{
|
||||
LDAPSearchResult LDAPsearchMe = new LDAPSearchResult();
|
||||
LDAPsearchMe.LDAPsearch = null;
|
||||
|
||||
// create and return new LDAP connection with desired settings
|
||||
DirectoryEntry ldapConnection = new DirectoryEntry("LDAP://" + LDAPserver + "/" + LDAPpath);
|
||||
ldapConnection.AuthenticationType = AuthenticationTypes.None;
|
||||
|
||||
try
|
||||
{
|
||||
// create search object which operates on LDAP connection object
|
||||
// and set search object to only find the user specified
|
||||
LDAPsearchMe.LDAPsearch = new DirectorySearcher(ldapConnection);
|
||||
|
||||
LDAPsearchMe.ConnectStatus = LDAPQueryResult.LDAPConnectSuccess;
|
||||
}
|
||||
|
||||
catch (Exception e)
|
||||
{
|
||||
LDAPsearchMe.ErrorMsg = e.ToString();
|
||||
LDAPsearchMe.ConnectStatus = LDAPQueryResult.LDAPConnectFailed;
|
||||
}
|
||||
|
||||
return LDAPsearchMe;
|
||||
}
|
||||
|
||||
public static LDAPSearchResult LDAPsecureConnect(string LDAPserver, string domain, string userName, string LDAPpassword, string LDAPpath)
|
||||
{
|
||||
LDAPSearchResult LDAPsearchMe = new LDAPSearchResult();
|
||||
LDAPsearchMe.LDAPsearch = null;
|
||||
|
||||
// create and return new LDAP connection with desired settings
|
||||
DirectoryEntry ldapConnection = new DirectoryEntry(LDAPserver);
|
||||
ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
|
||||
ldapConnection.Username = domain + @"\" + userName;
|
||||
ldapConnection.Password = LDAPpassword;
|
||||
ldapConnection.Path = LDAPpath;
|
||||
|
||||
try
|
||||
{
|
||||
// create search object which operates on LDAP connection object
|
||||
// and set search object to only find the user specified
|
||||
LDAPsearchMe.LDAPsearch = new DirectorySearcher(ldapConnection);
|
||||
|
||||
LDAPsearchMe.ConnectStatus = LDAPQueryResult.LDAPConnectSuccess;
|
||||
}
|
||||
|
||||
catch (Exception e)
|
||||
{
|
||||
LDAPsearchMe.ErrorMsg = e.ToString();
|
||||
LDAPsearchMe.ConnectStatus = LDAPQueryResult.LDAPConnectFailed;
|
||||
}
|
||||
|
||||
return LDAPsearchMe;
|
||||
}
|
||||
|
||||
public struct LDAPSearchResult
|
||||
{
|
||||
public string ErrorMsg
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
public LDAPQueryResult ConnectStatus
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
public DirectorySearcher LDAPsearch
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
}
|
||||
|
||||
public enum LDAPQueryResult
|
||||
{
|
||||
// Summary:
|
||||
// If connection to LDAP is successful
|
||||
LDAPConnectSuccess = 0,
|
||||
//
|
||||
// Summary:
|
||||
// If connection to LDAP fails
|
||||
LDAPConnectFailed = 1,
|
||||
}
|
||||
}
|
||||
}
|
||||
1198
CommonLib/Library/IO/FileManip.cs
Normal file
1198
CommonLib/Library/IO/FileManip.cs
Normal file
File diff suppressed because it is too large
Load Diff
136
CommonLib/Library/IO/Hardware.cs
Normal file
136
CommonLib/Library/IO/Hardware.cs
Normal file
@@ -0,0 +1,136 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.IO;
|
||||
|
||||
using CommonLib.Runtime.InteropServices;
|
||||
|
||||
namespace CommonLib.IO
|
||||
{
|
||||
public class Hardware
|
||||
{
|
||||
///==========================================================================
|
||||
/// Hardware.GetAllCdDrives
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get all the drive letters of all the cd drives in the computer
|
||||
/// </summary>
|
||||
/// <return>list of cd drive letters</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static List<string> GetAllCdDrives()
|
||||
{
|
||||
List<string> cdDrives = new List<string>();
|
||||
|
||||
foreach (var drive in DriveInfo.GetDrives().Where(d => d.DriveType == DriveType.CDRom))
|
||||
{
|
||||
cdDrives.Add(drive.Name);
|
||||
}
|
||||
|
||||
return cdDrives;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// Hardware.IsCdDrive
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Determine if drive letter is CD Drive
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool IsCdDrive(string driveLetter)
|
||||
{
|
||||
bool isCdRom = false;
|
||||
string driveLetterFormatted = "";
|
||||
Match regExMatch;
|
||||
|
||||
regExMatch = Regex.Match(driveLetter, @"([a-zA-Z]).*");
|
||||
|
||||
if (regExMatch.Success)
|
||||
{
|
||||
driveLetterFormatted = regExMatch.Groups[1].Value;
|
||||
|
||||
foreach (var drive in DriveInfo.GetDrives().Where(d => d.DriveType == DriveType.CDRom))
|
||||
{
|
||||
if (Regex.IsMatch(driveLetterFormatted + @":\", @"^" + Regex.Escape(drive.Name), RegexOptions.IgnoreCase))
|
||||
{
|
||||
isCdRom = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return isCdRom;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// Hardware.OpenCdDrive
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Open CD Drive
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool OpenCdDrive(string driveLetter)
|
||||
{
|
||||
const int OPEN_EXISTING = 3;
|
||||
const uint GENERIC_READ = 0x80000000;
|
||||
const uint GENERIC_WRITE = 0x40000000;
|
||||
const uint IOCTL_STORAGE_EJECT_MEDIA = 2967560;
|
||||
const uint FILE_SHARE_READ = 0x00000001;
|
||||
const uint FILE_SHARE_WRITE = 0x00000002;
|
||||
|
||||
bool successful = true;
|
||||
|
||||
Match regExMatch;
|
||||
string driveLetterFormatted = "";
|
||||
|
||||
if (driveLetter.Length == 0)
|
||||
successful = false;
|
||||
|
||||
if (successful)
|
||||
{
|
||||
regExMatch = Regex.Match(driveLetter, @"([a-zA-Z]).*");
|
||||
|
||||
if (regExMatch.Success)
|
||||
{
|
||||
driveLetterFormatted = regExMatch.Groups[1].Value;
|
||||
}
|
||||
|
||||
if (IsCdDrive(driveLetterFormatted))
|
||||
{
|
||||
string path = "\\\\.\\" + driveLetterFormatted + ":";
|
||||
|
||||
IntPtr handle = Win32Helpers.CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
IntPtr.Zero, OPEN_EXISTING, 0,
|
||||
IntPtr.Zero);
|
||||
|
||||
if ((long)handle != -1)
|
||||
{
|
||||
int dummy = 0;
|
||||
Win32Helpers.DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0,
|
||||
IntPtr.Zero, 0, ref dummy, IntPtr.Zero);
|
||||
Win32Helpers.CloseHandle(handle);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
successful = false;
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
}
|
||||
}
|
||||
204
CommonLib/Library/IO/IniFileManip.cs
Normal file
204
CommonLib/Library/IO/IniFileManip.cs
Normal file
@@ -0,0 +1,204 @@
|
||||
///======================================================================================
|
||||
/// File: IniFileManip.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Manipulate INI file
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
using CommonLib.Misc;
|
||||
|
||||
namespace CommonLib.IO
|
||||
{
|
||||
///======================================================================================
|
||||
/// IniFileManip
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// This class can read, write or query any section, key and values in an INI file
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
public class IniFileManip
|
||||
{
|
||||
public string iniFile;
|
||||
|
||||
[DllImport("kernel32")]
|
||||
private static extern long WritePrivateProfileString(string section,
|
||||
string key, string val, string filePath);
|
||||
|
||||
[DllImport("kernel32")]
|
||||
private static extern int GetPrivateProfileString(string section,
|
||||
string key, string def, StringBuilder retVal, int size, string filePath);
|
||||
|
||||
[DllImport("kernel32")]
|
||||
static extern uint GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer,
|
||||
uint nSize, string lpFileName);
|
||||
|
||||
[DllImport("kernel32")]
|
||||
private static extern int GetPrivateProfileSection(string section, byte[] lpReturnedString, int nSize, string lpFileName);
|
||||
|
||||
public IniFileManip(string path)
|
||||
{
|
||||
iniFile = path;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// IniFileManip.IniWriteValue
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Modify a value of a key in Ini file. If key doesn't exist, add it
|
||||
/// </summary>
|
||||
/// <param name="Section"></param>
|
||||
/// <param name="Key"></param>
|
||||
/// <param name="Value"></param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public void WriteValue(string Section, string Key, string Value)
|
||||
{
|
||||
WritePrivateProfileString(Section, Key, Value, this.iniFile);
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// IniFileManip.IniReadValue
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Read a value of a key in Ini file
|
||||
/// </summary>
|
||||
/// <param name="Section"></param>
|
||||
/// <param name="Key"></param>
|
||||
/// <return>Value of a key in a section of the ini file</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public string ReadValue(string Section, string Key)
|
||||
{
|
||||
StringBuilder temp = new StringBuilder(255);
|
||||
int i = GetPrivateProfileString(Section, Key, "", temp, 255, this.iniFile);
|
||||
return temp.ToString();
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// IniFileManip.SectionExists
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Determines if a section exist in Ini file
|
||||
/// </summary>
|
||||
/// <param name="Section"></param>
|
||||
/// <return>true if a section exists, otherwise false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public bool SectionExists(string Section)
|
||||
{
|
||||
StringBuilder temp = new StringBuilder(255);
|
||||
int i = GetPrivateProfileString(Section, null, "", temp, 255, this.iniFile);
|
||||
return (i > 0);
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// IniFileManip.getSectionNames
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get names of all sections in the ini file, even duplicate section names
|
||||
/// </summary>
|
||||
/// <return>an array of strings with section names</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public string[] GetSectionNames()
|
||||
{
|
||||
|
||||
uint MAX_BUFFER = 32767;
|
||||
IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER);
|
||||
uint bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, iniFile);
|
||||
if (bytesReturned == 0)
|
||||
{
|
||||
Marshal.FreeCoTaskMem(pReturnedString);
|
||||
return null;
|
||||
}
|
||||
string local = Marshal.PtrToStringAnsi(pReturnedString, (int)bytesReturned).ToString();
|
||||
Marshal.FreeCoTaskMem(pReturnedString);
|
||||
//use of Substring below removes terminating null for split
|
||||
return local.Substring(0, local.Length - 1).Split('\0');
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// IniFileManip.getUniqueSectionNames
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get names of only unique sections in the ini file. If there are duplicate
|
||||
/// section names, only 1 is chosen
|
||||
/// </summary>
|
||||
/// <return>an array of strings with unique section names</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public string[] GetUniqueSectionNames()
|
||||
{
|
||||
uint MAX_BUFFER = 32767;
|
||||
IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER);
|
||||
uint bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, iniFile);
|
||||
if (bytesReturned == 0)
|
||||
{
|
||||
Marshal.FreeCoTaskMem(pReturnedString);
|
||||
return null;
|
||||
}
|
||||
string local = Marshal.PtrToStringAnsi(pReturnedString, (int)bytesReturned).ToString();
|
||||
Marshal.FreeCoTaskMem(pReturnedString);
|
||||
|
||||
return ArrayManip.GetDistinctValues(local.Substring(0, local.Length - 1).Split('\0'));
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// IniFileManip.readSectionData
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get all the keys and their associated values in a section
|
||||
/// </summary>
|
||||
/// <param name="section"></param>
|
||||
/// <return>an array of strings with each entry containing key and value pair
|
||||
/// </return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public string[] ReadSectionData(string section)
|
||||
{
|
||||
const int bufferSize = 32767;
|
||||
|
||||
StringBuilder returnedString = new StringBuilder();
|
||||
|
||||
byte[] pReturnedString = new byte[bufferSize];
|
||||
|
||||
GetPrivateProfileSection(section, pReturnedString, bufferSize, iniFile);
|
||||
return Encoding.ASCII.GetString(pReturnedString).Trim('\0').Split('\0');
|
||||
}
|
||||
}
|
||||
}
|
||||
716
CommonLib/Library/IO/PathManip.cs
Normal file
716
CommonLib/Library/IO/PathManip.cs
Normal file
@@ -0,0 +1,716 @@
|
||||
///======================================================================================
|
||||
/// File: PathManip.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// This class deals with anything having to do with directory and file paths
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.ComponentModel;
|
||||
|
||||
using CommonLib.Misc;
|
||||
using CommonLib.Windows.Misc;
|
||||
|
||||
namespace CommonLib.IO
|
||||
{
|
||||
public class PathManip
|
||||
{
|
||||
[DllImport("shlwapi.dll")]
|
||||
public static extern bool PathIsNetworkPath(string path);
|
||||
|
||||
[DllImport("Shlwapi.dll")]
|
||||
public static extern bool PathIsUNC(String pszPath);
|
||||
|
||||
public enum enumWindowsDesignatedPaths { USER_DESKTOP, USER_PROFILE, ALL_USER_DESKTOP, USER_STARTUP_FOLDER, ALL_USER_STARTUP_FOLDER, USER_TEMP_FOLDER, CD_DRIVE };
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.PathIsFile
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Determine if a given path is a file
|
||||
/// </summary>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool PathIsFile(string path)
|
||||
{
|
||||
bool isFile = false;
|
||||
|
||||
if (File.Exists(path))
|
||||
isFile = true;
|
||||
else if (Regex.IsMatch(path, @".+\.[^\\//.]+$", RegexOptions.IgnoreCase))
|
||||
{
|
||||
isFile = true;
|
||||
}
|
||||
|
||||
return isFile;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.IsAbsolutePath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Determine if a given path is an absolute path
|
||||
/// </summary>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool IsAbsolutePath(string path)
|
||||
{
|
||||
bool pathIsAbsolute = false;
|
||||
|
||||
if (Regex.IsMatch(path, @"^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$"))
|
||||
{
|
||||
pathIsAbsolute = true;
|
||||
}
|
||||
|
||||
return pathIsAbsolute;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GetUserDesktopPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the path to the user desktop
|
||||
/// </summary>
|
||||
/// <return>User's desktop path</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetUserDesktopPath()
|
||||
{
|
||||
string path = "";
|
||||
|
||||
// get the full domain and logon id
|
||||
string currentWindowLogin = WindowsAdministration.GetWindowLoginID();
|
||||
// get only logon id
|
||||
currentWindowLogin = Regex.Replace(currentWindowLogin, @"[^\\]+\\([^\\]+)", "$1");
|
||||
path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
|
||||
|
||||
// if this application is run as an account other than the account used to log into windows
|
||||
if (!Regex.IsMatch(path, currentWindowLogin))
|
||||
{
|
||||
// Modify the desktop path to reflect the desktop path of the actual account used to log into windows
|
||||
path = Regex.Replace(path, @"(.+)\\[^\\]+\\Desktop", "$1\\" + currentWindowLogin + "\\Desktop", RegexOptions.IgnoreCase);
|
||||
}
|
||||
|
||||
path = RemoveTrailingSlashInPath(path);
|
||||
return path;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GetUserProfilePath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the path to user's home directory
|
||||
/// </summary>
|
||||
/// <return>User's desktop path</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetUserProfilePath()
|
||||
{
|
||||
string path = "";
|
||||
|
||||
path = RemoveTrailingSlashInPath(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile));
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GetAllUserDesktopPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the path to the all user's desktop
|
||||
/// </summary>
|
||||
/// <return>User's desktop path</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetAllUserDesktopPath()
|
||||
{
|
||||
string path = "";
|
||||
|
||||
path = RemoveTrailingSlashInPath(Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory));
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GetUserStartupFolderPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the path to the user startup folder
|
||||
/// </summary>
|
||||
/// <return>User's desktop path</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetUserStartupFolderPath()
|
||||
{
|
||||
string path = "";
|
||||
|
||||
// get the full domain and logon id
|
||||
string currentWindowLogin = WindowsAdministration.GetWindowLoginID();
|
||||
// get only logon id
|
||||
currentWindowLogin = Regex.Replace(currentWindowLogin, @"[^\\]+\\([^\\]+)", "$1");
|
||||
path = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
|
||||
|
||||
// if this application is run as an account other than the account used to log into windows
|
||||
if (!Regex.IsMatch(path, currentWindowLogin))
|
||||
{
|
||||
// Modify the desktop path to reflect the desktop path of the actual account used to log into windows
|
||||
path = Regex.Replace(path, @"(.+\\Users\\)[^\\]+(\\.+Start Menu)", "${1}" + currentWindowLogin + "$2", RegexOptions.IgnoreCase);
|
||||
}
|
||||
|
||||
path = RemoveTrailingSlashInPath(path);
|
||||
return path;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GetAllUserStartupFolderPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the path to the all user startup folder
|
||||
/// </summary>
|
||||
/// <return>User's desktop path</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetAllUserStartupFolderPath()
|
||||
{
|
||||
string path = "";
|
||||
|
||||
path = RemoveTrailingSlashInPath(Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup));
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GetUserTempPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the path to the user's temporary folder
|
||||
/// </summary>
|
||||
/// <return>User's temporary path</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetUserTempPath()
|
||||
{
|
||||
string path = "";
|
||||
|
||||
// get the full domain and logon id
|
||||
string currentWindowLogin = WindowsAdministration.GetWindowLoginID();
|
||||
// get only logon id
|
||||
currentWindowLogin = Regex.Replace(currentWindowLogin, @"[^\\]+\\([^\\]+)", "$1");
|
||||
path = Path.GetTempPath();
|
||||
|
||||
// if this application is run as an account other than the account used to log into windows
|
||||
if (!Regex.IsMatch(path, currentWindowLogin))
|
||||
{
|
||||
// Modify the desktop path to reflect the desktop path of the actual account used to log into windows
|
||||
path = Regex.Replace(path, @"(.+)\\[^\\]+\\(appdata.+[^\\])\\?", "$1\\" + currentWindowLogin + "\\$2", RegexOptions.IgnoreCase);
|
||||
}
|
||||
|
||||
path = RemoveTrailingSlashInPath(path);
|
||||
return path;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.DeleteFoldersRecursive
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Delete folder including all file and subfolders within it
|
||||
/// </summary>
|
||||
/// <param name="directory">Path to a directory</param>
|
||||
/// <return>None</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static void DeleteFoldersRecursive(string directory)
|
||||
{
|
||||
var dirInfo = new DirectoryInfo(directory) { Attributes = FileAttributes.Normal };
|
||||
|
||||
foreach (var info in dirInfo.GetFileSystemInfos("*", SearchOption.AllDirectories))
|
||||
{
|
||||
info.Attributes = FileAttributes.Normal;
|
||||
}
|
||||
|
||||
dirInfo.Delete(true);
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.PathIsWritable
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given a path, make sure we can create a folder if it doesn't exist
|
||||
/// or if it does exist, create an empty file in it to see if user has write
|
||||
/// access
|
||||
/// </summary>
|
||||
/// <param name="path">Path to a directory</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool PathIsWritable(string path)
|
||||
{
|
||||
bool writable = true;
|
||||
|
||||
path = PathManip.AddTrailingSlashToPath(path);
|
||||
|
||||
// if the path doesn't exist and it contains at least one folder,
|
||||
// we want to check if upper level folder exists
|
||||
if (!Directory.Exists(path) && PathContainsAtLeastOneFolder(path))
|
||||
{
|
||||
string tempDir = "";
|
||||
string topLevelDirNotFound = path;
|
||||
|
||||
while (!Directory.Exists(topLevelDirNotFound))
|
||||
{
|
||||
if (!Regex.IsMatch(topLevelDirNotFound, @"[^\\]+\\", RegexOptions.IgnoreCase))
|
||||
{
|
||||
writable = false;
|
||||
break;
|
||||
}
|
||||
tempDir = topLevelDirNotFound;
|
||||
// remove the inner most folder
|
||||
topLevelDirNotFound = Regex.Replace(topLevelDirNotFound, @"\\[^\\]+\\?$", "", RegexOptions.IgnoreCase);
|
||||
}
|
||||
|
||||
if (writable)
|
||||
{
|
||||
if (tempDir.Length > 0)
|
||||
topLevelDirNotFound = tempDir;
|
||||
else
|
||||
tempDir = path;
|
||||
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(path);
|
||||
// delete only the directories that were created
|
||||
Directory.Delete(tempDir, true);
|
||||
}
|
||||
catch
|
||||
{
|
||||
writable = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else // if the path exists
|
||||
{
|
||||
string filename = "test";
|
||||
string fileExt = ".txt";
|
||||
int count = 1;
|
||||
string errMsg = "";
|
||||
string filePathAndName = Path.Combine(path, filename + fileExt);
|
||||
while (File.Exists(filePathAndName))
|
||||
{
|
||||
filename = "test" + (count++).ToString();
|
||||
filePathAndName = Path.Combine(path, filename + fileExt);
|
||||
}
|
||||
|
||||
// create a new file
|
||||
if (!FileManip.CopyFile("", "", Path.GetDirectoryName(filePathAndName), Path.GetFileName(filePathAndName), true, FileAttributes.Normal, ref errMsg))
|
||||
writable = false;
|
||||
else
|
||||
File.Delete(filePathAndName);
|
||||
}
|
||||
|
||||
return writable;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GenerateUniquePath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Generate a unique path
|
||||
/// Example: C:\path -> C:\path_07252015_R1
|
||||
/// </summary>
|
||||
/// <param name="path">Path to a directory</param>
|
||||
/// <return>Unique path</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GenerateUniquePath(string path)
|
||||
{
|
||||
int logCount = 0;
|
||||
string logDir;
|
||||
|
||||
string sLogCount = "00";
|
||||
|
||||
DateTime dt = DateTime.Now;
|
||||
|
||||
string strYear = dt.ToString("yy");
|
||||
string strMonth = dt.ToString("MM");
|
||||
string strDay = dt.ToString("dd");
|
||||
|
||||
while (true)
|
||||
{
|
||||
logDir = Path.GetFullPath(path);
|
||||
logDir += "_" + strMonth + strDay + strYear + "_R" + sLogCount;
|
||||
|
||||
logCount++;
|
||||
if (Directory.Exists(logDir))
|
||||
{
|
||||
if (logCount < 10)
|
||||
{
|
||||
sLogCount = "0" + logCount.ToString();
|
||||
}
|
||||
else
|
||||
sLogCount = logCount.ToString();
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
return logDir;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.PathContainsAtLeastOneFolder
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given a path, indicate whether the path contains at least one folder
|
||||
/// </summary>
|
||||
/// <param name="path">Path to a directory</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool PathContainsAtLeastOneFolder(string path)
|
||||
{
|
||||
bool pathContainsFolders = false;
|
||||
if (Regex.IsMatch(path, @"([a-zA-Z]):\\[^\\]+", RegexOptions.IgnoreCase)
|
||||
||
|
||||
Regex.IsMatch(path, @"(\\\\[^\\]+)\\[^\\]+", RegexOptions.IgnoreCase)
|
||||
)
|
||||
{
|
||||
pathContainsFolders = true;
|
||||
}
|
||||
|
||||
return pathContainsFolders;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GetDriveLetterOrHostnameFromPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given a path, return the drive letter if the path is a local path or
|
||||
/// host name if the path is network path
|
||||
/// </summary>
|
||||
/// <param name="path">Path to a directory</param>
|
||||
/// <return>drive letter or hostname</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetDriveLetterOrHostnameFromPath(string path)
|
||||
{
|
||||
string driveLetterOrHostname = "";
|
||||
if (PathIsNetworkPath(path))
|
||||
{
|
||||
Uri bb = new Uri(path);
|
||||
|
||||
driveLetterOrHostname = bb.Host;
|
||||
}
|
||||
else
|
||||
{
|
||||
Match regExMatch = Regex.Match(path, @"([a-zA-Z]):.*", RegexOptions.IgnoreCase);
|
||||
|
||||
if (regExMatch.Success)
|
||||
driveLetterOrHostname = regExMatch.Groups[1].Value;
|
||||
}
|
||||
|
||||
|
||||
return driveLetterOrHostname;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.DirectoryVisible
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Check to see if Directory is there even though user has no access to it
|
||||
/// This is the case where the directory exists, but user has no access to
|
||||
/// it so the call Directory.Exists() would fail making us think that the
|
||||
/// directory doesn't exist when in fact it does
|
||||
/// </summary>
|
||||
/// <param name="path">Path to a directory</param>
|
||||
/// <param name="errMsg">error message</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool DirectoryVisible(string path, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
|
||||
try
|
||||
{
|
||||
Directory.GetAccessControl(path);
|
||||
}
|
||||
catch (UnauthorizedAccessException)
|
||||
{
|
||||
errMsg = "The account used by this application does not have required permission to access directory " + path;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
int errorCode = 0;
|
||||
if (ErrorHandling.GetExceptionErrorCode(e.Message, ref errorCode))
|
||||
{
|
||||
if (errorCode == 1326)
|
||||
errMsg = "Error code " + errorCode.ToString() + " - Logon Failure. The account used by this application is not permitted to access directory " + path;
|
||||
else
|
||||
successful = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
errMsg = "Unknown error occurred";
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.PathIsLocalPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given a path (either UNC or local path), determine if the path is local path
|
||||
/// </summary>
|
||||
/// <param name="path">path</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
public static bool PathIsLocalPath(string path)
|
||||
{
|
||||
bool isLocalPath = true;
|
||||
|
||||
if (!PathIsUNC(path))
|
||||
{
|
||||
isLocalPath = !PathIsNetworkPath(path);
|
||||
}
|
||||
else
|
||||
{
|
||||
Uri uri = new Uri(path);
|
||||
isLocalPath = HostIsLocal(uri.Host); // Refer to David's answer
|
||||
}
|
||||
|
||||
return isLocalPath;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.HostIsLocal
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given a hostname, determine if it is a local hostname
|
||||
/// </summary>
|
||||
/// <param name="hostname">hostname</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
public static bool HostIsLocal(string hostname)
|
||||
{
|
||||
IPAddress[] host;
|
||||
//get host addresses
|
||||
try { host = Dns.GetHostAddresses(hostname); }
|
||||
catch (Exception) { return false; }
|
||||
//get local adresses
|
||||
IPAddress[] local = Dns.GetHostAddresses(Dns.GetHostName());
|
||||
//check if local
|
||||
return host.Any(hostAddress => IPAddress.IsLoopback(hostAddress) || local.Contains(hostAddress));
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GetProperFilePathCapitalization
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Takes a file path along with the file name and return the exact
|
||||
/// case-lettering of directory name and file name as they are named
|
||||
/// in the Windows file system
|
||||
/// </summary>
|
||||
/// <param name="filePathAndName">File name along with its path</param>
|
||||
/// <return>Same path and file name as the path passed in as a parameter
|
||||
/// except the path and file name has the exact case lettering as how they
|
||||
/// are named in the Windows file system
|
||||
/// </return>
|
||||
///==========================================================================
|
||||
public static string GetProperFilePathCapitalization(string filePathAndName)
|
||||
{
|
||||
string path = filePathAndName;
|
||||
|
||||
if (File.Exists(filePathAndName))
|
||||
{
|
||||
FileInfo fileInfo = new FileInfo(filePathAndName);
|
||||
DirectoryInfo dirInfo = fileInfo.Directory;
|
||||
|
||||
string dir = GetProperDirectoryCapitalization(dirInfo.FullName);
|
||||
string file = dirInfo.GetFiles(fileInfo.Name)[0].Name;
|
||||
|
||||
// if the path is a UNC path, the GetProperDirectoryCapitalization() will
|
||||
// only return the path without the hostname, we must then extract the hostname
|
||||
// then prepend it to the path
|
||||
if (PathIsUNC(filePathAndName))
|
||||
{
|
||||
Uri bb = new Uri(filePathAndName);
|
||||
|
||||
dir = @"\\" + bb.Host + @"\" + dir;
|
||||
}
|
||||
|
||||
path = Path.Combine(dir, file);
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.GetProperDirectoryCapitalization
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Takes a directory path and return the exact case-lettering of
|
||||
/// directory name as they are named in the Windows file system
|
||||
/// </summary>
|
||||
/// <param name="path">Path to a directory</param>
|
||||
/// <return>Same path as the path passed in as a parameter except the
|
||||
/// path has the exact case lettering as how they are named in the Windows
|
||||
/// file system
|
||||
/// </return>
|
||||
///==========================================================================
|
||||
public static string GetProperDirectoryCapitalization(string path)
|
||||
{
|
||||
string dir = path;
|
||||
|
||||
if (Directory.Exists(path))
|
||||
{
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(path);
|
||||
DirectoryInfo parentDirInfo = dirInfo.Parent;
|
||||
if (null == parentDirInfo)
|
||||
return dirInfo.Name;
|
||||
|
||||
dir = Path.Combine(GetProperDirectoryCapitalization(parentDirInfo.FullName), parentDirInfo.GetDirectories(dirInfo.Name)[0].Name);
|
||||
}
|
||||
|
||||
return dir;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.AddTrailingSlashToPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Add trailing slash at the end of a directory path if there's none
|
||||
/// </summary>
|
||||
/// <param name="path">path to directory</param>
|
||||
/// <return>Path without the slash at the end</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string AddTrailingSlashToPath(string path)
|
||||
{
|
||||
return Regex.Replace(path, @"(.+[^\\/])$", "$1\\");
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.RemoveTrailingSlashInPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Remove trailing slash at the end of a directory path if it exists
|
||||
/// </summary>
|
||||
/// <param name="path">path to directory</param>
|
||||
/// <return>Path without the slash at the end</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string RemoveTrailingSlashInPath(string path)
|
||||
{
|
||||
return Regex.Replace(path, @"(\\+|/+)$", "");
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.RemoveLeadingSlashInPath
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Remove leading slash at the beginning of a directory path if it exists
|
||||
/// </summary>
|
||||
/// <param name="path">path to directory</param>
|
||||
/// <return>Path without the slash at the front</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string RemoveLeadingSlashInPath(string path)
|
||||
{
|
||||
return Regex.Replace(path, @"^(\\+|/+)", "");
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// PathManip.PathsEqual
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Compare if 2 paths are equal
|
||||
/// </summary>
|
||||
/// <param name="path1">path 1</param>
|
||||
/// <param name="path2">path 2</param>
|
||||
/// <param name="caseSensitivity">case sensitivity</param>
|
||||
/// <return>true if 2 paths are equal, otherwise false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool PathsEqual(string path1, string path2, StringComparison caseSensitivity)
|
||||
{
|
||||
string path1WithoutSlashes = Regex.Replace(path1, @"[\\/]", ",");
|
||||
string path2WithoutSlashes = Regex.Replace(path2, @"[\\/]", ",");
|
||||
|
||||
if (string.Equals(path1WithoutSlashes, path2WithoutSlashes, caseSensitivity))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
169
CommonLib/Library/IO/TreeUtils.cs
Normal file
169
CommonLib/Library/IO/TreeUtils.cs
Normal file
@@ -0,0 +1,169 @@
|
||||
//===========================================================================================
|
||||
// TreeUtils.cs
|
||||
//===========================================================================================
|
||||
|
||||
// GENERAL DESCRIPTION OR PURPOSE:
|
||||
// Generic C# Tree utility
|
||||
//
|
||||
//===========================================================================================
|
||||
// Date Programmer Proj. SAR / STRIP Description
|
||||
// -------- ---------- ---------- ----------- -----------------------------------------
|
||||
// 06/29/12 J.Weichers SSIRU-742X 1448 Initial Version
|
||||
//===========================================================================================
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Windows.Forms;
|
||||
|
||||
|
||||
namespace CommonLib.IO
|
||||
{
|
||||
public class TreeUtils
|
||||
{
|
||||
static private bool DEBUG = false;
|
||||
private string m_treeRoot = "";
|
||||
|
||||
///===================================================================================
|
||||
/// TreeUtils::TreeUtils
|
||||
///===================================================================================
|
||||
/// <summary>
|
||||
/// Class Ctor for TreeUtils
|
||||
/// </summary>
|
||||
/// <param name="treeRoot">String that specifies the tree's root directory</param>
|
||||
///===================================================================================
|
||||
/// Date Programmer Proj.ID SAR / STRIP Description
|
||||
/// --/--/-- ---------- ---------- ------------- ----------------------------------
|
||||
/// 06/12/12 J.Weichers SSIRU-742X 1448 Original
|
||||
///===================================================================================
|
||||
public TreeUtils(string treeRoot)
|
||||
{
|
||||
m_treeRoot = treeRoot;
|
||||
}
|
||||
|
||||
///===================================================================================
|
||||
/// TreeUtils::DeleteFileSystemInfo
|
||||
///===================================================================================
|
||||
/// <summary>
|
||||
/// Delete a file, or folder and any files or sub-folders if necessary
|
||||
/// </summary>
|
||||
/// <param name="fsi">A file or a directory</param>
|
||||
///===================================================================================
|
||||
/// Date Programmer Proj.ID SAR / STRIP Description
|
||||
/// --/--/-- ---------- ---------- ------------- ----------------------------------
|
||||
/// 06/12/12 J.Weichers SSIRU-742X 1448 Original
|
||||
///===================================================================================
|
||||
public static void DeleteFileSystemInfo(FileSystemInfo fsi)
|
||||
{
|
||||
fsi.Attributes = FileAttributes.Normal;
|
||||
var di = fsi as DirectoryInfo;
|
||||
|
||||
if (di != null)
|
||||
{
|
||||
foreach (var dirInfo in di.GetFileSystemInfos())
|
||||
{
|
||||
DeleteFileSystemInfo(dirInfo);
|
||||
}
|
||||
}
|
||||
|
||||
fsi.Delete();
|
||||
}
|
||||
|
||||
///===================================================================================
|
||||
/// TreeUtils::TreeCopy
|
||||
///===================================================================================
|
||||
/// <summary>
|
||||
/// Recursive function to copy a tree from one location to another. The Directory.Move()
|
||||
/// has a recursive option, but is buggy, and throws random exceptions. It also is
|
||||
/// limited
|
||||
/// </summary>
|
||||
/// <param name="srcFolderPath">A directory that has a sub-directory to be copied</param>
|
||||
/// <param name="srcFolderName">The name of the direcory to be copied</param>
|
||||
/// <param name="destFolderPath">A destination directory of the copy</param>
|
||||
///===================================================================================
|
||||
/// Date Programmer Proj.ID SAR / STRIP Description
|
||||
/// --/--/-- ---------- ---------- ------------- ----------------------------------
|
||||
/// 06/12/12 J.Weichers SSIRU-742X 1448 Original
|
||||
///===================================================================================
|
||||
static public void TreeCopy(String srcFolderPath, // folder and path to copy
|
||||
String srcFolderName, // folder to copy
|
||||
String destFolderPath) // where to copy to
|
||||
{
|
||||
try
|
||||
{
|
||||
DirectoryInfo srcDirInfo = new
|
||||
DirectoryInfo(srcFolderPath + "\\");
|
||||
|
||||
// 1. Create the new destination directory
|
||||
String newDestFolder = Path.Combine(destFolderPath, srcFolderName);
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(newDestFolder);
|
||||
}
|
||||
catch (Exception Exc)
|
||||
{
|
||||
MessageBox.Show("Error creating directory '" + newDestFolder +
|
||||
"': " + Exc.Message, "Directory Error", MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Error);
|
||||
}
|
||||
|
||||
// 2. copy the files first
|
||||
FileInfo[] fileInfoArray = srcDirInfo.GetFiles();
|
||||
foreach (FileInfo file in fileInfoArray)
|
||||
{
|
||||
String newFileAndPath = Path.Combine(newDestFolder, file.Name);
|
||||
try
|
||||
{
|
||||
file.CopyTo(newFileAndPath, true);
|
||||
}
|
||||
catch (Exception Exc)
|
||||
{
|
||||
MessageBox.Show("Error copying file '" + file.Name + "': " +
|
||||
Exc.Message, "File Error", MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. copy the sub-directories last via recursion
|
||||
DirectoryInfo[] dirInfoArray = srcDirInfo.GetDirectories();
|
||||
foreach (DirectoryInfo di in dirInfoArray)
|
||||
{
|
||||
TreeCopy(Path.Combine(srcFolderPath, di.Name),
|
||||
di.Name,
|
||||
Path.Combine(destFolderPath, srcFolderName));
|
||||
}
|
||||
}
|
||||
catch (Exception Exc) { ExceptionMessageBox(Exc, Environment.StackTrace); }
|
||||
}
|
||||
|
||||
///===================================================================================
|
||||
/// TreeUtils::ExceptionMessageBox
|
||||
///===================================================================================
|
||||
/// <summary>
|
||||
/// Convenience exception utility
|
||||
/// </summary>
|
||||
/// <param name="Exc">The exception that was thrown</param>
|
||||
/// <param name="stack">The call stack when the exception was thrown</param>
|
||||
///===================================================================================
|
||||
/// Date Programmer Proj.ID SAR / STRIP Description
|
||||
/// --/--/-- ---------- ---------- ------------- ----------------------------------
|
||||
/// 06/12/12 J.Weichers SSIRU-742X 1448 Original
|
||||
///===================================================================================
|
||||
static public void ExceptionMessageBox(Exception Exc, String stack)
|
||||
{
|
||||
if (DEBUG == true)
|
||||
{
|
||||
MessageBox.Show(Exc.ToString() + "\nStack trace: " +
|
||||
stack, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show(Exc.ToString(), "Error", MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
63
CommonLib/Library/Misc/ArrayManip.cs
Normal file
63
CommonLib/Library/Misc/ArrayManip.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
///======================================================================================
|
||||
/// File: ArrayManip.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Manipulate arrays
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace CommonLib.Misc
|
||||
{
|
||||
///==========================================================================
|
||||
/// ArrayManip
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Manipulate arrays
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public class ArrayManip
|
||||
{
|
||||
///==========================================================================
|
||||
/// ArrayManip.GetDistinctValues
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given an array of any type, return an array of the same type with only
|
||||
/// unique values
|
||||
/// </summary>
|
||||
/// <param name="array">an array of any type</param>
|
||||
/// <return>an array of any type with only unique values</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public T[] GetDistinctValues<T>(T[] array)
|
||||
{
|
||||
List<T> tmp = new List<T>();
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
{
|
||||
if (tmp.Contains(array[i]))
|
||||
continue;
|
||||
tmp.Add(array[i]);
|
||||
}
|
||||
return tmp.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
73
CommonLib/Library/Misc/Conversion.cs
Normal file
73
CommonLib/Library/Misc/Conversion.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
///======================================================================================
|
||||
/// File: Conversion.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Perform various conversions
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace CommonLib.Misc
|
||||
{
|
||||
///==========================================================================
|
||||
/// Conversion
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Perform various conversions
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public class Conversion
|
||||
{
|
||||
///==========================================================================
|
||||
/// Conversion.UInt32ToIP
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Convert an octet (8bit) of type UInt32 to a string representation
|
||||
/// </summary>
|
||||
/// <param name="ipAddress">an octet of type UInt32</param>
|
||||
/// <returns>an octet of type string</returns>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public string UInt32ToIP(UInt32 ipAddress)
|
||||
{
|
||||
return new IPAddress(BitConverter.GetBytes(ipAddress).Reverse().ToArray()).ToString();
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// Conversion.IP2UInt32
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Convert an octet (8bit) of type string to type UInt32 representation
|
||||
/// </summary>
|
||||
/// <param name="ipAddress">an octet of type string</param>
|
||||
/// <returns>an octet of type UInt32</returns>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static UInt32 IP2UInt32(string ipAddress)
|
||||
{
|
||||
return BitConverter.ToUInt32(IPAddress.Parse(ipAddress).GetAddressBytes().Reverse().ToArray(), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
109
CommonLib/Library/Misc/DateTimeManip.cs
Normal file
109
CommonLib/Library/Misc/DateTimeManip.cs
Normal file
@@ -0,0 +1,109 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.ComponentModel;
|
||||
using System.Threading;
|
||||
using System.Diagnostics;
|
||||
|
||||
using Microsoft.Win32;
|
||||
using System.Xml;
|
||||
using System.Xml.XPath;
|
||||
|
||||
using CommonLib.Windows.Forms;
|
||||
using CommonLib.IO;
|
||||
using CommonLib.Misc;
|
||||
using CommonLib.DirectoryServices;
|
||||
using Assembly = System.Reflection.Assembly;
|
||||
|
||||
namespace CommonLib.Misc
|
||||
{
|
||||
public static class DateTimeManip
|
||||
{
|
||||
///===================================================================================
|
||||
/// DateTimeManip.DescribeTimeElapsed
|
||||
///===================================================================================
|
||||
/// <summary>
|
||||
/// Give a variable of type TimeSpan, describe the time in days, hours, mins, seconds
|
||||
/// </summary>
|
||||
/// <param name="TimeSpan">use the stopwatch.elapsed</param>
|
||||
///===================================================================================
|
||||
/// Date Programmer Proj.ID SAR / STRIP Description
|
||||
/// --/--/-- ---------- ---------- ------------- ----------------------------------
|
||||
/// 05/29/12 D.Le
|
||||
///===================================================================================
|
||||
public static string DescribeTimeElapsed(TimeSpan ts)
|
||||
{
|
||||
string describe = "";
|
||||
|
||||
if (ts.Days > 0)
|
||||
describe += ts.Days.ToString() + " d";
|
||||
|
||||
if (ts.Hours > 0)
|
||||
{
|
||||
if (describe.Length > 0)
|
||||
describe += " ";
|
||||
describe += ts.Hours.ToString() + " h";
|
||||
}
|
||||
|
||||
if (ts.Minutes > 0)
|
||||
{
|
||||
if (describe.Length > 0)
|
||||
describe += " ";
|
||||
describe += ts.Minutes.ToString() + " m";
|
||||
}
|
||||
|
||||
if (ts.Seconds > 0)
|
||||
{
|
||||
if (describe.Length > 0)
|
||||
describe += " ";
|
||||
describe += ts.Seconds.ToString() + " s";
|
||||
}
|
||||
|
||||
if (describe.Length == 0)
|
||||
describe = "0 s";
|
||||
|
||||
return describe;
|
||||
}
|
||||
|
||||
///===================================================================================
|
||||
/// DateTimeManip.GetLinkerDateTime
|
||||
///===================================================================================
|
||||
/// <summary>
|
||||
/// Get the date and time of when the assembly was built by reading its PE information
|
||||
/// Usage: Assembly.GetExecutingAssembly().GetLinkerDateTime()
|
||||
/// </summary>
|
||||
/// <param name="TimeSpan">use the stopwatch.elapsed</param>
|
||||
///===================================================================================
|
||||
/// Date Programmer Proj.ID TEMA Description
|
||||
/// --/--/-- ---------- ---------- ------------- ----------------------------------
|
||||
/// 05/29/12 D.Le
|
||||
///===================================================================================
|
||||
public static DateTime GetLinkerDateTime(this Assembly assembly, TimeZoneInfo tzi = null)
|
||||
{
|
||||
// Constants related to the Windows PE file format.
|
||||
const int PE_HEADER_OFFSET = 60;
|
||||
const int LINKER_TIMESTAMP_OFFSET = 8;
|
||||
|
||||
// Discover the base memory address where our assembly is loaded
|
||||
var entryModule = assembly.ManifestModule;
|
||||
var hMod = Marshal.GetHINSTANCE(entryModule);
|
||||
if (hMod == IntPtr.Zero - 1) throw new Exception("Failed to get HINSTANCE.");
|
||||
|
||||
// Read the linker timestamp
|
||||
var offset = Marshal.ReadInt32(hMod, PE_HEADER_OFFSET);
|
||||
var secondsSince1970 = Marshal.ReadInt32(hMod, offset + LINKER_TIMESTAMP_OFFSET);
|
||||
|
||||
// Convert the timestamp to a DateTime
|
||||
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
||||
var linkTimeUtc = epoch.AddSeconds(secondsSince1970);
|
||||
var dt = TimeZoneInfo.ConvertTimeFromUtc(linkTimeUtc, tzi ?? TimeZoneInfo.Local);
|
||||
return dt;
|
||||
}
|
||||
}
|
||||
}
|
||||
42
CommonLib/Library/Misc/ErrorHandling.cs
Normal file
42
CommonLib/Library/Misc/ErrorHandling.cs
Normal file
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace CommonLib.Misc
|
||||
{
|
||||
public class ErrorHandling
|
||||
{
|
||||
///==========================================================================
|
||||
/// Misc.ErrorHandling
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get error code from the error message
|
||||
/// </summary>
|
||||
/// <param name="errorMsg">error message</param>
|
||||
/// <param name="errorCode">error code returned</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool GetExceptionErrorCode(string errorMsg, ref int errorCode)
|
||||
{
|
||||
bool successful = true;
|
||||
Match regExMatch;
|
||||
|
||||
regExMatch = Regex.Match(errorMsg, @".+ error code ([\d]+)[^d]+", RegexOptions.IgnoreCase);
|
||||
|
||||
if (regExMatch.Success)
|
||||
{
|
||||
errorCode = Convert.ToInt32(regExMatch.Groups[1].Value);
|
||||
}
|
||||
else
|
||||
successful = false;
|
||||
|
||||
return successful;
|
||||
}
|
||||
}
|
||||
}
|
||||
193
CommonLib/Library/Misc/StringManip.cs
Normal file
193
CommonLib/Library/Misc/StringManip.cs
Normal file
@@ -0,0 +1,193 @@
|
||||
///======================================================================================
|
||||
/// File: ArrayManip.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Manipulate string
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace CommonLib.Misc
|
||||
{
|
||||
public class StringManip
|
||||
{
|
||||
public enum enumTextHorizontalAlignment
|
||||
{
|
||||
Left,
|
||||
Right
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// StringManip.IsValidIPv4
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given an IP version 4 address. Determine if it is valid or not
|
||||
/// </summary>
|
||||
/// <param name="ipString">IP Address</param>
|
||||
/// <returns>true/false</returns>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool IsValidIPv4(string ipString)
|
||||
{
|
||||
if (String.IsNullOrWhiteSpace(ipString))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
string[] splitValues = ipString.Split('.');
|
||||
if (splitValues.Length != 4)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
byte tempForParsing;
|
||||
|
||||
return splitValues.All(r => byte.TryParse(r, out tempForParsing));
|
||||
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// StringManip.GetPhraseWordIndexInText
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Return the word index of the first word of the phrase in a string
|
||||
/// </summary>
|
||||
/// <param name="text">a string</param>
|
||||
/// <param name="phrase">a phrase to look for in the text</param>
|
||||
/// <returns>index</returns>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static int GetPhraseWordIndexInText(string text, string phrase)
|
||||
{
|
||||
int index = -1;
|
||||
int matchIndex = -1;
|
||||
Regex ItemRegex = new Regex(@"\s*[^\s]+", RegexOptions.Compiled);
|
||||
string[] wordsInPhrase = phrase.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
string wordBuilder = "";
|
||||
|
||||
if (wordsInPhrase.Length > 0)
|
||||
{
|
||||
// going through each word in text
|
||||
foreach (Match ItemMatch in ItemRegex.Matches(text))
|
||||
{
|
||||
index++;
|
||||
|
||||
if (wordBuilder.Length > 0)
|
||||
wordBuilder += " ";
|
||||
|
||||
wordBuilder += ItemMatch.ToString().Trim();
|
||||
|
||||
string[] wordsInWordBuilder = wordBuilder.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
if (wordsInWordBuilder.Length == wordsInPhrase.Length)
|
||||
{
|
||||
if (String.Equals(wordBuilder, phrase, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
matchIndex = index - (wordsInPhrase.Length - 1);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
wordBuilder = "";
|
||||
for (int i = 1; i < wordsInPhrase.Length; i++)
|
||||
{
|
||||
if (wordBuilder.Length > 0)
|
||||
wordBuilder += " ";
|
||||
|
||||
wordBuilder += wordsInWordBuilder[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return matchIndex;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// StringManip.ShortenStringToSize
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given a string and a desired string length, if the actual string's length
|
||||
/// is greater than the desired string length, we keep only the left-most and
|
||||
/// the right-most parts of the string.
|
||||
/// the size of the left-most part of the string will be (Desired String Length / 2)
|
||||
/// the size of the right-most part of the string will be (Desired String Length / 2)
|
||||
/// </summary>
|
||||
/// <param name="str"></param>
|
||||
/// <param name="desiredStrLen"></param>
|
||||
/// <returns>a string</returns>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public string ShortenStringToSize(string str, int desiredStrLen)
|
||||
{
|
||||
string shortenString = str;
|
||||
if (str.Length > desiredStrLen && str.Length >= 5)
|
||||
{
|
||||
int leftCharCount = (int)Math.Ceiling((desiredStrLen - 3.0) / 2.0);
|
||||
int rightCharCount = desiredStrLen - 3 - leftCharCount;
|
||||
shortenString = str.Substring(0, leftCharCount) + "..." + str.Substring(str.Length - rightCharCount, rightCharCount);
|
||||
}
|
||||
|
||||
return shortenString;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// TextAlign
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Align text to left-aligned or right-aligned given the maximum number
|
||||
/// of characters. If maximum of characters is bigger than the length of
|
||||
/// the text provided, space will be padded to make up the difference
|
||||
/// </summary>
|
||||
/// <param name="text">a string</param>
|
||||
/// <param name="maxNumCharacters"></param>
|
||||
/// <param name="horizonAlignmentPos"></param>
|
||||
/// <returns>a string</returns>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public string TextAlign(string text, int maxNumCharacters, enumTextHorizontalAlignment horizonAlignmentPos)
|
||||
{
|
||||
string str = text;
|
||||
string padding = "";
|
||||
|
||||
int diff = maxNumCharacters - text.Length;
|
||||
|
||||
for (int i = 1; i <= diff; i++)
|
||||
{
|
||||
padding += " ";
|
||||
}
|
||||
|
||||
if (horizonAlignmentPos == enumTextHorizontalAlignment.Left)
|
||||
str += padding;
|
||||
else
|
||||
str = padding + str;
|
||||
|
||||
return str;
|
||||
}
|
||||
}
|
||||
}
|
||||
112
CommonLib/Library/Runtime/InteropServices/DocumentFormat.cs
Normal file
112
CommonLib/Library/Runtime/InteropServices/DocumentFormat.cs
Normal file
@@ -0,0 +1,112 @@
|
||||
///======================================================================================
|
||||
/// File: DocumentFormat.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Formatting form controls that display text
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le SSIRU_PL 1448 Original
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.Windows.Forms;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Northgrum.Runtime.InteropServices
|
||||
{
|
||||
///==========================================================================
|
||||
/// FileManip
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Format any form control that display text in it
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le SSIRU_PL 1448 Original
|
||||
///==========================================================================
|
||||
public class DocumentFormat
|
||||
{
|
||||
[DllImport("user32", CharSet = CharSet.Auto)]
|
||||
private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, ref PARAFORMAT lParam);
|
||||
|
||||
const int PFM_SPACEBEFORE = 0x00000040;
|
||||
const int PFM_SPACEAFTER = 0x00000080;
|
||||
const int PFM_LINESPACING = 0x00000100;
|
||||
|
||||
const int SCF_SELECTION = 1;
|
||||
const int EM_SETPARAFORMAT = 1095;
|
||||
|
||||
///==========================================================================
|
||||
/// DocumentFormat.setLineFormatInRichTextBox
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Allow the setting of line spacing in RichTextBox
|
||||
///
|
||||
/// For rule, there are only 6 possible values, 0-5
|
||||
/// 0 - Single Spacing, line spacing is ignored
|
||||
/// 1 - One-and-a-half spacing. line spacing is ignored
|
||||
/// 2 - Double spacing. line spacing is ignored
|
||||
/// 3 - Line spacing specifies spacing from one line to the next
|
||||
/// 4 - Line spacing specifies spacing from one line to the next
|
||||
/// 5 - Line spacing/20 is the spacing from one line to the next
|
||||
/// </summary>
|
||||
/// <param name="rTextbox">rich text box control</param>
|
||||
/// <param name="rule">can only be 0-5 (the summary describes each rule)</param>
|
||||
/// <param name="space">amount of spacing between 2 lines</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le SSIRU_PL 1448 Original
|
||||
///==========================================================================
|
||||
static public void setLineFormatInRichTextBox(RichTextBox rTextbox, byte rule, int space)
|
||||
{
|
||||
PARAFORMAT fmt = new PARAFORMAT();
|
||||
fmt.cbSize = Marshal.SizeOf(fmt);
|
||||
fmt.dwMask = PFM_LINESPACING;
|
||||
fmt.dyLineSpacing = space;
|
||||
fmt.bLineSpacingRule = rule;
|
||||
rTextbox.SelectAll();
|
||||
SendMessage(new HandleRef(rTextbox, rTextbox.Handle), EM_SETPARAFORMAT, SCF_SELECTION, ref fmt);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct PARAFORMAT
|
||||
{
|
||||
public int cbSize;
|
||||
public uint dwMask;
|
||||
public short wNumbering;
|
||||
public short wReserved;
|
||||
public int dxStartIndent;
|
||||
public int dxRightIndent;
|
||||
public int dxOffset;
|
||||
public short wAlignment;
|
||||
public short cTabCount;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public int[] rgxTabs;
|
||||
// PARAFORMAT2 from here onwards
|
||||
public int dySpaceBefore;
|
||||
public int dySpaceAfter;
|
||||
public int dyLineSpacing;
|
||||
public short sStyle;
|
||||
public byte bLineSpacingRule;
|
||||
public byte bOutlineLevel;
|
||||
public short wShadingWeight;
|
||||
public short wShadingStyle;
|
||||
public short wNumberingStart;
|
||||
public short wNumberingStyle;
|
||||
public short wNumberingTab;
|
||||
public short wBorderSpace;
|
||||
public short wBorderWidth;
|
||||
public short wBorders;
|
||||
}
|
||||
}
|
||||
}
|
||||
1099
CommonLib/Library/Runtime/InteropServices/Win32Helpers.cs
Normal file
1099
CommonLib/Library/Runtime/InteropServices/Win32Helpers.cs
Normal file
File diff suppressed because it is too large
Load Diff
140
CommonLib/Library/Windows/Forms/FormControlsFormatting.cs
Normal file
140
CommonLib/Library/Windows/Forms/FormControlsFormatting.cs
Normal file
@@ -0,0 +1,140 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Drawing;
|
||||
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
///==========================================================================
|
||||
/// TextFormatting
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Primary purpose is to define the format of text such as text font and color
|
||||
/// mainly for display in rich text box
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public class TextFormat
|
||||
{
|
||||
// this struct define the text formatting of a selected number of words in a string
|
||||
// must define word index and word count, word index starts at 0
|
||||
public struct TextFontAndColor
|
||||
{
|
||||
public int wordIndex;
|
||||
public int wordCount;
|
||||
public Font textFont;
|
||||
public Color textColor;
|
||||
|
||||
public TextFontAndColor(Font fontProp, Color fontColor, int textWordIndex = -1, int textWordCount = -1)
|
||||
{
|
||||
wordIndex = textWordIndex;
|
||||
wordCount = textWordCount;
|
||||
textFont = fontProp;
|
||||
textColor = fontColor;
|
||||
}
|
||||
|
||||
public TextFontAndColor(string nothing)
|
||||
{
|
||||
wordIndex = -1;
|
||||
wordCount = -1;
|
||||
textFont = new Font("Microsoft Sans Serif", 9, FontStyle.Regular);
|
||||
textColor = Color.Black;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormatRichTextBox
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Format rich text box
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public class FormatRichTextBox
|
||||
{
|
||||
[DllImport("user32", CharSet = CharSet.Auto)]
|
||||
private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, ref PARAFORMAT lParam);
|
||||
|
||||
const int PFM_SPACEBEFORE = 0x00000040;
|
||||
const int PFM_SPACEAFTER = 0x00000080;
|
||||
const int PFM_LINESPACING = 0x00000100;
|
||||
|
||||
const int SCF_SELECTION = 1;
|
||||
const int EM_SETPARAFORMAT = 1095;
|
||||
|
||||
///==========================================================================
|
||||
/// FormatRichTextBox.setLineFormat
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Allow the setting of line spacing in RichTextBox
|
||||
///
|
||||
/// For rule, there are only 6 possible values, 0-5
|
||||
/// 0 - Single Spacing, line spacing is ignored
|
||||
/// 1 - One-and-a-half spacing. line spacing is ignored
|
||||
/// 2 - Double spacing. line spacing is ignored
|
||||
/// 3 - Line spacing specifies spacing from one line to the next
|
||||
/// 4 - Line spacing specifies spacing from one line to the next
|
||||
/// 5 - Line spacing/20 is the spacing from one line to the next
|
||||
/// </summary>
|
||||
/// <param name="rTextbox">rich text box control</param>
|
||||
/// <param name="rule">can only be 0-5 (the summary describes each rule)</param>
|
||||
/// <param name="space">amount of spacing between 2 lines</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void setLineFormat(RichTextBox rTextbox, byte rule, int space)
|
||||
{
|
||||
PARAFORMAT fmt = new PARAFORMAT();
|
||||
fmt.cbSize = Marshal.SizeOf(fmt);
|
||||
fmt.dwMask = PFM_LINESPACING;
|
||||
fmt.dyLineSpacing = space;
|
||||
fmt.bLineSpacingRule = rule;
|
||||
rTextbox.SelectAll();
|
||||
SendMessage(new HandleRef(rTextbox, rTextbox.Handle), EM_SETPARAFORMAT, SCF_SELECTION, ref fmt);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct PARAFORMAT
|
||||
{
|
||||
public int cbSize;
|
||||
public uint dwMask;
|
||||
public short wNumbering;
|
||||
public short wReserved;
|
||||
public int dxStartIndent;
|
||||
public int dxRightIndent;
|
||||
public int dxOffset;
|
||||
public short wAlignment;
|
||||
public short cTabCount;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public int[] rgxTabs;
|
||||
// PARAFORMAT2 from here onwards
|
||||
public int dySpaceBefore;
|
||||
public int dySpaceAfter;
|
||||
public int dyLineSpacing;
|
||||
public short sStyle;
|
||||
public byte bLineSpacingRule;
|
||||
public byte bOutlineLevel;
|
||||
public short wShadingWeight;
|
||||
public short wShadingStyle;
|
||||
public short wNumberingStart;
|
||||
public short wNumberingStyle;
|
||||
public short wNumberingTab;
|
||||
public short wBorderSpace;
|
||||
public short wBorderWidth;
|
||||
public short wBorders;
|
||||
}
|
||||
}
|
||||
}
|
||||
741
CommonLib/Library/Windows/Forms/FormControlsManipThreadSafe.cs
Normal file
741
CommonLib/Library/Windows/Forms/FormControlsManipThreadSafe.cs
Normal file
@@ -0,0 +1,741 @@
|
||||
///======================================================================================
|
||||
/// File: FormControlsManipThreadSafe.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Provide a mechanism so that the main thread(main form) or its backgroundworker can
|
||||
/// manipulate controls in a container
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.Threading;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// This class allows backgroundworker(child threads) to manipulate controls
|
||||
/// in a container
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public class FormControlsManipThreadSafe
|
||||
{
|
||||
public enum ControlVisibility { Display, Hidden };
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.AddControlToContainer
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Add a control to a container(form, panel, etc)
|
||||
/// </summary>
|
||||
/// <param name="control">any form control</param>
|
||||
/// <param name="container">a container control (form, panel, groupbox,
|
||||
/// tabcontrol, etc)</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void AddControlToContainer(Control control, Control container)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (container.InvokeRequired)
|
||||
{
|
||||
container.Invoke(new Action(() => AddControlToContainer(control, container)));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
container.Controls.Add(control);
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.ModifyLabelToDisplayWithinContainerVisibleWidth
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// If the text in a label is too long and it goes past the boundary of the
|
||||
/// container, want to shorten it so that it ends at the boundary of the
|
||||
/// container. 3 periods will be inserted in the middle of the text of the
|
||||
/// label to indicate that text were cut off in the middle
|
||||
/// </summary>
|
||||
/// <param name="control">a label or linklabel control</param>
|
||||
/// <param name="widthOfContainingPanel">the width of the container in which
|
||||
/// the control is located</param>
|
||||
/// <param name="d_rightMargin">the right margin of the control's text with
|
||||
/// respect to the container in which it is located</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void ModifyLabelToDisplayWithinContainerVisibleWidth(Control control, int widthOfContainingPanel, int d_rightMargin)
|
||||
{
|
||||
int minimumTextLength = 10, minimumWidthOfContainingPanel = 150;
|
||||
int rightMargin = 2;
|
||||
string connector = "...";
|
||||
bool controlTextOverrunsVisibleLine = false;
|
||||
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
control.Invoke(new Action(() => ModifyLabelToDisplayWithinContainerVisibleWidth(control, widthOfContainingPanel, d_rightMargin)));
|
||||
}
|
||||
else
|
||||
{
|
||||
// only perform this for LinkLabel and Label types
|
||||
if (control.GetType() != typeof(LinkLabel) && control.GetType() != typeof(Label))
|
||||
return;
|
||||
|
||||
if (control.Text.Length < minimumTextLength || widthOfContainingPanel < minimumWidthOfContainingPanel)
|
||||
return;
|
||||
|
||||
if (d_rightMargin > rightMargin)
|
||||
rightMargin = d_rightMargin;
|
||||
|
||||
string text = control.Text;
|
||||
Size textsize = TextRenderer.MeasureText(text, control.Font);
|
||||
int maxTextLength = widthOfContainingPanel - control.Left - rightMargin;
|
||||
|
||||
string left = text.Substring(0, (int)Math.Floor(text.Length / 2.0));
|
||||
string right = text.Substring(left.Length, (int)Math.Ceiling(text.Length / 2.0));
|
||||
|
||||
while (textsize.Width > maxTextLength)
|
||||
{
|
||||
if (!controlTextOverrunsVisibleLine)
|
||||
controlTextOverrunsVisibleLine = true;
|
||||
|
||||
if (left.Length >= right.Length)
|
||||
left = left.Substring(0, left.Length - 1);
|
||||
else
|
||||
right = right.Substring(1, right.Length - 1);
|
||||
|
||||
string newText = left + connector + right;
|
||||
|
||||
textsize = TextRenderer.MeasureText(newText, control.Font);
|
||||
}
|
||||
|
||||
if (controlTextOverrunsVisibleLine)
|
||||
control.Text = left + connector + right;
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.RemoveControlFromContainer
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Remove a control from a container(form, panel, etc)
|
||||
/// </summary>
|
||||
/// <param name="control">any form control</param>
|
||||
/// <param name="container">a container control (form, panel, groupbox,
|
||||
/// tabcontrol, etc)</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void RemoveControlFromContainer(Control control, Control container)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (container.InvokeRequired)
|
||||
{
|
||||
container.Invoke(new Action(() => RemoveControlFromContainer(control, container)));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
container.Controls.Remove(control);
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.BaseClassObjectIsOfASpecificType
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given any class object, usually of type base class, determine if the object
|
||||
/// is of a specific type
|
||||
/// </summary>
|
||||
/// <param name="ojb">an object</param>
|
||||
/// <param name="objectSpecificType">a type</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public bool BaseClassObjectIsOfASpecificType(object obj, Type objectSpecificType)
|
||||
{
|
||||
if (obj.GetType().IsAssignableFrom(objectSpecificType))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.RemoveControlFromContainer
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Resize a container (form, panel, groupbox, etc)
|
||||
/// </summary>
|
||||
/// <param name="container">a container control (form, panel, groupbox,
|
||||
/// tabcontrol, etc)</param>
|
||||
/// <param name="resizeWidth">width to resize to</param>
|
||||
/// <param name="resizeHeight">height to resize to</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void ResizeContainer(Control container, int resizeWidth, int resizeHeight)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (container.InvokeRequired)
|
||||
{
|
||||
container.Invoke(new Action(() => ResizeContainer(container, resizeWidth, resizeHeight)));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
container.Width = resizeWidth;
|
||||
container.Height = resizeHeight;
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.PositionControl
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Position a control within a container (form, panel, groupbox, etc)
|
||||
/// </summary>
|
||||
/// <param name="control">any form control</param>
|
||||
/// <param name="pos">a Point object with X and Y position defined</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void PositionControl(Control control, Point pos)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
control.Invoke(new Action(() => PositionControl(control, pos)));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
control.Location = new System.Drawing.Point(pos.X, pos.Y);
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.SetControlVisibility
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Hide or Show a control on in the container
|
||||
/// </summary>
|
||||
/// <param name="control">any form control</param>
|
||||
/// <param name="visibility">Enum type</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void SetControlVisibility(Control control, ControlVisibility visibility)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
control.Invoke(new Action(() => SetControlVisibility(control, visibility)));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
if (visibility == ControlVisibility.Display)
|
||||
control.Visible = true;
|
||||
else
|
||||
control.Visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.ModifyControlText
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Modify the text of a control
|
||||
/// </summary>
|
||||
/// <param name="control">any form control</param>
|
||||
/// <param name="text">a string</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void ModifyControlText(Control control, string text)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
control.Invoke(new Action(() => ModifyControlText(control, text)));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
if (BaseClassObjectIsOfASpecificType(control, typeof(TextBox))
|
||||
||
|
||||
BaseClassObjectIsOfASpecificType(control, typeof(Button)))
|
||||
control.Text = text;
|
||||
else if (BaseClassObjectIsOfASpecificType(control, typeof(RichTextBox)))
|
||||
{
|
||||
RichTextBox rTextBox = control as RichTextBox;
|
||||
rTextBox.AppendText(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.RichTextBoxEraseLine
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Erase a paritcular line in Rich Text Box with the option to delete the
|
||||
/// line completely.
|
||||
/// Erase is just erasing all the characters on a line, but the line still
|
||||
/// exists. If DeleteLine option is true, the whole line will be removed
|
||||
/// </summary>
|
||||
/// <param name="control">rich text box control</param>
|
||||
/// <param name="lineIndex">line index, starting at index 0</param>
|
||||
/// /// <param name="deleteLine">deleteLine</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void RichTextBoxEraseLine(RichTextBox control, int lineIndex, bool deleteLine)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
control.Invoke(new Action(() => RichTextBoxEraseLine(control, lineIndex, deleteLine)));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
int LineCharStartIndex;
|
||||
int LineCharEndIndex;
|
||||
int numCharsToBeRemove;
|
||||
|
||||
if (lineIndex >= 0 && lineIndex < control.Lines.Count())
|
||||
{
|
||||
LineCharStartIndex = control.GetFirstCharIndexFromLine(lineIndex);
|
||||
|
||||
if (control.Lines.Count() > (lineIndex + 1))
|
||||
LineCharEndIndex = control.GetFirstCharIndexFromLine(lineIndex + 1) - 1;
|
||||
else
|
||||
LineCharEndIndex = control.TextLength;
|
||||
|
||||
numCharsToBeRemove = LineCharEndIndex - LineCharStartIndex;
|
||||
|
||||
if (numCharsToBeRemove > 0)
|
||||
{
|
||||
control.Select(LineCharStartIndex, numCharsToBeRemove);
|
||||
control.SelectedText = "";
|
||||
|
||||
if (deleteLine)
|
||||
{
|
||||
if (lineIndex > 0 && control.Lines.Count() > 1)
|
||||
{
|
||||
// remove the line, this just means that we just shifted all the lines
|
||||
// below this line up 1 line. The last line is empty
|
||||
LineCharStartIndex = control.GetFirstCharIndexFromLine(lineIndex) - 1;
|
||||
control.Select(LineCharStartIndex, 1);
|
||||
control.SelectedText = "";
|
||||
}
|
||||
else if (lineIndex == 0 && control.Lines.Count() > 1)
|
||||
{
|
||||
// remove the line, this just means that we just shfited all the lines
|
||||
// below this line up 1 line. The last line is empty
|
||||
LineCharStartIndex = control.GetFirstCharIndexFromLine(lineIndex);
|
||||
control.Select(LineCharStartIndex, 1);
|
||||
control.SelectedText = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (lineIndex <= control.Lines.Count() - 1) // remove blank line
|
||||
{
|
||||
if (deleteLine)
|
||||
{
|
||||
if (lineIndex > 0)
|
||||
{
|
||||
control.Select(control.GetFirstCharIndexFromLine(lineIndex) - 1, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
control.Select(control.GetFirstCharIndexFromLine(lineIndex), 1);
|
||||
}
|
||||
control.SelectedText = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.ModifyRichTextBoxText
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Modify the text of a rich text box in only 1 color
|
||||
/// </summary>
|
||||
/// <param name="control">rich text box control</param>
|
||||
/// <param name="text">a string</param>
|
||||
/// <param name="fontProp">font properties</param>
|
||||
/// <param name="textColor">color property</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void ModifyRichTextBoxText(RichTextBox control, string text, Font fontProp, Color textColor)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
control.Invoke(new Action(() => ModifyRichTextBoxText(control, text, fontProp, textColor)));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
control.SelectionFont = fontProp;
|
||||
control.SelectionColor = textColor;
|
||||
control.AppendText(text);
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.ModifyRichTextBoxTextAtLine
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Modify the text of a rich text box in only 1 color at a particular line
|
||||
/// starting a particular character index on that line
|
||||
/// </summary>
|
||||
/// <param name="control">rich text box control</param>
|
||||
/// <param name="lineIndex">line index of the text box starting at 0</param>
|
||||
/// <param name="charsCount">number of characters that have already been processed</param>
|
||||
/// <param name="text">a string</param>
|
||||
/// <param name="fontProp">font properties</param>
|
||||
/// <param name="textColor">color property</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public bool ModifyRichTextBoxTextAtLine(RichTextBox control, int lineIndex, int charsCount, string word, Font fontProp, Color textColor)
|
||||
{
|
||||
bool success = true;
|
||||
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
return (bool)control.Invoke(new Func<bool>(
|
||||
delegate
|
||||
{
|
||||
return ModifyRichTextBoxTextAtLine(control, lineIndex, charsCount, word, fontProp, textColor);
|
||||
}
|
||||
));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
if (lineIndex < control.Lines.Count())
|
||||
{
|
||||
// determine the starting index of the new word
|
||||
int startCharIndex = control.GetFirstCharIndexFromLine(lineIndex) + charsCount;
|
||||
control.Select(startCharIndex, word.Length);
|
||||
control.SelectionFont = fontProp;
|
||||
control.SelectionColor = textColor;
|
||||
control.SelectedText = control.SelectedText;
|
||||
}
|
||||
else
|
||||
success = false;
|
||||
|
||||
return success;
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.getRichTextBoxLastLineIndex
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Modify text in rich text box in various colors and font at a particular
|
||||
/// line
|
||||
/// </summary>
|
||||
/// <param name="control">rich text box control</param>
|
||||
/// <param name="lineIndex">line index of the text box starting at 0</param>
|
||||
/// <param name="textPropList">contains font properties for particular words</param>
|
||||
/// <param name="defaultFont">the default font for words that are not defined in textPropList</param>
|
||||
/// <param name="defaultFontColor">the default font color for words that are not defined in textPropList</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public int getRichTextBoxLastLineIndex(RichTextBox control)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
return (int)control.Invoke(new Func<int>(
|
||||
delegate
|
||||
{
|
||||
return getRichTextBoxLastLineIndex(control);
|
||||
}
|
||||
));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
return (control.Lines.Count() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.ModifyRichTextBoxPerWordsAtLine
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Modify text in rich text box in various colors and font at a particular
|
||||
/// line
|
||||
/// </summary>
|
||||
/// <param name="control">rich text box control</param>
|
||||
/// <param name="lineIndex">line index of the text box starting at 0</param>
|
||||
/// <param name="textPropList">contains font properties for particular words</param>
|
||||
/// <param name="defaultFont">the default font for words that are not defined in textPropList</param>
|
||||
/// <param name="defaultFontColor">the default font color for words that are not defined in textPropList</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public bool ModifyRichTextBoxPerWordsAtLine(RichTextBox control, int lineIndex, string text, List<TextFormat.TextFontAndColor> textPropList, Font defaultFont, Color defaultFontColor)
|
||||
{
|
||||
int wordIndex = 0;
|
||||
int wordCount = 0;
|
||||
int textPropListIndex = -1;
|
||||
Regex ItemRegex = new Regex(@"\s*[^ ]+", RegexOptions.Compiled);
|
||||
bool success = true;
|
||||
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
return (bool)control.Invoke(new Func<bool>(
|
||||
delegate
|
||||
{
|
||||
return ModifyRichTextBoxPerWordsAtLine(control, lineIndex, text, textPropList, defaultFont, defaultFontColor);
|
||||
}
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lineIndex < control.Lines.Count())
|
||||
{
|
||||
int startCharIndex = control.GetFirstCharIndexFromLine(lineIndex);
|
||||
int endCharIndex = lineIndex < control.Lines.Count() - 1 ?
|
||||
control.GetFirstCharIndexFromLine(lineIndex + 1) - 1 :
|
||||
control.Text.Length;
|
||||
// select the whole line
|
||||
control.Select(startCharIndex, endCharIndex - startCharIndex);
|
||||
control.SelectionFont = defaultFont;
|
||||
control.SelectionColor = defaultFontColor;
|
||||
// replace line with new text
|
||||
control.SelectedText = text;
|
||||
|
||||
// number of characters in all the words that have been processed
|
||||
int charsProcessed = 0;
|
||||
|
||||
foreach (Match ItemMatch in ItemRegex.Matches(text))
|
||||
{
|
||||
if (wordCount == 0)
|
||||
textPropListIndex = getTextPropListIndexForWordIndex(textPropList, wordIndex);
|
||||
|
||||
if ((textPropListIndex >= 0 && wordIndex == textPropList[textPropListIndex].wordIndex) || wordCount > 0)
|
||||
{
|
||||
if (wordCount == 0)
|
||||
wordCount = textPropList[textPropListIndex].wordCount;
|
||||
|
||||
FormControlsManipThreadSafe.ModifyRichTextBoxTextAtLine(control, lineIndex, charsProcessed, ItemMatch.ToString(), textPropList[textPropListIndex].textFont, textPropList[textPropListIndex].textColor);
|
||||
|
||||
wordCount--;
|
||||
|
||||
if (wordCount == 0)
|
||||
{
|
||||
textPropList.RemoveAt(textPropListIndex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FormControlsManipThreadSafe.ModifyRichTextBoxTextAtLine(control, lineIndex, charsProcessed, ItemMatch.ToString(), defaultFont, defaultFontColor);
|
||||
|
||||
}
|
||||
|
||||
wordIndex++;
|
||||
charsProcessed += ItemMatch.ToString().Length;
|
||||
}
|
||||
|
||||
if (textPropList != null)
|
||||
textPropList.Clear();
|
||||
|
||||
Match regExMatch;
|
||||
regExMatch = Regex.Match(text, @"[^ ]?( +)$");
|
||||
|
||||
// if there are spaces at the end of text, want to display it
|
||||
if (regExMatch.Success)
|
||||
{
|
||||
FormControlsManipThreadSafe.ModifyRichTextBoxTextAtLine(control, lineIndex, charsProcessed, regExMatch.Groups[1].Value, defaultFont, defaultFontColor);
|
||||
}
|
||||
}
|
||||
else
|
||||
success = false;
|
||||
|
||||
return success;
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.ModifyRichTextBoxPerWords
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Modify text in rich text box in various colors and font
|
||||
/// </summary>
|
||||
/// <param name="control">rich text box control</param>
|
||||
/// <param name="textPropList">contains font properties for particular words</param>
|
||||
/// <param name="defaultFont">the default font for words that are not defined in textPropList</param>
|
||||
/// <param name="defaultFontColor">the default font color for words that are not defined in textPropList</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void ModifyRichTextBoxPerWords(RichTextBox control, string text, List<TextFormat.TextFontAndColor> textPropList, Font defaultFont, Color defaultFontColor)
|
||||
{
|
||||
int wordIndex = 0;
|
||||
int wordCount = 0;
|
||||
int textPropListIndex = -1;
|
||||
Regex ItemRegex = new Regex(@"\s*[^ ]+", RegexOptions.Compiled);
|
||||
|
||||
foreach (Match ItemMatch in ItemRegex.Matches(text))
|
||||
{
|
||||
if (wordCount == 0)
|
||||
textPropListIndex = getTextPropListIndexForWordIndex(textPropList, wordIndex);
|
||||
|
||||
if ((textPropListIndex >= 0 && wordIndex == textPropList[textPropListIndex].wordIndex) || wordCount > 0)
|
||||
{
|
||||
if (wordCount == 0)
|
||||
wordCount = textPropList[textPropListIndex].wordCount;
|
||||
|
||||
FormControlsManipThreadSafe.ModifyRichTextBoxText(control, ItemMatch.ToString(), textPropList[textPropListIndex].textFont, textPropList[textPropListIndex].textColor);
|
||||
|
||||
wordCount--;
|
||||
|
||||
if (wordCount == 0)
|
||||
{
|
||||
textPropList.RemoveAt(textPropListIndex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FormControlsManipThreadSafe.ModifyRichTextBoxText(control, ItemMatch.ToString(), defaultFont, defaultFontColor);
|
||||
}
|
||||
|
||||
wordIndex++;
|
||||
}
|
||||
|
||||
if ( textPropList != null )
|
||||
textPropList.Clear();
|
||||
|
||||
Match regExMatch;
|
||||
regExMatch = Regex.Match(text, @"[^ ]?( +)$");
|
||||
|
||||
// if there are spaces at the end of text, want to display it
|
||||
if (regExMatch.Success)
|
||||
{
|
||||
FormControlsManipThreadSafe.ModifyControlText(control, regExMatch.Groups[1].Value);
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.getTextPropListIndexForWordIndex
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// textPropList contains a list of font properties of various words in a string
|
||||
/// want to find the font property of a word or words starting at a particular word index
|
||||
/// in the string
|
||||
/// </summary>
|
||||
/// <param name="textPropList">contains font properties for particular words</param>
|
||||
/// <param name="wordIndex">index of the word in a string</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static private int getTextPropListIndexForWordIndex(List<TextFormat.TextFontAndColor> textPropList, int wordIndex)
|
||||
{
|
||||
int index = -1;
|
||||
|
||||
if (textPropList != null)
|
||||
{
|
||||
for (int i = 0; i < textPropList.Count; i++)
|
||||
{
|
||||
if (textPropList[i].wordIndex == wordIndex)
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// FormControlsManipThreadSafe.ModifyControlColors
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Modify back color and fore color of a control
|
||||
/// </summary>
|
||||
/// <param name="control">any form control</param>
|
||||
/// <param name="text">a string</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
static public void ModifyControlColors(Control control, Color backColor, Color foreColor)
|
||||
{
|
||||
// when a different thread trying to access the value this control on a form that was created by another thread
|
||||
if (control.InvokeRequired)
|
||||
{
|
||||
control.Invoke(new Action(() => ModifyControlColors(control, backColor, foreColor)));
|
||||
}
|
||||
// when the thread tries to access the value of the control on the form that belongs to the same thread
|
||||
else
|
||||
{
|
||||
if (backColor != null)
|
||||
control.BackColor = backColor;
|
||||
|
||||
if (foreColor != null)
|
||||
control.ForeColor = foreColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
190
CommonLib/Library/Windows/Forms/MessageBoxCustom.cs
Normal file
190
CommonLib/Library/Windows/Forms/MessageBoxCustom.cs
Normal file
@@ -0,0 +1,190 @@
|
||||
///======================================================================================
|
||||
/// File: MessageBoxCustom.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// Provides an advanced message box with custom buttons and timeout
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.Threading;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
///==========================================================================
|
||||
/// clsCustomButton
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// This class defines a custom message box with custom buttons and timeout
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public class MessageBoxCustom
|
||||
{
|
||||
public enum PopUpMsgType
|
||||
{
|
||||
// Summary:
|
||||
// Indicates this is a error message to display with an OK button
|
||||
ERROR = 0,
|
||||
//
|
||||
// Summary:
|
||||
// Indicates this is just a info message with an OK button
|
||||
INFO = 1,
|
||||
|
||||
// Summary:
|
||||
// Indicates this is a pre-defined question and needs answer from user, 2 buttons
|
||||
YESNO = 2,
|
||||
|
||||
// Summary:
|
||||
// Indicates this is a pre-defined question and needs answer from user, 2 buttons
|
||||
OKCANCEL = 3,
|
||||
|
||||
// Summary:
|
||||
// Indicates this is a custom question and needs answer from user, buttons must be defined also
|
||||
CUSTOMQUESTION = 4,
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// MessageBoxCustom.Show
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Displays a message box at the center of the calling parent form if it exists
|
||||
/// </summary>
|
||||
/// <param name="parentForm">the parent form that calls this message box.
|
||||
/// If parent form doesn't exist, pass in null pointer
|
||||
/// </param>
|
||||
/// <param name="msgType">type of message (error,warning,info,custom,etc)</param>
|
||||
/// <param name="customButtons">a list of custom buttons if the msgType
|
||||
/// is custom, otherwise pass in null pointer
|
||||
/// </param>
|
||||
/// <param name="msg">The message to be display on the message box</param>
|
||||
/// <param name="caption">The caption to be display at the top of
|
||||
/// the message box
|
||||
/// </param>
|
||||
/// <param name="timeOut_ms">Specify timeout in milliseconds before
|
||||
/// the message box will be automatically be closed. If timeout is not desired,
|
||||
/// specify 0
|
||||
/// </param>
|
||||
/// <return>The value of the button that was pressed</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string Show(Form parentForm, PopUpMsgType msgType, List<clsCustomButton> customButtons, string msg, string caption, int timeOut_ms)
|
||||
{
|
||||
string result;
|
||||
MessageBoxEx msgBox;
|
||||
|
||||
// create and customize an error message box
|
||||
msgBox = MessageBoxExManager.CreateMessageBox(parentForm, "MsgBox");
|
||||
msgBox.Font = new Font("Tahoma", 10);
|
||||
|
||||
switch (msgType)
|
||||
{
|
||||
case PopUpMsgType.ERROR:
|
||||
msgBox.AddButtons(MessageBoxButtons.OK);
|
||||
msgBox.Icon = (MessageBoxExIcon)MessageBoxIcon.Error;
|
||||
//msgBox.SaveResponseText = "Don't ask me again";
|
||||
break;
|
||||
case PopUpMsgType.INFO:
|
||||
msgBox.AddButtons(MessageBoxButtons.OK);
|
||||
msgBox.Icon = (MessageBoxExIcon)MessageBoxIcon.Information;
|
||||
//msgBox.SaveResponseText = "Don't ask me again";
|
||||
break;
|
||||
case PopUpMsgType.YESNO:
|
||||
msgBox.AddButtons(MessageBoxButtons.YesNo);
|
||||
msgBox.Icon = (MessageBoxExIcon)MessageBoxIcon.Question;
|
||||
//msgBox.SaveResponseText = "Don't ask me again";
|
||||
break;
|
||||
case PopUpMsgType.OKCANCEL:
|
||||
msgBox.AddButtons(MessageBoxButtons.OKCancel);
|
||||
msgBox.Icon = (MessageBoxExIcon)MessageBoxIcon.Information;
|
||||
//msgBox.SaveResponseText = "Don't ask me again";
|
||||
break;
|
||||
case PopUpMsgType.CUSTOMQUESTION:
|
||||
if (customButtons != null && customButtons.Count > 1)
|
||||
{
|
||||
foreach (clsCustomButton button in customButtons)
|
||||
{
|
||||
msgBox.AddButton(button.buttonText, button.buttonValue);
|
||||
}
|
||||
msgBox.Icon = (MessageBoxExIcon)MessageBoxIcon.Question;
|
||||
}
|
||||
else
|
||||
{
|
||||
msgBox.AddButtons(MessageBoxButtons.OK);
|
||||
msgBox.Icon = (MessageBoxExIcon)MessageBoxIcon.Error;
|
||||
msg = "Custom question requires customized buttons with text and value for each button.\nPlease define the buttons and try again!";
|
||||
}
|
||||
//msgBox.SaveResponseText = "Don't ask me again";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
msgBox.Caption = caption;
|
||||
msgBox.Text = msg;
|
||||
if (timeOut_ms > 0)
|
||||
{
|
||||
msgBox.Timeout = timeOut_ms;
|
||||
msgBox.TimeoutResult = TimeoutResult.Default;
|
||||
}
|
||||
|
||||
result = msgBox.Show();
|
||||
|
||||
// if the message box was closed by a defined timeout
|
||||
// must put in a delay so we can delete the messagebox instance
|
||||
if (timeOut_ms > 0)
|
||||
Thread.Sleep(500);
|
||||
|
||||
MessageBoxExManager.DeleteMessageBox("MsgBox");
|
||||
|
||||
msgBox = null;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// clsCustomButton
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// This class defines a custom button with text and value
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public class clsCustomButton
|
||||
{
|
||||
public string buttonText;
|
||||
public string buttonValue;
|
||||
|
||||
public clsCustomButton()
|
||||
{
|
||||
buttonText = "";
|
||||
buttonValue = "";
|
||||
}
|
||||
|
||||
public clsCustomButton(string d_buttonText, string d_buttonValue)
|
||||
{
|
||||
buttonText = d_buttonText;
|
||||
buttonValue = d_buttonValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
311
CommonLib/Library/Windows/Forms/MessageBoxExLib/MessageBoxEx.cs
Normal file
311
CommonLib/Library/Windows/Forms/MessageBoxExLib/MessageBoxEx.cs
Normal file
@@ -0,0 +1,311 @@
|
||||
///======================================================================================
|
||||
/// File: MessageBoxEx.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// An extended MessageBox with lot of customizing capabilities
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// An extended MessageBox with lot of customizing capabilities.
|
||||
/// </summary>
|
||||
public class MessageBoxEx
|
||||
{
|
||||
#region Fields
|
||||
private MessageBoxExForm _msgBox;
|
||||
|
||||
private bool _useSavedResponse = true;
|
||||
private string _name = null;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
internal string Name
|
||||
{
|
||||
get{ return _name; }
|
||||
set{ _name = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the caption of the message box
|
||||
/// </summary>
|
||||
public string Caption
|
||||
{
|
||||
set{_msgBox.Caption = value;}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the text of the message box
|
||||
/// </summary>
|
||||
public string Text
|
||||
{
|
||||
set{_msgBox.Message = value;}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the icon to show in the message box
|
||||
/// </summary>
|
||||
public Icon CustomIcon
|
||||
{
|
||||
set{_msgBox.CustomIcon = value;}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the icon to show in the message box
|
||||
/// </summary>
|
||||
public MessageBoxExIcon Icon
|
||||
{
|
||||
set{ _msgBox.StandardIcon = (MessageBoxIcon)Enum.Parse(typeof(MessageBoxIcon), value.ToString());}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the font for the text of the message box
|
||||
/// </summary>
|
||||
public Font Font
|
||||
{
|
||||
set{_msgBox.Font = value;}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets or Gets the ability of the user to save his/her response
|
||||
/// </summary>
|
||||
public bool AllowSaveResponse
|
||||
{
|
||||
get{ return _msgBox.AllowSaveResponse; }
|
||||
set{ _msgBox.AllowSaveResponse = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the text to show to the user when saving his/her response
|
||||
/// </summary>
|
||||
public string SaveResponseText
|
||||
{
|
||||
set{_msgBox.SaveResponseText = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets or Gets whether the saved response if available should be used
|
||||
/// </summary>
|
||||
public bool UseSavedResponse
|
||||
{
|
||||
get{ return _useSavedResponse; }
|
||||
set{ _useSavedResponse = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets or Gets whether an alert sound is played while showing the message box.
|
||||
/// The sound played depends on the the Icon selected for the message box
|
||||
/// </summary>
|
||||
public bool PlayAlsertSound
|
||||
{
|
||||
get{ return _msgBox.PlayAlertSound; }
|
||||
set{ _msgBox.PlayAlertSound = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets or Gets the time in milliseconds for which the message box is displayed.
|
||||
/// </summary>
|
||||
public int Timeout
|
||||
{
|
||||
get{ return _msgBox.Timeout; }
|
||||
set{ _msgBox.Timeout = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls the result that will be returned when the message box times out.
|
||||
/// </summary>
|
||||
public TimeoutResult TimeoutResult
|
||||
{
|
||||
get{ return _msgBox.TimeoutResult; }
|
||||
set{ _msgBox.TimeoutResult = value; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
/// <summary>
|
||||
/// Shows the message box
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string Show()
|
||||
{
|
||||
return Show(null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the messsage box with the specified owner
|
||||
/// </summary>
|
||||
/// <param name="owner"></param>
|
||||
/// <returns></returns>
|
||||
public string Show(IWin32Window owner)
|
||||
{
|
||||
if(_useSavedResponse && this.Name != null)
|
||||
{
|
||||
string savedResponse = MessageBoxExManager.GetSavedResponse(this);
|
||||
if( savedResponse != null)
|
||||
return savedResponse;
|
||||
}
|
||||
|
||||
if(owner == null)
|
||||
{
|
||||
_msgBox.ShowDialog();
|
||||
}
|
||||
else
|
||||
{
|
||||
_msgBox.ShowDialog(owner);
|
||||
}
|
||||
|
||||
if(this.Name != null)
|
||||
{
|
||||
if(_msgBox.AllowSaveResponse && _msgBox.SaveResponse)
|
||||
MessageBoxExManager.SetSavedResponse(this, _msgBox.Result);
|
||||
else
|
||||
MessageBoxExManager.ResetSavedResponse(this.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
Dispose();
|
||||
}
|
||||
|
||||
return _msgBox.Result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a custom button to the message box
|
||||
/// </summary>
|
||||
/// <param name="button">The button to add</param>
|
||||
public void AddButton(MessageBoxExButton button)
|
||||
{
|
||||
if(button == null)
|
||||
throw new ArgumentNullException("button","A null button cannot be added");
|
||||
|
||||
_msgBox.Buttons.Add(button);
|
||||
|
||||
if(button.IsCancelButton)
|
||||
{
|
||||
_msgBox.CustomCancelButton = button;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a custom button to the message box
|
||||
/// </summary>
|
||||
/// <param name="text">The text of the button</param>
|
||||
/// <param name="val">The return value in case this button is clicked</param>
|
||||
public void AddButton(string text, string val)
|
||||
{
|
||||
if(text == null)
|
||||
throw new ArgumentNullException("text","Text of a button cannot be null");
|
||||
|
||||
if(val == null)
|
||||
throw new ArgumentNullException("val","Value of a button cannot be null");
|
||||
|
||||
MessageBoxExButton button = new MessageBoxExButton();
|
||||
button.Text = text;
|
||||
button.Value = val;
|
||||
|
||||
AddButton(button);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a standard button to the message box
|
||||
/// </summary>
|
||||
/// <param name="buttons">The standard button to add</param>
|
||||
public void AddButton(MessageBoxExButtons button)
|
||||
{
|
||||
string buttonText = MessageBoxExManager.GetLocalizedString(button.ToString());
|
||||
if(buttonText == null)
|
||||
{
|
||||
buttonText = button.ToString();
|
||||
}
|
||||
|
||||
string buttonVal = button.ToString();
|
||||
|
||||
MessageBoxExButton btn = new MessageBoxExButton();
|
||||
btn.Text = buttonText;
|
||||
btn.Value = buttonVal;
|
||||
|
||||
if(button == MessageBoxExButtons.Cancel)
|
||||
{
|
||||
btn.IsCancelButton = true;
|
||||
}
|
||||
|
||||
AddButton(btn);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add standard buttons to the message box.
|
||||
/// </summary>
|
||||
/// <param name="buttons">The standard buttons to add</param>
|
||||
public void AddButtons(MessageBoxButtons buttons)
|
||||
{
|
||||
switch(buttons)
|
||||
{
|
||||
case MessageBoxButtons.OK:
|
||||
AddButton(MessageBoxExButtons.Ok);
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.AbortRetryIgnore:
|
||||
AddButton(MessageBoxExButtons.Abort);
|
||||
AddButton(MessageBoxExButtons.Retry);
|
||||
AddButton(MessageBoxExButtons.Ignore);
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.OKCancel:
|
||||
AddButton(MessageBoxExButtons.Ok);
|
||||
AddButton(MessageBoxExButtons.Cancel);
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.RetryCancel:
|
||||
AddButton(MessageBoxExButtons.Retry);
|
||||
AddButton(MessageBoxExButtons.Cancel);
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.YesNo:
|
||||
AddButton(MessageBoxExButtons.Yes);
|
||||
AddButton(MessageBoxExButtons.No);
|
||||
break;
|
||||
|
||||
case MessageBoxButtons.YesNoCancel:
|
||||
AddButton(MessageBoxExButtons.Yes);
|
||||
AddButton(MessageBoxExButtons.No);
|
||||
AddButton(MessageBoxExButtons.Cancel);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Ctor
|
||||
/// <summary>
|
||||
/// Ctor is internal because this can only be created by MBManager
|
||||
/// </summary>
|
||||
internal MessageBoxEx()
|
||||
{
|
||||
_msgBox = new MessageBoxExForm(null);
|
||||
}
|
||||
|
||||
public MessageBoxEx(Form parent)
|
||||
{
|
||||
_msgBox = new MessageBoxExForm(parent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called by the manager when it is disposed
|
||||
/// </summary>
|
||||
internal void Dispose()
|
||||
{
|
||||
if(_msgBox != null)
|
||||
{
|
||||
_msgBox.Dispose();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// Internal DataStructure used to represent a button
|
||||
/// </summary>
|
||||
public class MessageBoxExButton
|
||||
{
|
||||
private string _text = null;
|
||||
/// <summary>
|
||||
/// Gets or Sets the text of the button
|
||||
/// </summary>
|
||||
public string Text
|
||||
{
|
||||
get{ return _text; }
|
||||
set{ _text = value; }
|
||||
}
|
||||
|
||||
private string _value = null;
|
||||
/// <summary>
|
||||
/// Gets or Sets the return value when this button is clicked
|
||||
/// </summary>
|
||||
public string Value
|
||||
{
|
||||
get{ return _value; }
|
||||
set{_value = value; }
|
||||
}
|
||||
|
||||
private string _helpText = null;
|
||||
/// <summary>
|
||||
/// Gets or Sets the tooltip that is displayed for this button
|
||||
/// </summary>
|
||||
public string HelpText
|
||||
{
|
||||
get{ return _helpText; }
|
||||
set{ _helpText = value; }
|
||||
}
|
||||
|
||||
private bool _isCancelButton = false;
|
||||
/// <summary>
|
||||
/// Gets or Sets wether this button is a cancel button. i.e. the button
|
||||
/// that will be assumed to have been clicked if the user closes the message box
|
||||
/// without pressing any button.
|
||||
/// </summary>
|
||||
public bool IsCancelButton
|
||||
{
|
||||
get{ return _isCancelButton; }
|
||||
set{ _isCancelButton = value; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// Standard MessageBoxEx buttons
|
||||
/// </summary>
|
||||
public enum MessageBoxExButtons
|
||||
{
|
||||
Ok = 0,
|
||||
Cancel = 1,
|
||||
Yes = 2,
|
||||
No = 4,
|
||||
Abort = 8,
|
||||
Retry = 16,
|
||||
Ignore = 32
|
||||
}
|
||||
}
|
||||
1091
CommonLib/Library/Windows/Forms/MessageBoxExLib/MessageBoxExForm.cs
Normal file
1091
CommonLib/Library/Windows/Forms/MessageBoxExLib/MessageBoxExForm.cs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,387 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 1.3
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">1.3</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1">this is my long string</data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
[base64 mime encoded serialized .NET Framework object]
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
[base64 mime encoded string representing a byte array form of the .NET Framework object]
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used forserialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>1.3</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="panelIcon.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name="panelIcon.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="panelIcon.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="panelIcon.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="panelIcon.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="panelIcon.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>8, 8</value>
|
||||
</data>
|
||||
<data name="chbSaveResponse.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name="chbSaveResponse.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="chbSaveResponse.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="imageListIcons.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="imageListIcons.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="imageListIcons.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</data>
|
||||
<data name="imageListIcons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuNTAw
|
||||
MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT
|
||||
eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA
|
||||
AADELQAAAk1TRnQBSQFMAgEBBAEAAQUBAAEEAQABIAEAASABAAT/AREBEAj/AUIBTQE2BwABNgMAASgD
|
||||
AAGAAwABQAMAAQEBAAEQBgABQP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
|
||||
AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wA8AAEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARAB
|
||||
QgEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARAB
|
||||
QgEQAUIqAAEQAUIBEAFCMAABEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQjwAARABQgEQAUIe
|
||||
AAEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARAB
|
||||
QgEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQiYAARABQgEQAUIB
|
||||
EAFCKgABEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCARAB
|
||||
QjQAARABQgEQAUIBEAFCGwABQjAAARABQgEQAUIBEAFCARABQgEQAUImAAEQAUIBEAFCKAABEAFCARAB
|
||||
QgEAAUABAAFAAQABQAEAAUABAAFAAQABQAEAAUABAAFAARABQgEQAUIBEAFCARABQgEQAUIBEAFCNAAB
|
||||
EAFCARABQhkAAUIB4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B
|
||||
4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8BGAFjAgABEAFCARAB
|
||||
QgEQAUIBEAFCIgAB/wF/AgABEAFCARABQiQAARABQgEAAUABAAFAAQABQAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABQAEAAUABAAFAARABQgEQAUIBEAFCARABQgEQAUIsAAH/AX8CAAEQAUIB
|
||||
EAFCFwABQgHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B
|
||||
4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/ARgBYwIAARAB
|
||||
QgEQAUIBEAFCIAAB/wF/Af8BfwIAARABQgEQAUIiAAEQAUIBAAFAAQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAFAARABQgEQAUIBEAFCARABQgEQAUIo
|
||||
AAH/AX8B/wF/AgABEAFCARABQhcAAUIB4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B
|
||||
4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B
|
||||
4AF/AeABfwHgAX8CAAEQAUIBEAFCARABQhoAARABQgIAAf8BfwH/AX8B/wF/AgABEAFCARABQiEAAUAB
|
||||
AAFAAQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAUABAAFAARABQgEQAUIBEAFCARABQiAAARABQgIAAf8BfwH/AX8B/wF/AgABEAFCARAB
|
||||
QhcAAUIB4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8BGAFjBAAB
|
||||
GAFjAeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8CAAEQAUIBEAFCFgAB
|
||||
EAFCARABQgEQAUIBEAFCAgAB/wF/Af8BfwH/AX8CAAEQAUIBEAFCARABQgEQAUIBEAFCGQABQAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABQAEQAUIBEAFCARABQhoAARABQgEQAUIBEAFCARABQgIAAf8BfwH/AX8B
|
||||
/wF/AgABEAFCARABQgEQAUIBEAFCARABQhEAAUIB4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeAB
|
||||
fwHgAX8B4AF/AeABfwHgAX8IAAHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B
|
||||
GAFjAgABEAFCARABQhIAARABQgEQAUIBEAFCBgABGAFjAf8BfwH/AX8B/wF/AgABEAFCARABQgEQAUIB
|
||||
EAFCARABQgEQAUIBEAFCEwABQAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAFAARABQgEQAUIB
|
||||
EAFCFAABEAFCARABQgEQAUIGAAEYAWMB/wF/Af8BfwH/AX8CAAEQAUIBEAFCARABQgEQAUIBEAFCARAB
|
||||
QgEQAUIPAAFCAeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8IAAHgAX8B
|
||||
4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8CAAEQAUIBEAFCEgABEAFCBgABGAFjAf8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/ARgBYwYAARABQgEQAUIBEAFCARABQgEQAUIRAAFAAQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAEAAUABEAFCARABQgEQAUIBEAFCEAABEAFCBgABGAFjAf8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/ARgBYwYAARABQgEQAUIBEAFCARABQgEQAUINAAFCAeABfwHgAX8B4AF/AeAB
|
||||
fwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8BGAFjBAABGAFjAeABfwHgAX8B4AF/AeABfwHgAX8B
|
||||
4AF/AeABfwHgAX8B4AF/ARgBYwIAARABQgEQAUIUAAEYAWMB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BGAFjBAABEAFCARABQgEQAUIBEAFCDQABQAEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAH/AX8BAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8Af8B
|
||||
fwEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAUABEAFCARABQgEQAUISAAEYAWMB/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BGAFjBAABEAFCARABQgEQAUIBEAFCDQAB
|
||||
QgHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeAB
|
||||
fwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AgABEAFCARABQhIAARgBYwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BGAFjAgAB
|
||||
EAFCARABQgEQAUIBEAFCCQABQAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAH/AX8B/wF/Af8BfwEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8Af8BfwH/AX8B/wF/AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABQAEQAUIBEAFCDgABGAFjAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEYAWMCAAEQAUIBEAFCARABQgEQAUILAAFCAeABfwHgAX8B
|
||||
4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8CAAHgAX8B4AF/AeABfwHgAX8B4AF/AeAB
|
||||
fwHgAX8B4AF/AeABfwHgAX8BGAFjAgABEAFCARABQhAAAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8CAAEQAUIB
|
||||
EAFCARABQgEQAUIHAAFAAQABfAEAAXwBAAF8AQABfAEAAXwB/wF/Af8BfwH/AX8B/wF/Af8BfwEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAH/AX8B/wF/Af8BfwH/AX8B/wF/AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAFAARABQgEQAUIBEAFCCgAB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwIAARABQgEQAUIBEAFCARABQgsAAUIB
|
||||
4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8BGAFjAgABGAFjAeABfwHgAX8B4AF/AeAB
|
||||
fwHgAX8B4AF/AeABfwHgAX8B4AF/AgABEAFCARABQhAAAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/ARgBYwEfAQABHwEAARgBYwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwIAARABQgEQAUIBEAFCARABQgUAAUABAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwEAAXwBAAF8AQABfAEAAXwB/wF/Af8BfwH/AX8B/wF/Af8BfwEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAUABEAFCARABQgEQAUIIAAH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8CAAEQAUIB
|
||||
EAFCARABQgEQAUIJAAFCAeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AQABQgMAAUIB
|
||||
4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwEYAWMCAAEQAUIBEAFCDAABEAFCAf8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEfAQABHwEAAR8BAAEfAQAB/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AgABEAFCARABQgEQAUIDAAFAAQABfAEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwB/wF/Af8BfwH/AX8B/wF/Af8BfwEAAXwBAAF8Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8BAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAUABEAFCARABQgQAARABQgH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AR8BAAEfAQABHwEAAR8BAAEfAQABHwEAAR8BAAEfAQAB
|
||||
HwEAAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwIAARABQgEQAUIBEAFCCwABQgHgAX8B4AF/AeAB
|
||||
fwHgAX8B4AF/AeABfwHgAX8B4AF/BgAB4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwIAARAB
|
||||
QgEQAUIMAAEQAUIBGAFjAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEfAQAB
|
||||
HwEAAR8BAAEfAQAB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ARgBYwIAARAB
|
||||
QgEQAUIBEAFCAQABQAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAFAARABQgEQAUICAAEQAUIBGAFjAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwEfAQABHwEAAR8BAAEfAQABHwEAAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/ARgBYwIAARABQgEQAUIBEAFCCQABQgHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8BGAFjBgAB
|
||||
GAFjAeABfwHgAX8B4AF/AeABfwHgAX8B4AF/ARgBYwIAARABQgEQAUIMAAEQAUIB/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEYAWMBHwEAAR8BAAEYAWMB/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwIAARABQgEQAUIBEAFCAQABQAEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAFAARABQgEQAUICAAEQAUIB
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEfAQABHwEAAR8BAAEfAQAB
|
||||
HwEAAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwIAARABQgEQAUIBEAFCCwAB
|
||||
QgHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwEAAUIHAAFCAeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AgAB
|
||||
EAFCARABQgwAARABQgEYAWMB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwEYAWMCAAEQAUIBEAFCAQABQAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAFAARABQgEQAUIBEAFCARgBYwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/AR8BAAEfAQABHwEAAR8BAAEfAQAB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/ARgBYwIAARABQgEQAUILAAFCAeABfwHgAX8B4AF/AeABfwHgAX8B4AF/CgAB
|
||||
4AF/AeABfwHgAX8B4AF/AeABfwEYAWMCAAEQAUIBEAFCDAABEAFCAf8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEfAQABHwEAAf8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwIAARABQgEQAUIBAAFAAQABfAEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAUABEAFCARABQgEQAUIB/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BHwEAAR8BAAEfAQABHwEAAR8B
|
||||
AAH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AgABEAFCARABQg0AAUIB
|
||||
4AF/AeABfwHgAX8B4AF/AeABfwoAAeABfwHgAX8B4AF/AeABfwHgAX8CAAEQAUIBEAFCDgABEAFCAf8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEfAQABHwEAARgB
|
||||
YwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwIAARABQgEQAUIB
|
||||
AAFAAQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAUAB
|
||||
EAFCARABQgEQAUIB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
HwEAAR8BAAEfAQABHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/AgABEAFCARABQg0AAUIB4AF/AeABfwHgAX8B4AF/AeABfwoAAeABfwHgAX8B4AF/AeABfwEYAWMC
|
||||
AAEQAUIBEAFCDgABEAFCAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwEfAQABHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwIAARABQgEQAUIBAAFAAQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEAAXwBAAF8AQABfAEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAUABEAFCAgABEAFCAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/AR8BAAEfAQABHwEAAR8BAAEfAQAB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwIAARABQgEQAUIPAAFCAeABfwHgAX8B4AF/AeABfwoAAeABfwHgAX8B
|
||||
4AF/AeABfwIAARABQgEQAUIQAAEQAUIB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/ARgBYwEfAQABHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/AgABEAFCARABQgEAAUABAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQAB
|
||||
fAH/AX8B/wF/Af8BfwH/AX8B/wF/AQABfAEAAXwB/wF/Af8BfwH/AX8B/wF/Af8BfwEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwBAAF8AQABQAEQAUICAAEQAUIB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BHwEAAR8BAAEfAQABHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AgABEAFCARABQg8AAUIB4AF/AeABfwHgAX8B4AF/CgAB
|
||||
4AF/AeABfwHgAX8BGAFjAgABEAFCARABQhAAARABQgH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwEYAWMBHwEAAR8BAAEYAWMB/wF/AR8BAAEfAQABHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8CAAEQAUIFAAFAAQABfAEAAXwBAAF8AQABfAEAAXwBAAF8Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8BAAF8AQABfAEAAXwBAAF8Af8BfwH/AX8B/wF/Af8BfwH/AX8BAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwBAAFAARABQgEQAUICAAEQAUIB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/AR8BAAEfAQABHwEAAR8BAAEfAQABHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AgABEAFCEwABQgHgAX8B4AF/AeABfwEYAWMGAAEYAWMB
|
||||
4AF/AeABfwHgAX8CAAEQAUIBEAFCEgABEAFCARgBYwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/AR8BAAEfAQABHwEAAR8BAAH/AX8BGAFjAR8BAAEfAQABHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/ARgBYwIAARABQgUAAUABAAF8AQABfAEAAXwBAAF8AQABfAH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8Af8BfwH/AX8B/wF/Af8BfwH/AX8BAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAUABEAFCBAABEAFCARgBYwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/ARgBYwIAARABQhMAAUIB4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeAB
|
||||
fwHgAX8B4AF/ARgBYwIAARABQgEQAUIUAAEQAUIB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwEfAQABHwEAAR8BAAEfAQAB/wF/Af8BfwEfAQABHwEAAR8BAAEfAQAB/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwIAARABQgcAAUABAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB/wF/Af8BfwH/AX8B
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAH/AX8B/wF/Af8BfwEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAUAIAAEQAUIB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwIAARABQhcAAUIB4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeABfwHgAX8CAAEQAUIBEAFCFgAB
|
||||
EAFCARgBYwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B
|
||||
HwEAAR8BAAEfAQABHwEAAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEYAWMNAAFAAQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8Af8BfwEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
/wF/AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABQAEQAUIIAAEQAUIBGAFjAf8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/ARgBYwEfAQABHwEAAR8BAAEfAQABGAFjAf8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/ARgBYxsAAUIB4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AeAB
|
||||
fwEYAWMCAAEQAUIBEAFCGAABEAFCAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEYAWMBHwEAARgB
|
||||
YwH/AX8B/wF/AR8BAAEfAQABHwEAAR8BAAEYAWMB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/EQAB
|
||||
QAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAFAARABQgwAARABQgH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwEfAQABHwEAAR8BAAEfAQABHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8Bfx8AAUIB4AF/AeABfwHgAX8B4AF/AeABfwHgAX8B4AF/AgABEAFCARAB
|
||||
QhwAARABQgH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BGAFjAR8BAAEfAQABHwEAAR8BAAEfAQAB
|
||||
HwEAARgBYwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8TAAFAAQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwB
|
||||
AAF8AQABfAEAAUAQAAEQAUIB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEfAQABHwEAAR8B
|
||||
AAEfAQABHwEAAR8BAAH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/IQABQgHgAX8B4AF/AeAB
|
||||
fwHgAX8B4AF/AeABfwEYAWMCAAEQAUIBEAFCHgABEAFCAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8XAAFAAQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwBAAFAFAABEAFCAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEYAWMB
|
||||
HwEAAR8BAAEfAQABHwEAARgBYwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8lAAFCAeABfwHgAX8B
|
||||
4AF/AeABfwHgAX8CAAEQAUIBEAFCIgABEAFCARgBYwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BGAFjARABQhkAAUABAAFAAQABfAEAAXwB
|
||||
AAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAUAB
|
||||
AAFAGAABEAFCARgBYwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8B
|
||||
fwH/AX8B/wF/Af8BfwH/AX8BGAFjARABQiUAAUIB4AF/AeABfwHgAX8B4AF/ARgBYwIAARABQiYAARAB
|
||||
QgEQAUIBGAFjAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ARgB
|
||||
YwEQAUIBEAFCHwABQAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAXwBAAF8AQAB
|
||||
fAEAAXwBAAF8AQABQB4AARABQgEQAUIBGAFjAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/ARgBYwEQAUIBEAFCKQABQgHgAX8B4AF/ARgBYzAAARABQgEQAUIBEAFCARgB
|
||||
YwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwEYAWMBEAFCARABQgEQAUIlAAFAAQABQAEAAUABAAF8AQAB
|
||||
fAEAAXwBAAF8AQABfAEAAXwBAAF8AQABfAEAAUABAAFAAQABQCQAARABQgEQAUIBEAFCARgBYwH/AX8B
|
||||
/wF/Af8BfwH/AX8B/wF/Af8BfwEYAWMBEAFCARABQgEQAUIvAAFCAQABQgEAAUI2AAEQAUIBEAFCARAB
|
||||
QgEQAUIBEAFCARABQgEQAUIBEAFCMQABQAEAAUABAAFAAQABQAEAAUABAAFAAQABQAEAAUAwAAEQAUIB
|
||||
EAFCARABQgEQAUIBEAFCARABQgEQAUIBEAFCGgABQgFNAT4HAAE+AwABKAMAAYADAAFAAwABAQEAAQEG
|
||||
AAEEFgAD//8A/wADAAH4AgABAwL/AecC/wH4AQcD/wHnAf8B8AIAAQEC/wHHAv8BwAEAA/8BxwH/AcAD
|
||||
AAL/AYcC/wGAAQABfwL/AYcB/wGAAwAC/wEHAf8B/gIAAR8C/wEHAf8EAAH/Af4BBwH/AfwCAAEPAf8B
|
||||
/gEHAf8EAAH/AfgBBwH/AfgCAAEHAf8B+AEHAf8DAAEBAf8BwAEAAf8B8AIAAQcB/wHAAQAB/wMAAQEB
|
||||
/wIAAT8B4AIAAQMB/wIAAT8BgAIAAQMB/gIAAR8B4AIAAQEB/gIAAR8BgAIAAQMB/AIAAQ8BwAIAAQEB
|
||||
/AIAAQ8BwAIAAQcB+AIAAQcBgAIAAQEB+AIAAQcBwAIAAQcB8AIAAQMBgAMAAfACAAEDAeACAAEPAeAC
|
||||
AAEBAYADAAHgAgABAQHgAgABDwHAAgABAQQAAcACAAEBAfACAAEfAYAHAAGAAwAB8AIAAR8BgAcAAYAD
|
||||
AAH4AgABPwwAAfgCAAE/DAAB/AIAAX8MAAH8AgABfwcAAQEEAAH+AgAB/wcAAQEEAAH+AgAB/wMAAQEB
|
||||
gAIAAQEDAAEBAf8BAAEBAf8DAAEBAYACAAEDAwABAQH/AQABAQH/AYACAAEDAYACAAEHAYACAAEDAf8B
|
||||
gAEDAf8BgAIAAQcBwAIAAQcBgAIAAQcB/wGAAQMB/wHAAgABDwHgAgABDwHAAgABDwH/AcABBwH/AeAC
|
||||
AAEfAeACAAEfAeACAAEfAf8BwAEHAf8B8AIAAT8B8AIAAT8B8AIAAT8B/wHgAQ8B/wH4AgABfwH4AgAB
|
||||
fwH4AgABfwH/AeABHwH/AfwCAAH/Af4BAAEBAf8B/AIAAv8B8AF/Av8BAAEDAv8BAAEDAv8BAAEDAv8B
|
||||
+AP/AeABHwL/AeABHwL/AeABHwH/FgAL
|
||||
</value>
|
||||
</data>
|
||||
<data name="buttonToolTip.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="buttonToolTip.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>142, 17</value>
|
||||
</data>
|
||||
<data name="buttonToolTip.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="rtbMessage.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name="rtbMessage.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="rtbMessage.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
<data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>(Default)</value>
|
||||
</data>
|
||||
<data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>8, 8</value>
|
||||
</data>
|
||||
<data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>80</value>
|
||||
</data>
|
||||
<data name="$this.Name">
|
||||
<value>MessageBoxExForm</value>
|
||||
</data>
|
||||
<data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>Private</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// Standard MessageBoxEx icons
|
||||
/// </summary>
|
||||
public enum MessageBoxExIcon
|
||||
{
|
||||
None,
|
||||
Asterisk,
|
||||
Error,
|
||||
Exclamation,
|
||||
Hand,
|
||||
Information,
|
||||
Question,
|
||||
Stop,
|
||||
Warning
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Collections;
|
||||
using System.Windows.Forms;
|
||||
using System.Resources;
|
||||
using System.Reflection;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// Manages a collection of MessageBoxes. Basically manages the
|
||||
/// saved response handling for messageBoxes.
|
||||
/// </summary>
|
||||
public class MessageBoxExManager
|
||||
{
|
||||
#region Fields
|
||||
private static Hashtable _messageBoxes = new Hashtable();
|
||||
private static Hashtable _savedResponses = new Hashtable();
|
||||
|
||||
private static Hashtable _standardButtonsText = new Hashtable();
|
||||
#endregion
|
||||
|
||||
#region Static ctor
|
||||
static MessageBoxExManager()
|
||||
{
|
||||
try
|
||||
{
|
||||
Assembly current = typeof(MessageBoxExManager).Assembly;
|
||||
string[] resources = current.GetManifestResourceNames();
|
||||
string standardButtonsTextResourceName = "";
|
||||
Match SPMatch;
|
||||
foreach (string resource in resources)
|
||||
{
|
||||
SPMatch = Regex.Match(resource,@"^(.+StandardButtonsText)\.resources$", RegexOptions.IgnoreCase);
|
||||
if (SPMatch.Success && SPMatch.Groups.Count > 1)
|
||||
{
|
||||
standardButtonsTextResourceName = SPMatch.Groups[1].Value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ResourceManager rm = new ResourceManager(standardButtonsTextResourceName, typeof(MessageBoxExManager).Assembly);
|
||||
_standardButtonsText[MessageBoxExButtons.Ok.ToString()] = rm.GetString("Ok");
|
||||
_standardButtonsText[MessageBoxExButtons.Cancel.ToString()] = rm.GetString("Cancel");
|
||||
_standardButtonsText[MessageBoxExButtons.Yes.ToString()] = rm.GetString("Yes");
|
||||
_standardButtonsText[MessageBoxExButtons.No.ToString()] = rm.GetString("No");
|
||||
_standardButtonsText[MessageBoxExButtons.Abort.ToString()] = rm.GetString("Abort");
|
||||
_standardButtonsText[MessageBoxExButtons.Retry.ToString()] = rm.GetString("Retry");
|
||||
_standardButtonsText[MessageBoxExButtons.Ignore.ToString()] = rm.GetString("Ignore");
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.Assert(false, "Unable to load resources for MessageBoxEx", ex.ToString());
|
||||
|
||||
//Load default resources
|
||||
_standardButtonsText[MessageBoxExButtons.Ok.ToString()] = "Ok";
|
||||
_standardButtonsText[MessageBoxExButtons.Cancel.ToString()] = "Cancel";
|
||||
_standardButtonsText[MessageBoxExButtons.Yes.ToString()] = "Yes";
|
||||
_standardButtonsText[MessageBoxExButtons.No.ToString()] = "No";
|
||||
_standardButtonsText[MessageBoxExButtons.Abort.ToString()] = "Abort";
|
||||
_standardButtonsText[MessageBoxExButtons.Retry.ToString()] = "Retry";
|
||||
_standardButtonsText[MessageBoxExButtons.Ignore.ToString()] = "Ignore";
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
/// <summary>
|
||||
/// Creates a new message box with the specified name. If null is specified
|
||||
/// in the message name then the message box is not managed by the Manager and
|
||||
/// will be disposed automatically after a call to Show()
|
||||
/// </summary>
|
||||
/// <param name="name">The name of the message box</param>
|
||||
/// <returns>A new message box</returns>
|
||||
public static MessageBoxEx CreateMessageBox(Form parentForm, string name)
|
||||
{
|
||||
if(name != null && _messageBoxes.ContainsKey(name))
|
||||
{
|
||||
string err = string.Format("A MessageBox with the name {0} already exists.",name);
|
||||
throw new ArgumentException(err,"name");
|
||||
}
|
||||
|
||||
MessageBoxEx msgBox = new MessageBoxEx(parentForm);
|
||||
msgBox.Name = name;
|
||||
if(msgBox.Name != null)
|
||||
{
|
||||
_messageBoxes[name] = msgBox;
|
||||
}
|
||||
|
||||
return msgBox;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the message box with the specified name
|
||||
/// </summary>
|
||||
/// <param name="name">The name of the message box to retrieve</param>
|
||||
/// <returns>The message box with the specified name or null if a message box
|
||||
/// with that name does not exist</returns>
|
||||
public static MessageBoxEx GetMessageBox(string name)
|
||||
{
|
||||
if(_messageBoxes.Contains(name))
|
||||
{
|
||||
return _messageBoxes[name] as MessageBoxEx;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the message box with the specified name
|
||||
/// </summary>
|
||||
/// <param name="name">The name of the message box to delete</param>
|
||||
public static void DeleteMessageBox(string name)
|
||||
{
|
||||
if(name == null)
|
||||
return;
|
||||
|
||||
if(_messageBoxes.Contains(name))
|
||||
{
|
||||
MessageBoxEx msgBox = _messageBoxes[name] as MessageBoxEx;
|
||||
msgBox.Dispose();
|
||||
_messageBoxes.Remove(name);
|
||||
}
|
||||
}
|
||||
|
||||
public static void WriteSavedResponses(Stream stream)
|
||||
{
|
||||
throw new NotImplementedException("This feature has not yet been implemented");
|
||||
}
|
||||
|
||||
public static void ReadSavedResponses(Stream stream)
|
||||
{
|
||||
throw new NotImplementedException("This feature has not yet been implemented");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reset the saved response for the message box with the specified name.
|
||||
/// </summary>
|
||||
/// <param name="messageBoxName">The name of the message box whose response is to be reset.</param>
|
||||
public static void ResetSavedResponse(string messageBoxName)
|
||||
{
|
||||
if(messageBoxName == null)
|
||||
return;
|
||||
|
||||
if(_savedResponses.ContainsKey(messageBoxName))
|
||||
{
|
||||
_savedResponses.Remove(messageBoxName);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the saved responses for all message boxes that are managed by the manager.
|
||||
/// </summary>
|
||||
public static void ResetAllSavedResponses()
|
||||
{
|
||||
_savedResponses.Clear();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Internal Methods
|
||||
/// <summary>
|
||||
/// Set the saved response for the specified message box
|
||||
/// </summary>
|
||||
/// <param name="msgBox">The message box whose response is to be set</param>
|
||||
/// <param name="response">The response to save for the message box</param>
|
||||
internal static void SetSavedResponse(MessageBoxEx msgBox, string response)
|
||||
{
|
||||
if(msgBox.Name == null)
|
||||
return;
|
||||
|
||||
_savedResponses[msgBox.Name] = response;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the saved response for the specified message box
|
||||
/// </summary>
|
||||
/// <param name="msgBox">The message box whose saved response is to be retrieved</param>
|
||||
/// <returns>The saved response if exists, null otherwise</returns>
|
||||
internal static string GetSavedResponse(MessageBoxEx msgBox)
|
||||
{
|
||||
string msgBoxName = msgBox.Name;
|
||||
if(msgBoxName == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if(_savedResponses.ContainsKey(msgBoxName))
|
||||
{
|
||||
return _savedResponses[msgBox.Name].ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the localized string for standard button texts like,
|
||||
/// "Ok", "Cancel" etc.
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
internal static string GetLocalizedString(string key)
|
||||
{
|
||||
if(_standardButtonsText.ContainsKey(key))
|
||||
{
|
||||
return (string)_standardButtonsText[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
using System;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// Standard MessageBoxEx results
|
||||
/// </summary>
|
||||
public struct MessageBoxExResult
|
||||
{
|
||||
public const string Ok = "Ok";
|
||||
public const string Cancel = "Cancel";
|
||||
public const string Yes = "Yes";
|
||||
public const string No = "No";
|
||||
public const string Abort = "Abort";
|
||||
public const string Retry = "Retry";
|
||||
public const string Ignore = "Ignore";
|
||||
public const string Timeout = "Timeout";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="ResMimeType">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="Version">
|
||||
<value>1.0.0.0</value>
|
||||
</resheader>
|
||||
<resheader name="Reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="Writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Ok">
|
||||
<value>O.K.</value>
|
||||
</data>
|
||||
<data name="Cancel">
|
||||
<value>Löschen</value>
|
||||
</data>
|
||||
<data name="Yes">
|
||||
<value>Ja</value>
|
||||
</data>
|
||||
<data name="No">
|
||||
<value>Nein</value>
|
||||
</data>
|
||||
<data name="Abort">
|
||||
<value>Abbruch</value>
|
||||
</data>
|
||||
<data name="Retry">
|
||||
<value>Wiederholung</value>
|
||||
</data>
|
||||
<data name="Ignore">
|
||||
<value>Ignorieren</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="ResMimeType">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="Version">
|
||||
<value>1.0.0.0</value>
|
||||
</resheader>
|
||||
<resheader name="Reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="Writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Ok">
|
||||
<value>Ok</value>
|
||||
</data>
|
||||
<data name="Cancel">
|
||||
<value>Annuler</value>
|
||||
</data>
|
||||
<data name="Yes">
|
||||
<value>Oui</value>
|
||||
</data>
|
||||
<data name="No">
|
||||
<value>Non</value>
|
||||
</data>
|
||||
<data name="Abort">
|
||||
<value>Arrêt</value>
|
||||
</data>
|
||||
<data name="Retry">
|
||||
<value>Nouvelle</value>
|
||||
</data>
|
||||
<data name="Ignore">
|
||||
<value>Ignorez</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="ResMimeType">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="Version">
|
||||
<value>1.0.0.0</value>
|
||||
</resheader>
|
||||
<resheader name="Reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="Writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Ok">
|
||||
<value>Ok</value>
|
||||
</data>
|
||||
<data name="Cancel">
|
||||
<value>Cancel</value>
|
||||
</data>
|
||||
<data name="Yes">
|
||||
<value>Yes</value>
|
||||
</data>
|
||||
<data name="No">
|
||||
<value>No</value>
|
||||
</data>
|
||||
<data name="Abort">
|
||||
<value>Abort</value>
|
||||
</data>
|
||||
<data name="Retry">
|
||||
<value>Retry</value>
|
||||
</data>
|
||||
<data name="Ignore">
|
||||
<value>Ignore</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// Enumerates the kind of results that can be returned when a
|
||||
/// message box times out
|
||||
/// </summary>
|
||||
public enum TimeoutResult
|
||||
{
|
||||
/// <summary>
|
||||
/// On timeout the value associated with the default button is set as the result.
|
||||
/// This is the default action on timeout.
|
||||
/// </summary>
|
||||
Default,
|
||||
|
||||
/// <summary>
|
||||
/// On timeout the value associated with the cancel button is set as the result. If
|
||||
/// the messagebox does not have a cancel button then the value associated with
|
||||
/// the default button is set as the result.
|
||||
/// </summary>
|
||||
Cancel,
|
||||
|
||||
/// <summary>
|
||||
/// On timeout MessageBoxExResult.Timeout is set as the result.
|
||||
/// </summary>
|
||||
Timeout
|
||||
}
|
||||
}
|
||||
184
CommonLib/Library/Windows/Forms/frmChildForm.cs
Normal file
184
CommonLib/Library/Windows/Forms/frmChildForm.cs
Normal file
@@ -0,0 +1,184 @@
|
||||
///======================================================================================
|
||||
/// File: frmChildForm.cs
|
||||
/// Created: 06/06/12
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// A base child form with unique characteristics
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.Threading;
|
||||
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
///======================================================================================
|
||||
/// ChildForm
|
||||
///======================================================================================
|
||||
/// <summary>
|
||||
/// This class is a base class for any child form that has a calling parent form. Any
|
||||
/// class inheriting this class will be able to display the child form at the center
|
||||
/// of the parent form by notifying the child form of its parent form
|
||||
/// </summary>
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ----------- ----------- ----- ------------------------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///======================================================================================
|
||||
public partial class ChildForm : Form
|
||||
{
|
||||
//property
|
||||
public Form parentForm
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public ChildForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
parentForm = null;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// ChildForm.OnLoad
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Form's OnLoad Event Handler. If the parent form is passed in then display
|
||||
/// this form at the center of the parent form
|
||||
/// </summary>
|
||||
/// <param name="e"></param>
|
||||
/// <return>void</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
protected override void OnLoad(EventArgs e)
|
||||
{
|
||||
if (parentForm != null)
|
||||
CenterForm(parentForm);
|
||||
base.OnLoad(e);
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// ChildForm.OnLoad
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Centers the form relative to the parent form. Also moves the form into
|
||||
/// visible area of the screen if it's determined that an area of the form
|
||||
/// is position outside of the screen's visible area
|
||||
/// </summary>
|
||||
/// <param name="parentForm">The parent form that calls this form</param>
|
||||
/// <return>void</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
private void CenterForm(Form parentForm)
|
||||
{
|
||||
List<Screen> allScreens = new List<Screen>();
|
||||
int parentCenterX, parentCenterY, childTopX, childTopY,
|
||||
childVisibleTopX, childVisibleBottomX,
|
||||
screenVisibleBottomX, screenVisibleBottomY, rectWidth, trueChildWidth, screensCount=0;
|
||||
|
||||
// create the smallest rectangle
|
||||
Rectangle rect = new Rectangle(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue);
|
||||
|
||||
// determines the coordinate of the center of the parent form
|
||||
// that will be used as the center of the pop-up box
|
||||
parentCenterX = parentForm.Left + parentForm.Width / 2;
|
||||
parentCenterY = parentForm.Top + parentForm.Height / 2;
|
||||
|
||||
childTopX = parentCenterX - this.Width / 2;
|
||||
childTopY = parentCenterY - this.Height / 2;
|
||||
|
||||
// if the x coordinate is off the screen to the left, we move it to the visible area of screen
|
||||
if (childTopX < 0)
|
||||
{
|
||||
trueChildWidth = childTopX + this.Width;
|
||||
childTopX = 0;
|
||||
}
|
||||
else
|
||||
trueChildWidth = this.Width;
|
||||
|
||||
// if the y coordinate is off the screen up above, we move it to the visible area of screen
|
||||
if (childTopY < 0)
|
||||
childTopY = 0;
|
||||
|
||||
foreach (Screen screen in Screen.AllScreens)
|
||||
{
|
||||
if (screen.Primary)
|
||||
allScreens.Insert(0, screen);
|
||||
else
|
||||
allScreens.Add(screen);
|
||||
}
|
||||
|
||||
foreach (Screen screen in allScreens)
|
||||
{
|
||||
screensCount++;
|
||||
|
||||
if (rect.Width < 0)
|
||||
rectWidth = 0;
|
||||
else
|
||||
rectWidth = rect.Width;
|
||||
|
||||
rect = Rectangle.Union(rect, screen.Bounds); // join screens
|
||||
|
||||
// if we're on the last screen
|
||||
if ( Screen.AllScreens.Length == screensCount )
|
||||
{
|
||||
// if the x coordinate is off the screen to the right, we move it to the visible area of screen
|
||||
if ((childTopX + this.Width) > rect.Width)
|
||||
{
|
||||
trueChildWidth = rect.Width - childTopX;
|
||||
}
|
||||
}
|
||||
|
||||
screenVisibleBottomX = screen.WorkingArea.X + screen.WorkingArea.Width;
|
||||
screenVisibleBottomY = screen.WorkingArea.Y + screen.WorkingArea.Height;
|
||||
|
||||
if (childTopX <= rectWidth)
|
||||
{
|
||||
childVisibleTopX = rectWidth + 1;
|
||||
}
|
||||
else
|
||||
childVisibleTopX = childTopX;
|
||||
|
||||
if ((childTopX + trueChildWidth) > (rectWidth + screen.Bounds.Width))
|
||||
childVisibleBottomX = rectWidth + screen.Bounds.Width;
|
||||
else
|
||||
childVisibleBottomX = childTopX + trueChildWidth;
|
||||
|
||||
// determine if the visible width of the form is 50% or greater, then we choose
|
||||
// to display this form on this screen
|
||||
if ( Convert.ToInt32(Math.Ceiling(((double)(childVisibleBottomX - childVisibleTopX) / (double)trueChildWidth)*100.0)) >= 50 )
|
||||
{
|
||||
if (childTopX < screen.WorkingArea.X)
|
||||
childTopX = screen.WorkingArea.X;
|
||||
else if ((childTopX + this.Width) > screenVisibleBottomX)
|
||||
childTopX -= (childTopX + this.Width) - screenVisibleBottomX;
|
||||
|
||||
if (childTopY < screen.WorkingArea.Y)
|
||||
childTopY = screen.WorkingArea.Y;
|
||||
else if ((childTopY + this.Height) > screenVisibleBottomY)
|
||||
childTopY -= (childTopY + this.Height) - screenVisibleBottomY;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.Location = new Point(childTopX, childTopY);
|
||||
}
|
||||
}
|
||||
}
|
||||
38
CommonLib/Library/Windows/Forms/frmChildForm.designer.cs
generated
Normal file
38
CommonLib/Library/Windows/Forms/frmChildForm.designer.cs
generated
Normal file
@@ -0,0 +1,38 @@
|
||||
namespace CommonLib.Windows.Forms
|
||||
{
|
||||
partial class ChildForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Text = "Forms";
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
612
CommonLib/Library/Windows/Misc/NetworkManagement.cs
Normal file
612
CommonLib/Library/Windows/Misc/NetworkManagement.cs
Normal file
@@ -0,0 +1,612 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Management;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.IO;
|
||||
using Microsoft.Win32;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Security.Principal;
|
||||
using System.Security.AccessControl;
|
||||
|
||||
using CommonLib.IO;
|
||||
using CommonLib.Misc;
|
||||
using CommonLib.Diagnostics;
|
||||
|
||||
namespace CommonLib.Windows.Misc
|
||||
{
|
||||
public class NetworkManagement
|
||||
{
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.GetNetworkAdapterAndConfigurationBasedOnPciLocation
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Given PCI Location (bus,device,function), obtain references to objects of
|
||||
/// type Win32_NetworkAdapter and Win32_NetworkAdapterConfiguration.
|
||||
/// These two object provides us with a wide array of information about the
|
||||
/// network adapter
|
||||
/// </summary>
|
||||
/// <param name="networkAdapter">
|
||||
/// This object must be of type Win32_NetworkAdapter
|
||||
/// </param>
|
||||
/// <param name="networkAdapterConfiguration">
|
||||
/// This object must be of type Win32_NetworkAdapterConfiguration
|
||||
/// </param>
|
||||
/// <param name="expectedPciLocation">
|
||||
/// Must be in this format: #,#,# (bus,device,function)
|
||||
/// i.e.: 61,7,2
|
||||
/// Every PCI network adapter has a unique location.
|
||||
/// </param>
|
||||
/// <param name="errMsg">error message returned if error encountered</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool GetNetworkAdapterAndConfigurationBasedOnPciLocation(ref ManagementObject networkAdapter, ref ManagementObject networkAdapterConfiguration, string expectedPciLocation, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
errMsg = "";
|
||||
|
||||
networkAdapter = null;
|
||||
networkAdapterConfiguration = null;
|
||||
|
||||
ManagementObjectSearcher mos = null;
|
||||
|
||||
Match regExMatch;
|
||||
string valueName = "LocationInformation";
|
||||
string registryValueNameValue = "";
|
||||
string actualPciLocationInfo = "";
|
||||
|
||||
try
|
||||
{
|
||||
if (expectedPciLocation.Length == 0)
|
||||
{
|
||||
throw new Exception("PCI Location cannot be empty. Provide PCI Location in the form: #,#,# representing bus,device,function");
|
||||
}
|
||||
else
|
||||
{
|
||||
expectedPciLocation = Regex.Replace(expectedPciLocation, @"\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*", "$1,$2,$3", RegexOptions.IgnoreCase);
|
||||
}
|
||||
|
||||
mos = new ManagementObjectSearcher(@"SELECT *
|
||||
FROM Win32_NetworkAdapter
|
||||
WHERE Manufacturer != 'Microsoft'
|
||||
AND NOT PNPDeviceID LIKE 'ROOT\\%'");
|
||||
|
||||
if (mos == null)
|
||||
{
|
||||
throw new Exception("No network adapter found in the system");
|
||||
}
|
||||
|
||||
foreach (ManagementObject adapter in mos.Get())
|
||||
{
|
||||
// print out all the properties name/value for each adapter
|
||||
//foreach (PropertyData pd in adapter.Properties)
|
||||
// Console.WriteLine(pd.Name + ": " + (pd.Value ?? "N/A"));
|
||||
|
||||
//Console.WriteLine("Index: {0}, Name: {1}", adapter["DeviceID"],adapter["Name"]);
|
||||
|
||||
string pnpDeviceIdRegistryPath = @"SYSTEM\CurrentControlSet\Enum\" + adapter["PNPDeviceID"];
|
||||
|
||||
RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
|
||||
RegistryKey rkSubKey = hklm.OpenSubKey(pnpDeviceIdRegistryPath, false);
|
||||
|
||||
List<string> list = new List<string>(rkSubKey.GetValueNames());
|
||||
|
||||
// if there's a name "LocationInformation" found in the registry key
|
||||
if (list.FindIndex(x => x.Equals(valueName, StringComparison.OrdinalIgnoreCase)) != -1)
|
||||
{
|
||||
// get the value associated with LocationInformation
|
||||
registryValueNameValue = rkSubKey.GetValue(valueName).ToString();
|
||||
|
||||
regExMatch = Regex.Match(registryValueNameValue, @".+\((\d+,\d+,\d+)\)$", RegexOptions.IgnoreCase);
|
||||
|
||||
if (regExMatch.Success)
|
||||
{
|
||||
// get actual pci location in this format #,#,# which corresponds to bus,device,function
|
||||
actualPciLocationInfo = regExMatch.Groups[1].Value;
|
||||
}
|
||||
}
|
||||
|
||||
if (expectedPciLocation == actualPciLocationInfo)
|
||||
{
|
||||
networkAdapter = adapter;
|
||||
|
||||
foreach (ManagementObject configuration in
|
||||
adapter.GetRelated("Win32_NetworkAdapterConfiguration"))
|
||||
{
|
||||
// print out all the properties name/value for each configuration
|
||||
//foreach (PropertyData pd in configuration.Properties)
|
||||
// Console.WriteLine(pd.Name + ": " + (pd.Value ?? "N/A"));
|
||||
|
||||
networkAdapterConfiguration = configuration;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (networkAdapterConfiguration == null)
|
||||
{
|
||||
throw new Exception("No network adapter found at PCI Location: " + expectedPciLocation);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
successful = false;
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.SetNetworkAdapterForDhcp
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Set network adapter to use DHCP. This is the same thing as setting the adapter
|
||||
/// to obtain IP and DNS automatically
|
||||
/// </summary>
|
||||
/// <param name="networkAdapter">
|
||||
/// This object must be of type Win32_NetworkAdapter
|
||||
/// </param>
|
||||
/// <param name="networkAdapterConfiguration">
|
||||
/// This object must be of type Win32_NetworkAdapterConfiguration
|
||||
/// </param>
|
||||
/// <param name="errMsg">error message returned if error encountered</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool SetNetworkAdapterForDhcp(ManagementObject networkAdapter, ManagementObject networkAdapterConfiguration, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
errMsg = "";
|
||||
|
||||
try
|
||||
{
|
||||
if (networkAdapter == null)
|
||||
{
|
||||
throw new Exception("Object networkAdapter cannot be null");
|
||||
}
|
||||
else if (networkAdapterConfiguration == null)
|
||||
{
|
||||
throw new Exception("Object adapterNetworkConfiguration cannot be null");
|
||||
}
|
||||
|
||||
ManagementBaseObject setDhcp;
|
||||
|
||||
setDhcp = networkAdapterConfiguration.InvokeMethod("EnableDHCP", null, null);
|
||||
|
||||
uint returnedVal = UInt32.Parse(setDhcp["returnValue"].ToString());
|
||||
|
||||
// failed because the adapter is disconnected
|
||||
if (returnedVal == 84)
|
||||
{
|
||||
string adapterGuid = @"SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\" + networkAdapter["GUID"];
|
||||
|
||||
successful = WindowsRegistry.AddOrModifyRegistryKeySingleValue(adapterGuid, RegistryHive.LocalMachine, "EnableDHCP", RegistryValueKind.String, "1", ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
|
||||
// set dns server to be obtained automatically
|
||||
successful = WindowsRegistry.AddOrModifyRegistryKeySingleValue(adapterGuid, RegistryHive.LocalMachine, "NameServer", RegistryValueKind.String, "", ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
|
||||
successful = WindowsRegistry.DeleteRegistryValueName(adapterGuid, RegistryHive.LocalMachine, "DisableDhcpOnConnect", ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
|
||||
successful = WindowsRegistry.DeleteRegistryValueName(adapterGuid, RegistryHive.LocalMachine, "DefaultGateway", ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
|
||||
successful = WindowsRegistry.DeleteRegistryValueName(adapterGuid, RegistryHive.LocalMachine, "DefaultGatewayMetric", ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
|
||||
successful = WindowsRegistry.DeleteRegistryValueName(adapterGuid, RegistryHive.LocalMachine, "IPAddress", ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
|
||||
successful = WindowsRegistry.DeleteRegistryValueName(adapterGuid, RegistryHive.LocalMachine, "SubnetMask", ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
}
|
||||
else if (returnedVal != 0)
|
||||
{
|
||||
throw new Exception("Unable to enable DHCP for this network adapter. Error code: " + setDhcp["returnValue"]);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
successful = false;
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.SetNetworkAdapterIpAddress
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Set network adapter's IP address and subnet mask
|
||||
/// </summary>
|
||||
/// <param name="networkAdapterConfiguration">
|
||||
/// This object must be of type Win32_NetworkAdapterConfiguration
|
||||
/// </param>
|
||||
/// <param name="ipAddress">i.e 192.168.0.1</param>
|
||||
/// <param name="subnetMask">i.e 255.255.255.0</param>
|
||||
/// <param name="errMsg">error message returned if error encountered</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool SetNetworkAdapterIpAddress(ManagementObject networkAdapterConfiguration, string ipAddress, string subnetMask, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
errMsg = "";
|
||||
|
||||
try
|
||||
{
|
||||
if (!StringManip.IsValidIPv4(ipAddress))
|
||||
{
|
||||
throw new Exception(ipAddress + " is an invalid IPv4 Address");
|
||||
}
|
||||
else if (!StringManip.IsValidIPv4(subnetMask))
|
||||
{
|
||||
throw new Exception(subnetMask + " is an invalid IPv4 Address");
|
||||
}
|
||||
|
||||
ManagementBaseObject setIP;
|
||||
ManagementBaseObject newIP =
|
||||
networkAdapterConfiguration.GetMethodParameters("EnableStatic");
|
||||
|
||||
newIP["IPAddress"] = new string[] { ipAddress };
|
||||
newIP["SubnetMask"] = new string[] { subnetMask };
|
||||
|
||||
setIP = networkAdapterConfiguration.InvokeMethod("EnableStatic", newIP, null);
|
||||
|
||||
uint returnedVal = UInt32.Parse(setIP["returnValue"].ToString());
|
||||
|
||||
if (returnedVal != 0)
|
||||
{
|
||||
throw new Exception("Unable to change IP address/subnet mask for this network adapter. Error code: " + setIP["returnValue"]);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
successful = false;
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.SetNetworkAdapterDefaultGateway
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Set default gateway for network adapter
|
||||
/// </summary>
|
||||
/// <param name="networkAdapterConfiguration">
|
||||
/// This object must be of type Win32_NetworkAdapterConfiguration
|
||||
/// </param>
|
||||
/// <param name="defaultGateway">
|
||||
/// IP address for the gateway
|
||||
/// </param>
|
||||
/// <param name="errMsg">error message returned if error encountered</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool SetNetworkAdapterDefaultGateway(ManagementObject networkAdapterConfiguration, string defaultGateway, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
errMsg = "";
|
||||
|
||||
try
|
||||
{
|
||||
if (!StringManip.IsValidIPv4(defaultGateway))
|
||||
{
|
||||
throw new Exception(defaultGateway + " is an invalid IPv4 IP Address");
|
||||
}
|
||||
|
||||
ManagementBaseObject setGateway;
|
||||
ManagementBaseObject newGateway = networkAdapterConfiguration.GetMethodParameters("SetGateways");
|
||||
|
||||
newGateway["DefaultIPGateway"] = new string[] { defaultGateway };
|
||||
newGateway["GatewayCostMetric"] = new int[] { 1 };
|
||||
|
||||
setGateway = networkAdapterConfiguration.InvokeMethod("SetGateways", newGateway, null);
|
||||
|
||||
uint returnedVal = UInt32.Parse(setGateway["returnValue"].ToString());
|
||||
|
||||
if (returnedVal != 0)
|
||||
{
|
||||
throw new Exception("Unable to change default gateway for this network adapter. Error code: " + setGateway["returnValue"]);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
successful = false;
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.SetNetworkAdapterDnsServers
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Set DNS servers for the network adapter
|
||||
/// </summary>
|
||||
/// <param name="networkAdapter">
|
||||
/// This object must be of type Win32_NetworkAdapter
|
||||
/// </param>
|
||||
/// <param name="networkAdapterConfiguration">
|
||||
/// This object must be of type Win32_NetworkAdapterConfiguration
|
||||
/// </param>
|
||||
/// <param name="dnsServers">
|
||||
/// Must provide at least one IP address for DNS server, maximum is 2 IP addresses
|
||||
/// </param>
|
||||
/// <param name="errMsg">error message returned if error encountered</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool SetNetworkAdapterDnsServers(ManagementObject networkAdapter, ManagementObject networkAdapterConfiguration, List<string> dnsServerList, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
errMsg = "";
|
||||
string nameServer = "";
|
||||
|
||||
try
|
||||
{
|
||||
if (networkAdapter == null)
|
||||
{
|
||||
throw new Exception("Object networkAdapter cannot be null");
|
||||
}
|
||||
else if (networkAdapterConfiguration == null)
|
||||
{
|
||||
throw new Exception("Object adapterNetworkConfiguration cannot be null");
|
||||
}
|
||||
else if (dnsServerList.Count == 0 || dnsServerList == null)
|
||||
{
|
||||
throw new Exception("DNS Server information not provided");
|
||||
}
|
||||
|
||||
for (int i = 0; i < dnsServerList.Count; i++)
|
||||
{
|
||||
if (!StringManip.IsValidIPv4(dnsServerList[i].Trim()))
|
||||
{
|
||||
throw new Exception(dnsServerList[i].Trim() + " is an invalid IPv4 IP Address");
|
||||
}
|
||||
|
||||
if (nameServer.Length == 0)
|
||||
nameServer = dnsServerList[i].Trim();
|
||||
else
|
||||
nameServer += "," + dnsServerList[i].Trim(); ;
|
||||
}
|
||||
|
||||
string[] dnsServers = dnsServerList.ToArray();
|
||||
ManagementBaseObject newDNS =
|
||||
networkAdapterConfiguration.GetMethodParameters("SetDNSServerSearchOrder");
|
||||
newDNS["DNSServerSearchOrder"] = dnsServers;
|
||||
ManagementBaseObject setDNS =
|
||||
networkAdapterConfiguration.InvokeMethod("SetDNSServerSearchOrder", newDNS, null);
|
||||
|
||||
uint returnedVal = UInt32.Parse(setDNS["returnValue"].ToString());
|
||||
|
||||
// failed because the adapter is disconnected
|
||||
if (returnedVal == 84)
|
||||
{
|
||||
string adapterGuid = @"SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\" + networkAdapter["GUID"];
|
||||
|
||||
successful = WindowsRegistry.AddOrModifyRegistryKeySingleValue(adapterGuid, RegistryHive.LocalMachine, "NameServer", RegistryValueKind.String, nameServer, ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
}
|
||||
else if (returnedVal != 0)
|
||||
{
|
||||
throw new Exception("Unable to change default gateway for this network adapter. Error code: " + setDNS["returnValue"]);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
successful = false;
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.ChangeNetworkAdapterName
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Change the name of the network adapter
|
||||
/// </summary>
|
||||
/// <param name="networkAdapter">
|
||||
/// This object must be of type Win32_NetworkAdapter
|
||||
/// </param>
|
||||
/// <param name="networkAdapterConfiguration">
|
||||
/// This object must be of type Win32_NetworkAdapterConfiguration
|
||||
/// </param>
|
||||
/// <param name="adapterName">
|
||||
/// Name to give the network adapter
|
||||
/// </param>
|
||||
/// <param name="errMsg">error message returned if error encountered</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool ChangeNetworkAdapterName(ManagementObject networkAdapter, ManagementObject networkAdapterConfiguration, string adapterName, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
errMsg = "";
|
||||
string uniqueID = "";
|
||||
|
||||
try
|
||||
{
|
||||
if (networkAdapter == null)
|
||||
{
|
||||
throw new Exception("Object networkAdapter cannot be null");
|
||||
}
|
||||
else if (networkAdapterConfiguration == null)
|
||||
{
|
||||
throw new Exception("Object adapterNetworkConfiguration cannot be null");
|
||||
}
|
||||
else if (adapterName.Length == 0)
|
||||
{
|
||||
throw new Exception("adapterName cannot be empty");
|
||||
}
|
||||
|
||||
string adapterGuid = @"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\" + networkAdapter["GUID"] + @"\Connection";
|
||||
|
||||
uniqueID = Guid.NewGuid().ToString();
|
||||
successful = WindowsRegistry.AddOrModifyRegistryKeySingleValue(adapterGuid, RegistryHive.LocalMachine, "Name", RegistryValueKind.String, uniqueID, ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
|
||||
ProcessStarter proc = new ProcessStarter();
|
||||
proc.fileName = @"C:\Windows\System32\netsh.exe";
|
||||
proc.procArguments = "interface set interface name=\"" + uniqueID + "\" newname=\"" + adapterName + "\"";
|
||||
proc.Run();
|
||||
|
||||
if (proc.procExitCode != 0)
|
||||
{
|
||||
throw new Exception("Process netsh.exe returned the following error\n" + proc.outputMsg);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
successful = false;
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.SetNetworkAdapterLinkSpeed
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Set network adapter to use DHCP. This is the same thing as setting the adapter
|
||||
/// to obtain IP and DNS automatically
|
||||
/// </summary>
|
||||
/// <param name="networkAdapter">
|
||||
/// This object must be of type Win32_NetworkAdapter
|
||||
/// </param>
|
||||
/// <param name="networkAdapterConfiguration">
|
||||
/// This object must be of type Win32_NetworkAdapterConfiguration
|
||||
/// </param>
|
||||
/// <param name="linkSpeedValue">
|
||||
/// Value of the link speed
|
||||
/// </param>
|
||||
/// <param name="errMsg">error message returned if error encountered</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool SetNetworkAdapterLinkSpeed(ManagementObject networkAdapter, ManagementObject networkAdapterConfiguration, string linkSpeedValue, ref string errMsg)
|
||||
{
|
||||
bool successful = false;
|
||||
errMsg = "";
|
||||
|
||||
try
|
||||
{
|
||||
uint linkSpeed = 0;
|
||||
|
||||
if (networkAdapter == null)
|
||||
{
|
||||
throw new Exception("Object networkAdapter cannot be null");
|
||||
}
|
||||
else if (networkAdapterConfiguration == null)
|
||||
{
|
||||
throw new Exception("Object adapterNetworkConfiguration cannot be null");
|
||||
}
|
||||
else if (linkSpeedValue.Length == 0)
|
||||
{
|
||||
throw new Exception("linkSpeedValue cannot be empty");
|
||||
}
|
||||
else if (!UInt32.TryParse(linkSpeedValue, out linkSpeed))
|
||||
{
|
||||
throw new Exception("linkSpeedValue must be a number");
|
||||
}
|
||||
|
||||
var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
|
||||
|
||||
RegistryKey regSubKey = null;
|
||||
|
||||
string registryPath = @"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}";
|
||||
|
||||
regSubKey = hklm.OpenSubKey(registryPath, false);
|
||||
|
||||
// get a list of folder names under the registry path above
|
||||
List<string> keyNameList = new List<string>(regSubKey.GetSubKeyNames());
|
||||
|
||||
regSubKey.Close();
|
||||
|
||||
// loop through each key name to find the entry for the adapter we are interested in
|
||||
foreach (string keyName in keyNameList)
|
||||
{
|
||||
string vendorRegistryPath = registryPath + @"\" + keyName;
|
||||
|
||||
string adapterGuid = WindowsRegistry.GetRegistryValueInString(vendorRegistryPath, RegistryHive.LocalMachine, "NetCfgInstanceId");
|
||||
|
||||
// if this is the adapter we are interested in
|
||||
if (String.Equals(adapterGuid, networkAdapter["GUID"].ToString(), StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
successful = WindowsRegistry.AddOrModifyRegistryKeySingleValue(vendorRegistryPath, RegistryHive.LocalMachine, "*SpeedDuplex", RegistryValueKind.String, linkSpeedValue, ref errMsg);
|
||||
|
||||
if (!successful)
|
||||
throw new Exception(errMsg);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!successful && errMsg.Length == 0)
|
||||
throw new Exception("Unable to find a registry entry for this network adapter under " + registryPath);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
successful = false;
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
}
|
||||
}
|
||||
363
CommonLib/Library/Windows/Misc/NetworkSharing.cs
Normal file
363
CommonLib/Library/Windows/Misc/NetworkSharing.cs
Normal file
@@ -0,0 +1,363 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Management;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.IO;
|
||||
using Microsoft.Win32;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Security.Principal;
|
||||
using System.Security.AccessControl;
|
||||
|
||||
using CommonLib.IO;
|
||||
|
||||
namespace CommonLib.Windows.Misc
|
||||
{
|
||||
public class NetworkSharing
|
||||
{
|
||||
public static Dictionary<string, WellKnownSidType> userDefinedAccountNameToWellKnowSid = new Dictionary<string, WellKnownSidType>(StringComparer.OrdinalIgnoreCase) {
|
||||
{ "Everyone" , WellKnownSidType.WorldSid },
|
||||
{ "Authenticated Users" , WellKnownSidType.AuthenticatedUserSid }
|
||||
};
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.EnableNetworkFolderSharing
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Enable network sharing of a local folder
|
||||
/// </summary>
|
||||
/// <param name="folderPath">Local path of folder to be shared</param>
|
||||
/// <param name="shareName">name of the network share</param>
|
||||
/// <param name="description">Description of the share</param>
|
||||
/// <param name="errMsg">error message returned if error encountered</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool EnableNetworkFolderSharing(string folderPath, string shareName, string description, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
errMsg = "";
|
||||
|
||||
if (!Regex.IsMatch(folderPath, @"[a-zA-Z]:.*", RegexOptions.IgnoreCase))
|
||||
{
|
||||
errMsg = "Unable to share path " + folderPath + ". Path is invalid";
|
||||
|
||||
successful = false;
|
||||
}
|
||||
|
||||
if (successful)
|
||||
{
|
||||
// if the path contains at least one folder in it
|
||||
if (Regex.IsMatch(folderPath, @"[a-zA-Z]:\\[^\\]+", RegexOptions.IgnoreCase))
|
||||
folderPath = PathManip.RemoveTrailingSlashInPath(folderPath);
|
||||
else
|
||||
folderPath = PathManip.AddTrailingSlashToPath(folderPath);
|
||||
|
||||
if (!Directory.Exists(folderPath))
|
||||
{
|
||||
errMsg = folderPath + "\" does not exist";
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (successful)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create a ManagementClass object
|
||||
ManagementClass managementClass = new ManagementClass("Win32_Share");
|
||||
|
||||
// Create ManagementBaseObjects for in and out parameters
|
||||
ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
|
||||
ManagementBaseObject outParams;
|
||||
|
||||
// Set the input parameters
|
||||
inParams["Description"] = description;
|
||||
inParams["Name"] = shareName;
|
||||
inParams["Path"] = folderPath;
|
||||
inParams["Type"] = 0x0; // Disk Drive
|
||||
//Another Type:
|
||||
// DISK_DRIVE = 0x0
|
||||
// PRINT_QUEUE = 0x1
|
||||
// DEVICE = 0x2
|
||||
// IPC = 0x3
|
||||
// DISK_DRIVE_ADMIN = 0x80000000
|
||||
// PRINT_QUEUE_ADMIN = 0x80000001
|
||||
// DEVICE_ADMIN = 0x80000002
|
||||
// IPC_ADMIN = 0x8000003
|
||||
inParams["MaximumAllowed"] = null;
|
||||
inParams["Password"] = null;
|
||||
inParams["Access"] = null; // Make Everyone has full control access.
|
||||
//inParams["MaximumAllowed"] = int maxConnectionsNum;
|
||||
|
||||
// Invoke the method on the ManagementClass object
|
||||
outParams = managementClass.InvokeMethod("Create", inParams, null);
|
||||
// Check to see if the method invocation was successful
|
||||
if ((uint)(outParams.Properties["ReturnValue"].Value) != 0 && (uint)(outParams.Properties["ReturnValue"].Value) != 22)
|
||||
{
|
||||
errMsg = "Error encountered when calling managementClass.InvokeMethod(\"Create\"). Error code: " + outParams.Properties["ReturnValue"].Value.ToString();
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.addAccountToNetworkShare
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// To add windows account to the permission list of the network
|
||||
/// share
|
||||
/// </summary>
|
||||
/// <param name="folderPath">Local path of folder to be shared</param>
|
||||
/// <param name="shareName">name of the network share</param>
|
||||
/// <param name="account">user account. Should be in in the form:
|
||||
/// DOMAIN\AccountName
|
||||
/// </param>
|
||||
/// <param name="description">Description of the share</param>
|
||||
/// <param name="errMsg">error message returned if error encountered</param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool addAccountToNetworkShare(string folderPath, string shareName, string account, string description, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
Match regExMatch;
|
||||
string domain = "", accountName = "";
|
||||
|
||||
if (!Regex.IsMatch(folderPath, @"[a-zA-Z]:.*", RegexOptions.IgnoreCase))
|
||||
{
|
||||
errMsg = "Unable to modify user permission for " + folderPath + ". Path is invalid";
|
||||
|
||||
successful = false;
|
||||
}
|
||||
|
||||
if (successful)
|
||||
{
|
||||
// if the path contains at least one folder in it
|
||||
if (Regex.IsMatch(folderPath, @"[a-zA-Z]:\\[^\\]+", RegexOptions.IgnoreCase))
|
||||
folderPath = PathManip.RemoveTrailingSlashInPath(folderPath);
|
||||
else
|
||||
folderPath = PathManip.AddTrailingSlashToPath(folderPath);
|
||||
|
||||
if (!Directory.Exists(folderPath))
|
||||
{
|
||||
errMsg = folderPath + "\" does not exist";
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (successful)
|
||||
{
|
||||
regExMatch = Regex.Match(account, @"(\\\\)?([^\\]+)\\([^\\]+)", RegexOptions.IgnoreCase);
|
||||
|
||||
if (regExMatch.Success)
|
||||
{
|
||||
domain = regExMatch.Groups[2].Value;
|
||||
accountName = regExMatch.Groups[3].Value;
|
||||
}
|
||||
else if (!isValidWellKnownSid(account))
|
||||
{
|
||||
errMsg = "Account \"" + account + "\" is invalid";
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (successful)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create a ManagementClass object
|
||||
ManagementClass managementClass = new ManagementClass("Win32_Share");
|
||||
|
||||
// Create ManagementBaseObjects for in and out parameters
|
||||
ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
|
||||
ManagementBaseObject outParams;
|
||||
|
||||
// Set the input parameters
|
||||
inParams["Description"] = description;
|
||||
inParams["Name"] = shareName;
|
||||
inParams["Path"] = folderPath;
|
||||
inParams["Type"] = 0x0; // Disk Drive
|
||||
//Another Type:
|
||||
// DISK_DRIVE = 0x0
|
||||
// PRINT_QUEUE = 0x1
|
||||
// DEVICE = 0x2
|
||||
// IPC = 0x3
|
||||
// DISK_DRIVE_ADMIN = 0x80000000
|
||||
// PRINT_QUEUE_ADMIN = 0x80000001
|
||||
// DEVICE_ADMIN = 0x80000002
|
||||
// IPC_ADMIN = 0x8000003
|
||||
inParams["MaximumAllowed"] = null;
|
||||
inParams["Password"] = null;
|
||||
inParams["Access"] = null; // Make Everyone has full control access.
|
||||
//inParams["MaximumAllowed"] = int maxConnectionsNum;
|
||||
|
||||
// Invoke the method on the ManagementClass object
|
||||
outParams = managementClass.InvokeMethod("Create", inParams, null);
|
||||
// Check to see if the method invocation was successful
|
||||
if ((uint)(outParams.Properties["ReturnValue"].Value) != 0 && (uint)(outParams.Properties["ReturnValue"].Value) != 22)
|
||||
{
|
||||
errMsg = "Error encountered when calling managementClass.InvokeMethod(\"Create\"). Error code: " + outParams.Properties["ReturnValue"].Value.ToString();
|
||||
successful = false;
|
||||
}
|
||||
|
||||
if (successful)
|
||||
{
|
||||
SecurityIdentifier userSID = null;
|
||||
if (isValidWellKnownSid(account))
|
||||
{
|
||||
// get built-in security principals ( Everyone, Authenticated Users, Guests, Administrators, etc)
|
||||
userSID = new SecurityIdentifier(GetWellKnownSid(account), null);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//user selection
|
||||
NTAccount ntAccount = new NTAccount(domain, accountName);
|
||||
//SID
|
||||
userSID = (SecurityIdentifier)ntAccount.Translate(typeof(SecurityIdentifier));
|
||||
}
|
||||
byte[] utenteSIDArray = new byte[userSID.BinaryLength];
|
||||
userSID.GetBinaryForm(utenteSIDArray, 0);
|
||||
|
||||
//Trustee
|
||||
ManagementObject userTrustee = new ManagementClass(new ManagementPath("Win32_Trustee"), null);
|
||||
if (domain.Length > 0)
|
||||
{
|
||||
userTrustee["Domain"] = domain;
|
||||
userTrustee["Name"] = accountName;
|
||||
}
|
||||
userTrustee["SID"] = utenteSIDArray;
|
||||
|
||||
//ACE
|
||||
ManagementObject userACE = new ManagementClass(new ManagementPath("Win32_Ace"), null);
|
||||
userACE["AccessMask"] = 2032127; //Full access
|
||||
userACE["AceFlags"] = AceFlags.ObjectInherit | AceFlags.ContainerInherit;
|
||||
userACE["AceType"] = AceType.AccessAllowed;
|
||||
userACE["Trustee"] = userTrustee;
|
||||
|
||||
string rootPath = Regex.Replace(managementClass.Path.ToString(), @"([^:]+:).+", "${1}", RegexOptions.IgnoreCase);
|
||||
//After we have the new Win_32Ace, now we need to get the existing Ace instances (DACL).
|
||||
//Create an instance of Win32_LogicalSecuritySetting, set the path to the server and the share.
|
||||
ManagementObject Win32LogicalSecuritySetting = new ManagementObject(rootPath + "Win32_LogicalShareSecuritySetting.Name='" + shareName + "'");
|
||||
|
||||
//Call the GetSecurityDescriptor method. This method returns one out parameter.
|
||||
ManagementBaseObject Return = Win32LogicalSecuritySetting.InvokeMethod("GetSecurityDescriptor", null, null);
|
||||
|
||||
//The return value of that call above has two properties, ReturnValue, which you can use
|
||||
//to read the status of the call (failed, success, etc.), and Descriptor, which is an instance
|
||||
//of Win32_SecurityDescriptor.
|
||||
Int32 returnValue = Convert.ToInt32(Return.Properties["ReturnValue"].Value);
|
||||
|
||||
if (returnValue != 0)
|
||||
throw new Exception(String.Format("Error when calling GetSecurityDescriptor. Error code: {0}.", returnValue));
|
||||
|
||||
//Retrieve the array of DACL from the Security Descriptor.
|
||||
|
||||
ManagementBaseObject securityDescriptor = Return.Properties["Descriptor"].Value as ManagementBaseObject;
|
||||
|
||||
ManagementBaseObject[] DACL = securityDescriptor["DACL"] as ManagementBaseObject[];
|
||||
|
||||
|
||||
if (DACL == null)
|
||||
DACL = new ManagementBaseObject[] { userACE };
|
||||
else
|
||||
{
|
||||
Array.Resize(ref DACL, DACL.Length + 1);
|
||||
|
||||
DACL[DACL.Length - 1] = userACE;
|
||||
}
|
||||
|
||||
//Reassign the new DACL array with the new user Ace back to the Win32_SecurityDescriptor instance, and call the
|
||||
//SetSecurityDescriptor method.
|
||||
securityDescriptor["DACL"] = DACL;
|
||||
|
||||
ManagementObject share = new ManagementObject(managementClass.Path + ".Name='" + shareName + "'");
|
||||
|
||||
returnValue = Convert.ToInt32(share.InvokeMethod("SetShareInfo", new object[] { Int32.MaxValue, description, securityDescriptor }));
|
||||
|
||||
if (returnValue != 0)
|
||||
throw new Exception(String.Format("Error when calling GetSecurityDescriptor. Error code: {0}.", returnValue));
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.isValidWellKnownSid
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Verify if the windows account name user provided is valid
|
||||
/// </summary>
|
||||
/// <param name="userDefinedSidAccountName">Windows account name
|
||||
/// could be Users, Groups or Built-In Security Principals (i.e.:
|
||||
/// Everyone, Authenticated Users, Guests, etc)
|
||||
/// </param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool isValidWellKnownSid(string userDefinedSidAccountName)
|
||||
{
|
||||
bool isValid = true;
|
||||
|
||||
if (!userDefinedAccountNameToWellKnowSid.ContainsKey(userDefinedSidAccountName))
|
||||
isValid = false;
|
||||
|
||||
return isValid;
|
||||
}
|
||||
|
||||
//////==========================================================================
|
||||
/// NetworkSharing.GetWellKnownSid
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Return the actual Well Known Sid type that matches the windows account
|
||||
/// name provided by user
|
||||
/// </summary>
|
||||
/// <param name="userDefinedSidAccountName">Windows account name
|
||||
/// could be Users, Groups or Built-In Security Principals (i.e.:
|
||||
/// Everyone, Authenticated Users, Guests, etc)
|
||||
/// </param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- -----------------------------
|
||||
/// 12/07/16 D.Le
|
||||
///==========================================================================
|
||||
public static WellKnownSidType GetWellKnownSid(string userDefinedSidAccountName)
|
||||
{
|
||||
if (isValidWellKnownSid(userDefinedSidAccountName))
|
||||
return userDefinedAccountNameToWellKnowSid[userDefinedSidAccountName];
|
||||
else
|
||||
throw new Exception(userDefinedSidAccountName + " is invalid.");
|
||||
}
|
||||
}
|
||||
}
|
||||
66
CommonLib/Library/Windows/Misc/WindowShortcut.cs
Normal file
66
CommonLib/Library/Windows/Misc/WindowShortcut.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CommonLib.Windows.Misc
|
||||
{
|
||||
public class WindowShortcut
|
||||
{
|
||||
private static Type m_type = Type.GetTypeFromProgID("WScript.Shell");
|
||||
private static object m_shell = Activator.CreateInstance(m_type);
|
||||
|
||||
[ComImport, TypeLibType((short)0x1040), Guid("F935DC23-1CF0-11D0-ADB9-00C04FD58A0B")]
|
||||
private interface IWshShortcut
|
||||
{
|
||||
[DispId(0)]
|
||||
string FullName { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0)] get; }
|
||||
[DispId(0x3e8)]
|
||||
string Arguments { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3e8)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3e8)] set; }
|
||||
[DispId(0x3e9)]
|
||||
string Description { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3e9)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3e9)] set; }
|
||||
[DispId(0x3ea)]
|
||||
string Hotkey { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3ea)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ea)] set; }
|
||||
[DispId(0x3eb)]
|
||||
string IconLocation { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3eb)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3eb)] set; }
|
||||
[DispId(0x3ec)]
|
||||
string RelativePath { [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ec)] set; }
|
||||
[DispId(0x3ed)]
|
||||
string TargetPath { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3ed)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ed)] set; }
|
||||
[DispId(0x3ee)]
|
||||
int WindowStyle { [DispId(0x3ee)] get; [param: In] [DispId(0x3ee)] set; }
|
||||
[DispId(0x3ef)]
|
||||
string WorkingDirectory { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3ef)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ef)] set; }
|
||||
[TypeLibFunc((short)0x40), DispId(0x7d0)]
|
||||
void Load([In, MarshalAs(UnmanagedType.BStr)] string PathLink);
|
||||
[DispId(0x7d1)]
|
||||
void Save();
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// Create
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Create window short cut
|
||||
/// </summary>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static void Create(string fileName, string targetPath, string arguments, string workingDirectory, string description, string hotkey, string iconPath)
|
||||
{
|
||||
IWshShortcut shortcut = (IWshShortcut)m_type.InvokeMember("CreateShortcut", System.Reflection.BindingFlags.InvokeMethod, null, m_shell, new object[] { fileName });
|
||||
shortcut.Description = description;
|
||||
shortcut.Hotkey = hotkey;
|
||||
shortcut.TargetPath = targetPath;
|
||||
shortcut.WorkingDirectory = workingDirectory;
|
||||
shortcut.Arguments = arguments;
|
||||
if (!string.IsNullOrEmpty(iconPath))
|
||||
shortcut.IconLocation = iconPath;
|
||||
shortcut.Save();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
407
CommonLib/Library/Windows/Misc/WindowsAdministration.cs
Normal file
407
CommonLib/Library/Windows/Misc/WindowsAdministration.cs
Normal file
@@ -0,0 +1,407 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.IO;
|
||||
using System.Security.AccessControl;
|
||||
using System.Management;
|
||||
using System.Security.Principal;
|
||||
using System.Runtime.InteropServices;
|
||||
using Microsoft.Win32;
|
||||
using System.Drawing;
|
||||
using System.DirectoryServices;
|
||||
using System.DirectoryServices.AccountManagement;
|
||||
|
||||
namespace CommonLib.Windows.Misc
|
||||
{
|
||||
public class WindowsAdministration
|
||||
{
|
||||
///==========================================================================
|
||||
/// GetWindowLoginID
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// To get windows login ID, usually it's a simple API call. The problem
|
||||
/// is when trying to get the windows login ID from a application that is
|
||||
/// run as an Administrator. In this case, the simple API call will return
|
||||
/// the Administrator user's ID. This function gets the actual Windows Logon
|
||||
/// ID regardless what the application is run as.
|
||||
/// </summary>
|
||||
/// <param>none</param>
|
||||
/// <return>string</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetWindowLoginID()
|
||||
{
|
||||
string login = "";
|
||||
|
||||
string[] properties = { "*" };
|
||||
SelectQuery s = new SelectQuery("Win32_Process", "Name = 'explorer.exe' ", properties);
|
||||
ManagementObjectSearcher searcher = new ManagementObjectSearcher(s);
|
||||
foreach (ManagementObject o in searcher.Get())
|
||||
{
|
||||
string[] ownerInfo = { "", "" };
|
||||
o.InvokeMethod("GetOwner", ownerInfo);
|
||||
|
||||
login = ownerInfo[1] + "\\" + ownerInfo[0];
|
||||
}
|
||||
|
||||
return login;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// GetDomainName
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the domain name in which the user is logged into. If the computer is
|
||||
/// not a member of a domain, then the domain name will be the name of the
|
||||
/// local computer
|
||||
/// </summary>
|
||||
/// <param>none</param>
|
||||
/// <return>string</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetDomainName()
|
||||
{
|
||||
string fullLoginID = GetWindowLoginID();
|
||||
|
||||
return Regex.Replace(fullLoginID, @"^([^\\]+)\\.+", "$1");
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// GetUserName
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the user name in which the user is logged into.
|
||||
/// </summary>
|
||||
/// <param>none</param>
|
||||
/// <return>string</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static string GetUserName()
|
||||
{
|
||||
string fullLoginID = GetWindowLoginID();
|
||||
|
||||
return Regex.Replace(fullLoginID, @"^[^\\]+\\(.+)", "$1");
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// IsAccountAnAdminAccount
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the domain name in which the user is logged into. If the computer is
|
||||
/// not a member of a domain, then the domain name will be the name of the
|
||||
/// local computer
|
||||
/// </summary>
|
||||
/// <param name="fullAccountName">Format: [domain]\username, i.e. US\1117637</param>
|
||||
/// <return>string</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool IsAccountAnAdminAccount(string fullAccountName)
|
||||
{
|
||||
bool accountIsAnAdmin = false;
|
||||
List<string> adminAccounts = GetListOfMemberAccountsFromLocalGroups("Administrators");
|
||||
|
||||
foreach (string account in adminAccounts)
|
||||
{
|
||||
string tempAccount = Regex.Replace(account, @"/", "\\");
|
||||
|
||||
if (Regex.IsMatch(tempAccount, Regex.Escape(fullAccountName) + @"$", RegexOptions.IgnoreCase))
|
||||
{
|
||||
accountIsAnAdmin = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return accountIsAnAdmin;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// IsApplicationRunAsAdmin
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Check if the application is run with elevated privilege, aka admin
|
||||
/// </summary>
|
||||
/// <param name=""></param>
|
||||
/// <return>string</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static bool IsApplicationRunAsAdmin()
|
||||
{
|
||||
WindowsIdentity identity = WindowsIdentity.GetCurrent();
|
||||
WindowsPrincipal principal = new WindowsPrincipal(identity);
|
||||
return principal.IsInRole(WindowsBuiltInRole.Administrator);
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// GetListOfMemberAccountsFromLocalGroups
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get a list of member accounts from a local group
|
||||
/// </summary>
|
||||
/// <param name="groupName">Administrators, Guests, Users, etc</param>
|
||||
/// <return>string</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 06/06/12 D.Le
|
||||
///==========================================================================
|
||||
public static List<string> GetListOfMemberAccountsFromLocalGroups(string groupName)
|
||||
{
|
||||
List<string> myItems = new List<string>();
|
||||
|
||||
using (DirectoryEntry machine = new DirectoryEntry("WinNT://" + Environment.MachineName))
|
||||
{
|
||||
//get local admin group
|
||||
using (DirectoryEntry group = machine.Children.Find(groupName, "Group"))
|
||||
{
|
||||
//get all members of local admin group
|
||||
object members = group.Invoke("Members", null);
|
||||
foreach (object member in (IEnumerable)members)
|
||||
{
|
||||
//get account name
|
||||
myItems.Add(new DirectoryEntry(member).Path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return myItems;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// IsUserInGroup
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Check if a particular user account is in local group
|
||||
/// </summary>
|
||||
/// <param name="fullQualifiedUsername">i.e.: US\1117637, ZTUAI362318\COEUser</param>
|
||||
/// <param name="groupName">Administrators, etc</param>
|
||||
/// <param name="errMsg"></param>
|
||||
/// <return>true/false</return>
|
||||
///==========================================================================
|
||||
public static bool IsUserInGroup(string fullQualifiedUsername, string groupName, ref string errMsg)
|
||||
{
|
||||
bool isInGroup = false;
|
||||
errMsg = "";
|
||||
|
||||
try
|
||||
{
|
||||
List<string> membersOfLocalAdminGroup = WindowsAdministration.GetListOfMemberAccountsFromLocalGroups(groupName);
|
||||
|
||||
fullQualifiedUsername = Regex.Replace(fullQualifiedUsername, @"\\", "/");
|
||||
|
||||
if (membersOfLocalAdminGroup.Any(member => Regex.IsMatch(member.ToString(), Regex.Escape(fullQualifiedUsername), RegexOptions.IgnoreCase)))
|
||||
{
|
||||
isInGroup = true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
}
|
||||
|
||||
return isInGroup;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// AddUserToGroup
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Add an existing user account to a group
|
||||
/// </summary>
|
||||
/// <param name="userName">i.e.: 1117637</param>
|
||||
/// <param name="userPassword"></param>
|
||||
/// <param name="domain">US, etc</param>
|
||||
/// <param name="groupName">Administrators, etc</param>
|
||||
/// <param name="errMsg"></param>
|
||||
/// <return>None</return>
|
||||
///==========================================================================
|
||||
public static void AddUserToGroup(string userName, string userPassword, string domain, string groupName, ref string errMsg)
|
||||
{
|
||||
bool impersonatingLoggedInUser = false;
|
||||
PrincipalContext context = null;
|
||||
GroupPrincipal group = null;
|
||||
errMsg = "";
|
||||
string appRunner = Environment.UserDomainName + "\\" + Environment.UserName;
|
||||
|
||||
try
|
||||
{
|
||||
context = new PrincipalContext(ContextType.Machine);
|
||||
|
||||
if (context != null)
|
||||
group = GroupPrincipal.FindByIdentity(context, "Administrators");
|
||||
|
||||
if (group != null)
|
||||
{
|
||||
if (!String.IsNullOrEmpty(domain) && !String.Equals(domain, Environment.MachineName, StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
if (!String.Equals(appRunner, GetWindowLoginID(), StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
context = new PrincipalContext(ContextType.Domain, domain, userName, userPassword);
|
||||
}
|
||||
else
|
||||
context = new PrincipalContext(ContextType.Domain, domain);
|
||||
}
|
||||
|
||||
if (context != null)
|
||||
{
|
||||
if (!String.Equals(appRunner, GetWindowLoginID(), StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
if (!Impersonate(userName, userPassword, domain))
|
||||
errMsg = "Impersonation failed. Username or password is incorrect for: " + domain + "\\" + userName;
|
||||
else
|
||||
impersonatingLoggedInUser = true;
|
||||
}
|
||||
|
||||
group.Members.Add(context, IdentityType.SamAccountName, userName);
|
||||
|
||||
if (impersonatingLoggedInUser)
|
||||
UnImpersonate();
|
||||
|
||||
group.Save();
|
||||
|
||||
group.Dispose();
|
||||
|
||||
context.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
};
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// removeUserFromGroup
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Remove user from a group
|
||||
/// </summary>
|
||||
/// <param name="windowsLoginId">full qualified windows login id, i.e. DOMAIN\User</param>
|
||||
/// <param name="groupName">name of the group, i.e. Administrators</param>
|
||||
/// <param name="errMsg">error message</param>
|
||||
/// <returns></returns>
|
||||
///==========================================================================
|
||||
public static void removeUserFromGroup(string windowsLoginId, string groupName, ref string errMsg)
|
||||
{
|
||||
string loginId = windowsLoginId;
|
||||
loginId = Regex.Replace(loginId, @"\\", "/", RegexOptions.IgnoreCase);
|
||||
|
||||
try
|
||||
{
|
||||
using (DirectoryEntry machine = new DirectoryEntry("WinNT://" + Environment.MachineName))
|
||||
{
|
||||
//get local admin group
|
||||
using (DirectoryEntry group = machine.Children.Find(groupName, "Group"))
|
||||
{
|
||||
//get all members of local admin group
|
||||
object members = group.Invoke("Members", null);
|
||||
foreach (object member in (IEnumerable)members)
|
||||
{
|
||||
using (var memberEntry = new DirectoryEntry(member))
|
||||
{
|
||||
if (!Regex.IsMatch(memberEntry.Path, @".+/" + Environment.MachineName + "/[^/]+$") && Regex.IsMatch(memberEntry.Path, loginId, RegexOptions.IgnoreCase))
|
||||
{
|
||||
group.Invoke("Remove", new[] { memberEntry.Path });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = ex.Message;
|
||||
}
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// Impersonate
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Impersonate given logon information. Only can impersonate a regular
|
||||
/// user. Cannot impersonate administrator if the UAC is set to Elevated
|
||||
/// </summary>
|
||||
/// <param name="logon">Windows logon name.</param>
|
||||
/// <param name="password">password</param>
|
||||
/// <param name="domain">domain name</param>
|
||||
/// <returns></returns>
|
||||
///==========================================================================
|
||||
public static bool Impersonate(string logon, string password, string
|
||||
domain)
|
||||
{
|
||||
WindowsIdentity tempWindowsIdentity;
|
||||
IntPtr token = IntPtr.Zero;
|
||||
IntPtr tokenDuplicate = IntPtr.Zero;
|
||||
|
||||
if (LogonUser(logon, domain, password, LOGON32_LOGON_INTERACTIVE,
|
||||
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
|
||||
{
|
||||
|
||||
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
|
||||
{
|
||||
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
|
||||
impersonationContext = tempWindowsIdentity.Impersonate();
|
||||
if (null != impersonationContext) return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// UnImpersonate
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Return to the original user account that starts up the program
|
||||
/// </summary>
|
||||
/// <param></param>
|
||||
/// <returns></returns>
|
||||
///==========================================================================
|
||||
public static void UnImpersonate()
|
||||
{
|
||||
impersonationContext.Undo();
|
||||
}
|
||||
|
||||
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
|
||||
public static extern int LogonUser(
|
||||
string lpszUserName,
|
||||
String lpszDomain,
|
||||
String lpszPassword,
|
||||
int dwLogonType,
|
||||
int dwLogonProvider,
|
||||
ref IntPtr phToken);
|
||||
|
||||
[DllImport("advapi32.dll",
|
||||
CharSet = System.Runtime.InteropServices.CharSet.Auto,
|
||||
SetLastError = true)]
|
||||
public extern static int DuplicateToken(
|
||||
IntPtr hToken,
|
||||
int impersonationLevel,
|
||||
ref IntPtr hNewToken);
|
||||
|
||||
private const int LOGON32_LOGON_INTERACTIVE = 2;
|
||||
private const int LOGON32_LOGON_NETWORK_CLEARTEXT = 4;
|
||||
private const int LOGON32_PROVIDER_DEFAULT = 0;
|
||||
private static WindowsImpersonationContext impersonationContext;
|
||||
}
|
||||
}
|
||||
467
CommonLib/Library/Windows/Misc/WindowsRegistry.cs
Normal file
467
CommonLib/Library/Windows/Misc/WindowsRegistry.cs
Normal file
@@ -0,0 +1,467 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace CommonLib.Windows.Misc
|
||||
{
|
||||
public class WindowsRegistry
|
||||
{
|
||||
public enum valueKind { STRING, MULTI_STRING, DWORD, QWORD };
|
||||
|
||||
///==========================================================================
|
||||
/// GetRegistryValueInString
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the value of a particular value name of a particular registry key
|
||||
/// A registry value can be of many types, we have to convert them differently
|
||||
/// into string
|
||||
/// </summary>
|
||||
/// <param name="registryPath">Registry folder path</param>
|
||||
/// <param name="registryType">Local Machine, Classes Root, Current User</param>
|
||||
/// <param name="valueName">the registry name that has a value associated with it</param>
|
||||
/// <return>a string representing the value of the registry name</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 12/04/16 D.Le
|
||||
///==========================================================================
|
||||
public static string GetRegistryValueInString(string registryPath, RegistryHive registryType, string valueName)
|
||||
{
|
||||
string value = "";
|
||||
|
||||
var hklm = RegistryKey.OpenBaseKey(registryType, RegistryView.Registry64);
|
||||
|
||||
RegistryKey regSubKey = null;
|
||||
|
||||
regSubKey = hklm.OpenSubKey(registryPath, false);
|
||||
|
||||
registryPath = registryPath.Trim();
|
||||
|
||||
if (registryPath.Length > 0 && regSubKey != null && valueName.Length > 0)
|
||||
{
|
||||
List<string> list = new List<string>(regSubKey.GetValueNames());
|
||||
|
||||
if (list.FindIndex(x => x.Equals(valueName, StringComparison.OrdinalIgnoreCase)) != -1)
|
||||
{
|
||||
object obj = regSubKey.GetValue(valueName);
|
||||
|
||||
switch (regSubKey.GetValueKind(valueName))
|
||||
{
|
||||
case RegistryValueKind.String:
|
||||
case RegistryValueKind.ExpandString:
|
||||
value = (string)obj;
|
||||
break;
|
||||
case RegistryValueKind.Binary:
|
||||
foreach (byte b in (byte[])obj)
|
||||
{
|
||||
if (value.Length == 0)
|
||||
value = b.ToString("x2");
|
||||
else
|
||||
value += " " + b.ToString("x2");
|
||||
}
|
||||
Console.WriteLine();
|
||||
|
||||
break;
|
||||
case RegistryValueKind.DWord:
|
||||
value = Convert.ToString((Int32)obj);
|
||||
break;
|
||||
case RegistryValueKind.QWord:
|
||||
value = Convert.ToString((Int64)obj);
|
||||
break;
|
||||
case RegistryValueKind.MultiString:
|
||||
foreach (string s in (string[])obj)
|
||||
{
|
||||
if (value.Length == 0)
|
||||
value = s;
|
||||
else
|
||||
value = "\n" + s;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// AddOrModifyRegistryKeySingleValue
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Add a value name/pair if the value name doesn't already exist for a particular
|
||||
/// registry key. Otherwise, we modify the value of the value name.
|
||||
/// </summary>
|
||||
/// <param name="registryPath">Registry folder path</param>
|
||||
/// <param name="registryType">Local Machine, Classes Root, Current User</param>
|
||||
/// <param name="valueName">the registry name that has a value associated with it</param>
|
||||
/// <param name="valueType">if the valueName doesn't exist, we need to create a new
|
||||
/// value name of one of these types: string, dword, qword
|
||||
/// </param>
|
||||
/// <param name="value">the value to be assigned to the registry name</param>
|
||||
/// <param name="errMsg">error message if the function execution fails</param>
|
||||
/// <return>true/false as to the success/failure of the function execution</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 12/04/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool AddOrModifyRegistryKeySingleValue(string registryPath, RegistryHive registryType, string valueName, RegistryValueKind valueType, string value, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
errMsg = "";
|
||||
|
||||
var hklm = RegistryKey.OpenBaseKey(registryType, RegistryView.Registry64);
|
||||
|
||||
RegistryKey regSubKey = null;
|
||||
|
||||
registryPath = registryPath.Trim();
|
||||
|
||||
if (registryPath.Length > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
regSubKey = hklm.CreateSubKey(registryPath);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
errMsg = e.Message;
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errMsg = "Registry Path is empty";
|
||||
successful = false;
|
||||
}
|
||||
|
||||
if (successful && regSubKey != null && valueName.Length > 0)
|
||||
{
|
||||
List<string> list = new List<string>(regSubKey.GetValueNames());
|
||||
|
||||
// modify registry value
|
||||
if (list.FindIndex(x => x.Equals(valueName, StringComparison.OrdinalIgnoreCase)) != -1)
|
||||
{
|
||||
object obj = regSubKey.GetValue(valueName);
|
||||
|
||||
valueType = regSubKey.GetValueKind(valueName);
|
||||
}
|
||||
|
||||
switch (valueType)
|
||||
{
|
||||
case RegistryValueKind.String:
|
||||
try
|
||||
{
|
||||
regSubKey.SetValue(valueName, value, RegistryValueKind.String);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
errMsg = e.Message;
|
||||
successful = false;
|
||||
}
|
||||
break;
|
||||
case RegistryValueKind.DWord:
|
||||
try
|
||||
{
|
||||
regSubKey.SetValue(valueName, value, RegistryValueKind.DWord);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
errMsg = e.Message;
|
||||
successful = false;
|
||||
}
|
||||
break;
|
||||
case RegistryValueKind.QWord:
|
||||
try
|
||||
{
|
||||
regSubKey.SetValue(valueName, value, RegistryValueKind.QWord);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
errMsg = e.Message;
|
||||
successful = false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
errMsg = "Unable to add value name of type " + valueType.ToString();
|
||||
successful = false;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (regSubKey != null)
|
||||
regSubKey.Close();
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// AddOrModifyRegistryKeyMultiStringValue
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Add/modify a value name of type multi-string
|
||||
/// </summary>
|
||||
/// <param name="registryPath">Registry folder path</param>
|
||||
/// <param name="registryType">Local Machine, Classes Root, Current User</param>
|
||||
/// <param name="valueName">the registry name that has a value associated with it</param>
|
||||
/// <param name="values">list of values</param>
|
||||
/// <param name="errMsg">error message if the function execution fails</param>
|
||||
/// <return>true/false as to the success/failure of the function execution</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 12/04/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool AddOrModifyRegistryKeyMultiStringValue(string registryPath, RegistryHive registryType, string valueName, List<string> values, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
errMsg = "";
|
||||
|
||||
var hklm = RegistryKey.OpenBaseKey(registryType, RegistryView.Registry64);
|
||||
|
||||
RegistryKey regSubKey = null;
|
||||
|
||||
registryPath = registryPath.Trim();
|
||||
|
||||
if (registryPath.Length > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
regSubKey = hklm.CreateSubKey(registryPath);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
errMsg = e.Message;
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errMsg = "Registry Path is empty";
|
||||
successful = false;
|
||||
}
|
||||
|
||||
if (successful && regSubKey != null && valueName.Length > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
regSubKey.SetValue(valueName, values.ToArray(), RegistryValueKind.MultiString);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
errMsg = e.Message;
|
||||
successful = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (regSubKey != null)
|
||||
regSubKey.Close();
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// DeleteRegistryKey
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Delete registry key and all subkeys within it, recursively
|
||||
/// </summary>
|
||||
/// <param name="registryPath">Registry folder path</param>
|
||||
/// <param name="registryType">Local Machine, Classes Root, Current User</param>
|
||||
/// <param name="errMsg">error message if the function execution fails</param>
|
||||
/// <return>true/false as to the success/failure of the function execution</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 12/04/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool DeleteRegistryKey(string registryPath, RegistryHive registryType, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
RegistryKey rkSubKey = null;
|
||||
var hklm = RegistryKey.OpenBaseKey(registryType, RegistryView.Registry64);
|
||||
|
||||
registryPath = registryPath.Trim();
|
||||
errMsg = "";
|
||||
|
||||
if (registryPath.Length > 0)
|
||||
{
|
||||
rkSubKey = hklm.OpenSubKey(registryPath, false);
|
||||
|
||||
if (rkSubKey == null)
|
||||
{
|
||||
errMsg = registryPath + " doesn't exist in registry";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errMsg = "Registry Path is empty";
|
||||
successful = false;
|
||||
}
|
||||
|
||||
if (successful && rkSubKey != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
hklm.DeleteSubKeyTree(registryPath);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
errMsg = e.Message;
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (rkSubKey != null)
|
||||
rkSubKey.Close();
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// DeleteRegistryValueName
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Delete a value name within a registry key
|
||||
/// </summary>
|
||||
/// <param name="registryPath">Registry folder path</param>
|
||||
/// <param name="registryType">Local Machine, Classes Root, Current User</param>
|
||||
/// <param name="valueName">the registry name to be deleted</param>
|
||||
/// <param name="errMsg">error message if the function execution fails</param>
|
||||
/// <return>true/false as to the success/failure of the function execution</return>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 12/04/16 D.Le
|
||||
///==========================================================================
|
||||
public static bool DeleteRegistryValueName(string registryPath, RegistryHive registryType, string valueName, ref string errMsg)
|
||||
{
|
||||
bool successful = true;
|
||||
RegistryKey rkSubKey = null;
|
||||
var hklm = RegistryKey.OpenBaseKey(registryType, RegistryView.Registry64);
|
||||
|
||||
bool valueNameExists = true;
|
||||
registryPath = registryPath.Trim();
|
||||
errMsg = "";
|
||||
|
||||
if (registryPath.Length > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
rkSubKey = hklm.OpenSubKey(registryPath, true);
|
||||
|
||||
if (rkSubKey == null)
|
||||
{
|
||||
errMsg = registryPath + " doesn't exist in registry";
|
||||
}
|
||||
else
|
||||
{
|
||||
List<string> list = new List<string>(rkSubKey.GetValueNames());
|
||||
|
||||
if (list.FindIndex(x => x.Equals(valueName, StringComparison.OrdinalIgnoreCase)) == -1)
|
||||
{
|
||||
errMsg = "Value name " + valueName + " doesn't exist in registry " + registryPath;
|
||||
valueNameExists = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
errMsg = e.Message;
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errMsg = "Registry Path is empty";
|
||||
successful = false;
|
||||
}
|
||||
|
||||
if (successful && rkSubKey != null && valueNameExists)
|
||||
{
|
||||
try
|
||||
{
|
||||
rkSubKey.DeleteValue(valueName);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
errMsg = e.Message;
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (rkSubKey != null)
|
||||
rkSubKey.Close();
|
||||
|
||||
return successful;
|
||||
}
|
||||
|
||||
///==========================================================================
|
||||
/// GetRegistryDynamicUninstallKeys
|
||||
///==========================================================================
|
||||
/// <summary>
|
||||
/// Get the registry keys (full path) for a particular software by using the
|
||||
/// uninstall key. The uninstall keys for software are randomly generated.
|
||||
/// So in order to get the key, we go through all the entries in the Uninstall
|
||||
/// key to find the software name we are looking for. Under every uninstall
|
||||
/// key, there's a valuename called DisplayName which corresponds to the name
|
||||
/// of the software.
|
||||
/// </summary>
|
||||
/// <param name="registryType">Local Machine, Classes Root, Current User</param>
|
||||
/// <param name="softwareName">the name of the software that is recorded in the registry</param>
|
||||
///==========================================================================
|
||||
/// Date Programmer Proj.ID SAR REVISION HISTORY:
|
||||
/// --/--/-- ------------ -------- ---- --------------------------
|
||||
/// 12/04/16 D.Le
|
||||
///==========================================================================
|
||||
public static List<string> GetRegistryDynamicUninstallKeys(RegistryHive registryType, string softwareName)
|
||||
{
|
||||
List<string> appUninstallKeys = new List<string>();
|
||||
|
||||
var hklm = RegistryKey.OpenBaseKey(registryType, RegistryView.Registry64);
|
||||
|
||||
string uninstallKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
|
||||
|
||||
for (int i = 1; i <= 2; i++)
|
||||
{
|
||||
if ( i==2)
|
||||
uninstallKey = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
|
||||
|
||||
using (RegistryKey rk = hklm.OpenSubKey(uninstallKey))
|
||||
{
|
||||
foreach (string skName in rk.GetSubKeyNames())
|
||||
{
|
||||
using (RegistryKey sk = rk.OpenSubKey(skName))
|
||||
{
|
||||
List<string> list = new List<string>(sk.GetValueNames());
|
||||
|
||||
if (list.FindIndex(x => x.Equals("DisplayName", StringComparison.OrdinalIgnoreCase)) != -1)
|
||||
{
|
||||
if (String.Equals(sk.GetValue("DisplayName").ToString(), softwareName, StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
appUninstallKeys.Add(uninstallKey + @"\" + skName);
|
||||
}
|
||||
}
|
||||
|
||||
if ( sk != null)
|
||||
sk.Close();
|
||||
}
|
||||
}
|
||||
|
||||
if ( rk != null )
|
||||
rk.Close();
|
||||
}
|
||||
}
|
||||
|
||||
if ( hklm != null)
|
||||
hklm.Close();
|
||||
|
||||
return appUninstallKeys;
|
||||
}
|
||||
}
|
||||
}
|
||||
36
CommonLib/Properties/AssemblyInfo.cs
Normal file
36
CommonLib/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("DucCommonLibrary")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Northrop Grumman Corporation")]
|
||||
[assembly: AssemblyProduct("DucCommonLibrary")]
|
||||
[assembly: AssemblyCopyright("Copyright © Northrop Grumman Corporation 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("e082b05a-d65f-4778-8a4c-b056fc3e0737")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
Reference in New Issue
Block a user