diff --git a/source/jfile.cpp b/source/jfile.cpp index 84c2617..1b857a4 100644 --- a/source/jfile.cpp +++ b/source/jfile.cpp @@ -192,6 +192,74 @@ namespace file } } + // Obté un "std::ifstream" al arxiu que se li demana, independentment de la font (arxius individual en carpeta, o arxiu de recursos) + std::ifstream getFileStream(const std::string resourcename, int *filesize, const bool binary) + { + // Si tenim configurat agafar els recursos de arxiu, pero encara no tenim la taula de continguts carregada... + if (file_source == SOURCE_FILE and toc.size() == 0) + { + // Si fallem al intentar carregar la taula de continguts de l'arxiu de recursos, canviem a pillar els recursos de carpeta + if (not getTableOfContents()) + { + setSource(SOURCE_FOLDER); + } + } + + std::ifstream f; + + // Si estem pillant els recursos de un arxiu de recursos... + if (file_source == SOURCE_FILE) + { + // Busquem el recurs en la taula de continguts usant la ruta + bool found = false; + uint32_t count = 0; + while (!found && count < toc.size()) + { + found = (resourcename == toc[count].path); + if (!found) + { + count++; + } + } + + // Si no trobem el recurs, petem el mame + if (!found) + { + // [TODO] Donar mes informació de quin recurs no havem trobat + perror("El recurs no s'ha trobat en l'arxiu de recursos"); + exit(1); + } + + // Agafem el tamany del recurs de la taula de continguts + if (filesize) *filesize = toc[count].size; + + // obrim l'arxiu de recursos + f.open(resource_filename.c_str(), binary ? std::ios::binary : std::ios::in); + if (!f.is_open()) // En el raruno cas de que a este altures pete al obrir el arxiu de recursos, petem el mame + { + // [TODO] Donar mes informació de quin recurs no havem trobat + perror("No s'ha pogut obrir l'arxiu de recursos"); + exit(1); + } + + // Anem a la posició on està el recurs que volem. Amb açò "f" ja està preparat per a ser tornar. + // Ojo, realment estic tornant un FILE* al arxiu de recursos, pero ja apuntant al moment en que comença el recurs que volem. + // Ho dic perque si fem fseek(f, 0, SEEK_SET) tornarà al principi de l'arxiu de recursos, no del recurs. Tindre-ho en compte. + f.seekg(toc[count].offset); + } + else + { + // Si estem pillant els recursos de carpeta, simplement obrim el arxiu en questió i tornem el FILE* associat. + f.open((resource_folder + resourcename), binary ? std::ios::binary : std::ios::in); + f.seekg(0, std::ios_base::end); + if (filesize) *filesize = f.tellg(); + f.seekg(0, std::ios_base::beg); + } + + // Tornar el punter FILE* al arxiu. OJO! Tenim que tancar-lo quan acabem amb ell + return f; + } + // Obté un "FILE*" al arxiu que se li demana, independentment de la font (arxius individual en carpeta, o arxiu de recursos) FILE *getFilePointer(const std::string resourcename, int *filesize, const bool binary) { diff --git a/source/jfile.h b/source/jfile.h index 7d5c92f..986cb5e 100644 --- a/source/jfile.h +++ b/source/jfile.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include #define SOURCE_FILE 0 @@ -23,6 +24,13 @@ namespace file /// @param src SOURCE_FILE o SOURCE_FOLDER, si es vol que se pillen recursos de arxiu o de carpeta void setSource(const int src); + /// @brief Obté un "std::ifstream" al arxiu que se li demana, independentment de la font (arxius individual en carpeta, o arxiu de recursos). Recordar tancar-lo al acabar amb ell. + /// @param resourcename el nom de l'arxiu que volem obrir + /// @param filesize paràmetre de retorn. Ací es torna el tamany de l'arxiu + /// @param binary si volem obrir el arxiu en format binary + /// @return un std::ifstream al arxiu + std::ifstream getFileStream(const std::string resourcename, int *filesize = nullptr, const bool binary = false); + /// @brief Obté un "FILE*" al arxiu que se li demana, independentment de la font (arxius individual en carpeta, o arxiu de recursos). Recordar tancar-lo al acabar amb ell. /// @param resourcename el nom de l'arxiu que volem obrir /// @param filesize paràmetre de retorn. Ací es torna el tamany de l'arxiu