/*
	rootdir.c (09.11.10)
	Root directory creation code.

	Free exFAT implementation.
	Copyright (C) 2011-2015  Andrew Nayenko

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 2 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 General Public License for more details.

	You should have received a copy of the GNU General Public License along
	with this program; if not, write to the Free Software Foundation, Inc.,
	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#include "rootdir.h"
#include "uct.h"
#include "cbm.h"
#include "uctc.h"
#include <string.h>

static loff_t rootdir_alignment(void)
{
	return get_cluster_size();
}

static loff_t rootdir_size(void)
{
	return get_cluster_size();
}

static void init_label_entry(struct exfat_entry_label* label_entry)
{
	memset(label_entry, 0, sizeof(struct exfat_entry_label));
	label_entry->type = EXFAT_ENTRY_LABEL ^ EXFAT_ENTRY_VALID;

	if (utf16_length(get_volume_label()) == 0)
		return;

	memcpy(label_entry->name, get_volume_label(),
			EXFAT_ENAME_MAX * sizeof(le16_t));
	label_entry->length = utf16_length(get_volume_label());
	label_entry->type |= EXFAT_ENTRY_VALID;
}

static void init_bitmap_entry(struct exfat_entry_bitmap* bitmap_entry)
{
	memset(bitmap_entry, 0, sizeof(struct exfat_entry_bitmap));
	bitmap_entry->type = EXFAT_ENTRY_BITMAP;
	bitmap_entry->start_cluster = cpu_to_le32(EXFAT_FIRST_DATA_CLUSTER);
	bitmap_entry->size = cpu_to_le64(cbm.get_size());
}

static void init_upcase_entry(struct exfat_entry_upcase* upcase_entry)
{
	size_t i;
	uint32_t sum = 0;

	for (i = 0; i < sizeof(upcase_table); i++)
		sum = ((sum << 31) | (sum >> 1)) + upcase_table[i];

	memset(upcase_entry, 0, sizeof(struct exfat_entry_upcase));
	upcase_entry->type = EXFAT_ENTRY_UPCASE;
	upcase_entry->checksum = cpu_to_le32(sum);
	upcase_entry->start_cluster = cpu_to_le32(
			(get_position(&uct) - get_position(&cbm)) / get_cluster_size() +
			EXFAT_FIRST_DATA_CLUSTER);
	upcase_entry->size = cpu_to_le64(sizeof(upcase_table));
}

static int rootdir_write(struct exfat_dev* dev)
{
	struct exfat_entry_label label_entry;
	struct exfat_entry_bitmap bitmap_entry;
	struct exfat_entry_upcase upcase_entry;

	init_label_entry(&label_entry);
	init_bitmap_entry(&bitmap_entry);
	init_upcase_entry(&upcase_entry);

	if (exfat_write(dev, &label_entry, sizeof(struct exfat_entry)) < 0)
		return 1;
	if (exfat_write(dev, &bitmap_entry, sizeof(struct exfat_entry)) < 0)
		return 1;
	if (exfat_write(dev, &upcase_entry, sizeof(struct exfat_entry)) < 0)
		return 1;
	return 0;
}

const struct fs_object rootdir =
{
	.get_alignment = rootdir_alignment,
	.get_size = rootdir_size,
	.write = rootdir_write,
};
