diff -ur libofx-0.8.3/lib/ofx_preproc.cpp win32-libofx-0.8.3/lib/ofx_preproc.cpp --- libofx-0.8.3/lib/ofx_preproc.cpp Tue Jan 9 02:38:33 2007 +++ win32-libofx-0.8.3/lib/ofx_preproc.cpp Thu Feb 8 13:53:59 2007 @@ -20,8 +20,14 @@ #include #include #include +#include // for mktemp() on win32/mingw #include #include +#ifdef OS_WIN32 +#include // for GetModuleFileName() +#undef ERROR +#undef DELETE +#endif #include "ParserEventGeneratorKit.h" #include "libofx.h" #include "messages.hh" @@ -51,6 +57,57 @@ "~/"}; const unsigned int READ_BUFFER_SIZE = 1024; +#ifdef OS_WIN32 +# define DIR_SEPARATOR_S "\\" +#else +# define DIR_SEPARATOR_S "/" +#endif +// The filenames can get quite long on windows. +#define TMPFILEBUFSIZE 120 + +std::string get_tmp_dir() +{ + // Tries to mimic the behaviour of + // http://developer.gnome.org/doc/API/2.0/glib/glib-Miscellaneous-Utility-Functions.html#g-get-tmp-dir +#ifdef OS_WIN32 + char *var; + var = getenv("TMPDIR"); + if (var) return var; + var = getenv("TMP"); + if (var) return var; + var = getenv("TEMP"); + if (var) return var; + return "C:\\"; +#else + return "/tmp"; +#endif +} + +#ifdef OS_WIN32 +std::string get_dtd_installation_directory() +{ + // Partial implementation of + // http://developer.gnome.org/doc/API/2.0/glib/glib-Windows-Compatibility-Functions.html#g-win32-get-package-installation-directory + char ch_fn[MAX_PATH], *p; + std::string str_fn; + + if (!GetModuleFileName(NULL, ch_fn, MAX_PATH)) return ""; + + if ((p = strrchr(ch_fn, '\\')) != NULL) + *p = '\0'; + + p = strrchr(ch_fn, '\\'); + if (p && (_stricmp(p+1, "bin") == 0 || + _stricmp(p+1, "lib") == 0)) + *p = '\0'; + + str_fn = ch_fn; + str_fn += "\\share\\libofx\\dtd\\"; + + return str_fn; +} +#endif + /** @brief File pre-processing of OFX AND for OFC files * * Takes care of comment striping, dtd locating, etc. @@ -66,7 +123,7 @@ char buffer[READ_BUFFER_SIZE]; string s_buffer; char *filenames[3]; - char tmp_filename[50]; + char tmp_filename[TMPFILEBUFSIZE]; libofx_context=(LibofxContext*)ctx; @@ -75,8 +132,10 @@ message_out(DEBUG, string("ofx_proc_file():Opening file: ")+ p_filename); input_file.open(p_filename); - strncpy(tmp_filename,"/tmp/libofxtmpXXXXXX",50); - mkstemp(tmp_filename); + std::string tmpdir = get_tmp_dir(); + std::string tmpfiletemplate = tmpdir + DIR_SEPARATOR_S "libofxtmpXXXXXX"; + strncpy(tmp_filename,tmpfiletemplate.c_str(),TMPFILEBUFSIZE); + mktemp(tmp_filename); tmp_file.open(tmp_filename); message_out(DEBUG,"ofx_proc_file(): Creating temp file: "+string(tmp_filename)); @@ -203,7 +262,7 @@ ofstream tmp_file; string s_buffer; char *filenames[3]; - char tmp_filename[50]; + char tmp_filename[TMPFILEBUFSIZE]; int pos; LibofxContext *libofx_context; @@ -216,8 +275,10 @@ } s_buffer=string(s, size); - strncpy(tmp_filename,"/tmp/libofxtmpXXXXXX",50); - mkstemp(tmp_filename); + std::string tmpdir = get_tmp_dir(); + std::string tmpfiletemplate = tmpdir + DIR_SEPARATOR_S "libofxtmpXXXXXX"; + strncpy(tmp_filename,tmpfiletemplate.c_str(),TMPFILEBUFSIZE); + mktemp(tmp_filename); tmp_file.open(tmp_filename); message_out(DEBUG,"ofx_proc_file(): Creating temp file: "+string(tmp_filename)); @@ -439,8 +500,16 @@ string dtd_path_filename; bool dtd_found=false; - for(i=0;i