Skip to content

Commit

Permalink
starting filename handling in Unicode everywhere
Browse files Browse the repository at this point in the history
  • Loading branch information
peclik committed Mar 21, 2011
1 parent 189aacb commit 1bba4d4
Show file tree
Hide file tree
Showing 13 changed files with 211 additions and 134 deletions.
14 changes: 7 additions & 7 deletions Common/Header/RasterTerrain.h 100644 → 100755
Expand Up @@ -64,7 +64,7 @@ class RasterMap {
short GetField(const double &Latitude,
const double &Longitude);

virtual bool Open(char* filename) = 0;
virtual bool Open(const wchar_t* filename) = 0;
virtual void Close() = 0;
virtual void Lock() = 0;
virtual void Unlock() = 0;
Expand Down Expand Up @@ -123,7 +123,7 @@ class RasterMapCache: public RasterMap {
short LookupTerrainCacheFile(const long &SeekPos);
void OptimizeCash(void);

virtual bool Open(char* filename);
virtual bool Open(const wchar_t* filename);
virtual void Close();
void Lock();
void Unlock();
Expand Down Expand Up @@ -155,7 +155,7 @@ class RasterMapRaw: public RasterMap {
}
short *TerrainMem;
virtual void SetFieldRounding(double xr, double yr);
virtual bool Open(char* filename);
virtual bool Open(const wchar_t* filename);
virtual void Close();
void Lock();
void Unlock();
Expand All @@ -177,14 +177,14 @@ class RasterMapJPG2000: public RasterMap {
void SetViewCenter(const double &Latitude,
const double &Longitude);
virtual void SetFieldRounding(double xr, double yr);
virtual bool Open(char* filename);
virtual bool Open(const wchar_t* filename);
virtual void Close();
void Lock();
void Unlock();
void ServiceFullReload(double lat, double lon);

protected:
char jp2_filename[MAX_PATH];
wchar_t jp2_filename[MAX_PATH*2];
virtual short _GetFieldAtXY(unsigned int lx,
unsigned int ly);
bool TriggerJPGReload;
Expand All @@ -210,7 +210,7 @@ class RasterTerrain {
return terrain_initialised;
}
static RasterMap* TerrainMap;
static bool CreateTerrainMap(char *zfilename);
static bool CreateTerrainMap(const wchar_t *zfilename);

public:
static void Lock(void);
Expand Down Expand Up @@ -255,7 +255,7 @@ class RasterWeather {
void Reload(double lat, double lon);
int weather_time;
RasterMap* weather_map[MAX_WEATHER_MAP];
void RASP_filename(char* rasp_filename, const TCHAR* name);
void RASP_filename(wchar_t* rasp_filename, const wchar_t* name);
bool LoadItem(int item, const TCHAR* name);
void SetViewCenter(double lat, double lon);
void ServiceFullReload(double lat, double lon);
Expand Down
Empty file modified Common/Header/Utils.h 100644 → 100755
Empty file.
2 changes: 1 addition & 1 deletion Common/Header/jasper/RasterTile.h 100644 → 100755
Expand Up @@ -69,7 +69,7 @@ class RasterTileCache {
bool GetScanType(void);
short GetField(unsigned int lx,
unsigned int ly);
void LoadJPG2000(char* jp2_filename);
void LoadJPG2000(const wchar_t* jp2_filename);
bool GetInitialised(void);
void Reset();
void SetInitialised(bool val);
Expand Down
4 changes: 2 additions & 2 deletions Common/Header/jasper/jas_stream.h 100644 → 100755
Expand Up @@ -294,7 +294,7 @@ typedef struct {
\******************************************************************************/

/* Open a file as a stream. */
jas_stream_t *jas_stream_fopen(const char *filename, const char *mode);
jas_stream_t *jas_stream_fopen(const wchar_t *filename, const char *mode);

/* Open a memory buffer as a stream. */
jas_stream_t *jas_stream_memopen(char *buf, int bufsize);
Expand All @@ -303,7 +303,7 @@ jas_stream_t *jas_stream_memopen(char *buf, int bufsize);
jas_stream_t *jas_stream_fdopen(int fd, const char *mode);

/* Open a stdio stream as a stream. */
jas_stream_t *jas_stream_reopen(const char *path, const char *mode, FILE *fp);
jas_stream_t *jas_stream_reopen(const wchar_t *path, const char *mode, FILE *fp);

/* Open a temporary file as a stream. */
jas_stream_t *jas_stream_tmpfile(void);
Expand Down
75 changes: 37 additions & 38 deletions Common/Source/RasterTerrain.cpp
Expand Up @@ -521,57 +521,52 @@ void RasterTerrain::OpenTerrain(void)
CreateProgressDialog(gettext(TEXT("_@M900_"))); // Loading Terrain File...
SetProgressStepSize(2);

TCHAR szFile[MAX_PATH] = TEXT("\0");
wchar_t szFile[MAX_PATH] = L"\0";

GetRegistryString(szRegistryTerrainFile, szFile, MAX_PATH);

TCHAR szOrigFile[MAX_PATH] = TEXT("\0");
char zfilename[MAX_PATH];
wchar_t szOrigFile[MAX_PATH] = L"\0";

ExpandLocalPath(szFile);
_tcscpy(szOrigFile, szFile);
wcscpy(szOrigFile, szFile);
ContractLocalPath(szOrigFile);

SetRegistryString(szRegistryTerrainFile, TEXT("\0"));
unicode2ascii(szFile, zfilename, MAX_PATH);

static TCHAR szMapFile[MAX_PATH] = TEXT("\0");
if (strlen(zfilename)==0) {
if (wcslen(szFile)==0) {
StartupStore(_T(". No Terrain File configured%s"),NEWLINE);
GetRegistryString(szRegistryMapFile, szMapFile, MAX_PATH);
ExpandLocalPath(szMapFile);
_tcscpy(szFile,szMapFile);
wcscat(szFile,TEXT("/terrain.jp2"));
wcscpy(szFile,szMapFile);
wcscat(szFile, L"/terrain.jp2");
StartupStore(_T(". Attempting to use JP2 <%s> inside mapfile%s"),szFile,NEWLINE);
unicode2ascii(szFile, zfilename, MAX_PATH);

// support terrain.dat inside xcm files
if (CreateTerrainMap(zfilename)) {
if (CreateTerrainMap(szFile)) {
SetRegistryString(szRegistryTerrainFile, szOrigFile);
terrain_initialised = true;
return;
} else {
_tcscpy(szFile,szMapFile);
wcscat(szFile,TEXT("/terrain.dem"));
wcscpy(szFile,szMapFile);
wcscat(szFile, L"/terrain.dem");
StartupStore(_T(". Attempting to use DEM <%s> inside mapfile%s"),szFile,NEWLINE);
unicode2ascii(szFile, zfilename, MAX_PATH);
}
}

// TODO code: Check locking, especially when reloading a file.
// TODO bug: Fix cache method

if (CreateTerrainMap(zfilename)) {
if (CreateTerrainMap(szFile)) {
SetRegistryString(szRegistryTerrainFile, szOrigFile);
terrain_initialised = true;
return; // 100610
} else {
_tcscpy(szFile,szMapFile);
wcscat(szFile,TEXT("/terrain.dat"));
wcscpy(szFile,szMapFile);
wcscat(szFile, L"/terrain.dat");
StartupStore(_T(". Attempting to use DAT <%s> inside mapfile%s"),szFile,NEWLINE);
unicode2ascii(szFile, zfilename, MAX_PATH);

if (CreateTerrainMap(zfilename)) {
if (CreateTerrainMap(szFile)) {
SetRegistryString(szRegistryTerrainFile, szOrigFile);
terrain_initialised = true;
return;
Expand All @@ -588,8 +583,8 @@ void RasterTerrain::OpenTerrain(void)
}


bool RasterTerrain::CreateTerrainMap(char *zfilename) {
if (strstr(zfilename,".jp2")) {
bool RasterTerrain::CreateTerrainMap(const wchar_t *zfilename) {
if (wcsstr(zfilename, L".jp2")) {
TerrainMap = new RasterMapJPG2000();
if (!TerrainMap)
return false;
Expand Down Expand Up @@ -617,14 +612,17 @@ bool RasterTerrain::CreateTerrainMap(char *zfilename) {

///////// Specialised open/close routines ///////////////////

bool RasterMapCache::Open(char* zfilename) {
bool RasterMapCache::Open(const wchar_t* zfilename) {

terrain_valid = false;
if (strlen(zfilename)<=0) {
if (wcslen(zfilename)<=0) {
return false;
}
if (!fpTerrain) {
fpTerrain = zzip_fopen(zfilename, "rb");
char utfname[MAX_PATH*2];
unicode2utf(zfilename, utfname, countof(utfname));

fpTerrain = zzip_fopen(utfname, "rb");
if (!fpTerrain) {
return false;
}
Expand Down Expand Up @@ -655,20 +653,21 @@ bool RasterMapCache::Open(char* zfilename) {
}


bool RasterMapRaw::Open(char* zfilename) {
bool RasterMapRaw::Open(const wchar_t* zfilename) {
ZZIP_FILE *fpTerrain;

max_field_value = 0;
terrain_valid = false;

if (strlen(zfilename)<=0)
if (wcslen(zfilename)<=0)
return false;

TCHAR ucfilename[MAX_PATH];
ascii2unicode(zfilename, ucfilename, MAX_PATH);
StartupStore(_T(". Terrain Open RasterMapRaw <%s>%s"),ucfilename,NEWLINE); // 100102
StartupStore(_T(". Terrain Open RasterMapRaw <%s>%s"),zfilename,NEWLINE); // 100102

fpTerrain = zzip_fopen(zfilename, "rb");
char utfname[MAX_PATH*2];
unicode2utf(zfilename, utfname, countof(utfname));

fpTerrain = zzip_fopen(utfname, "rb");
if (fpTerrain == NULL) {
StartupStore(_T(". Terrain RasterMapRaw Open failed%s"),NEWLINE); // 100102
return false;
Expand Down Expand Up @@ -722,8 +721,8 @@ bool RasterMapRaw::Open(char* zfilename) {
}


bool RasterMapJPG2000::Open(char* zfilename) {
strcpy(jp2_filename,zfilename);
bool RasterMapJPG2000::Open(const wchar_t* zfilename) {
wcscpy(jp2_filename,zfilename);

// force first-time load
TriggerJPGReload = true;
Expand Down Expand Up @@ -919,17 +918,17 @@ int RasterWeather::IndexToTime(int x) {
}


void RasterWeather::RASP_filename(char* rasp_filename,
const TCHAR* name) {
TCHAR fname[MAX_PATH];
_stprintf(fname,
TEXT("xcsoar-rasp.dat/%s.curr.%04dlst.d2.jp2"),
void RasterWeather::RASP_filename(wchar_t* rasp_filename,
const wchar_t* name) {
wchar_t fname[MAX_PATH];
wsprintf(fname,
L"xcsoar-rasp.dat/%s.curr.%04dlst.d2.jp2",
name, IndexToTime(weather_time));
LocalPathS(rasp_filename, fname);
LocalPath(rasp_filename, fname);
}

bool RasterWeather::LoadItem(int item, const TCHAR* name) {
char rasp_filename[MAX_PATH];
wchar_t rasp_filename[MAX_PATH];
RASP_filename(rasp_filename, name);
weather_map[item] = new RasterMapJPG2000();
weather_map[item]->Open(rasp_filename);
Expand Down
16 changes: 11 additions & 5 deletions Common/Source/jasper/base/jas_stream.c 100644 → 100755
Expand Up @@ -92,6 +92,8 @@
#include <io.h>
#endif

#include "utils/stringext.h"

/******************************************************************************\
* Local function prototypes.
\******************************************************************************/
Expand Down Expand Up @@ -234,7 +236,7 @@ jas_stream_t *jas_stream_memopen(char *buf, int bufsize)
return stream;
}

jas_stream_t *jas_stream_fopen(const char *filename, const char *mode)
jas_stream_t *jas_stream_fopen(const wchar_t *filename, const char *mode)
{
jas_stream_t *stream;
jas_stream_fileobj_t *obj;
Expand Down Expand Up @@ -276,8 +278,11 @@ jas_stream_t *jas_stream_fopen(const char *filename, const char *mode)
}
obj->fd = -1;
obj->flags = 0;
//obj->pathname[0] = '\0';
strncpy(obj->pathname, filename, DIM_MAX_FILE_NAME); //dima

char utfname[MAX_PATH*2];
unicode2utf(filename, utfname, countof(utfname));

strncpy(obj->pathname, utfname, DIM_MAX_FILE_NAME); //dima

stream->obj_ = (void *) obj;

Expand All @@ -292,7 +297,8 @@ jas_stream_t *jas_stream_fopen(const char *filename, const char *mode)
}
*/
// JMW quick hack!
if ((obj->zfile = zzip_fopen(filename, "rb")) == NULL) {

if ((obj->zfile = zzip_fopen(utfname, "rb")) == NULL) {
jas_stream_close(stream);
return 0;
}
Expand All @@ -304,7 +310,7 @@ jas_stream_t *jas_stream_fopen(const char *filename, const char *mode)
}

// JMW this is not used, don't worry about it
jas_stream_t *jas_stream_freopen(const char *path, const char *mode, FILE *fp)
jas_stream_t *jas_stream_freopen(const wchar_t *path, const char *mode, FILE *fp)
{
jas_stream_t *stream;
int openflags;
Expand Down
2 changes: 1 addition & 1 deletion Common/Source/jasper/jpc/RasterTile.cpp 100644 → 100755
Expand Up @@ -449,7 +449,7 @@ short RasterTileCache::GetMaxElevation(void) {

extern RasterTileCache *raster_tile_current;

void RasterTileCache::LoadJPG2000(char* jp2_filename) {
void RasterTileCache::LoadJPG2000(const wchar_t* jp2_filename) {
jas_stream_t *in;

raster_tile_current = this;
Expand Down
70 changes: 70 additions & 0 deletions Common/Source/utils/stringext.cpp
@@ -0,0 +1,70 @@
/*
LK8000 Tactical Flight Computer - WWW.LK8000.IT
Released under GNU/GPL License v.2
See CREDITS.TXT file for authors and copyrights
$Id$
*/
//______________________________________________________________________________

#include "StdAfx.h"
#include "stringext.h"

//______________________________________________________________________________


// return Unicode string length, -1 on conversion error
int ascii2unicode(const char* ascii, WCHAR* unicode, int maxChars)
{
int res = MultiByteToWideChar(CP_ACP, 0, ascii, -1, unicode, maxChars);

if (res > 0)
return(res - 1);

// for safety reasons, return empty string
if (maxChars >= 1)
unicode[0] = 0;
return(-1);
}

// return ASCII string length, -1 on conversion error (insufficient buffer e.g.)
int unicode2ascii(const WCHAR* unicode, char* ascii, int maxChars)
{
int res = WideCharToMultiByte(CP_ACP, 0, unicode, -1, ascii, maxChars, NULL, NULL);

if (res > 0)
return(res - 1);

// for safety reasons, return empty string
if (maxChars >= 1)
ascii[0] = '\0';
return(-1);
}

// return UTF8 string length, -1 on conversion error (insufficient buffer e.g.)
int unicode2utf(const WCHAR* unicode, char* utf, int maxChars)
{
int res = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, utf, maxChars, NULL, NULL);

if (res > 0)
return(res - 1);

// for safety reasons, return empty string
if (maxChars >= 1)
utf[0] = '\0';
return(-1);
}

// return Unicode string length, -1 on conversion error (insufficient buffer e.g.)
int utf2unicode(const char* utf, WCHAR* unicode, int maxChars)
{
int res = MultiByteToWideChar(CP_UTF8, 0, utf, -1, unicode, maxChars);

if (res > 0)
return(res - 1);

// for safety reasons, return empty string
if (maxChars >= 1)
unicode[0] = '\0';
return(-1);
}

0 comments on commit 1bba4d4

Please sign in to comment.