BusinessMgr web apps

This commit is contained in:
2021-07-08 20:51:25 +01:00
parent 4e8d336498
commit b7ce1cf5f5
32 changed files with 1320 additions and 170 deletions
@@ -4,7 +4,6 @@ using Sarand.Net.Standard.Accounts.QuickBooks.Dbas;
using Sarand.Net.Standard.Accounts.QuickBooks.Internal;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Xml;
using System;
using System.Collections.Generic;
using System.Text;
@@ -45,6 +45,13 @@ namespace Sarand.Net.Standard.Base.Interfaces
protected SaInterfaceConsole ()
{
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
@@ -31,6 +31,13 @@ namespace Sarand.Net.Standard.Base.ItemOptions
protected SaItemOptionConsole ()
{
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
@@ -16,7 +16,7 @@ namespace Sarand.Net.Standard.Base.Procs
}
//=======================================================================
public abstract class SacsProcess : SacsDisposable
public abstract class SaProcess_Base : SacsDisposable
{
//-------------------------------------------------------------------
// Process options and groups - for configuration of process to run.
@@ -81,7 +81,7 @@ namespace Sarand.Net.Standard.Base.Procs
//-------------------------------------------------------------------
// Construction.
protected SacsProcess (Config config)
protected SaProcess_Base (Config config)
{
this.config = config;
}
@@ -5,7 +5,7 @@ using Sarand.Net.Standard.Base.Bus;
namespace Sarand.Net.Standard.Base.Procs
{
//=======================================================================
public abstract class SacsReport : SaErrorStateItem
public abstract class SaReport_Base : SaErrorStateItem
{
//-------------------------------------------------------------------
// Definitions.
@@ -22,7 +22,7 @@ namespace Sarand.Net.Standard.Base.Procs
//-------------------------------------------------------------------
// Construction.
protected SacsReport (Config config)
protected SaReport_Base (Config config)
{
this.config = config;
}
@@ -145,15 +145,22 @@ namespace Sarand.Net.Standard.Base.ReferenceData
//-------------------------------------------------------------------
// Static initialisation.
static SaReferenceDataConsole ()
static SaReferenceDataConsole()
{
}
//-------------------------------------------------------------------
// Construction.
protected SaReferenceDataConsole ()
protected SaReferenceDataConsole()
{
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
@@ -163,11 +170,11 @@ namespace Sarand.Net.Standard.Base.ReferenceData
//---------------------------------------------------------------
// Manage reference data - displays dialog.
public abstract bool ManageReferenceData (bool userCanManageReferenceData, DbUpdateInfo dbUpdateInfo);
public abstract bool ManageReferenceData(bool userCanManageReferenceData, DbUpdateInfo dbUpdateInfo);
//---------------------------------------------------------------
// Reference data codes.
public static List<TypeCodeDesc> GetReferenceDataCodes (ReferenceDataSystemCode systemCode)
public static List<TypeCodeDesc> GetReferenceDataCodes(ReferenceDataSystemCode systemCode)
{
switch (systemCode)
{
@@ -45,7 +45,7 @@ namespace Sarand.Net.Standard.Base.Security
// Definitions.
protected class DataItemDfn
{
public DataItemDfn (short dataItemType, String caption)
public DataItemDfn(short dataItemType, String caption)
{
DataItemType = dataItemType;
Caption = caption;
@@ -64,7 +64,7 @@ namespace Sarand.Net.Standard.Base.Security
//-------------------------------------------------------------------
// Static initialisation
static SaSecurityConsole ()
static SaSecurityConsole()
{
// Security item types.
securityItemTypes.Add(SaSecurity.ItemType.User, "USER", "User");
@@ -75,9 +75,16 @@ namespace Sarand.Net.Standard.Base.Security
//-------------------------------------------------------------------
// Protected construction - use derived classes.
protected SaSecurityConsole ()
protected SaSecurityConsole()
{
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
@@ -97,14 +104,14 @@ namespace Sarand.Net.Standard.Base.Security
// Database properties.
public abstract bool DatabaseIsValid { get; }
public abstract bool CanUpdateDatabase { get; }
public abstract bool ColumnExists (SaSecurityDbDfn.ColumnIdx columnIdx);
public abstract bool ColumnExists(SaSecurityDbDfn.ColumnIdx columnIdx);
//-------------------------------------------------------------------
// U t i l i t i e s
//-------------------------------------------------------------------
// Default user Id.
private SysId userIdDefault = new SysId();
public SysId GetUserIdDefault ()
public SysId GetUserIdDefault()
{
return userIdDefault;
}
@@ -113,56 +120,56 @@ namespace Sarand.Net.Standard.Base.Security
// L o g i n
//-------------------------------------------------------------------
/// <summary>User login.</summary>
public abstract bool LoginUser (SysId userId, bool recordLastLogin = true);
public abstract bool LoginUser(SysId userId, bool recordLastLogin = true);
/// <summary>Using current windows user account.</summary>
public abstract bool LoginAuthenticatedUser ();
protected abstract bool OnLogin (SysId userId);
public abstract bool LoginAuthenticatedUser();
protected abstract bool OnLogin(SysId userId);
/// <summary>Logout - Clear user and security details.</summary>
public abstract bool LogoutUser ();
protected abstract void OnLogout ();
public abstract bool LogoutUser();
protected abstract void OnLogout();
//-------------------------------------------------------------------
// A p p l i c a t i o n I n t e r f a c e
//-------------------------------------------------------------------
/// <summary>Show Login form.</summary>
public abstract bool ManageSecurity (bool userCanManageSecurity, DbUpdateInfo dbUpdateInfo);
public abstract bool ManageSecurity(bool userCanManageSecurity, DbUpdateInfo dbUpdateInfo);
/// <summary>Show Security maintenance form.</summary>
public abstract bool ShowUserLoginForm (DbUpdateInfo dbUpdateInfo);
public abstract bool ShowUserLoginForm(DbUpdateInfo dbUpdateInfo);
/// <summary>User modified event.</summary>
public abstract bool OnUserModified (SysId userId);
public abstract bool OnUserModified(SysId userId);
/// <summary>Security Group modified event.</summary>
public abstract bool OnSecurityGroupModified (SysId userId);
public abstract bool OnSecurityGroupModified(SysId userId);
//-------------------------------------------------------------------
// Password configuration.
public PasswordConfig PasswordConfig { get; protected set; } = new PasswordConfig();
/// <summary>Show form to change password for currently logged in user.</summary>
/// <returns>Flag to indicate password changed</returns>
public abstract bool ShowChangePasswordForm (DbUpdateInfo dbUpdateInfo);
public abstract bool ShowChangePasswordForm(DbUpdateInfo dbUpdateInfo);
//-------------------------------------------------------------------
// A p p l i c a t i o n S e c u r i t y R i g h t s
//-------------------------------------------------------------------
// Register Security Rights.
public abstract void RegisterSecurityRights ();
public abstract void RegisterSecurityRights();
//-------------------------------------------------------------------
// Security rights are optionally associated with a specified data item type (>0),
// in which case they are always associated with a specific item Id of that type.
public bool RegisterSecurityRight (String code, String desc, short dataItemType = 0)
public bool RegisterSecurityRight(String code, String desc, short dataItemType = 0)
{
SecurityRights.Add(code, desc, dataItemType);
return true;
}
// Replace previous rights.
public bool RegisterSecurityRights (List<SaSecurityRight> securityRights)
public bool RegisterSecurityRights(List<SaSecurityRight> securityRights)
{
SecurityRights.Clear();
SecurityRights.AddRange(securityRights);
return true;
}
// Determine whether any security items are present and allow them to be populated.
public abstract bool RequiresPopulation ();
public abstract bool PopulateSecurityRights (DbUpdateInfo dbUpdateInfo);
public abstract bool RequiresPopulation();
public abstract bool PopulateSecurityRights(DbUpdateInfo dbUpdateInfo);
//-------------------------------------------------------------------
// A p p l i c a t i o n D a t a I t e m s
@@ -171,18 +178,18 @@ namespace Sarand.Net.Standard.Base.Security
// Items assign: Register the list of application data items of a particular type that can be associated with security rights.
// Items full: If specified, only data items in the 'assign' list can be associated with security items and existing security
// items that reference data items in the 'full' list but not in the 'assign' list cannot be modified.
public bool RegisterDataItemType (short dataItemType, String caption, List<SysIdString> itemsAssign = null, List<SysIdString> itemsFull = null)
public bool RegisterDataItemType(short dataItemType, String caption, List<SysIdString> itemsAssign = null, List<SysIdString> itemsFull = null)
{
DataItemDfn dataItemDfn = new DataItemDfn(dataItemType,caption);
DataItemDfn dataItemDfn = new DataItemDfn(dataItemType, caption);
if (itemsAssign != null)
dataItemDfn.ItemsAssign.AddRange(itemsAssign);
if (itemsFull != null)
dataItemDfn.ItemsFull.AddRange(itemsFull);
DataItemDfns.Add(dataItemType,dataItemDfn);
DataItemDfns.Add(dataItemType, dataItemDfn);
return true;
}
// Modify list of data item associated with specified type.
public bool RegisterDataItems (short dataItemType, List<SysIdString> itemsAssign, List<SysIdString> itemsFull = null)
public bool RegisterDataItems(short dataItemType, List<SysIdString> itemsAssign, List<SysIdString> itemsFull = null)
{
if (!DataItemDfns.ContainsKey(dataItemType)) return false;
DataItemDfn dataItemDfn = DataItemDfns[dataItemType];
@@ -201,11 +208,11 @@ namespace Sarand.Net.Standard.Base.Security
// U s e r S e c u r i t y P r o f i l e
//-------------------------------------------------------------------
/// <summary>Retrieve security profile for host computer</summary>
public abstract SaSecurityProfile GetHostSecurityProfile ();
public abstract SaSecurityProfile GetHostSecurityProfile();
/// <summary>Retrieve security profile for specified user</summary>
public abstract SaSecurityProfile GetUserSecurityProfile (SysId userId);
public abstract SaSecurityProfile GetUserSecurityProfile(SysId userId);
/// <summary>Internal only - creat securitu profile.</summary>
protected SaSecurityProfile CreateSecurityProfile (SaSecurityItem secItem, List<SaSecurityProfile.GroupData> profileGroups, List<SaSecurityProfile.RightData> profileRights, bool systemAdmin)
protected SaSecurityProfile CreateSecurityProfile(SaSecurityItem secItem, List<SaSecurityProfile.GroupData> profileGroups, List<SaSecurityProfile.RightData> profileRights, bool systemAdmin)
{
return new SaSecurityProfile(secItem, profileGroups, profileRights, systemAdmin);
}
@@ -244,38 +251,41 @@ namespace Sarand.Net.Standard.Base.Security
// S e c u r i t y I t e m s
//-------------------------------------------------------------------
// Security items (user, computer, group or right).
public bool SecurityItemCodeExists (SaSecurity.ItemType securityItemType, String userCode)
public bool SecurityItemCodeExists(SaSecurity.ItemType securityItemType, String userCode)
{
return SysId.IsValid(GetIdForItemCode(securityItemType, userCode));
}
public SaSecurityItem GetUserByCode (String code)
public SaSecurityItem GetUserByCode(String code)
{
return GetSecurityItemByCode(SaSecurity.ItemType.User, code);
}
public abstract SaSecurityItem GetSecurityItemByCode (SaSecurity.ItemType securityItemType, String code);
public abstract SaSecurityItem GetSecurityItem (SaSecurityItem.Params prm);
public abstract SaSecurityItem GetUserByEmail(String emailAddress);
public abstract SaSecurityItem GetSecurityItemById(SaSecurity.ItemType securityItemType, SysId id);
public abstract SaSecurityItem GetSecurityItemByCode(SaSecurity.ItemType securityItemType, String code);
public abstract SaSecurityItem GetSecurityItem(SaSecurityItem.Params prm);
// Security item properties.
public abstract SysId GetIdForItemCode (SaSecurity.ItemType securityItemType, string code);
public abstract String GetCodeForItemId (SysId securityItemId);
public abstract String GetNameForItemId (SysId securityItemId);
public abstract Dictionary<SysId, String> GetSecurityItemDescriptions (List<SysId> securityItemIds);
public abstract SysId GetIdForItemCode(SaSecurity.ItemType securityItemType, string code);
public abstract String GetCodeForItemId(SysId securityItemId);
public abstract String GetNameForItemId(SysId securityItemId);
public abstract Dictionary<SysId, String> GetSecurityItemDescriptions(List<SysId> securityItemIds);
// Security Item list.
public abstract ColumnDfn GetSecurityItemColumnDfn (SaSecurityItem.Column columnId, String caption = "", int width = 0);
public abstract long GetSecurityItemCount (SaSecurityItem.Params prm);
public abstract List<SaSecurityItem> GetSecurityItemList (SaSecurityItem.Params prm);
public abstract DbResultSet ExecuteSecurityItemQuery (List<ColumnDfn> columns, SaSecurityItem.Params prm);
public abstract DataValue GetSecurityItemDataValue (ColumnDfn column, NamedValue.Map values);
public abstract ColumnDfn GetSecurityItemColumnDfn(SaSecurityItem.Column columnId, String caption = "", int width = 0);
public abstract long GetSecurityItemCount(SaSecurityItem.Params prm);
public abstract List<SaSecurityItem> GetSecurityItemList(SaSecurityItem.Params prm);
public abstract DbResultSet ExecuteSecurityItemQuery(List<ColumnDfn> columns, SaSecurityItem.Params prm);
public abstract DataValue GetSecurityItemDataValue(ColumnDfn column, NamedValue.Map values);
//-------------------------------------------------------------------
// Security item updates.
public abstract bool CreateUser (String code, String name, DbUpdateInfo dbUpdateInfo);
public abstract bool AssignUserToGroup (String userCode, String groupCode, DbUpdateInfo dbUpdateInfo);
public abstract bool CreateUser(String code, String name, DbUpdateInfo dbUpdateInfo);
public abstract bool AssignUserToGroup(String userCode, String groupCode, DbUpdateInfo dbUpdateInfo);
public abstract bool UpdateSecurityItem(SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo);
//-------------------------------------------------------------------
// S e c u r i t y I t e m s L i n k s
//-------------------------------------------------------------------
// Security item links.
public abstract bool ItemsAreLinked (SysId securityItemId1, SysId securityItemId2);
public abstract bool ItemsAreLinked(SysId securityItemId1, SysId securityItemId2);
//-------------------------------------------------------------------
@@ -5,6 +5,7 @@ using System.Text;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Base.Security
{
@@ -45,11 +46,18 @@ namespace Sarand.Net.Standard.Base.Security
public String EmailAddress { get; set; } = String.Empty;
public String Description { get; set; } = String.Empty;
public String Location { get; set; } = String.Empty;
public int DataItemType { get; set; } = -1;
// Security.
public String PasswordEncrypted { get; set; } = String.Empty;
public String PasswordSalt { get; set; } = String.Empty;
public String PasswordHash { get; set; } = String.Empty;
public List<String> PasswordHistory { get; } = new List<string>();
public String PasswordToken { get; set; } = String.Empty;
public DateTime PasswordChangedAt { get; set; } = DateTime.MinValue;
// Login.
public DateTime LastLogin { get; set; } = DateTime.MinValue;
public int DataItemType { get; set; } = -1;
public DateTime LastInvalidLoginAt { get; set; } = DateTime.MinValue;
public short InvalidLoginCount { get; set; }
}
//-------------------------------------------------------------------
@@ -89,6 +97,12 @@ namespace Sarand.Net.Standard.Base.Security
get { return data.Location; }
set { CheckChanged(data.Location, value); data.Location = value; }
}
public int DataItemType
{
get { return data.DataItemType; }
set { CheckChanged(data.DataItemType, value); data.DataItemType = value; }
}
// Security.
public String PasswordEncrypted
{
get { return data.PasswordEncrypted; }
@@ -104,15 +118,41 @@ namespace Sarand.Net.Standard.Base.Security
get { return data.PasswordHash; }
set { CheckChanged(data.PasswordHash, value); data.PasswordHash = value; }
}
public List<String> PasswordHistory
{
get { return data.PasswordHistory; }
set
{
CheckChanged(data.PasswordHistory, value);
data.PasswordHistory.Clear();
data.PasswordHistory.AddRange((value ?? new List<String>()).FindAll(item => !StringUtil.IsEmpty(StringUtil.TrimAll(item))));
}
}
public String PasswordToken
{
get { return data.PasswordToken; }
set { CheckChanged(data.PasswordToken, value); data.PasswordToken = value; }
}
public DateTime PasswordChangedAt
{
get { return data.PasswordChangedAt; }
set { CheckChanged(data.PasswordChangedAt, value); data.PasswordChangedAt = value; }
}
// Login.
public DateTime LastLogin
{
get { return data.LastLogin; }
set { CheckChanged(data.LastLogin, value); data.LastLogin = value; }
}
public int DataItemType
public DateTime LastInvalidLoginAt
{
get { return data.DataItemType; }
set { CheckChanged(data.DataItemType, value); data.DataItemType = value; }
get { return data.LastInvalidLoginAt; }
set { CheckChanged(data.LastInvalidLoginAt, value); data.LastInvalidLoginAt = value; }
}
public short InvalidLoginCount
{
get { return data.InvalidLoginCount; }
set { CheckChanged(data.InvalidLoginCount, value); data.InvalidLoginCount = value; }
}
// Flags.
public bool AuthenticatedUser
@@ -128,11 +168,18 @@ namespace Sarand.Net.Standard.Base.Security
EmailAddress = data.EmailAddress;
Description = data.Description;
Location = data.Location;
DataItemType = data.DataItemType;
// Security.
PasswordEncrypted = data.PasswordEncrypted;
PasswordSalt = data.PasswordSalt;
PasswordHash = data.PasswordHash;
PasswordHistory = data.PasswordHistory;
PasswordToken = data.PasswordToken;
PasswordChangedAt = data.PasswordChangedAt;
// Login.
LastLogin = data.LastLogin;
DataItemType = data.DataItemType;
LastInvalidLoginAt = data.LastInvalidLoginAt;
InvalidLoginCount = data.InvalidLoginCount;
base.PopulateFrom(data);
}
public Data Clone ()
@@ -153,7 +200,15 @@ namespace Sarand.Net.Standard.Base.Security
public ValidValue EmailAddress { get; set; } = ValidValue.Valid;
public ValidValue Description { get; set; } = ValidValue.Valid;
public ValidValue Location { get; set; } = ValidValue.Valid;
// Security.
public ValidValue Password { get; set; } = ValidValue.Valid;
public ValidValue PasswordHistory { get; set; } = ValidValue.Valid;
public ValidValue PasswordToken { get; set; } = ValidValue.Valid;
public ValidValue PasswordChanged { get; set; } = ValidValue.Valid;
// Login.
public ValidValue LastLogin { get; set; } = ValidValue.Valid;
public ValidValue LastInvalidLogin { get; set; } = ValidValue.Valid;
public ValidValue InvalidLoginCount { get; set; } = ValidValue.Valid;
}
//-------------------------------------------------------------------
@@ -239,6 +294,14 @@ namespace Sarand.Net.Standard.Base.Security
get { return data.Location; }
set { data.Location = value; }
}
public int DataItemType
{
get { return data.DataItemType; }
set { data.DataItemType = value; }
}
// Security.
[Obsolete("Avoid using the original C++ password encryption - switch to hashed password instead.")]
public String PasswordEncrypted
{
get { return data.PasswordEncrypted; }
@@ -254,15 +317,37 @@ namespace Sarand.Net.Standard.Base.Security
get { return data.PasswordHash; }
set { data.PasswordHash = value; }
}
public List<String> PasswordHistory
{
get { return data.PasswordHistory; }
set { data.PasswordHistory = value; }
}
public String PasswordToken
{
get { return data.PasswordToken; }
set { data.PasswordToken = value; }
}
public DateTime PasswordChangedAt
{
get { return data.PasswordChangedAt; }
set { data.PasswordChangedAt = value; }
}
// Login.
public DateTime LastLogin
{
get { return data.LastLogin; }
set { data.LastLogin = value; }
}
public int DataItemType
public DateTime LastInvalidLoginAt
{
get { return data.DataItemType; }
set { data.DataItemType = value; }
get { return data.LastInvalidLoginAt; }
set { data.LastInvalidLoginAt = value; }
}
public short InvalidLoginCount
{
get { return data.InvalidLoginCount; }
set { data.InvalidLoginCount = value; }
}
//-------------------------------------------------------------------
@@ -28,7 +28,9 @@ namespace Sarand.Net.Standard.Base.Security
public abstract bool SecurityItemExistsById (SysId id);
public abstract bool SecurityItemExistsByTypeCode (SaSecurity.ItemType securityItemType, String code);
public abstract SaSecurityItem GetSecurityItemById (SysId id);
public abstract SaSecurityItem GetSecurityItemByTypeCode (SaSecurity.ItemType securityItemType, String code);
public abstract SaSecurityItem GetSecurityItemByTypeId(SaSecurity.ItemType securityItemType, SysId id);
public abstract SaSecurityItem GetSecurityItemByTypeEmail(SaSecurity.ItemType securityItemType, String emailAddress);
public abstract SaSecurityItem GetSecurityItemByTypeCode(SaSecurity.ItemType securityItemType, String code);
public abstract SaSecurityItem GetSecurityItem (SaSecurityItem.Params prmSecItem);
// Create Security Item.
@@ -28,6 +28,13 @@ namespace Sarand.Net.Standard.Base.UpdateLog
protected SaUpdateLogConsole ()
{
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
@@ -29,6 +29,14 @@ namespace Sarand.Net.Standard.Dbas.Interfaces
Database = database;
interfaceMgr = new SaInterfaceMgr_Dbas(this);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (interfaceMgr != null) interfaceMgr.Dispose(); interfaceMgr = null;
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
@@ -18,17 +18,25 @@ namespace Sarand.Net.Standard.Dbas.ItemOptions
//-------------------------------------------------------------------
// Static initialisation.
static SaItemOptionConsole_Dbas ()
static SaItemOptionConsole_Dbas()
{
}
//-------------------------------------------------------------------
// Construction.
protected SaItemOptionConsole_Dbas (SacsDatabase database)
protected SaItemOptionConsole_Dbas(SacsDatabase database)
{
Database = database;
itemOptionMgr = new SaItemOptionMgr_Dbas(this);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (itemOptionMgr != null) itemOptionMgr.Dispose(); itemOptionMgr = null;
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
@@ -38,11 +46,11 @@ namespace Sarand.Net.Standard.Dbas.ItemOptions
//-------------------------------------------------------------------
// Item Options form.
public override bool MangageItemOptions (List<SaItemOption> itemOptions)
public override bool MangageItemOptions(List<SaItemOption> itemOptions)
{
throw new NotImplementedException();
}
public override bool ShowItemOptionsDialog (ItemId itemId, DbUpdateInfo dbUpdateInfo)
public override bool ShowItemOptionsDialog(ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (ShowItemOptionsDialogFn != null)
@@ -50,24 +58,24 @@ namespace Sarand.Net.Standard.Dbas.ItemOptions
return false;
}
// Method to display Update Log dialog.
protected delegate bool ShowItemOptionsDialogFunction (SaItemOptionConsole codeTypeConsole, ItemId itemId, DbUpdateInfo dbUpdateInfo);
protected delegate bool ShowItemOptionsDialogFunction(SaItemOptionConsole codeTypeConsole, ItemId itemId, DbUpdateInfo dbUpdateInfo);
protected abstract ShowItemOptionsDialogFunction ShowItemOptionsDialogFn { get; }
//*******************************************************************
// I t e m O p t i o n s
//*******************************************************************
// Retrieve specific option.
public override SaItemOption GetItemOption (ItemId itemId, String name, String context)
public override SaItemOption GetItemOption(ItemId itemId, String name, String context)
{
return itemOptionMgr.GetItemOption(itemId,name,context);
return itemOptionMgr.GetItemOption(itemId, name, context);
}
// Retrieve options.
public override List<SaItemOption> GetItemOptions (SaItemOption.Params prmItemOption)
public override List<SaItemOption> GetItemOptions(SaItemOption.Params prmItemOption)
{
return itemOptionMgr.GetItemOptionList(prmItemOption);
}
public override List<SaItemOption> GetItemOptionsForItem (ItemId itemId)
public override List<SaItemOption> GetItemOptionsForItem(ItemId itemId)
{
if (!ItemId.IsValid(itemId))
return new List<SaItemOption>();
@@ -77,31 +85,31 @@ namespace Sarand.Net.Standard.Dbas.ItemOptions
}
// Retrieve specific option for range of items (all matching item if ID list is blank).
public override List<SaItemOption> GetItemOptions (List<ItemId> itemIds, String name, String context)
public override List<SaItemOption> GetItemOptions(List<ItemId> itemIds, String name, String context)
{
SaItemOption.Params prmItemOption = new SaItemOption.Params();
prmItemOption.IncludedItemIds.AddRange(itemIds);
if (!StringUtil.IsEmpty(name))
prmItemOption.IncludedNameContexts.Add(name,context);
prmItemOption.IncludedNameContexts.Add(name, context);
return itemOptionMgr.GetItemOptionList(prmItemOption);
}
//-------------------------------------------------------------------
// Create an item option.
public override SaItemOption CreateItemOption (ItemId itemId, String name, String context)
public override SaItemOption CreateItemOption(ItemId itemId, String name, String context)
{
return itemOptionMgr.CreateItemOption(itemId, name, context);
}
// Item independent options, eg. for processes.
public override SaItemOption CreateItemOptionByNameContext (String name, String context)
public override SaItemOption CreateItemOptionByNameContext(String name, String context)
{
return itemOptionMgr.CreateItemOption(null, name, context);
}
//-------------------------------------------------------------------
// Store item option - create if not exsts, otherwise update.
public override bool StoreItemOption (SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
public override bool StoreItemOption(SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
// If option exists, update it.
@@ -119,21 +127,21 @@ namespace Sarand.Net.Standard.Dbas.ItemOptions
return true;
}
// Store a specific option against the specified item.
public override bool StoreItemOption (ItemId itemId, String name, String context, String sValue, DbUpdateInfo dbUpdateInfo)
public override bool StoreItemOption(ItemId itemId, String name, String context, String sValue, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
SaItemOption itemOption = CreateItemOption(itemId,name,context);
SaItemOption itemOption = CreateItemOption(itemId, name, context);
return StoreItemOption(itemOption, dbUpdateInfo);
}
// Store the updated list of options against the specified item.
public override bool StoreItemOptions (ItemId itemId, List<SaItemOption> itemOptions, DbUpdateInfo dbUpdateInfo)
public override bool StoreItemOptions(ItemId itemId, List<SaItemOption> itemOptions, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
// Validate item options.
foreach (SaItemOption itemOption in itemOptions)
{
if (itemOption.ItemId != null && !itemOption.ItemId.Equals(itemId)) return SetErrorState("Inconsistent item id in option list");
if (!itemOptionMgr.IsValidItemOption(itemOption)) return SetErrorState("Validation error: "+itemOptionMgr.ErrorStateMessage);
if (!itemOptionMgr.IsValidItemOption(itemOption)) return SetErrorState("Validation error: " + itemOptionMgr.ErrorStateMessage);
}
// Retrieve existing options.
List<SaItemOption> existingItemOptions = GetItemOptionsForItem(itemId).FindAll(item => item.ItemId.Equals(itemId));
@@ -147,25 +155,25 @@ namespace Sarand.Net.Standard.Dbas.ItemOptions
// Clear options not in the list.
foreach (SaItemOption itemOption in existingItemOptions)
{
if (!ClearItemOption(itemOption,dbUpdateInfo)) return false;
if (!ClearItemOption(itemOption, dbUpdateInfo)) return false;
}
return true;
}
// Remove option(s) for the specified item.
public override bool ClearItemOption (SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
public override bool ClearItemOption(SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (itemOptionMgr.ItemOptionExists(itemOption) && !itemOptionMgr.DeleteItemOption(itemOption, dbUpdateInfo))
return SetErrorState(itemOptionMgr.ErrorStateMessage);
return true;
}
public override bool ClearItemOption (ItemId itemId, String name, String context, DbUpdateInfo dbUpdateInfo)
public override bool ClearItemOption(ItemId itemId, String name, String context, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
return ClearItemOption(CreateItemOption(itemId, name, context),dbUpdateInfo);
return ClearItemOption(CreateItemOption(itemId, name, context), dbUpdateInfo);
}
public override bool ClearItemOptions (ItemId itemId, DbUpdateInfo dbUpdateInfo)
public override bool ClearItemOptions(ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!itemOptionMgr.ClearItemOptionsForItem(itemId, dbUpdateInfo))
@@ -13,11 +13,11 @@ using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.Proc
{
//=======================================================================
public class SaDbProcess_CompareDatabaseSchemas : SacsProcess
public class SaDbProcess_CompareDatabaseSchemas : SaProcess_Base
{
//-------------------------------------------------------------------
// Configuration.
public new class Config : SacsProcess.Config
public new class Config : SaProcess_Base.Config
{
public Config(ISacsDatabase sourceDatabase, ISacsDatabase targetDatabase)
{
@@ -16,7 +16,7 @@ using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.Proc
{
//=======================================================================
public class SaDbProcess_ConvertDbDefinition : SacsProcess
public class SaDbProcess_ConvertDbDefinition : SaProcess_Base
{
//-------------------------------------------------------------------
// Configuration.
@@ -30,7 +30,7 @@ namespace Sarand.Net.Standard.Dbas.Proc
Unknown = 0,
CsCode
}
public new class Config : SacsProcess.Config
public new class Config : SaProcess_Base.Config
{
public Config ()
{
@@ -17,11 +17,11 @@ using System.Xml.Linq;
namespace Sarand.Net.Standard.Dbas.Proc
{
//=======================================================================
public class SaDbProcess_ConvertDbSchema : SacsProcess
public class SaDbProcess_ConvertDbSchema : SaProcess_Base
{
//-------------------------------------------------------------------
// Configuration.
public new class Config : SacsProcess.Config
public new class Config : SaProcess_Base.Config
{
public Config()
{
@@ -28,6 +28,13 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData
Database = database;
referenceDataMgr = new SaReferenceDataMgr_Dbas(this);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
@@ -20,31 +20,39 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Protected construction - use derived class.
protected SaSecurityConsole_Dbas (SacsDatabase database)
protected SaSecurityConsole_Dbas(SacsDatabase database)
{
Database = database;
// Initialise security manager.
securityMgr = new SaSecurityMgr_Dbas(this);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (securityMgr != null) securityMgr.Dispose(); securityMgr = null;
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Database properties.
internal SacsDatabase Database { get; set; }
public override bool DatabaseIsValid { get { return securityMgr.DatabaseIsValid; } }
public override bool CanUpdateDatabase { get { return securityMgr.CanUpdateDatabase; } }
public override bool ColumnExists (SaSecurityDbDfn.ColumnIdx columnIdx)
public override bool ColumnExists(SaSecurityDbDfn.ColumnIdx columnIdx)
{
return Database != null && Database.ColumnExists(SaSecurityDbDfn.GetTableName(SaSecurityDbDfn.GetTableForColumn(columnIdx), false), SaSecurityDbDfn.GetColumnName(columnIdx,false));
return Database != null && Database.ColumnExists(SaSecurityDbDfn.GetTableName(SaSecurityDbDfn.GetTableForColumn(columnIdx), false), SaSecurityDbDfn.GetColumnName(columnIdx, false));
}
//-------------------------------------------------------------------
// A p p l i c a t i o n I n t e r f a c e
//-------------------------------------------------------------------
// Show User Login form.
protected delegate bool ShowUserLoginFormFunction (SaSecurityConsole securityConsole, DbUpdateInfo dbUpdateInfo);
protected delegate bool ShowUserLoginFormFunction(SaSecurityConsole securityConsole, DbUpdateInfo dbUpdateInfo);
protected abstract ShowUserLoginFormFunction ShowUserLoginFormFn { get; }
// Manage security.
public override bool ShowUserLoginForm (DbUpdateInfo dbUpdateInfo)
public override bool ShowUserLoginForm(DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (ShowUserLoginFormFn != null)
@@ -54,10 +62,10 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Method to display Security management form.
protected delegate bool ShowManageSecurityDialogFunction (SaSecurityConsole securityConsole, SaSecurityMgr securityMgr, bool userCanManageSecurity, DbUpdateInfo dbUpdateInfo);
protected delegate bool ShowManageSecurityDialogFunction(SaSecurityConsole securityConsole, SaSecurityMgr securityMgr, bool userCanManageSecurity, DbUpdateInfo dbUpdateInfo);
protected abstract ShowManageSecurityDialogFunction ShowManageSecurityDialogFn { get; }
// Manage security.
public override bool ManageSecurity (bool userCanManageSecurity, DbUpdateInfo dbUpdateInfo)
public override bool ManageSecurity(bool userCanManageSecurity, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (ShowManageSecurityDialogFn != null)
@@ -66,7 +74,7 @@ namespace Sarand.Net.Standard.Dbas.Security
}
//-------------------------------------------------------------------
public override bool ShowChangePasswordForm (DbUpdateInfo dbUpdateInfo)
public override bool ShowChangePasswordForm(DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
throw new NotImplementedException();
@@ -75,7 +83,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// A p p l i c a t i o n S e c u r i t y R i g h t s
//-------------------------------------------------------------------
public override bool RequiresPopulation ()
public override bool RequiresPopulation()
{
ClearErrorState();
if (SecurityRights.Count == 0) return false;
@@ -86,7 +94,7 @@ namespace Sarand.Net.Standard.Dbas.Security
}
return false;
}
public override bool PopulateSecurityRights (DbUpdateInfo dbUpdateInfo)
public override bool PopulateSecurityRights(DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (SecurityRights.Count == 0) return false;
@@ -107,7 +115,7 @@ namespace Sarand.Net.Standard.Dbas.Security
if (!HasErrorState()) PopulateAdminUser(dbUpdateInfo);
return !HasErrorState();
}
private bool PopulateSuperGroup (DbUpdateInfo dbUpdateInfo)
private bool PopulateSuperGroup(DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
SaSecurityItem superGroup = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.Group, GroupSuperCode);
@@ -138,7 +146,7 @@ namespace Sarand.Net.Standard.Dbas.Security
}
return !HasErrorState();
}
private bool PopulateAdminUser (DbUpdateInfo dbUpdateInfo)
private bool PopulateAdminUser(DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
SaSecurityItem user = null;
@@ -179,7 +187,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// L o g i n
//-------------------------------------------------------------------
public override bool LoginUser (SysId userId, bool recordLastLogin = true)
public override bool LoginUser(SysId userId, bool recordLastLogin = true)
{
String fn = GetType().Name + ".LoginUser";
ClearErrorState();
@@ -200,7 +208,7 @@ namespace Sarand.Net.Standard.Dbas.Security
}
return true;
}
public override bool LoginAuthenticatedUser ()
public override bool LoginAuthenticatedUser()
{
String fn = GetType().Name + ".LoginAuthenticatedUser";
ClearErrorState();
@@ -234,7 +242,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
/// <summary>Logout - Clear user and security details.</summary>
public override bool LogoutUser ()
public override bool LogoutUser()
{
OnLogout();
return true;
@@ -245,7 +253,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
private SaSecurityProfile hostSecurityProfile;
/// <summary>Retrieve security profile for host computer</summary>
public override SaSecurityProfile GetHostSecurityProfile ()
public override SaSecurityProfile GetHostSecurityProfile()
{
ClearErrorState();
if (hostSecurityProfile == null)
@@ -256,12 +264,12 @@ namespace Sarand.Net.Standard.Dbas.Security
return hostSecurityProfile;
}
/// <summary>Retrieve security profile for specified user</summary>
public override SaSecurityProfile GetUserSecurityProfile (SysId userId)
public override SaSecurityProfile GetUserSecurityProfile(SysId userId)
{
ClearErrorState();
return GetSecurityProfile(securityMgr.GetSecurityItemById(userId));
}
private SaSecurityProfile GetSecurityProfile (SaSecurityItem secItem)
private SaSecurityProfile GetSecurityProfile(SaSecurityItem secItem)
{
String fn = GetType().Name + ".PopulateSecurityProfile";
if (secItem == null || !SysId.IsValid(secItem.Id)) return null;
@@ -364,21 +372,29 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// S e c u r i t y I t e m s
//-------------------------------------------------------------------
public override SaSecurityItem GetSecurityItemByCode (SaSecurity.ItemType securityItemType, string code)
public override SaSecurityItem GetUserByEmail(String emailAddress)
{
return securityMgr.GetSecurityItemByTypeEmail(SaSecurity.ItemType.User, emailAddress);
}
public override SaSecurityItem GetSecurityItemById(SaSecurity.ItemType securityItemType, SysId id)
{
return securityMgr.GetSecurityItemByTypeId(securityItemType, id);
}
public override SaSecurityItem GetSecurityItemByCode(SaSecurity.ItemType securityItemType, string code)
{
return securityMgr.GetSecurityItemByTypeCode(securityItemType, code);
}
public override SaSecurityItem GetSecurityItem (SaSecurityItem.Params prm)
public override SaSecurityItem GetSecurityItem(SaSecurityItem.Params prm)
{
ClearErrorState();
SaSecurityItem securityItem = securityMgr.GetSecurityItem (prm);
SaSecurityItem securityItem = securityMgr.GetSecurityItem(prm);
SetErrorState(securityMgr.ErrorStateMessage);
return securityItem;
}
//-------------------------------------------------------------------
// Security Item properties.
public override SysId GetIdForItemCode (SaSecurity.ItemType securityItemType, string code)
public override SysId GetIdForItemCode(SaSecurity.ItemType securityItemType, string code)
{
ClearErrorState();
if (securityItemType != SaSecurity.ItemType.Unknown && !StringUtil.IsEmpty(code))
@@ -409,7 +425,7 @@ namespace Sarand.Net.Standard.Dbas.Security
}
return null;
}
public override string GetCodeForItemId (SysId itemId)
public override string GetCodeForItemId(SysId itemId)
{
ClearErrorState();
if (!SysId.IsValid(itemId))
@@ -441,7 +457,7 @@ namespace Sarand.Net.Standard.Dbas.Security
}
return "";
}
public override string GetNameForItemId (SysId itemId)
public override string GetNameForItemId(SysId itemId)
{
ClearErrorState();
if (!SysId.IsValid(itemId))
@@ -473,7 +489,7 @@ namespace Sarand.Net.Standard.Dbas.Security
}
return "";
}
public override Dictionary<SysId, String> GetSecurityItemDescriptions (List<SysId> securityItemIds)
public override Dictionary<SysId, String> GetSecurityItemDescriptions(List<SysId> securityItemIds)
{
ClearErrorState();
Dictionary<SysId, String> securityItemDescs = new Dictionary<SysId, String>();
@@ -505,7 +521,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Security item updates.
public override bool CreateUser (string code, string name, DbUpdateInfo dbUpdateInfo)
public override bool CreateUser(string code, string name, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (StringUtil.IsEmpty(code) || StringUtil.IsEmpty(name))
@@ -524,37 +540,44 @@ namespace Sarand.Net.Standard.Dbas.Security
return !HasErrorState();
}
public override bool AssignUserToGroup (string userCode, string groupCode, DbUpdateInfo dbUpdateInfo)
public override bool AssignUserToGroup(string userCode, string groupCode, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
throw new NotImplementedException();
}
public override bool UpdateSecurityItem(SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!securityMgr.UpdateSecurityItem(securityItem, dbUpdateInfo))
return SetErrorState(securityMgr.ErrorStateMessage);
return !HasErrorState();
}
//-------------------------------------------------------------------
// Security Item list.
public override ColumnDfn GetSecurityItemColumnDfn (SaSecurityItem.Column columnId, String caption = "", int width = 0)
public override ColumnDfn GetSecurityItemColumnDfn(SaSecurityItem.Column columnId, String caption = "", int width = 0)
{
ClearErrorState();
return securityMgr.GetSecurityItemColumnDfn(columnId, caption, width);
}
public override long GetSecurityItemCount (SaSecurityItem.Params prm)
public override long GetSecurityItemCount(SaSecurityItem.Params prm)
{
ClearErrorState();
return securityMgr.GetSecurityItemCount(prm);
}
public override List<SaSecurityItem> GetSecurityItemList (SaSecurityItem.Params prm)
public override List<SaSecurityItem> GetSecurityItemList(SaSecurityItem.Params prm)
{
ClearErrorState();
return securityMgr.GetSecurityItemList(prm);
}
public override DbResultSet ExecuteSecurityItemQuery (List<ColumnDfn> columns, SaSecurityItem.Params prm)
public override DbResultSet ExecuteSecurityItemQuery(List<ColumnDfn> columns, SaSecurityItem.Params prm)
{
ClearErrorState();
DbResultSet resultSet = securityMgr.ExecuteSecurityItemQuery(columns, prm);
SetErrorState(securityMgr.ErrorStateMessage);
return resultSet;
}
public override DataValue GetSecurityItemDataValue (ColumnDfn column, NamedValue.Map values)
public override DataValue GetSecurityItemDataValue(ColumnDfn column, NamedValue.Map values)
{
ClearErrorState();
return securityMgr.GetSecurityItemDataValue(column, values);
@@ -564,7 +587,7 @@ namespace Sarand.Net.Standard.Dbas.Security
// S e c u r i t y I t e m s L i n k s
//-------------------------------------------------------------------
// Security item links.
public override bool ItemsAreLinked (SysId itemId1, SysId itemId2)
public override bool ItemsAreLinked(SysId itemId1, SysId itemId2)
{
ClearErrorState();
if (!SysId.IsValid(itemId1) || !SysId.IsValid(itemId2)) return false;
@@ -20,17 +20,17 @@ namespace Sarand.Net.Standard.Dbas.Security
// S e c u r i t y I t e m
//*******************************************************************
// Associated data.
public override bool SecurityItemIsSourceOfLinks (SysId securityItemId)
public override bool SecurityItemIsSourceOfLinks(SysId securityItemId)
{
String filter = SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner)+"="+SysId.ToString(securityItemId);
String filter = SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner) + "=" + SysId.ToString(securityItemId);
return (Database.GetRowCount(TableName_SecLink, filter) > 0);
}
public override bool SecurityItemIsTargetOfLinks (SysId securityItemId)
public override bool SecurityItemIsTargetOfLinks(SysId securityItemId)
{
String filter = SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget)+"="+SysId.ToString(securityItemId);
String filter = SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget) + "=" + SysId.ToString(securityItemId);
return (Database.GetRowCount(TableName_SecLink, filter) > 0);
}
public override bool SecurityItemHasLinksWith (SysId securityItemIdOwner, SysId securityItemIdTarget)
public override bool SecurityItemHasLinksWith(SysId securityItemIdOwner, SysId securityItemIdTarget)
{
SaSecurityLink.Params prmSecLink = new SaSecurityLink.Params();
prmSecLink.includedItemIdsOwner.Add(securityItemIdOwner);
@@ -41,7 +41,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Security Item exists.
public override bool SecurityItemExistsById (SysId id)
public override bool SecurityItemExistsById(SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
@@ -50,7 +50,7 @@ namespace Sarand.Net.Standard.Dbas.Security
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
return GetSecurityItemCount(prmSecItem) == 1;
}
public override bool SecurityItemExistsByTypeCode (SaSecurity.ItemType securityItemType, string code)
public override bool SecurityItemExistsByTypeCode(SaSecurity.ItemType securityItemType, string code)
{
ClearErrorState();
if ((int)securityItemType < 1 || StringUtil.IsEmpty(code)) return false;
@@ -63,11 +63,11 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Get SecurityItem.
public override SaSecurityItem GetSecurityItem (SaSecurityItem.Params prmSecItem)
public override SaSecurityItem GetSecurityItem(SaSecurityItem.Params prmSecItem)
{
return GetSecurityItem(GetSecurityItemQueryFilter(prmSecItem).Concat(" AND ", "(", ")"));
}
private SaSecurityItem GetSecurityItem (String filter)
private SaSecurityItem GetSecurityItem(String filter)
{
ClearErrorState();
if (GetSecurityItemCount(filter) != 1) return null;
@@ -90,7 +90,7 @@ namespace Sarand.Net.Standard.Dbas.Security
}
return securityItem;
}
public override SaSecurityItem GetSecurityItemById (SysId id)
public override SaSecurityItem GetSecurityItemById(SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
@@ -99,7 +99,27 @@ namespace Sarand.Net.Standard.Dbas.Security
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
return GetSecurityItem(GetSecurityItemQueryFilter(prmSecItem).Concat(" AND ", "(", ")"));
}
public override SaSecurityItem GetSecurityItemByTypeCode (SaSecurity.ItemType securityItemType, string code)
public override SaSecurityItem GetSecurityItemByTypeId(SaSecurity.ItemType securityItemType, SysId id)
{
ClearErrorState();
if ((int)securityItemType < 1 || !SysId.IsValid(id)) return null;
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
prmSecItem.IncludedIds.Add(id);
prmSecItem.SecurityItemType = securityItemType;
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
return GetSecurityItem(GetSecurityItemQueryFilter(prmSecItem).Concat(" AND ", "(", ")"));
}
public override SaSecurityItem GetSecurityItemByTypeEmail(SaSecurity.ItemType securityItemType, string emailAddress)
{
ClearErrorState();
if ((int)securityItemType < 1 || StringUtil.IsEmpty(emailAddress)) return null;
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
prmSecItem.SecurityItemType = securityItemType;
prmSecItem.EmailAddress = emailAddress;
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
return GetSecurityItem(GetSecurityItemQueryFilter(prmSecItem).Concat(" AND ", "(", ")"));
}
public override SaSecurityItem GetSecurityItemByTypeCode(SaSecurity.ItemType securityItemType, string code)
{
ClearErrorState();
if ((int)securityItemType < 1 || StringUtil.IsEmpty(code)) return null;
@@ -112,12 +132,12 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Create item.
public override SaSecurityItem CreateSecurityItem (SaSecurity.ItemType securityItemType)
public override SaSecurityItem CreateSecurityItem(SaSecurity.ItemType securityItemType)
{
ClearErrorState();
return new SaSecurityItem_Dbas(null, securityItemType, 0);
}
public SaSecurityItem CreateSecurityItem (SaSecItem_Db dbSecurityItem)
public SaSecurityItem CreateSecurityItem(SaSecItem_Db dbSecurityItem)
{
ClearErrorState();
SaSecurityItem securityItem = new SaSecurityItem_Dbas(new SysId(dbSecurityItem._Id), (SaSecurity.ItemType)dbSecurityItem._Type, (ushort)dbSecurityItem._Flags);
@@ -127,7 +147,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Validate item properties.
public override bool IsValidSecurityItemData (SaSecurityItem.Data securityItemData, SaSecurityItem.ErrField errField)
public override bool IsValidSecurityItemData(SaSecurityItem.Data securityItemData, SaSecurityItem.ErrField errField)
{
ClearErrorState();
if (!base.IsValidSecurityItemData(securityItemData, errField)) return false;
@@ -136,7 +156,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Insert item.
public override bool InsertSecurityItem (SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
public override bool InsertSecurityItem(SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
{
String fn = GetType().Name + ".InsertSecurityItem";
ClearErrorState();
@@ -167,7 +187,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Update SecurityItem.
public override bool UpdateSecurityItem (SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
public override bool UpdateSecurityItem(SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
{
String fn = GetType().Name + ".UpdateSecurityItem";
ClearErrorState();
@@ -204,13 +224,13 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Delete SecurityItem.
public override bool SecurityItemCanBeDeleted (SaSecurityItem securityItem)
public override bool SecurityItemCanBeDeleted(SaSecurityItem securityItem)
{
ClearErrorState();
if (!base.SecurityItemCanBeDeleted(securityItem)) return false;
return true;
}
public override bool DeleteSecurityItem (SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
public override bool DeleteSecurityItem(SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
{
String fn = GetType().Name + ".DeleteSecurityItem";
ClearErrorState();
@@ -237,7 +257,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (SaSecItem_Db dbSecurityItem, SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
private void PopulateTo(SaSecItem_Db dbSecurityItem, SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
{
dbSecurityItem._Id = securityItem.Id.ToInt();
dbSecurityItem._Type = (byte)securityItem.ItemType;
@@ -264,7 +284,7 @@ namespace Sarand.Net.Standard.Dbas.Security
dbSecurityItem._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbSecurityItem._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (SaSecItem_Db dbSecurityItem, SaSecurityItem securityItem)
private void PopulateFrom(SaSecItem_Db dbSecurityItem, SaSecurityItem securityItem)
{
//securityItem.Id = new SysId(dbSecurityItem._Id);
securityItem.Code = dbSecurityItem._Code;
@@ -300,9 +320,9 @@ namespace Sarand.Net.Standard.Dbas.Security
alias = aliasSecurityItem;
col.Set(caption, width, (int)dbCol, prefix + SaSecurityDbDfn.GetColumnName(dbCol, false), SaSecurityDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
}
public override ColumnDfn GetSecurityItemColumnDfn (SaSecurityItem.Column columnId, string caption = "", int width = 0)
public override ColumnDfn GetSecurityItemColumnDfn(SaSecurityItem.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId,caption,width);
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SaSecurityItem.Column.Pos:
@@ -382,7 +402,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// SecurityItem query filter.
public override List<string> GetSecurityItemQueryFilter (SaSecurityItem.Params prm)
public override List<string> GetSecurityItemQueryFilter(SaSecurityItem.Params prm)
{
List<String> filter = new List<String>();
@@ -440,7 +460,7 @@ namespace Sarand.Net.Standard.Dbas.Security
return filter;
}
// SecurityItem sort columns.
public List<String> GetSecurityItemSortColumns (SaSecurityItem.Params prm)
public List<String> GetSecurityItemSortColumns(SaSecurityItem.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
@@ -477,12 +497,12 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// SecurityItem count.
private long GetSecurityItemCount (String filter)
private long GetSecurityItemCount(String filter)
{
ClearErrorState();
return Database.GetRowCount(TableName_SecItem + " As " + aliasSecurityItem, filter);
}
public override long GetSecurityItemCount (SaSecurityItem.Params prm)
public override long GetSecurityItemCount(SaSecurityItem.Params prm)
{
ClearErrorState();
return GetSecurityItemCount(GetSecurityItemQueryFilter(prm).Concat(" AND ", "(", ")"));
@@ -490,7 +510,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Security Item list.
public override List<SaSecurityItem> GetSecurityItemList (SaSecurityItem.Params prm)
public override List<SaSecurityItem> GetSecurityItemList(SaSecurityItem.Params prm)
{
List<SaSecurityItem> secItems = new List<SaSecurityItem>();
DbQuery qry = new DbQuery(Database.DbmsType);
@@ -528,7 +548,7 @@ namespace Sarand.Net.Standard.Dbas.Security
//-------------------------------------------------------------------
// Security Item Query.
public override DbResultSet ExecuteSecurityItemQuery (List<ColumnDfn> columns, SaSecurityItem.Params prm)
public override DbResultSet ExecuteSecurityItemQuery(List<ColumnDfn> columns, SaSecurityItem.Params prm)
{
ClearErrorState();
@@ -27,6 +27,14 @@ namespace Sarand.Net.Standard.Dbas.UpdateLog
Database = database;
updateLogMgr = new SaUpdateLogMgr_Dbas(this);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (updateLogMgr != null) updateLogMgr.Dispose(); updateLogMgr = null;
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace Sarand.Net.Standard.Data.Excel
namespace Sarand.Net.Standard.Proc.Excel
{
//=======================================================================
// MS Excel constant definitions.
@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Data.Excel
namespace Sarand.Net.Standard.Proc.Excel
{
//=======================================================================
// Definitions.
@@ -5,7 +5,7 @@ using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Data.Excel
namespace Sarand.Net.Standard.Proc.Excel
{
//=======================================================================
// Some Excel enumerated values are replaced with local integers or
@@ -9,10 +9,10 @@ using System.Threading.Tasks;
using System.Xml;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Data.Xml;
using Sarand.Net.Standard.Data.Zip;
using Sarand.Net.Standard.Proc.Xml;
using Sarand.Net.Standard.Proc.Zip;
namespace Sarand.Net.Standard.Data.Excel
namespace Sarand.Net.Standard.Proc.Excel
{
//=======================================================================
/// <summary>Style properties retrieved directly from spreadsheet xml data.</summary>
@@ -11,7 +11,7 @@ using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Data.Excel
namespace Sarand.Net.Standard.Proc.Excel
{
//=======================================================================
public class SaMsSpreadsheet_OpenXml : SaMsSpreadsheet
@@ -0,0 +1,887 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Proc.Xml;
using Sarand.Net.Standard.Proc.Zip;
namespace Sarand.Net.Standard.Proc.Excel
{
//=======================================================================
/// <summary>Excel spreadsheet read directly from xml data rather than via COM/Interop.</summary>
public class SaMsSpreadsheet_POI : SaMsSpreadsheet
{
//-------------------------------------------------------------------
// Data members.
internal class Workbook
{
internal SaMsZipArchive WorkbookArchive { get; set; }
internal SaMsXmlDocument WorkbookDoc { get; set; }
internal SaMsXmlDocument SharedStringsDoc { get; set; }
internal SaMsXmlDocument StylesDoc { get; set; }
internal uint WorksheetCount { get; set; }
internal uint ActiveSheetPos { get; set; }
internal bool IsValid () { return (WorkbookDoc != null && WorkbookDoc.GetRootElement() != null); }
}
private Workbook workbook;
private class Worksheet
{
internal uint WorksheetPos { get; set; }
internal uint WorksheetId { get; set; }
internal String WorksheetArchivePath { get; set; }
internal String WorksheetName { get; set; }
internal SaMsXmlDocument WorksheetDoc { get; set; }
internal uint ActiveColPos { get; set; }
internal uint ActiveRowPos { get; set; }
internal class NodesData
{
internal SaMsXmlElement Cols { get; set; }
internal SaMsXmlElement ActiveCol { get; set; }
internal SaMsXmlElement Rows { get; set; }
internal SaMsXmlElement ActiveRow { get; set; }
}
internal NodesData Nodes { get; } = new NodesData();
bool IsValid () { return (WorksheetDoc != null && WorksheetDoc.GetRootElement() != null); }
}
private Worksheet worksheet;
//-------------------------------------------------------------------
// Construction.
public SaMsSpreadsheet_POI () : base()
{
}
protected override void Dispose (bool disposing)
{
if (disposing)
{
CloseWorkbook();
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
// W o r k b o o k
//-------------------------------------------------------------------
public override bool IsWorkbookValid ()
{
return (workbook != null && workbook.IsValid());
}
public override bool CreateWorkbook ()
{
CloseWorkbook();
ClearErrorState();
// Create new workbook.
workbook = new Workbook();
workbook.WorkbookArchive = new SaMsZipArchive();
workbook.SharedStringsDoc = new SaMsXmlDocument();
workbook.StylesDoc = new SaMsXmlDocument();
return SetErrorState("Creating workbook not supported");
}
public override bool OpenWorkbook (String filePath)
{
CloseWorkbook();
ClearErrorState();
if (!File.Exists(filePath))
return SetErrorState("Workbook not found");
List<String> validExtensions = new List<string>() { /*".xls",*/ ".xlsx", ".xlsb", ".zip" };
String extension = Path.GetExtension(filePath);
if (!validExtensions.ContainsCI(Path.GetExtension(filePath)))
return SetErrorState("Invalid document type (expected xlsx/xlsb)");
try
{
// Open workbook document.
workbook = new Workbook();
workbook.WorkbookArchive = new SaMsZipArchive();
if (workbook.WorkbookArchive.OpenArchive(filePath))
{
ExtractWorkbookElementsFromArchive();
}
else return SetErrorState("Failed to open document: " + workbook.WorkbookArchive.ErrorStateMessage);
}
catch (Exception exc) { SetErrorState(ExceptionUtil.GetErrorStateMessage(exc)); }
return !HasErrorState();
}
public bool OpenWorkbook (byte[] workbookData)
{
CloseWorkbook();
ClearErrorState();
try
{
using (MemoryStream workbookStream = new MemoryStream(workbookData))
{
OpenWorkbook(workbookStream);
}
}
catch (Exception exc) { SetErrorState(ExceptionUtil.GetErrorStateMessage(exc)); }
return !HasErrorState();
}
public bool OpenWorkbook (Stream workbookStream)
{
CloseWorkbook();
ClearErrorState();
try
{
// From start of stream.
workbookStream.Seek(0, SeekOrigin.Begin);
// Open workbook document.
workbook = new Workbook();
workbook.WorkbookArchive = new SaMsZipArchive();
if (workbook.WorkbookArchive.OpenArchive(workbookStream))
{
ExtractWorkbookElementsFromArchive();
}
else return SetErrorState("Failed to open document: " + workbook.WorkbookArchive.ErrorStateMessage);
}
catch (Exception exc) { SetErrorState(ExceptionUtil.GetErrorStateMessage(exc)); }
return !HasErrorState();
}
private bool ExtractWorkbookElementsFromArchive ()
{
ClearErrorState();
try
{
// Extract the workbook data.
using (MemoryStream workbookFile = workbook.WorkbookArchive.ExtractFileToStream("xl/workbook.xml"))
{
if (workbookFile == null) return SetErrorState("Failed to load workbook data");
workbook.WorkbookDoc = new SaMsXmlDocument();
if (workbook.WorkbookDoc.LoadXml(workbookFile))
{
// Workbook successfully opened.
workbook.ActiveSheetPos = 1;
// Shared strings:
using (MemoryStream sharedStringsFile = workbook.WorkbookArchive.ExtractFileToStream("xl/sharedStrings.xml"))
{
if (sharedStringsFile != null)
{
workbook.SharedStringsDoc = new SaMsXmlDocument();
workbook.SharedStringsDoc.LoadXml(sharedStringsFile);
}
}
// Styles:
using (MemoryStream stylesFile = workbook.WorkbookArchive.ExtractFileToStream("xl/styles.xml"))
{
if (stylesFile != null)
{
workbook.StylesDoc = new SaMsXmlDocument();
workbook.StylesDoc.LoadXml(stylesFile);
}
}
// Set worksheet count and open first worksheet.
PopulateWorksheetCount();
OpenWorksheet(1);
}
else return SetErrorState("Failed to read workbook data");
}
}
catch (Exception exc) { SetErrorState(ExceptionUtil.GetErrorStateMessage(exc)); }
return !HasErrorState();
}
public override bool SaveDocument (String filePath, int fileFormat, bool bAutomaticallyOverwrite)
{
ClearErrorState();
if (fileFormat == 0)
fileFormat = (int)XlFileFormat.xlOpenXMLWorkbook;
if (fileFormat != (int)XlFileFormat.xlOpenXMLWorkbook)
SetErrorState("Unsupported file format: " + ((XlFileFormat)fileFormat).ToString());
if (!HasErrorState() && !workbook.IsValid())
SetErrorState("Workbook is not open");
SetErrorState("Saving workbook not supported");
return !HasErrorState();
}
public override bool CloseWorkbook ()
{
ClearErrorState();
CloseWorksheet();
// Clear workbook.
if (workbook != null)
{
try
{
if (workbook.StylesDoc != null) workbook.StylesDoc.Dispose(); workbook.StylesDoc = null;
if (workbook.SharedStringsDoc != null) workbook.SharedStringsDoc.Dispose(); workbook.SharedStringsDoc = null;
if (workbook.WorkbookDoc != null) workbook.WorkbookDoc.Dispose(); workbook.WorkbookDoc = null;
if (workbook.WorkbookArchive != null) workbook.WorkbookArchive.Dispose(); workbook.WorkbookArchive = null;
}
catch (Exception exc) { SetErrorState(ExceptionUtil.GetErrorStateMessage(exc)); }
workbook = null;
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// W o r k s h e e t
//-------------------------------------------------------------------
public override bool IsWorksheetValid ()
{
return (worksheet != null && worksheet.WorksheetDoc != null);
}
public override uint WorksheetCount { get { return workbook.WorksheetCount; } }
private void PopulateWorksheetCount ()
{
if (!IsWorkbookValid()) return;
try
{
// Count worksheets in workbook.
SaMsXmlElement nodeWorkbook = workbook.WorkbookDoc.GetRootElement();
SaMsXmlElement nodeSheets = nodeWorkbook.GetFirstChildElement("sheets");
workbook.WorksheetCount = (uint)nodeSheets.GetChildElements("sheet").Count;
}
catch (Exception exc) { HandleException("GetWorksheetCount", exc); }
}
public override bool SetWorksheetCount (int worksheetCount)
{
ClearErrorState();
return SetErrorState("Modifying workbook not supported");
}
public override bool AddWorksheet(String name)
{
return SetErrorState("Modifying workbook not supported");
}
public override bool RemoveWorksheet(uint worksheetPos)
{
return SetErrorState("Modifying workbook not supported");
}
public override bool OpenWorksheet (uint worksheetPos)
{
ClearErrorState();
if (!workbook.IsValid()) return SetErrorState("Workbook is not open");
if (worksheetPos > WorksheetCount) return SetErrorState("Invalid sheet specified");
if (worksheetPos <= 0) worksheetPos = Math.Max(1, workbook.ActiveSheetPos);
CloseWorksheet();
try
{
worksheet = new Worksheet();
// Locate worksheet in workbook by 0-index.
SaMsXmlElement workbookElement = workbook.WorkbookDoc.GetRootElement();
SaMsXmlElement sheetsElement = workbookElement.GetFirstChildElement("sheets");
long sheetCount = 0;
foreach (SaMsXmlElement sheetElement in sheetsElement.GetChildElements("sheet"))
{
sheetCount++;
if (sheetCount == worksheetPos)
{
// Extract the worksheet data.
uint sheetId = (uint)StringUtil.ToInt(sheetElement.GetAttributeValue("sheetId"));
String worksheetArchivePath = "xl/worksheets/sheet" + worksheetPos.ToString() + ".xml";
using (MemoryStream worksheetFile = workbook.WorkbookArchive.ExtractFileToStream(worksheetArchivePath))
{
if (worksheetFile == null) return SetErrorState("Failed to load worksheet data");
worksheet.WorksheetDoc = new SaMsXmlDocument();
if (worksheet.WorksheetDoc.LoadXml(worksheetFile))
{
workbook.ActiveSheetPos = worksheetPos;
worksheet.WorksheetPos = worksheetPos;
worksheet.WorksheetId = sheetId;
worksheet.WorksheetArchivePath = worksheetArchivePath;
worksheet.WorksheetName = sheetElement.GetAttributeValue("name");
worksheet.ActiveColPos = 1;
worksheet.ActiveRowPos = 1;
SaMsXmlElement nodeWorksheet = worksheet.WorksheetDoc.GetRootElement();
worksheet.Nodes.Cols = nodeWorksheet.GetFirstChildElement("cols");
worksheet.Nodes.ActiveCol = worksheet.Nodes.Cols.GetFirstChildElement("col");
worksheet.Nodes.Rows = nodeWorksheet.GetFirstChildElement("sheetData");
worksheet.Nodes.ActiveRow = worksheet.Nodes.Rows.GetFirstChildElement("row");
workbook.ActiveSheetPos = worksheetPos;
}
else return SetErrorState("Failed to read data for worksheet " + worksheetPos.ToString());
}
break;
}
}
if (worksheet.WorksheetDoc == null) return SetErrorState("Unable to load worksheet " + worksheetPos.ToString());
}
catch (Exception exc) { HandleException("OpenWorksheet", exc); }
return !HasErrorState();
}
public override uint WorksheetPos { get { return workbook.ActiveSheetPos; } }
public override String WorksheetName
{
get { return ""; }
set { }
}
public override bool SetWorksheetAttr (SaMsExcelItemAttr attr)
{
return SetErrorState("Not supported");
}
public override bool CloseWorksheet ()
{
ClearErrorState();
if (worksheet != null)
{
try
{
if (worksheet.WorksheetDoc != null) worksheet.WorksheetDoc.Dispose(); worksheet.WorksheetDoc = null;
if (worksheet.Nodes.Cols != null) worksheet.Nodes.Cols.Dispose(); worksheet.Nodes.Cols = null;
if (worksheet.Nodes.ActiveCol != null) worksheet.Nodes.ActiveCol.Dispose(); worksheet.Nodes.ActiveCol = null;
if (worksheet.Nodes.Rows != null) worksheet.Nodes.Rows.Dispose(); worksheet.Nodes.Rows = null;
if (worksheet.Nodes.ActiveRow != null) worksheet.Nodes.ActiveRow.Dispose(); worksheet.Nodes.ActiveRow = null;
}
catch (Exception exc) { SetErrorState(ExceptionUtil.GetErrorStateMessage(exc)); }
worksheet = null;
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Worksheet Page Setup.
public override bool SetPageSetup (SaMsExcelPageSetup_Config pageSetupConfig)
{
return SetErrorState("Not supported");
}
public override bool SetPageBreak (uint col, uint row)
{
return SetErrorState("Not supported");
}
//-------------------------------------------------------------------
// C o l u m n s
//-------------------------------------------------------------------
public override uint GetActiveColPos ()
{
return worksheet.ActiveColPos;
}
private SaMsXmlElement GetColElement (uint colPos)
{
ClearErrorState();
try
{
if (worksheet.ActiveColPos == colPos) return worksheet.Nodes.ActiveCol;
int colCount = 0;
foreach (SaMsXmlElement colElement in worksheet.Nodes.Cols.GetChildElements("Col"))
{
if (++colCount == colPos)
{
if (worksheet.Nodes.ActiveCol != null) worksheet.Nodes.ActiveCol.Dispose();
worksheet.ActiveColPos = colPos;
worksheet.Nodes.ActiveCol = colElement;
return colElement;
}
}
}
catch (Exception exc) { HandleException("GetColElement", exc); }
return new SaMsXmlElement(null);
}
public override double GetColWidth (uint colPos, SaExcelLogicalUnit unit = SaExcelLogicalUnit.Point)
{
ClearErrorState();
try
{
// Retrieve width (in points) from column.
SaMsXmlNode nodeCol = GetColElement(colPos);
double width = nodeCol.GetAttributeValue("width").ToDouble();
// Adjust for units.
if (unit == SaExcelLogicalUnit.Pixel) return PointsToPixels(width, false);
if (unit == SaExcelLogicalUnit.Cm) return PointsToCms(width);
if (unit == SaExcelLogicalUnit.Inch) return PointsToInches(width);
return width;
}
catch (Exception exc) { HandleException("GetColWidth", exc); }
return 0.0;
}
public override bool SetColWidth (uint colPos, double fWidth, SaExcelLogicalUnit unit = SaExcelLogicalUnit.Point)
{
return SetErrorState("Not supported");
}
//-------------------------------------------------------------------
// R o w s
//-------------------------------------------------------------------
public override uint GetActiveRowPos ()
{
return worksheet.ActiveRowPos;
}
SaMsXmlElement GetRowElement (uint rowPos)
{
ClearErrorState();
try
{
if (worksheet.ActiveRowPos == rowPos) return worksheet.Nodes.ActiveRow;
foreach (SaMsXmlElement rowElement in worksheet.Nodes.Rows.GetChildElements("row"))
{
if (rowElement.GetAttributeValue("r").ToLong() == rowPos)
{
if (worksheet.Nodes.ActiveRow != null) worksheet.Nodes.ActiveRow.Dispose();
worksheet.ActiveRowPos = rowPos;
worksheet.Nodes.ActiveRow = rowElement;
return rowElement;
}
}
}
catch (Exception exc) { HandleException("GetRowElement", exc); }
return new SaMsXmlElement(null);
}
public override double GetRowHeight (uint rowPos, SaExcelLogicalUnit unit = SaExcelLogicalUnit.Point)
{
ClearErrorState();
try
{
// Retrieve height (in points) from row.
SaMsXmlElement rowElement = GetRowElement(rowPos);
double height = rowElement.GetAttributeValue("ht").ToDouble();
// Adjust for units.
if (unit == SaExcelLogicalUnit.Pixel) return PointsToPixels(height, true);
if (unit == SaExcelLogicalUnit.Cm) return PointsToCms(height);
if (unit == SaExcelLogicalUnit.Inch) return PointsToInches(height);
return height;
}
catch (Exception exc) { HandleException("GetRowHeight", exc); }
return 0.0;
}
public override bool SetRowHeight (uint rowPos, double fHeight, SaExcelLogicalUnit unit = SaExcelLogicalUnit.Point)
{
return SetErrorState("Not supported");
}
//-------------------------------------------------------------------
// R o w s
//-------------------------------------------------------------------
public override List<DataValue> GetRowDataValues (uint rowPos, int maxColumns = 0)
{
ClearErrorState();
List<DataValue> values = new List<DataValue>();
try
{
SaMsXmlElement rowElement = GetRowElement(rowPos);
foreach (SaMsXmlElement cellElement in rowElement.GetChildElements("c"))
{
// CellId may be needed in case cells are skipped in the data.
// Doesn't appear to be the case, even when previous cell is merged with next.
String cellId = cellElement.GetAttributeValue("r");
values.Add(GetCellDataValue(cellElement));
if (maxColumns > 0 && values.Count >= maxColumns) break;
}
}
catch (Exception exc) { HandleException("GetRowDataValues", exc); }
return values;
}
//-------------------------------------------------------------------
// C e l l s
//-------------------------------------------------------------------
SaMsXmlElement GetCellElement (uint colPos, uint rowPos)
{
ClearErrorState();
String cellId = GetCellId(colPos,rowPos);
try
{
SaMsXmlElement rowElement = GetRowElement(rowPos);
foreach (SaMsXmlElement cellElement in rowElement.GetChildElements("c"))
{
if (cellElement.GetAttributeValue("r").EqualsCI(cellId))
return cellElement;
}
}
catch (Exception exc) { HandleException("GetCellElement", exc); }
return new SaMsXmlElement(null);
}
public override void SetActiveCell (uint colPos, uint rowPos)
{
// ToDo SetActiveCell.
SetErrorState("Not supported");
}
//-------------------------------------------------------------------
private bool IsCellFormula (uint colPos, uint rowPos)
{
ClearErrorState();
bool bIsFormula = false;
try
{
SaMsXmlElement cellElement = GetCellElement(colPos,rowPos);
bIsFormula = !cellElement.GetAttributeValue("f").IsEmpty();
}
catch (Exception exc) { HandleException("IsCellFormula", exc); }
return bIsFormula;
}
private bool IsCellNumeric (uint colPos, uint rowPos)
{
ClearErrorState();
try
{
SaMsXmlElement cellElement = GetCellElement(colPos,rowPos);
SaMsExcelStyle cellStyle = GetCellStyle(cellElement);
return IsCellNumeric(cellElement, cellStyle);
}
catch (Exception exc) { HandleException("IsCellNumeric", exc); }
return false;
}
private bool IsCellNumeric (SaMsXmlElement cellElement)
{
ClearErrorState();
SaMsExcelStyle cellStyle = GetCellStyle(cellElement);
return IsCellNumeric(cellElement, cellStyle);
}
private bool IsCellNumeric (SaMsXmlElement cellElement, SaMsExcelStyle cellStyle)
{
ClearErrorState();
return (cellElement.GetAttributeValue("t").IsEmpty() && !IsDateTimeStyle(cellStyle.NumFmtCode));
}
private bool IsCellDate (uint colPos, uint rowPos)
{
ClearErrorState();
bool bIsDate = false;
try
{
SaMsXmlElement cellElement = GetCellElement(colPos,rowPos);
SaMsExcelStyle cellStyle = GetCellStyle(cellElement);
return IsCellDate(cellElement, cellStyle);
}
catch (Exception exc) { HandleException("IsCellDate", exc); }
return bIsDate;
}
private bool IsCellDate (SaMsXmlElement cellElement)
{
return IsCellDate(cellElement, GetCellStyle(cellElement));
}
private bool IsCellDate (SaMsXmlElement cellElement, SaMsExcelStyle cellStyle)
{
ClearErrorState();
return IsDateTimeStyle(cellStyle.NumFmtCode);
}
//-------------------------------------------------------------------
public override String GetCellFormula (uint colPos, uint rowPos)
{
ClearErrorState();
try
{
SaMsXmlElement cellElement = GetCellElement(colPos,rowPos);
String formula = cellElement.GetAttributeValue("f");
if (formula.IsEmpty())
formula = GetCellText(cellElement, true);
return formula;
}
catch (Exception exc) { HandleException("GetCellFormula", exc); }
return "";
}
private String GetCellText (SaMsXmlElement cellElement, bool trimValue = true)
{
ClearErrorState();
String value = "";
try
{
if (cellElement.GetAttributeValue("t").EqualsCI("s"))
value = GetSharedString(cellElement);
else
value = cellElement.GetChildText("v");
if (trimValue) value.TrimAll();
}
catch (Exception exc) { HandleException("GetCellText", exc); }
return value;
}
public override DataValue GetCellDataValue (uint colPos, uint rowPos)
{
return GetCellDataValue(GetCellElement(colPos, rowPos), false);
}
private DataValue GetCellDataValue (SaMsXmlElement cellElement, bool trimTextValue = true)
{
ClearErrorState();
try
{
SaMsExcelStyle cellStyle = GetCellStyle(cellElement);
if (cellElement.GetAttributeValue("t").EqualsCI("s"))
{
String value = GetSharedString(cellElement);
if (trimTextValue) value = value.TrimAll();
return new DataValue(value);
}
else
{
String value = cellElement.GetChildText("v");
if (IsDateTimeStyle(cellStyle.NumFmtCode))
return new DataValue(DateTime.FromOADate(value.ToDouble()));
if (IsCellNumeric(cellElement, cellStyle))
{
if (value.IsNumeric())
return new DataValue(value.ToLong());
if (value.IsDecimal())
{
#if DEBUG
//if (StringUtil.ToInt(value) > 600) Debugger.Break();
#endif
return new DataValue(value.ToDecimal());
}
}
if (trimTextValue) value = value.TrimAll();
return new DataValue(value);
}
}
catch (Exception exc) { HandleException("GetCellDataValue", exc); }
return new DataValue();
}
//-------------------------------------------------------------------
// Shared string for cell.
private String GetSharedString (SaMsXmlElement nodeElement)
{
ClearErrorState();
try
{
SaMsXmlElement sharedStringElement = GetSharedStringElement(nodeElement);
return sharedStringElement.GetChildText("t");
}
catch (Exception exc) { HandleException("GetSharedString", exc); }
return "";
}
private SaMsXmlElement GetSharedStringElement (SaMsXmlElement cellElement)
{
ClearErrorState();
if (workbook.SharedStringsDoc == null || cellElement == null || !cellElement.Valid) return null;
if (!cellElement.GetAttributeValue("t").EqualsCI("s") || !cellElement.GetChildText("v").IsNumeric()) return null;
// Shared strings are indexed from 0.
long sharedStringIdx = -1;
try
{
long iIdx = cellElement.GetChildText("v").ToLong();
SaMsXmlElement sstElement = workbook.SharedStringsDoc.GetRootElement();
foreach (SaMsXmlElement siElement in sstElement.GetChildElements("si"))
{
if (++sharedStringIdx == iIdx)
return siElement;
}
}
catch (Exception exc) { HandleException("GetSharedStringNode", exc); }
return new SaMsXmlElement(null);
}
//-------------------------------------------------------------------
public override bool SetCellFormula (uint colPos, uint rowPos, String value)
{
return SetErrorState("Not supported");
}
public override bool SetCellFormula (uint colPos, uint rowPos, String value, SaMsExcelItemAttr attr)
{
return SetErrorState("Not supported");
}
public override bool SetRowFormulas (uint colPosStart, uint rowPos, List<Object> values)
{
return SetErrorState("Not supported");
}
public override bool SetRangeFormulas (SaMsExcelRange range, List<Object> values)
{
return SetErrorState("Not supported");
}
//-------------------------------------------------------------------
// C e l l S t y l e
//-------------------------------------------------------------------
private String GetBuiltInStyleFormat (int numFmtId)
{
// Ref. http://stackoverflow.com/questions/4730152/what-indicates-an-office-open-xml-cell-contains-a-date-time-value
switch (numFmtId)
{
//
case 0: return "General";
case 1: return "0";
case 2: return "0.00";
case 3: return "#,##0";
case 4: return "#,##0.00";
//
case 9: return "0%";
case 10: return "0.00%";
case 11: return "0.00E+00";
case 12: return "# ?/?";
case 13: return "# ??/??";
case 14: return "mm-dd-yy";
case 15: return "d-mmm-yy";
case 16: return "d-mmm";
case 17: return "mmm-yy";
case 18: return "h:mm AM/PM";
case 19: return "h:mm:ss AM/PM";
case 20: return "h:mm";
case 21: return "h:mm:ss";
case 22: return "m/d/yy h:mm";
//
case 37: return "#,##0 ;(#,##0)";
case 38: return "#,##0 ;[Red](#,##0)";
case 39: return "#,##0.00;(#,##0.00)";
case 40: return "#,##0.00;[Red](#,##0.00)";
//
case 44: return "_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)";
case 45: return "mm:ss";
case 46: return "[h]:mm:ss";
case 47: return "mmss.0";
case 48: return "##0.0E+0";
case 49: return "@";
//
case 27: return "[$-404]e/m/d";
case 30: return "m/d/yy";
case 36: return "[$-404]e/m/d";
case 50: return "[$-404]e/m/d";
case 57: return "[$-404]e/m/d";
//
case 59: return "t0";
case 60: return "t0.00";
case 61: return "t#,##0";
case 62: return "t#,##0.00";
case 67: return "t0%";
case 68: return "t0.00%";
case 69: return "t# ?/?";
case 70: return "t# ??/??";
}
return "";
}
private SaMsExcelStyle GetCellStyle (SaMsXmlElement cellElement)
{
ClearErrorState();
SaMsExcelStyle style = new SaMsExcelStyle();
if (workbook.SharedStringsDoc == null || cellElement == null || !cellElement.Valid || !cellElement.GetAttributeValue("s").IsNumeric()) return style;
// Styles are indexed from 0.
long styleIdx = -1;
try
{
long cellStyleIdx = cellElement.GetAttributeValue("s").ToLong();
SaMsXmlElement styleSheetElement = workbook.SharedStringsDoc.GetRootElement();
SaMsXmlElement cellXfsElement = styleSheetElement.GetFirstChildElement("cellXfs");
foreach (SaMsXmlElement xfElement in styleSheetElement.GetChildElements("xf"))
{
if (++styleIdx == cellStyleIdx)
{
// Construct style.
style.NumFmtId = (int)xfElement.GetAttributeValue("numFmtId").ToLong();
style.FontId = (int)xfElement.GetAttributeValue("fontId").ToLong();
style.FillId = (int)xfElement.GetAttributeValue("fillId").ToLong();
style.BorderId = (int)xfElement.GetAttributeValue("borderId").ToLong();
style.XfId = (int)xfElement.GetAttributeValue("xfId").ToLong();
style.QuotePrefix = xfElement.GetAttributeValue("quotePrefix").ToBool();
style.PivotButton = xfElement.GetAttributeValue("pivotButton").ToBool();
style.ApplyNumberFormat = xfElement.GetAttributeValue("applyNumberFormat").ToBool();
style.ApplyFont = xfElement.GetAttributeValue("applyFont").ToBool();
style.ApplyFill = xfElement.GetAttributeValue("applyFill").ToBool();
style.ApplyBorder = xfElement.GetAttributeValue("applyBorder").ToBool();
style.ApplyAlignment = xfElement.GetAttributeValue("applyAlignment").ToBool();
style.ApplyProtection = xfElement.GetAttributeValue("applyProtection").ToBool();
// Alignment.
SaMsXmlNode nodeAlignment = xfElement.GetFirstChildElement("alignment");
String sAlignHorizontal = nodeAlignment.GetAttributeValue("horizontal");
if (sAlignHorizontal.EqualsCI("center")) style.AlignHorizontal = XlHAlign.xlHAlignCenter;
else if (sAlignHorizontal.EqualsCI("centerContinuous")) style.AlignHorizontal = XlHAlign.xlHAlignCenterAcrossSelection;
else if (sAlignHorizontal.EqualsCI("distributed")) style.AlignHorizontal = XlHAlign.xlHAlignDistributed;
else if (sAlignHorizontal.EqualsCI("fill")) style.AlignHorizontal = XlHAlign.xlHAlignFill;
else if (sAlignHorizontal.EqualsCI("justify")) style.AlignHorizontal = XlHAlign.xlHAlignJustify;
else if (sAlignHorizontal.EqualsCI("left")) style.AlignHorizontal = XlHAlign.xlHAlignLeft;
else if (sAlignHorizontal.EqualsCI("right")) style.AlignHorizontal = XlHAlign.xlHAlignRight;
String sAlignVertical = nodeAlignment.GetAttributeValue("vertical");
if (sAlignVertical.EqualsCI("center")) style.AlignVertical = XlVAlign.xlVAlignCenter;
else if (sAlignVertical.EqualsCI("top")) style.AlignVertical = XlVAlign.xlVAlignTop;
else if (sAlignVertical.EqualsCI("bottom")) style.AlignVertical = XlVAlign.xlVAlignBottom;
else if (sAlignVertical.EqualsCI("distributed")) style.AlignVertical = XlVAlign.xlVAlignDistributed;
else if (sAlignVertical.EqualsCI("justify")) style.AlignVertical = XlVAlign.xlVAlignJustify;
// Number format.
if (style.ApplyNumberFormat)
{
if (style.NumFmtId >= 164)
{
SaMsXmlElement numFmtsElement = styleSheetElement.GetFirstChildElement("NumFmts");
foreach (SaMsXmlElement numFmtElement in numFmtsElement.GetChildElements("numFmt"))
{
if (numFmtElement.GetAttributeValue("numFmtId").ToLong() == style.NumFmtId)
{
style.NumFmtCode = numFmtElement.GetAttributeValue("formatCode");
break;
}
}
}
else style.NumFmtCode = GetBuiltInStyleFormat(style.NumFmtId);
}
// Font.
if (style.ApplyFont)
{
}
// Fill.
if (style.ApplyFill)
{
}
// Borders.
if (style.ApplyBorder)
{
}
// Alignment.
if (style.ApplyAlignment)
{
}
// Protection.
if (style.ApplyProtection)
{
}
break;
}
}
}
catch (Exception exc) { HandleException("GetStyleNode", exc); }
return style;
}
private bool IsDateStyle (String numFormat)
{
// Ref. http://stackoverflow.com/questions/19034805/how-to-distinguish-inline-numbers-from-ole-automation-date-numbers-in-openxml-sp/19582685#19582685
if (IsTimeStyle(numFormat)) return false;
if (numFormat.Contains("d")) return true;
if (numFormat.Contains("m")) return true;
if (numFormat.Contains("y")) return true;
return false;
}
private bool IsTimeStyle (String numFormat)
{
if (numFormat.Contains("h")) return true;
if (numFormat.Contains(":mm")) return true;
if (numFormat.Contains("mm:")) return true;
if (numFormat.Contains(":ss")) return true;
return false;
}
private bool IsDateTimeStyle (String numFormat)
{
return (IsDateStyle(numFormat) || IsTimeStyle(numFormat));
}
//-------------------------------------------------------------------
// Cell attributes.
public override bool SetRangeAttr (SaMsExcelRange range, SaMsExcelItemAttr attr)
{
return SetErrorState("Not supported");
}
//-------------------------------------------------------------------
// Add image to sheet.
public override bool InsertImage (SaMsExcelImage_Config imageConfig)
{
return SetErrorState("Not supported");
}
//-------------------------------------------------------------------
public override bool FreezePanes (uint colPos, uint rowPos)
{
return SetErrorState("Not supported");
}
//-------------------------------------------------------------------
public override bool AutoFit (SaMsExcelRange range)
{
return SetErrorState("Not supported");
}
//-------------------------------------------------------------------
public override bool SelectRange (SaMsExcelRange range)
{
return SetErrorState("Not supported");
}
//-------------------------------------------------------------------
}
//=======================================================================
}
+65
View File
@@ -0,0 +1,65 @@
using Sarand.Net.Standard.Base.Procs;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Sarand.Net.Standard.Proc.Procs
{
//=======================================================================
public abstract class SaProcess : SaProcess_Base
{
//-------------------------------------------------------------------
// Definitions.
public new class Config : SaProcess_Base.Config
{
protected Config() : base()
{ }
}
//-------------------------------------------------------------------
// Data members.
private Config config;
//-------------------------------------------------------------------
// Construction.
protected SaProcess(Config config) :
base(config)
{
this.config = config;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
// Utilities.
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// Run asynchronous.
//-------------------------------------------------------------------
public bool RunAsync()
{
// Run on separate thread.
Thread thread = new Thread(new ThreadStart(RunOnThread));
thread.IsBackground = true;
thread.Start();
return true;
}
private void RunOnThread()
{
RunProcess();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -6,7 +6,7 @@ using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Data.Xml
namespace Sarand.Net.Standard.Proc.Xml
{
//=======================================================================
public class SaMsXmlDocument : SaErrorStateItem
@@ -8,7 +8,7 @@ using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Data.Xml
namespace Sarand.Net.Standard.Proc.Xml
{
//=======================================================================
public class SaMsXmlElement : SaMsXmlNode
@@ -8,7 +8,7 @@ using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Data.Xml
namespace Sarand.Net.Standard.Proc.Xml
{
//=======================================================================
public class SaMsXmlNode : SaErrorStateItem
@@ -8,7 +8,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace Sarand.Net.Standard.Data.Xml
namespace Sarand.Net.Standard.Proc.Xml
{
//=======================================================================
public class SaXmlNamespace
@@ -9,7 +9,7 @@ using System.IO.Compression;
using System.Linq;
using System.Text;
namespace Sarand.Net.Standard.Data.Zip
namespace Sarand.Net.Standard.Proc.Zip
{
//=======================================================================
public class SaMsZipArchive : SaErrorStateItem
@@ -6,7 +6,7 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="Data\Word\" />
<Folder Include="Proc\Word\" />
</ItemGroup>
<ItemGroup>