You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

249 lines
6.6 KiB

/*
* GodoOS - A lightweight cloud desktop
* Copyright (C) 2024 https://godoos.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package files
import (
"encoding/json"
"fmt"
"godo/libs"
"os"
"path/filepath"
"time"
)
func RecoverOsSystem() error {
basePath, err := libs.GetOsDir()
if err != nil {
return fmt.Errorf("GetOsDir error: %v", err)
}
osCpath := filepath.Join(basePath, "C")
if libs.PathExists(osCpath) {
err := os.RemoveAll(osCpath)
if err != nil {
return fmt.Errorf("RemoveAll error: %v", err)
}
}
err = InitOsSystem()
if err != nil {
return fmt.Errorf("InitOsSystem error: %v", err)
}
return nil
}
func InitOsSystem() error {
basePath, err := libs.GetOsDir()
if err != nil {
return fmt.Errorf("GetOsDir error: %v", err)
}
if !libs.PathExists(basePath) {
if err := os.MkdirAll(basePath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
osCpath := filepath.Join(basePath, "C")
if !libs.PathExists(osCpath) {
if err := os.MkdirAll(osCpath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
baseOsDir := []string{
"D",
"E",
"B",
}
for _, dir := range baseOsDir {
dirPath := filepath.Join(basePath, dir)
if !libs.PathExists(dirPath) {
if err := os.MkdirAll(dirPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
}
systemPath := filepath.Join(osCpath, "System")
if !libs.PathExists(systemPath) {
if err := os.MkdirAll(systemPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
userPath := filepath.Join(osCpath, "Users")
if !libs.PathExists(userPath) {
if err := os.MkdirAll(userPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
InitPaths := []string{
"Desktop",
"Menulist",
"Documents",
"Downloads",
"Music",
"Pictures",
"Videos",
"Schedule",
"Reciv",
}
for _, dir := range InitPaths {
dirPath := filepath.Join(userPath, dir)
if !libs.PathExists(dirPath) {
if err := os.MkdirAll(dirPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
}
InitDocPath := []string{
"Word",
"Markdown",
"PPT",
"Baiban",
"Kanban",
"Execl",
"Mind",
"Screenshot",
"ScreenRecording",
}
docpath := filepath.Join(userPath, "Documents")
for _, dir := range InitDocPath {
dirPath := filepath.Join(docpath, dir)
if !libs.PathExists(dirPath) {
if err := os.MkdirAll(dirPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
}
applist := GetInitRootList()
desktopPath := filepath.Join(userPath, "Desktop")
for _, app := range applist.Desktop {
appPath := filepath.Join(desktopPath, app.Name)
if !libs.PathExists(appPath) {
if err := os.WriteFile(appPath, []byte(app.Content), 0644); err != nil {
return fmt.Errorf("failed to write to file: %w", err)
}
}
}
menulistPath := filepath.Join(userPath, "Menulist")
for _, app := range applist.Menulist {
appPath := filepath.Join(menulistPath, app.Name)
if !libs.PathExists(appPath) {
if err := os.WriteFile(appPath, []byte(app.Content), 0644); err != nil {
return fmt.Errorf("failed to write to file: %w", err)
}
}
}
content, err := json.MarshalIndent(applist, "", " ")
if err != nil {
return fmt.Errorf("failed to marshal reqBodies to JSON: %w", err)
}
appPath, err := libs.GetAppDir()
if err != nil {
return fmt.Errorf("GetAppDir error: %v", err)
}
desktopFilePath := filepath.Join(appPath, "desktop.json")
if err := os.WriteFile(desktopFilePath, content, 0644); err != nil {
return fmt.Errorf("failed to write to file: %w", err)
}
}
}
return nil
}
func GetDesktop() (RootObject, error) {
var applist RootObject
desktoppath, err := GetDeskTopPath()
if err != nil || !libs.PathExists(desktoppath) {
return applist, fmt.Errorf("desktop.json not found")
}
content, err := os.ReadFile(desktoppath)
if err != nil {
return applist, fmt.Errorf("failed to read file: %w", err)
}
err = json.Unmarshal(content, &applist)
if err != nil {
return applist, fmt.Errorf("failed to unmarshal JSON: %w", err)
}
return applist, nil
}
func GetDeskTopPath() (string, error) {
appPath, err := libs.GetAppDir()
if err != nil {
return "", fmt.Errorf("GetAppDir error: %v", err)
}
return filepath.Join(appPath, "desktop.json"), nil
}
func WriteDesktop(rootInfo RootObject) error {
rootInfo.UpdateTime = time.Now()
content, err := json.MarshalIndent(rootInfo, "", " ")
if err != nil {
return fmt.Errorf("failed to marshal reqBodies to JSON: %w", err)
}
desktoppath, err := GetDeskTopPath()
if err != nil {
return fmt.Errorf("GetDeskTopPath error: %v", err)
}
return os.WriteFile(desktoppath, content, 0644)
}
func AddDesktop(app OsFileInfo, position string) error {
applist, err := GetDesktop()
if err != nil {
return fmt.Errorf("GetDesktop error: %v", err)
}
if position == "Desktop" {
if !checkHasApp(applist.Desktop, app) {
applist.Desktop = append(applist.Desktop, app)
}
} else if position == "Menulist" {
if !checkHasApp(applist.Menulist, app) {
applist.Menulist = append(applist.Menulist, app)
}
} else {
return fmt.Errorf("position error")
}
//log.Printf("add app to desktop %v", applist)
return WriteDesktop(applist)
}
func DeleteDesktop(name string) error {
rootInfo, err := GetDesktop()
if err != nil {
return fmt.Errorf("GetDesktop error: %v", err)
}
indexToDelete := -1
for i, item := range rootInfo.Desktop {
if item.Name == name {
indexToDelete = i
break
}
}
// 如果找到了要删除的元素
if indexToDelete >= 0 {
// 使用 append 删除元素
rootInfo.Desktop = append(rootInfo.Desktop[:indexToDelete], rootInfo.Desktop[indexToDelete+1:]...)
} else {
return fmt.Errorf("item with name '%s' not found", name)
}
return WriteDesktop(rootInfo)
}
func checkHasApp(list []OsFileInfo, app OsFileInfo) bool {
for _, item := range list {
if item.Name == app.Name {
return true
}
}
return false
}