commit 5b5684cd4349601f134ade14f400bc509ca1dfeb Author: Leonmmcoset Date: Fri Jan 30 21:55:35 2026 +0800 update diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6fc8224 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Build output +bin/ +obj/ + +# IDE files +.vs/ +*.suo +*.user +*.sln.docstates + +# Cosmos specific files +*.vmdk +*.iso +*.img + +# Log files +*.log + +# Temporary files +*.tmp +*.temp + +# OS generated files +Thumbs.db +.DS_Store + +# Package manager files +packages/ +.nuget/ + +# Environment variables +.env + +# Test results +TestResults/ +coverage/ + +# Documentation +*.rst + +# Backup files +*.bak +*.old + +# Misc +*.swp +*~ +.project +.classpath +.c9/ +.settings/ + +# Debug files +*.pdb +*.mdb + +# Release files +*.release diff --git a/CMLeonOS.csproj b/CMLeonOS.csproj new file mode 100644 index 0000000..0d3e417 --- /dev/null +++ b/CMLeonOS.csproj @@ -0,0 +1,30 @@ + + + + net6.0 + + cosmos + false + True + AnyCPU;x64 + Debug;Release;Release (Fixed) + + + + False + False + Pipe: Cosmos\Serial + Serial: COM1 + VMware + VMware + Use VMware Player or Workstation to deploy and debug. + 192.168.0.8 + + + + + + + + + diff --git a/CMLeonOS.sln b/CMLeonOS.sln new file mode 100644 index 0000000..c30a3bf --- /dev/null +++ b/CMLeonOS.sln @@ -0,0 +1,24 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CMLeonOS", "CMLeonOS.csproj", "{6C1B2895-8108-62B7-CBCE-014DEA155AB7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6C1B2895-8108-62B7-CBCE-014DEA155AB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C1B2895-8108-62B7-CBCE-014DEA155AB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C1B2895-8108-62B7-CBCE-014DEA155AB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C1B2895-8108-62B7-CBCE-014DEA155AB7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AE8E1CEA-FDF5-449C-9B1D-477E510A120A} + EndGlobalSection +EndGlobal diff --git a/CUI.cs b/CUI.cs new file mode 100644 index 0000000..5256519 --- /dev/null +++ b/CUI.cs @@ -0,0 +1,158 @@ +using System; + +namespace CMLeonOS +{ + public class CUI + { + private string title; + private string status; + private ConsoleColor backgroundColor; + private ConsoleColor textColor; + + public CUI(string title = "CMLeonOS") + { + this.title = title; + this.status = "Ready"; + this.backgroundColor = ConsoleColor.Black; + this.textColor = ConsoleColor.White; + } + + public void SetTitle(string title) + { + this.title = title; + } + + public void SetStatus(string status) + { + this.status = status; + } + + public void SetBackgroundColor(ConsoleColor color) + { + this.backgroundColor = color; + } + + public void SetTextColor(ConsoleColor color) + { + this.textColor = color; + } + + public void Render() + { + Console.BackgroundColor = backgroundColor; + Console.ForegroundColor = textColor; + Console.Clear(); + + RenderTopBar(); + + // 重置颜色 + Console.ResetColor(); + } + + public void RenderBottomBar() + { + // 渲染底栏 + RenderBottomBarImpl(); + } + + private void RenderTopBar() + { + // 简化顶栏渲染,确保在Cosmos环境中正确显示 + Console.ForegroundColor = textColor; + Console.BackgroundColor = backgroundColor; + + // 使用固定长度的顶栏,避免宽度计算问题 + string topBar = new string('─', 80); // 假设标准宽度为80 + + Console.WriteLine(topBar); + + // 居中显示标题和状态 + string titleLine = $"{title.PadRight(60)}{status}"; + if (titleLine.Length > 80) + { + titleLine = titleLine.Substring(0, 80); + } + Console.WriteLine(titleLine); + + Console.WriteLine(topBar); + + Console.ResetColor(); + } + + private void RenderBottomBarImpl() + { + // 简化底栏渲染,确保在Cosmos环境中正确显示 + Console.ForegroundColor = textColor; + Console.BackgroundColor = backgroundColor; + + // 使用固定长度的底栏,避免宽度计算问题 + string bottomBar = new string('─', 80); // 假设标准宽度为80 + + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(); + + Console.WriteLine(bottomBar); + + // 显示帮助信息和时间 + string timeText = DateTime.Now.ToShortTimeString(); + string bottomLine = $"Press help for available commands{(new string(' ', 80 - 35 - timeText.Length))}{timeText}"; + if (bottomLine.Length > 80) + { + bottomLine = bottomLine.Substring(0, 80); + } + Console.WriteLine(bottomLine); + + Console.WriteLine(bottomBar); + + Console.ResetColor(); + } + + public void ShowMessage(string message) + { + Console.WriteLine(message); + } + + public void ShowError(string error) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine($"Error: {error}"); + Console.ResetColor(); + } + + public void ShowSuccess(string message) + { + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine($"Success: {message}"); + Console.ResetColor(); + } + + public string Prompt(string promptText) + { + Console.Write($"{promptText}: "); + return Console.ReadLine(); + } + + public void Clear() + { + Console.Clear(); + Render(); + } + } +} \ No newline at end of file diff --git a/Editor.cs b/Editor.cs new file mode 100644 index 0000000..2d9134e --- /dev/null +++ b/Editor.cs @@ -0,0 +1,301 @@ +using System; +using System.Collections.Generic; + +namespace CMLeonOS +{ + // 简单的代码编辑器类 + // 支持基本的文本编辑功能,如输入、删除、移动光标等 + // 支持文件的加载和保存 + public class Editor + { + private string fileName; // 要编辑的文件名 + private List lines; // 文件内容的行列表 + private int currentLine; // 当前光标所在行 + private int currentColumn; // 当前光标所在列 + private bool isRunning; // 编辑器是否正在运行 + private FileSystem fileSystem; // 文件系统实例,用于读写文件 + + // 构造函数 + // 参数:fileName - 要编辑的文件名 + // 参数:fs - 文件系统实例 + public Editor(string fileName, FileSystem fs) + { + this.fileName = fileName; + this.fileSystem = fs; + this.lines = new List(); + this.currentLine = 0; + this.currentColumn = 0; + this.isRunning = true; + + LoadFile(); + } + + // 运行编辑器 + // 主循环:渲染界面 -> 处理输入 -> 重复 + public void Run() + { + while (isRunning) + { + Render(); + HandleInput(); + } + } + + // 加载文件内容 + private void LoadFile() + { + try + { + // 尝试从文件系统读取文件内容 + string content = fileSystem.ReadFile(fileName); + if (!string.IsNullOrEmpty(content)) + { + // 分割内容为行 + string[] fileLines = content.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); + foreach (string line in fileLines) + { + lines.Add(line); + } + } + else + { + // 文件不存在或为空,创建新文件 + lines.Add(""); + } + } + catch + { + // 文件不存在,创建新文件 + lines.Add(""); + } + } + + // 保存文件内容 + private void SaveFile() + { + try + { + // 简化实现,避免可能导致栈损坏的操作 + string content = ""; + for (int i = 0; i < lines.Count; i++) + { + content += lines[i]; + if (i < lines.Count - 1) + { + content += "\n"; + } + } + + // 直接使用CreateFile,因为它会覆盖现有文件 + try + { + fileSystem.CreateFile(fileName, content); + Console.WriteLine($"File saved: {fileName}"); + } + catch (Exception ex) + { + Console.WriteLine($"Error saving file: {ex.Message}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error in SaveFile: {ex.Message}"); + } + } + + // 渲染编辑器界面 + private void Render() + { + Console.Clear(); + + // 显示标题栏 + Console.WriteLine($"CMLeonOS Editor - {fileName}"); + Console.WriteLine("--------------------------------"); + Console.WriteLine("Commands: Esc = Exit"); + Console.WriteLine(); + + // 显示文件内容(限制显示行数,避免超出控制台高度) + int maxVisibleLines = 15; // 假设控制台高度为25行,留10行给其他内容 + int startLine = Math.Max(0, currentLine - maxVisibleLines / 2); + int endLine = Math.Min(lines.Count, startLine + maxVisibleLines); + + for (int i = startLine; i < endLine; i++) + { + string line = lines[i]; + Console.WriteLine($"{i + 1}: {line}"); + } + + // 显示光标位置 + Console.WriteLine(); + Console.WriteLine($"Cursor: Line {currentLine + 1}, Column {currentColumn + 1}"); + Console.WriteLine($"Lines: {lines.Count}"); + + // 计算光标位置,确保不超出控制台高度 + int consoleHeight = 25; // 假设控制台高度为25行 + int titleLines = 4; // 标题栏占用的行数 + int visibleLines = endLine - startLine; + int cursorY = titleLines + (currentLine - startLine); + + // 确保光标Y位置在有效范围内 + cursorY = Math.Max(titleLines, Math.Min(cursorY, consoleHeight - 5)); // 留5行给状态信息 + + // 设置光标位置 + try + { + Console.SetCursorPosition(currentColumn + 4, cursorY); + } + catch + { + // 如果设置光标位置失败,忽略错误 + } + } + + // 处理用户输入 + private void HandleInput() + { + ConsoleKeyInfo keyInfo = Console.ReadKey(true); + + switch (keyInfo.Key) + { + case ConsoleKey.Escape: + // 显示保存确认弹窗 + ShowSaveConfirmation(); + break; + case ConsoleKey.Backspace: + // 删除字符 + if (currentColumn > 0) + { + string line = lines[currentLine]; + line = line.Remove(currentColumn - 1, 1); + lines[currentLine] = line; + currentColumn--; + } + else if (currentLine > 0) + { + // 如果在行首,合并到上一行 + string previousLine = lines[currentLine - 1]; + string lineText = lines[currentLine]; + lines.RemoveAt(currentLine); + currentLine--; + currentColumn = previousLine.Length; + lines[currentLine] = previousLine + lineText; + } + break; + case ConsoleKey.Enter: + // 插入换行 + string currentLineText = lines[currentLine]; + string firstPart = currentLineText.Substring(0, currentColumn); + string secondPart = currentLineText.Substring(currentColumn); + lines[currentLine] = firstPart; + lines.Insert(currentLine + 1, secondPart); + currentLine++; + currentColumn = 0; + break; + case ConsoleKey.LeftArrow: + // 左移光标 + if (currentColumn > 0) + { + currentColumn--; + } + break; + case ConsoleKey.RightArrow: + // 右移光标 + if (currentColumn < lines[currentLine].Length) + { + currentColumn++; + } + break; + case ConsoleKey.UpArrow: + // 上移光标 + if (currentLine > 0) + { + currentLine--; + currentColumn = Math.Min(currentColumn, lines[currentLine].Length); + } + break; + case ConsoleKey.DownArrow: + // 下移光标 + if (currentLine < lines.Count - 1) + { + currentLine++; + currentColumn = Math.Min(currentColumn, lines[currentLine].Length); + } + break; + default: + // 输入字符 + if (char.IsLetterOrDigit(keyInfo.KeyChar) || char.IsPunctuation(keyInfo.KeyChar) || char.IsSymbol(keyInfo.KeyChar) || keyInfo.KeyChar == ' ') + { + string line = lines[currentLine]; + line = line.Insert(currentColumn, keyInfo.KeyChar.ToString()); + lines[currentLine] = line; + currentColumn++; + } + break; + } + } + + // 显示保存确认弹窗 + private void ShowSaveConfirmation() + { + // 简化版本,避免使用可能在Cosmos中不支持的功能 + Console.Clear(); + + // 显示灰色背景的确认弹窗 + Console.BackgroundColor = ConsoleColor.DarkGray; + Console.ForegroundColor = ConsoleColor.White; + + // 简单的弹窗显示 + Console.WriteLine("+----------------------------+"); + Console.WriteLine("| Save File? |"); + Console.WriteLine("+----------------------------+"); + Console.WriteLine("| Do you want to save the |"); + Console.WriteLine("| changes? |"); + Console.WriteLine("+----------------------------+"); + Console.WriteLine("| Y = Yes, N = No |"); + Console.WriteLine("+----------------------------+"); + + // 等待用户输入 + while (true) + { + ConsoleKeyInfo keyInfo; + try + { + keyInfo = Console.ReadKey(true); + } + catch + { + // 如果ReadKey失败,直接退出 + Console.ResetColor(); + Console.Clear(); + isRunning = false; + return; + } + + if (keyInfo.Key == ConsoleKey.Y) + { + // 保存文件 + try + { + SaveFile(); + } + catch + { + Console.WriteLine("Error saving file"); + } + Console.ResetColor(); + Console.Clear(); + isRunning = false; + break; + } + else if (keyInfo.Key == ConsoleKey.N) + { + // 不保存文件 + Console.ResetColor(); + Console.Clear(); + isRunning = false; + break; + } + } + } + } +} diff --git a/FileSystem.cs b/FileSystem.cs new file mode 100644 index 0000000..3e82a30 --- /dev/null +++ b/FileSystem.cs @@ -0,0 +1,280 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace CMLeonOS +{ + public class FileSystem + { + private string currentDirectory; + + public FileSystem() + { + currentDirectory = @"0:\"; + } + + public string CurrentDirectory + { + get { return currentDirectory; } + } + + public void ChangeDirectory(string path) + { + if (string.IsNullOrEmpty(path)) + { + currentDirectory = @"0:\"; + return; + } + + string fullPath = GetFullPath(path); + + try + { + if (Directory.Exists(fullPath)) + { + currentDirectory = fullPath; + } + else + { + Console.WriteLine($"Directory not found: {path}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error changing directory: {ex.Message}"); + } + } + + public void MakeDirectory(string path) + { + string fullPath = GetFullPath(path); + + try + { + if (!Directory.Exists(fullPath)) + { + Directory.CreateDirectory(fullPath); + Console.WriteLine($"Directory created: {path}"); + } + else + { + Console.WriteLine($"Directory already exists: {path}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error creating directory: {ex.Message}"); + } + } + + public void ListFiles(string path = ".") + { + string fullPath = GetFullPath(path); + + try + { + if (Directory.Exists(fullPath)) + { + // 列出当前目录下的文件和子目录 + Console.WriteLine($"Contents of {path}:"); + + // 列出子目录 + try + { + var dirs = Directory.GetDirectories(fullPath); + foreach (var dir in dirs) + { + // 使用Path.GetFileName获取目录名,避免Substring可能导致的问题 + string dirName = Path.GetFileName(dir); + Console.WriteLine($"[DIR] {dirName}"); + } + } + catch + { + // 可能没有权限或其他错误 + } + + // 列出文件 + try + { + var files = Directory.GetFiles(fullPath); + foreach (var file in files) + { + // 使用Path.GetFileName获取文件名,避免Substring可能导致的问题 + string fileName = Path.GetFileName(file); + Console.WriteLine($"[FILE] {fileName}"); + } + } + catch + { + // 可能没有权限或其他错误 + } + } + else + { + Console.WriteLine($"Directory not found: {path}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error listing files: {ex.Message}"); + } + } + + public void CreateFile(string path, string content = "") + { + string fullPath = GetFullPath(path); + + try + { + // 创建或覆盖文件 + File.WriteAllText(fullPath, content); + Console.WriteLine($"File created: {path}"); + } + catch (Exception ex) + { + Console.WriteLine($"Error creating file: {ex.Message}"); + } + } + + public void WriteFile(string path, string content) + { + string fullPath = GetFullPath(path); + + try + { + if (File.Exists(fullPath)) + { + File.WriteAllText(fullPath, content); + Console.WriteLine($"File written: {path}"); + } + else + { + Console.WriteLine($"File not found: {path}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error writing file: {ex.Message}"); + } + } + + public string ReadFile(string path) + { + string fullPath = GetFullPath(path); + + try + { + if (File.Exists(fullPath)) + { + return File.ReadAllText(fullPath); + } + else + { + Console.WriteLine($"File not found: {path}"); + return ""; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error reading file: {ex.Message}"); + return ""; + } + } + + public void DeleteFile(string path) + { + string fullPath = GetFullPath(path); + + try + { + if (File.Exists(fullPath)) + { + File.Delete(fullPath); + Console.WriteLine($"File deleted: {path}"); + } + else + { + Console.WriteLine($"File not found: {path}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error deleting file: {ex.Message}"); + } + } + + public void DeleteDirectory(string path) + { + string fullPath = GetFullPath(path); + + try + { + if (Directory.Exists(fullPath)) + { + try + { + // 尝试删除目录 + Directory.Delete(fullPath); + Console.WriteLine($"Directory deleted: {path}"); + } + catch + { + // 目录可能不为空 + Console.WriteLine($"Directory not empty: {path}"); + } + } + else + { + Console.WriteLine($"Directory not found: {path}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error deleting directory: {ex.Message}"); + } + } + + private string GetFullPath(string path) + { + if (path.StartsWith(@"0:\")) + { + return path; + } + else if (path == ".") + { + return currentDirectory; + } + else if (path == "..") + { + if (currentDirectory == @"0:\") + { + return @"0:\"; + } + else + { + int lastSlash = currentDirectory.LastIndexOf('\\'); + if (lastSlash == 2) // 0:\ + { + return @"0:\"; + } + else + { + return currentDirectory.Substring(0, lastSlash); + } + } + } + else + { + if (currentDirectory == @"0:\") + { + return $@"0:\{path}"; + } + else + { + return $@"{currentDirectory}\{path}"; + } + } + } + } +} diff --git a/Kernel.cs b/Kernel.cs new file mode 100644 index 0000000..47dd4da --- /dev/null +++ b/Kernel.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using Sys = Cosmos.System; + +namespace CMLeonOS +{ + public class Kernel : Sys.Kernel + { + // 创建全局CosmosVFS实例 + Sys.FileSystem.CosmosVFS fs = new Sys.FileSystem.CosmosVFS(); + + private Shell shell; + private UserSystem userSystem; + + protected override void BeforeRun() + { + Console.Clear(); + Console.WriteLine(@" ____ __ __ _ ___ ____ "); + Console.WriteLine(@" / ___| \/ | | ___ ___ _ __ / _ \/ ___| "); + Console.WriteLine(@" | | | |\/| | | / _ \/ _ \| '_ \| | | \___ \ "); + Console.WriteLine(@" | |___| | | | |__| __/ (_) | | | | |_| |___) |"); + Console.WriteLine(@" \____|_| |_|_____\___|\___/|_| |_|__/|____/ "); + Console.WriteLine(); + Console.WriteLine("CMLeonOS Test Project"); + Console.WriteLine("By LeonOS 2 Developement Team"); + + // 注册VFS + try + { + Sys.FileSystem.VFS.VFSManager.RegisterVFS(fs); + Console.WriteLine("VFS initialized successfully"); + + // 显示可用空间 + var available_space = fs.GetAvailableFreeSpace(@"0:\"); + Console.WriteLine("Available Free Space: " + available_space + " bytes"); + + // 显示文件系统类型 + var fs_type = fs.GetFileSystemType(@"0:\"); + Console.WriteLine("File System Type: " + fs_type); + + // 删除默认示例文件和文件夹 + try + { + // 删除示例文件 + if (System.IO.File.Exists(@"0:\example.txt")) + { + System.IO.File.Delete(@"0:\example.txt"); + Console.WriteLine("Deleted example.txt"); + } + + // 删除示例文件夹 + if (System.IO.Directory.Exists(@"0:\example")) + { + System.IO.Directory.Delete(@"0:\example", true); + Console.WriteLine("Deleted example directory"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error deleting example files: {ex.Message}"); + } + + // 初始化用户系统 + userSystem = new UserSystem(); + + // 第一次启动,设置管理员密码 + if (!userSystem.IsPasswordSet) + { + userSystem.SetAdminPassword(); + } + // 后续启动,需要登录 + else + { + // 循环直到登录成功 + while (!userSystem.Login()) + { + // 登录失败,继续尝试 + } + } + + // 登录成功后,初始化Shell + shell = new Shell(); + } + catch (Exception ex) + { + Console.WriteLine($"Error initializing system: {ex.Message}"); + } + } + + protected override void Run() + { + if (shell != null) + { + shell.Run(); + } + } + } +} diff --git a/Shell.cs b/Shell.cs new file mode 100644 index 0000000..b34df4e --- /dev/null +++ b/Shell.cs @@ -0,0 +1,439 @@ +using System; +using System.Collections.Generic; +using Sys = Cosmos.System; + +namespace CMLeonOS +{ + public class Shell + { + private string prompt = "/"; + private List commandHistory = new List(); + private FileSystem fileSystem; + private UserSystem userSystem; + + public Shell() + { + fileSystem = new FileSystem(); + userSystem = new UserSystem(); + } + + public void Run() + { + while (true) + { + Console.Write(prompt); + var input = Console.ReadLine(); + commandHistory.Add(input); + var parts = input.Split(' ', StringSplitOptions.RemoveEmptyEntries); + if (parts.Length > 0) + { + var command = parts[0].ToLower(); + var args = parts.Length > 1 ? string.Join(" ", parts, 1, parts.Length - 1) : ""; + ProcessCommand(command, args); + } + } + } + + private void ProcessCommand(string command, string args) + { + switch (command) + { + case "echo": + ProcessEcho(args); + break; + case "clear": + case "cls": + Console.Clear(); + break; + case "restart": + Console.WriteLine("Restarting system..."); + Sys.Power.Reboot(); + break; + case "shutdown": + Console.WriteLine("Shutting down system..."); + Sys.Power.Shutdown(); + break; + case "help": + Console.WriteLine("Available commands:"); + Console.WriteLine(" echo - Display text (supports \\n for newline)"); + Console.WriteLine(" clear/cls - Clear the screen"); + Console.WriteLine(" restart - Restart the system"); + Console.WriteLine(" shutdown - Shutdown the system"); + Console.WriteLine(" time - Display current time"); + Console.WriteLine(" date - Display current date"); + Console.WriteLine(" prompt - Change command prompt"); + Console.WriteLine(" calc - Simple calculator"); + Console.WriteLine(" history - Show command history"); + Console.WriteLine(" background - Change background color"); + Console.WriteLine(" cuitest - Test CUI framework"); + Console.WriteLine(" edit - Simple code editor"); + Console.WriteLine(" ls - List files and directories"); + Console.WriteLine(" cd - Change directory"); + Console.WriteLine(" pwd - Show current directory"); + Console.WriteLine(" mkdir - Create directory"); + Console.WriteLine(" rm - Remove file"); + Console.WriteLine(" rmdir - Remove directory"); + Console.WriteLine(" cat - Display file content"); + Console.WriteLine(" echo > - Write text to file"); + Console.WriteLine(" cpass - Change password"); + Console.WriteLine(" version - Show OS version"); + Console.WriteLine(" about - Show about information"); + Console.WriteLine(" help - Show this help message"); + break; + case "time": + Console.WriteLine(DateTime.Now.ToString()); + break; + case "date": + Console.WriteLine(DateTime.Now.ToShortDateString()); + break; + case "prompt": + ChangePrompt(args); + break; + case "calc": + Calculate(args); + break; + case "history": + ShowHistory(); + break; + case "background": + ChangeBackground(args); + break; + case "cuitest": + TestCUI(); + break; + case "edit": + EditFile(args); + break; + case "ls": + fileSystem.ListFiles(args); + break; + case "cd": + fileSystem.ChangeDirectory(args); + break; + case "pwd": + Console.WriteLine(fileSystem.CurrentDirectory); + break; + case "mkdir": + if (string.IsNullOrEmpty(args)) + { + Console.WriteLine("Error: Please specify a directory name"); + } + else + { + fileSystem.MakeDirectory(args); + } + break; + case "rm": + if (string.IsNullOrEmpty(args)) + { + Console.WriteLine("Error: Please specify a file name"); + } + else + { + fileSystem.DeleteFile(args); + } + break; + case "rmdir": + if (string.IsNullOrEmpty(args)) + { + Console.WriteLine("Error: Please specify a directory name"); + } + else + { + fileSystem.DeleteDirectory(args); + } + break; + case "cat": + if (string.IsNullOrEmpty(args)) + { + Console.WriteLine("Error: Please specify a file name"); + } + else + { + Console.WriteLine(fileSystem.ReadFile(args)); + } + break; + case "version": + Console.WriteLine("CMLeonOS v1.0"); + break; + case "about": + Console.WriteLine("CMLeonOS Test Project"); + Console.WriteLine("By LeonOS 2 Developement Team"); + Console.WriteLine("A simple operating system built with Cosmos"); + break; + case "cpass": + userSystem.ChangePassword(); + break; + default: + Console.WriteLine($"Unknown command: {command}"); + break; + } + } + + private void ProcessEcho(string args) + { + // 支持基本的转义字符 + var processedArgs = args.Replace("\\n", "\n"); + Console.WriteLine(processedArgs); + } + + private void ChangePrompt(string args) + { + if (!string.IsNullOrEmpty(args)) + { + prompt = args; + } + else + { + prompt = "/"; + } + } + + private void Calculate(string expression) + { + try + { + // 简单的计算器,只支持加减乘除 + var parts = expression.Split(' '); + if (parts.Length == 3) + { + double num1 = double.Parse(parts[0]); + string op = parts[1]; + double num2 = double.Parse(parts[2]); + double result = 0; + + switch (op) + { + case "+": + result = num1 + num2; + break; + case "-": + result = num1 - num2; + break; + case "*": + result = num1 * num2; + break; + case "/": + if (num2 != 0) + { + result = num1 / num2; + } + else + { + Console.WriteLine("Error: Division by zero"); + return; + } + break; + default: + Console.WriteLine("Error: Invalid operator. Use +, -, *, /"); + return; + } + + Console.WriteLine($"Result: {result}"); + } + else + { + Console.WriteLine("Error: Invalid expression. Use format: calc "); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error: {ex.Message}"); + } + } + + private void ShowHistory() + { + for (int i = 0; i < commandHistory.Count; i++) + { + Console.WriteLine($"{i + 1}: {commandHistory[i]}"); + } + } + + private void ChangeBackground(string hexColor) + { + try + { + // 移除#前缀(如果有) + hexColor = hexColor.TrimStart('#'); + + // 解析16进制颜色代码 + if (hexColor.Length == 6) + { + int r = Convert.ToInt32(hexColor.Substring(0, 2), 16); + int g = Convert.ToInt32(hexColor.Substring(2, 2), 16); + int b = Convert.ToInt32(hexColor.Substring(4, 2), 16); + + // 简单的颜色映射,将RGB值映射到最接近的ConsoleColor + ConsoleColor color = GetClosestConsoleColor(r, g, b); + Console.BackgroundColor = color; + Console.Clear(); + Console.WriteLine($"Background color changed to: #{hexColor}"); + } + else + { + Console.WriteLine("Error: Invalid hex color format. Use format: #RRGGBB or RRGGBB"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error changing background color: {ex.Message}"); + } + } + + private ConsoleColor GetClosestConsoleColor(int r, int g, int b) + { + // 简单的颜色映射逻辑 + // 将RGB值映射到最接近的ConsoleColor + ConsoleColor[] colors = new ConsoleColor[] + { + ConsoleColor.Black, + ConsoleColor.DarkBlue, + ConsoleColor.DarkGreen, + ConsoleColor.DarkCyan, + ConsoleColor.DarkRed, + ConsoleColor.DarkMagenta, + ConsoleColor.DarkYellow, + ConsoleColor.Gray, + ConsoleColor.DarkGray, + ConsoleColor.Blue, + ConsoleColor.Green, + ConsoleColor.Cyan, + ConsoleColor.Red, + ConsoleColor.Magenta, + ConsoleColor.Yellow, + ConsoleColor.White + }; + ConsoleColor closestColor = ConsoleColor.Black; + double smallestDistance = double.MaxValue; + + foreach (ConsoleColor color in colors) + { + // 为每个ConsoleColor计算RGB值 + // 这里使用简单的映射,实际效果可能不是很准确 + int cr, cg, cb; + GetRGBFromConsoleColor(color, out cr, out cg, out cb); + + // 计算欧几里得距离 + double distance = Math.Sqrt(Math.Pow(r - cr, 2) + Math.Pow(g - cg, 2) + Math.Pow(b - cb, 2)); + if (distance < smallestDistance) + { + smallestDistance = distance; + closestColor = color; + } + } + + return closestColor; + } + + private void GetRGBFromConsoleColor(ConsoleColor color, out int r, out int g, out int b) + { + // 简单的ConsoleColor到RGB的映射 + switch (color) + { + case ConsoleColor.Black: + r = 0; g = 0; b = 0; break; + case ConsoleColor.DarkBlue: + r = 0; g = 0; b = 128; break; + case ConsoleColor.DarkGreen: + r = 0; g = 128; b = 0; break; + case ConsoleColor.DarkCyan: + r = 0; g = 128; b = 128; break; + case ConsoleColor.DarkRed: + r = 128; g = 0; b = 0; break; + case ConsoleColor.DarkMagenta: + r = 128; g = 0; b = 128; break; + case ConsoleColor.DarkYellow: + r = 128; g = 128; b = 0; break; + case ConsoleColor.Gray: + r = 192; g = 192; b = 192; break; + case ConsoleColor.DarkGray: + r = 128; g = 128; b = 128; break; + case ConsoleColor.Blue: + r = 0; g = 0; b = 255; break; + case ConsoleColor.Green: + r = 0; g = 255; b = 0; break; + case ConsoleColor.Cyan: + r = 0; g = 255; b = 255; break; + case ConsoleColor.Red: + r = 255; g = 0; b = 0; break; + case ConsoleColor.Magenta: + r = 255; g = 0; b = 255; break; + case ConsoleColor.Yellow: + r = 255; g = 255; b = 0; break; + case ConsoleColor.White: + r = 255; g = 255; b = 255; break; + default: + r = 0; g = 0; b = 0; break; + } + } + + private void TestCUI() + { + // 创建CUI实例 + var cui = new CUI("CMLeonOS CUI Test"); + + // 设置状态 + cui.SetStatus("Testing CUI..."); + + // 渲染CUI界面(只渲染顶栏) + cui.Render(); + + // 显示测试消息 + Console.WriteLine(); + Console.WriteLine("CUI Framework Test"); + Console.WriteLine("-------------------"); + Console.WriteLine("Testing CUI functionality..."); + Console.WriteLine(); + + // 测试不同类型的消息 + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine("Success: Success message test"); + Console.ResetColor(); + + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("Error: Error message test"); + Console.ResetColor(); + + Console.WriteLine("Normal message test"); + Console.WriteLine(); + + // 测试用户输入 + Console.Write("Enter your name: "); + var input = Console.ReadLine(); + Console.WriteLine(); + Console.WriteLine($"Hello, {input}!"); + Console.WriteLine(); + + // 渲染底栏 + cui.RenderBottomBar(); + + // 等待用户按任意键返回 + Console.WriteLine(); + Console.WriteLine("Press any key to return to shell..."); + Console.ReadKey(true); + + // 重置控制台 + Console.Clear(); + } + + private void EditFile(string fileName) + { + if (string.IsNullOrEmpty(fileName)) + { + Console.WriteLine("Error: Please specify a file name"); + return; + } + + try + { + var editor = new Editor(fileName, fileSystem); + editor.Run(); + } + catch (Exception ex) + { + Console.WriteLine($"Error starting editor: {ex.Message}"); + } + } + } +} \ No newline at end of file diff --git a/UserSystem.cs b/UserSystem.cs new file mode 100644 index 0000000..ed35042 --- /dev/null +++ b/UserSystem.cs @@ -0,0 +1,172 @@ +using System; +using System.IO; + +namespace CMLeonOS +{ + public class UserSystem + { + private string adminPasswordFilePath = @"0:\admin_password.txt"; + private bool isPasswordSet = false; + + public UserSystem() + { + CheckPasswordStatus(); + } + + private void CheckPasswordStatus() + { + try + { + isPasswordSet = File.Exists(adminPasswordFilePath); + } + catch + { + isPasswordSet = false; + } + } + + public bool IsPasswordSet + { + get { return isPasswordSet; } + } + + public void SetAdminPassword() + { + Console.WriteLine("===================================="); + Console.WriteLine(" First Time Setup"); + Console.WriteLine("===================================="); + Console.WriteLine("Please set a password for admin user:"); + + string password = ReadPassword(); + + Console.WriteLine("Please confirm your password:"); + string confirmPassword = ReadPassword(); + + if (password == confirmPassword) + { + try + { + // 简单存储密码(实际应用中应使用加密) + File.WriteAllText(adminPasswordFilePath, password); + Console.WriteLine("Password set successfully!"); + isPasswordSet = true; + } + catch (Exception ex) + { + Console.WriteLine($"Error setting password: {ex.Message}"); + } + } + else + { + Console.WriteLine("Passwords do not match. Please try again."); + SetAdminPassword(); + } + } + + public bool Login() + { + Console.WriteLine("===================================="); + Console.WriteLine(" System Login"); + Console.WriteLine("===================================="); + Console.WriteLine("Username: admin"); + Console.WriteLine("Password:"); + + string password = ReadPassword(); + + try + { + string storedPassword = File.ReadAllText(adminPasswordFilePath); + if (password == storedPassword) + { + Console.WriteLine("Login successful!"); + return true; + } + else + { + Console.WriteLine("Invalid password. Please try again."); + return false; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error during login: {ex.Message}"); + return false; + } + } + + private string ReadPassword() + { + string password = ""; + while (true) + { + ConsoleKeyInfo keyInfo = Console.ReadKey(true); + if (keyInfo.Key == ConsoleKey.Enter) + { + Console.WriteLine(); + break; + } + else if (keyInfo.Key == ConsoleKey.Backspace) + { + if (password.Length > 0) + { + password = password.Substring(0, password.Length - 1); + // 简化退格处理,只修改password字符串 + // 在Cosmos中,Console.Write("\b \b")可能不被支持 + } + } + else + { + password += keyInfo.KeyChar; + Console.Write("*"); + } + } + return password; + } + + public bool ChangePassword() + { + Console.WriteLine("===================================="); + Console.WriteLine(" Change Password"); + Console.WriteLine("===================================="); + + // 验证当前密码 + Console.WriteLine("Please enter your current password:"); + string currentPassword = ReadPassword(); + + try + { + string storedPassword = File.ReadAllText(adminPasswordFilePath); + if (currentPassword != storedPassword) + { + Console.WriteLine("Current password is incorrect."); + return false; + } + + // 设置新密码 + Console.WriteLine("Please enter your new password:"); + string newPassword = ReadPassword(); + + Console.WriteLine("Please confirm your new password:"); + string confirmPassword = ReadPassword(); + + if (newPassword == confirmPassword) + { + // 存储新密码 + File.WriteAllText(adminPasswordFilePath, newPassword); + Console.WriteLine("Password changed successfully!"); + return true; + } + else + { + Console.WriteLine("New passwords do not match."); + return false; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error changing password: {ex.Message}"); + return false; + } + } + } +} \ No newline at end of file diff --git a/global.json b/global.json new file mode 100644 index 0000000..60bbb79 --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "6.0.419", + "rollForward": "latestMinor" + } +} \ No newline at end of file