cake
/
libp7
Archived
1
0
Fork 1
This repository has been archived on 2024-03-16. You can view files and clone it, but cannot push or open issues or pull requests.
libp7/include/libp7/types.h

215 lines
7.4 KiB
C

/* *****************************************************************************
* libp7/types.h -- types brought to you by libp7.
* Copyright (C) 2016-2017 Thomas "Cakeisalie5" Touhey <thomas@touhey.fr>
*
* This file is part of libp7.
* libp7 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 3.0 of the License,
* or (at your option) any later version.
*
* libp7 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 libp7; if not, see <http://www.gnu.org/licenses/>.
*
* This header contain the main types libp7 uses.
* ************************************************************************** */
#ifndef LIBP7_TYPES_H
# define LIBP7_TYPES_H
# include <libp7/config.h>
# if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) \
&& !defined(__WINDOWS__)
# define __WINDOWS__
# endif
# include <stdio.h>
# include <stdlib.h>
# include <stdint.h>
# ifdef __WINDOWS__
# include <malloc.h>
# else
# include <alloca.h>
# endif
# include <libg1m.h>
# ifdef __cplusplus
extern "C" {
# endif
/* ************************************************************************** */
/* Base types */
/* ************************************************************************** */
/* The integer types used by libp7.
* They used to be defined as `uint_fast16_t` and `uint_fast32_t`, but in
* the end, I got bored and just chose the equivalents of `uint_least16_t`
* and `uint_least32_t`, which are `unsigned int` and `unsigned long`. */
typedef unsigned int p7ushort_t;
typedef unsigned long p7uint_t;
/* Also, if you want to print them using printf without knowing what's behind
* them, use these macros, it makes you 20% cooler. */
# define PRIuP7SHORT "u"
# define PRIxP7SHORT "x"
# define PRIXP7SHORT "X"
# define PRIuP7INT "lu"
# define PRIxP7INT "lx"
# define PRIXP7INT "lX"
/* And here are size_t printf formats. Oh yeah, because "zu" is not in
* the Microsoft Windows libc. Too bad, huh? */
# ifndef PRIuSIZE
# if defined(_WIN64)
# define PRIuSIZE "l64u"
# elif defined(_WIN32)
# define PRIuSIZE "u"
# else
# define PRIuSIZE "zu"
# endif
# endif
/* The handle is actually a private structure (one less cause of compatibility
* breaking!). But here are enough things to use pointers on it anyway,
* and the size of one for stack allocation using `alloca`. */
struct p7_handle_s;
typedef struct p7_handle_s p7_handle_t;
extern const size_t p7_handle_size;
/* And here is an easy macro for using alloca with this size: */
# define p7_alloca_handle() (alloca(p7_handle_size))
/* ************************************************************************** */
/* Callbacks */
/* ************************************************************************** */
/* p7_list_device_t:
* This callback is for serial devices listing; for each device found, the
* callback is found with its device. */
typedef void (*p7_list_device_t)(void*, const char*);
/* p7_screenfunc_t:
* This callback is for `p7_getscreen`: when a screen is received, it is called
* with the width, the height and the pixels, and returns either 1 if we should
* continue, or 0 if we should stop. */
typedef int (*p7_screenfunc_t)(int, int, uint32_t**);
/* p7_disp_t:
* This callback is for displaying the progress of an operation (usually
* file/data transfer). It receives the packet ID and the total number of
* packets. For initialization of the display, this callback is called with
* a packet ID superior to the number of packets. */
typedef void (*p7_disp_t)(p7ushort_t, p7ushort_t);
/* p7_confirm_t:
* This callback is for if a confirmation needs to be obtained from the user
* (usually before overwriting a file). Returns 0 if the user has denied,
* and something else if he has confirmed. */
typedef int (*p7_confirm_t)(void);
/* p7_list_t:
* This callback is for storage file listing.
* The first argument is the cookie, the second argument is the
* directory name (NULL if the file is as root), the third argument is the
* file name (NULL if the entry is a directory), and the last argument
* is the filesize, if the entry is a file. */
typedef void (*p7_list_t)(void*, const char*, const char*, p7uint_t);
/* p7_mcslist_t:
* Basically the same as the previous one, but with the main memory.
* The MCS head given by libg1m contains the complementary information. */
typedef void (*p7_mcslist_t)(void*, const g1m_mcshead_t*);
/* ************************************************************************** */
/* Useful types */
/* ************************************************************************** */
/* An OS version. Must be of ASCII-DEC format MM.mm.ffff, where MM is the
* major, mm is the minor and ffff is the revision (flags). */
typedef struct {
unsigned int major;
unsigned int minor;
unsigned int rev;
} p7_version_t;
/* A CASIOWIN entry, which is the 0x80 bytes long entry at the beginning of
* the OS the bootcode reads for recognizing and running the OS. */
typedef struct {
/* OS version */
p7_version_t version;
/* Syscall table address */
p7uint_t syscall_table_offset;
} p7_casiowin_entry_t;
/* ************************************************************************** */
/* Server information */
/* ************************************************************************** */
/* This is the information an OS can provide using extended ACK in
* Protocol 7.00 (see `protocol/seven/eack.c` for the raw format).
* Some of the members (at the end of the structure) are for serving using
* a classical server - see `libp7/server.h`. */
typedef struct {
/* main information */
char product_id[17], username[17];
char hwid[9], cpuid[17];
/* preprogrammed ROM info */
int preprog_rom_wiped;
p7uint_t preprog_rom_capacity;
p7_version_t preprog_rom_version;
/* flash ROM and RAM info */
p7uint_t flash_rom_capacity, ram_capacity;
/* bootcode info */
int bootcode_wiped;
p7_version_t bootcode_version;
p7uint_t bootcode_offset, bootcode_size;
/* OS information */
int os_wiped;
p7_version_t os_version;
p7uint_t os_offset, os_size;
/* addresses - for serving */
const unsigned char *flash_rom, *ram;
const unsigned char *casiowin_entry, *bootcode;
} p7_server_t;
/* And here is the filesystem structure for serving using a classical
* Protocol 7.00 server (see `libp7/server.h`).
* It contains the static information, the callbacks and the working
* information (fields used while serving). */
typedef struct {
/* filesystem metadata */
const char *name;
void *cookie;
/* directory commands */
int (*directory_exists)(void *cookie, const char *dirname);
int (*create_directory)(void *cookie, const char *dirname);
int (*delete_directory)(void *cookie, const char *dirname);
int (*rename_directory)(void *cookie, const char *dirname,
const char *newdir);
/* working things - only libp7 should manipulate those */
char *working_directory, _wd[257];
} p7_filesystem_t;
# ifdef __cplusplus
}
# endif
# include <libp7/buffer.h>
#endif /* LIBP7_TYPES_H */