Rimozione di Flash.h da libreria per adattare alla DUE

Buongiorno, ho modificato completamente una lib webserver per adattarla alla DUE, mi è rimasto questo pezzo di libreria che va sostituito per eliminare l’uso dell’utility flash.h

avrei bisogno gentilmente di qualche maestro degli array

Questa flash string che si chiama “mime_types” ha tutti quei parametri all’interno che sembrerebbero essere string, ma poi vengono trattati e letti come singoli char cercando i simboli ‘.’ ‘|’ ecc. confrontato col nome del file per capire di che tipo è.
Qualcuno mi saprebbe dire come dichiarare la variabile “mime_types” per renderla compatibile con la funzione get_mime_type_from_filename()?

Lo scopo di questo pezzo di codice è quello di identificare l’estensione del file, per poi comunicare al client di prepararsi a ricevere quel tipo di file e visualizzarlo correttamente.

Grazie

FLASH_STRING(mime_types,
  "HTM*text/html|"
  "TXT*text/plain|"
  "CSS*text/css|"
  "XML*text/xml|"
  "JS*text/javascript|"
  "GIF*image/gif|"
  "JPG*image/jpeg|"
  "PNG*image/png|"
  "ICO*image/vnd.microsoft.icon|"
  "MP3*audio/mpeg|"
);
WebServer::MimeType WebServer::get_mime_type_from_filename(const char* filename) {
  MimeType r = text_html_content_type;
  if (!filename) {
    return r;
  }

  char* ext = strrchr(filename, '.');
  if (ext) {
    // We found an extension. Skip past the '.'
    ext++;

    char ch;
    int i = 0;
    while (i < mime_types.length()) {
      // Compare the extension.
      char* p = ext;
      ch = mime_types[i];
      while (*p && ch != '*' && toupper(*p) == ch) {
	p++; i++;
	ch = mime_types[i];
      }
      if (!*p && ch == '*') {
	// We reached the end of the extension while checking
	// equality with a MIME type: we have a match. Increment i
	// to reach past the '*' char, and assign it to `mime_type'.
	r = ++i;
	break;
      } 
      else {
	// Skip past the the '|' character indicating the end of a
	// MIME type.
    	while (mime_types[i++] != '|');
      }
    }
  }
  return r;
}

Ma non è un normale char array ?

char mime_types[] = "............................";

... perché vedo che poi ci accede come se lo fosse, es. qui :

ch = mime_types[i];

Guglielmo

Grazie Guglielmo

cambiandola così

char mime_types[] = "HTM*text/html|TXT*text/plain|CSS*text/css|XML*text/xml|JS*text/javascript|GIF*image/gif|JPG*image/jpeg|PNG*image/png|ICO*image/vnd.microsoft.icon|MP3*audio/mpeg|" ;

Non compila, da errori

get_mime_type_from_filename(const char*)’:
error: request for member ‘length’ in ‘mime_types’, which is of non-class type 'char

non è che la flash.h organizza i blocchi?

FLASH_STRING(mime_types,
  "blocco 1"
  "blocco 2" 
...
...

Ma non hai una definizione da qualche parte di mime_types ???

Puoi medere tutto il codice e le librerie che usa ???

Guglielmo

Ok, nella libreria Flash è definito :

#define FLASH_STRING(name, value) \
  static const char name##_flash[] PROGMEM = value; \
  _FLASH_STRING name(name##_flash);

Quindi ... quando chiami :

FLASH_STRING(mime_types,
  "HTM*text/html|"
  "TXT*text/plain|"
  "CSS*text/css|"
  "XML*text/xml|"
  "JS*text/javascript|"
  "GIF*image/gif|"
  "JPG*image/jpeg|"
  "PNG*image/png|"
  "ICO*image/vnd.microsoft.icon|"
  "MP3*audio/mpeg|"
);

... crea una variabile di tipo "static const char" con il nome che gli passi seguito da "_flash" ed è un char array (... che viene messo in PROGMEM)!

Quindi ... prova a definirlo come :

static const char mime_types[] = "............................";

e vediamo che fa ... :roll_eyes:

Guglielmo

Se la libreria Flash.h è questa: http://arduiniana.org/libraries/Flash/

FLASH_STRING è una macro:

#define FLASH_STRING(name, value) \
  static const char name##_flash[] PROGMEM = value; \
  _FLASH_STRING name(name##_flash);

Quindi crea la stringa di char chiamata name_flash se non ricordo male (l'operatore ## unisce) con i valori di "value". Il problema è che _FLASH_STRING è una classe quindi non puoi semplicemente mettere l'array di char senza poi cambiare anche il resto di come vengono ritirati fuori i dati

Ci siamo accavallati, comunque ripeto quanto detto: vuole anche una classe, difatti poi il compilatore ti avverte della cosa. Va rivisto il codice.

leo72:
Il problema è che _FLASH_STRING è una classe quindi non puoi semplicemente mettere l’array di char senza poi cambiare anche il resto di come vengono ritirati fuori i dati

Vero … m’ero perso il pezzo alla riga di sotto :grin: :grin: :grin:

Viene creata anche una classe che avrà all’interno tutti i vari metodi … pablos, tocca ce mette le mani in tutto il resto del codice dove poi usa la mime_types … :roll_eyes:

Guglielmo

eccomi scusate, mi sono dovuto assentare.

Quindi … prova a definirlo come :

static const char mime_types[] = "............................";

niente … stessi errori

Dunque: in altre condizioni l’ho risolta così semplicemente, ci ho sparato direttamente uno String :slight_smile: e funziona

//FLASH_STRING(content_type_msg, "Content-Type: ");  //originale 
const String content_type_msg = "Content-Type: "; // modificata

//client_ << content_type_msg; // originale
client_.print(content_type_msg); // modificata

convertendola anch’essa in un unica stringa viene una cosa inguardabile, però sembra funzionare, devo vedere facendo dei test se riconosce tutti i tipi di file
const String mime_types = "HTM*text/html|TXT*text/plain|CSS*text/css|XML*text/xml|JS*text/javascript|GIF*image/gif|JPG*image/jpeg|PNG*image/png|ICO*image/vnd.microsoft.icon|MP3*audio/mpeg|" ;
dichiarandole tutte const mi risparmio 200Byte +/- (ottima idea gpb)

va bene … ci studio un po’ grazie a entrambi per ora :slight_smile: , se avete idee migliori esponete pure

ciao

Ma qui hai risolto? Se non ho capito male, la TinyWebServer modificata che hai pubblicato nell'altro thread era la lib webserver a cui ti riferivi all'inizio di questa discussione, giusto?

Si, l’ho scritto che funziona, convertendo le istruzioni in stringhe funziona, aspettavo a chiudere per vedere se c’era un metodo migliore

Ah, scusa, non avevo letto bene l’edit… sarà stato troppo presto :sweat_smile:
Se per “schifezza” ti riferisci alla lunghezza, puoi spezzare la dichiarazione su più righe col carattere “”:

const String mime_types = "HTM*text/html|" \
             "TXT*text/plain|CSS*text/css|" \
             "XML*text/xml|JS*text/javascript|" \
             "GIF*image/gif|JPG*image/jpeg|" \
             "PNG*image/png|ICO*image/vnd.microsoft.icon|" \
             "MP3*audio/mpeg|";

Buona idea ... questa non la sapevo :) grazie