From 0d8d92cf4631f4a0a88fe04817d375f9e73408e4 Mon Sep 17 00:00:00 2001 From: salmoon Date: Wed, 28 Aug 2002 16:10:44 +0000 Subject: Initial revision --- mpio_tool/mpiosh.c | 667 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 667 insertions(+) create mode 100644 mpio_tool/mpiosh.c (limited to 'mpio_tool/mpiosh.c') diff --git a/mpio_tool/mpiosh.c b/mpio_tool/mpiosh.c new file mode 100644 index 0000000..82709e5 --- /dev/null +++ b/mpio_tool/mpiosh.c @@ -0,0 +1,667 @@ +/* -*- linux-c -*- */ + +/* + * + * $Id: mpiosh.c,v 1.1 2002/08/28 16:10:51 salmoon Exp $ + * + * Author: Andreas Büsching + * + * mpiosh - user interface of the mpio library, providing access to + * some model of the MPIO mp3 players. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#include +#include + +#include +#include + +#include "libmpio/debug.h" +#include "libmpio/mpio.h" + +#include "mpiosh.h" + +static mpiosh_t mpiosh; + +static mpiosh_cmd_t commands[] = { + { "debug", mpiosh_cmd_debug, YES }, + { "ver", mpiosh_cmd_version, NO }, + { "help", mpiosh_cmd_help, NO }, + { "dir", mpiosh_cmd_dir, NO }, + { "info", mpiosh_cmd_info, NO }, + { "mem", mpiosh_cmd_mem, YES }, + { "open", mpiosh_cmd_open, NO }, + { "close", mpiosh_cmd_close, NO }, + { "quit", mpiosh_cmd_quit, NO }, + { "exit", mpiosh_cmd_quit, NO }, + { "get", mpiosh_cmd_get, YES }, + { "put", mpiosh_cmd_put, YES }, + { "del", mpiosh_cmd_del, YES }, + { "dump", mpiosh_cmd_dump, NO }, + { "free", mpiosh_cmd_free, NO }, + { "format", mpiosh_cmd_format, NO }, + { "switch", mpiosh_cmd_switch, YES }, + { NULL, NULL, NO } +}; + +/* readline extensaions */ +void +mpiosh_readline_init(void) +{ + rl_readline_name = "mpio"; + rl_attempted_completion_function = mpiosh_readline_completion; +} + +char * +mpiosh_readline_comp_cmd(const char *text, int state) +{ + static mpiosh_cmd_t *cmd = NULL; + char *cmd_text = NULL; + + if (state == 0) { + cmd = commands; + } + + while (cmd->cmd) { + if ((*text == '\0') || (strstr(cmd->cmd, text) == cmd->cmd)) { + cmd_text = strdup(cmd->cmd); + cmd++; + break; + } + cmd++; + } + + return cmd_text; +} + +char ** +mpiosh_readline_completion(const char *text, int start, int end) +{ + char **matches = (char**)NULL; + + UNUSED(end); + + if (start == 0) + matches = completion_matches(text, mpiosh_readline_comp_cmd); + else { + + } + + return matches; +} + +/* helper functions */ +void +mpiosh_init(void) +{ + mpiosh.dev = NULL; + mpiosh.card = MPIO_INTERNAL_MEM; + mpiosh.prompt = PROMPT_INT; +} + + +mpiosh_cmd_t * +mpiosh_command_find(char *line) +{ + mpiosh_cmd_t *cmd = commands; + + while (cmd->cmd) { + if (strstr(line, cmd->cmd) == line) { + if (line[strlen(cmd->cmd)] == ' ' || + line[strlen(cmd->cmd)] == '\0') + return cmd; + } + cmd++; + } + + return NULL; +} + +char ** +mpiosh_command_get_args(char *line) +{ + char **args; + char *arg_start, *copy, *help, *prev; + int count = 0, i = 0, go = 1, in_quote = 0; + + copy = strdup(line); + arg_start = strchr(copy, ' '); + + if (arg_start == NULL) { + args = malloc(sizeof(char *)); + args[0] = NULL; + return args; + } + + while (*arg_start == ' ') arg_start++; + + help = arg_start; + while (help <= (copy + strlen(copy))) { + if (*help == '"') { + help++;count++; + + while (*help != '\0' && *help != '"') + help++; + help++; + while (*help == ' ') help++; + if (*help == '\0') break; + in_quote = 1; + } else if (((help > arg_start) && (*help == '\0')) || + (*help == ' ' && (*(help + 1) != '\0') && (*(help + 1) != ' '))) { + count++; + in_quote = 0; + help++; + } else + help++; + } + + args = malloc(sizeof(char *) * (count + 1)); + + help = prev = arg_start; + in_quote = 0; + while (go) { + if (*help == '"') in_quote = !in_quote, help++; + if (((*help == ' ') && !in_quote) || (in_quote && *help == '"') || + (*help == '\0')) { + if (*help == '\0') { + go = 0; + if (*prev == '\0') break; + } + + if (*prev == '"') { + if (*(help - 1) == '"') + *(help - 1) = '\0'; + else + *help = '\0'; + + args[i++] = strdup(prev + 1); + } else { + *help = '\0'; + args[i++] = strdup(prev); + } + + if (go) { + help++; + if (in_quote) { + while (*help != '"') help++; + help++; + in_quote = 0; + } else + while (*help == ' ') help++; + prev = help; + } + } else + help++; + } + args[i] = NULL; + + free(copy); + + return args; +} + +void +mpiosh_command_free_args(char **args) +{ + char **arg = args; + + while (*arg) free(*arg++); + + free(args); +} + +/* commands */ +void +mpiosh_cmd_debug(char *args[]) +{ + if (args[0] != NULL) { + if (!strcmp(args[0], "level")) { + debug_level(strtol(args[1], NULL, 0)); + } else if (!strcmp(args[0], "file")) { + debug_file(args[1]); + } else if (!strcmp(args[0], "on")) { + if (debug_level_get() == -1) + debug_level(1); + else + fprintf(stderr, "debug already activated for level %d\n", + debug_level_get()); + } else if (!strcmp(args[0], "off")) { + if (debug_level_get() == -1) + fprintf(stderr, "debug already deactivated\n"); + else + debug_level(-1); + } else { + fprintf(stderr, "unknown debug command\n"); + printf("debug [level|file|on|off] \n"); + } + } else { + fprintf(stderr, "error: no arguments given\n"); + printf("debug [level|file|on|off] \n"); + } +} + +void +mpiosh_cmd_version(char *args[]) +{ + UNUSED(args); + + printf("MPIO shell %s\n\n", VERSION); +} + +void +mpiosh_cmd_help(char *args[]) +{ + UNUSED(args); + + printf("debug[level|file|on|off] \n" + " modify debugging options\n"); + printf("ver\n" + " version of mpio package\n"); + printf("help\n" + " show known commands\n"); + printf("info\n" + " show information about MPIO player\n"); + printf("open\n" + " open connect to MPIO player\n"); + printf("close\n" + " close connect to MPIO player\n"); + printf("dev [i|e]\n" + " set current memory card. 'i' selects the internal and 'e'\n" + " selects the external memory card (smart media card)\n"); + printf("dir\n" + " list content of current memory card\n"); + printf("format\n" + " format current memory card\n"); + printf("dump\n" + " get all files of current memory card\n"); + printf("free\n" + " display amount of available bytes of current memory card\n"); + printf("put \n" + " write to memory card\n"); + printf("get \n" + " read from memory card\n"); + printf("del \n" + " deletes from memory card\n"); +} + +void +mpiosh_cmd_dir(char *args[]) +{ + BYTE *p; + BYTE month, day, hour, minute; + BYTE fname[100]; + WORD year; + DWORD fsize; + + UNUSED(args); + + if (mpiosh.dev == NULL) { + printf("open connection first!\n"); + return; + } + + p = mpio_directory_open(mpiosh.dev, mpiosh.card); + while (p != NULL) { + memset(fname, '\0', 100); + + mpio_dentry_get(mpiosh.dev, p, + fname, 100, + &year, &month, &day, + &hour, &minute, &fsize); + + printf ("%02d.%02d.%04d %02d:%02d %9d - %s\n", + day, month, year, hour, minute, fsize, fname); + + p = mpio_dentry_next(mpiosh.dev, p); + } +} + +void +mpiosh_cmd_info(char *args[]) +{ + mpio_info_t info; + + UNUSED(args); + + if (mpiosh.dev == NULL) { + printf("open connection first!\n"); + return; + } + + mpio_get_info(mpiosh.dev, &info); + + printf("firmware %s\n", info.firmware_id); + printf(" version : %s\n", info.firmware_version); + printf(" date : %s\n", info.firmware_date); + printf("memory\n"); + printf(" internal: %s\n", info.firmware_mem_internal); + printf(" external: %s\n", info.firmware_mem_external); +} + +void +mpiosh_cmd_mem(char *args[]) +{ + if (mpiosh.dev == NULL) { + printf("open connection first!\n"); + return; + } + + if (args[0] == NULL) { + printf("error: no argument given.\n"); + return; + } + + if (!strcmp(args[0], "e")) { + mpiosh.card = MPIO_EXTERNAL_MEM; + mpiosh.prompt = PROMPT_EXT; + printf("external memory card is selected\n"); + } else if (!strcmp(args[0], "i")) { + mpiosh.card = MPIO_INTERNAL_MEM; + mpiosh.prompt = PROMPT_INT; + printf("internal memory card is selected\n"); + } else { + printf("can not select memory card '%s'\n", args[0]); + } +} + +void +mpiosh_cmd_open(char *args[]) +{ + if (mpiosh.dev) { + printf("connection to MPIO player already opened\n"); + return; + } + + UNUSED(args); + + mpiosh.dev = mpio_init(); + + if (mpiosh.dev == NULL) + printf("error: could not open connection MPIO player\n"); + else + printf("connection to MPIO player is opened\n"); +} + +void +mpiosh_cmd_close(char *args[]) +{ + if (mpiosh.dev == NULL) { + printf("connection to MPIO player already closed\n"); + return; + } + + UNUSED(args); + + mpio_close(mpiosh.dev); + mpiosh.dev = NULL; + + printf("connection to MPIO player is closed\n"); +} + +void +mpiosh_cmd_quit(char *args[]) +{ + if (mpiosh.dev) { + printf("\nclosing connection to MPIO player\nHave a nice day\n"); + mpio_close(mpiosh.dev); + } + + UNUSED(args); + + exit(0); +} + +BYTE +mpiosh_callback_get(int read, int total) +{ + printf("\rretrieved %.2f %%", ((double) read / total) * 100.0 ); + fflush(stdout); + return 0; // continue +} + +void +mpiosh_cmd_get(char *args[]) +{ + int size; + + if (mpiosh.dev == NULL) { + printf("connection to MPIO player already closed\n"); + return; + } + + if (args[0] == NULL) { + printf("error: no argument given\n"); + return; + } + + size = mpio_file_get(mpiosh.dev, mpiosh.card, args[0], mpiosh_callback_get); + + printf("\n"); +} + +BYTE +mpiosh_callback_put(int read, int total) +{ + printf("\rwrote %.2f %%", ((double) read / total) * 100.0 ); + fflush(stdout); + return 0; // continue +} + +void +mpiosh_cmd_put(char *args[]) +{ + int size; + + if (mpiosh.dev == NULL) { + printf("connection to MPIO player already closed\n"); + return; + } + + if (args[0] == NULL) { + printf("error: no argument given\n"); + return; + } + + size = mpio_file_put(mpiosh.dev, mpiosh.card, args[0], mpiosh_callback_put); + + printf("\n"); +} + +BYTE +mpiosh_callback_del(int read, int total) +{ + printf("\rdeleted %.2f %%", ((double) read / total) * 100.0 ); + fflush(stdout); + return 0; // continue +} + +void +mpiosh_cmd_del(char *args[]) +{ + int size; + + if (mpiosh.dev == NULL) { + printf("connection to MPIO player already closed\n"); + return; + } + + if (args[0] == NULL) { + printf("error: no argument given\n"); + return; + } + + size = mpio_file_del(mpiosh.dev, mpiosh.card, args[0], mpiosh_callback_del); + + printf("\n"); +} + + +void +mpiosh_cmd_dump(char *args[]) +{ + BYTE *p; + BYTE month, day, hour, minute; + BYTE fname[100]; + char *arg[2]; + WORD year; + DWORD fsize; + + if (mpiosh.dev == NULL) { + printf("open connection first!\n"); + return; + } + + UNUSED(args); + + args[0] = fname; + args[1] = NULL; + + p = mpio_directory_open(mpiosh.dev, mpiosh.card); + while (p != NULL) { + memset(fname, '\0', 100); + + mpio_dentry_get(mpiosh.dev, p, + fname, 100, + &year, &month, &day, + &hour, &minute, &fsize); + + printf("getting '%s' ... ", arg[0]); + mpiosh_cmd_get(arg); + + p = mpio_dentry_next(mpiosh.dev, p); + } +} + +void +mpiosh_cmd_free(char *args[]) +{ + int free, kbytes; + + if (mpiosh.dev == NULL) { + printf("open connection first!\n"); + return; + } + + UNUSED(args); + + kbytes = mpio_memory_free(mpiosh.dev, mpiosh.card, &free); + + printf("%d KB of %d KB are available\n", free, kbytes); +} + +BYTE +mpiosh_callback_format(int read, int total) +{ + printf("\rformatted %.2f %%", ((double) read / total) * 100.0 ); + fflush(stdout); + return 0; // continue +} + +void +mpiosh_cmd_format(char *args[]) +{ + char answer[512]; + + if (mpiosh.dev == NULL) { + printf("open connection first!\n"); + return; + } + + UNUSED(args); + + printf("This will destroy all tracks saved on the memory card. " + "Are you sure (y/n)? "); + + fgets(answer, 511, stdin); + + if (answer[0] == 'y' || answer[0] == 'Y') { + if (mpio_memory_format(mpiosh.dev, mpiosh.card, + mpiosh_callback_format) == -1) + printf("\nfailed\n"); + else + printf("\n"); + } +} + +void +mpiosh_cmd_switch(char *args[]) +{ + if (mpiosh.dev == NULL) { + printf("open connection first!\n"); + return; + } + + UNUSED(args); +} + +int +main(int argc, char *argv[]) { + char * line; + mpiosh_cmd_t *cmd; + + UNUSED(argc); + UNUSED(argv); + + setenv("mpio_debug", "", 0); + setenv("mpio_color", "", 0); + + /* no unwanted interruption anymore */ + signal(SIGINT, SIG_IGN); + + /* init readline and history */ + rl_readline_name = "mpio"; + using_history(); + + debug_init(); + mpiosh_readline_init(); + + mpiosh_init(); + mpiosh.dev = mpio_init(); + + if (!mpiosh.dev) { + printf("could not find MPIO player.\n"); + } + + if (mpiosh.card == MPIO_INTERNAL_MEM) + mpiosh.prompt = PROMPT_INT; + else + mpiosh.prompt = PROMPT_EXT; + + while ((line = readline(mpiosh.prompt))) { + if (*line == '\0') continue; + + cmd = mpiosh_command_find(line); + + if (cmd) { + char ** help, **args = mpiosh_command_get_args(line); + help = args; + + cmd->func(args); + mpiosh_command_free_args(args); + } else + printf("unknown command: %s\n", line); + + add_history(line); + } + + mpiosh_cmd_quit(NULL); + + return 0; +} + + -- cgit v1.2.3