summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/src/KernelMain.cc
blob: cc88961944977fe92bb504dfef0e26287880d142 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* -------------------------------------------

	Copyright ZKA Technologies

	File: Main.cxx
	Purpose: Main entrypoint of kernel.

------------------------------------------- */

#include <KernelKit/PE.h>
#include <ArchKit/ArchKit.h>
#include <CompilerKit/Detail.h>
#include <FirmwareKit/Handover.h>
#include <KernelKit/FileMgr.h>
#include <KernelKit/Heap.h>
#include <KernelKit/PEF.h>
#include <KernelKit/PEFCodeMgr.h>
#include <KernelKit/UserProcessScheduler.h>
#include <KernelKit/Heap.h>
#include <NewKit/Json.h>
#include <NewKit/KString.h>
#include <NewKit/Utils.h>
#include <KernelKit/CodeMgr.h>
#include <CFKit/Property.h>
#include <Modules/FB/AppearanceMgr.h>
#include <KernelKit/Timer.h>

namespace Kernel::Detail
{
	/// @brief Filesystem auto formatter, additional checks are also done by the class.
	class NeFilesystemInstaller final
	{
		Kernel::NeFileSystemParser* mNeFS{nullptr};
		Kernel::NeFileSystemJournal mJournal;

	public:
		/// @brief wizard constructor.
		explicit NeFilesystemInstaller()
		{
			mNeFS = new Kernel::NeFileSystemParser();

			if (mNeFS)
			{
				mJournal.CreateJournal(mNeFS);

				constexpr auto kFolderInfo		  = "META-XML";
				const SizeT	   kFolderCount		  = 7;
				const Char*	   kFolderStr[kFolderCount] = {
					   "/Boot/", "/System/", "/Support/", "/Applications/",
					   "/Users/", "/Library/", "/Mount/"};

				for (Kernel::SizeT dir_index = 0UL; dir_index < kFolderCount; ++dir_index)
				{
					auto catalog_folder = mNeFS->GetCatalog(kFolderStr[dir_index]);

					if (catalog_folder)
					{
						delete catalog_folder;
						catalog_folder = nullptr;

						continue;
					}

					catalog_folder = mNeFS->CreateCatalog(kFolderStr[dir_index], 0,
																   kNeFSCatalogKindDir);

					NFS_FORK_STRUCT fork_folder{0};

					Kernel::rt_copy_memory((Kernel::VoidPtr)(kFolderInfo), fork_folder.ForkName,
										   Kernel::rt_string_len(kFolderInfo));

					Kernel::rt_copy_memory((Kernel::VoidPtr)(catalog_folder->Name),
										   fork_folder.CatalogName,
										   Kernel::rt_string_len(catalog_folder->Name));

					fork_folder.DataSize	 = kNeFSForkSize;
					fork_folder.ResourceId	 = 0;
					fork_folder.ResourceKind = Kernel::kNeFSRsrcForkKind;
					fork_folder.Kind		 = Kernel::kNeFSDataForkKind;

					Kernel::KString folder_metadata(2048);

					folder_metadata +=
						"<!properties/>\r<p>Kind: folder</p>\r<p>Created by: system</p>\r<p>Edited by: "
						"system</p>\r<p>Volume Type: Zeta</p>\r";

					folder_metadata += "<p>Path: ";
					folder_metadata += kFolderStr[dir_index];
					folder_metadata += "</p>\r";

					Kernel::KString folder_name(2048);
					folder_name += catalog_folder->Name;

					mJournal.Commit(mNeFS, folder_metadata,folder_name);

					const Kernel::SizeT kMetaDataSz = kNeFSSectorSz;

					mNeFS->CreateFork(catalog_folder, fork_folder);

					mNeFS->WriteCatalog(
						catalog_folder, true, (Kernel::VoidPtr)(folder_metadata.CData()),
						kMetaDataSz, kFolderInfo);

					delete catalog_folder;
					catalog_folder = nullptr;
				}
			}
		}

		~NeFilesystemInstaller()
		{
			if (mNeFS)
				delete mNeFS;
			
			mNeFS = nullptr;
		}

		ZKA_COPY_DEFAULT(NeFilesystemInstaller);
	};
} // namespace Kernel::Detail

/// @brief Application entrypoint.
/// @param Void
/// @return Void
EXTERN_C Kernel::Void rtl_kernel_main(Kernel::SizeT argc, char** argv, char** envp, Kernel::SizeT envp_len)
{
	Kernel::Detail::fs_init_newfs();
	Kernel::Detail::NeFilesystemInstaller installer{};
}