summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/src/KernelMain.cc
blob: 556ab5e2444297d6e268167c64dfe16530c9bb5b (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
130
131
132
133
134
/* -------------------------------------------

	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/KWindow.h>
#include <KernelKit/Timer.h>

#define kKeCachedName "/System/CacheKernel"

STATIC CG::ML_WINDOW_STRUCT* kKernelWnd = nullptr;

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{};
}