2023-05-24 04:16:07 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
|
|
|
|
namespace ITC81DB_0H.Part11_UserManager
|
|
|
|
|
{
|
|
|
|
|
public partial class UserManager
|
|
|
|
|
{
|
|
|
|
|
#region Field
|
|
|
|
|
// fnUserMgrDebugCB
|
|
|
|
|
public const int USERMGR_DBG_NORMAL = 0x0001;
|
|
|
|
|
public const int USERMGR_DBG_THREAD = 0x0002;
|
|
|
|
|
public const int USERMGR_DBG_LIST = 0x0004;
|
|
|
|
|
|
|
|
|
|
// fnUserMgrLoginCB
|
|
|
|
|
public const int USERMGR_LOGIN_STATUS_OK = 0x00;
|
|
|
|
|
public const int USERMGR_LOGIN_STATUS_ID_FAIL = 0x01;
|
|
|
|
|
public const int USERMGR_LOGIN_STATUS_PW_FAIL = 0x02;
|
|
|
|
|
|
|
|
|
|
// fnUserMgrLogoutCB
|
|
|
|
|
public const int USERMGR_LOGOUT_STATUS_OK = 0x00;
|
|
|
|
|
public const int USERMGR_LOGOUT_STATUS_FAIL = 0x01;
|
|
|
|
|
|
|
|
|
|
// fnUserMgrDelUserCB
|
|
|
|
|
//public const int USERMGR_DEL_STATUS_OK = 0x00;
|
|
|
|
|
//public const int USERMGR_DEL_STATUS_NOK = 0x01;
|
|
|
|
|
|
|
|
|
|
// lock_status
|
|
|
|
|
public const int USERMGR_LOCK_STATUS_NONE = 0x00;
|
|
|
|
|
public const int USERMGR_LOCK_STATUS_EXPIRE = 0x01;
|
|
|
|
|
|
|
|
|
|
public const int USERMGR_ID_MIN_LENGTH = 6;
|
|
|
|
|
public const int UERRMGR_ID_MAX_LENGTH = 20;
|
|
|
|
|
|
|
|
|
|
public const int USERMGR_PW_MIN_LENGTH = 6;
|
|
|
|
|
public const int USERMGR_PW_MAX_LENGTH = 20;
|
|
|
|
|
|
|
|
|
|
public const int MAX_USER_ID_LENGTH = 32;
|
|
|
|
|
public const int MAX_USER_PW_LEGNTH = 32;
|
|
|
|
|
public const int MAX_USER_HISTORY_PW_COUNT = 3;
|
|
|
|
|
|
|
|
|
|
public const int INVALID_VALUE = -1;
|
|
|
|
|
public const int USERMGR_USER_ADMINISTRATOR = 1;
|
|
|
|
|
public const int USERMGR_USER_NORMAL = 0;
|
|
|
|
|
|
|
|
|
|
public const int EXPIRE_PERIOD_PASSWORD_NOT_SUPPORT = 0;
|
|
|
|
|
public const int MAX_EXPIRE_PERIOD_PASSWORD = 90;
|
|
|
|
|
public const int DEFAULT_PASSWORD_EXPIRE_PERIOD = 90; // Days password change
|
|
|
|
|
|
|
|
|
|
public const int EXPIRE_PERIOD_ACCOUNT_NOT_SUPPORT = 0;
|
|
|
|
|
public const int MAX_EXPIRE_PERIOD_ACCOUNT = 180;
|
|
|
|
|
public const int DEFAULT_ACCOUNT_LOCK_PERIOD = 180; // Days login
|
|
|
|
|
|
|
|
|
|
public const int MAX_LOGIN_AUTO_TIMEOUT = 90;
|
|
|
|
|
public const int DEFAULT_LOGIN_WARNING_TIMEOUT_SEC = 60; // 60 sec during login, auto logout warning time
|
|
|
|
|
public const int DEFAULT_LOGIN_AUTO_TIMEOUT_MIN = 30; // 30 min during login, auto logout timeout
|
|
|
|
|
|
|
|
|
|
public const int USER_MENU_ID_MAX = 30; // MenuID_t buffer Size
|
|
|
|
|
|
|
|
|
|
public const int MAX_ACTIVE_LEVEL = 10; // menu active level
|
|
|
|
|
public const int INVALID_ACTIVE_LEVEL = 0;
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Enum E_user_mgr_status
|
|
|
|
|
public enum E_user_mgr_status
|
|
|
|
|
{
|
|
|
|
|
USER_MGR_STATUS_OK = 0x00,
|
|
|
|
|
|
|
|
|
|
// error status
|
2023-09-15 08:04:07 +00:00
|
|
|
|
USER_MGR_STATUS_ID_NOT_FOUND, // 1 - not found the user id
|
|
|
|
|
USER_MGR_STATUS_ID_DUPLICATE, // 2 - duplicate on id
|
|
|
|
|
USER_MGR_STATUS_ID_LENGTH_UNDER, // 3 - under the minimum length of id
|
|
|
|
|
USER_MGR_STATUS_ID_LENGTH_OVER, // 4 - over the maximum length of id
|
|
|
|
|
USER_MGR_STATUS_ID_CONT_LETTER, // 5 - continue characters or duplicate characters of id
|
|
|
|
|
USER_MGR_STATUS_ID_INVALID_CHAR, // 6 - include the invalid character on id
|
|
|
|
|
USER_MGR_STATUS_ID_ACCOUNT_LOCK, // 7 - Account Lock
|
|
|
|
|
|
|
|
|
|
USER_MGR_STATUS_PW_DUPLICATE_HISTORY, // 8 - duplicate on password history
|
|
|
|
|
USER_MGR_STATUS_PW_LENGTH_UNDER, // 9 - under the minimum length of password
|
|
|
|
|
USER_MGR_STATUS_PW_LENGTH_OVER, // 10 - over the maximum length of password
|
|
|
|
|
USER_MGR_STATUS_PW_CONT_LETTER, // 11 - continue characters or duplicate characters of password
|
|
|
|
|
USER_MGR_STATUS_PW_INVALID_CHAR, // 12 - include the invalid character on password
|
|
|
|
|
USER_MGR_STATUS_PW_EACH_MIN_CHAR, // 13 - not include minimum characters on password
|
|
|
|
|
USER_MGR_STATUS_PW_NOT_SAME, // 14 - password error
|
|
|
|
|
USER_MGR_STATUS_PW_PASSWORD_LOCK, // 15 - Password Lock
|
|
|
|
|
|
|
|
|
|
USER_MGR_STATUS_OTHER_OVER_PASSWORD_PERIOD, // 16 - over maximum password expire period (days)
|
|
|
|
|
USER_MGR_STATUS_OTHER_OVER_ACCOUNT_PERIOD, // 17 - over maximum account expire period (days)
|
|
|
|
|
USER_MGR_STATUS_OTHER_OVER_LOGIN_TIMEOUT, // 18 - over maximum auto logout time (minute)
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
USER_MGR_STATUS_MAX,
|
2023-09-15 08:04:07 +00:00
|
|
|
|
};
|
2023-05-24 04:16:07 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Enum E_user_mgr_menu_id
|
|
|
|
|
public enum E_user_mgr_menu_id
|
|
|
|
|
{
|
|
|
|
|
USER_MENU_ID_RESERVE_0 = 0x00,
|
|
|
|
|
USER_MENU_ID_RESERVE_1,
|
|
|
|
|
USER_MENU_ID_RESERVE_2,
|
|
|
|
|
USER_MENU_ID_RESERVE_3,
|
|
|
|
|
USER_MENU_ID_RESERVE_4,
|
|
|
|
|
|
|
|
|
|
USER_MENU_ID_RESERVE_5,
|
|
|
|
|
USER_MENU_ID_RESERVE_6,
|
|
|
|
|
USER_MENU_ID_RESERVE_7,
|
|
|
|
|
USER_MENU_ID_RESERVE_8,
|
|
|
|
|
USER_MENU_ID_RESERVE_9,
|
|
|
|
|
|
|
|
|
|
USER_MENU_ID_RESERVE_10,
|
|
|
|
|
USER_MENU_ID_RESERVE_11,
|
|
|
|
|
USER_MENU_ID_RESERVE_12,
|
|
|
|
|
USER_MENU_ID_RESERVE_13,
|
|
|
|
|
USER_MENU_ID_RESERVE_14,
|
|
|
|
|
|
|
|
|
|
USER_MENU_ID_RESERVE_15,
|
|
|
|
|
USER_MENU_ID_RESERVE_16,
|
|
|
|
|
USER_MENU_ID_RESERVE_17,
|
|
|
|
|
USER_MENU_ID_RESERVE_18,
|
|
|
|
|
USER_MENU_ID_RESERVE_19,
|
|
|
|
|
|
|
|
|
|
USER_MENU_ID_RESERVE_20,
|
|
|
|
|
USER_MENU_ID_RESERVE_21,
|
|
|
|
|
USER_MENU_ID_RESERVE_22,
|
|
|
|
|
USER_MENU_ID_RESERVE_23,
|
|
|
|
|
USER_MENU_ID_RESERVE_24,
|
|
|
|
|
|
|
|
|
|
USER_MENU_ID_RESERVE_25,
|
|
|
|
|
USER_MENU_ID_RESERVE_26,
|
|
|
|
|
USER_MENU_ID_RESERVE_27,
|
|
|
|
|
USER_MENU_ID_RESERVE_28,
|
|
|
|
|
USER_MENU_ID_RESERVE_29,
|
|
|
|
|
USER_MENU_ID_MAX,
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct MenuID_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
public struct MenuID_t
|
|
|
|
|
{
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)E_user_mgr_menu_id.USER_MENU_ID_MAX)]
|
|
|
|
|
public bool[] fMenu;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct DateTime_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
public struct DateTime_t
|
|
|
|
|
{
|
|
|
|
|
[MarshalAs(UnmanagedType.U2)]
|
|
|
|
|
public UInt16 year;
|
|
|
|
|
[MarshalAs(UnmanagedType.U1)]
|
|
|
|
|
public byte month;
|
|
|
|
|
[MarshalAs(UnmanagedType.U1)]
|
|
|
|
|
public byte day;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.U1)]
|
|
|
|
|
public byte hour;
|
|
|
|
|
[MarshalAs(UnmanagedType.U1)]
|
|
|
|
|
public byte minute;
|
|
|
|
|
[MarshalAs(UnmanagedType.U1)]
|
|
|
|
|
public byte second;
|
|
|
|
|
[MarshalAs(UnmanagedType.U1)]
|
|
|
|
|
public byte reserved;
|
|
|
|
|
|
|
|
|
|
public static int Size
|
|
|
|
|
{
|
|
|
|
|
get { return (int)(sizeof(UInt16) + 6); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetDate(UInt16 year, byte month, byte day)
|
|
|
|
|
{
|
|
|
|
|
this.year = year;
|
|
|
|
|
this.month = month;
|
|
|
|
|
this.day = day;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetTime(byte hour, byte minute, byte second)
|
|
|
|
|
{
|
|
|
|
|
this.hour = hour;
|
|
|
|
|
this.minute = minute;
|
|
|
|
|
this.second = second;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string GetDateTime()
|
|
|
|
|
{
|
|
|
|
|
string dateTime;
|
|
|
|
|
|
|
|
|
|
dateTime = string.Format("{0:D4}{1:D2}{2:D2}{3:D2}{4:D2}{5:D2}", year, month, day, hour, minute, second);
|
|
|
|
|
|
|
|
|
|
return dateTime;
|
|
|
|
|
}
|
2023-09-15 08:04:07 +00:00
|
|
|
|
}
|
2023-05-24 04:16:07 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct UserMgr_user_info_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
|
|
|
public struct UserMgr_user_info_t
|
|
|
|
|
{
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
|
|
|
public Int32 status; // user_new_add_status_e
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)]
|
|
|
|
|
public string user_id;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_PW_LEGNTH)]
|
|
|
|
|
public string user_pw;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
|
|
|
public Int32 fadmin;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public Int32 password_expire_period; // password lock date
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public Int32 id_expire_period; // id lock date
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public Int32 id_flock_status; // user ID (account) lock status
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public Int32 password_flock_status; // password lock status (need to change password)
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public DateTime_t password_register_date; // date/time when the user password was registered or changed
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public DateTime_t id_login_date; // date/time when the user was login
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public DateTime_t password_expire_date; // Password Expiration Date
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public DateTime_t id_expire_date; // Account Expiration Date
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public MenuID_t menuID; // flag of Menu IDs
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public Int32 active_level; // menu active level : max : MAX_ACTIVE_LEVEL
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
|
|
|
public Int32 fFirstPW; // [1] First (request to modify), [0] Next (not request)
|
|
|
|
|
}
|
2023-05-24 04:16:07 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct UserMgr_user_modify_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
|
|
|
public struct UserMgr_user_modify_t
|
|
|
|
|
{
|
|
|
|
|
public int status;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)]
|
|
|
|
|
public string user_id;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct UserMgr_user_del_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
|
|
|
public struct UserMgr_user_del_t
|
|
|
|
|
{
|
|
|
|
|
public int status;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)]
|
|
|
|
|
public string user_id;
|
2023-09-15 08:04:07 +00:00
|
|
|
|
}
|
2023-05-24 04:16:07 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct UserMgr_login_timeout_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
|
|
|
public struct UserMgr_login_timeout_t
|
|
|
|
|
{
|
|
|
|
|
public int remainder_time;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)]
|
|
|
|
|
public string user_id;
|
2023-09-15 08:04:07 +00:00
|
|
|
|
}
|
2023-05-24 04:16:07 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct UserMgr_user_add_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
|
|
|
public struct UserMgr_user_add_t
|
|
|
|
|
{
|
|
|
|
|
public int status;
|
|
|
|
|
public int flock_status_account;
|
|
|
|
|
public int flock_status_password;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)]
|
|
|
|
|
public string user_id;
|
2023-09-15 08:04:07 +00:00
|
|
|
|
}
|
2023-05-24 04:16:07 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct UserMgr_user_lock_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
|
|
|
public struct UserMgr_user_lock_t
|
|
|
|
|
{
|
|
|
|
|
public int flock_status_account;
|
|
|
|
|
public int flock_status_password;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)]
|
|
|
|
|
public string user_id;
|
2023-09-15 08:04:07 +00:00
|
|
|
|
}
|
2023-05-24 04:16:07 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct UserMgr_user_list_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
|
|
|
public struct UserMgr_user_list_t
|
|
|
|
|
{
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
|
|
|
public int status; // user_new_add_status_e
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
|
|
|
public int total_count;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
|
|
|
public int index;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)]
|
|
|
|
|
public string user_id;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_PW_LEGNTH)]
|
|
|
|
|
public string user_pw;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
|
|
|
public Int32 fadmin;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public Int32 password_expire_period; // password lock
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public Int32 id_expire_period; // account lock
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public Int32 id_flock_status; // user ID (account) lock
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
|
|
|
public Int32 flock_status_password; // password lock (need to change password)
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public DateTime_t password_register_date; // date/time when the user password was registered or changed
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public DateTime_t id_login_date; // date/time when the user was login
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public DateTime_t password_expire_date; // Password Expiration Date
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public DateTime_t id_expire_date; // Account Expiration Date
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public Int32 active_level; // menu active level : max : MAX_ACTIVE_LEVEL
|
2023-05-24 04:16:07 +00:00
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.Struct)]
|
2023-09-15 08:04:07 +00:00
|
|
|
|
public MenuID_t menuID; // flag of Menu IDs
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
|
|
|
public Int32 fFirstPW; // flag first password
|
|
|
|
|
}
|
2023-05-24 04:16:07 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Struct UserMgr_user_list_name_t
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
|
|
|
public struct UserMgr_user_list_name_t
|
|
|
|
|
{
|
|
|
|
|
public int total_count;
|
|
|
|
|
public int index;
|
|
|
|
|
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)]
|
|
|
|
|
public string user_id;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|